8조 - 캔모아

MIE capstone
이동: 둘러보기, 검색

프로젝트 개요

기술개발 과제

국문 : 모터을 이용한 캔 자동압축식 스마트 쓰레기통

영문 : Auto-Compressed Smart Trash Can box via Actuator

과제 팀명

캔모아

지도교수

신동헌 교수님

개발기간

2017년 9월 1일 ~ 2017년 12월 21일(총 4개월)

구성원 소개

서울시립대학교 기계정보공학과 2011890028 박재준

서울시립대학교 기계정보공학과 2012860031 이원석

서울시립대학교 기계정보공학과 2012430002 김주현

서울시립대학교 기계정보공학과 2012430010 백형준

서울시립대학교 기계정보공학과 2012430013 안상길

서론

개발 과제의 개요

개발 과제 요약

Example.jpg

◇ 본 개발 과제는 캔을 압축하여 쓰레기통에 버림으로써 저장 효율을 증가시키는 것을 목표로 한다. 쓰레기통에 캔을 넣으면 모터의 동력을 이용한 강한 힘으로 캔을 압축시킨 뒤 기존의 쓰레기통과 같은 저장 공간에 저장하게 된다. 또한 IoT 기술을 활용한 센싱 처리로 용적률을 파악하며, 쓰레기통 외부에 설치되어 있는 LED를 통해 시각적으로 쉽게 용적률을 확인할 수 있다. 일정량 이상 찬 경우, 쓰레기통 청소부에게 푸쉬 알림 등을 보냄으로써 즉각적인 피드백이 가능하도록 한다.

개발 과제의 배경 및 효과

- 개발 과제 선정 배경

◇ 아래의 사진과 같이 압축되지 않은 캔 혹은 플라스틱 컵 재질의 부피로 인해 분리수거가 제대로 되지 않고
  분리수거 쓰레기통의 주변의 미관이 훼손된다.
  이에따라 분리수거 쓰레기통의 활용도 및 적재량을 높여 쾌적한 분리수거 환경을 조성하고자 한다.

Example2.jpg

◇ 2004~2010년 금속캔 재활용량 및 재활용율 감소 (205천톤->138천톤)
  연 100억 개의 금속 캔 폐기, 1%를 재활용할 경우 10억 원(10원/캔) 수익창출이 가능하다 
  (환경부, 한국 폐기물협회)
  압착되지 않으면 금속 캔 재활용 불가, 운반비용 손해, 분리수거의 어려움 등의 문제 발생한다.
  => 그러므로 알루미늄 캔 배출시 편리한 캔 압착기의 개발 필요하다. 


- 개발과제 목표 달성 시 얻을 수 있는 효과

Example3.jpg

개발 과제의 목표와 내용

◇ 목표 : 센싱을 통한 자동 캔 압축 및 쓰레기통 용적률 확인
         디스플레이 및 푸쉬 알림을 구현한 범용 캔 압축기

관련 기술의 현황

State of art

◇캔의 압축률이 70%이상 되며 신속하게 압축한다.
◇다양한 규격의 기제품에 대해서 범용성을 가져야 한다.
◇캔의 출입 센싱과 모터의 정회전 역회전을 연동시킬 PWM제어를 실시 해야 한다.
◇쓰레기통의 용적량을 정확하게 센싱하고 LCD에 나타낼 수 있어야 한다.

기술로드맵

Example6.jpg

특허조사

Example7.jpg

특허전략

◇ 위의 특허들은 다음과 같은 약점을 가지고 있다.
   
   ① 사용목적에 비해 크기가 매우 크다.
   ② 브라켓 등의 금속 부품은 어린이가 있는 경우에 매우 위험한 일이 생길 수 있다.
   따라서 우리는 쓰레기통과 일체화된 압착기를 제작하여 공간의 효율성을 추구하며, 동시에 안전성을 보장하여 이를 보완하고자 한다. 
   또한, 기존 제품의 여러 개의 브라켓 구조에 비해 스프링을 이용한 간단한 구조로 바꿔 제품의 안정성도 도모하여 이를 특허출원에 이용하고자 한다.

