블루투수의 사용법과 가속도 센서 연동하기.

재료는 다음과 같이 준비합니다.
아두이노, 브레드보드, 블루투스, 연결케이블 몇가닥 이번에는 사용안하지만 다음에는 MPU6050까지

연결은 간단합니다. 블루투스에 기본 적으로 전원을 인가하고, 아두이노와 연결 가능하도록 TX,RX 단을 연결 합니다.

아두이노 - 블루투스
VCC - VCC (5)
GND - GND (4)
RX(10) - TX (3)
TX(11) - RX (2)

아두이노의 10번과 11번 핀은 가상핀으로 선택되어 실험될 예정입니다.

테스트용 프로그램을 활용해서 간단히 실험해볼 예정인데요.

아두이노를 켜고 

파일=>예제=>SoftwareSerial => SoftwareSerialExample

다음과 같이 선택하면 아래와 같은 예제 프로그램이 열립니다.

/*
Software serial multple serial test

Receives from the hardware serial, sends to software serial.
Receives from software serial, sends to hardware serial.

The circuit:
* RX is digital pin 10 (connect to TX of other device)
* TX is digital pin 11 (connect to RX of other device)

Note:
Not all pins on the Mega and Mega 2560 support change interrupts,
so only the following can be used for RX:
10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

Not all pins on the Leonardo support change interrupts,
so only the following can be used for RX:
8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

created back in the mists of time
modified 25 May 2012
by Tom Igoe
based on Mikal Hart's example

This example code is in the public domain.

*/
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
// Open serial communications and wait for port to open:
Serial.begin(57600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}


Serial.println("Goodnight moon!");

// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
mySerial.println("Hello, world?");
}

void loop() { // run over and over
if (mySerial.available()) {
Serial.write(mySerial.read());
}
if (Serial.available()) {
mySerial.write(Serial.read());
}
}

있는 것을 모두 불러왔는데요. 참고 하시면 가상핀 설정을 위해 

SoftwareSerial mySerial(10, 11); // RX, TX 여기 부분만 활용해서 통신한다고 알면되고

10번과 11번 핀이 RX단자와 TX단자로 설정되고

통신속도를 맞춰 주면 된다라고 생각 하시면 됩니다.

mySerial.begin(9600); 여기 부분의 통신속도를 저는 9600으로 해뒀고

통신 단자와연결되는 장치의 속도가 9600이라고 이해 하시면 됩니다.

물론 기본 작업을 모두 하면 아두이노에 컴파일 다운로드 하시면 됩니다.

그럼 스마트폰에 확인을 위해서 간단한 터미널 프로그램이 있어야 되겠는데요.

전 블루투스터미널 HC-05를 사용합니다.

구글 플레이어에서 간단히 HC-05 이라고 검색하면 위와 같은 프로그램이 뜨는데요. 참고 하시면 됩니다.

바탕화면에 다음과 같이 설치되서 열게되면

스마트폰에 블루투스를 켜면 HC-05 라고 뜨게 될겁니다
암호를 4자리 입력하라고 뜨면 1234로 초기 암호를 입력하면 되고요.
바탕화면에 있는 아이콘을 눌려서 접속하면 위와 같이 모듈이 선택되면 다시 클릭

접속하면 다음과 같이 간단히 뜨면 이것 저것 눌려보시면 익히기 편리 할겁니다.

하지면 접속된 상태이니 바로 통신은 가능하고요.

아두이노 쪽에서도 다음과 같이 터미널을 열게 되면 바로 텍스트 데이터를 주고 받습니다.

블루투스에서 test 하고 Send 보내게 되면 PC로 날아간 것을 확인 하게 됩니다.

 

 

https://youtu.be/fqKhE0Kso_I

 

 

https://youtu.be/bndqQizhXxU

 

 

https://youtu.be/zIIZiH3SMTs

 

 

 

https://youtu.be/7g0_NMJa6cI

 

모터는 일반적으로 그냥 전압의 크기에 따라 돌아가는 dc 모터,

그리고 각도가 제어가능한 rc서보모터는 아마도 그냥 쉽게 사용할 수 있을 겁니다.

