[아두이노] 블루투스 모듈(HC-06) 사용하기 (설정, 문자열 전송, LED ON/OFF)

아두이노에 블루투스 모듈을 추가하면 시리얼통신을 이용하여 데이터 값을 받거나 보낼 수 있다. 블루투스는 10미터 정도에서 무선으로 데이터를 보내거나 받을 수 있으므로 이를 활용하면 릴레이, 모터, 전등 등을 동작시켜 무선으로 기기를 제어하는 것이 가능하게 된다. 예를 들어 블루투스 기능이 있는 스마트폰, 노트북 등으로 아두이노에 연결된 블루투스 모듈로 신호를 보내 침대에 누워서도 집안의 전등을 무선으로 끄고 켤 수 있게 할 수 있다. 단, 통신거리 10M 정도라는 제한이 있으므로 멀리 떨어지면 블루투스 모듈과의 연결이 끊겨 작동이 되지 않을 수도 있다.

아두이노를 위한 블루투스 모듈은 여러가지가 있지만 가장 싼 값에 사용할 수 있는 것이 HC-06이라고 불리는 모듈이다. 국내에서도 1만원 이하로 다양한 제품을 구할 수 있으며 성능도 좋아서 가장 많이 사용하고 있다.

HC-06 블루투스 모듈의 모습

HC-06 블루투스 모듈의 핀이다. 총 4개의 핀이 있으며 위에서부터 신호를 받기위한 핀인 RX 핀, 신호를 전송하기 위한 TX핀, GND(Ground), VCC 핀이 있다. 모듈의 전원은 3.6V ~ 6V 사이에서 동작하므로 VCC핀은 아두이노의 5V 단자에 연결하면 된다. 모듈에 따라 3.3V에서 동작하는 모듈도 있으므로 규격을 꼭 확인하여 전원을 연결해야 한다.

아두이노와 연결된 모습이다. 처음 연결하면 블루투스 모듈의 LED가 깜빡인다.(페어링 되지 않음 표시) 하지만 스마트폰이나 노트북과 블루투스 페어링이 되면 깜빡이지 않게 되고 계속 켜져 있는 상태가 된다. 아두이노와의 연결은 다음과 같이 연결을 하였다.

RXD ———————- D3

TXD ———————- D2

GND ——————— GND

VCC ——————— 5V

해도 되고 안해도 되지만 먼저 블루투스 모듈의 이름과 페어링 암호(PIN)를 바꿔 주었다. 기본값은 이름이 ‘HC-06’ 이고 페어링 PIN은  ‘1234’ 이다. 이를 ‘DENEB’ 와 ‘2016’ 으로 바꾸어 주었다. 혹시 모르지만 다른 사람이 내 장치를 가로챌 수 있으므로 바꾸어 주는 것이 좋다. 바꾸는 방법은 다음과 같다.

블루투스 모듈 이름 및 PIN 의 변경

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <SoftwareSerial.h> //시리얼통신 라이브러리 호출
int blueTx=2;   //Tx (보내는핀 설정)at
int blueRx=3;   //Rx (받는핀 설정)
SoftwareSerial mySerial(blueTx, blueRx);  //시리얼 통신을 위한 객체선언
void setup()
{
  Serial.begin(9600);   //시리얼모니터
  mySerial.begin(9600); //블루투스 시리얼
}
void loop()
{
  if (mySerial.available()) {
    Serial.write(mySerial.read());  //블루투스측 내용을 시리얼모니터에 출력
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());  //시리얼 모니터 내용을 블루추스 측에 WRITE
  }
}
cs

위의 소스코드를 입력하고 아두이노에 업로드 해 주고 아두이노 IDE의 시리얼 모니터를 연다.

먼저  시리얼 모니터 입력창에 ‘AT’ 라고 입력하고 전송 버튼을 누른다. ‘OK’ 라는 블루투스 모듈로 부터의 답변이 온다. 이는 블루투스 모듈과의 통신이 정상적으로 되었다는 의미이다.

AT를 입력하여 OK를 받았으면 블루투스 모듈의 이름을 변경하기 위하여 ‘AT+NAME원하는이름’  을 입력하고 전송버튼을 클릭하면 ‘OKsetname’ 라는 메시지를 블루투스 측에서 보내주며 이름이 정상적으로 변경이 된다.

블루투스 페어링 암호인 PIN의 변경은 ‘AT+PIN원하는숫자‘ 를 입력하고 전송 버튼을 클릭하면 ‘OKsetPIN’ 이라는 메시지와 함께 PIN이 정상적으로 변경되었음을 알려준다.

이제 스마트폰, 노트북 등에서 HC-06이 아닌 자신이 설정한 이름과 PIN으로 블루투스 모듈과의 페어링이 이루어지게 되는 것이다.

아래는 나의 스마트폰과 블루투스 모듈과의 페어링하는 모습이다. 기기에 따라 다르겠지만 일반적으로 기기의 블루투스 설정메뉴에 들어가서 기기검색을 한 후 선택하면 PIN 을 요구하는데 이때 설정한 PIN 을 입력하면 된다.

이로써 블루투스 모듈의 이름과 PIN 을 변경완료 하였다.

이제 블루투스 모듈의 설정과 스마트폰과의 페어링이 끝났으므로 시리얼 통신을 통하여 문자열을 전송해 보겠다.

스마트폰과 블루투스 모듈과의 통신을 통한 문자열 전송

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
#include <SoftwareSerial.h> //시리얼 통신 라이브러리 호출
int blueTx=2;   //Tx (보내는핀 설정)
int blueRx=3;   //Rx (받는핀 설정)
SoftwareSerial mySerial(blueTx, blueRx);  //시리얼 통신을 위한 객체선언
String myString=””; //받는 문자열
void setup() {
  Serial.begin(9600);   //시리얼모니터
  mySerial.begin(9600); //블루투스 시리얼 개방
}
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 변수값 초기화
  }
}
cs

위의 소스는 페어링된 스마트폰에서 문자열을 보내면 아두이노 시리얼모니터에서 그 내용을 표시해 주는 소스이다. 이를 테스트 하려면 안드로이드폰 기준으로 구글스토어에서 앱을 하나 다운로드 받아야 한다. ‘bluetooth serial controller’ 라고 검색하면 맨위에 뜨는 앱을 설치하면 된다.

앱을 설치 후 실행하면 위와 같은 화면이 나온다. ‘CONNECT’ 를 눌러서 블루투스 모듈과 연결을 한다. 페어링 요청이 올 경우 PIN을 입력하면 된다. 블루투스 모듈과의 연결이 완료되면 위와 같이 ‘connected to 블루투스명‘ 이라고 블루투스 모듈과의 연결이 되었음을 알 수 있다. 연결이 되면 블루투스 모듈의 깜빡이던 LED가 연결이 되었음을 뜻하는 계속켜짐 상태가 된다.

이 상태에서 아두이노의 시리얼모니터를 열고 앱의 아래쪽에 있는 입력창에 아무 문구나 입력하고 Send 버튼을 눌러본다. 아래와 같이 무선으로 문자열이 블루투스 모듈을 통해 아두이노의 시리얼 모니터에 표시되는 것을 볼 수 있다.

여기에서 조금 더 응용하여 아두이노에 연결된 LED를 ON 또는 OFF  할 수도 있다. 이 의미는 무선으로 LED 뿐만 아니라 모터, 릴레이 등의 제어도 가능하므로 응용한다면 다양한 기능의 장치를 만들 수도 있는 것이다.

블루투스 모듈을 이용하여 LED 켜고 끄기