관련 시장에 대한 분석

경쟁제품 조사 비교

Example99.jpg

마케팅 전략

◇SWOT 분석

Example997.jpg

◇SWOT 전략수립

Example998.jpg

개발과제의 기대효과

기술적 기대효과

◇(1) 편리성: 이용자가 직접 압출을 하는 것이 아닌 기존의 쓰레기통 이용하는 방식으로도 사용에 문제가 없다.
◇(2) Safety: 쓰레기통 안에 부품이 내재되어있기 때문에, 어린이나 부주의 하게 사용하는 경우 발생할 위험으로부터 사용자를 보호할 수 있다. 
             또한, 쓰레기통 안에서 모든 기능이 동작하기 때문에, 부품의 파손을 줄일 수 있다. 
◇(3) 응용분야: 현재 공공기관에 이용되는 다양한 크기의 쓰레기통에 모두 적용이 가능하여 범용성이 있다.

경제적 및 사회적 파급효과

◇(1) 경제적 파급효과 : 캔 100억 개당 1%씩 재활용을 할 때마다, 비용을 10억 원 절감할 수 있다는 조사 결과를 바탕으로 
                     재활용률을 높이는 것은 경제성이 있다는 결론을 얻을 수 있다. 
                     
◇(2) 사회적 파급효과 : 자동으로 재활용을 하고, 정보를 사람들에게 알려주는 쓰레기통을 제작하여 보급한다면, 
                     이는 사회 전반적으로 쓰레기 재활용에 대해 긍정적으로 재고할 수 있는 기회를 제공한다. 
                     이를 통하여 다른 산업 분야에서도 재활용과 녹색에너지에 대한 고려를 할 수 있도록 하여 여러 분야에서의 재활용 산업발전을 기대한다.

구성원 및 개발 일정

◇ 구성원 역할분담

Example5.jpg

◇ 추진 체계

Example1.jpg

설계

설계사양

가. 제품 요구사항

Example1231.jpg


목적계통도

◇ ‘캔모아’를 만들 때 우리는 세 가지 목표사항을 생각하였다. 
  먼저 편리성을 보면, 편리성을 달성하기 위한 수단으로는, 이용자가 안전하게 사용할 수 있도록 하는 안전성과, 
  다양한 규격의 제품군에 적용할 수 있는 범용성을 생각할 수 있다. 그리고 이를 위해 우리는 내장형 구조와 설치식 구조 및 어플 연동을 사용할 계획이다. 
  그리고 신속성에서는, 고 토크의 모터 출력과 압축 시간의 최소화를 통해 목표를 달성할 수 있다고 생각한다. 
  마지막으로 정확성은, 일단 효율적이고 오차를 최대한 줄여 줄 수 있는 알고리즘이 필요할 것이고, 또한 적절한 센서를 사용해야 할 것이다. 

Examplepurpose.jpg

개념설계안

제품의 설계사양은 담당역할을 기준으로 제어부, 측정부, 통신부로 나누었다. 
제어부에서는 캔모아의 캔 압축을 수행하기 위한 동력장치로 고출력 모터를 사용하며, 기구학적 설계를 통해 효율적인 동력 전달 수행능력을 생각하였다. 
측정부에서는 용적량을 측정하는 부속으로 중력 센서를 사용한다. 이 측정된 결과를 통해 LED에 적재량을 표시한다.
통신부는 LED 표시 및 App 데이터 전송을 담당하기 위해 임베디드 보드를 사용한다. 이용자는 쓰레기통에 부착된 LED뿐만 아니라 스마트폰을 통해서도 정보를 확인할 수 있다.


가. 압축방식

◇ 1. 수직압축 : 모터를 이용해 캔을 압축할 때 수직으로 압축하는 방안으로 모터의 동력을 래크피니언, 크랭크실린더로 사용하는 방안과 에어 컴프레셔를 통한 유압실린더로 사용하는 방안이 있다. 다양한 모양의 캔에 범용적 사용이 가능한 장점이 있고 단점으로는 캔 압축에 큰 힘이 요구 된다.

