텀 프로젝트 보고서 - 7조 – 제목 : 자동 빨래 건조기

Slides:



Advertisements
Similar presentations
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Advertisements

스택 스택 추상자료형 스택 스택의 구현 스택의 응용 한빛미디어(주).
제6장 조건문.
Vision System Lab, Sang-Hun Han
제 3 장 변수와 자료형.
13장 소켓.
2007 1학기 10 함수 활용.
인공지능실험실 석사 2학기 김승겸 TCP/IP Socket Programming… 제 10장 멀티태스킹 기반의 서버구현 인공지능실험실 석사 2학기 김승겸
Signal & Inter-Process Communication
디바이스 드라이버 기초 디바이스 드라이버의 개요 파일 연산 디바이스 드라이버 등록 디바이스 드라이버 구성
디바이스 드라이버 개요 가상 디바이스드라이버 실습
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express.
C 11장. 포인터의 활용 #include <stdio.h> int main(void) { int num;
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
제5장 제어명령
Multi-thread Programming
컴퓨터의 기초 제 4강 - 표준 입출력, 함수의 기초 2006년 4월 10일.
Autokey Cipher 자동키 암호 Department of Cyber Security / 박건주.
쉽게 풀어쓴 C언어 Express 제9장 함수와 변수 C Express.
6장 비연결형 지향 프로토콜 Database Lab 강 우 석.
14장 소켓.
7. while 문의 흐름 제어.
자료구조 김현성.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
데이터베이스 실험실 석사 2학기 김기훈 TCP/IP Socket Programming… 제 17장 멀티쓰레드 기반의 서버구현 데이터베이스 실험실 석사 2학기 김기훈
AVR - Chapter 15 황 지 연.
멀티쓰레드 기반의 서버구현 School of Electronics and Information.
조도 센서 김한수.
C언어 프로그래밍의 이해 Ch05. 명령문 Phylogenetic: 계통, 발생(학)의.
제 3 장 상수와 변수
쉽게 풀어쓴 C언어 Express 제7장 반복문 C Express.
CHAP 8:우선순위큐 C로 쉽게 풀어쓴 자료구조 생능출판사 2011.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
4장 제어문 선택문: if 문, if – else 문, switch 문
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
C 4장. 연산자 #include <stdio.h> int main(void) { int num;
개정판 누구나 즐기는 C언어 콘서트 제6장 반복문 출처: pixabay.
Signal & Inter-Process Communication
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
자전거를 배우려면 안장에 올라가 페달을 밟아라.
네트워크 프로그래밍의 이해 School of Electronics and Information.
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
함수와 변수 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
제어문 & 반복문 C스터디 2주차.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
마이크로소프트 박종호.
Stepper Motor 디바이스 드라이버
실습과제 1(조건문, ) 표준입력으로 수축기 혈압을 입력 받아 그에 따른 적당한 표현을 화면에 출력하는 프로그램을 if-else 문을 이용하여 작성.
Fflush 사용이유 및 방법 [이유] 키보드에서 입력된 내용은 입력버퍼에 저장되었다가 Enter 키가 들어오면 프로그램으로 전달됨 이 때 입력버퍼에 있는 Enter 키도 프로그램으로 전달됨 그러므로 아래와 같은 프로그램에서 문자 하나를 입력해도 Enter키도 입력된 것으로.
#1 배열 활용 #include int main(void) { int i; int grade[5]; grade[0] = 10; grade[1] = 20; grade[2] = 30; grade[3] = 40; grade[4] = 50; for(i=0;i.
6장 반복제어문 for 문 while 문 do while 문 기타 제어문.
C언어 프로그래밍의 이해 Ch05. 명령문.
18장. 다차원 배열 그리고 포인터.
-Part1- 제8장 조건문이란 무엇인가 (교재 199페이지 ~ 224페이지)
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express Slide 1 (of 28)
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
컴퓨터 프로그래밍 기초 - 11th : 파일 입출력 및 구조체 -
반복문의 기능 반복문 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 while문
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
어서와 C언어는 처음이지 제16장.
argc, argv 의 사용방법 #include <stdio.h>
Signal & Inter-Process Communication
printf("Global Korea\n");
어서와 C언어는 처음이지 제22장.
배열, 포인터, 함수 Review & 과제 1, 2.
프로그래밍 기법 최적화 프로그래밍.
Presentation transcript:

텀 프로젝트 보고서 - 7조 – 제목 : 자동 빨래 건조기 텀 프로젝트 보고서 - 7조 – 제목 : 자동 빨래 건조기 199803450 이 태 엽 199803266 서 동 규

이태엽 텀 프로젝트 기념 서동규

▶ 개발 동기 바쁜 직장인들을 위해 아침에 출근하면서 빨래건조기를 작동시킨 후 퇴근하면서 그 빨래를 걷을 수 있도록 자동으로 햇볕의 양을 감지해 최적의 빨래 건조 각도를 유지할 수 있는 빨래 건조대의 필요

▶ 기본 아이디어 해가 떠 있을 경우 광센서가 이를 감지하여 자동으로 빨래 건조대를 외부로 이동 시킨다. 그리고 해의 위치를 따라 다니면서 최적의 건조 각도나 위치를 조정해준다. 비가 오거나 어두울 경우 자동으로 빨래 건조대를 실내로 이동시키고 온도감지 센서로 빨래의 건조상태를 확인한 후 팬을 이용해 빨래를 건조한다.

▶ 제품의 특징 작동 스위치의 ON OFF로 모든 동작을 관할 외부의 햇볕을 감지해 자동으로 건조대를 상승 또는 하강 시킴 해의 이동에 따른 햇볕의 양을 감지해 가장 많은 양의 햇볕을 받는 각도로 자동회전 하강 시 빨래의 건조상태를 확인한 후 팬을 동작시켜 빨래를 재건조

▶ 사용된 센서 및 모터 * 센서 * 모터 외부의 햇볕 유무를 확인할 광센서 1개 해의 이동을 감지할 광센서 1개 건조대의 상승 및 하강의 높이를 조절할 회전센서 1개 건조대의 회전 양을 조절할 회전센서 1개 빨래의 온도를 감지할 온도센서 1개 모든 동작을 관할할 ON OFF 터치센서 1개 * 모터 건조대 상승용 일반 모터 1개 건조대 회전용 기어 모터 1개 팬 동작용 일반 모터 1개 건조대 상승 또는 하강을 알리는 램프1개 건조대 회전을 알리는 램프1개 팬 동작을 알리는 램프1개

▶ 블럭 다이어그램 터치 센서 입력 광센서로 태양의 유무확인 빨래 건조대 실내로 이동 빨래 건조대 실내로 이동 빨래 건조대 Second First 광센서로 태양의 유무확인 NO 빨래 건조대 실내로 이동 빨래 건조대 실내로 이동 YES 빨래 건조대 외부로 이동 온도 감지 센서 모터로 건조대의 각도조정 태양의 위치 확인 팬 작동 빨래 건조