스테핑모터를 제어하면 이제 또 다시 제어의 수준이 한단계 더 올라간다는 것을

알게 될 겁니다.

스텝모터는 특이하게 펄스를 주어 신호에 따라 모터의 회전이 가능 합니다.

어렵게 생각하면 제어하기 힘들어지니 그냥 이렇게 생각하면 좋을 것 같습니다.

한번의 신호(10 , 한번 주게 되는 짧은 신호)를 흘리면 모터는 1.8도 돌아간다.

모든 스테핑모터가 그렇게 되어 있는 건 아니지만 일반적으로 한번의 신호를 주면1.8도가

회전하고 한번이 아니라 100번의 신호를 (10) 반복해서 100번 주게 되면

모터는 당연히 1.8도가 100, 180(반바퀴) 회전할 수 있다.

이렇게 정의 할 수 있겠죠.

 

180도가 아니라 360도를 회전시킬려면 그럼 모터에 신호를 몇 번 주면

될까요.

 

계산을 해보면 360/1.8 = 200

 

200번의 신호를 주면 모터는 360도 회전시킬 수 있습니다.

 

한마디로 스테핑 모터는 한번의 특정신호를 만들어 두면

신호에 따라 특정 각도까지만 회전하는 모터라고 이해하면 됩니다.

 

원하는 회전 각도를 정확히 계산할 수 있도록 만들어진 모터라고 생각하면

이해하기 편하죠.

 

그런데 이런 점도 있습니다. 신호를 보낼 때 주게 되는 신호의 시간

이것을 주기와 연관을 짓게 됩니다. 1,0으로 신호를 만들어서 보낼 때

 

이때의 신호의 길고 짧음에 따라 모터의 회전속도도 정해지게 된다는 점

우리는 이것을 흔히 PWM이라고 부릅니다. 어려운 용어가 하나 나왔는데..

 

이것은 실제 서보모터에서 개념적인 것은 이해했기 때문에 다시 설명을 드립니다.

PWMPulse Width Modulation의 약자로 높은 전압 값(5V)와 낮은 전압 값(0V)

비율로 설정해 전압의 비율에 따라 제어를 하게 되는 방식을 이야기 합니다.

 

보다 자세한 내용은 다음의 사이트에 내용이 잘 나와 있어 PWM을 이해하시면 되겠습니다.

https://opentutorials.org/module/2106/12246

 

스테핑 모터의 실제 구조를 한번 이해해 볼까요?

 

 

 

 

스테핑모터의 주축은 다음과 같이 생겨서 톱니 형태로 이루어져 있습니다.

톱니형태로 생겼기 때문에 모터가 1.8도라는 각도를 만들어 낼 수 있다고

보면 되겠습니다.

 

외부에는 8개의 코일로 감겨져 있어 코일의 전기가 흐르는 순서에 따라서

스테핑모터를 회전 시키게 된다고 이해하면됩니다.

 

각 코일마다 실제로 감겨 있는 상태는 A,/A,B,/B

다음과 같은 형태로 선이 순차적으로 감기게 됩니다.

 

 

 

 

스테핑 모터의 전류는 순차적으로 흘려야 된다고 했죠.

 

다음과 같은 순서로 A, B , /A, /B 순으로 전류를 구동하게 됩니다.

물론 이렇게 전류를 흘리는 방식 외에 다르게 전류를 줄 수도 있지만

보편적인 방법을 이용해서 전류를 구동하게 됩니다.

 

일반적으로 다음과 같이 전류를 순차적으로 발생시키는 드라이버가

존재를 하는데요. 그런 장치로 스테핑 모터 콘트롤러를 사용하기도합니다.

그리고 순차적으로 모터신호를 아두이노 또는 제어기를 이용해 신호를

발생시키기도 합니다. 발생시킨 신호는 전류 증폭기를 통해 모터를

회전시키기도 합니다.

 

처음 스테핑모터를 구동하실 때 어려운 점이 많으실 수 있으니

조심해서 제어하시기 바랍니다.

 

 

 