Example1234.jpg

◇ 2.  수평 압축 : 모터를 이용해 캔을 압축할 때 수평으로 압축하는 방안으로 모터의 동력을 이용해 2번 압축 하는 방안과 캔에 구멍을 내 캔을 찢는 방안이 있다. 작동 범위가 작고 압축에 필요한 에너지가 작다는 장점이 있고 단점으로는 제품 동작부가 크고 복잡하다.

Example1235.jpg

◇ 3.  평가 : 총점 = Σ(각 항목 가중치 * 각항목 순위)
             총점이 낮을 수록 우선순위 이므로 래크피니언 방식 사용 결정

Example12356.jpg



나. 제어부

◇ DC모터 사용 : 제어의 편리성과 가격의 이점으로 인한 선택이다.
  캔을 압축하기 위해서는 힘 및 성능이 더 좋은 AC모터가 적합하다.

ExamplEA.jpg


다. 측정부

◇ 캔의 출입과 모터 동작 시작 시기를 파악할 센서와 쓰레기통 용적률을 파악할 센서가 필요하다. 
   캔의 출입은 적외선 센서, 쓰레기통의 용적률은 Sonic sensor 가 필요하다.

Example1111.jpg

라. 통신부

◇ 측정부의 각 센서와 모터드라이버와의 통신을 통해서 제품의 동작을 컨트롤 해줄 중앙 통신부
   CPU가 필요하다.
   센싱과 모터의 동작이 다소 고사양을 요구하기 때문에 라즈베리파이가 좀 더 적합한 제품이다.

Example2222.jpg

상세설계

가. 모터 선정

◇ 알루미늄캔의 압축에 필요한 힘은 단순항복강도와 면적을 이용하여 구할 수 없다. 

버클링 스트레스라는 좌굴하중, 즉 얇은 실린더가 휘어지면서 단면적의 변화가 실시간으로 변화하므로 힘을 구하기 힘들다. 힘을 구하는 방법으로는 실험적 방법과 이론적 방법이 있지만 실험적방법은 학생선에서 불가능하므로 이론식을 찾아보았고 그 결과 NASA에서 발표한 고전논문 NASASP-8007에서 명시한 실험적 이론값을 구할수 있엇다. 알루미늄캔의 근간이 되는 재료인 Aluminum 3004의 기준으로 8096psi의 응력이 압착되는데 필요하고 얇은 원띠가 단면적으로써 작용한다. 이때 통상적 알루미늄캔의 두께는 0.13mm이었고 반지름 r은 두꺼운 캔을 기준으로 삼아 33mm로 정했다. 이때 F=ρ*A 의 고전적 식을 이용하면 캔을 압착시키는데 필요한 힘을 구할 수 있다. 이때 표준 SI 단위계로 값을 변환하면 ρ = 8096 psi = 55819760.5 (Pa) A = 2* π * 33e-3m * 0.13e-3 m = 2.695\ m^2 F=ρ*A = 1504.614 (N) 이때 필요한 힘을 넉넉잡아 2kN 이라 칭한다면 162mm길이의 알루미늄슬림캔의 압축률을 70러센트로 상정한다면 162*0.7 = 113.4 mm의 진행거리가 필요하다. 즉 2kN의 힘으로 113.4mm를 갈수있을 만큼의 모터출력이 필요하다. J = F*S이므로 J = 2000 * 0.1134 = 226.8 J 의 에너지가 필요하며 이 과정을 1초안에 해낸다면 P = 226.8 (J)/ 1s = 226.8 (W) 가 필요하므로 그 결과 최소 250 W의 고출력 모터가 필요함을 알게되었다.

나. 기어 선정

◇ 이송거리의 문제. 랙과 피니언으로 힘을 전달한다고 가정했을때 기어의 반지름을 R이라 한다면 T=F/R 이며, s = 2π*R *N/60이다.

