2014년 연말에 ‘라즈베리파이’라는 교육용 컴퓨터를 알게 되었습니다.
라즈베리파이를 가지고 구체화할 재료를 찾다 보니 레고가 눈에 띄더군요.
이후에 라즈베리파이와 레고를 결합한 작품을 만든 적이 있습니다.
나중에 라즈베리파이보다 더 간단한, ‘아두이노’라는 것을 알게 되었습니다.
라즈베리파이와 레고로 만든 작품
1. 입문: 기본 활용- 파워펑션 설명- 모터-배터리 홀더 연결 2. 실전: 배터리 대신 외부전원 사용하기- 아답터-적외선 수신기/모터 연결 3. 응용: 타이머 제작- 아두이노 소개 및 실습- 모터 드라이버 소개 및 실습- 모터-모터드라이버-아두이노-아답터 연결 및 실습
3. 응용: 타이머 제작
(1) 아두이노 소개 및 실습
라즈베리파이와 아두이노 둘 다 ‘코딩’을 통해 하드웨어와 소통할 수 있게 해 주는 도구입니다. 둘의 차이점이라면 아두이노는 기능이 제한적이지만 전원 올리자마자 바로 사용할 수 있고,
라즈베리파이는 다양한 기능을 가지고 있지만 부팅되는 데 시간이 필요합니다.
개발 방식도 다릅니다.
아두이노 개발 시에는 PC에서 코딩을 한 다음에 아두이노 보드로 실행 파일을 업로드합니다.
라즈베리파이는 그 자체가 PC입니다.
일반 PC와 똑같이 라즈베리파이에 키보드, 마우스, 모니터 등등을 연결하고, 그 안에서 코딩하고 실행을 하면 됩니다.
그 외 차이점은 다음과 같습니다.
* 이미지 출처: wiki* 2016년 9월, 2017년 10월, 2018년 9월 Google(영문으로 검색)/알라딘 검색 기준
아두이노(Arduino)는 이탈이아어로 ‘강력한 친구’라는 뜻으로,
전자공작을 쉽게 하기 위해 만들어진 간단한 초소형 컴퓨터 기판(마이크로컨트롤러)입니다.
미국 내에서 아두이노, 미국 외에서는 제누이노(Genuino) 브랜드를 사용합니다만, 국내에서는 그냥 아두이노로 통칭합니다.
아두이노는 ‘오픈소스 하드웨어’라고 하여, 하드웨어의 회로도까지 공개되어 있습니다.
따라서 정품이 아닌 아두이노 호환보드를 구매해서 사용해도 아무 문제 없습니다.
아두이노 우노 호환보드(+케이블)와 아두이노 우노 정품 가격 차이. 2019.01. 기준(출처 : http://www.devicemart.co.kr )
아두이노는 용도에 따라 입문자용, 고급자용, 소형용, 옷에 넣을 용도 등 많은 종류가 있습니다.
저는 입문자용인 ‘아두이노 우노’ 기준으로 다루려 합니다(저도 아직 이것밖에 안 써봤습니다).
아두이노와 연결할 주변장치는 크게 센서(Input)와 액츄에이터(Output)로 나뉩니다.
거리센서, 조도센서와 같은 입력부를 센서라 하고, LED, 모터와 같은 출력부를 액츄에이터라고 합니다.
* 아두이노 우노 R3 기준
앞서 말씀 드린 대로 아두이노는 간단한 구조인 대신 기능이 제한적입니다.
이를 보완하기 위해, 아두이노 위에 차곡차곡 쌓을 수 있는 ‘쉴드’라는 것을 사용할 수 있습니다.
아두이노 보드 외에 추가적인 기능이 필요하다면 쉴드를 사용하면 됩니다.
이제 실습에 들어가도록 하겠습니다.
준비물:
아두이노 호환보드아두이노-PC연결 케이블PC
아두이노 호환보드와 케이블. 케이블을 아두이노와 PC에 연결하면 됩니다.
실습:
1) 케이블을 아두이노 보드와 PC에 연결합니다.
2) 아두이노 홈페이지에서 개발도구 – 스케치를 다운로드 합니다.https://www.arduino.cc/ > SOFTWARE > DOWNLOADS저는 윈도우를 사용하기 때문에 ‘Windows Installer, for Windows XP and up’를 다운받았습니다.
3) 다운로드 받은 실행 파일을 더블클릭 하여 설치를 시작합니다.
한참 동안 설치, 허용 등등 하고 나면 모든 설치가 끝납니다.
4) 제어판 > 장치관리자에 아두이노가 추가된 것을 볼 수 있습니다.
COM7로 연결되었습니다.
5) 바탕화면에 추가된 ‘Arduino’ 아이콘을 실행합니다.
아두이노 코딩창(스케치라고 합니다)이 뜨면 정상입니다.
6) 간단한 예제를 실행하기 위해, 스케치에 내장된 기본 예제를 불러옵니다.
파일 > 예제 > 01.Basics > Blink 누르면 Blink(깜빡임) 예제를 불러오게 됩니다.
기본 예제 불러오기
아두이노 소스코드는 setup()과, loop() 두 가지 부분으로 구분됩니다.
Blink 실행 소스
// : 주석(Comment) 부분
프로그램을 설명하는 부분입니다.
메모하는 부분이라고 생각하면 됩니다. 별도 문법 없이 원하는 대로 적으면 됩니다.setup(): 처음 세팅하는 부분
- 중괄호 {}로 감싸는 부분을 '함수'라고 합니다.
그래서 이 부분은 'setup 함수'라고 합니다.
- BUILT-IN LED(아두이노에 있는 LED)를 출력용으로 세팅합니다.
- pinMode() 함수 안에는 핀 번호와 입력값으로 할지 출력값으로 할지를 정합니다.
예제는 출력 LED를 활용하려고 하기 때문에 OUTPUT이라는 값을 설정했습니다.
- 한 명령이 끝날 때에는 세미콜론(;)을 적습니다.
loop(): 프로그램 실행하는 부분
- BUILT-IN LED에 HIGH 신호를 주고(켜고), 1초 기다립니다.- BUILT-IN LED에 LOW 신호를 주고(끄고), 1초 기다립니다.
- digitalWrite() 는 디지털 값을 쓰는 함수입니다. 괄호 안에는 (핀 번호, 값)을 입력합니다.
- delay()는 아두이노 보드를 일정시간 멈추는 함수입니다. 괄호 안에는 밀리세컨드 단위의 숫자를 넣습니다.
- 아두이노에서 loop 함수는 중괄호 {} 내에서 같은 로직을 무한 반복하도록 되어 있습니다.
아두이노는 setup(초기 설정) -> loop(무한 반복) 순으로 프로그램이 실행됩니다.
7) 불러온 소스를 아두이노 보드로 집어넣는 작업을 해보겠습니다.
스케치 창에서 ‘확인’ 버튼을 누릅니다.
확인 클릭
확인 버튼을 누를 때 컴파일이라고 소스를 실행파일로 변환하는 과정을 진행합니다.
컴파일이 끝나면 ‘업로드’ 버튼을 눌러서 아두이노로 실행파일을 업로드를 합니다.
업로드 클릭
저는 에러가 났습니다.
업로드 시 문제 발생
문제 있는 경우 하단에 주황색으로 에러 메시지가 뜹니다.
창을 크게 띄워서 에러메시지의 처음부터 확인해 봅니다.
‘avrdude: ser_open(): can't open device "\\.\COM1" : 지정된파일을 찾을 수 없습니다.’라는 에러가 보이는군요. 인터넷 검색창에 에러 메시지 그대로 복사/붙여넣기 후 검색해 보니, 포트(Port: PC와 아두이노의 연결 통로) 세팅 문제라고 합니다.
맨 처음에 아두이노를 PC에 연결했을 때 장치관리자에서 아두이노가 ‘COM7’ 포트로 자동 세팅이 되었습니다.
그런데 스케치의 포트 세팅은 COM1로 되어 있어서 생긴 문제입니다.
이를 해결하려면, 스케치에서 툴 > 포트 > COM7로 변경하면 됩니다.
포트 변경
문제 발생 시에 이런 식으로 인터넷을 검색하면 같은 문제를 겪은 사람들이 해결한 내용을 찾을 수 있습니다.
8) 업로드가 성공적으로 이뤄지면, 아두이노 작동 테스트를 할 수 있습니다.
가운데 노란 불이 1초 주기로 깜빡이면 정상입니다.
소스 상의 delay(1000);을 delay(500);으로 변경한 후, 다시 컴파일>업로드를 거치면 0.5초 주기로 깜빡이는 것을 확인할 수 있습니다.
(2) 모터 드라이버 소개 및 실습
준비물:8883 파워펑션 M모터8886 혹은 8871 파워펑션 연장선AA배터리 4개AA 4구 배터리 홀더점퍼와이어(점퍼선) M-M 1개모터드라이버 L298N 모듈(-)자 드라이버
점퍼와이어는 전자공작에 사용되는 선을 이야기 합니다.
끝에 핀이 나와 있으면 M(Male) 타입, 끝에 핀을 꽂을 수 있도록 들어가 있으면 F(Female) 타입입니다.점퍼선의 타입별 형태는 M-M타입 / M-F타입 / F-F타입이 있습니다.
M-M타입 / M-F타입 / F-F타입 점퍼선
모터드라이버는 모터의 정역제어(정방향/역방향 변환)를 수월하게 해 주는 도구입니다.
모터의 회전방향을 바꾸려면 (+), (-) 전원을 모터 선에 바꿔가며 연결하던가,
파워펑션 컨트롤 스위치를 중간에 연결해 줘야 하는데요.
모터드라이버를 사용하면 코딩 작업을 통해서 정역제어를 해줄 수 있습니다.
L298N이라는 IC(Integrated Circuit: 집적회로)가 모터드라이버로 많이 사용됩니다.
L298N 사진 및 Pin Diagram. 출처: https://components101.com
L298N을 사용하기 간편하게 모듈화한 제품도 판매합니다.
본 실습에서는 이 모듈을 사용하려 합니다.
실습용 모터 드라이버 모듈은 모터 2개까지 제어할 수 있습니다.
모터 드라이버 모듈. 참고URL: http://neromart.co.kr/goods/view?no=11338
고급형 모터 드라이버 모듈은 정역제어 뿐만 아니라 속도 조절도 가능합니다.
속도 제어를 위해서는 PWM(Pulse Width Modulation, 펄스 폭 변조)이라는 개념이 사용됩니다.
PWM 신호. 출처: https://www.nightsea.com/articles/pwm-led-dimming/
모터에 입력되는 전압이 9V라고 하면,
주기적으로 모터에 공급되는 전원의 0V와 9V의 비율을 바꿔줌으로써 속도를 제어할 수 있습니다.
예를 들어, 0V:9V 비율이 100:0이면 정지, 50:50이면 천천히, 0:100이면 빨리 이런 식으로 모터 속도 제어를 할 수 있습니다.
이 때 짧은 시간 흐르는 전류를 Pulse라고 합니다.
9V 입력 비율은 Duty비(On Duty Ratio)라고 하며, 한 주기(T)에 대해서 Pulse가 On인 상태의 비율을 일컫습니다.PWM은 Pulse의 Duty비를 바꿈으로써 출력의 크기를 제어하는 것을 말합니다.
1) 연장선 네 가닥 중 양 끝은 잘라버리고, 가운데 두 가닥만 1.5cm 남긴 후 피복을 벗깁니다. 저는 적외선 수신기가 불량인 선을 잘라보니, 양 끝을 불량이지만 가운데 두 선은 살아있어서(통전테스트를 통과하여) 이를 사용했습니다.
2) 벗긴 선을 모터드라이버 모듈의 모터 M1 부분에 끼웁니다.
연장선의 가운데 두 가닥 사용
모터드라이버 모듈에 선을 끼울 때에는 (-)자 드라이버를 사용하여 나사를 푼 다음, 선을 집어넣고 다시 나사를 조여주면 됩니다.
3) AA 4구 배터리 홀더에 AA 배터리 4개를 넣고 모터드라이버 모듈에 연결합니다.
VMS에 (+) 선을, GND에 (-) 선을 연결해 줍니다.
모터드라이버-모터-배터리 연결. PINOUT: http://neromart.co.kr/goods/view?no=11338 참조
앞으로 상단 우측 그림을 가지고 설명을 진행하겠습니다.
모터드라이버를 작동시키기 위해서는 VDD/GND(+/-)에 전원이 공급되어야 하며,
모터를 작동시키기 위해서는 VMS/GND(+/-)에 전원이 공급되어야 합니다.
‘전원연결점퍼’는 VDD와 VMS를 서로 연결해 주는 역할을 합니다.
GND는 [그라운드]라고 읽는데요. Ground의 약자이며, 회로 기판에서 0V 부분을 이야기합니다.
건전지로 치면 (-)에 해당하는 부분입니다.
정상적으로 전원이 공급되면 상단 좌측 그림과 같이 전원 LED에 불이 켜지는 것을 볼 수 있습니다.
4) 점퍼와이어를 사용하여 모터 작동 테스트를 합니다.
점퍼와이어 한쪽 선을 VDD 단자에 연결한 후,
점퍼와이어를 VDD 단자에 연결
다른 한 선을 모터 M1 제어핀의 ‘PWMA’ 단자에 연결합니다.
모터 작동 확인이 되면, 모터 M1 제어핀의 ‘PWMA’와 ‘DIRA’에 모두 연결을 해서 모터 회전이 반대로 되는지 점검합니다.
모터 동작 테스트: 모터 회전방향과 상태 LED가 바뀜
테스트 동영상입니다.
https://youtu.be/Krjn3X2gdqc
모터 드라이버 모듈 클로즈업
‘PWMA’, ‘DIRA’는 각각 ‘A모터의 PWM’, ‘A모터의 회전방향’을 뜻합니다.
PWMA에 계속해서 6V를 공급하기 때문에 모터가 회전할 수 있고,
DIRA에는 0V 혹은 6V를 변환하여 공급함에 따라 정역제어가 가능한 것입니다.
이상으로 확인한 모터드라이버의 제어 핀 정보는 다음과 같습니다.
출처 : http://neromart.co.kr/goods/view?no=11338
이를 이용하여, 아두이노를 통해서는 PWMA에 인가하는 신호의 세기를 조절하여 속도를 제어합니다.
DIRA에 인가하는 신호는 0 혹은 1로 전달함으로써 회전 방향을 조절하면 됩니다.
(3) 모터-모터드라이버-아두이노-아답터 연결 및 실습
아두이노와 모터드라이버 모두 점검을 마쳤다면, 이를 모두 연결하여 작동 테스트를 해 보겠습니다.
준비물: 아두이노 호환보드아두이노-PC연결 케이블PC8883 파워펑션 M모터8886 혹은 8871 파워펑션 연장선AA배터리 4개AA 4구 배터리 홀더모터드라이버 L298N 모듈(-)자 드라이버점퍼와이어(점퍼선) M-F 2개점퍼와이어(점퍼선) M-M 2개(적/흑)
실습 1: 1) 다음과 같이 전체 회로를 연결합니다.
회로 연결 사진
회로도
모터드라이버 모듈 테스트할 때에는 편의를 위해 전원연결점퍼를 꽂은 채로 테스트 했는데요.
이렇게 연결된 채로 있으면 배터리홀더에 있는 배터리 통해서 모터 드라이버에 계속 전원 공급이 됩니다.
(배터리가 방전됩니다.)
이를 방지하기 위해, 전원연결점퍼를 빼고
점퍼와이어 M-M 2개(적/흑)를 활용하여 모터드라이버 모듈의 VDD/GND에 아두이노의 5V/GND를 연결합니다. 점퍼와이어 M-F 1개는 아두이노의 9번 핀과 모터드라이버 모듈의 PWMA에 연결합니다.
2) 다음과 같이 아두이노 소스를 작성합니다.
void setup() { pinMode(9, OUTPUT); // 9번핀을 출력모드로 설정한다.}
void loop() { digitalWrite(9, HIGH); // Motor 움직이게 하기 delay(2000); // 2초 유지 digitalWrite(9, LOW); // Motor 정지 delay(2000); // 2초 유지}
3) 해당 소스를 다 작성했으면 컴파일 및 업로드를 하여 작동 테스트를 합니다.2초 동안 모터가 회전하고 2초 동안 정지하는 행동이 반복되면 정상입니다.
실습 2:
1) 점퍼와이어 M-F 1개를 더 꺼내어 회로를 구성합니다.추가 점퍼와이어 M-F 1개를 아두이노의 7번 핀-모터드라이버 모듈의 DIRA와 연결합니다.
2) 다음과 같이 아두이노 소스를 작성합니다.2초동안 회전-2초동안 반대로 천천히 회전-2초 정지 이렇게 무한 반복하는 소스입니다.
void setup() { pinMode(9, OUTPUT); // 9번핀을 출력모드로 설정한다.
pinMode(7, OUTPUT); // 7번핀을 출력모드로 설정한다.
}
void loop() {
analogWrite(9, 255); // Motor 빠르게 하기
digitalWrite(7, HIGH); // Motor 정방향
delay(2000); // 2초 유지
analogWrite(9, 128); // Motor 천천히
digitalWrite(7, LOW); // Motor 역방향
analogWrite(9, 0); // Motor 정지
아두이노의 9번 핀을 보면, ~9라고 숫자 앞에 물결 표시가 있습니다.
물결 표시가 있는 핀은 디지털 출력이 아닌(ON/OFF가 아닌) 아날로그 출력이 가능합니다(다양한 값 출력 가능).
이전 실습에서 9번 핀에 digitalWrite()를 사용해서 ON/OFF(GO/STOP)를 제어했다면,
이번에는 analogWrite()를 사용함으로써 속도 제어를 할 수 있게 하였습니다.
analogWrite() 내의 숫자는 0~255까지 입력 가능합니다. 0이 정지, 255가 최대 속도입니다. 7번 핀은 방향 제어용으로써, HIGH, LOW를 지정함에 따라 방향 전환을 할 수 있습니다.
3) 소스가 완성되었으면 컴파일 및 업로드하여 테스트를 진행합니다.
모터 회전 방향에 따른 모터 LED 변화
작동 동영상입니다.https://youtu.be/Lcxjsub5dhE
소스 안의 회전 방향과 회전 속도를 변경해 가며 실습해 보시기 바랍니다.
장기간 전시를 해야 하는 경우, VMS에 안정적인 전원 공급을 위해 아답터를 사용하면 됩니다.
이전 강좌에서 말씀 드린 대로 아답터의 (+), (-)를 확인한 후 배터리 홀더 연결부에 아답터를 연결합니다.
(모터 쉴드를 사용한 실습도 해보려 했으나, 해외 배송이라 시간이 걸립니다. 물건 받으면 실습해 보고 내용 추가하겠습니다.)
//START. 20190212. 내용 추가. 모터 쉴드 내용 추가합니다.
(4) 모터-모터 쉴드-아두이노 연결 및 실습
모터 쉴드를 사용한 실습을 해보기로 하겠습니다.
모터 쉴드
(9V 아답터)
- 이전까지 사용했으나 이번 실습에 필요 없는 준비물은 취소선으로 표시했습니다.
이전까지의 실습에서는 모터를 작동시키기 위해서 '모터 드라이버 모듈'을 사용했는데요.
같은 기능을 하면서 아두이노 위에 꽂을 수 있는 '모터 쉴드'를 활용해 보겠습니다.
모터 쉴드 사진
출처 : http://www.icbanq.com/P005604606
1) 모터 쉴드를 아두이노 보드 위에 쌓아 올립니다.
아두이노와 결합한 모터 쉴드
2) 회로를 구성합니다.
PC-아두이노-모터 쉴드-모터를 다음과 같이 연결합니다.
아두이노-모터 쉴드-모터 연결한 회로
3) 보드 사양을 확인합니다.
보드 사양 정보
출처: https://www.dfrobot.com/wiki/index.php/Arduino_Motor_Shield_(L293)_(SKU:_DRI0001)
이 보드는 핀 4, 5, 6, 7만 사용하게 되어 있네요.
사양 정보를 비교해 보면, 제가 Motor1에 연결을 했으니 6, 7 핀을 사용해야 할텐데..
막상 테스트 해보니 Motor2용 핀인 4, 5를 사용해야 되더군요.
4) 그래서 다음과 같이 소스를 작성했습니다.
void setup() {
pinMode(5, OUTPUT); // 5번핀을 출력모드로 설정한다(PWM).
pinMode(4, OUTPUT); // 4번핀을 출력모드로 설정한다(DIR).
analogWrite(5, 255); // Motor 빠르게 하기
digitalWrite(4, HIGH); // Motor 정방향
analogWrite(5, 128); // Motor 천천히
digitalWrite(4, LOW); // Motor 역방향
analogWrite(5, 0); // Motor 정지
작동 동영상입니다.
https://youtu.be/7dojzCknZWo
테스트한 쉴드로는 모터가 천천히 회전합니다.
이는 PC의 USB 전원이 5V라서 그렇습니다.
빠르게 동작시키기 위해서는 9V 아답터를 아두이노 보드에 꽂으면 됩니다.
//END. 20190212. 내용 추가.
모터의 지나친 동작을 막기 위해서는 정지 시간을 늘이면 됩니다.
이렇게 하면 레고 타이머가 완성됩니다.
이상으로 아두이노를 활용하여 레고 모터를 작동시키는 법을 배웠는데요.제가 소개해 드린 부분은 아두이노의 맛배기 정도만 됩니다.
아두이노에 대한 다른 활용법은 시중에 출판된 책을 참고하시기 바랍니다.
이 때 필요한 전자부품을 ‘아두이노 스타터 키트’라고 여러 부품을 묶어서 파는 세트가 있으니, 같이 구매하시는 것을 추천합니다.
* 다른 이야기
저는 국민학교 세대인데요.
국민학교 다닐 때 라디오 키트 만들어 보려고 110V 납땜 인두를 구입하여 라디오를 조립한 적이 있습니다.
과학자, 공학자 외에는 다른 장래희망을 생각해 본 적이 없었기에 대학 진학 시 ‘전기공학’을 전공으로 선택하였습니다.
하지만 제가 선택한 전공임에도 불구하고 전공 공부에 어려움을 느꼈고 지금 기억 나는 게 거의 없습니다.
(지금은 Software Engineer로서 일을 하고 있습니다.)
얼마 전 대학 과 동기들이랑 저녁 식사를 같이 한 적이 있습니다.
저 포함해서 세 명이 모였는데, 세 명 모두 전공과 다른 일을 하고 있습니다.
이야기를 나누다 보니 한 친구가 작은 ‘허들’을 넘지 못하다 보니 전공에 흥미를 잃었던 게 아닐까 한다는 이야기를 했습니다.
전공수업 커리큘럼이 상당히 높은 ‘허들’을 요구하였기에 그를 넘지 못해 학창시절에 많이 힘들었다는 이야기를 하는데 어찌나 공감이 되던지요.
커리큘럼 상의 허들 이야기를 하긴 했지만, 개인적으로도 많이 아쉬운 부분이 남아 있습니다.
부끄럽게도 실습실에서만 납땜 인두를 사용했지, 대학 시절 내내 납땜 인두를 구입한 적이 없습니다.
오히려 대학교 졸업한지 10여 년이 지나서 본격적으로 개인 작업을 시작하면서 납땜 인두를 새로 구입했습니다.
제가 많은 어려움을 느껴 보기도 했고, 뒤늦게 깨달은 바도 있기에 최대한 쉽게 설명하면서 도와드리려고 했는데요.
추가 설명이 필요한 부분 있으면 언제든지 말씀 부탁 드립니다.
여러분도 전자공작 활용하여 재미 있는 레고 생활 하셨으면 좋겠습니다.
감사합니다.