먼저 위의 블루투스 모듈과 아두이노의 연결에서 추가로 LED 를 13번 PIN 에 직접 꼽아 주었다.

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
#include <SoftwareSerial.h> //시리얼 통신 라이브러리 호출
int blueTx=2;   //Tx (보내는핀 설정)
int blueRx=3;   //Rx (받는핀 설정)
SoftwareSerial mySerial(blueTx, blueRx);  //시리얼 통신을 위한 객체선언
String myString=””; //받는 문자열
void setup() {
  Serial.begin(9600);   //시리얼모니터
  mySerial.begin(9600); //블루투스 시리얼 개방
  pinMode(13, OUTPUT);  //Pin 13을 OUTPUT으로 설정 (LED ON/OFF)
}
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==”on”)  //myString 값이 ‘on’ 이라면
      {
        digitalWrite(13, HIGH); //LED ON
      } else {
        digitalWrite(13, LOW);  //LED OFF
      }
    myString=””;  //myString 변수값 초기화
  }
}
cs
소스는 위의 문자열 전송 소스에서 LED 부분만 추가하여 코딩하였다. ‘on’ 이라는 문자열이 아두이노로 전송되어 온다면 13번 핀에 연결된 LED 가 켜지는 것이다. 테스트를 쉽게 하기 위하여 bluetooth serial controller 앱의 버튼을 미리 정의해 준다면 쉽게 문자열 입력이 아닌 버튼 클릭으로 LED를 켜고 끌 수가 있다. 앱을 실행하고 preference 를 눌러서 들어가면 된다.

스마트폰으로 아두이노에 연결된 LED 를 켜고 끄는 모습

이상으로 블루투스 모듈 HC-06를 아두이노와 연결하여 활용하는 방법을 알아보았다. 여기에 사용된 라이브러리인 SoftwareSerial 라이브러리에 대해서 더 알고 싶은 사람은 다음의 URL을 들어가보면 더욱 많은 함수들의 사용법을 알 수 있을 것이다.

https://www.arduino.cc/en/Reference/SoftwareSerial

출처: http://deneb21.tistory.com/267 [Do It Yourself!]

우분투에서 프로그램 설치하고 삭제하기!!

처음 우분투(Ubuntu)란 운영체제(Operating System, OS)를 접하는 분들은 당황스러운 부분이 많을 것입니다.
그동안 우리에게 너무 익숙했던 윈도우(Windows)에서는 원하는 프로그램을 설치하기 위해선 해당 웹페이지에서 설치파일(Setup.exe, Install.exe, .msi 등)을 다운받거나 CD 등을 이용해 설치하면 됐었기 때문이죠.우분투에서도 생각보다 어렵지 않습니다!!
안드로이드폰(Android phone)을 사용하시는 분들이 있다면, ‘우분투 소프트웨어 센터’를 이용하는 것은 마치 ‘Play 스토어 (안드로이드 마켓)’을 이용하는 것과 다르지 않습니다.
또한 윈도우에서 ‘exe’ 혹은 ‘msi’ 파일을 실행했다면, 안드로이드에서 ‘apk’ 파일을 실행하는 것과 우분투에서 ‘deb’ 파일을 실행하는 것은 다르지 않죠.자, 그럼 이번 글에서는 우분투에서 프로그램을 설치하는 다양한 방법들에 대해 알아보도록 하겠습니다!!

1. 우분투 소프트웨어 센터

가장 쉽고, 가장 안전하고, 가장 정확하며, 가장 추천하는 방법입니다!
현재 우분투와 우분투 기반의 민트가 가장 인기있는 배포판이기 때문에 리눅스에서 실행할 수 있는 거의 모든 프로그램들 중에 신뢰할 수 있고 유용한 프로그램들은 ‘우분투 소프트웨어 센터 (Ubuntu Software Center)’에서 설치할 수 있습니다.

위에서 설명했듯이 우분투 소프트웨어 센터를 이용하는 것은 안드로이드의 ‘플레이 스토어’를 이용하는 것과 같다고 생각하면 되죠.
오히려 그 등록절차가 안드로이드보다 까다롭기 때문에 더더욱 신뢰할 수 있다고 보면 됩니다.

또한 우분투의 버전에 따라 제공되는 프로그램들이 다르기 때문에 설치시 거의 제대로 작동합니다. (http://deviantcj.tistory.com/385)

프로그램 설치방법

런처(Launcher)나 대시(Dash)에서 ‘우분투 소프트웨어 센터’를 실행합니다.

위와 같이 표시되는데, 상단의 검색창을 통해 원하는 프로그램을 검색하거나, 좌측의 카테고리를 통해 찾아 볼 수 있습니다.

원하는 프로그램을 선택한 후 ‘설치’ 버튼을 누르면 설치됩니다.

프로그램 삭제방법

이미 설치한 프로그램은 위와 같이 ‘제거’ 버튼으로 바뀝니다.
‘제거’ 버튼을 누르면 제거됩니다.

2. PPA 이용하기

PPA는 ‘Personal Package Archives (개인 패키지 보관소)’의 약자로 개인, 혹은 단체, 프로그램팀, 기업 등의 패키지 보관소입니다.

아무래도 우분투에서 직접 제공하는 것이 아니기 때문에 무조건 신뢰할 수 없고, 일부 PC나 버전에선 제대로 작동하지 않을 수도 있습니다. 때문에 신뢰할 수 있고 확실한 ppa를 등록하여 프로그램을 설치해야 합니다.

프로그램 설치방법

보통 PPA를 통해 프로그램을 설치하는 방법은 아래의 명령어 형식으로 터미널에 입력하면 됩니다.

$ sudo add-apt-repository ppa:저장소명
$ sudo apt-get update
$ sudo apt-get install 패키지명

‘sudo’란 시스템관리자의 권한으로 명령어를 실행하란 명령어입니다.
‘add-apt-repository’는 저장소를 추가한다는 명령어입니다.
‘apt-get update’는 저장소 정보를 업데이트하라는 명령어입니다.
‘apt-get install 패키지명’은 해당 패키지를 설치하라는 명령어입니다.

프로그램 삭제방법

PPA를 통해 설치된 프로그램을 쉽게 지우기 위해선 ‘ppa-purge(http://deviantcj.tistory.com/445)’란 패키지를 이용하면 됩니다.

ppa-purge가 설치되어 있지 않다면, 터미널에서 아래의 명령어를 입력합니다.

$ sudo apt-get install ppa-purge

그 후, 아래의 형식으로 명령어를 입력합니다.

$ sudo ppa-purge ppa:저장소명

3. deb 파일 설치하기

deb 파일이란 우분투의 exe파일이라고 생각하면 됩니다.

실은 이 deb 파일은 우분투를 위해 만들어진 것이 아닙니다.
우분투는 ‘데비안(Debian, 리눅스 계보도)’을 기반으로 만들어진 배포판인데, 바로 이 데비안 계열의 리눅스에서 프로그램을 설치할 수 있는 파일 포맷입니다.

deb 파일을 설치할 때 주의해야 할 점은 자신의 시스템에 맞는 파일을 다운받아 설치해야 한다는 것이죠.

보통 리눅스용 설치파일을 제공하는 경우 우분투는 거의 다 지원합니다.

프로그램 설치방법

.deb 파일을 더블클릭하면 우분투 소프트웨어 센터가 실행되면서 설치할 수 있는 경우도 있지만, 대부분의 경우에는 터미널에서 명령어를 통해 설치하는 것이 확실합니다.

우선 .deb 파일을 ‘다운받은 경로(보통 ‘~/다운로드’)’로 이동해서 아래의 명령어를 입력하면 됩니다.

$ sudo dpkg -i 패키지명.deb

예) ‘구글 크롬 브라우저 (Google Chrome Browser)’

$ sudo dpkg -i google-chrome-stable_current_amd64.deb

제가 다운 받은 파일이 ‘google-chrome-stable_current_amd64.deb’ 파일이었기 때문에 위와 같이 입력했습니다.
또한 제 시스템은 64비트 우분투이기 때문에 뒤에 amd64로 끝납니다. 이 부분은 시스템에 따라 다를 수 있습니다.

프로그램 삭제방법

삭제하기 위해선 별도의 파일없이 패키지명을 입력하는 것으로 충분합니다.

$ sudo dpkg -r 패키지명

예) ‘구글 크롬 브라우저’