이를 곱하면 최대동력이 나온다. 이때 어느정도의 속도를 확보하려면 기어의 반지름이 커야한다. 그러나 이때 모터의 선정에서 F= 2kN으로 한정했으므로 T = 2000/R이 되게된다. 이때 1초에 이동하는 거리는 2π*R *N/60 이다. 즉 기어의 반지름이 클수록 토크는 작아지고 속도는 빨라진다. 빠라서 2000N근처의 힘을 확보하면서 적절한 속도를 유지할 수 있는 반지름이 필요한데 이러한 반지름이 40부근임을 알게 되었다. 이러한 40정도의 반지름을 확보하기 위해 P=mZ식에서 모듈 2.0과 잇수 20의 정규표준기어를 결정하였으며 피니언기어와 결합하는 랙기어 또한 모듈2.0으로 결정하게 되었다.


다. 소프트웨어 설계

◇ 캔투입 대기상태에서 캔이 투입되면 압축모드가 실행된다.
  적외선 센서로 캔 투입을 인식한 압축모드에서는 라즈베리파이에게 센싱결과를 전달한다. 라즈베리 파이는 모터드라이버를 제어 한다.
  모터드라이버에 의해 모터가 작동된 후에 적재모드로 전환된다.
  적재모드는 초음파 센서를 통해 적재량을 파악하고 라즈베리 파이에 센싱결과를 전달하는 모드이다.
  시각화 모드는 적재모드에서 적재량을 최신화 하고 이러한 정보를 라즈베리파이를 통해 적재량을 LED에 표시 한다. 
Examplesoft.jpg

라. 부품도

Part1.jpg
 
Example1214324.jpg
Exam123ple.jpg

조립도

가. 구동부

Example122344.jpg

나. 프레임

Example33322111.jpg

자재소요서

Example123.jpg

결과 및 평가==

완료작품 소개

프로토타입 사진

E4xam1234ple.jpg E4x4ample.jpg

포스터

Exa12344mple.jpg


압축동영상 링크

캔압축 시연 동영상

특허출원번호 통지서

123124315.jpg

개발사업비 내역서

Exa1231314112344mple.jpg

완료 작품의 평가

143243241.jpg E4445x55ample.jpg

향후평가

1) 캔 투입구 설계

현 단계의 캔 투입구 형태는 완전한 형태가 아니다. 이상적인 설계는 어떤 방향이나 거리에서 던져 넣어도 캔 압축부에 안정적으로 안착해야 하지만, 실제로는 그렇지 못했다. 비율적으로 평가하자면 약 20% 정도의 확률로 제대로 안치되지 않는 문제가 있었다.
이러한 문제의 원인으로는 우선적으로 부족한 시간에 의한 너무 간단한 설계 모양이다. 기존 아이디어는 깔대기 모양의 입구와 가이드를 설치하여 캔이 마지막으로 떨어지는 각도를 최대한 통일시키려 하였다. 그러나 시간 부족으로 인해 훨씬 단순화된 형태로 설계를 하게 되었고, 캔의 불규칙한 움직임을 간단한 가이드와 벽으로 극복하려 하였지만 예상보다 캔이 정확히 착지하지 못하는 경우가 많았다. 두 번째로는 캔 투입구에 사용된 소재이다. 우리는 2.4t의 PE 판을 사용하여 설계하였으나 생각보다 휨에 약하며 캔과의 마찰이 너무 적었다. 이로 인해 이론적인 설계에 비해 실제 캔이 투입구를 따라 미끄러져 내려와서 제대로 방향을 잡는 시간이 부족했다.
이를 보완하기 위해서는 보다 단단한 소재의 판을 사용하여 설계를 하는 게 좋을 것으로 판단되며, 형태 자체도 수정이 필요하다.
 

2) 모터를 통한 랙 기어의 위치 제어