그럼 우리가 보편적인 방법으로 아두이노 예제를 참고해서

스테핑 모터를 돌려보도록 하겠습니다.

 

가지고 있는 스테핑 모터가 선이 4개인지 6개인지 파악하셔야 합니다.

아니면 구매하실 때 어떤 모터를 선택할지 고민 하셔야 됩니다.

보통은 4선을 이용하는 것이 쉬울 수 있습니다.

전원이 따로 입력되지 않아도 되니 4선이 편리할 수 있고,

상황에 따라 6선의 경우 공통 단자가 2개가 더 있으니 참고 하셔야 됩니다.

 

스테핑모터의 4선과 6선에 관한 정보는 게시글에 더 적어 두도록 하겠습니다.

http://www.ntrexgo.com/archives/21591

 

 

이제 스테핑모터를 돌리기 위해 예제파일을 열도록 하겠습니다.

파일 탭 => 예제 => stepper => stepper_oneRevolution을 클릭

 

 

 

 

열게 되면 다음과 같은 프로그램 코드가 열릴 것 입니다.

 

 

#include <Stepper.h>

 

const int stepsPerRevolution = 200;

 

Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

 

void setup() {

myStepper.setSpeed(60);

Serial.begin(9600);

}

 

void loop() {

 

Serial.println("clockwise");

myStepper.step(stepsPerRevolution);

delay(500);

 

Serial.println("counterclockwise");

myStepper.step(-stepsPerRevolution);

delay(500);

}

 

이제 어느 정도 배워와서 개념은 알지만 또 새로운 것에 대해 이해를

해야 겠죠.

 

#include <Stepper.h> <== 이건 스테핑모터를 사용하기위한 프로그램이

설정된 곳이죠. 흔히들 헤더파일이라고 정의 하는데요. 스테핑모터에 대한

해더파일이라고 이해하십시오.

이것을 사용함으로써 myStepper <=이런 명령어를 활용할 수 있게 됩니다.

 

그리고 const int stepsPerRevolution = 200; 변수 stepsPerRevolution여기에

값을 200회 넣는 다는 말은 딱 봤을 때 1.8도의 모터를 360도 까지 회전시길 값을

넣어 놓은 거라고 볼 수 있습니다.

 

Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); 여기의 뒤편을 유의해야 되는데요.

Stepper myStepper() <== 여기 안에 200회의 회전이 가능한 형태로 정의 학고

그리고 8~11번까지의 아두이노 핀을 A,/A,B,/B 형태로 선이 4개 사용되도록 만든다는 점도

이해가 되죠.

 

 

 

void setup에는 모터의 속도와 시리얼데이터를 출력하기 위해 정의를 했구요.

void loop의 내용을 보면 이전에 없었던 내용인 myStepper.step(stepsPerRevolution);

다음과 같은 명령어가 나옵니다. myStepper.step(200);

다음과 같이 200번의 각도가 입력되니 모터는 1바퀴 회전하게 될 것입니다.

그리고 myStepper.step(-stepsPerRevolution);

다음과 같이 값을 입력 할때는 모터가 반대방향으로 회전되도록 만들어 지내요.

참 편하게 만들어졌네요.

 

저는 모터의 출력을 다음과 같이 L298 드라이버를 이용해 사용했는데요.

L298 드라이버가 아니더라도, 특정 드라이버의 단자에 입력하는

A,/A,B,/B 형태로 아두이노의 입력단자를 8~11번으로 맞추고

 

출력되는 모터를 스테핑모터에 맞추면 어려움 없이 동작 시킬 수 있을 것입니다.

 

 

 

만약 스테핑모터의 결선이 헷갈리시면 질문하시면 답을 드릴 수 있도록 하겠습니다.

 

연결된 스테핑 모터는 다음과 같이 실험 하였습니다.

 

 

우리가 덧셈, 뺄셈에서 곱셈, 나눗셈을 배울 때는

당연히 어렵게 느껴지지만 어느 순간 익숙함에

쉬워지죠. 그때 필요하면 도움을 요청 하는 건 당연합니다.

 

- 내용 정리

