반응형

【 아두이노모듈#22 Adafruit 사의 4채널 아두이노 모터쉴드 - 서보모터 사용하기!  

 Adafruit 사의 모터쉴드는 L293D 모터드라이버를 2개를 H-bridge 구성한 4채널 모터드라이브 쉴드 보드이다. 

여기서 쉴드보드란, 아두이노 우노, 메가, 레오나르도 등에 적층하여 사용할 수 있는 확장형 보드라는 의미이다.  따라서 다른 형태의 모터드라이버 보드와는 달리 거추장스러운 선연결이 많이 줄어 들게 되는 장점이 있다.  또한, 서보모터(2개), DC 모터(4개) 혹은 스텝모터(2개)를 함께 연결하여 동시 구동이 가능한 확장성을 지닌 보드이다.  이번 시간부터 서보모터 부터 실습하여 DC모터 4개를 구동할 수 있는 RC Car 구동에 활용해 볼 예정이다. 

 Let's get it~!

▶ 아두이노 L293D 모터 드라이버 쉴드 스펙

아두이노 우노, 레오나르도, 메가, 듀에 보드 위에 결합 가능한 핀구조이다.

[ 주요 스펙-특징 ]

- 모터 채널당 최대 600mA 출력을 내보낼 수 있다. (합산 전류 최대치는 1.2A-보호회로 내장) 

- 5V Servo 모터 2개를 연결 사용가능하다 (High resolution)

- 동시에 4개의 DC 모터 또는 2개의 Stepper 모터 또는 2개의 Servo 모터 구동이 가능하다.

- DC 모터 구동시 양방향 구동과 8bit의 속도제어가 가능하다 (speed : 0~255)

- 4.5V~36V DC 모터 제어가 가능하다.

- 아두이노 보드와 연결된 리셋 단자가 있다.

- 모터구동을 원활하게 하기 위하여 위부 전원 입력단자가 별도로 있다.

각종 모터를 연결한 모습

 

▶ 서보모터(2개) 제어하기

 

▶ 사전준비 :

 아래처럼 라이브러리 관리에서 Adafruit 사의 모터 드라이버를 다운받아 라이브러리에 추가 한다.(구글, 깃허브 등에서 다운로드도 가능)

 라이브러리 직접 다운로드 :

Adafruit-Motor-Shield.zip
0.01MB

 

▶ 회로연결 :

 아래와 같이 서보모터 두 개를 연결한다.

 ※ 외부전원 +, GND 구분을 잘하여 연결하고, 가급적 6~7V 이상의 전원을 공급해준다. (AA x 4개도 가능)

    위 이미지는 하단에 아두이노 보드가 결합 된 모습임을 참고하라.

 

▶ 코딩 :

 

/* 모터쉴드에 서보모터 2대 연결 실습 코드              */

#include     // Adafruit의 L293D모터쉴드 라이브러리
#include       // 서보모터 라이브러리
Servo servo1;    // 서보모터 1 정의
Servo servo2;    // 서보모터 2 정의

void setup() {
  Serial.begin(9600);    
  servo1.attach(9); // 서보모터 1 연결 (9번핀-고정)
  servo2.attach(10); // 서보모터 2 연결 (10번핀-고정)
}
void loop() {
  servo1.write(0);    // 서보모터1을 0도의 위치로 이동
  delay(1000);        // 1초 시간 지연
  servo1.write(180);  // 서보모터1을 180도의 위치로 이동
  delay(1000);        // 1초 시간 지연
     
  servo2.write(0);    // 서보모터2를 0도의 위치로 이동
  delay(1000);        // 1초 시간 지연
  servo2.write(180);  // 서보모터2를 180도의 위치로 이동
  delay(1000);        // 1초 시간 지연
}

 

【코드 다운로드】

01_2Servo-motor_shield.zip
0.00MB

▶ 동작 영상 :

반응형
반응형

【 아두이노모듈#21 nRF24L01  조이스틱으로 서보모터 2대 제어하기!  

 지난시간 nRF24L01 모듈을 이용하여 조이스틱(Joystick)으로 서보모터 1대를 제어해보았다. 이번엔 조이스틱의 상하 뿐아니라 좌우움직임을 함께 이용하여 서보모터 2대를 제어해볼 것이다.  여기서 중요한 것은 코딩영역이다. 한가지 데이터를 수신하여 모터 한 대를 제어하는 것은 어렵지 않았다. 하지만, 2가지의 제어값인, 조이스틱의 상하 값과 좌우 값을 수신단에서 분리처리해야 두개의 모터를 각각 제어 할 수 있을 텐데,  이 문제를 해결하는 것이 중요하다.   해결책은 C언어의 구조체 형식을 이용하면 아주 간단히 해결되니, 아래 내용을 자세히 살펴보면 쉽게 이해할 수 있을 것이다.

 Let's get it~!

 

