아두이노를 활용한 LED 제어, 전자음악, RC카 개조

제가 고등학교 다닐 때 아두이노를 사용하여 혼자 만들어보았던 것들입니다. 제 기억엔 겨울 방학 때 막 프로듀스 101이 처음 선보일 즈음이었던 것 같습니다. 이미 다른 제 블로그에 올렸던 것이지만, 여기에 재업로드합니다. (수정도 조금 하였습니다. 참고로 지금은 아두이노 관련 지식은 다 까먹었습니다)

안녕하세요! 이번엔 아두이노를 새로 선보이게 될 것입니다.
그리고 이번엔 사진편집이 너무 힘들어서 사진마다 자막을 달면서 설명하는 것이 아닌 사진 밑에 설명을 달겠습니다.
먼저, 아두이노는 한마디로 작은 컴퓨터입니다. 컴퓨터 역할을 해주기 때문에 사용자가 원하는 것을 프로그래밍으로 구현할 수 있죠. 예를 들면, LED를 켰다껐다 하는 것이라든지, 무선 자동차를 조종하는 것이라든지 등등이 있을 것입니다. 저도 전자기기를 좋아하는 한 사람으로써 아두이노를 주위 사람들을 통해 많이 들어보았는데, 막연하게 어려울 것 같아 한동안 안 하고 있다가 최근 우연히 프로그래밍 언어를 간략하게 배웠고(STAY...), 그 후에 아두이노를 다시 보니 재미있을 것 같아서 아두이노 우노와 그 외 여러 부품들을 구입하였습니다!
그럼 이제 제가 실험한 것들을 소개해 보겠습니다.

제가 오늘 실험할 재료들입니다. 아두이노 나노도 같이 샀었는데 고장이 나서 오늘은 안 쓸 거구요, 피에조(스피커 같은 것)랑 블루투스 모듈(HC-06), 모터 드라이버, 기존의 집에 있던 RC카, LED, 브레드보드, 푸시버튼, 아두이노 우노, 노트북 등이 있습니다.

먼저 컴퓨터에 아두이노를 깔아주세요. 홈페이지(www.arduino.cc)에 들어가셔서 까시면 됩니다. 까는 방법을 더 자세히 알고 싶으시면 포털 사이트에 검색하시면 됩니다.

아두이노는 정품을 사용할 경우 다른 설치가 필요하지 않지만, 저는 중국제 싼 제품을 사용하기 때문에 추가 드라이버 설치를 하였습니다. 아두이노 구입처에서 확인해 보시거나, 인터넷을 찾아보시면 드라이버를 추가로 어떻게 설치하는지 알 수 있을 겁니다.

아두이노가 실행되었다면 아두이노 우노 보드를 컴퓨터와 연결합니다.

그리고 브레드보드에 이런 식으로 회로를 구성하고, 아두이노 우노 보드에 코드를 입력하여 업로드합니다. 회로 설명은 생략하겠습니다. (아두이노 관련 책을 보시면 상세한 설명을 얻을 수 있습니다. 저도 이 실험은 책을 참고하여 구성하였습니다.)


푸시버튼으로 작동되는 LED의 프로그래밍 코드는 다음과 같습니다.
const int LED = 13; // LED의 핀번호
const int BUTTON = 7; // 푸시버튼 연결된 연결 핀번호
int val = 0; // 입력핀의 상태
void setup() {
pinMode(LED, OUTPUT); //LED는 출력
pinMode(BUTTON, INPUT); //BUTTON은 입력
}
void loop() {
val = digitalRead(BUTTON); // 입력 값을 읽어 저장
// 입력이 HIGH(버튼이 눌림)인지 검사
if (val == HIGH) {
  digitalWrite(LED, HIGH);
} else {
  digitalWrite(LED, LOW);
}
}

그리고 작동영상입니다(작동영상들은 원본 링크 참조).
여기서 void setup()과 void loop()는 아두이노를 프로그래밍 할 때 꼭 있어야 하는 함수입니다. void setup은 한 번만 실행하고자 하는 것들을 중괄호{ } 안에 넣어주시면 되고, void loop는 계속 반복해서 실행하고자 하는 것들을 중괄호{ } 안에 넣어주시면 됩니다.
다음은 노래하는 피에조를 한 번 만들어 보겠습니다. 저희 학교 물리 선생님이 피에조를 빌려주셨습니다.

이렇게 프로그래밍을 작성하는데, 여기서 pitches.h는 아두이노 프로그램 메뉴에서 파일>예제>02.Digital>toneKeyboard로 가시면 여러가지 노트들에 주파수가 할당된 그런 게 나옵니다. 위 사진에서 GRAY옆에 있는 게 바로 pitches.h입니다. 그리고 GRAY에서 #include "pitches.h"를 작성하여 pitches.h에 있는 내용을 끌어옵니다.

