내자전거를지켜줘! 이름학번연락처이메일 이주희 201011357 010-5043-9053 da2468@naver.com 김민선 201011312 010-9086-9037 mieeu@hanmail.net 지도교수 : 김기천교수님 ( 인 ) Computer Science & Engineering 1/18
1. 프로젝트소개 1.1 배경및목적 1.2 시나리오 1.3 프로젝트기능 2. 개발 2.1 프로그램구성 2.2 아두이노 2.3 안드로이드 3. 진행상황 3.1 개발진행방향 4. 개발계획 4.1 개발및테스트환경 Computer Science & Engineering 2/18
1. 프로젝트소개 1.1 배경및목적 개인의취미생활, 건강, 다이어트등을위해자전거를타는 자전거족 이점점늘어나고있다. 다양한이유만큼다양한종류의자전거, 다양한가격대의자전거가출시되고있고, 점점그가격 도고가화되고있다. 이러한문화에맞춰자전거에관련된다양한어플리케이션도개발되고있다. 하지만그에따라많은문제들도발생하고있는데, 그중하나는자전거도난 / 분실이다. 개인의취미생활과건강을위한다양한기능 / 기종의자전거가출시되고있고, 나만의유니크한자전거를원하는고객에맞춰주문제작되는자전거도많아지고있다. 이에따라자연스럽게자전거가격은상승하고있지만, 시중에나와있는자전거락는단순한자물쇠기능을벗어나지못하고있다. 따라서자전거도난이큰문제로대두되고있다. 이러한상황에대비해여러해결책이나오고있지만, 그효과는미비하게나타나고있다. 이에우리는자전거를지킬수있는근본적인것에접근하기로하였고, 현재아주단순한잠금기능을하는자전거락를효과적으로개선하고자한다. 따라서우리는이러한상황에대처하여자전거를효과적으로관리하고보호하기위해휴대폰어 플리케이션과연동되는자전거락앱을개발하는것이목적이다. 1.2 시나리오 자전거운행시에는운행모드이므로움직여도아무알림이없지만, 자전거에락를걸어두면자전 거가움직이는진동이감지되면사용자의핸드폰으로알림이온다. 또한운행모드시에사용자가 이동한경로, 거리, 시간등을기록하여저장해둘수있다. 1.3 프로젝트기능 - 사용자의휴대폰애플리케이션을통해자전거락을잠금 - 사용자의휴대폰애플리케이션을통해자전거락을해제함 - 락이잠긴상태에서진동이발견될시, 사용자휴대폰으로알림 ( 트위터연동 ) - 자전거운행시, 운행경로 / 거리 / 시간을저장함 Computer Science & Engineering 3/18
2. 개발 2.1 프로그램구성 (1) 자전거도난방지 1 진동감지 장치의진동센서를통해진동이감지된다. 2 자전거의트위터계정으로알림, 3 사용자계정을태그 @ 사용자 진동이감지되면, 장치에등록해놓은자전거의트위터계정으로글이올라가게된다. 이때, 글 에사용자의계정을태그한다. 4 사용자트위터에등록해놓은휴대폰으로알림 태그된사용자에미리등록해놓은휴대폰으로트위터알림이오게되고, 사용자는자신의자전거 에움직임이발생했다는것을알게된다. Computer Science & Engineering 4/18
(2) 자전거락 / 해제 자전거락장치와휴대폰은블루투스를통해상호작용한다. Computer Science & Engineering 5/18
2.2 아두이노 2.2.1 움직임감지시부저로알림 const unsigned int X_AXIS_PIN = 2; const unsigned int Y_AXIS_PIN = 1; const unsigned int Z_AXIS_PIN = 0; const unsigned int BAUD_RATE = 9600; const int buzzerpin = 2; void setup() { Serial.begin(BAUD_RATE); void loop() { int init_x = analogread(x_axis_pin); int init_y = analogread(y_axis_pin); int init_z = analogread(z_axis_pin); delay(1000); int x = analogread(x_axis_pin); int y = analogread(y_axis_pin); int z = analogread(z_axis_pin); if(init_x-x > 100 init_y-y > 100 init_z-z > 100 init_x-x < -100 init_y-y < -100 init_z-z < -100) { tone(buzzerpin, 131, 200); Serial.print(init_x - x); Serial.print(" "); Serial.print(init_y - y); Serial.print(" "); Serial.println(init_z - z); delay(1000); Computer Science & Engineering 6/18
( 사진 1) 움직임감지시부저로알림 2.2.2 움직임감지시트위터에글을올림 import processing.serial.*; final int LINE_FEED = 10; final int BAUD_RATE = 9600; final String CONSUMER_KEY = ""; final String CONSUMER_SECRET = ""; final String ACCESS_TOKEN = ""; final String ACCESS_TOKEN_SECRET = ""; Serial arduinoport; void setsup() { tweetalarm(); println(serial.list()); arduinoport = new Serial(this, Serial.list()[0], BAUD_RATE); arduinoport.bufferuntil(line_feed); void draw() { void serialevent(serial port) { Computer Science & Engineering 7/18
//tweetalarm(); final String arduinodata = port.readstringuntil(line_feed); if(arduinodata!= null) { final String[] data = split(trim(arduinodata), ' '); if(data.length == 2 && (data[1].equals("c") data[1].equals("f"))) { float temperature = float(data[0]); println(temperature); int sleeptime = 5 * 60 * 1000; if(temperature > MAX_WORKING_TEMP) { tweetalarm(); sleeptime = 120 * 60 * 1000; try { Thread.sleep(sleepTime); catch(interruptedexception ignoreme) { void tweetalarm() { TwitterFactory factory = new TwitterFactory(); Twitter twitter = factory.getinstance(); twitter.setoauthconsumer(consumer_key, CONSUMER_SECRET); AccessToken accesstoken = new AccessToken(ACCESS_TOKEN, ACCESS_TOKEN_SECRET); twitter.setoauthaccesstoken(accesstoken); try { Status status = twitter.updatestatus("someone, please, take me to the beach!"); println("successfully updated status to '" + status.gettext() + "'."); catch(twitterexception e) { Computer Science & Engineering 8/18
2.2.3 서보모터작동 #include <Servo.h> const unsigned int MOTOR_PIN = 9; const unsigned int MOTOR_DELAY = 15; const unsigned int SERIAL_DELAY = 5; const unsigned int BAUD_RATE = 9600; Servo servo; void setup() { Serial.begin(BAUD_RATE); servo.attach(motor_pin); delay(motor_delay); servo.write(1); delay(motor_delay); void loop() { const int MAX_ANGLE = 3; char degrees[max_angle + 1]; if(serial.available()) { int i = 0; while(serial.available() && i < MAX_ANGLE) { const char c = Serial.read(); if(c!= -1 && c!= '\n') degrees[i++] = c; delay(serial_delay); degrees[i] = 0; Serial.print(degrees); Serial.println(" degrees."); servo.write(atoi(degrees)); delay(motor_delay); Computer Science & Engineering 9/18
( 사진 2) 서보모터연결 2.2.4 휴대폰과아두이노의블루투스연결 ( 아두이노 ) (1) 아두이노에블루투스실드연결 #include <SoftwareSerial.h> int bluetoothtx = 2; int bluetoothrx = 3; SoftwareSerial bluetooth(bluetoothtx, bluetoothrx); void setup() { //Setup usb serial connection to computer Serial.begin(9600); //Setup Bluetooth serial connecti/on to android delay(100); bluetooth.begin(9600); void loop() Computer Science & Engineering 10/18
{ //Read from bluetooth and write to usb serial if(bluetooth.available()) { //char tosend = (char)bluetooth.read(); //Serial.print(toSend); byte data = bluetooth.read(); Serial.print((char)data); //Read from usb serial to bluetooth if(serial.available()) { char tosend = (char)serial.read(); Serial.println("Send: "+tosend); bluetooth.print(tosend); ( 사진 3) 아두이노에블루투스연결 Computer Science & Engineering 11/18
(2) 휴대폰이블루투스를통해아두이노의서보모터작동시킴 #include <SoftwareSerial.h> #include <Servo.h> int bluetoothtx = 2; int bluetoothrx = 3; const unsigned int MOTOR_PIN = 9; const unsigned int MOTOR_DELAY = 15; const unsigned int SERIAL_DELAY = 5; const unsigned int BAUD_RATE = 9600; SoftwareSerial bluetooth(bluetoothtx, bluetoothrx); Servo servo; void setup() { //Setup usb serial connection to computer //Serial.begin(9600); //Setup Bluetooth serial connecti/on to android Serial.begin(BAUD_RATE); delay(100); bluetooth.begin(baud_rate); servo.attach(motor_pin); delay(motor_delay); servo.write(1); //initial value delay(motor_delay); void loop() { //Read from bluetooth and write to usb serial if(bluetooth.available()) { //char tosend = (char)bluetooth.read(); //Serial.print(toSend); byte data = bluetooth.read(); char motor = (char)data; Computer Science & Engineering 12/18
Serial.print(motor); if(motor == 'a') { servo.write(30); delay(motor_delay); servo.write(1); delay(motor_delay); ( 사진 4) 아두이노에연결된블루투스실드와서보모터 Computer Science & Engineering 13/18
2.3 안드로이드 2.3.1 휴대폰과아두이노의블루투스연결 ( 안드로이드 ) 아두이노로락잠금 / 해제메시지를전달한다. public void write(byte[] buffer) { try { mmoutstream.write(buffer); // Share the sent message back to the UI Activity mhandler.obtainmessage(mainactivity.message_write, -1, -1, buffer).sendtotarget(); catch (IOException e) { if(d) Log.e(TAG, "Exception during write", e); Computer Science & Engineering 14/18
2.3.2 안드로이드어플리케이션실행화면 (1) 어플리케이션실행초기화면 (splash) (2) 블루투스연결장비목록화면 Computer Science & Engineering 15/18
(3) 장비연결실패화면 (4) 장비연결성공 Computer Science & Engineering 16/18
(5) 휴대폰의입력이아두이노로전달 Computer Science & Engineering 17/18
3. 진행상황 3.1 개발진행방향 - 아두이노의모든기능통합적연동 - 애플리케이션사용자 UI 개선 - 자전거락장치구성 4. 개발계획 4.1 개발및테스트환경 - 시스템 : 마이크로소프트윈도우환경 - 개발언어 : JAVA, 안드로이드 SDK - 개발 Toll : Android SDK with Eclipse (Java), 아두이노 IDE, Processing - 테스트기기 : GALAZXY S III, NOTE III - 아두이노보드, 센서, 케이블등 Computer Science & Engineering 18/18