우리 개발 제품의 압축 방식은 전동 모터를 이용하여 동력을 기어로 전달하는 방식이다. 고정된 판에 압착 판과 결합된 랙 기어를 이동시키면서 사이에 놓인 캔을 압착시킨다. 이때 랙기어의 이동을 생각하면, 똑같은 동력을 통해 같은 시간만큼 제어를 해도, 모터가 캔을 압착하면서 받는 반력이 모든 상황마다 조금씩 달라지면서 정확하게 제어가 되지 않는 문제가 발생했다. 
따라서 이 문제점을 보완하기 위해서는 정량적인 실험을 통하여 각 변인의 원인을 고려하여 M18 행렬을 이용한 분산분석법(실험계획법)으로 어떤 원인에서 가장 오차에 대한 민감도가 큰지 분석할 필요가 있다. 이 결과를 바탕으로 만일 Duty Cycle에 의한 민감도가 가장 크다면, 다양하게 Duty Cycle을 변환 시켜서 가장 최적의 값을 찾고, 그 값을 통해 문제를 개선하는 방안을 통하여 이 문제점을 해결할 수 있을것으로 생각했다.
다른 방법으로, ANSYS 소프트웨어를 통한 분석을 통한 랙 기어의 위치에 개선에 대해 생각할 수 있다. 우리가 인용한 NASA에서 나온 논문을 실제로 소프트웨어 분석을 통해 힘의 크기를 찾는다면, 이론에 대한 타당성을 가질수 있으며. 이를 실제로 적용하여 설계에 적용하면 시뮬레이션과 실험을 모두 이용한 결과 값이기 때문에 결과값에 신뢰도가 올라가는 장점이 있다.   또한, 부품 안에 작용하는 응력분포를 시뮬레이션 하여 특정 부분에 응력집중을 줄일 수 있기 때문에 제품의 효율을 높일 수 있다. 

3) 캔 투입 여부를 인식하는 초음파 센서의 위치의 고정

제품의 작동 루틴을 생각해보면, 초기에 빗변 투입부를 통해 내려온 캔을 빗면 하부에 있는 초음파 센서를 통하여 인식하고, 이를 통하여 MCU 보드에서 동력장치를 작동시킨다. 이 때, 초음파 센서의 고정 대해서도 보완이 필요한 부분이라고 생각된다. 그 이유는, 본 프로젝트에서는 빗변위에 전기테이프를 이용하여 고정하였지만, 실제 시연 상황에서는 고정이 정확하게 되어있지 않아 인식과 관련해서 문제가 발생했다. 
이런 문제를 피하기 위해서는, 제대로 된 고정대를 직접 설계하여 이 고정대를 위 빗변부분에 장착하여 그 내부에 초음파센서를 적재하는 것이 위치에 따른 위험을 줄일 수 있는 대안이라고 생각하였다.
PE판 재질 자체에 대한 문제도 있다. PE판 자체에서 생기는 흔들림 때문에도 문제가 발생하기 때문에 이러한 문제를 줄이기 위해서 PE판 자체를 지지하는 다른 부속을 설치하는 방법과, PE 판 대신에 흔들리지 않는 다른 재질을 이용하여 빗면부를 설계함으로써 고정에 대한 문제를 해결할 수 있다.

부록

참고문헌 및 참고사이트

https://www.quora.com/What-is-the-amount-of-the-force-I-need-to-crush-an-aluminum-canhttp://www.electronicwings.com/raspberry-pi/raspberry-pi-pwm-generation-using-python-and-chttps://ntrs.nasa.gov/
◇NASA SP-8007, "BUCKLING OF THIN-WALLEDCIRCULARCYLINDERS", 
  NASA SPACE VEHICLE DESIGN CRITERIA, NATIONAL AERONAUTICS AND SPACE ADMINISTRATION

관련특허

Exa123134mple.jpg

소프트웨어 프로그램 소스

// 라즈베리파이 GPIO 통신 관련 헤더

  1. include <wiringPi.h>

// LCD 패널 제어 헤더

  1. include <wiringPiI2C.h>
  2. include <string.h>
  3. include <lcd.h>
  1. include <stdio.h>
  2. include <stdlib.h>

// 모터 제어 헤더

  1. include <softPwm.h>

// Ctrl+C 인터럽트

  1. include <signal.h>