$ sudo dpkg -r google-chrome-stable

패키지명이 잘 기억나지 않을 경우 앞부분만 정확히 입력하고 키보드의 ‘Tab(탭)’키를 누르면 자동완성이 됩니다.
단, 비슷한 이름의 패키지가 여러가지가 있으면 전체 항목이 표시되니 어느정도 입력하고 ‘탭’키를 활용하면 편리합니다.

4. tar.gz 파일 설치하기

거의 최악의 경우입니다.
‘.tar.gz’란 포맷은 굳이 윈도우에 비교하자면 ‘zip’ 포맷과 같다고 생각하면 됩니다.
바로 압축되어 있는 파일인거죠.

일부는 압축을 풀어서 바로 실행할 수 있는 경우도 있지만, 대부분의 경우는 직접 컴파일(Compile)해서 이용해야 합니다.

제 경우는 ‘.tar.gz’ 파일만 제공되는 경우 아예 설치를 하지 않습니다. 차라리 다른 방식의 설치방법을 찾아보는 것이 편리하거든요. 또한 대부분의 프로그램은 우분투에서 쉽게 설치할 수 있는 형태로 제공하기도 하고요.

굳이 ‘.tar.gz’로 제공되는 프로그램을 설치하려는 분은 아래의 링크를 참고해주세요.

https://help.ubuntu.com/community/CompilingEasyHowTo

5. rpm 파일 설치하기