▶ 선수학습 :

    1. [아두이노 모듈#14] 조이스틱 Joystick 사용하기 #1 ☜ (클릭)

    2. [아두이노 모듈#19] 2.4G RF 무선통신 하기! (nRF24L01 기본사용법)  ☜ (클릭)

    3. [아두이노 모듈#20] 조이스틱으로 서보모터제어하기(조이스틱&서보사용법)  ☜ (클릭)

 

(모듈 기본 정보-상세내용은 위 선수학습 참조)

 

▶ 실습 회로 도면 :

(1. 조이스틱-송신기회로)

(2. 조이스틱-수신기회로)

서보모터 2대 제어부분(nRF24L01)

[ 특이(주의) 사항]

- 아래 실제조립 회로에서는 nRF24L01 어뎁터 소켓을 연결하여 사용하였다. 별다른 큰 차이는 없으며 3.3V 전원을 사용하지 않고 동일하게 5V전원으로 연결시키기 위한 차이 일뿐으로, 소켓을 사용하지 않아도 무방하다.

- "1. 조이스틱송신기"회로의 전원은 9V 베터리를 사용하여도 관계 없으나, "2. 서보모터-수신기"회로쪽은 서보모터 구동에 충분한 전류공급이 필요함으로, AA건전지 x 4개(총합 6V)  혹은 18650 x 2개(총합 7.4V) 를 연결하여야 동작이 원활할 것이다. (참고로, 아두이노 Vin 단자의 입력 전압은 최소6V, 권장7V이상이다.  또한 9V 사각 건전지는 전압은 높으나 출력 전류가 낮기 때문에 모터구동 회로 전원으로는 적합하지 않다.-동작이 잘 되지 않는다.)  

1. AA battery  x 4 개 (총 6V)

2. 18650 battery x 2 개 (총 7.4V)

(18650 베터리는 AA소켓에 들어가지 않으니 별도의 18650소켓이 필요하며, 18650도 충전보호회로가 들어 있는 것과 들어 있지 않은 18650 베터리가 따로 존재한다. 따라서 충전보호회로가 들어 있는 베터리를 사용한다면, 소켓도 거기에 맞는 좀더 큰 소켓이 필요하다.   본 영상에서는 충전보호회로가 들어 있지 않은 베터리와 소켓을 사용하였으며, 충전은 따로 18650 전용충전기로 충전하면 별문제 없다.)

 

▶ 실습목표  :  

    1. nRF24L01 모듈 사용법을 익힐 수 있다.

    2. nRF24L01 모듈을 이용한 RF 무선 통신 모듈에 대해 익힐 수 있다.

    3. 조이스틱을 이용하여 서보모터 2대를 회전(제어) 할 수 있다. 

    4. 구조체(코딩)의 기본 개념을 이해하고 데이터를 분리 처리할 수 있다.

 

▶ : 코딩

코딩에 앞서, 'nRF24' 관련 라이브러리 파일이 필요하다. 이를 깃허브를 통해 다운 받거나 아래 첨부파일로 다운받아서, 아두이노에서 추가해주어야 한다. 

( 스케치IDE : 스케치 》 라이브러리 포함하기 》 .ZIP 라이브러리 추가 》 다운받은 라이브러리 선택.  끝 ) 

RF24-master.zip
0.36MB

깃 허브 직접 다운로드 :  https://github.com/nRF24/RF24

 

《송신기 코드》 아래 코드를 송신용 아두이노에 업로드 시킨다.

#include  <SPI.H>
#include  <nRF24L01.h>
#include  <RF24.h>
RF24 radio(7, 8);           // SPI통신을 위한 (CE, CSN) 핀 선언  
const byte address[6] = "00001"; // 송신기와 수신기를 동일한 값으로 주소 설정함(5자리)
int x_key = A0;                                               
int y_key = A1;                                               
int x_pos;
int y_pos;
struct Data {    // 구조체 영역(조이스틱의 상하값joyX와 좌우값joyY 구조화)
  byte joyX;
  byte joyY;
};
Data data;  // 구조체 선언

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.setAutoAck(false);//수신단의Ack신호를 받을때까지 계속송신하는기능OFF(전력소모줄임)
  radio.openWritingPipe(address);  // 데이터를 보낼 수신 주소를 설정
  radio.setPALevel(RF24_PA_LOW); // 송신거리에 따른, 전원공급 파워레벨 설정 
//(최소)RF24_PA_MIN→RF24_PA_LOWRF24_PA_HIGHRF24_PA_MAX (최대)설정가능 
//송신이 약하다고 판단될 경우 nRF24모듈의 GND와 3.3V 단자에 전해콘덴서(10uF이상:+를3.3V연결)사용권장 
  radio.stopListening();    // 모듈을 송신기로 설정
}

void loop() {
  data.joyX = map(analogRead(x_key),0,1023,0,179);  
  data.joyY = map(analogRead(y_key),0,1023,0,179);
  Serial.println(data.joyX);
  Serial.println(data.joyY);
  radio.write(&data, sizeof(Data));
  delay(100);
}

 

《수신기 코드》 아래 코드를 수신용 아두이노에 업로드 시킨다.

#include  <SPI.H>
#include  <nRF24L01.h>
#include  <RF24.h>
#include  <Servo.h>
Servo servo1,servo2;
RF24 radio(7, 8);  // SPI통신을 위한 (CE, CSN) 핀 선언 
const byte address[6] = "00001"; // 송신기와 수신기를 동일한 값으로 주소 설정함(5자리)
int servo1_pin = 6;       // 서보모터 1, 연결 핀
int servo2_pin = 5;       // 서보모터 2, 연결 핀
struct Data {        // 구조체 영역(조이스틱의 상하값joyX와 좌우값joyY 구조화)
  byte joyX;
  byte joyY;
};
Data data;    

void setup() {
  Serial.begin(9600); 
  radio.begin(); 
  radio.setAutoAck(false);
  servo1.attach (servo1_pin);
  servo2.attach (servo2_pin); 
  radio.openReadingPipe(0, address);   
  radio.setPALevel(RF24_PA_LOW);
  radio.startListening();               // 모듈을 수신기로 설정함
}

void loop() {
  while (radio.available()) {
    radio.read(&data, sizeof(Data));    
      servo1.write (data.joyX);         // 구조체 변수 데이터 구분하여 출력
      servo2.write (data.joyY); 
      Serial.println(data.joyX);         // 시리얼 모니터로 확인   
      Serial.println(data.joyY);
      delay(50);
  }  
}

 

▶ 코드 다운로드 : 

03 nRF24Joy2Servo.zip
0.00MB

 

▶ 회로 동작(설명) 영상 :

(YouTube : 1080P 고화질로 보기)

https://youtu.be/XwUVahAWue4

 

(카카오로 보기)

 

 

※ 18650과 같은 리튭배터리는 직접적인 합선(쇼트)이나  회로내에서의 합선 등에 의해 불꽃과 소폭발의 가능성이 있는 제품이므로 다루실 때 충분한 주의와 사전지식이 필요하니 주의하시기 바랍니다.

반응형
반응형

 

※ 18650과 같은 리튭배터리는 직접적인 합선(쇼트)이나  회로내에서의 합선 등에 의해 불꽃과 소폭발의 가능성이 있는 제품이므로 다루실 때 충분한 주의와 사전지식이 필요하니 주의하시기 바랍니다.

 

【 아두이노모듈#20 nRF24L01  조이스틱으로 서보모터 무선 제어하기! 

지난시간 nRF24L01 모듈을 이용하여 두 대의 아두이노 보드간의 통신 실습을 진행하였다.  간단한 문자를 송신하고 수신측에서는 시리얼모니터를 통해 문자가 잘수신되는지 확인하는 기본적인 실험이었다. 이번엔 "조이스틱을 이용해서 앞뒤로 움직이면 서보모터가 0도~180도 회전하도록 구현해보자.  매우 흥미로울 것이다. 

 Let's get it~!

 

▶ 선수학습 :

    1. [아두이노 모듈#14] 조이스틱 Joystick 사용하기 #1 ☜ (클릭)

    2. [아두이노 모듈#19] 2.4G RF 무선통신 하기! (nRF24L01 기본사용법)  ☜ (클릭)

 

▶ 실습 회로 도면 :

(1. 조이스틱-송신기회로)

(조이스틱-송신쪽 연결도면)

 

(2. 조이스틱-수신기회로)

(서보모터-수신쪽 연결도면)

[ 특이(주의) 사항]

- 아래 실제조립 회로에서는 nRF24L01 어뎁터 소켓을 연결하여 사용하였다. 별다른 큰 차이는 없으며 3.3V 전원을 사용하지 않고 동일하게 5V전원으로 연결시키기 위한 차이 일뿐으로, 소켓을 사용하지 않아도 무방하다.

- "1. 조이스틱송신기"회로의 전원은 9V 베터리를 사용하여도 관계 없으나, "2. 서보모터-수신기"회로쪽은 서보모터 구동에 충분한 전류공급이 필요함으로, AA건전지 x 4개(총합 6V)  혹은 18650 x 2개(총합 7.4V) 를 연결하여야 동작이 원활할 것이다. (참고로, 아두이노 Vin 단자의 입력 전압은 최소6V, 권장7V이상이다.  또한 9V 사각 건전지는 전압은 높으나 출력 전류가 낮기 때문에 모터구동 회로 전원으로는 적합하지 않다.-동작이 잘 되지 않는다.)  

1. AA battery  x 4 개 (총 6V)

2. 18650 battery x 2 개 (총 7.4V)

(18650 베터리는 AA소켓에 들어가지 않으니 별도의 18650소켓이 필요하며, 18650도 충전보호회로가 들어 있는 것과 들어 있지 않은 18650 베터리가 따로 존재한다. 따라서 충전보호회로가 들어 있는 베터리를 사용한다면, 소켓도 거기에 맞는 좀더 큰 소켓이 필요하다.   본 영상에서는 충전보호회로가 들어 있지 않은 베터리와 소켓을 사용하였으며, 충전은 따로 18650 전용충전기로 충전하면 별문제 없다.)

 

▶ 실습목표  :  

    1. nRF24L01 모듈 사용법을 익힐 수 있다.

    2. nRF24L01 모듈을 이용한 RF 무선 통신 모듈에 대해 익힐 수 있다.

    3. 조이스틱을 이용하여 서보모터를 회전(제어) 할 수 있다. 

 

▶  :코딩

코딩에 앞서, 'nRF24' 관련 라이브러리 파일이 필요하다. 이를 깃허브를 통해 다운 받거나 아래 첨부파일로 다운받아서, 아두이노에서 추가해주어야 한다. 

( 스케치IDE : 스케치 》 라이브러리 포함하기 》 .ZIP 라이브러리 추가 》 다운받은 라이브러리 선택.  끝 ) 

RF24-master.zip
0.36MB

깃 허브 직접 다운로드 :  https://github.com/nRF24/RF24

 

《송신기 코드》 아래 코드를 송신용 아두이노에 업로드 시킨다.

#include  <SPI.H>
#include  <nRF24L01.h>
#include  <RF24.h>
RF24 radio(7, 8);    // SPI통신을 위한 (CE, CSN) 핀 선언  
const byte address[6] = "00001";  // 송신기와 수신기를 동일한 값으로 주소 설정함(5자리) 

int x_key = A0;                                               
int y_key = A1;                                               
int x_pos;
int y_pos;

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.setAutoAck(false); //수신단의 Ack신호를 받을 때까지 계속 송신하는 기능OFF(전력소모줄임)
  radio.openWritingPipe(address);  // 데이터를 보낼 수신 주소를 설정 
  radio.setPALevel(RF24_PA_MIN); // 송신거리에 따른, 전원공급 파워레벨 설정 
//(최소)RF24_PA_MIN → RF24_PA_LOW  RF24_PA_HIGH  RF24_PA_MAX (최대)설정가능 
//송신이 약하다고 판단될 경우 nRF24모듈의 GND와 3.3V 단자에 전해콘덴서(10uF이상:+를3.3V연결)사용권장 
  radio.stopListening();      // 모듈을 송신기로 설정 
}

void loop() {
  x_pos = analogRead (x_key) ;   // 조이스틱의 상하 움직입값 저장
  y_pos = analogRead (y_key) ;   // 조이스틱의 좌우 움직임값 저장 
  radio.write(&x_pos, sizeof(x_pos));  // 조이스틱의 값을 RF모듈을 통해 데이터 길이만큼 전송 
  Serial.println(x_pos);
  Serial.println(y_pos);
  delay(100);

 

 

 

《수신기 코드》 아래 코드를 수신용 아두이노에 업로드 시킨다.

#include  <SPI.H>
#include  <nRF24L01.h>
#include  <RF24.h>

#include  <Servo.h>
Servo servo;
RF24 radio(7, 8);     // SPI통신을 위한 (CE, CSN) 핀 선언  
const byte address[6] = "00001";  // 송신기와 수신기를 동일한 값으로 주소 설정함(5자리) 
int servo_pin = 6;   // 서보모터가 연결된 핀 설정

void setup() {
  Serial.begin(9600); 
  radio.begin(); 
  servo.attach (servo_pin ) ; 
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN); // 송신거리에 따른, 전원공급 파워레벨 설정 
//(최소)RF24_PA_MIN → RF24_PA_LOW  RF24_PA_HIGH  RF24_PA_MAX (최대)설정가능 
//송신이 약하다고 판단될 경우 nRF24모듈의 GND와 3.3V 단자에 전해콘덴서(10uF이상:+를3.3V연결)사용권장 
  radio.startListening();   // 모듈을 수신기로 설정함
}

 

void loop() {
  if (radio.available()) {   
    int x_pos ;
    radio.read(&x_pos, sizeof(x_pos));  // 조이스틱의 값을 RF모듈을 통해 데이터 길이만큼 읽음 
    Serial.println(x_pos);
    x_pos = map(x_pos, 0, 1023, 0, 179); // 수신 데이터 값을 서보모터가 움직일 수 있는 값으로 맵핑(180도)
    if (x_pos>400 && x_pos<600)  {      // 오류가 날 수 있는 값에 대한 처리 
    }
    else{
      servo.write (x_pos) ;
    }
  }
}

▶ 코드 다운로드 : 

02 nRF24_Joy_Servo.zip
0.00MB

 

▶ 회로 동작(설명) 영상 :

(YouTube : 1080P 고화질로 보기)

https://youtu.be/dCoZAOlSVRM

(카카오로 보기)

 

 

반응형
반응형

【 아두이노모듈#19 nRF24L01 :  2.4G RF 무선통신 하기! ( Arduino 통신 ) 

 nRF24L01 모듈을 이용하여 RF 무선 통신을 해보자.  블루투스통신의 경우 통신거리가 10m 내외로 짧지만, nRF24 모듈은 2.4GHz 대 주파수를 사용한 통신으로 보통 100m 까지도 통신이 가능하다. 안테나가 달린 모듈을 사용할 경우 800까지도 가능하다. 


(기본 모듈의 경우 통신거리 스펙 : 250kbps의 속도로 ~250m까지,  실제 : 100m 정도,
 외장 안테나 달린 모듈 스펙 :  250kbps의 속도로 ~1.1km까지,  실제 : 800m 정도)   

 오늘은 기본적인 연결방법과 간단한 데이터(문자)를 송수신 하는 것을 다루고, 차후에는 무선 RC기기를 컨트롤 해보려고 한다. 

 Let's get it~!

 

▶ nRF24L01 에 대해 :

 nRF24L01모듈은 기본적으로 2.4GHz 대역을 사용하는 RF(Radio Frequency)통신 모듈이다. 

이 모듈의 장점은 Bluetooth, ZigBee, NFC 모듈에 비해 가격이 매우 저렴하고 통신 가능 거리가 긴 것이 장점이다. 

 단점은, RF통신의 특성상 중간에 벽과같은 장애물이 있을 경우 수신율이 많이 떨어질 수 있다.

Image from. howtomechatronics.com

- NRF24L01 모듈은 기본적으로 다대 다 통신이 가능하며, 1MHz 간격으로 125개의 주파수 채널을 운영할 수 있고, 1대 다 통신도 가능하다.   선택적 통신을 위해 5자리의 Address(주소)를 사용한다. 

 

기본적으로 위 모듈의 VCC 단자에는 1.9V~3.6V 입력만 가능하다, 따라서 아두이노 우노에 직접연결하고자 할 경우 반드시 3.3V 출력단자에 연결해야하니 주의가 필요하다.  만약 5V단자에 연결할 경우 nRF24L01 모듈의 손상을 피할 수 없다. 

 그런데, 아래 이미지의 nRF24L01 어뎁터 소켓을 사용하면,  3.3V 레귤레이터가 내장 되어 있어 아두이노의 5V 전원단자에 연결 할 수 있다. 

 소켓을 사용하면 좋은 다른 이유는, 복제(클론) 아두이노 보드나 다른 메이커의 아두이노 보드들 중 3.3V 출력에 사용되는 레귤레이터를 용량이 작은 것으로 사용하고 있는 것들이 더러 있어서 nRF24L01 모듈을 소켓없이 3.3V 단자에 연결하여 사용할 경우 동작이 잘 안 되는 경우가 더러 있기 때문인데, 소켓을 사용하여 5V 단자에 연결하면 이런 경우를 예방할 수 있다. 

이유는 메이커 업체들이 5V 단자를 주로 사용하게 되는 아두이노 보드에서 3.3V단자는 잘 사용하지 않기 때문에 비용절감을 위해 좀더 저용량?의 저렴한 3.3V 레귤레이터를 사용하려 하기 때문일 것이다. 

 그런데, 당장 소켓을 구할 수 없을 때는 어떻게 할 것인가? 그럴때는 아래 소켓의 설명처럼, nRF24L01 모듈의 +,- 단자 사이에 10uF 이상의 전해콘덴서를 납땜하여 전원보강을 해주면 이런 문제는 해결 될 것이다. 

nRF24L01 Adapter Socket
nRF24L01을 어뎁터 소켓에 장착한 모마

또한 송수신율을 높여주기 위해 필요한 경우 아래와 같은 커패시터(전해콘덴서-약 10uF이상) 를 VCC-GND단자 사이에 연결해주면 도움이 될 수 있다. 커패시터는 전기를 모아서 내보낼 수 있는 충방전 기능이 있어 출력을 보완해주어 전원을 안정시켜줄 수 있으며, 노이즈를 제거를 위해 바이패스용으로 세라믹 콘덴서를 함께 달 수도 있다.

위 모듈은 일반적으로 탁트인 공간에서 100m 정도 송수신이 가능하다.  그런데 그 이상의 통신거리가 필요하다면, 아래와 같은 안테나가 달린 모듈을 사용하면, 이론상 800m까지도 가능하다.

 

근본적으로 원거리 통신이 필요하다면, 아래 《nRF20L01 PA-LNA 외장 안테나 모듈》을 사용하면 된다.

 

▶ 실습 회로 도면 :

(송신기 아두이노 회로와 수신기 아두이노 회로를 동일하게 구성한다)

▶ 실습목표  :  

    1. nRF24L01 모듈 사용법을 익힐 수 있다.

    2. nRF24L01 모듈을 이용한 RF 무선 통신 모듈에 대해 익힐 수 있다.

    3. 아두이노 시리얼 모니터를 통해 간단한 문자를 송수신 할 수 있다 

 

▶ 코딩 :

코딩에 앞서, 'nRF24' 관련 라이브러리 파일이 필요하다. 
이를 깃허브를 통해 다운 받거나 아래 첨부파일로 다운받아서, 아두이노에서 추가해주어야 한다.

( 스케치IDE : 스케치 》 라이브러리 포함하기 》 .ZIP 라이브러리 추가 》 다운받은 라이브러리 선택.  끝 ) 

RF24-master.zip
0.36MB

깃 허브 직접 다운로드 :  https://github.com/nRF24/RF24

 

《송신기 코드》 아래 코드를 송신용 아두이노에 업로드 시킨다.

 

#include  <SPI.h>
#include  <nRF24L01.h>
#include  <RF24.h>
RF24 radio(7, 8); // SPI통신을 위한 (CE, CSN) 핀 선언
const byte address[6] = "00001"; // 송신기와 수신기를 동일한 값으로 주소 설정함(5자리)
void setup() {
  radio.begin();
  radio.openWritingPipe(address); // 데이터를 보낼 수신 주소를 설정
  radio.setPALevel(RF24_PA_MIN); // 송신거리에 따른, 전원공급 파워레벨 설정
//(최소) RF24_PA_MIN → RF24_PA_LOW  RF24_PA_HIGH  RF24_PA_MAX (최대) 설정가능
//송신이 약하다고 판단될 경우 nRF24모듈의 GND와 3.3V 단자에 전해콘덴서(10uF이상:+를3.3V연결)사용권장

  radio.stopListening();  // 모듈을 송신기로 설정
}
void loop() {
  const char text[] = "(From) nRF24 Tx : Hello World!"; // 송신할 문자
  radio.write(&text, sizeof(text));   // 위 문자를 문자 길이 만큼 송출함
  delay(1000);
}

 

《수신기 코드》 아래 코드를 수신용 아두이노에 업로드 시킨다.

#include  <SPI.h>
#include  <nRF24L01.h>
#include  <RF24.h>
RF24 radio(7, 8);     // SPI통신을 위한 (CE, CSN) 핀 선언
const byte address[6] = "00001"; // 송신기와 수신기가 동일한 값으로 주소 설정함(5자리)
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);  // 데이터를 받을 송신기 주소를 설정
  radio.setPALevel(RF24_PA_MIN);   // 송신거리에 따른, 전원공급 파워레벨 설정
//(최소) RF24_PA_MIN → RF24_PA_LOW  RF24_PA_HIGH  RF24_PA_MAX (최대) 설정가능 
//송신이 약하다고 판단될 경우 nRF24모듈의 GND와 3.3V 단자에 전해콘덴서(10uF이상:+를3.3V연결)사용권장 
  radio.startListening();   // 모듈을 수신기(상태)로 설정
}
void loop() {
  if (radio.available()) {
    char text[32] = "";   // 데이터를 수신 받을 변수 설정
    radio.read(&text, sizeof(text));  // 수신되는 데이터 길이만큼 읽어 저장
    Serial.println(text);
  }
}

▶ 코드 다운로드 : 

nRF24 송신-수신 코드.zip
0.00MB

 

▶ 회로 동작(설명) 영상 :

(YouTube : 1080P 고화질로 보기)

https://youtu.be/5Q_yJY5bj4w

 

(카카오로 보기)

 

반응형
반응형

【 아두이노모듈#18】아두이노 2대 블루투스 통신: 볼륨(Var)으로 서보모터 제어! (HC-05

 지난시간 블루투스 모듈을 이용하여 간단히 스위치(LED On/Off)제어 실습을 해보았다. 이제부터는 본격적으로 좀더 다양하고 활용도가 높은 것들을 제어 해보도록 하자. 

 이번시간에는 가변저항(Variable Resistor)을 돌려 저항값을 변화 시키면 블루투스로 페어링(연결)된 아두이노 회로2의 서보모터를 작동 시켜볼 것이다.   더불어 가변저항을 돌릴 때 변화되는 모습을 눈으로 직관할 수 있도록 LED도 달아 보았다. 

 선이 없는 무선은 자유로움과 함께 흥미로움도 한 층 끌어 올려 줄 것이다.  그럼,  Let's get it~!

 

▶ 선수 학습 :

   1. [아두이노모듈#16] 아두이노 2대로 블루투스통신! (블루투스 기본설정법)  ☜ (클릭)

   2. [아두이노기초#17] 아두이노 블루투스 ... LED On/Off 제어(블루투스 기초사용법)  ☜ (클릭)

   3. [아두이노에러해결#4] 서보모터 떨림 현상해결 (서보모터&블루투스 에러 대처)  ☜ (클릭)

 

▶ 실습 회로 도면 :

【회로 1- 서보모터-Slave 회로】

 

【회로 2- Var-LED-Master 회로】

 

▶ 실습목표  :  

    1. 블루투스 모듈(HC-05,06)의 설정과 사용법에 대해 익힌다. (페어링, 기타 설정법)

    2. 블루투스 상호간 통신을 이해하고, 이를 이용해 아두이노 상호간 데이터를 주고 받거나 제어할 수 있다.

    3. 블루투스 통신을 통해 서보모터의 회전(위치)제어를 할 수 있다(블루투스 데이터 처리법 등)

 

▶ 실습절차  :  

   1.  위 회로 1의 도면을 보고 회로를 구성하라. "회로1"의 HC-05 모듈은 'Slave' 모드로 설정한다. 

   2.  위 회로 2의 도면을 보고 회로를 구성하라. "회로2"의 HC-05 모듈은 'Master' 모드로 설정한다.  

   3.  아래에 있는 각각의 아두이노 코드를 보고, 작성하거나 다운받아 각각의 아두이노에 업로드 한다. 

   4.  '회로1'과 '회로2'에 전원을 공급하고 인접하게 두 면 페어링(연결)에 성공한다.

   5. '회로2'의 VAR(가변저항)의 레버를 손으로 돌리면 저항값이 변화되고, 변화되는 정도에 따라 LED 밝기가 변하며, 그 값을 블루투스 모듈을 통해 전송한다. 

   6.  '회로1'에서는 블루투스 데이터를 전달 받아서 서보모터가 범위 영역에서 잘 회전을 하는지 확인 한다. 

   7.  아래 코드는 기본 제어 코드에서 서보모터의 떨림현상을 제어하기 위한 코드가 추가 되었다.  이 부분에 대해 확인 및 이해를 하고, 본인만의 제어 코드를 적용해 보라. ( 선수학습 3번, "... 서보모터 떨림 현상 해결편" 참조 ) 

▶ 코딩 :

 【 '코드 1'- 서보모터-Slave 회로】

/* 블루투스 LED버튼 켜기 & VAR-Servo Control [ Servo part ] */
/* 아두이노/라즈베리파이-IOT 교육자료는 Rasino.tistory.com   */
#include <SoftwareSerial.h>
#include <Servo.h>
#define servoPin 10
SoftwareSerial BTSerial(2, 3); // BTSerial(Rx, Tx)
Servo myservo;
int BTstates=0;       // 블루투스 신호 상태 저장용 변수
int currentVar=0 ;
int previousVar=0;
int readVar = 0;

void setup()  {
  Serial.begin(9600);
  BTSerial.begin(9600);  
  myservo.attach(servoPin);
  pinMode(servoPin, OUTPUT);
}

void loop()  {  
  if (BTSerial.available())  {    
  // --- 수신되는 Var 값을 체크 후 서보 모터 구동 루틴 ---
    currentVar=BTSerial.read();
    Serial.println(currentVar);      
      // 값을 ±4 이상의 변화에서만 모터가 작동되도록하여 떨림현상 제거(값 조정가능)
      if ((currentVar > previousVar+4) or (currentVar < previousVar-4)) {
        myservo.attach(servoPin);
        myservo.write(currentVar); 
        delay(35); 
        previousVar = currentVar;        
    }   
    myservo.detach();   // 서보 모터 정지
  } 
}

 

 【 '코드 2'- VAR_LED-Master 회로】

/* 가변저항으로 서보모터 구동하기 with 블루투스 [VAR part]   */ 
#include  
#define LED 10 
#define VAR A0 
SoftwareSerial BTSerial(2, 3); // BTSerial(Rx, Tx) 
int brightness = 0; 
int readVar = 0; 

void setup()  { 
  Serial.begin(9600); 
  BTSerial.begin(9600);   
  pinMode(LED, OUTPUT); 
} 
void loop()  { 
//--- VAR 값을 체크 후 LED Fade In/Out과 서보모터 구동용 BT신호 발송  
  readVar = map(analogRead(VAR),0,1023,0,179); //서보모터 각도(0~180도) 
  brightness = map(analogRead(VAR),0,1023,0,255);//LED 밝기(0~255) 
  Serial.println(readVar); 
  Serial.println(brightness); 
  BTSerial.write(readVar);      
  analogWrite(LED, brightness);   
} 

 

▶ 아두이노 코드 다운로드 :

 

01_BT_LED_Servo.zip
0.00MB
02_BT_LED_VAR.zip
0.00MB

 

▶ 회로 동작 영상 :

(YouTube : 1080P 고화질로 보기)

https://youtu.be/LL-jOJ7VTcA

반응형
반응형

【 아두이노모듈#17】아두이노 2대로 블루투스 통신하여 LED ON/OFF 제어하기! (HC-05

 지난 시간 HC-05 모듈을 이용해서 블루투스 설정과 기본 페어링에 대해 학습해 보았다. 

 이번 시간 부터는 본격적으로 블루투스 상호간 통신을 활용한 응용작품 들을 구현해보고자 한다. 

선없이 무선으로 컨트롤 된다는 것은 매우 매력적이며, 관심과 흥미 또한 엄청나게 커질 것이다. 

 그 첫 시간으로 블루투스(회로) 기기 상호간 버튼제어를 해보려 한다. BT Master(회로)에서 버튼을 누르면, BT Slave(회로) 에서 LED가 켜지도록 할 것이다.  또한 그 반대도 가능하도록 두 회로 모두 버튼과 LED를 달아서, 동일한 회로 두개를 만들면 된다.   코딩도 마스터, 슬레이브 구분 없이 동일한 코드를 사용한다. 


 (단, 기계식의 버튼(스위치)을 사용하게 되면 , 예전에 다룬 것처럼 채터링 현상(바운싱)이 일어 나게 되니,  채터링 방지 루틴을 참고하여 넣을 것이다.   아래, 선수 학습 참조)   

Let's get it~!

 

▶ 선수 학습 :

   1. [아두이노모듈#16] 아두이노 2대로 블루투스통신! (블루투스 기본사용법)  ☜ (클릭)

   2. [아두이노기초#06] 채터링과 디바운스 (버튼의 바운싱 현상 제거)  ☜ (클릭)

 

▶ 실습 회로 도면 :

▶ 실습목표  :  

    1. 블루투스 모듈(HC-05,06)의 설정과 사용법에 대해 익힌다. (페어링, 기타 설정법)

    2. 블루투스 상호간 통신을 이해하고, 이를 이용해 아두이노 상호간 데이터를 주고 받거나 제어할 수 있다.

 

▶ 실습절차  :  

    1. 위와 같은 회로 두 개를 만들고, "회로1"의 HC-05 모듈은 Master 모드로 설정한다. 

    2. "회로2" 의 HC-05 모듈은 Slave 모드로 설정하고 아래 코드를 업로드 한다. 

    3.  '회로1'과 '회로2'에 전원을 공급하고 인접하게 두 면 페어링(연결)에 성공한다.

    4. '회로1'의 스위치를 누르면  숫자 '1'이 블루투스 모듈을 통해 '회로2'로 전달 되며, '회로2'에서는
        전달받는 신호('1')가 있을 경우 LED를 ON 시킨다.    그 반대의 경우도 동일하게 동작하여야 한다. 

    5. '회로1'에서 스위치를 누를 경우 '회로1' 에 있는 자신의 LED도 'SW 누름 확인'을 위해 한 번 깜빡이도록 한다.('회로2'에서도 마찬가지)

    6. 채터링(스위치의 기계적 다중 접점에 의한 바운싱 현상) 현상 해결을 위해 바운싱 방지 알고리즘을 적용한다.
       (선수학습 참조)

 

▶ 회로 동작 영상 :

 

▶ 아두이노 코드 :   (아래코드를 동일하게 만든 두 개의 회로에 각각 업로드 한다)

 

/* LED_SW On-Off  블루투스 Master/Slave code        */

#include  <SoftwareSerial.h>
#define SW 12 
#define LED 11
#define bounceTimer 200   
// 바운싱 카운트 200으로 설정 
u8 keyState = HIGH;   
// 버튼의 상태 저장용 변수
u8 bounceCount = 0; 
// 바운스 변수 선언
SoftwareSerial BTSerial(2, 3); 
// BTSerial(Rx, Tx)
int BTstates=0;         
// 블루투스 신호 상태 저장용 변수

void setup()  {
Serial.begin(9600);
BTSerial.begin(9600);  // 자신의 BT모듈의 설정값으로 변경 할 것
pinMode(SW, INPUT);
pinMode(LED, OUTPUT);
}

void loop()  {
// ---- 버튼 바운싱에러 방지 코드와 블루투스 신호 발신 영역 ----
  u8 key = digitalRead(SW); 
// 버튼 값 읽어 key변수에 저장
  if(key == HIGH)  {          
// 버튼이 눌러졌다면
    if(keyState == LOW) {     
// 이전의 버튼 상태가 LOW 였었다면
          if(bounceCount == 0) {  
            bounceCount = bounceTimer;   
            Serial.println("Push");          
            BTSerial.write('1'); 
// 버튼이 눌러졌으니,블루투스를 통해1을 전송
            digitalWrite(LED, HIGH); 
//버튼 눌림 확인용 LED On
            delay(100);
            digitalWrite(LED, LOW); 
//버튼 눌림 확인용 LED Off
            keyState = key;   
// 현재의 키값 저장
          }  
          else {
              bounceCount --; 
//  바운스 카운트 값 감소
          }      
    }    
  }    
  else{                          
 // 버튼이 안 눌러졌었다면
    if(keyState == HIGH)  {    
// 이전의 상태가 눌린 상태였다면
      Serial.println("Pull");    
 // 버튼을 놓은(Pull) 것임 
      keyState = key;   }     
 // 놓은(Pull)버튼 상태 저장
  }

//--- 수신되는 블루투스 신호 체크 후 LED ON/OFF 루틴 ---
  if (BTSerial.available())
  {
    char str=BTSerial.read();
    if (str=='1')
    {
      BTstates=!BTstates;
      Serial.println(str);
      digitalWrite(LED, BTstates);
    }    
  } 
}

 

▶ 아두이노 코드 다운로드 :

02_LEDSW_MS.zip
0.00MB

 

▶ 전체 과정 영상 :

(YouTube 1080P로 보기)

https://youtu.be/NqZV7kYnl-I

 

(카카오)

 

반응형
반응형

【 아두이노모듈#16】아두이노 2대로 블루투스 통신하기! (HC-05

 아두이노 두 대 상호간 통신을 통해 데이터를 서로 주고 받을 수 있는 방법이 있다. 바로 블루투스 모듈인 BlueTooth module (HC-05 또는 HC-06)를 이용하면 된다. 

 다르게 이야기 해서, 아두이노 RC Car가 있고, 이를 유선이 아닌 무선으로 제어하고자 할 때 블루투스 모듈을 이용하면 제어가 가능하다. 

우선 두 대의 아두이노+블루투스 모듈 서로간 기본 통신법에 대해 다루고자 한다.  차 후에는 RC 카에 적용하여, 무선으로 제어 해보고자 한다. 
 해보면 알겠지만, 블루투스 모듈 제어가 다소 까다롭다. 영상처럼 단번에 되지 않을 것이다. 절차와 조건이 잘 맞아야 하니,  차분하게 글과 영상을 보면서 따라 해본다면, 문제가 생겨도 충분히 해결해 나갈 수 있을 것이다.

Let's get it~!

 

▶ BT(BlueTooth) 모듈 설명 :

 

 블루투스 모듈은 크게, 통신규격 버전에 따라 '2.0버전 모듈'과 '4.0버전 모듈'이 있고, 저전력으로 동작되는 '4.0 BLE 모듈(HM-10)' 등이 있다. 
그리고, 2.0 모듈(혹은 2.0 이하 버전) 중에서는 크게 HC-05 와 HC-06 모델이 대표적이다. 
이번에 다룰 블루투스는 2.0 제품군이고, 그 중에서 HC-05모듈을 중심으로 다루고자 한다.  HC-06 모듈도 방법적으로 조금의 차이가 있겠지만, HC-05 모듈을 잘 다루어 본다면, 크게 어렵지 않을 것이다. 

 그리고 중요사항으로 HC-05 모듈과 HC-06 모듈의 초기 설정값(공장 초기값)은 아래와 같다. (단, 펌웨어 버전에 따라 다를 수 있음)

HC-05 모듈과 HC-06 모듈의 초기 설정값

 HC-05와 HC-06의 외관상 큰 차이점은, 외부 버튼 스위치가 있고 없고의 차이가 있다. 또한 핀수가 각각 6핀과 4핀이다. (HC-06이 6핀도 있음)  HC-05모듈은 기본 슬레이브로 설정되어 있지만 AT명령어 모드에서 마스터로 변경이 가능하지만,  HC-06모듈은 슬레이브 모드만 지원된다.   
※ 주의해야할 것은 서로 통신하기 위해서는 하나는 마스터(Master), 하나는 슬레이브(Slave)로 설정되어야 페어링(연결) 되면서 통신이 가능해진다.  따라서 블루투스 모듈끼리 통신을 위한 회로를 구성할 때는 기본적으로 HC-05모듈 하나가 있어야 한다.

그런데, HC-06모듈의 펌웨어 버전이 1.7 이상에서는 AT명령으로 마스터 모드 설정이 가능한데, 펌웨어 3.0 이상에서는 전송옵션(시리얼모니터 설정)도 Both NL & CR로 변경되었다.  

 [ ※ HC-05 모듈은, 최근에 출시 되는 제품의 경우 펌웨어 버전이 3.0 버전으로 출시 되고 있다. 2017.06.01 기준 ]

 모듈에 따른 블루투스 통신 방법은 , 

  1번. 'HC05 ↔ HC05' 

  2번. 'HC05 ↔ HC06' 

  3번. 'HC06 ↔ HC06'   이런 형태로 가능하다. 

 

[ HC-05 스팩 ]

- 칩셋 : CSR Bluetooth chip ,  Bluetooth V2.0 표준 프로토콜 사용

- 주파수 : 2.4GHz~2.8GHz  ISM band

- Serial UART 통신속도 : 4800~1382400Bps  지원

- 입력전압 : 3.6V~ 6V
- 페어링 거리 : 최대 10M (장애물 및 조건에 따라 짧아짐)

- 전력 : +3.3VDC 일때 50mA

- 소모전류 : 통신시(30~40mA),  대기시 (8mA)

- 동작온도 : -20℃ ~ 40℃

- 크기 : 26.9mm x 13mm x 2.2mm

- Password (Pin code) : 1234  (default)

[ 코드 작성 시 아래 통신속도 구분에 주의 할 것! : HC-05기준이며, 펌웨어 버전에 따라 달라질 수 있음]
- 블루투스 통신속도(default) : 9600bps
- AT명령어 모드 통신 속도(default) : 38400bps     


[ HC-05 마스터모드 설정 방법 ]
- 회로 연결 : 
 먼저 아래 연결도를 참고하여 연결하여야 한다.  다만 주의해야 할 것은 블루투스 모듈의 Rx단자에 입력되는 신호의 레벨은 3.3V여야 한다.  하지만 아두이노 포트의 출력은 5V레벨이기 때문에 3.3V레벨로 다운시켜 입력한다. 
여기서는 가장 손쉬운 레벨변환 방법인 1㏀저항과 2㏀저항을 이용한 전압분배 방법을 이용한다. 

만약, Vin 전압이 5V라면, 5V의  2/3 전압은 약 3.3V가 된다.(=Vout 출력 전압) 
즉, Vin에 아두이노 포트 출력(여기서는 3번 포트)을 연결하였을 때 5V 레벨의 High 신호는 Vout 으로 3.3V레벨의 신호로 낮추어 출력되며 이를 블루투스 수신단자 Rx로 입력되도록 하기 위함이다.
- 기본(default)은 슬레이브(Slave)모드로 설정되어 있으며, 마스터(Master)모드로 바꾸기 위해서는, AT 커맨드모드(Command mode-명령어모드)로 진입하여 설정하게 되어 있는데, 커맨트 모드 진입은 아래처럼 회로 연결을 하고 HC-05모듈에 붙어 있는 스위치를 이용하여 진입할 수 있다.  (경우에 따라 아두이노의 UART 통신단자인 0번, 1번 포트로 연결하여 작업이 가능하나, 0, 1 포트를 사용하게 되면 아두이노 프로그램 전송이 안 되어 번거로울 수 있다)



-위와 같이 회로 연결을 하였다면, HC-05모듈에 공급된 전원을 잠시 제거한 상태에서 HC-05모듈에 부착된 작은 스위치를 누르면서 전원 공급을 다시 넣어 준다. (이때, 스위치에서 손을 바로 떼지말고, 약 2초 정도 계속 눌러 준다)

- 그러면, 빠르게 깜빡이던 모듈의 LED가 2초 간격으로 깜빡이는 것을 확인 할 수 있을 것이다. 

그런 다음 아두이노 IDE의 시리얼 모니터 창을 열고 아래와 같은 AT 통신 명령어를 이용하여 마스터/슬레이브 설정과 여러가지 설정이 가능해진다. 

- 우선 아래와 같은 코드를 입력한다. 

----------------------------------------------------------------------------

#include  <SoftwareSerial.h>
SoftwareSerial myBT(2, 3); //BlueTooth(Rx, Tx)
void setup() {
  Serial.begin(9600);
  pinMode(7, OUTPUT);   //Enable 단자에 High 넣어줄 포트 
  digitalWrite(7, HIGH);
  Serial.println("Enter AT Commands: ");
  myBT.begin(38400);  // AT-커맨드 모드 통신속도는 38400입니다. 
}
void loop() {
  if (myBT.available())
    Serial.write(myBT.read());
  if (Serial.available())
    myBT.write(Serial.read());
}

----------------------------------------------------------------------------

▶ 아두이노 코드 다운로드 

BTSetup.zip
0.00MB

- 위 코드를 업로드시키고 아래와 같은 시리얼 모니터 창을 연다.

1. 성공적으로 AT 모드 진입시 ,  " AT ⏎ " 입력하면 아래처럼 OK 싸인이 뜬다.
만약, AT 명령어 입력시 OK 싸인이 뜨지 않는 다면, 아래 통신 속도를 확인해 보세요. 

[ 코드 작성 시 아래 통신속도 구분에 주의 할 것! : HC-05기준이며, 펌웨어 버전에 따라 달라질 수 있음]
- 블루투스 통신속도(default) : 9600bps
- AT명령어 모드 통신 속도(default) : 38400bps     
※ 따라서, AT명령어(커맨드) 모드를 위해 아두이노 코드에서 myBT.begin( )의 속도를 38400bps로 설정하여 업로드 하였는지? 확인해 보세요.

- 주의!  아두이노 코드와 시리얼 모니터의 통신 속도와 방법을 아래처럼 일치 시킨다.

 

2. 모듈의 버전 확인  :  AT+VERSION ⏎  

 

3. 모듈의 고유주소 확인 :  AT+ADDR 

 

4. 모듈의 마스터/슬레이브 모드 확인 :  AT+ROLE 

 

5. 마스터 모드로 변경하기 :  AT+ROLE=1  

 

(잘 변경 되었는지 확인 하기  :  AT+ROLE ⏎ )

(다시 슬레이브 모드로 전환하기 위해서는 : AT+ROLE=0 ⏎ )

 

 

6. 모듈의 이름 변경하기 :  AT+NAME= xxxx   

(이름 'RasinoHC05-Master' 로 변경한 경우)   default 값은 : 'HC-05' 되어 있음.

(이름 확인은 추후에 휴대폰 등의 블루투스 검색기능을 통하면 아래처럼 확인 가능함)

 

7. 패스워드 확인 및 변경  :  
 ( default 패스워드 값은 : 1234 이다.)
- 패스워드 확인 명령어 :  AT+PSWD? 
- 패스워드 변경 명령어 :  AT+PSWD=4321  (반드시“ ” 넣을 )

(값 변경 : AT+PSWD= xxxx ⏎ )  ,  아래는 4321로 변경한 예 
(혹은, 펌웨어 버전에 따라 " " 따옴표 없이 입력해 보세요)

(비번 변경확인 :  AT+PSWD ⏎ )

※ 이상과 같이 설정이 모두 끝난 후에는 아래 회로 처럼, 7번포트에 연결한 Enable 단자를 제거하고, HC-05모듈의 커맨드 모드 종료를 위해 전원을 제거후 다시 연결한다.  (HC-05의 LED가 다시 빠른 속도로 깜빡임)

 

※ 참고 :  여기까지는 HC-05의 펌웨어 2.0버전 기준이었으며,  거의 유사하나 약간의 명령어 차이 혹은 기능의 차이가 있는 3.0버전의 예시를 아래 간단히 출력하였으니 참고하시라. (3.0 버전에서는 소문자 입력X, 대문자만 가능)

(기타 상세한 명령어 설명은 아래 HC-05.PDF 파일을 참고)

 

8.  위와 같은 과정을 거쳐 하나는 "슬레이브 회로" 하나는 "마스터 회로" 두 가지를 준비한다. 

 

9. 두 가지 회로가 모두 준비 되면, 통신 확인을 위해 두 대의 PC(혹은 노트북)이 필요한데, 각각 하나씩 회로를 PC에 연결한다. 

10.  두 모듈 회로간 페어링(연결)은 각각 PC에 연결되어 전원이 공급되면 자동으로 페어링 된다. ( HC-05모듈의 LED가 커맨드 모드 일 때 처럼 2초 간격으로 깜빡이게 된다)   

 

11. 통신확인은,  PC-A의 시리얼 모니터 창에서 숫자 1을 입력하면, PC-B의 시리얼 모니터 창에 숫자 1이 나타나고 그 반대도 가능하다) 
아래와 같이, 마스터 회로와 슬레이브 회로 두 가지를 준비하고 실습한다. 이때, En 단자는 연결하지 않으며, 블루투스 모듈의 보호를 위해 분배저항을 반드서 넣어서 작업한다. 

【 ※  전체 과정 영상으로 익히기 

▷ 유튜브로 보기 (1080P 지원)

https://youtu.be/p7bhIBFFymw

 

▷ 카카오로 보기

 

 

[ Trouble Shooting - 문제해결 ]

※ 분명 똑같이 한 것 같은데, 영상에서 처럼 동작이 안 될 경우가 있을 것이다.  아래 몇 가지 사항을 체크 해보자.

 

[ 블루투스 페어링(연결)의 기본 조건 :  1. 마스터와 슬레이브 상호간 연결됨,  2. 두 개의 블루투스 모듈의 비번(pin번호)이 같아야함 (default : 1234) ] 

 

1. 모듈 사양과 버전 확인  :  HC-05 인지? HC-06인지?  혹은 펌웨어 버전 확인

  같은 HC-05 모듈이라 하더라도, 펌웨어 버전에 따라, 명령어가 조금씩 차이가 있다. 

  예),  펌웨어 버전 2.0에서는 소문자 대문자 구분 없이 적용되나, 펌웨어 3.0에서는 대문자만 적용됨.

       고유 주소:  3.0 버전에서는 18:E4:400006 형태로 나옴, 

 

 

2. 초기 AT 커맨드 모드로 진입에 성공해야 통신속도 등 여러가지 설정이 가능하다.  
  ( 시리얼 모니터 창에 "Enter AT Commands: " 메세지가 뜬다고,  AT 모드로 진입이 성공 한 것이 아니다.  보드가 PC에 연결만 되면, 무조건 출력 되도록 코딩 되어 있다.   AT모드는, 명령어 창에, AT를 입력하면 'OK' 싸인이 떠야 한다.  그외에 마스터 슬레이브 명령어 등등 처리시 'OK' 신호가 떠야 하니, AT모드 진입 부분을 다시 살펴 보기 바란다. ) 

코드의 Serial.begin(9600) 와 시리얼 통신창의 9600 baud 속도가 일치해야 한다. (BT모듈의 통신속도와는 별개임)

주의, HC-05 모듈은 시리얼모니터 입력 형태를 "Both NL&CR" 로 해주고,

        HC-06 모듈은 시리얼모니터 입력 형태를 "No line ending"으로 맞추어 주어야 한다.

 

3. 가장중요한 보드레이트(Baud late:통신속도)를 맞추어야 한다. BT마스터 모듈과 BT슬레이브 모듈의 설정된 통신속도와 코드의 통신속도가 동일하게 되어 있는지 확인해야 한다.  예) myBT.begin(xxxx)  , HC-05마스터, HC-05슬레이브, 이 세 개의 통신 속도가 일치 되어야 함.   
   단,  코드에서 Serial.begin(xxxx) 통신속도는 시리얼 모니터 창의 통신속도 하고만 맞추면 문제 없다. 

 - HC-05의 경우 기본적으로(default) UART 통신속도가 9600에 맞추어져 있으며(경우에 따라, 38400도 있음) 

 - HC-06의 경우 기본적으로(default) 9600에 맞추어져 있다. 

   단, 펌웨어 버전에 따라 위와 같지 않을 수 있음으로 코드내에서 9600과 38400을 바꾸어 입력해가며 테스트 해볼 것.

 

4. 마스터 모듈 설정이 되어 있는가?  

  - 블루투스 모듈이, 슬레이브 모듈끼리는 페어링이 되지 않는다.  반드시 모듈하나는 마스터로 설정이 되어야 페어링(연결) 된다.

 

5. AT 명령어 입력 방법 :

 AT 명령어 형식이 블루투스 모듈 혹은 펌웨어 버전에 따라 상이할 수 있다. 여러 형태로 시도해보기 바란다.

예를 들어)  패스워드 변경 명령어 입력시,  아래처럼 여러 형태로 입력 해보기 바란다.

 1.  AT+PSWD=1234  

 2.  AT+PSWD:"1234" 

 3.  AT+PSWD=1234? 

 

※ 주요 AT 관련 명령어(HC-05 기준)

AT :  연결 상태 체크
AT+NAME : default 이름 확인
AT+ADDR :  default 주소 보기
AT+VERSION : 버전 보기
AT+UART : 보드레이트 보기(확인)
AT+ROLE:  마스터?/슬레이브? 상태 확인
AT+RESET :  리셋과 AT mode 빠져나오기
AT+ORGL : 공장 출하 상태로 원위치 시키기
AT+PSWD: 현재의 패스워드 보기

 

※ HC-05 AT 명령어 파일(pdf)과 HC-06 AT 명령어 파일을 첨부하였다. 

(아래 PDF 파일을 참고하면, 위에서 소개하지 않은, IPSCAN 정보나, 블루투스 Pair된 기기 정보 리스트를 보거나 삭제 할 수 있는 명령어들이 있으니 필요할 경우 참고하면 좋을 것이다)

Bluetooth HC-05.pdf
0.08MB
Bluetooth HC-06.pdf
0.14MB

 

★ 마지막 시도 :

 위 5번 까지 별의별 짓(?) 다 시도 해봤지만, 아예 AT 커맨드 모드 진입 자체가 안 된다는 분이 있을 것이다. 

그럴 때는 이렇게 한 번 해보시라.   

 - 상황 : 버튼이 달려 있고 6pin이고, HC-05로 추정되는 모듈이라고 생각 되는 상황에서,  혹은 아니어도...

 AT 명령어 모드는 38400 속도에서만 진입가능한 경우가 있었다(시리얼 모니터 통신속도가 아닌, 블루투스 통신속도).    따라서 AT모드 진입과 설정을 위해 코드상에 myBT.begin(38400)으로 맞추어 실행시켰다.  그런 다음 AT 를 입력해 보면, OK가 떳으며, 다른 명령어도 잘 먹혔다.   이때, AT+UART ⏎  입력해보면, 현재의 BT모듈의 통신 속도를 확인 할 수 있을 것이다. 본인의 경우 (9600으로 나왔다!!,  HC-05모듈의 default 값인 38400이 아니었음) ,
 이제 AT모드 진입이 성공 되었으니,  마스터/슬레이브 , 이름 설정 등등을 끝내고,  본격적으로 실행시킬 때는 코드상에서  BT모듈의 통신속도를 다시 myBT.begin(9600)으로 바꾸어 주었다.(BT모듈값과 일치시킴).
  이렇게 하였더니, 두 개의 블루투스 모듈의 페이링이 잘 되었고 통신도 문제가 없이 잘 실행 되었다.   

  혹은 일단, AT모드로 진입이 성공되면 BT모듈 들의 보드레이트 자체를 아예 모두 38400으로 변경을 해도 될 것이다. 

 
※ 기타 사항 :  

  - HC-05 모듈로 AT커맨드 모드 진입시, 모듈의 'En단자'에 High 레벨을 가하지 않더라도 커맨드 모드 진입은 가능하였다.

  - 버전이 다른 HC-05 모듈, 예를 들어, HC-05(2.0Ver, Master),와 HC-05(3.0Ver, Slave) 와 페어링도 문제 없이 잘 됨.

    (단, 비번은 같아야 함,  default : '1234' , 하나는 반드시 마스터, 나머지는 슬레이브 여야함.)

 

 

[ 다시한번 더 최종 정리 ]

HC-05와 HC-06이 다른점은 HC-05는 마스터와 슬레이브 모두 가능하고 HC-06은 슬레이로 고정되있다. 

그리고 공장 초기값(default)의 차이가 있다.

 

예)

HC-06은 Slave,9600,8,N,1, pin=1234,"HC-06" 시리얼모니터에서 "line ending없음"

HC-05는 Slave,38400,8,N,1,pin=1234,"HC-05" 시리얼모니터에서 "Both NL & CR" 이다.

 

하지만 펌웨어 버전 1.7이상에선 HC-06도 AT명령으로 마스터모드 설정이 가능하다
그리고 펌웨어 3.0 이상에서는 전송 옵션도 "Both NL & CR"로 변경되었다.

 

결론, 자신이 가지고 있는 블루투스의 모델 HC-05, 06 외에,  블루투스 펌웨어 버전이 중요함! 
버전에 따라 AT 명령어도 조금씩 다를 수 있고 접속 통신속도와 기본값(drfault)도 다르니,  확인하여 사용해야 한다.

 

 

포기하기 전에...

 여기까지 글을 읽었다는 뜻은 해볼만큼 해보고 나서도 AT모드 진입조차 안 되어, BAUD RATE 확인이나, 펌웨어 버전 확인 조차 못하는 상황일 것이다.  물론 핸드폰의 앱으로 접속하고 데이터를 보내는데 성공해도 AT 모드로 접속이 안 되는 경우이다.  필자의 판단으로는 똑같은 HC-05 모듈이라도 제조 출하시 펌웨어 버전이 다를 수 있는데, 이 펌웨어 버전이 낮을 경우 이런 증상이 있는 것으로 판단이 된다.(Ver 2.0 미만으로 추정). 
  따라서 이와 같은 상황이라고 판단되면, 그리고 AT모드 진입이 반드시 필요하다면, 새로 최신 펌웨어 버전의 블루투스 모듈을 구매하길 바란다.  그렇게 하는 것이 정신건강에 좋다.  그리고 같은 판매처에서 구매하다보면, 다른 버전을 구매해도 같은 제품이 배달되는 경우가 더러 있는 것 같으므로, 구매처를 바꾸어 구매하는 것이 좋을 것 같다.

 

그럼, 건투를 빕니다...  ^^;

반응형
반응형

【 아두이노모듈#15 L9110S #1(모터 드라이버) 모듈 사용하기

 

 아두이노로 스텝모터나 DC 모터를 제어하기 위해서는 TR이나 IC를 사용하여, H-bridge (h-브릿지) 회로를 구성하여 정역(정회전, 역회전) 제어를 하게 된다. 직접 TR이나 IC를 이용해서 따로 구성할 수 있지만 다소 번거롭다. 이를 해결해 줄 수 있는 모터 구동 모듈이 있어서 사용법을 간단히 소개하려 한다.  바로 L9110S 모듈이며, DC모터는 2개를 , 스텝모터는 1개(4선 2상)를 각각 제어 할 수 있다. 

L298 드라이버 모듈에 대해서도 포스팅 하였지만, 이 모듈보다 가격이 저렴(700원대)하고, 크기와 부피가 작아서 작은 크기의 작품을 만들려고 할 때 적합하다고 할 수 있겠다.

 

 

▶ 선수 학습 :

      1. [아두이노 기초#24] DC모터 제어하기 4 (H-bridge 참조)  ☜ (클릭)

 

 L9110S 모듈 세부 스팩

 

▶ 실습 목표 :  

 1. [ L9110S 모터 모듀을 이용하여 2개의 DC모터 방향을 제어 할 수 있다

 2. [ 아두이노의 아날로그 출력 함수를 이용하여 속도를 조절 해 볼 수 있다.]

 

▶ 실습 회로도면 :  L9110S 모터드라이버 모듈 연결도
  (이미지 클릭하면 확대 가능)

L9110S 모터드라이버 모듈 연결도

 

▶ 실습 절차  : 

 

1.   부품을 준비하여 위와 같은 회로를 구성한다. 

2.   아래 코드를 작성하고 프로그램을 로딩 후 실행시킨다.(혹은 첨부파일 다운)

3.  먼저 디지털 포트를 사용하여 방향제어를 해본다. (코딩1)

4.  코딩2를 참고하여 속도제어 실습도 해본다. (코딩2)

 

▶ 프로그램 코드 및 설명 1 : 

/* L9110S 모듈 제어 해보기  (방향제어 : 코딩1) */

int motorA1 =  5; 
int motorA2  = 6; 
int motorB1 =  9; 
int motorB2 =  10; 

 

void setup ( ) {  

  pinMode( motorA1 , OUTPUT);
  pinMode( motorA2 , OUTPUT);
  pinMode( motorB1 , OUTPUT);
  pinMode( motorB2 , OUTPUT);

}

void loop ( )  {

  // 필요한경우 아래 코드에 따라 모터의 연결을 조정해야한다. 

  // <전진>

  digitalWrite( motorA1 , HIGH);
  digitalWrite( motorA2 , LOW);
  digitalWrite( motorB1 , HIGH);
  digitalWrite( motorB2 , LOW);

  delay(2000);

// 후진
  digitalWrite( motorA1 , LOW);
  digitalWrite( motorA2 , HIGH);
  digitalWrite( motorB1 , LOW);
  digitalWrite( motorB2 , HIGH);

  delay(2000);

 

 // 좌회전
  digitalWrite( motorA1 , HIGH);
  digitalWrite( motorA2 , LOW);
  digitalWrite( motorB1 , LOW);
  digitalWrite( motorB2 , HIGH);
  delay(2000);

 

 // 우회전
  digitalWrite( motorA1 , LOW);
  digitalWrite( motorA2 , HIGH);
  digitalWrite( motorB1 , HIGH);
  digitalWrite( motorB2 , LOW);
  delay(2000);

 

 // 정지

  digitalWrite( motorA1 , LOW);
  digitalWrite( motorA2 , LOW);
  digitalWrite( motorB1 , LOW);
  digitalWrite( motorB2 , LOW);
  delay(2000);

}

 

 

▶ 프로그램 코드 및 설명 2: 

/* L9110S 모듈 제어 해보기   (방향과 속도 제어 : 코딩2) */

int motorA1 =  5; 
int motorA2  = 6; 
int motorB1 =  9; 
int motorB2 =  10; 

int  speed = 255 ;   // speed :  0 ~ 255

 

void setup ( ) {  

  pinMode( motorA1 , OUTPUT); 
  pinMode( motorA2 , OUTPUT); 
  pinMode( motorB1 , OUTPUT); 
  pinMode( motorB2 , OUTPUT);

}

void loop ( )  {

  // 필요한경우 아래 코드에 따라 모터의 연결을 조정해야한다. 

  // <전진>

  analogWrite( motorA1 , 150);  // 숫자 값으로 속도 조절
 
analogWrite( motorA2 , 0);
 
analogWrite( motorB1 , 150);
 
analogWrite( motorB2 , 0);

  delay(2000);

// <후진>
  analogWrite( motorA1 , 0);
 
analogWrite( motorA2 , speed);
 
analogWrite( motorB1 ,  0);
 
analogWrite( motorB2 , speed);

  delay(2000);

 // <좌회전>
 
 analogWrite( motorA1 ,  speed);
 
analogWrite( motorA2 , 0);
 
analogWrite( motorB1 ,  0);
 
analogWrite( motorB2 , speed);

  delay(2000);

 // <우회전> 
 
 analogWrite( motorA1 ,  0);
 
analogWrite( motorA2 , speed);
 
analogWrite( motorB1 ,  speed);
 
analogWrite( motorB2 , 0);

  delay(2000);

 // <정지>

  digitalWrite( motorA1 , 0);
 
digitalWrite( motorA2 , 0);
 
digitalWrite( motorB1 , 0);
 
digitalWrite( motorB2 , 0);
  delay(2000);

}

 

▶ 아두이노 파일다운 :

(다운받아서 압축을 풀어 사용하세요)

# 1.  <코딩 1>

L9110S_Basic_OK.zip
0.00MB

 

# 2.  <코딩 2>

L9110S_Speed_OK.zip
0.00MB

반응형
반응형

【 아두이노모듈#14 Joystick #1(Keyes SJoys) 조이스틱! 사용해보기

 

 조이스틱은 직관적인 인터페이스 덕분에 활용성이 높으면서도 복잡않아 여러가지 응용 작품을 만들때 자주 사용된다. 

주로 움직임 동작이 필요한 RC카 제어나, 드론, 게임기 제어 등에 사용된다.

따라서 조이스틱의 기본 사용법을 익혀보면 여러가지 프로젝트에 도움이 많이 될 것이다. 

이번 시간은 조이스틱 모듈의 기본적인 동작원리에 대해 다루어 보도록 하겠다.

 

 

▶ 선수 학습 :

      없음.

 조이스틱 모듈 (Keyes SJoys) 세부 스팩

Joystick 핀 배열
Keyes SJoys 상세 스팩

  조이스틱은 사실 포텐셔미터(Potentiometer) 라고 말 할 수 있다.

입력된 전압 값을 기계적인 스틱의 위치 변화(저항값)로 인해 조절하여 출력해주기 때문이다. 

그래서, 아두이노 에서는 아날로그 포트(A0~A6)를 통해서 입력받아야 조이스틱으로서의 기능적인 부분들을 처리 할 수 있다.  왜냐하면, 조이스틱의 경우 상하좌우 끝점의 값(디지털 1, 0)만 사용이 되는 것이 아니라, 조이스틱이 움직이는 중간 값들이 존재하고, 또 그 값들이 필요하기 때문이다.  아래 교육 영상을 보면 무슨 말인지 잘 이해 될 것이다. 

아날로그 출력 값은 조이스틱에 입력된 전압값(5V)을 기준으로 최소값(0V)~최대값(5V)이 출력되는데, 

조이스틱을 움직이지 않은 상태에서는 정 가운데 위치하기 때문에 VRx 와 VRy 출력 값이 약 2.5V가 출력 된다. (스틱의 기계적이 부분이 있어, 약간의 오차가 있을 수 있다)  

즉, 조이스틱 모듈의

1.  VRx 단자 출력값 :  0V(맨아래) ~ 2.5V(가운데)  ~ 5V(맨위)    

2.  VRy 단자 출력값 :  0V(맨왼쪽) ~ 2.5V(가운데)  ~ 5V(맨오른쪽)     

형태로 전압이 출력이 된다.   (물론, 상하좌우나 대각선등의 중간(전압)값도 존재한다.)

 

이런 전압을 아두이노에서 아날로그 포트로(A0~A6) 값을 입력받으면 아날로그 전압값을 디지털 수치값으로 변환시켜주는 ADC(컨버터)로 인해 ,  0V~5V 전압이 0~1023 수치값으로 변환된다. ( analogRead() 함수 사용)  

그러면, 아두이노에서 쉽게 데이터 처리가 가능해지는 것이다. 

 

▶ 실습 목표 :  

 1. [ 조이스틱 모듈의 구조와 동작원리에 대해 이해 할 수 있다.

 2. [ 조이스틱 모듈에서 사용하는 함수에 대해 이해하고 활용할 수 있다.]

 3. [ 기본 회로를 연결하여 조이스틱의 움직임에 따른 데이터 값을 시리얼모니터로 확인 할 수 있다.]

 

▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)
[ 회로1 - SW 를 아날로그 단자에 연결 -영상과 같은 회로]
스위치 눌림에 따라 값이 입력되도록 하였으며,  따라서 눌림의 정도가 일정하지 않음

회로1: SW를 아날로그 입력으로 처리한 회로

 

[ 회로2 - SW 를 디지털 단자 D2에 연결 ]
스위치를 디지털 단자에 연결하여 입력의 HIGH / LOW 신호값 구분을 확실하게 하였음,  단, 1㏀~10㏀ 사이의 풀업저항 연결이 필요함.  

 

 

▶ 실습 절차  : 

 

1.   부품을 준비하여 위와 같은 회로를 구성한다. 

2.   아래 코드를 작성하고 프로그램을 로딩 후 실행시킨다.(혹은 첨부파일 다운)

3.  시리얼 모티터 창을 띄운 후 조이스틱을 움직여 보면서 데이터 값이 올바르게 출력이 되는 지 확인한다.

4.  이렇게 컨트롤 되는 값으로 무엇을 가지고 제어를 해볼지 생각해본다.

 

▶ 프로그램 코드 및 설명 : 

/* 조이스틱의 SW를 아날로그 입력으로 처리한 코드 1 */

/* 조이스틱 컨트롤 해보기  */
/* Rasino.tistory.com   */ 

void setup() {
  Serial.begin(9600);  
}
void loop() {
  // 입력 값을 -100~ 100 사이의 값으로 맵핑(치환)한다
  int Jox = map(analogRead(A0), 0, 1023, -100, 100);
  int Joy = map(analogRead(A1), 0, 1023, -100, 100);
  Serial.print(" Joy X : ");
  Serial.print(Jox);
  Serial.print("    Joy y : ");
  Serial.println(Joy);
  // 조이스틱의 스위치 기능에 대한 정의 
  if (digitalRead(A2)) {
    Serial.println("Off");    
  } else {
    Serial.println("On");
  }
  delay(500);
}

 

/* 조이스틱의 SW를 디지털 입력으로 처리한 코드 2 */

/* 조이스틱 컨트롤 해보기  */
/* Rasino.tistory.com   */ 
#define SW 2

void setup() {
  Serial.begin(9600);  
  pinMode(SW,INPUT);
}
void loop() {
  // 입력 값을 -100~ 100 사이의 값으로 맵핑(치환)한다
  int Jox = map(analogRead(A0), 0, 1023, -100, 100);
  int Joy = map(analogRead(A1), 0, 1023, -100, 100);
  Serial.print(" Joy X : ");
  Serial.print(Jox);
  Serial.print("    Joy y : ");
  Serial.println(Joy);
  // 조이스틱 SW에서는 눌렀을때 0 ,  떼었을 때 1 이 출력되나,
  // 반대가 되도록 '!'로 반전을 시켰음
  Serial.println(!digitalRead(SW)); //  
  delay(300);
}

 

▶ 실행영상 :  

(전체화면 보기로 보세요)
※ 영상에서는 SW를 눌리는 정도에 따라 반응하도록 아날로그 단자로 연결하였으나,  바로 위 코드처럼 디지털 단자 2번에 연결하여 활용하면 확실한 On Off 신호를 활용할 수 있습니다

조이스틱 아두이노 컨트롤

(아래는 유튜브로 시청하기)

https://youtu.be/0QVI3LmfNfc

 

▶ 아두이노 파일다운 :

(다운받아서 압축을 풀어 사용하세요)

(파일 1 : SW를 아날로그 A3번 단자에 연결한 코드 입니다)

Ras_JoyStick_01.zip
0.00MB

(파일 2 : SW를 Digital 2번 단자에 연결한 코드 입니다)

Ras_JoyStick_02_sw.zip
0.00MB

 

반응형
반응형

【 아두이노모듈#13 RFID #3(RC522) 도어락 만들기!

 

 RFID(Radio Frequancy Identification)는 무선 주파수를 이용하여 RFID 태그와 RFID리더간 데이터를 교환하는 장치이다.

 교통카드, 학생신분증 겸용카드, 연구실 및 회사 출입문카드, 구내식당 카드, 마트 등의 상품 진열 및 관리 등등 다방면에서 이용되고 있다. 

 지난 실습에서 아두이노와 RFID모듈을 연결하고 특정 ID카드의 ID를 등록하여 시리얼모니터를 통해 승인 또는 거부 표시를 해보았다.  이번에는 좀더 실제적으로 응용이 가능하도록 서보모터와 LED를 이용해서 도어락 기능을 구현해보려 한다. 선수학습을 잘 따라왔다면, 크게 어렵지않고 더욱 흥미가 생길 것이다. 

 

▶ 선수 학습 :

      1. [아두이노 기초#30] 서보모터 제어하기 응용 ☜ (클릭)

      2. [아두이노 센서#3] TMP36 온도센서 #1 (RGB LED 부분 참조) ☜ (클릭)

      3. [아두이노 모듈#11] RFID(RC522) 사용하기 #1 ☜ (클릭)

      4. [아두이노 모듈#12] RFID(RC522) 사용하기 #2 ☜ (클릭)

 

 RFID 모듈 (RC522) 세부 스팩

   세부스팩은 위 선수학습 내용을 참조.

 

▶ 실습 목표 :  

 1. [ RFID 구동원리, 통신 방식에 대해 이해할 수 있다. 

 2. [ SPI통신과 회로 연결에 대해 이해 할 수 있다.]

 3. [ 카드별 고유넘버(UID)를 알아 낼 수 있다.]

 4. [ 특정 UID를 지정하여 승인 및 거부 처리를 할 수 있다.]

 5. [ '서보 모터'와 , 'RGB LED'를 적용하여 RFID모듈 제어를 할 수 있다.] 

 

▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)

RFID Rc522모듈을 활용한 도어락 회로도

▶ 실습 절차  : 

 

1.   부품을 준비하여 위와 같은 회로를 구성한다. 

2.   아두이노IDE에서 MFRC522 라이브러리를 검색후 설치한다. 

     ( 라이브러리 설치는 위 선수학습내용 참조)

3.  첨부된 아두이노 파일을 다운 받아 코드를 실행시킨다. 

4.  문으로 사용될 미이어쳐나 모형 등을 준비한다.  (RGB LED가 없으면 일반 LED를 사용)

5. 동작확인이 되면(실제 도어 등에 적용할 방법에 대해 고민해본다, 릴레이 사용 등등)

 

▶ 프로그램 코드 및 설명 : 

/* RFID 도어락 만들어 보기 */

#include <SPI.h>
#
include <MFRC522.h>
#
define SS_PIN 10    // spi 통신을 위한 SS(chip select)핀 설정
#define RST_PIN 9    // 리셋 핀 설정 
MFRC522 
rfid(SS_PIN, RST_PIN); // 'rfid' 이름으로 클래스 객체 선언

#include <Servo.h>    // 서보 라이브러리를 지정

#define servoPin 8     // 서보 모터핀을 지정

Servo servo;      // 서보 라이브러리 변수를 선언

int pos=0;      // 현재 각도를 저장할 변수를 지정한다

int RLED=7;     // 빨간색 LED단자를 아두이노 7번과 연결

int GLED=6;     // 초록색 LED단자를 아두이노 6번과 연결

 

void setup ( ) {  

  pinMode(RLED, OUTPUT);      // RED LED를 출력으로 지정

  pinMode(GLED, OUTPUT);      // GREEN LED를 출력으로 지정

  servo.attach(servoPin);     // 서보모터 핀을 설정한다

  servo.write(0);                // 서보모터 0도 위치로 초기화

  Serial.begin(9600);
  
SPI.begin();           // SPI 통신 시작

  rfid.PCD_Init();       // RFID(MFRC522) 초기화

  Serial.println("Approximate your card to the reader...");
  
Serial.println();  

}

void loop ( )  {

 // 새카드 접촉이 있을 때만 다음 단계로 넘어감

  if ( ! rfid.PICC_IsNewCardPresent())
  {

      return;

  }

 // 카드 읽힘이 제대로 되면 다음으로 넘어감
  if ( ! rfid.PICC_ReadCardSerial())

  {

      return;

  }

  // 현재 접촉 되는 카드 타입을 읽어와 모니터에 표시함  

  Serial.print("UID tag :");
  
String content= "";
  
byte letter;    
  
for (byte i = 0; i < rfid.uid.size; i++) 
  
{   
     
Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
     
Serial.print(rfid.uid.uidByte[i], HEX);
     
content.concat(String(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "));
     
content.concat(String(rfid.uid.uidByte[i], HEX));
  
}

  Serial.println();
  
Serial.print("Message : ");
  
content.toUpperCase();
  // UID값이 아래 값과 같으면 승인 처리
  if (content.substring(1) == "85 7C FB D1") // 승인 하고자하는 UID 기록

  {

   // 인증이 되면 Green LED와 함께 서보모터를 작동시킨다.
    Serial.println("Authorized access");
   
Serial.println();

    digitalWrite(GLED,HIGH);

    servo.write(180);   // 서보모터의 각도를 변경한다     

    delay(3000);  // 서보 모터의 각도가 변하는 것을 기다려 준다

    servo.write(0);     // 시간지연 후 문을 닫는다 

    digitalWrite(GLED,LOW);   // 시간지연 후 LED 끈다

  }

 

   // 승인 목록에 없는 UID 처리는

   // 서보모터의 작동 없이 Red LED만 켜고 끈다

  else   {

    Serial.println(" Access denied");
    digitalWrite(RLED,HIGH);

    delay(3000);

    digitalWrite(RLED,LOW);

   }

}

 

▶ 실행영상 :  

(전체화면 보기로 보세요)

RFID 도어락 만들어 보기

(아래는 유튜브로 시청하기)

https://youtu.be/6nBu0obCx5Q

▶ 아두이노 파일다운 :

(다운받아서 압축을 풀어 사용하세요)

 

ko_arduino_code_Servo_LED.zip
0.00MB

 

 

 

 컴파일 에러 발생시 해결 방법 참고 :  아래 최신글을 참고해 보세요.

rasino.tistory.com/321

 

【 MFRC522 RFID with Nano 33 iot #1】 아두이노 나노(33 IoT) 보드에 RFID 카드 모듈 사용해 보기!( feat. RFID

【 MFRC522 RFID with Nano 33 iot #1】 아두이노 나노(33 IoT) 보드에 RFID 카드 모듈 사용해 보기! ( feat. RFID 컴파일 오류 있는 경우도 보세요! ) Nano 33 every(또는 33 iot 등)에서 RFID를 사용해보려 하..

rasino.tistory.com

 

반응형