// LCD 함수 void write_word(int data); void send_command(int comm); void send_data(int data); void init(); void clear(); void write(int x, int y, char data[]); //인터럽트 void INThandler(int);

// 모터 드라이버 GPIO no. const int en = 17; const int RPWM = 13; //IN1 const int LPWM = 18; //IN2

// 초음파 센서 1 GPIO no. const int US=26;

// 초음파 센서 2 GPIO no. const int trig = 20; const int echo = 16 ;

int LCDAddr = 0x3f; int BLEN = 1; int fd;


int main (void){ char print[5] ={0}; char print2[5] ={0};

double total = 70.0; // 허용 적재량

int stack = 0; in i, j;

int fuck =1024;

int trig = 20; int echo = 16 ;

float mat[5] = {0}; float diff = 0; int save = 0; int start_time, end_time ;

float distance ; // 거리값 저장 변수


// 초기화 설정 signal(SIGINT,INThandler); wiringPiSetupGpio();

fd = wiringPiI2CSetup(LCDAddr); init();

printf("start\n");

pinMode (US,INPUT); pinMode (en, OUTPUT) ; pinMode (RPWM, PWM_OUTPUT) ; /* set PWM pin as output */ pinMode (LPWM, PWM_OUTPUT) ; /* set PWM pin as output */ pinMode (trig, OUTPUT) ; pinMode (echo , INPUT) ;

digitalWrite(LPWM, LOW);

digitalWrite(RPWM, LOW);

digitalWrite(US, HIGH); // 초음파 센서 1 Enable

digitalWrite(en, HIGH); // 모터 Enable신호 printf("Starting\n"); // CMD 창 표시

clear();

write(0, 0, "Starting"); // LCD 표시

send_data(2000);



while(1) // 반복 {

if(digitalRead(US) == LOW) // 초음파 센서 1이 물체 인식한 경우

{

printf("detected\n"); // CMD에 인식했다고 표시


if(stack == 8) // 8번 연속으로 인식한 경우 모터 제어

{

printf("detected 8times\n");

printf("Motor start\n");

clear();

write(0, 0, "Can Detected"); // LCD에 캔 인식 표시

write(4,1,"Now Crushing"); // LCD에 모터 가동 표시

send_data(2000);


digitalWrite(RPWM, HIGH); // 캔 압축 시작

digitalWrite(LPWM, LOW);

softPwmCreate(RPWM,0,100); // PWM 범위 설정


printf("RIGHT\n");


// 모터 압축 방향 가동

for(j =0; j<=100; j++) // PWM의 듀티 사이클 조정을 통한 모터 가속 제어

{

softPwmWrite(RPWM,j);

delay(10);

}

delay(3300); // 최고 속도 유지 시간

// 캔 압축 후 압축 방향으로의 회전운동 정지

for(i =100; i>=0; i--) // PWM의 듀티 사이클 감소를 통한 모터 감속 제어

{

softPwmWrite(RPWM,i);

delay(10); }

delay(500);

// 캔 압축 후 원위치

digitalWrite(RPWM, LOW);

digitalWrite(LPWM, HIGH);

softPwmCreate(LPWM,0,100);

printf("LEFT\n");


// 모터 회수 방향 가동

for(j =0; j<=100; j++) // PWM 듀티 사이클 증가를 통한 가속 {

softPwmWrite(LPWM,j);

delay(10);

}

delay(2300); // 최고 속도 유지 시간


for(i =100; i>=0; i--) // PWM 듀티 사이클 감소를 통한 감속

{

softPwmWrite(LPWM,i);

delay(10); }

delay(500);

stack=0; // 압축 완료 후 스택 초기화

printf("working completely\n");

clear();

write(0, 0, "Crushing is");

write(7,1,"Completed");

send_data(2000);


// 캔 압축 후 초음파 센서 2를 통한 적재 정보 파악

while(1) {

digitalWrite(trig, LOW) ;

delay(500) ;

digitalWrite(trig, HIGH) ;

delayMicroseconds(10) ;

digitalWrite(trig, LOW) ;

while (digitalRead(echo) == 0) ;

start_time = micros() ;

while (digitalRead(echo) == 1) ;

end_time = micros() ;


distance = (end_time - start_time) / 29. / 2. ;// 수신-송신 시간으로부터 대상과의 거리 계산


for(i=3;i>=0;i--){ mat[i+1] = mat[i]; // mat[] 최신화 }

// 최근 거리 값과 현재 관측된 거리값의 비교 diff = mat[1];

diff -= distance;

// 초음파 센서 값이 너무 예민하여 값이 크게 튀는 경우에 대한 처리 if(mat[1]!=0 && diff*diff > 10) // 이전 거리와 차이가 많이 날 경우{

for(i=0;i<5;mat[i++]=0); // mat[] 0으로 초기화 }

else// 잘 탐지되는 경우 계속하여 정보 최신화 {

mat[0] = distance;

}

if(mat[4]) // 거리가 5번 연속으로 제대로 탐지되는 경우 { save = (int)(100*((double)mat[0])/total); // 허용 적재량 기준으로 현재 적재율 계산 break;

}

} gcvt(distance,5,print); sprintf(print2,"%2d",save);

clear();

printf("distance %.2f cm\n", distance) ;

printf("%.2f , %.2f \n", mat[4],mat[0]) ;

printf("loading rate : ?%d %\n", save) ;

write(0, 0, "Waiting....");

write(0, 1, "Loding Rate: ");

write(12, 1, print2);

write(16, 1, "%");

send_data(2000); } stack++; // 스택 변수의 값 증가

} else // 탐지 못한 경우 표시