‘리눅스 계보도(http://deviantcj.tistory.com/209)’를 보면 알 수 있듯이 리눅스는 크게 ‘데비안(Debian)’, ‘레드햇(Redhat)’, ‘슬랙웨어(Slackware)’ 계열로 나뉩니다.

우분투는 데비안 계열이지만, 인기있는 배포판 중의 하나인 페도라(Fedora)의 경우는 레드햇 계열이죠.

데비안에 deb 파일이 있다면, 레드햇 계열에 있는 것이 바로 rpm 파일입니다.
바로 레드햇 계열 리눅스의 설치파일이죠.

하지만 같은 리눅스이기 때문에 rpm파일을 직접 설치하거나, deb파일로 변환 할 수 있습니다.
물론 이 경우에도 의존성 문제가 생기기 때문에 제대로 작동한다는 보장은 없습니다.

위의 이미지에서 우측이 원본 rpm 파일, 좌측이 변환한 deb 파일입니다.

프로그램 설치방법

우선 rpm파일을 설치하거나 변환하기 위해선 ‘alien’이란 패키지를 설치해야 합니다.

터미널을 열고 아래의 명령어를 입력하여 ‘alien’ 패키지를 설치합니다.

$ sudo apt-get install alien

그 후, 바로 설치하려면 아래의 명령어를 입력하면 됩니다.

$ sudo alien -i 패키지명.rpm

만약 deb 파일로 변환하려면 다음 명령어를 입력하면 됩니다.

$ sudo alien 패키지명.rpm
혹은,
$ sudo alien -d 패키지명.rpm

변환된 deb 파일의 설치방법은 위의 ‘3. deb 파일 설치하기’와 같습니다.

프로그램 삭제방법

삭제방법 또한 바로 설치했든, 변환하여 설치했든 위의 ‘3. deb 파일 설치하기’와 같습니다.

출처: http://deviantcj.tistory.com/444 [궁시렁궁시렁 IT이야기들]

아두이노 우노 R3 개요 및 기능 설명

아두이노 우노 R3 개요 및 기능 설명

아두이노

 

2015.05.21 09:50

아두이노 우노(uno) R3는 ATmega328P 라는 AVR 8-bit 마이크로콘트롤러를 사용한다. PC와 USB로 연결할 수 있으며 이것으로 프로그램 다운로드 및 시리얼 통신에 사용된다.

전원 연결

아두이노 우노보드는 내부적으로 5V로 동작한다. 전원은 다음과 같이 두 가지 방법 중 한 가지로 인가하면 된다.

  1. USB로부터 5V 전원을 공급받아서 동작할 수 있다. 따라서 이 보드를 PC와 USB로 연결하면 일단 기본적인 하드웨어 세팅은 끝난 것이다.
  2. 외부 전원을 연결하는 단자가 있는데 이것으로 7~12V 사이의 전원을 인가하면 되며 9V가 권장 전압이다. 일반적인 AA 혹은 AAA 사이즈의 1.5V건전지를 6개를 직렬 연결하거나 1.2V 충전지를 사용해도 된다. 물론 AC어댑터도 전압 범위가 맞으면 사용 가능하다.

만약 USB와 전원 소켓에 둘 다 연결되어 있다면 소켓에서 공급되는 전원을 자동으로 사용하게 된다.

 

디지털 입출력 핀 14개 (0번~13번 핀)

디지털(digital) 입출력 핀들을 이용해서 외부의 이진 신호를 읽어들어나 또는 이진 신호를 내보낼 수 있다. 이진 신호란 on/off 와 같이 상태값이 두 가지만을 가지는 신호라는 의미이다. 이 디지털 핀을 이용해서 LED를 켜고/끄거나 외부의 스위치가 눌려져 있는지 아닌지 등을 검출할 수 있다. 구체적으로 0V 와 5V 두 전압중 하나의 값을 가지며 이것은 프로그램으로 제어할 수 있다.

디지털 입출력으로 사용되면서 또한 부가적인 기능을 가지는 핀들은 다음과 같다.

  • 0번과 1번 핀은 시리얼 통신에 사용된다. USB로 PC와 통신을 할 수 있다.
  • 2번과 3번 핀은 인터럽트 기능을 갖는다.
  • 3, 5, 6, 9, 10, 11번 핀은 PWM 기능을 가지며 아날로그 출력을 흉내낼 수 있다.

아날로그 입력 핀 6개 (A0~A5)

아날로그 입력 핀이란 외부의 아날로그 입력값을 읽어들이는 핀으로서 주로 센서(sensor)와 연결하여 사용된다. 아날로그(analog)신호는 디지털 신호와는 달리 연속값을 의미하면 예를 들어서 온도, 빛의 세기 등이 있다. 이러한 물리량을 센서가 전기 신호로 변환하며 이것을 이 아날로그 핀으로 읽어들일 수 있다. 센서를 통해 읽은 전압값은 0에서 1023 사이의 숫자로 변환된다. 기준 전압은 5V 이지만 1.1V의 내부 전압이 사용될 수 있으며 AREF핀으로 기준 전압을 직접 인가할 수도 있다.

그리고 아날로그 핀은 디지털 입/출력 핀으로도 사용할 수 있다.

아날로그 출력핀 6개 (3,5,6,9,10,11번핀)

디지털 출력핀이 0V/5V 두 가지 값만을 가질수 있는데 비해서 아날로그 출력핀은 0V~5V사이의 전압 값(256단계)을 가질 수 있다. 엄밀히 얘기하면 PWM방식으로 동작하므로 순수 아날로그 방식은 아니다.

인터럽트 (2, 3번 핀)

2번핀과 3번핀은 인터럽트(interrupt) 기능을 가진다. 인터럽트 처리(interrupt handling)라는 것은 이벤트를 처리하는 데 사용되는 기능으로서 특정한 신호가 발생했을 때 정해진 동작을 수행하여야 하는 경우 사용되는 방식이다. 예를 들어서 버튼이 눌려진 시점에서 (또는 떼어진 시점에서) 어떤 작업을 수행해야 하는 경우다.

그 외의 기능들

아두이노 우노 보드는 3.3V의 전압도 공급할 수 있다. 이는 USB만 연결한 경우도 마찬가지이다. AREF 핀은 아날로그 핀의 기준 전압을 설정하는 용도로 사용된다.

다른 기기와의 통신 기능은 다음과 같다.

  • 시리얼 통신 : 0번, 1번 핀
  • SPI 통신 : ICSP 헤더핀
  • TWI (I2C) 통신 : A0, A1 핀

시리얼 통신 방식 외에는 일반적으로 사용 빈도가 낮지만 기기간 통신이나 일대다 통신을 하는 경우 SPI, TWI 통신이 널리 사용된다.

아두이노 강좌 전체 목록 (TOP) >>>

C++ 언어 전체 강좌 목록 >>>

c{ard},n{ad04}

출처: http://studymake.tistory.com/153 [스터디메이크]

 

모터 드라이버란?

모터 드라이버란?

일반적인 모터(DC 모터)는 전원이 연결되면 한쪽으로 회전하는 제품입니다.

핀이 2개밖에 없으므로 모터를 제어할 수 있는 핀이 존재하지 않습니다. 

그래서 Software 적으로는 제어가 불가능합니다.

즉, 반대 방향으로 돌리려면 Hardware 적으로 모터의 입력 전원을 반전 시켜주어야 합니다.

이렇게 모터 회전의 순방향과 역방향을 제어하는 것을 ‘정역 제어’ 라고 합니다.

전자적으로 정역 제어를 하기 위해선 회로를 구성하여야 합니다.

 

위의 회로는 정역 제어 회로로 모양이 알파벳 H 모양과 비슷하다고 해서 H – Bridge 회로라고도 불립니다.

S1 과 S4가 닫힘으로 써 모터의 왼쪽이 + , 오른쪽이- 가 되며

​S2와 S3이 닫힘으로 써 왼쪽이 – , 오른쪽이 + 가 됩니다.

정역 제어 회로를 사용하면 모터의 회전 방향을 제어뿐만 아니라 모터의 ON / OFF 제어도 할 수 있습니다.

이를 응용하여 쉽게 모터 제어할 수 있도록 한 것이 모터 드라이버 입니다.

모터에 대해 알아보자

모터는 모션을 직접 만들 수 있는 하드웨어, 형태, 성능, 기능에 따라 매우 다양한 종류가 존재합니다.

엘리베이터, 공장, 로봇, 자동차 등등 주위에도 많은 곳에 사용되고 있습니다.

주로 전기적 에너지를 기계적 에너지로 바꾸는데 사용합니다.

하지만 모든 모터가 똑같은 모터 드라이버를 사용할 수 없습니다.

모터의 종류와 그에 대한 적절한 모터 드라이버를 알아보도록 하겠습니다.

모터의 종류

우선 모터를 분리하자면 크게 3가지로 나뉩니다.

       DC 모터                           스테핑 모터                          서보모터      

 

이 중 서보모터에는 자체적으로 모터 드라이버가 내장되어 있어서 쉽게 방향제어할 수 있습니다.

하지만, DC 모터와 스테핑 모터는 모터 드라이버가 내정되어 있지 않아 일반적으로 방향제어하기 힘듭니다.

DC 모터는 전압만 가해주면 일정한 방향으로 무한 회전하는 모터인 반면에,

스테핑 모터는 프로그래밍을 통한 시그널(신호)로 정밀한 각도 및 위치를 제어해서

시그널 신호로 제어를 해주어야 합니다.

그러므로 시그널을 제어해주는 스테핑 모터 드라이버를 사용하여야 합니다.

대부분의 스테핑 모터 드라이버로 DC 모터도 제어할 수 있습니다.  

모터 사전조사하기

모터를 고르실 때 고려해보셔야 할 것에 대해 알려드리겠습니다.

1. 토크 (모터의 힘)

모터가 어느 정도의 힘을 버티는지 고려해보셔야 합니다.

무언가를 들어 올리거나, 움직일 때 그 무게를 버틸 수 있을까를 고민해야 합니다.

보통 토크가 많이 가해지면 모터 속도가 느려집니다. 

2. 정격전압

DC 모터는 입력 전압에 비례하여 힘과 속도가 달라집니다.

힘을 강하게 하고 싶다고 정격전압을 넘기게 된다면 모터가 상하게 됩니다.

다른 모터도 마찬가지로 정격전압을 지켜주는 것이 좋습니다.

정상적인 동작을 원한다면 정격 전압 꼭 지켜가면서 사용하셔야 합니다

3. 사용 전류

그냥 돌아가고 있을 때의 전류와 힘을 가해졌을 때 사용하는 전류가 다릅니다.

보통 제조사 측은 최대 전류를 알리지 않습니다.

직접 측정하는 방법은 모터를 정격전압에 맞추어 돌리고 있을 때 모터에 힘을 가하여 강제로 멈추게 합니다.

그때의 전류값이 모터가 사용하는 최대 전류이며

그 최대 전류를 고려하여 모터 드라이버를 사용하여야 합니다.

​많이 사용하는 모터 드라이버

제품의 이름을 클릭하면 상세 정보를 확인할 수 있습니다.

​1. 저렴한 모터 드라이버 HG7881

다른 모터 드라이버들에 비해 저렴한 제품입니다.

DC 모터를 제어할 때 2개의 모터를 제어할 수 있으며, 아두이노 PWM으로 속도 제어할 수 있습니다.

 최대 800mA의 전류와 2.5~12V 전압을 사용하는 모터를 제어할 수 있습니다.

제어핀을 통해 스텝 모터도 제어할 수 있습니다.

2.  아두이노 모터 드라이버 쉴드 L293D 

아두이노 제품에 적층하여 사용할 수 있는 쉴드형 제품입니다.

저렴한 모터 드라이버와 가격이 비슷한 반면에 최대 4개 DC 모터를 제어하거나

최대 2개의 스텝 모터를 제어할 수 있습니다. 

필자가 생각하는 가장 가성비 좋은 제품으로 사용하기 편리합니다.

브리지당 0.6A (1.2A 피크)를 제공하며, 4.5~36VDC까지 호환됩니다.

3. 아두이노 L298P 모터 드라이버 쉴드

해당 제품도 아두이노에 적층하여 사용할 수 있는 쉴드형 제품입니다.

공급 전원 7~12VDC에서 최대 2A 전류로 동작할 수 있습니다.

5,6번 PWM핀을 사용하며 4,7번 핀으로 방향을 제어하므로 이를 제외한 핀들은 사용하실 수 있습니다.

주로 DC 모터와 다른 제품들을 같이 사용하고 싶으실 때 사용하시기에 적합합니다.

4. 하이파워 모터 드라이버

5.5~40V 전압에 12A까지 방열판 없이 모터를 구동할 수 있습니다.

해당 제품은 높은 전압과 많은 전류를 사용하는 DC 모터를 제어하기에 적합합니다.

사용하실 �� 콘덴서와 헤더, 터미널을 납땜하셔야 정상작동이 되며 제품들은 따로 구매해주셔야 합니다.

5. 이지 드라이버 스테퍼 모터 드라이버

스텝 모터를 제어하기 위한 이지 드라이버입니다.

제품명 그대로 스텝 모터를 간단한 소스로 제어할 수 있으며

해당 제품은 헤더가 같이 동봉되어있어 납땜하여 사용하시면 됩니다.

이 외 제품들도 각각의 장점과 단점이 있습니다.

우선 무엇을 사용할 것인지 알아보고, 거기에 맞는 제품을 찾을 줄 알아야

원하시는 동작을 문제없이 구현하실 수 있습니다.

brown_special-10

출처 [메카솔루션] http://Mechasolution.com 

[아두이노 강좌] 아두이노 모터 드라이버 2A L298N을 이용해서 RC카 DC 모터 제어하기

<모터 드라이버 2A L298N 핀배열>

       ▶ 모터의 속도를 제어 및 회전방향을 제어할 수 있는 회로 장치로서 아두이노 보드 또는 MCU
통해 사용할 수 있는 드라이버 입니다. DC 모터 2개 또는 스테핑 모터를 연결하여 제어가
가능하며, 입력 전압은 12V 또는 5V로 사용 할 수 있습니다.



2. 동작원리

< 결선도에서 표현되는 L298N >

      ▶ DC 모터는 전류가 흐르는 방향에 따라 회전 방향 또한 바뀝니다. 예를 들어 +에서
          흐를 때와 에서 +로 흐를 때의 회전 방향은 서로 반대 입니다. 속도 역시 전압의 제어에
          따라 바꿀 수 있습니다. 전압이 커지면 속도가 증가하고, 전압이 작으면 속도가 감소합니다.
 
 ▶ 하지만 전압을 손쉽게 제어하기는 어렵기 때문에 PWM 신호를 이용해 보다 쉽게 제어
할 수 있습니다. 이러한 모터의 특성을 이용해 회전, 속도를 제어하는데 편리하게 사용되는   
          것이 모터 드라이버입니다.
 
 ▶ 그 중 L298N 모터 드라이버는 위 그림에서 볼 수 있듯 양 쪽에 각각 모터를 연결 할 수
          있는 단자가 있습니다. 아두이노와 연결하여 모터가 정회전이나 역회전을 할 수 있고, PWM   
          제어를 통해 속도 조절을 할 수 있습니다.
 
 ▶ 모터 드라이버에서 모터 방향은 각 채널의 드라이버에 HIGH 또는 LOW 신호를 보내 제어됩
          니다. IN1, 2, 3, 4핀을 통해 방향을 설정하고 모터를 구동 할 수 있습니다. 속도는 PWM
          출력을 모터 드라이버의 ENA, ENB 입력핀에 연결하여 조절 할 수 있습니다. ENA/ENB
          각각의 모터를 제어하며 이 핀이 HIGH 상태일 때 전원이 출력됩니다.





3. 모터드라이버 2A L298N을 이용하여 RC모터 제어하기

▶ 아두이노와 모터 드라이버, RC카 모터/바퀴, 배터리를 연결하고 간단한 테스트를 통해 모터의
방향과 속도를 제어해보겠습니다.
         (PWM제어를 할 경우, ENA/ENB에 묶여있는 점퍼핀을 제거 한 후 사용하셔야 합니다.)

< L298N 점퍼핀 제거 >

        3.1 준비물
     ▶ 실습에 앞서 준비물이 필요합니다.
                (링크를 클릭하면 해당 제품 페이지로 이동합니다.)

     아두이노 우노 보드(DIP) : 링크 클릭
     모터 드라이버 2A L298N : 링크 클릭
     미니 브레드보드 : 링크 클릭
     로봇용 DC모터 바퀴 세트/RC카 모터/자동차 바퀴 : 링크 클릭
     리튬폴리머 배터리 : 링크 클릭
     점퍼케이블 : 링크 클릭

        
        3.2 실습하기
            1) 아두이노와 연결하기
