아두이노2017. 10. 11. 12:52

연휴기간에 심심해서 아이와 만들어서 놀아볼 생각으로 아두이노 무선조종 보트를 만들어 보았다. 뭐 결과적으로 실패지만 적절한 추진 프로펠러(스크류)와 모터만 있다면 충분히 가능성이 있다고 생각한다. (결과적으로 내가 만든 보트는 앞으로 잘 나아가지 않았다) 앞으로 나아가는데는 실패지만 아두이노 코드와 블루투스 모듈 서보모터 그리고 PWM 으로 DC모터 제어하는 것은 성공했으니 그래도 절반은 성공이 아닐까? ㅎㅎ


뭐... 작동원리는 간단하다. 아두이노 나노에 블루투스 모듈(HC-06)을 달아서 휴대폰과 통신을 해서 보트의 제어를 하게 된다. 아두이노에는 PWM 으로 DC모터의 속도를 조절할 수 있게 해서 보트의 추진력을 조절하고 서보모터(SG90) 을 달아서 보트의 방향을 전환하도록 한다. 이에 대한 참고는 본 블로그의 과거 글을 참고 했다. 각 모듈에 대해서 궁금하면 아래의 링크를 참고하도록 한다.


 

대략적인 부품들이다. 6V 배터리팩 (나중에 휴대폰 충전용 보조배터리로 교체), PWM용 저항, 다이오드, 세라믹 커패시터, 트랜지스터, 서보 모터, 블루투스 모듈 그리고 실패의 원인 추진용 수중모터 이다. 수중모터는 물을 빨아들여서 뒤로 쏴주면 앞으로 나아가지 않을까 해서 프로펠러 대신 달아 주었는데 너무 출력이 약해서 추진이 제대로 되지 않았다. 이는 나중에 더 높은 전압과 전류를 공급하거나 프로펠러 방식으로 교체하면 제대로된 추진력이 생기지 않을까? 생각한다.


모터 PWM용 부품들 저항 270옴, 다이오드 1N4001, 트랜지스터 KTN2222A 그리고 모터 노이즈 제거용 세라믹 커패시터


간만에 꺼내보는 블루투스 모듈 HC-06


방향전환 용도 서보 모터 SG90


수중 모터. 화살표 방향으로 물이 들어가고 나온다. 충분한 전력이 공급되지 않으면 제대로된 출력이 나오지 않는다. 1W ~ 1.5W 정도는 되어야 한다.


부품들을 모두 연결한 모습


브레드보드에 연결을 했다.


배의 본체는 스티로폼을 보트 모양으로 잘라서 날림으로 만들었다. ^^;


서보 모터와 연결된 보트의 방향타인데 적당한 아이디어가 생각나지 않아서 나무 귀후비개를 잘라서 글루건으로 붙였다. 그런데 이게 너무 약해서 물에 띄우니 너무 흔들 거린다. 이 부분도 제대로 하려면 보강이 필요하다.


Bluetooth_Boat.fzz


■ 소스

소스는 별거 없다. 위의 참고글의 소스를 조합하면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <SoftwareSerial.h> //시리얼 통신 라이브러리 호출
#include "Servo.h" //서보 라이브러리
 
Servo myservo; //서보객체
int blueTx=2;   //Tx (블투 보내는핀 설정)
int blueRx=3;   //Rx (블투 받는핀 설정)
int motorPin=4//motor pin
 
SoftwareSerial mySerial(blueTx, blueRx);  //시리얼 통신을 위한 객체선언
String myString=""//받는 문자열
 
void setup() {
  myservo.attach(12);   //서보 시그널 핀설정
  myservo.write(45);     //서보 초기각도 0도 설정
  mySerial.begin(9600); //블루투스 시리얼 개방
  pinMode(motorPin, OUTPUT); //motor pin output setup
}
 
void loop() {
  while(mySerial.available())  //mySerial 값이 있으면
  {
    char myChar = (char)mySerial.read();  //mySerial int형식의 값을 char형식으로 변환
    myString+=myChar;   //수신되는 문자열을 myString에 모두 붙임 (1바이트씩 전송되는 것을 모두 붙임)
    delay(5);           //수신 문자열 끊김 방지
  }
  
  if(!myString.equals(""))  //myString 값이 있다면
  {
    Serial.println("input value: "+myString); //시리얼모니터에 myString값 출력
 
      if(myString=="l")  //Turn Left
      {
        myservo.write(90);     
      } else if(myString=="r") {  //Turn Right
        myservo.write(0);
      } else if(myString=="st") {  //Straight
        myservo.write(45);
      } else if(myString=="0") {  //stop
        analogWrite(motorPin, 0);
      } else if(myString=="1") {  //speed 1
        analogWrite(motorPin, 100);
      } else if(myString=="2") {  //speed 2
        analogWrite(motorPin, 180);
      } else if(myString=="3") {  //speed 3 (PWM 최고속도)
        analogWrite(motorPin, 255);
      } else {        
      }
    myString="";  //myString 변수값 초기화
  }
}
cs



소스를 업로드 하고 스마트폰에 앱을 하나 설치하고 실행한다. 블루투스 모듈과 연결하고 신호를 보낼 앱인데 검색하면 많은 앱들이 있다. 나는 그 중에서 'Bluetooth Serial Controller'  라는 앱을 애용한다. 간단하고 사용하기 쉽다.


바로 이 앱이다. 검색하면 바로 나온다.


나는 위와 같이 설정을 했다. 속도는 정지인 0단, 1,2,3단으로 PWM을 이용해서 조절한다. 그리고 서보 모터 (방향타)를 직전, 좌, 우로 설정해서 방향을 조절할 수 있도록 한다. 조금만 살펴 보면 누구나 쉽게 설정할 수 있다. 여기서 잊지 말아야 할 것이 있는데 블루투스 모듈이 앱에 CONNECT 되어 있어야 한다. 블루투스 모듈 설정 및 CONNECT 방법은 맨 위의 참고 글을 참고한다.


스마트폰으로 동작해 보는 영상이다.


아무튼 수중 모터의 추진력이 약해서 결론적으로 실패지만 조금 더 보강하면 충분히 가능성이 있는 DIY 이다. 추진력 보강은 프로펠러 방식으로 바꾸던가 수중모터에 외부전원을 보강해서 더 높은 전력을 공급하면 잘 움직일 것으로 생각된다. 그리고 방향타 방식도 좀 더 튼튼한 방식으로 바꿔야 한다.

반응형
Posted by 대네브 (deneb)

댓글을 달아 주세요

  1. 비밀댓글입니다

    2017.11.16 17:06 [ ADDR : EDIT/ DEL : REPLY ]
    • 링크에 들어가보니
      메카솔루션 블로그네요.
      거기에 문의를 해 보는게 제일 좋겠네요

      암튼 저의 경우 따라하기 했는데 안되는 경우는

      1. 연결이 잘못된 경우
      2. 전력이 부족한 경우
      3. 원본 소스가 잘못된 경우
      4. 라이브러리 문제
      5. 부품의 불량

      등을 생각해 볼 수 있었습니다.

      2017.11.16 19:12 신고 [ ADDR : EDIT/ DEL ]
    • 비밀댓글입니다

      2017.11.16 23:02 [ ADDR : EDIT/ DEL ]
  2. 비밀댓글입니다

    2018.10.17 19:20 [ ADDR : EDIT/ DEL : REPLY ]