{

printf("not detected not detected not detected not detected not detected\n");

stack=0; // 스택 변수 초기화

}

delay(300);

}

return 0; }

void write_word(int data){

int temp = data;

if ( BLEN == 1 )

temp |= 0x08;

else

temp &= 0xF7;

wiringPiI2CWrite(fd, temp); }

void send_command(int comm){

int buf;

// Send bit7-4 firstly

buf = comm & 0xF0;

buf |= 0x04; // RS = 0, RW = 0, EN = 1

write_word(buf);

delay(2);

buf &= 0xFB; // Make EN = 0

write_word(buf);


// Send bit3-0 secondly

buf = (comm & 0x0F) << 4;

buf |= 0x04; // RS = 0, RW = 0, EN = 1

write_word(buf);

delay(2);

buf &= 0xFB; // Make EN = 0

write_word(buf); }

void send_data(int data){

int buf;

// Send bit7-4 firstly

buf = data & 0xF0;

buf |= 0x05; // RS = 1, RW = 0, EN = 1

write_word(buf);

delay(2);

buf &= 0xFB; // Make EN = 0

write_word(buf);

// Send bit3-0 secondly

buf = (data & 0x0F) << 4;

buf |= 0x05; // RS = 1, RW = 0, EN = 1

write_word(buf);

delay(2);

buf &= 0xFB; // Make EN = 0

write_word(buf); }

void init(){

send_command(0x33); // Must initialize to 8-line mode at first

delay(5);

send_command(0x32); // Then initialize to 4-line mode

delay(5);

send_command(0x28); // 2 Lines & 5*7 dots

delay(5);

send_command(0x0C); // Enable display without cursor

delay(5);

send_command(0x01); // Clear Screen

wiringPiI2CWrite(fd, 0x08); }

void clear(){

send_command(0x01); //clear Screen

}

void write(int x, int y, char data[]){

int addr, i;

int tmp;

if (x < 0) ?x = 0;

if (x > 15) x = 15;

if (y < 0) ?y = 0;

if (y > 1) ?y = 1;

// Move cursor

addr = 0x80 + 0x40 * y + x;

send_command(addr);

tmp = strlen(data);

for (i = 0; i < tmp; i++){

send_data(data[i]); } }

void INThandler(int sig) { printf("Motor Stop\n");

digitalWrite(LPWM, HIGH);

digitalWrite(RPWM, HIGH);

digitalWrite(en, LOW);

exit(0); }