▶ 아래 결선도와 같이 연결합니다.

< L298N 모터 드라이버와 아두이노 우노의 연결 회로도 >

<실제 연결 모습>

            

            2) 코딩 예제
                 ▶ 아래의 코드를 입력 후 업로드 해줍니다.

int Dir1Pin_A = 2; // 제어신호 1핀 int Dir2Pin_A = 3; // 제어신호 2핀 int SpeedPin_A = 10; // PWM제어를 위한 핀 void setup() { pinMode(Dir1Pin_A, OUTPUT); // 제어 1번핀 출력모드 설정 pinMode(Dir2Pin_A, OUTPUT); // 제어 2번핀 출력모드 설정 pinMode(SpeedPin_A, OUTPUT); // PWM제어핀 출력모드 설정 } void loop() { digitalWrite(Dir1Pin_A, HIGH); //모터가 정방향으로 회전 digitalWrite(Dir2Pin_A, LOW); analogWrite(SpeedPin_A, 255); //모터 속도를 최대로 설정 delay(1000); digitalWrite(Dir1Pin_A, HIGH); //모터가 역방향으로 회전 digitalWrite(Dir2Pin_A, LOW); analogWrite(SpeedPin_A, 51); //모터 속도를 1/5로 설정 delay(3000); digitalWrite(Dir1Pin_A, LOW); //모터가 정방향으로 회전 digitalWrite(Dir2Pin_A, HIGH); analogWrite(SpeedPin_A, 255); //모터 속도를 최대로 설정 delay(1000); digitalWrite(Dir1Pin_A, LOW); //모터가 역방향으로 회전 digitalWrite(Dir2Pin_A, HIGH); analogWrite(SpeedPin_A, 51); //모터 속도를 1/5로 설정 delay(3000); }

        3.3 동영상
▶ 드라이버 테스트 결과 모터가 정방향에서 최대 속도, 역방향에서 1/5의 속도로 회전 하는 것을 볼 수 있습니다.

여기까지 ‘아두이노 모터 드라이버 2A L298N을 이용해서 RC카 모터 제어하기’ 였습니다.
끝까지 읽어주셔서 감사합니다.^^

L293D 아두이노 모터 쉴드

Arduino

프로필

2016. 8. 24. 12:15

안녕하세요. mAKE123 입니다.

모터를 동작시키기 위한 쉴드들이 매우 많습니다. 그중에 이번 포스팅은 저렴하고 다양한 모터를 연결할수 있는 L293D IC를 사용한 쉴드에 대해 알아보도록 하겠습니다.

쉴드사진

L293D 쉴드사진

이번에 다루는 쉴드는 모터 동작을 위한 쉴드입니다. 모터의 동작 전원은 아두이노의 동작전원(보통 5V)보다 높은 경우가 대부분입니다. 따라서 모터를 동작시키기 위해서 외부 전원이 필요합니다. 이때 외부 전원은 동작하고자 하는 모터에 따라 달리해주셔야 합니다.

L293D 쉴드는

– 4개의 DC 모터

– 2개의 스테핑 모터

– 2개의 서보 모터

를 동작 시킬 수 있습니다. 다만 4개의 DC 모터와 2개의 스테핑모터는 선택하셔야 합니다. 같은 핀을 공유하고 있기 때문에 둘중에 하나만 사용가능합니다.

회로도

모터 쉴드에 대한 회로도 입니다. 회로도를 잠시 살펴보겠습니다.

J3는 아두이노의 D8 ~ D13 번까지 연결되는 커넥터이며,

J1은 D0 ~ D7번까지 연결되는 커넥터입니다.

J3, J1 커넥터를 보시면 PWM핀은 아두이노의 PWM핀과 일대일로 매칭되어 있습니다.

– PWM1A, PWM1B : 서보모터 PWM 핀

– PWM2A, PWM2B : X1 모터 속도 제어핀

– PWM0A, PWM0B : X2 모터 속도 제어핀

– 본 모터 쉴드는 쉬트트 레지스터(74HCT595N)를 이용하여 두개의 모터 드라이버를 제어하고 있습니다. 모터드라이버 한개를 제어하기 위해서 4개의 신호선이 필요하므로 아두이노 우노를 사용하게 되면 핀이 부족하게 됩니다. 그래서 쉬프트 레지스터를 사용하여 제어하게 됩니다.

라이브러리

한개의 모터 드라이버를 사용하면 쉬트프레지스터를 사용하지 않아도 되지만 두개의 모터 드라이버를 사용하기 때문에 특정 라이브러리가 필요합니다. 아래 링크에서 라이브러리를 다운로드 하시면 됩니다.

https://github.com/adafruit/Adafruit-Motor-Shield-library

다운로드하시 라이브러릴 설치하고(라이브러리 설치 방법), 라이브러리를 살표보면 모터 쉴드에 필요한 라이브러리와 예제화일이 있습니다. 예제 화일은 총 5개가 포함되어 있고 하나 하나 자세히 살펴보도록 하겠습니다.

