이 강의는 아두이노를 가지고 간단하게 생활에 필요한 용품을 만들어 보는 강의입니다. 뚝딱뚝딱 뭔가 자신만의 DIY 용품을 만들어 보는 쏠쏠한 재미가 있는 강의라고나 할까요? 이미 주변에 아두이노와 관련한 많은 책이 출간되었고 카페나 블로그를 통하여 강의가 진행된 경우도 꽤나 많이 있는데도 불구하고, 이 지면을 통하여 강의를 개설한 이유는 다음과 같습니다. 1. 아두이노의 초보자들을 위한 쉽고 재미있는 강의가 거의 없는 것 같아, 가능하면 초등학생(?)까지도 함께 해 볼 수 있는 그런 강의를 한 번 해보고 싶어서… 현재 구상하고 있는 회차별 내용을 간략하게 정리해 보면 다음과 같습니다. (변경될 수 있습니다.) 회차내용13색 신호등 만들기2카멜레온 반지, 스위치를 이용한 신호등 게임기3FND로 만드는 디지털전압계, 카운트다운 계수기4어두워지면 켜지는 정원등, 공중회전그네5캐롤송 카드, 컬러링 온도계6스마트폰으로 조정하는 스마트카앞으로 즐겁고 알찬 강의가 될 수 있도록 최선을 다할 것을 약속 드리며, 이 강의를 보는 독자들도 메일이나 카페를 통하여 Q&A(Question & Answer)나 피드백을 주셔서, 함께 정감을 나눌 수 있는 계기가 되기를 기대해 봅니다. 여러분, 안녕하세요. ■ 내 자동차(Bory) 규격 및 준비물 자동차의 종류는 다양하여 승용차도 있고 트럭도 있고, 승용차 중에도 고급 승용차도 있고, 경차도 있지만 우리의 자동차는 그저 차체 프레임에 바퀴가 달려있어 굴러갈 수 있는 정도의 자동차로 일단 한정하겠습니다. 하지만 진짜 자동차에는 없는 기능으로, 스마트폰으로 명령을 내릴 수도 있고, 장착 여부에 따라서는 라인트레이서나 자율주행자동차도 될 수 있는 꽤 멋진 DIY 자동차가 될 수 있을 것입니다. [보리(Bory) 스마트카 규격] [보리(Bory) 스마트카 형태]
1. 아두이노 UNO가 있어야 하고, 이 부품들은 따로 따로 하나씩 임의로 구해도 되지만 너무 복잡하므로 일정 부분 이미 상품으로 제공되는 것을 사용하도록 하겠습니다. 아래와 같이 정리가 되겠네요. 부품개수기능기타아두이노 UNO1스마트카 제어아두이노 UNO정품 및 호환 제품JKIT-CAR-12아두이노 AVR 카 베이스 (차체 1개, 바퀴 2개, 모터 2개, 캐스터 1개, 건전지홀더 1개, 브라켓 및 서포터, 나사 다수 포함, 아두이노/AVR은 미포함)JMODMOTOR-114.5~13.5V, 1.2A, 2채널 모터 드라이버(바퀴 구동)JMOD-BT-11블루투스 시리얼 모듈 (스마트폰과 통신)JBATT-U5-LC (리튬전지 포함)1아두이노 및 기타 모듈에 전원 공급소형 브레드보드1HC-SR04 장착용JKIT-CAR-1 + 아두이노 UNOJMOD-MOTOR-1JMOD-BT-1리튬전지 + JBATT-U5-LC 그러면 위의 부품들을 가져다가 대충 한 번 연결해 보지요. 이런 형태가 될라나요?
■ 시리얼 통신 블루투스 시리얼 모듈의 동작을 이해하려면 먼저 UART(Universal Asynchronous Receiver/Transmitter) 시리얼 통신에 대한 기초 지식을 갖추어야 합니다. 10초 드립니다. 10, 9, 8, 7, 6, 5, 4, 3, 2, 1. 종료! 뭐죠? USB 케이블? 예. 맞습니다. 아두이노가 PC와 연결되어 있는 것은 이것 한 개밖에 없으니까요. USB(Universal Serial Bus) 케이블은 피복에 싸여서 속을 볼 수는 없지만 이를 절단해 보면 보통 4개의 전선으로 구성되어 있습니다. 2개는 +5V와 GND 선으로 PC에서 아두이노로 전원을 공급해 주는 전원 선이고, 나머지 2개는 데이터를 주고 받는 통신 선입니다. 아두이노는 이 데이터 라인을 통하여 PC와 정보를 주고 받는데 이 통신 프로토콜을 시리얼(Serial) 통신이라고 합니다. (엄밀하게 말하면 시리얼 통신의 의미는 데이터를 한 개씩 순차적으로(Serial) 보내고 받는다는 일반적인 용어이고, 실제로 여기서 사용되는 통신은 UART(Universal Asynchronous Receiver/Transmitter)라는 이름의 프로토콜을 사용하지만 보통 아두이노에서 시리얼 통신이라고 하면 이 방식을 의미합니다.) 점점 복잡하게 만드는 것인지는 모르겠지만 좀 더 엄밀하게 말하면 USB 방식도 다양한 시리얼통신 방식 중의 하나이고 여기서는 (PC쪽 UART ←→ UART를 USB 방식으로 변환) ←→ USB 케이블 ←→ (USB를 UART 방식으로 변환 ←→ 아두이노쪽 UART) 형태로 사용되므로, 실제 눈으로 보이는 것은 USB 케이블이지만 PC와 아두이노 양쪽에서 사용하는 진짜 통신 방식은 UART 방식입니다. 아두이노에서 시리얼통신이다하면 우리는 그냥 이 UART방식으로 통신한다고 생각하면 되겠습니다. 어려운걸 쉽게 설명하려니 더 어렵네요. 이 말이 더 어렵나요? [시리얼 통신 기능/동작 설명] (2) PC(또는 스마트폰 등 상대방)와 아두이노는 서로 통신 속도가 맞아야 통신이 가능합니다. (3) 데이터는 한 문자(바이트) 단위로 전송됩니다.(write/read) 기왕 테이블이 나온 김에 보너스로 자주 사용되는 제어문자 몇 가지만 더 알아두고 가겠습니다. ASCII 값약어이름C 에서의 표기기능0×00NULNull₩0문장의 마지막을 나타냄0×08BSBack Space₩b커서 위치를 1칸 전 위치로0x0aLF/NLLine Feed(New Line)₩n커서 위치를 1줄 아래 위치로0x0dCRCarrage Return₩r커서 위치를 줄 첫번째 위치로예를 들어 PC등의 화면에서 한 문장을 끊어서 줄바꿈을 하려면 ‘0x0d’, ‘0x0a’를 문장의 마지막에 보내주면 됩니다. (물론 실제 프로그램 작성시에는 라이브러리를 사용하므로 직접 이것을 넣어주는 일은 별로 없겠습니다.) (4) 새로운 데이터를 보내기 위하여는 관련 플래그를 체크한 후에, 송신 가능한 상태이면 송신버퍼에 쓰면(write) 데이터를 전송할 수 있습니다. 아두이노에서는 이와 같은 기능을 모두 라이브러리로 제공하므로 우리는 제공되는 함수를 그냥 사용하면 됩니다. (5) 새로운 데이터가 들어왔다는 사실은 관련 플래그를 체크하면 알 수 있고, 이 때 수신버퍼를 읽으면 전송된 데이터를 가져올 수 있습니다. 아두이노에서는 이와 같은 기능을 모두 라이브러리로 제공하므로 우리는 그냥 제공되는 함수를 사용하면 됩니다. ■ 시리얼 통신을 위한 아두이노 라이브러리 이번에는 UART 통신을 위한 아두이노 라이브러리를 자세히 살펴보겠습니다. 블루투스 시리얼 통신을 하려면 미리 알아두어야 하는 라이브러리입니다. void Serial.begin(baudrate) 그런데, 이 라이브러리는 조금 이상한 점이 있네요? int Serial.avaliable( ) 상대방이 보낸 데이터 수신하는 라이브러리는 Serial.read( )입니다. 전송된 데이터가 여러 개 있다 하더라도 읽혀지지 않은 가장 먼저 입력된 데이터 1개만을 읽어오게 됩니다. 그러므로 입력된 데이터가 여려 개 있다면 이 함수를 여러 번 수행하여 순서대로 모든 데이터를 읽어오면 되겠습니다. char Serial.read( ) 데이터를 상대방에게 송신하는 라이브러리는 Serial.write( )입니다. int Serial.write(char val) 여러 개의 데이터를 한꺼번에 송신하는 라이브러리로는 Serial.print( )와 Serial.println( )이 있습니다. void Serial.print(val) void Serial.print(val, format) void Serial.println(val) void Serial.println(val, format) 이 외에도 더 많은 라이브러리가 있지만 이 정도면 일반적인 프로그램에서는 충분할 것 같네요. 블루투스의 유래는 옛 스칸디나비아 지역을 통일한 덴마크와 노르웨이의 국왕 해럴드 블루투스(Harold “Bluetooth” Gormsson, ?~985 혹은 986)의 별명에서 나왔습니다. 그는 블루투스(Bluetooth, 푸른이빨)라는 별명을 가지고 있었는데, 그것은 블루베리를 좋아해 항상 치아가 푸르게 물들어 있었기 때문이라는 설과, 파란색 의치를 해 넣었기 때문이라는 설이 유력합니다. 위와 같이 생기신 분이지요. 입을 꽉 다물고 있어서 이빨이 푸른색인지는 확인이 안되지만요.
■ 블루투스(Bluetooth) 통신을 이용한 스마트폰-아두이노 연결 블루투스 시리얼 모듈은 UART(Universial Asynchronous Receiver/Transmitter) 방식의 시리얼 통신을 블루투스 통신으로 변환시켜주는 모듈입니다. 이 모듈의 실제적인 세부 동작 원리 및 실행 방법은 조금 복잡할 수 있으므로, 우리는 개념적으로만 이해하면 쉬울 것 같습니다. 실제로 두 개의 시스템이 블루투스 시리얼 모듈을 이용하여 어떻게 시리얼 통신을 수행할 수 있는지에 대한 예를 보이면 아래와 같습니다. 그림(A)는 아두이노 UNO 2개를 UART 통신을 이용하여 연결할 때의 연결도입니다. 아두이노 UNO는 UART 포트를 가지고 있으므로 서로의 UART 포트를 연결(TX-RX 짝으로)하면 시리얼 통신이 가능합니다. 그런데 만약 아두이노 UNO 1개가 손이 닿지 않거나 선을 연결할 수 없는 곳에 위치한다면 어떻게 하시겠습니까? 이런 경우에는 무선으로 연결할 수 있으면 되겠지요? 이럴 때 유선통신의 내용을 무선으로 바꿔주는 역할을 하는 것이 유선-to-무선 변환기이고 블루투스 시리얼(UART-to-블루투스)모듈은 이러한 변환기의 일종이라고 생각하시면 되겠습니다. ‘1’ : 직진 ‘2’ : 좌회전 ‘3’ : 정지 ‘4’ : 우회전 ‘5’ : 후진 레알(REAL)? 레알(REAL)! 아두이노 UNO에 블루투스 시리얼 모듈을 연결하기 기본적인 이론은 알았으므로 이제 아두이노 UNO에 블루투스 시리얼 모듈인 JMOD-BT-1을 연결하여 블루투스 연결을 완성해 보겠습니다. 아두이노 UNO와는 UART 통신을 하게 되므로 JMOD-BT-1에서 아두이노 UNO와 연결해야 하는 핀은 TXD(송신 데이터), RXD(수신 데이터) 신호선과, 전원 핀인 VCC(3.3V~5V, 전원)와 GND(그라운드)로 총 4핀입니다. (나머지 핀들은 JMOD-BT-1의 세팅 시 필요한 핀이므로 실제 통신에서는 사용하지 않습니다.) SoftwareSerial(unit8_t rx, unit8_t tx, bool inverse_logic = false) 프로그램에서 사용하실 때는 첫 부분에 아래와 같은 선언이 필요하고, #include SoftwareSerial ABC = SoftwareSerial(RX, TX); 실제 사용시에는 Serial 클래스와 같이, 아래와 같은 형태로 사용하면 됩니다. ABC.begin(115200); 오, 요런 방법이 있었네요. 그러면 이것을 이용하여 아두이노 UNO와 JMOD-BT-1을 직접 연결해 보도록 하겠습니다. SoftwareSerial에 사용된 핀은 RX는 4번(D4), TX는 5번(D5)를 사용하는 것으로 하지요. 한가지 조심하여야 하는 것은 송신 핀과 수신 핀의 연결인데요. 앞에서도 언급하였지만, 두 기기의 연결에서 한 쪽의 송신핀(TXD)은 다른쪽의 수신핀(RX)에, 한 쪽의 수신핀(RXD)은 다른 쪽의 송신핀(TX)에 연결하여야 한다는 점은 꼭 확인하고 연결하셔야 합니다. 스마트폰의 블루투스 앱으로 아두이노와 통신하기 자, 연결은 되었으니 이번에는 실제로 스마트폰과 아두이노 UNO가 블루투스를 이용하여 통신이 가능한지 알아보기 위한 테스트를 실행해 보겠습니다. 스마트폰의 ‘블루투스’ 항목을 ‘ON’ 상태로 설정한 후에 위와 같이 ‘Bluethooth Controller’ 앱을 실행하면 아래와 같은 화면이 나타나는데, 여기에서 위쪽 오른쪽에 있는 [키 설정] 메뉴를 누르면 다음의 화면이 나타납니다. [키 이름]에 자신이 원하는 이름을 넣고, [데이터 설정]에는 통신 시 이 키를 눌렀을 때 아두이노 쪽으로 전달될 데이터값(예를 들어 ‘1’)을 넣으면 됩니다. 우리는 나중에 스마트카를 제어해야 하므로 제공되는 9개의 칸에 아래와 같이 직관적으로 배치 하겠습니다.전진(“1″)좌회전(“2″)정지(“3″)우회전(“4″)후진(“5″)[OK]를 누루면 아래의 화면이 나타납니다.자, 연결이 잘 되었는지 테스트를 해볼까요? 아두이노 UNO에는 블루투스를 통하여 들어온 데이터를 되돌려 보내는(echoback하는) 프로그램을 업로드하여 스마트폰에서 보낸 데이터(예를 들어 ‘1’, ‘2’ 등)가 다시 스마트폰으로 되돌아 오면 성공이 되겠습니다. [테스트 규격] [알고리즘] 설명하느라 많은 시간을 할애했지만, 실제 프로그램은 너무 쉬워서 알고리즘이라고 할 것도 없습니다. 바로 스케치 프로그램으로 넘어갑니다. #include #define SS_RX 4 // SoftSerial RX 핀번호 = 4 SoftwareSerial btSerial = SoftwareSerial(SS_RX, SS_TX); // 블루투스시리얼은 SoftSerial 사용 void setup() void loop() 얼른 업로드하고, 앱을 이용하여 연결이 잘 되었는지 확인해 보겠습니다. 1. 스마트폰에서 블루투스 컨트롤러 앱을 실행하고 2. 아두이노 UNO에 연결된 JMOD-BT-1과 패어링(pairing : 블루투스 마스터와 블루투스 슬레이브가 통신할 수 있는 상태로 진입하는 것)을 한 후 3. 버튼을 눌러 대응되는 숫자가 되돌아 오는지 확인(즉, ‘전진’ 버튼을 누르면 ‘1’, 좌회전을 버튼을 누르면 ‘2’, 정지 버튼을 누르면 ‘3,’ 우회전 버튼을 누르면 ‘4’, 후진 버튼을 누르면 ‘5’, 값이 스마트폰 앱 화면 창에 나타나면 성공!) ■ 내 스마트카 조립 자, 이제 필요한 기본 지식은 모두 갖추었으니 드디어 내 차를 만들고 운전해 볼 시간입니다. 실제로 이미 자동차를 가지고 계신 분도 있고, 아직은 없는 분도 있겠지만, 오늘 DIY할 스마트카는 아두이노 장난감차니까, 부담없이 내 맘대로 만들어서 내 멋대로 이리저리 마구 운전해 봅시다. [아두이노 연결] 연결된 부분을 잠시 설명해 보면, 아래 표와 같습니다.
일단 모터를 구동하는 전원과 아두이노 및 다른 모듈에서 사용할 전원은 분리하도록 합니다. 모터는 일반적으로 전류를 많이 사용하고, 모터마다 사용 전압도 다르며, 기동시 순간적인 과전류로 인한 전원 소스의 흔들림(전압강하)도 생길 수 있는 부품이어서 아두이노나 블루투스 시리얼 모듈로 공급되는 전원과는 다른 전원 소스를 사용하는 것을 권장합니다. 만약, 모터가 5V로 구동이 가능하여 동일한 5V 전원 소스로 사용하려 할 때에는 전원 소스의 전류 공급용량이 충분한지, 전원 드랍(drop)은 영향이 없는지 등의 여부를 잘 살펴서 사용하셔야 불안정한 동작을 방지할 수 있습니다. 우리는 1.5V 건전지 4개를 직렬 연결한 배터리 홀더에 넣어서, 6V를 모터의 전원으로 사용하겠습니다. 그리고 아두이노와 블루투스 시리얼 모듈, 그리고 모터드라이버 모듈의 제어 부분 전원으로는 5V를 공급해야 하므로 이것은 리튬전지(4.2V)를 스텝업 레귤레이터를 이용하여 5V로 만들어 주는 전원조종기인 제이씨넷의 JBATT-U5-LC를 사용하겠습니다. (참고로, JBATT-U5-LC는 리튬전지를 사용하고 USB 케이블로 충전이 가능하며, 전원 ON/OFF 스위치가 내장된 소형 전원공급기입니다.) 물론, 시중에 나와 있는 임의의 전압공급기 모듈을 사용해도 되고, 직접 전압공급기 회로를 제작하여 사용해도 되지요. 또는, 7V 이상의 전원 소스가 있다면 아두이노 VIN 핀으로 직접 이 전원을 넣어주고, +5V 핀으로부터 블루투스 시리얼 모듈과 모터드라이버 모듈의 제어 부분 전원을 연결하여 사용하는 것도 한가지 방법이 되겠습니다. 모터드라이버 모듈의 경우는 내부에서 사용하는 전원과 모터로 공급되는 전원, 2개를 모두 연결해주어야 하는 것에 주의하셔야 하고, 2개의 전원소스의 GND는 어떤 형태로든 연결되어 있어야 함에 주의하시기 바랍니다. 조금 복잡할 수 있으므로 모터 드라이버의 핀 연결을 확대하여 다시 한 번 연결 형태를 정리해 보면 아래와 같이 되겠습니다. 6V 전원(건전지홀더)의 GND는 외부에서 5V 전원의 GND와 연결한다는 의미로 점선 – - – 으로 표시하였습니다. [조립하기] 초기 앞면, 뒷면을 조립하면 아래와 같은 모양이 됩니다. 그리고 각 모듈과 전원까지 모두 연결하면~ 짠~~~! 이렇게 만들어졌습니다. ■ 내 스마트카 프로그램 이제 차체는 모두 완성하였으니 스케치 프로그램만 작성하여 업로드해 봅시다. 스마트폰에서 들어온 입력을 검사하여 각 숫자에 대응되는 동작인 전진, 후진, 좌회전, 우회전, 정지의 5가지 기능 중 하나를 실행하면 되겠습니다. 또한, 각 기능은 모터 2개의 동작으로 구현할 수 있는데 이는 아래의 표를 확인하기 바랍니다. 예를 들어 좌회전 기능을 구현한다면, 왼쪽 바퀴(모터)는 천천히 전진하고 오른쪽 바퀴(모터)는 앞으로 전진하면 차제가 왼쪽으로 기울면서 좌회전하는 형태가 되겠습니다. 실제로 좀 더 부드럽게 동작하려면 왼쪽 바퀴(모터)는 조금 천천히 구동되고, 오른쪽 바퀴(모터)는 빨리 구동되는 형태로 구현하면 되겠지요. (이 동작은 PWMA, PWMB의 값을 아날로그적으로 0~255까지 조절이 가능하므로 적당한 값을 주어 구현이 가능합니다.) (20), (19), (18), …… (3), (2), (1), (0) ! 아래를 보시지요. #include #defineSS_RX 4 // SoftSeiral RX 핀 <-> JMOD-BT-1의 TXD 연결 #define FORWARD ‘1’ // 전진 명령어 #defineSPEED_100 255 // PWM값 255(0~255), 100% 값 SoftwareSerialbtSerial = SoftwareSerial(SS_RX, SS_TX); constint pwma = 6; // 모터 APWM 입력핀 voidforw() // 전진 처리,모터 A = 전진, 모터 B = 전진 voidforwL() // 좌회전 처리, 모터 A= 전진, 모터B = 약하게 전진 voidforwR() // 우회전 처리, 모터 A = 약하게 전진, 모터B = 전진 voidback() // 후진 처리,모터 A = 후진, 모터 B = 후진 voidstop() // 정지 처리,모터 A = 정지, 모터 B = 정지 voidsetup() voidloop() 모터 제어에서 “analogWrite(pwma,SPEED_75)”와 같이 PWM 핀에 192(=SPEED_75)와 같은 값을 주는 것은 전체값인 255(SPEED_100)을 주었을 때 모터가 너무 빨리 회전하여 스마트카가 너무 빨리 움직일 것 같아 적당한 값을 준 것이며, 한편으로는 모터에 의하여 소모되는 전력을 조금 적게 하여 건전지의 수명을 조금 연장하려는 의미도 있습니다. 1. 스마트폰에서 블루투스 컨트롤러 앱을 실행하고 2. 아두이노 UNO에 연결된 JMOD-BT-1과 패어링(pairing : 블루투스 마스터와 블루투스 슬레이브가 통신할 수 있는 상태로 진입)한 후 3. 버튼을 눌러 정해진 명령대로 스마트카가 움직이는지 확인 (전진 버튼을 누르면 ‘1’, 좌회전을 버튼을 누르면 ‘2’, 정지 버튼을 누르면 ‘3,’ 우회전 버튼을 누르면 ‘4’, 후진 버튼을 누르면 ‘5’ 값이 스마트폰 → JMOD-BT-1 → 아두이노로 전달되고 아두이노는 이 명령어에 해당되는 기능을 수행 |