제가 피아노 학원을 4년동안 다녀서 왠만한 노래는 계이름을 대충 알아맞힐 수 있습니다.(자랑은 아님...) 그런데 위 코드로 하니까 소리 길이의 간격이 실제 곡과 조금 다르네요. 코드를 조금 수정하겠습니다.

눈치 채셨을지도 모르겠지만 song[]은 아두이노가 작동시킬 노래의 계이름들을 수학에서 집합과 같이 쓴 것이고, time[]은 song[]의 각 계이름마다 연주할 길이를 지정한 것입니다. song[]안에는 문제가 없는 것 같으니 time[]을 좀 수정하고 업로드합니다.


제가 썼던 코드입니다.


#include "pitches.h"
#define PIEZO 5
int i;
int song[ ] = {NOTE_D6, NOTE_B5, NOTE_G5, NOTE_A5, 0, NOTE_G5, NOTE_A5,
               NOTE_D6, NOTE_B5, NOTE_G5, NOTE_A5, 0,
               NOTE_D6, NOTE_B5, NOTE_G5, NOTE_A5, 0,
               NOTE_D5, NOTE_B5, NOTE_E5, 0};   
 
                 
int time[ ] = {250, 250, 250, 250, 1250, 125, 125,
               250, 250, 250, 250, 1250,
               250, 250, 250, 250, 1500,
               250, 250, 250, 1250};                     
 
void setup()
{
  pinMode(PIEZO, OUTPUT);        // PIEZO 버저핀은 출력
  delay(3000);                        
}
 
void loop()                            
{
  for (i=0; i<21; i++)                  // 연주 길이만큼 숫자 조정
  {
    tone(PIEZO, song[i], time[i]);    // 배열순으로 노래 재생
    delay(time[i]);
  }
}


void loop() 안에 코드를 집어넣어 노래가 반복 재생할 수 있도록 하였습니다.


아래 동영상(작동영상들은 원본 링크 참조)은 노래를 작동시킨 것입니다. 소리가 작아졌다 커지니까 스피커 사용에 주의하세요!



다른 곡도 해봤습니다. 힌트는 SANE입니다. 이 노래의 아두이노 프로그래밍 코드입니다. 당연히 pitches.h가 같이 있어야 합니다.

#include "pitches.h"
#define PIEZO 5
int i;
int song[ ] = {NOTE_A6, NOTE_FS6, NOTE_E6, NOTE_D6, NOTE_A5, NOTE_B5, NOTE_D6,        
               NOTE_B5, NOTE_A5, NOTE_B5, NOTE_D6, NOTE_E6, NOTE_FS6, 0,   
               NOTE_A6, NOTE_FS6, NOTE_D6, NOTE_A5, NOTE_D6, NOTE_E6,      
                     NOTE_FS6, NOTE_G6, NOTE_FS6, NOTE_E6, NOTE_D6, 0};   
 
                 
int time[ ] = {500, 500, 250, 250, 250, 250, 250, 250, 125, 125, 250, 250, 250, 500, // 8분음표 = 250ms
         500, 500, 500, 250, 250, 250, 250, 250, 250, 250, 250, 500};                     
 
void setup()
{
  pinMode(PIEZO, OUTPUT);        // PIEZO 버저핀은 출력
  delay(3000);                        
}
 
void loop()                            
{
  for (i=0; i<26; i++)                  // 연주 길이만큼 숫자 조정
  {
    tone(PIEZO, song[i], time[i]);    // 배열순으로 노래 재생
    delay(time[i]);
  }
}

그리고 동영상입니다(작동영상들은 원본 링크 참조).

전자노래 같은 경우는 저작권에 문제가 있을 시 바로 삭제하겠습니다. 가수분들과 작곡가, 작사가 등등 분들께서 심혈을 기울여 만드신 노래인데 그분들이 쓰지 말라고 한다면 당연히 쓰지 말아야죠. 하지만 제가 좋아하는 노래이기 때문에 한 번 사용해 봤습니다.

마지막으로 RC카 개조를 해보겠습니다. 제일 힘들었던 거였는데(10시간 정도 걸린 듯), 그래도 성공해서 기분은 좋았습니다. 이 차는 원래 따로 조종기가 있어서 그 조종기로 작동하는 것이지만, 핸드폰으로 한 번 조종을 해보고 싶었기에 아두이노를 이용하여 이것을 한 번 개조해 보기로 마음먹었습니다.

모터 드라이버입니다. 작은 걸로 구입하였습니다. 브레드보드에 연결한 모습입니다. (이때까지도 아두이노 나노는 멀쩡했는데... ㅠㅠ)