라이브러리 예제 – DC 모터 동작

라이브러를 설치하고 난 후 스케치 > 예제 > Adafruit Motor Shield library > MotorTest 선택

위의 예제를 선택하면, 아래와 같은 예제가 새창으로 열립니다.

MotorTest 예제를 M1, M2 M3, M4 DC 모터중 M4 모터를 동작시키기 위한 예제입니다. 테스트를 위해서 아래와 같이 연결합니다. 외부 전원은 9V를 인가하고 모터를 M4 단자에 연결했습니다.

코드를 살펴볼까요…?

===========================================================================================

// Adafruit Motor shield library

// copyright Adafruit Industries LLC, 2009

// this code is public domain, enjoy!

#include <AFMotor.h>

AF_DCMotor motor(4);             // M4에 연결

void setup() {

Serial.begin(9600);              // set up Serial library at 9600 bps

Serial.println(“Motor test!”);

// turn on motor

motor.setSpeed(200);           // 모터 회전속도 설정

 

motor.run(RELEASE);

}

void loop() {

uint8_t i;

 

Serial.print(“tick”);

 

  // 정방향 회전하면서 속도 증가

motor.run(FORWARD);

for (i=0; i<255; i++) {

motor.setSpeed(i);

delay(10);

}

// 정방향 회전하면서 속도 감소

for (i=255; i!=0; i–) {

motor.setSpeed(i);

delay(10);

}

 

Serial.print(“tock”);

// 역방향 회전하면서 속도 증가

motor.run(BACKWARD);

for (i=0; i<255; i++) {

motor.setSpeed(i);

delay(10);

}

// 역방향 회전하면서 속도 감소

for (i=255; i!=0; i–) {

motor.setSpeed(i);

delay(10);

}

 

Serial.print(“tech”);

motor.run(RELEASE);

delay(1000);

}

=========================================================================================

[IDE] 이클립스(Eclipse)에 아두이노(Arduino) 플러그인(Plug in) 설치/사용하기 – Sloeber

프로필

2017. 4. 18. 17:24

왜 Eclipse인가

아두이노 IDE는 매우 좋습니다. 쉽고 간단하니까요
하지만, 개발자나 공부하는 사람 입장에서는 편하게 내부 함수까지 들어가보고 싶을 때가 있고, 디버깅을 자세히 하고 싶을 때가 있습니다.
이를 위해, 사람들이 개발하여 무료로! 오픈!한 것이 있습니다.
바로 Eclipse에서 활용할 수 있는 Plugin입니다.
심지어 Eclipse도 무료이죠.

Plugin의 종류가 다양하지만 오늘 적용해볼 플러그인은 Sloeber 라는 이름을 가진 플러그인입니다.

버전 1부터 시작해서 현재 V4까지 나왔으며, 자신의 상황에 맞게 선택하여 적용할 수 있습니다.
V1~V3까지는 아두이노 IDE를 별도로 설치하여 Path지정하여 실행시키는 방법이었다면,
V4부터는 (정확히는 V3 후반부부터) 외부 IDE없이 사용가능하게 만들어졌습니다.

저는 V4를 적용하겠습니다 🙂

Eclipse에 Plugin설치

V3 이상부터는 JAVA 8 이상이 필요합니다. 혹시 그 이전 버전이라면 업데이트 해주세요!

우선 아래 링크로 가면 (Windows 기준) Plugin Update URL 이 있습니다.
http://eclipse.baeyens.it/stable.php?OS=Windows
[Install] 메뉴에서 다른 OS (Linux, MacOS)를 선택할 수 있으니 참고하세요!

자, 이 URL (현재 상황에서는) http://eclipse.baeyens.it/update/V4/stable 을 복사해둡니다.
그리고 Eclipse를 실행해서 아래와 같이 입력해줍니다.

레포지터리를 추가하고 나면, 6번 박스처럼 Plugin이 나타납니다.
두 개 모드 체크박스에 체크하고 [Next >] 버튼을 눌러 설치를 진행합니다.

중간에 나오는 동의는 꼭 해주시고, 경고(Warning) 창이 뜨면 [OK] 버튼을 눌러서 설치를 진행합니다.

설치가 완료되고 난 뒤, Eclipse를 재시작하고 나면, 아래와 같이 Arduino IDE에서 보았던 버튼들과 [Arduino] 메뉴가 생성된 것을 확인할 수 있습니다.

Plugin 둘러보기

[프로젝트(Sketch) 생성하기]

상단 메뉴의 [Arduino] [New Sketch] 를 누르면 Project 생성을 진행할 수 있습니다.
아래 화면에서 [Next >] 를 누르면 보드/포트 등을 설정할 수 있는데, 나중에 변경할 수 있으니 대충 선택하셔도 됩니다.

[보드/포트 설정하기]

보드와 포트를 설정하거나 변경할 수 있어야겠죠?
생성된 프로젝트의 속성창을 열면 왼쪽 메뉴에 [Arduino] 가 추가된 것을 볼 수 있습니다.
그리고 여기서 아래 화면과 같은 내용들을 설정할 수 있습니다.
컴파일 옵션을 별도로 적용하고 싶으셨던 분들은 [Compile Options] 가 매우 반갑겠습니다 🙂

[라이브러리 추가하기]

안타깝게도 아직은 Board Manager나 Library Manager를 지원하지 않습니다.
따라서 라이브러리를 직접 다운받아서 적용하시면 되겠습니다.

어찌되었든 라이브러리 추가 방법은 두가지로 나뉩니다. 외부 와 내부.
내부는 Arduino Core마다 기본 내장되어 있는 라이브러리를 뜻하며, 외부는 그 외의 path에 등록되지 않은 추가적인 것을 말합니다.
만약 Plugin에서 Library path를 지정하면?
내부 라이브러리 메뉴에서도 라이브러리를 추가할 수 있습니다.

우선 라이브러리를 추가하기 위해서는 프로젝트를 우클릭하면 [Import]메뉴가 나옵니다.
이걸 클릭하시면 아래와 같이 Arduino 카테고리를 확인하실 수 있습니다.
첫 번째가 외부, 두 번째가 내부가 되겠죠.

[내부]
이미 정해져 있죠? 체크박스에 체크해서 [Finish] 버튼을 누르면 추가됩니다.

[외부]
그림이 설명을 다 해주네요 🙂

Example 사용하기

아쉽게도 Example 적용이 Arduino IDE에 비해서는 불편합니다.

위에서 라이브러리를 추가하면, 아래와 같이 프로젝트 내에 추가가 됩니다.
example 폴더도 있네요.
여기서 원하는 예제(.ino 파일)를 선택하고서, 복사(Ctrl + C)하고 프로젝트에 붙여넣으면(Ctrl + V) 됩니다. 대신, 원래 것은 지워야겠죠? (물론 함수 중복만 안된다면 상관 없습니다)

시리얼 모니터 확인하기

컴파일이나 업로드, 이런것들은 아두이노와 버튼이 같기때문에 따로 소개하지 않았습니다.
심지어 [Arduino] 메뉴에도 있구요.

다만 시리얼 모니터의 경우 포트나 보레이트 설정이 원래 인터페이스와 다르기 때문에 소개합니다.

Serial Monitor View 옆을 보면  버튼이 보이는데요.
이걸 눌러주시면 위 화면처럼 포트와 보레이트를 설정할 수 있습니다 (DTR / RST는 덤)

다만, 아두이노와 달리 보레이트를 바꿔주려면 x 버튼으로 모니터를 닫고 다시 열어주어야 합니다.
그 외 버튼들은 커서를 올리면 어떤 기능인지 나오니 참조하세요 🙂

참고로 저 버튼 중에는 모니터에 뿌려진 내용을 Clear해주는 기능도 있답니다!
( 개인적으로 마음에 쏙 드네요 🙂 )