적외선 리모콘에서 2개의 신호가 먼지 정의하고

리모콘에서 신호를 보내게 될 때, RC서보모터를

0도 또는 90도로 돌아가도록 하는 것입니다.

 

 

회로의 연결

신호의 연결은 다음과 같이 됩니다.

 

리모콘은 다음과 같이 11번과 연결합니다.

 

 

 

그리고 서보모터는 2번을 통해 연결합니다.

 

 

 

 

 

최종 연결 시 다음과 같이 연결 합니다.

VCC 0V가 입력되도록 전원을 입력시키고

11번 단자 => 적외선 수신부

2번 단자 => 서보모터와 연결 할 수 있도록 합니다.

 

 

 

 

 

 

 

상단의 정의해야 되는 부분은 다음과 같이 프로그램 합니다.

 

적외선 리모콘을 사용하기 위해 어제 기본 적인 값을 사용한 것 그대로

사용했다고 생각하변 됩니다.

적외선 리모콘을 사용하기 위해 11번 단자를

 

void setup에서는

시리얼 모니터를 정의 하고

13번의 LED 동작을 표시하기 위해

2번은 서보모터를 동작시키기 위해 정의 했습니다.

irrecv.enableIRIn()은 적외선 리모콘을 사용하기 위해 정의한

내용입니다.

 

 

 

 

 

remo results.value의 바뀌어지는 적외선 값을 입력 받을 수 있도록

변수이름으로 활용하고

 

remo  if()안에 remo == 0xFFA25D와 비교 될 수 있도록 사용했습니다.

여기서 ==는 프로그램에서 =의 같다와 표현으로 사용됩니다.

 

 

 

if(remo == 0xFFA25D) { 프로그램동작 1}

else if(remo == 0xFFE21D) { 프로그램동작 2}

다음과 같은 형태로 만들어져서 리모콘의 받아오는 값

다음과 같은 형태에서의 값과 비교될 수 있도록 사용해서

 

 

 

 

값이 입력 되면 if문 또는 else if문의 프로그램이 동작되도록

만들어졌습니다.

 

if문 또는 else if문의 프로그램은 LED 또는 서보모터를 동작시키는

프로그램이 작성되어 있어 LED를 켜거나 끌 수 있도록 동작되어

있습니다. 이제 기본적인 내용은 참고 하실 수 있을 거라 생각됩니다.

 

궁금하신 분은 문의주세요.

 

오늘도 수고했습니다.

 

 

 

#include <IRremote.h>

 

int RECV_PIN = 11;

int i = 0;

unsigned long remo = 0;

 

IRrecv irrecv(RECV_PIN);

 

decode_results results;

 

void setup()

{

Serial.begin(9600);

pinMode(13, OUTPUT);

pinMode(2, OUTPUT);

irrecv.enableIRIn(); // Start the receiver

}

 

void loop() {

if (irrecv.decode(&results)) {

 

//Serial.println(results.value, HEX);

remo = results.value;

Serial.println(remo, HEX);

if(remo == 0xFFA25D)

{

digitalWrite(13, HIGH);

for(i=0 ; i < 99 ; i++ ) // 원하는 횟수 반복

{

digitalWrite(2, HIGH); // 2번 핀으로 켜짐

delayMicroseconds(1500); // 1.5ms 동안의 시간을 지연

digitalWrite(2, LOW); // 2번 핀으로 꺼짐

delay(5); // 5ms 동안 지연

}

// delay(1000); // 1초 동안 동작 멈춤

 

}

else if(remo == 0xFFE21D)

{

digitalWrite(13, LOW);

for(i=0 ; i < 99 ; i++ )// 원하는 횟수 반복

{

digitalWrite(2, HIGH); // 2번 핀으로 켜짐

delayMicroseconds(700); // 0.7ms 동안의 시간을 지연

digitalWrite(2, LOW); // 2번 핀으로 꺼짐

delay(5); // 5ms 동안 지연

}

//delay(1000); // 1초 동안 동작 멈춤

 

}

irrecv.resume(); // Receive the next value

}

}

+ Recent posts