모터 드라이버 사양입니다. 모터 두개를 제어할 수 있습니다.

모터 드라이버 나사를 풀고

RC카 모터 두개를 연결시켜줍니다. 연결 순서는 어차피 프로그래밍 과정에서 수정할 것이기 때문에 상관 없지만, 무저건 RC카의 두 개의 모터가 각각 따로 연결되어야 합니다. 다시 말하자면, 모터 드라이버에 있는 4개의 나사에서 처음 두개에 모터를 한 개 연결시키고, 나머지 두개에 다른 모터 한 개를 연결시켜 주어야 합니다.

이렇게 일단 모터를 연결시켜줍니다.

그리고 앞의 블루투스 모듈(HC-06)도 연결시키고, 코드를 작성하여 아두이노 보드에 업로드 시킵니다. 이 과정은 사진 찍는 걸 깜빡했네요. 그리고 전원을 공급해 줍니다. (위험할 수도 있으니 컴퓨터에 연결시키는 게 가장 안전합니다.)

그럼 핸드폰의 작동에 따라 아두이노가 움직입니다. 9V 전지로는 움직이는 데 한계가 있더라구요. 블루투스 모듈이 전류를 엄청 잡아먹는 것 같습니다. usb로 전원을 공급해야 원활히 작동됩니다. 보조 배터리를 연결해도 잘 돌아가더군요.

이게 원래 조종기였는데, 지금은... 관짝행

Bluetooth RC Controller란 어플을 이용하여 작동이 가능합니다.

여기서 RC카의 블루투스 모듈과 연결시켜주면 됩니다.

동영상은 까먹어서 못 찍었구요, 나중에 큰 스케일로 찍어서 올려보겠습니다.
제일 중요한 코드! 아래에 있습니다.
#include <SoftwareSerial.h> //시리얼 통신 라이브러리 호출
 
int blueTx=2;   //Tx (보내는핀 설정)
int blueRx=3;   //Rx (받는핀 설정)
String myString="";
SoftwareSerial mySerial(blueTx, blueRx);  //시리얼 통신을 위한 객체선언
 
void setup() {
  Serial.begin(9600);   //시리얼모니터
  mySerial.begin(9600); //블루투스 시리얼 개방
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}
 
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값 출력
    myString="";  //myString 변수값 초기화
  }
  if(mySerial.available())  //myString 값이 있다면
  {
    char data = mySerial.read();
     
    if(data =='L') {
      digitalWrite(4, HIGH);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
    }
    if(data =='R') {
      digitalWrite(4, LOW);
      digitalWrite(5, HIGH);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
    }
    if(data =='B') {
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, HIGH);
      digitalWrite(7, LOW);
    }
    if(data =='F') {
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, HIGH);
    }
    if(data =='H') {
      digitalWrite(4, HIGH);
      digitalWrite(5, LOW);
      digitalWrite(6, HIGH);
      digitalWrite(7, LOW);
    }
    if(data =='G') {
      digitalWrite(4, HIGH);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, HIGH);
    }
    if(data =='J') {
      digitalWrite(4, LOW);
      digitalWrite(5, HIGH);
      digitalWrite(6, HIGH);
      digitalWrite(7, LOW);
    }
    if(data =='I') {
      digitalWrite(4, LOW);
      digitalWrite(5, HIGH);
      digitalWrite(6, LOW);
      digitalWrite(7, HIGH);
    }
    if(data =='S') {
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
    }
  }
}

당연히 이건 앞선 코드들과는 달리 여러분들이 알맞게 조정해주셔야 합니다. 그리고, 위 코드에서 F, S, I, H... 이런 알파벳들의 의미는 어플을 실행하시고 설정에 들어가시면 자세히 알 수 있을 겁니다. 맛보기로 알려드리자면, F는 앞으로 가기(Front), S는 정지(Stop), L은 왼쪽으로 가기(Left) 등입니다.

재미있으셨나요? 저는 위 아두이노 코드들을 작성할 때 구글링과 관련 아두이노 책의 도움을 많이 받았습니다. 아두이노는 오픈 소스이기 때문에 코드를 마음껏 공유할 수 있다는 장점이 있죠. 그럼 여러분도 아두이노의 재미에 깊게 빠졌을 것이라 생각하면서, 이만 마치도록 하겠습니다.
건강하세요!

P.S. 혹시 제가 올린 내용 중 잘못된 점이 있다면 아낌없이 말씀해 주시길 부탁합니다!






댓글

이 블로그의 인기 게시물

개인정보처리방침

Flutter 화면 전환법

앱 출시는 어떤 과정으로 진행되는 것일까? (Android, iOS)