추가 기능

추가 기능은 이것저것 더 있겠지만, 당장 눈에 보이는 건 아래와 같이 Build를 통해 생성된 데이터를 확인할 수 있습니다.
개발자에겐 매우매우 만족스러운 내용이 아닐까요 🙂

참조 자료

어떤 버전을 써야하나요?
http://eclipse.baeyens.it/how_to.shtml#/a

Plugin GitHub
https://github.com/Sloeber/arduino-eclipse-plugin

Plugin 발전에 도움이 되고 싶어요!
http://eclipse.baeyens.it/nightly.php

Plugin 사용법에 대해 더 알고 싶어요 (추가 기능의 연장선)
http://eclipse.baeyens.it/learn.shtml

FAQs (디버그는 어떻게 하죠 등등)
http://eclipse.baeyens.it/faq.shtml

포스팅 정리가 별로인데.. 다른 가이드는 없나요?
http://playground.arduino.cc/Code/Eclipse#YourFirstArduinoProject
http://kaizen8501.tistory.com/115

다른 플러그인은 없나요?
https://marketplace.eclipse.org/content/eclipse-c-ide-arduino
http://docs.platformio.org/en/stable/ide/eclipse.html

C++ 구조체(Structure Types)


이번 편에서는 구조체(Structure Types)에 대해서 알려드리려고 합니다. 서로 다른 변수의 형태를 하나의 블럭으로 묶은걸 구조체라고 하며 구조체의 선언방법은 아래와 같습니다.

1
2
3
struct 구조체의 이름 {
  멤버 변수;
};

여기서 멤버 변수는 구조체 안에서 정의된 변수를 의미하며 우리가 일반적으로 변수를 선언하는 방식과 다르지 않습니다. 필드라고도 하고 구조체 원소라고 부르기도 합니다. 그러면 이제 우리가 구조체를 직접 선언해볼까요?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
struct student {
  int id;
  char *name;
  float percentage;
}; // 구조체 뒤에 세미콜론이 와야함
 
int main() {
  struct student s;
  s.id=1;
  s.name = "김철수";
  s.percentage = 90.5;
  printf("아이디: %d \n", s.id);
  printf("이름: %s \n", s.name);
  printf("백분율: %f \n", s.percentage);
  return 0;
}
결과:

아이디: 1
이름: 김철수
백분율: 90.500000
계속하려면 아무 키나 누르십시오 . . .

3~7행을 보시면 구조체 student를 정의하였고 10행을 보시면 구조체 변수 s를 선언하였습니다. 11~13행을 보시면 구조체의 접근 방법을 보여주며 구조체 변수 s의 각각의 멤버 변수에 값을 저장하고 있습니다. 구조체를 사용하면 관련이 있는 정보끼리 한꺼번에 묶을수 있다는 장점이 있습니다. 11~13행을 다시 보시면 . 연산자로 구조체의 멤버를 참조할수 있습니다. 구조체는 어떻게 초기화 할까요?

1
struct student s={1,"김철수",90.5};

보시는 바와 같이 중괄호를 사용하여 초기값을 적습니다. 그런데, 일일히 구조체를 선언할때 struct를 붙이고 구조체를 선언하다 보니, 여간 귀찮은게 아닙니다. 이는 typedef라는 키워드로 간단하게 줄일 수 있습니다.

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
/* cprogramminglanguage.net */
#include <stdio.h>
typedef struct _student{
    char name[50];
    unsigned int mark;
} student;
 
void print_list(student list[], int size);
void read_list(student list[], int size);
 
int main(){
 
    const int size = 2;
    student list[size];
    
    read_list(list,size);
 
    print_list(list,size);
}
void read_list(student list[], int size)
{
    printf("학생의 정보를 입력하여 주세요:\n");
 
    for(int i = 0; i < size;i++){
        printf("\n이름:");
        scanf("%s",&list[i].name);
 
        printf("\n마크:");
        scanf("%u",&list[i].mark);
    }
}
void print_list(student list[], int size){
    printf("학생들의 정보:\n");
    
    for(int i = 0; i < size;i++){
        printf("\n이름: %s, 마크: %u",list[i].name,list[i].mark);
    }
}

결과:

학생의 정보를 입력하여 주세요:

이름:김철수

마크:4

이름:김영희

마크:5

학생들의 정보:

이름: 김철수, 마크: 4
이름: 김영희, 마크: 5
계속하려면 아무 키나 누르십시오 . . .

이 예제의 이해가 살짝 힘들겠지만, 차근차근 살펴보도록 합시다. 우선, 4행에 등장한 typedef 키워드는 잠시 제껴두고 9~10행을 보시면 함수의 매개변수란에 구조체 배열을 인자로 받을 수 있게끔 해놓았습니다. 여기서, 구조체도 역시 배열로 선언할 수 있으며 함수로 전달할 수 있는 녀석임을 알 수 있습니다. 이어서, typedef에 대한 설명을 마저 하도록 하겠습니다.

1
typedef 데이터타입 이름;

이 typedef란 녀석은, 기존 데이터 타입에 새로운 이름을 부여합니다. 말 그대로 원래 있던 데이터 타입에 별명을 붙인다는 소리와 같습니다. 한번 직접 사용해볼까요?

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
typedef int INT_VAR;
int main()
{
    INT_VAR a=50;
    INT_VAR b=40;
    
    printf("a와 b를 더한 결과: %d\n", a + b);
    return 0;
}

결과:

a와 b를 더한 결과: 90
계속하려면 아무 키나 누르십시오 . . .

typedef 키워드를 사용하여 int에 INT_VAR라는 새로운 이름을 붙여주었습니다. int와 INT_VAR는 같은 녀석이라는 소리입니다. 그리고 INT_VAR(int)로 a, b를 선언하고 값을 각각 50과 40으로 초기화 후에 더한 후의 결과물을 출력했습니다. 그렇다면 다시 위 코드로 돌아가 15행을 볼까요?

1
student list[size];

이는 구조체의 배열 선언으로 배열의 선언방식과 다르지 않고, 이 구조체 배열은 구조체 변수의 모임입니다. 따로 설명드리지 않아도 이해하실것 같아서 넘어가겠습니다. 17행과 22행을 봐볼까요? 구조체 배열 list를 첫번째 인자로 받고있으며 두번째는 그 배열의 길이를 인자로 받고 있습니다. 우리가 10편에서 배웠던 매개변수의 선언방식과 동일합니다. 이제는 한번 구조체 포인터로 들어가볼까요?

2. 구조체 포인터


전 파트의 ‘포인터’만 잘 이해하셨다면, 이번 구조체 포인터 파트도 별로 어려울 부분이 없습니다. 구조체 포인터는 어떻게 쓰는지 한번 보도록 합시다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* www.roseindia.net/c-tutorials/c-structure-pointer.shtml */
#include <stdio.h>
int main() {
  struct st {
  int id;
  char *name;
  char *address;
  };
  struct st employee, *stptr;
  stptr = &employee;
  stptr->id = 1;
  stptr->name = "홍길동";
  stptr->address ="서울";
  printf("직원 안내: 아이디=%d\n%s\n%s\n", stptr->id, stptr->name,
  stptr->address);
  return 0;
}
결과:

직원 안내: 아이디=1
홍길동
서울
계속하려면 아무 키나 누르십시오 . . .

10행을 볼까요? 구조체 변수 employee와 구조체 포인터 stptr가 선언되었으며 stptr에 employee의 주소를 기억시키고 있습니다. 그리고 이 구조체 포인터 stptr를 사용하여 구조체 employee의 멤버에 접근이 가능합니다. (12행~15행) 한가지 특이한 것은 -> 연산자를 사용하여 구조체 포인터로 구조체 멤버를 참조하고 있습니다. 원래는 * 연산자를 사용하여 접근할 수 있습니다. (*stptr).id, (*stptr).name, (*stptr).address와 같이 말입니다. 그런데, 매번 구조체 포인터를 통해 멤버에 접근을 하려고 할때 연산자의 우선순위 때문에 괄호로 덮어주어야 하는 불편함이 생기기 때문에 C언어에서는 ->라는 녀석이 존재합니다. 간단하죠?

