Download presentation
Presentation is loading. Please wait.
1
텀 프로젝트 보고서 - 7조 – 제목 : 자동 빨래 건조기
텀 프로젝트 보고서 - 7조 – 제목 : 자동 빨래 건조기 이 태 엽 서 동 규
2
이태엽 텀 프로젝트 기념 서동규
3
▶ 개발 동기 바쁜 직장인들을 위해 아침에 출근하면서 빨래건조기를 작동시킨 후 퇴근하면서 그 빨래를 걷을 수 있도록 자동으로 햇볕의 양을 감지해 최적의 빨래 건조 각도를 유지할 수 있는 빨래 건조대의 필요
4
▶ 기본 아이디어 해가 떠 있을 경우 광센서가 이를 감지하여 자동으로 빨래 건조대를 외부로 이동 시킨다. 그리고 해의 위치를 따라 다니면서 최적의 건조 각도나 위치를 조정해준다. 비가 오거나 어두울 경우 자동으로 빨래 건조대를 실내로 이동시키고 온도감지 센서로 빨래의 건조상태를 확인한 후 팬을 이용해 빨래를 건조한다.
5
▶ 제품의 특징 작동 스위치의 ON OFF로 모든 동작을 관할 외부의 햇볕을 감지해 자동으로 건조대를 상승 또는 하강 시킴
해의 이동에 따른 햇볕의 양을 감지해 가장 많은 양의 햇볕을 받는 각도로 자동회전 하강 시 빨래의 건조상태를 확인한 후 팬을 동작시켜 빨래를 재건조
6
▶ 사용된 센서 및 모터 * 센서 * 모터 외부의 햇볕 유무를 확인할 광센서 1개 해의 이동을 감지할 광센서 1개
건조대의 상승 및 하강의 높이를 조절할 회전센서 1개 건조대의 회전 양을 조절할 회전센서 1개 빨래의 온도를 감지할 온도센서 1개 모든 동작을 관할할 ON OFF 터치센서 1개 * 모터 건조대 상승용 일반 모터 1개 건조대 회전용 기어 모터 1개 팬 동작용 일반 모터 1개 건조대 상승 또는 하강을 알리는 램프1개 건조대 회전을 알리는 램프1개 팬 동작을 알리는 램프1개
7
▶ 블럭 다이어그램 터치 센서 입력 광센서로 태양의 유무확인 빨래 건조대 실내로 이동 빨래 건조대 실내로 이동 빨래 건조대
Second First 광센서로 태양의 유무확인 NO 빨래 건조대 실내로 이동 빨래 건조대 실내로 이동 YES 빨래 건조대 외부로 이동 온도 감지 센서 모터로 건조대의 각도조정 태양의 위치 확인 팬 작동 빨래 건조
8
전체적인 설계도 집내부 모터 & 각도센서 광센서 빨래건조대 빨래건조용 팬 빨래건조대 LIFTER 모터 모터 센서 빨래온도 감지
온도센서 빨래건조대 빨래건조용 팬 빨래건조대 LIFTER 수동 빨래건조대 이동용 터치센서` 모터
9
▶ 소스 코드 #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 // 통신을 위한 포트 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;
10
// 메인함수 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; } ;
11
// 메인 쓰레드 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; //건조대 하강
12
//통신을 위한 쓰레드 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);
13
// 건조대 상승 함수 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");
14
//시계방향으로 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;
15
// 건조대를 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;
16
// 빨래의 온도를 체크해 팬을 작동 시키는 함수
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;
17
▶ 고 찰 임베디드 시스템이 무엇인지 그리고 어떻게 구현되는지 알 수가 있었고,
이론으로 배웠던 내용을 실제로 시스템을 구현해보면서 더 자세히 알 수 있는 좋은 기회가 된 것 같습니다. 소켓 프로그램을 완성시키지 못해 완성된 제품을 만들지 못한점이 아쉽지만 앞으로 시간적이 여건이 된다면 꼭해보겠습니다. 한 학기동안 배운 내용을 바탕으로 방학동안 좀 더 깊게 공부하고 싶습니다. 교수님 그리고 조교님 한학기 동안 수고 많이 하셨습니다
Similar presentations