전체적인 설계도 집내부 모터 & 각도센서 광센서 빨래건조대 빨래건조용 팬 빨래건조대 LIFTER 모터 모터 센서 빨래온도 감지 온도센서 빨래건조대 빨래건조용 팬 빨래건조대 LIFTER 수동 빨래건조대 이동용 터치센서` 모터

▶ 소스 코드 #include "smcapi.h" void up(int); // 건조대를 상승 시키는 함수 #include "smc.h" #include <stdio.h> #include <math.h> #include <unistd.h> #include <fcntl.h> #include <signal.h> #include <pthread.h> #include <sys/types.h> #include <stdlib.h> #include <printf.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define ROTMOT1 1 // 건조대 상승,하강용 모터 #define ROTMOT2 2 // 건조대 회전용 모터 #define ROTMOT3 3 // 팬작동용 모터 #define LIGHTSEN1 6 // 외부 태양감지용 광센서 #define LIGHTSEN2 0 // 태양의 이동을 감지하는 광센서 #define TOUCHSEN 1 // 전체 작동제어용 터치센서 #define ROTSEN1 7 // 건조대 상승,하강 높이를 감지할 회전센서 #define ROTSEN2 5 // 건조대 회전양을 감지할 회전센서 #define TEMPSEN 4 // 빨래 건조유무를 확인할 온도센서 #define PORTNUMBER 2007 // 통신을 위한 포트 Number void up(int); // 건조대를 상승 시키는 함수 void down(int); // 건조대를 하강 시키는 함수 void rot_30(); // 건조대를 시계방향으로 30′회전 시키는 함수 void inv_rot_30(); // 건조대를 반시계방향으로 90′회전 시키는 함수 void rot_90(); // 건조대를 시계방향으로 90′회전 시키는 함수 struct minval check_light(); // 건조대를 180′회전 시키면서 // 가장 강한 광도의 위치값을 리턴해주는 함수 void reposition(int); // 건조대를 원래의 직각위치로 복원하는 함수 int temp_fan(int,int); // 빨래의 온도를 체크해 팬을 작동 시키는 함수 void recheck(int); // 특정위치에서의 광도가 작아졌을때 // 다시 광도를 resensing하는 함수 //thread void *main_fun(void *g); // 빨래건조대의 작동을 위한 메인 쓰레드 void *communicate(void *g); // 통신을 위한 쓰레드 //void *on(void *g); struct minval{ // 각위치에서 광도를 저장할 구조체 int a; int b; }min1,temp; //int light1=0,light2=0,light3,flag=1; int flag1=0;

// 메인함수 int main() { pthread_t main_fun_thread,communicate_thread,on_thread; pthread_attr_t attr; struct sched_param sched_param; init_fifo(); set_pwm_rate(8); set_sensor_rate(ROTSEN1,1); set_sensor_rate(LIGHTSEN1,1); set_sensor_rate(LIGHTSEN2,1); set_sensor_rate(ROTSEN2,1); set_sensor_rate(TEMPSEN,1); set_sensor_rate(TOUCHSEN,1); //Thread invoke pthread_attr_init(&attr); sched_param.sched_priority=1; pthread_attr_setschedparam(&attr,&sched_param); pthread_create(&main_fun_thread,NULL,(void*)main_fun,NULL) sched_param.sched_priority=7; pthread_create(&communicate_thread,NULL,(void*)communicate,NULL); pthread_join(main_fun_thread,NULL); pthread_join(communicate_thread,NULL); close_fifo(); printf("complete!\n"); return 0; } ;

// 메인 쓰레드 void *main_fun(void *g){ int light1=0,light2=0,light3,flag=1,on=0,nowup=0; int min; light1=get_sensor(LIGHTSEN1); // 외부 광도 감지 printf("start.....\n"); while(1){ if(get_sensor(TOUCHSEN)<50){ //터치센서 입력 확인 if(on==0){on=1;} else if(on==1) {on=0;} } light1=get_sensor(LIGHTSEN1); sleep(2);` if(on==1){ if(light1<=178 && flag==1) { //터치센서가 입력되고 외부에 해가 있을때 loop: up(flag);flag=0; //건조대 상승 sleep(2); set_motor(ROTMOT2,1,0x2); rot_90(); //0′위치로 건조대 이동 min1=check_light(); // 건조대를 180′회전 시키면서 광도 측정 nowup=1; //nowdown=0; else if(light1>=188 && flag==0){ // 외부에 해가 없을때 reposition(min1.a); // 건조대를 90′로 재위치 down(flag);flag=1; // 건조대 하강 nowup=0; // nowdown=1; if(temp_fan(light1,flag)==1) goto loop; // 온도체크후 팬작동 & 외부광도 감지 } // 하강중 외부해감지-->건조대 상승 else if(nowup==1){ light2=get_sensor(LIGHTSEN2); if(min1.b+7 <= light2 && flag==0){ // 최고광도값보다 광도가 떨어질경우 sleep(1); recheck(min1.a); // Resensing후 다시 최고광도의 위치로 이동 min1=check_light(); else if(on==0){ // 터치센서 입력확인 (강제 하강을 위해) if(nowup==1){ reposition(min1.a); //건조대 90′위치시킨후 down(flag);flag=1; //건조대 하강

//통신을 위한 쓰레드 void *communicate(void *g){ int server_sockfd,client_sockfd; int aaa; int server_len,client_len; struct sockaddr_in server_address; struct sockaddr_in client_address; unsigned char *data_in; unsigned char *data_out; printf("\ncommunicate start \n"); data_in=(unsigned char*)malloc(sizeof(unsigned char)*4); data_out=(unsigned char*)malloc(sizeof(unsigned char)*10); server_sockfd=socket(AF_INET,SOCK_STREAM,0); server_address.sin_family=AF_INET; server_address.sin_port=htons(PORTNUMBER); server_len=sizeof(server_address); bind(server_sockfd,(struct sockaddr*) &server_address,server_len); listen(server_sockfd,5); client_len=sizeof(client_address); client_sockfd=accept(server_sockfd,(struct sockaddr*) &client_address,&client_len); while(1){ aaa=read(client_sockfd,data_in,sizeof(unsigned char)); // printf("aaa=%d\n",aaa); printf("%d \n",(int)data_in[0]); switch((int)data_in[0]){ case 1: printf("Switch 1\n"); break; case 2: printf("Switch 2\n"); break; case 3: printf("Switch 3\n"); break; } send(client_sockfd,data_out,sizeof(unsigned char),0); close(client_sockfd); free(data_in); free(data_out);

// 건조대 상승 함수 void up(int flag){ int d[1]={0}; int count=0; if(flag==1){ set_motor(ROTMOT1,1,0x5); while(1){ count = count + get_rot_count(ROTSEN1,60,d); if(count==7){ //상승 완료되면 set_motor(ROTMOT1,0,0x0); //상승용 모터 작동 중지 flag=0; printf("LIFT Complete .....\n") break; } //건조대 하강 함수 void down(int flag){ if(flag==0){ set_motor(ROTMOT1,0,0x5); if(count==7){ //하강 완료되면 set_motor(ROTMOT1,0,0x0); //모터 작동 중지 flag=1; printf("DOWM Complete .....\n");

//시계방향으로 30′회전 함수 (0′-180′까지 총 7단계(30′) 회전에 필요) void rot_30(){ int rotsen1=0; int d[1]={0}; set_motor(ROTMOT2,0,0x2); while(1){ rotsen1 = rotsen1 + get_rot_count(ROTSEN2,60,d); if(rotsen1==2){ //30′회전하면 set_motor(ROTMOT2,0,0x0); //모터 작동 중지 rotsen1=0; break; } //반시계방향으로 30′회전 함수(하강시 Reposition을 위해 필요) void inv_rot_30(){ int rotsen2=0; set_motor(ROTMOT2,1,0x2); rotsen2 = rotsen2 + get_rot_count(ROTSEN2,60,d); if(rotsen2==2){ //30′회전하면 set_motor(ROTMOT2,0,0x0); // 모터 작동 중지 rotsen2=0; //시계방향으로 90′회전 함수(초기 상승시 0′위치로 가기 위해 필요) void rot_90(){ int rotsen=0; rotsen=rotsen+get_rot_count(ROTSEN2,60,d); if(rotsen==6){ //90′회전하면 set_motor(ROTMOT2,0,0x0); // 모터 작동 중지 rotsen=0;

// 건조대를 180′회전 시키면서 // 가장 강한 광도의 위치값을 리턴해주는 함수 struct minval check_light(){ int i,min,min_value; int lightsen[6]; for(i=0;i<6;i++){ lightsen[i]=get_sensor(LIGHTSEN2); //광도를 저장 sleep(1); printf("rotaion %d Complete ....sensor value : %d\n",i+1,lightsen[i]); rot_30(); //시계방향으로 30′ 회전 } lightsen[6]=get_sensor(LIGHTSEN2); //180′위치의 광도를 저장 printf("rotaion 7 Complete ....sensor value : %d\n",lightsen[6]); for(i=0;i<7;i++){printf(\ "light value %d : %d\n",i+1,lightsen[i]);} //전체 7개의 위치에서의 광도값을 표시 min_value=lightsen[0]; for(i=0;i<7;i++){ if(lightsen[i]<=min_value) { //7개위치중 가장 큰값의 위치와 값을 저장 min_value=lightsen[i]; min=i; printf("min : %d\n",min+1); for(i=0;i<6-min;i++){inv_rot_30();} //가장큰값의 위치로 건조대 이동 temp.a=min; temp.b=min_value; return temp; //그때의 위치와 값의 구조체를 리턴 // 건조대를 원래의 직각위치로 복원하는 함수 void reposition(int min){ switch(min){ //각 위치에서 90′위치로 복원을 위한 경우들 case 0 : rot_30(); rot_30(); rot_30(); break; case 1 : rot_30(); rot_30(); break; case 2 : rot_30(); break; case 3 : break; case 4 : inv_rot_30(); break; case 5 : inv_rot_30(); inv_rot_30(); break; case 6 : inv_rot_30(); inv_rot_30(); inv_rot_30(); break;

// 빨래의 온도를 체크해 팬을 작동 시키는 함수 int temp_fan(int light,int flag){ int tempsen; while(1){ tempsen=get_sensor(TEMPSEN); //현재의 빨래온도를 읽어 온다. printf("temp : %d \n",tempsen); if(tempsen>=128){ //온도가 낮으면(빨래가 덜 마르면) 팬을 작동 시킨다. set_motor(ROTMOT3,0,0x5); sleep(1); } else set_motor(ROTMOT3,0,0x0); //온도가 높으면(빨래가 다 마르면) 팬을 작동 시킨다. light=get_sensor(LIGHTSEN1); // 외부의 광도값을 읽어온다. if(light<=178 && flag==1){ // 외부에 해가 있고 팬이 작동하고 있으면 팬작동을 중지시킨다. set_motor(ROTMOT3,0,0x0); break; return 1; // 특정위치에서의 광도가 작아졌을때 // 다시 광도를 Resensing하는 함수 void recheck(int min){ switch(min){ //각 위치에서 초기 0′위치로 가기위한 경우들 case 0 : break; case 1 : inv_rot_30(); break; case 2 : inv_rot_30(); inv_rot_30(); break; case 3 : inv_rot_30(); inv_rot_30(); inv_rot_30();break; case 4 : inv_rot_30(); inv_rot_30(); inv_rot_30();\ inv_rot_30(); break; case 5 : inv_rot_30(); inv_rot_30(); inv_rot_30();\ inv_rot_30(); inv_rot_30(); break; case 6 : inv_rot_30(); inv_rot_30(); inv_rot_30();\ inv_rot_30(); inv_rot_30(); inv_rot_30(); break;

▶ 고 찰 임베디드 시스템이 무엇인지 그리고 어떻게 구현되는지 알 수가 있었고, 이론으로 배웠던 내용을 실제로 시스템을 구현해보면서 더 자세히 알 수 있는 좋은 기회가 된 것 같습니다. 소켓 프로그램을 완성시키지 못해 완성된 제품을 만들지 못한점이 아쉽지만 앞으로 시간적이 여건이 된다면 꼭해보겠습니다. 한 학기동안 배운 내용을 바탕으로 방학동안 좀 더 깊게 공부하고 싶습니다. 교수님 그리고 조교님 한학기 동안 수고 많이 하셨습니다