출처: http://blog.eairship.kr/19 [누구나가 다 이해할 수 있는 프로그래밍 첫걸음]

DC 모터 양방향으로 제어하기

[아두이노 강좌] 15. DC 모터 양방향으로 제어하기

본 게시물에서는 아두이노와 L293D 모터 드라이버 칩을 이용하여 DC모터의 속도와 동작방향을 제어하는지에 대해 설명하겠습니다.
overview.jpg

본 프로젝트에서는 포텐셔미터로 모터의 속도를 조절하고 푸쉬버튼으로 모터의 방향을 조절합니다.

L293d.jpg

사용되는 L293D IC 입니다.

실험

아두이노로 모터를 제어하기에 앞서, 먼저 L293D 모터 제어 칩이 어떻게 동작하는 지 알아 보기 위한 간단한 실험을 하겠습니다.

먼저 모터에 5V를 공급하는 것부터 시작합니다..

fritzing_pwr_only.jpg

손가락을 모터 샤프트에 살짝 갖다대면 어느 방향으로 모터가 회전하는지 알 수 있는데, 모터가 어느방향으로 회전하는지 확인하여 보십시오. 모터에 연결된 선을 서로 바꾸면 모터는 아까와는 반대방향으로 회전합니다.

L293D 칩은 위와 같이 극성에 따라 동작방향이 변하는 점을 이용한 칩입니다. 아래와 같이 브레드보드를 셋업하십시오. 먼저 아두이노가 아닌 수동으로 실험을 진행하여 보겠습니다.

fritzing_chip_only.jpg

우리가 관심있는 것은 L293D의 세개의 핀인데, 그 핀들은 Pin1(Enable), Pin 2 (In1), Pin 7 (In2)입니다. 이 핀들은 5V 혹은 GND에 보라, 노랑, 오렌지 색 점퍼로 연결되어 있습니다.

위의 그림에서 보듯, 모터는 한방향으로 움직입니다. 이 방향을 편의상 A라고 부릅시다.

Pin1(enable)을 GND로 옮기면 모터는 멈추어 서게 되고, pin ln1과 ln2에 무엇을 하던 모터는 동작하지 않습니다. Enable핀은 On/Off 스위치와 같으며, PWM출력을 이용하여 모터의 속도를 조절하는데 유용하게 사용이 됩니다. enable핀을 다시 5V로 연결합니다.

이제 ln1(pin2, 노랑)을 5V에서 GND로 옮깁니다. 그러면 ln1과 ln2는 지금 모두 GND에 연결된 상태로 모터는 다시 멈추게 됩니다.

ln2핀을 GND에서 5V로 옮깁니다. 그러면 모터는 반대방향(방향B)로 욺직이게 됩니다.

마지막으로 ln1을 5V로 다시 옮깁니다. 그러면 ln1, ln2가 모두 5V가 되는데, 이 경우 모터가 멈추게 됩니다.

ln1과 ln2 핀의 조합에 따른 모터의 동작을 아래의 표에 정리하였습니다.

In1

In2

Motor

GND GND 멈춤
5V GND 방향A로 회전
GND 5V 방향B로 회전
5V 5V 멈춤

브레드보드 레이아웃

자, 이제는 모터의 enable, ln1, ln2핀을 아두이노에 연결하여 제어를 하여 보도록 하겠습니다. IC를 브레드보드에 연결할 때 IC의 U형 노치가 브레드보드 상단을 향하도록 설치가 되어야 합니다.

fritzing.png

아두이노 코드

아래의 코드를 아두이노에 업로드 하십시오.

  1. int enablePin =11;
  2. int in1Pin =10;
  3. int in2Pin =9;
  4. int switchPin =7;
  5. int potPin =0;
  6. void setup()
  7. {
  8. pinMode(in1Pin, OUTPUT);
  9. pinMode(in2Pin, OUTPUT);
  10. pinMode(enablePin, OUTPUT);
  11. pinMode(switchPin, INPUT_PULLUP);
  12. }
  13. void loop()
  14. {
  15. int speed = analogRead(potPin)/4;
  16. boolean reverse = digitalRead(switchPin);
  17. setMotor(speed, reverse);
  18. }
  19. void setMotor(int speed,boolean reverse)
  20. {
  21. analogWrite(enablePin, speed);
  22. digitalWrite(in1Pin,! reverse);
  23. digitalWrite(in2Pin, reverse);
  24. }

setup함수안에 핀과 핀의 모드가 정의 되어 있습니다. loop함수내에서는 모터속도 값은 포텐셔미터로부터 얻은 아날로그 값을 4로 나눈 값으로 할당되어 있습니다.

4로 나눈 이유는 아날로그 입력값은 0에서 1023이며 실제로 우리가 필요한 값은 0에서 255사이의 값이기 때문입니다.

만약 버튼이 눌리게 되면 모터는 전진하고, 그렇지 않으면 반대로 돌게 됩니다. reverse 변수값은 스위치 핀으로부터 읽어들인 값으로 설정되기 때문에, 버튼이 눌리면 False, 아니면 True입니다.

모터의 속도와 방향의 값은 setMotor()함수의 파라메터로 전달되어 모터 드라이버 칩의 해당 핀을 셋팅함으로써 모터를 제어하게 됩니다.

  1. void setMotor(int speed,boolean reverse)
  2. {
  3. analogWrite(enablePin, speed);
  4. digitalWrite(in1Pin,! reverse);
  5. digitalWrite(in2Pin, reverse);
  6. }

먼저, enable 핀에 analogWrite함수를 이용하여 속도를 설정합니다.L293의 enable핀은 ln1, ln2가 어떻게 셋팅되어 있던지 상관없이 모터를 on/off합니다. 뱡향을 제어하기 위해서는 ln1과 ln2핀은 반드시 반대되는 값으로 설정되어야 합니다.

만약 ln1이 high이고 ln2가 low이면, 모터는 한방향으로 돌게 됩니다. 반대로 ln1이 low이고 ln2가 high라면 모터는 그 반대방향으로 돌게 됩니다.

! 명령은 not을 의미합니다. 그래서 reverse의 값이 무엇이던지 ln1의 값은 reverse의 값과 반대되는 값으로 설정이 됩니다.

두번째 digitalWrite는 ln2에 reverse의 값을 설정합니다. ln1값은 reverse값의 반대값이 설정되기 때문에 ln2의 값은 ln1의 값과 항상 반대값이 됩니다.

L293D

L293D는 매우 유용한 칩으로 실제적으로 두개의 모터를 독립적으로 제어할 수 있습니다. 본 강좌에서는 칩의 반만을 사용한 것이죠. 칩의 왼쪽, 오른쪽으로 모터를 하나씩 연결할 수 있습니다.

L293D.jpg

만약 두번째 모터를 연결한다면 OUT3, OUT4에 연결되어야 하며 추가적인 세개의 제어 핀이 필요합니다..

  • EN2는 아두이노의 PWM핀에 연결되어야 합니다.
  • IN3과 IN4은 아두이노의 디지털 출력 핀에 연결되어야 합니다.

L293D는 두개의 +V핀(8번, 16번)을 가지고 있습니다. +Vmotor(8)은 모터에 전원을 공급하고 +V(16)은 칩 로직에 전원을 공급합니다. 여기서는 아두이노의 5V핀을 가지고 두개를 다 연결하였습니다만, 만약 높은 출력의 모터를 사용하거나 좀더 높은 전압의 모터를 사용한다면, 모터에게 별도의 전원을 연결하여 주는 것이 좋습니다.