【 아두이노ProMini#1】아두이노프로미니 사용하기~! ( Arduino Pro Mini)
아두이노 프로미니 보드를 사용해보자! 아두이노에는 크기 및 성능이 다양한 여러 종류의 보드가 있는데, 응용하고자 하는 목적과 활용되는 환경에 따라선택할 수 있다. 물론, 우노를 사용할 줄 안다면 나머지 보드들도 쉽게 사용할 수 있을 것이다.
사이즈가 작은 것을 만들고자 한다면, 아두이노 나노(Nano) 혹은 프로미니(Pro Mini)를 선택할 수 있다. 나노보드는 사이즈가 작고 우노 환경과 거의 흡사하여 어렵지 않게 바로 사용할 수 있다. 그리고 프로미니 보드는 나노보드보다 더 작은 장점이 있다. 하지만 컴퓨터와 통신할 수 있는 모듈을 별도로 사용해야 하는 번거러움이 있는데, 방법을 한 번 알고 나면 크게 어렵지 않으니, 지금부터 설명을 잘 봐주기 바란다.
▶ 아두이노 프로미니 사양 :
▶ 프로미니 보드 핀 정보
▶ FT232RL 모듈 사용하기 :
아두이노 프로미니에는 PC의 USB to TTL(Serial) 연결(통신)을 담당해주는 기능이 빠져 있다. 크기를 더욱 작게 만들기 위한 방법으로 다소 번거롭지만 실제 작품에 적용할 때는 조금이라도 더 작으면 활용하기가 좋을 것이다. 그래서 통신을 위한 모듈을 사용해야 하는데, 가장 많이 사용되는 FTDI 사(社)의 'FT232RL' 모듈에 대해 함께 다루고자 한다.
( ※ 배터리 전원을 5V이하로 공급 시 Step-UP 컨버터를 사용하면 되고, 5V이상을 공급 시에는 AMS1117과 같은 5V 정전압 컨버터 같은 것을 사용하면 됩니다) 예시) 18650 3.7v 1개 사용시 → Step-Up컨버터 / 18650 3.7v 2개 사용시→ 정전압 컨버터
▶ 실습 목표 :
1. [ L9110S 모터 모듈을 활용하는 방법에 대해 이해 할 수 있다.]
2. [ 조이스틱의 컨트롤 기능을 익힐 수 있다. ]
3. [ Step up 컨버터를 이용해 낮은 입력 전압을 5V전압으로 승압해 주는 컨버터를 다룰 수 있다. ]
4. [ 블루투스 모듈의 셋업과 페어링(연결) 및 사용법을 익힐 수 있다. ]
5. [ 아두이노 두 대 상호간 통신을 통해 제어하는 방법을 익힐 수 있다 ]
▶ 실습 회로도면 : (이미지 클릭하면 확대 가능)
[1. 미니카 본체 연결도] ※ 18650(3.7v) 배터리를 1개 사용하는 미니카 회로도 입니다. 당연히 움직이는 속도가 빠르지 않을 수 있고 동작 시간도 짧을 수 있습니다. 만약 배터리를 추가하여 활용하고자 할 때는 아래 미니카 전원보강회로 도면을 참고해 주세요.
[2. 미니카 블루투스 조정기 연결도]
※ 블루투스 페어링(자동 연결)을 위해서는, 선수학습 4번을 통해 블루투스 설정법을 확인하여, 본체에 있는 블루투스 모듈은 마스터(Master)로 설정하고, 조이스틱 조정기의 블루투스는 슬레이브로(Slave)로 설정 작업이 필요하다. (물론 마스터와 슬레이브가 반대로 바뀌어도 상관이 없다)
[ 5V 이상의 배터리 2개를 사용시 회로 연결도 ] : 만약 5v이상의 배터리를 공급한다면, Stepup 모듈은 필요치 않으며, 18650 두 개를 직렬로 연결하면 7.4v가 되고 Vin에 입력하고, 모터 드라이버 모듈에도 공급을 해주면 높은 전압(전력)으로인해 모터에 힘이 잘 전달 됩니다. 이 때, 블루투스는 5V를 넘겨 입력하면 안 되기에, 아두이노의 5V 단자에서 연결해야 하니 주위하세요.
▶ 실습 절차 :
1. 부품을 준비하여 위와 같은 회로를 각각 구성한다.
- 미니카의 베이스 판은 아크릴 판 혹은 MDF 등 주변에서 쉽게 구할 수 있는 것으로 한다.
- 미니카의 구동 바퀴 외에 보조바퀴를 달아도 되고, 여기처럼 미끌리면서 지지 해줄 수 있는 둥근 나사로 간단히 해결하여도 좋다.
- 미니카의 구동속도나 파워를 높이고자 한다면, 3.7V 베터리 2개를 직렬연결 해주거나, 충분한 전류가 공급될 수 있도록 베터리부분을 보강 해준다.
2. 아래 코드를 작성하고 각각의 프로그램을 로딩 후 실행시킨다.
3. 응용실습 : 코딩 부분을 수정하여 조이스틱의 대각선 방향 제어가 되도록 실습해본다. (선수학습 3번 참조)
▶ 프로그램 코드 및 설명 :
【 코드1-본체】
#include <SoftwareSerial.h> SoftwareSerial BTSerial(2, 3); // BTSerial(Rx, Tx) int A_1A = 9; int A_1B = 10; int B_1A = 5; int B_1B = 6; int speed = 250; // speed: 0~ 255 char joyBT;
【 아두이노에러해결#4】 서보모터 떨림, 흔들림, 불안정 현상 해결! shaking problem (SG-90)
아두이노에서 SG-90과 같은 서보 모터를 제어할 경우, 작동은 되지만, 한가지 골치 아픈 문제에 직면하게 된다. 바로 모터를 원하는 위치로 회전 시킨 후 정지(홀드)해야 하는 상황에서 가만 있지 않고 달달? 덜덜? 떨게 되는 것이다. 회전만 하면 되는 경우면 상관 없지만, 제어 된 위치를 고정적으로 유지시켜야 하는 상황에서는 굉장히 못 마땅한 동작이 아닐 수 없다. 이 문제의 해결방법은 국내(사이트)에는 자료가 거의 없는 상황이다. 그리고 해외에서도 관련된 고민? 사항이 특정 사이트의 Q&A에 종종 올라오고 있지만, 속 시원히 해결 되었다는 메세지는 잘 보지 못했다.
이와 관련하여, 본인도 블루투스 원격 제어 예제 회로를 구성하면서 같은 문제가 발생하였는데, 이 문제를 고민하는 과정에서 알게된 해결방법을 여기에 기술 하고자 한다.
[ 문제 증상 ]
1. 가변저항(Var)을 조절하여 그 입력 값에 따라 서보모터를 회전 시키는 예제.
(서보모터의 사시나무 떨듯 환장?하는 영상)
위 영상은 블루투스를 이용한 제어에서 떨림현상을 촬영한 영상임
(물론 단순 가변저항 예제의 경우 거의 떨지 않는 경우도 있으나, 컨트롤을 위해 센서를 사용하거나, 회로 및 코드 구성이나 단계가 조금만 복잡해져도 떨림현상을 쉽게 목격할 수 있을 것이다)
[ 먼저 확인해 봐야할 문제 원인 ]
※ 먼저, 지금 설명드리는 예상 원인을 확인해보고, 해결이 안 된다면, 아래 내용으로 진행해 보세요. 서보 모터의 경우, 20ms를 한 주기로, 그 주기 속에, 1ms~2ms의 High 신호의 펄스로 정해진 각도로 움직이도록 설계되어 있습니다. 예를 들어, 1ms의 High 펄스가 입력되면, 서보모터가 0도의 위치로 회전하게 되며, 2ms의 High 펄스가 입력되면, 180도의 위치로 회전하게 되고, 1ms~2ms 사이의 High 펄스 값에 따라, 0도~180도 사이의 각도로 매칭되어 움직이게 됩니다. 혹은, 아래 이미지에 있는 설명대로, -90도 ↔ 0도 ↔ 90도 형태를 기준으로 (1ms ↔ 1.5ms ↔ 2ms) 생각할 수 있습니다. 어째튼 중요한 것은, 0~180도의 각을 움직이는 펄스 파형의 기준이 1ms~2ms 범위라는 것인데요,
문제는 서보모터의 경우 1ms~2ms의 범위에 제품마다 일치하지 않는 오차가 있다는 것이고, 많은 곳에서 제작되는 매우 저렴한 서보모터의 경우 이 오차가 제법 클 수 있습니다. 오류가 나는 경우의 예를 들면, 0도로 회전 시키기 위해 1ms의 신호를 주었으나, 실험에 사용된 서보모터의 실제적인 제어신호 범위가 1.2ms ~ 2.2ms 였다면, 1ms의 신호를 준 것이 서보모터가 회전하는 범위를 벗어나게 되는데, 강제로 이동시키는 신호가 오다보니 기어가 내장된 부분에서 떨림의 현상이 올 수 있다는 이야기입니다.
이런 경우의 해결책은, 제어범위를 실험을 통해서 확인해 내거나, 혹은, 제어범위를 초과하지 않게 미만의 범위로 신호를 주면 해결할 수 있습니다. 위 예의 경우, 1ms를 주지 말고 1.3ms나 1.2ms 이하로 신호를 주면 떨림이 해결될 수 있다는 말입니다. 그리고, 이상적인 180도 회전 서보모터의 경우 0도~179도 로 회전 하는 것이지만, 실제적으로는 2도~177도 정도의 범위를 갖는 것이 일반적이기 때문에, 만약 떨림이 있다면, 2~177도 사이의 제어 신호를 주는게 맞습니다.
[ 문제 원인 ]
1. 우선 본질적인 원인은 서보모터의 구조와 작동 방식에 있다.
(서보모터의 작동 원리) 위 이미지를 보면, 서보모터 신호라인으로 그림과 같은 펄스파(PWM)를 입력 시키는데, 기본적으로 입력되는 펄스 간격을 체크하여 지정된 각도 만큼 움직이도록 작동 된다.
펄스 자체의 반복주기는 20ms로 고정하고, 펄스의 폭을 1ms~2ms 사이로 조절하게 되면, 첫 펄스 파형과 그 다음 펄스 파형 사이의 간격(시간)이 달라지게 된다. 즉 1ms 일때 보다, 2ms로 갈수록 high 신호의 반복주기가 짧아지는 것이다. 따라서, 펄스 폭이 1ms인 펄스를 발생시켜 입력시켜 주면, 서모 모터를 0도에 위치시키도록 하고, 설정된 최대 폭인 2ms로 입력시키면, 180도로 회전 시키도록 설계 되어 있다. 그럼, 1ms와 2ms의 중간 값인 1.5ms를 넣어 주면 0도~180도의 중간 값인 90도의 위치로 회전축이 이동 된다. 역시, 1ms~2ms 펄스폭 사이에 있는 값에 따라 0도~180도로 회전 하게 되는 원리이다.
그런데, 0도가 되었든, 90도가 되었든, 해당 각도를 유지하려면 그 것에 맞는 펄스가 정확히 유지되어(일정하게) 입력되어야 하는데, 그렇지 못하기 때문에 결국 변동되는 펄스 폭 만큼 모터가 작동되면서 떨게 되는 것이다.
그럼, 펄스폭이 왜? 유지가 되기 힘든가? 여러가지 원인이 있지만, 주요한 원인을 고민해 보자면,
1. 서보모터가 작동하는 순간, 아두이노에 모터구동에 따른 노이즈가 입력되거나, 전력의 변동(요동)이 발생된다. 또는 출력저하 등의 이유로 전력의 불안정은 제어하는 센서의 값(또는 제어 코드 기준값)에영향을 주게 된다. (센서를 이용한 제어보다, 가변저항등의 직접제어가 좀더 안정적인 이유임) . 결국, 서보모터 등과 관련하여 전원분리 및 안정적인 공급을 통해 해결하거나 다소 완화시킬 수 있다.
2. 사용하는 서보모터 마다 특성이 조금씩 차이 나는 것으로 보이며, 일반적으로 서보모터의 이론적인 제어 기준은 20ms 주기에 1~2ms의 신호로 제어 한다고 나와 있으나, 사용되는 모터마다 주기 범위등의 오차가 있어 해당 범위가 넘어가는 제어신호가 입력 될 경우, 흔들림이 발생할 수 있는 것으로 추측됨.
[ 문제 해결 ]
1. 기본 조치 : 조금전에 설명한 대로 기본적으로 서보모터를 구동하는 전원을 안정화 시키거나 보강해줄 필요가 있다. - 서보모터에도 별도의 전원을 공급하거나, 전원 보강을 위해 아두이노혹은 서보모터 쪽 전원(+,-)에 10uf~330uf 정도의 전해콘덴서를 연결 (극성 주의: 콘덴서의 +단자는 +전원에, -단자는 GND에 연결)
- 노이즈 제거를 위해 서보 모터 신호라인(주황색선)과 GND 사이에 극성이 없는 세라믹콘덴서을 달아 준다. (노이즈 바이패스)
2. 하드웨어적인 해결 : - 슈미트 트리거 회로 혹은 IC를 이용하여 노이즈 등에 의한 원하는 펄스 파형이 나오지 않아 찌그러진 형태의 구형파가 입력되어 흔들림이 발생한다는 가정을 하여, 실험을 실시해 볼 가능성이 있어 보임. ( 이 부분은 가설을 이야기해 본 것이며, 실험이나 검증이 필요함, 당연히 원인이 구형파의 노이즈에 의함이 아닌 3번의 코드상에서의 해결책과 같은 VAR 입력값에 의한 것일 경우 이 방법은 적용해볼 필요 없음.)
3. 코드상에서 해결( 분기값, 임계값 등)
- 부가적인 하드웨어 없이, 소프트웨어(코드 보강)적으로도 개선 시킬 수 있다. - 오류가 발생되지 않도록 컨트롤 데이터를 맞추어 준다.
: 예를 들어 가변저항의 입력값을 아날로그 단자(A0)로 받으면 0~1023의 값이 입력 되고, 이를 각도값인 0~180도로 맵핑 처리하게 되는데, 이 값을 좀더 정확하게 잡아 주면 좋다. → VAR = map(analogRead(A0), 0, 1023, 0,180) 라면, 좀더 정확하게 0, 179 로 하거나, 실제적인 서보모터의 특성상 180도 전체가 움직이지 않는 다고 보고, 5~175도 정도로 값을 조정해볼 수 있다. 또한 이 값의 범위를 오류 등에 의해 벗어 나지 않토록 constain 함수 처리를 해주면 좋다. → VAR = map(analogRead(A0), 0, 1023, 5, 175)); , VAR_OK = constrain(VAR, 5, 175); 이 경우는 모터의 양 쪽 끝에서 떠는 현상을 완화 시켜줄 것이다. 하지만, VAR 등으로 값을 변화 시킴에 따라 모터가 회전해야 하는 경우에 발생하는 떨림의 해결도 필요하다. 이 경우에는 VAR값에 의한 각도 값 "1,2,3,4,...179" 을 1단위로 모터회전 처리하지 말고, 유동 범위 값을 주어 처리하면 된다. 각도 값을 시리얼 모니터로 관찰 해보면 숫자 값 끝자리가 1~2 정도 왔다 갔다 하는 것을 볼 수있을 것이다. 이 런 값들이 모터 회전에 지속적으로 영향을 주니 모터가 떨게 된다. 따라서 이런 경우에는 값의 변화가 3~5이하는 모터가 회전 하지 않도록 하는 코드를 넣어 해결 할 수 있다. 아래에 이와 관련한 보강된 코드를 기술하였으니, 참고하길 바란다.
※ 즉, 본 게시글에서 해결한 방법은 VAR 값(ADC변환값)의 변화가 시리얼 모니터로 확인해 보면 1~2 값 정도씩 잦은 변화를 일으키고 있어 이것이 그대로 모터에 반영되다 보니 떨림이 나타나는 것으로 보이기 때문에, -4 ~ +4 사잇 값의 VAR값 변화는 그냥 무시하는 형태로 코드를 추가해 넣어 해결해 본 것으로 실습 하였으니 참고하세요.
- 서보모터 연결을 해제 하는 명령어를 이용한다.( detach() )
블루투스 통신회로에 이 것을 실험해 본 결과 가장 개선 효과가 큰 방법이었다. (적용 회로에 따라 다를 수 있음)
즉, 서보모터를 아두이노 코드 라이브러리로 제어할 때 서보모터와 연결 시키는 코드인 "attach(xx) " 함수를 사용하여 해당 핀 번호에 연결시켜 제어하게 되는데, 특정 순간에는 연결 해제하는 명령인 detach()를 사용하여 작은 입력 값의 변동에 대해서는 서보모터를 작동 시키지 않도록 하는 일종의 트릭을 사용해서 해결 할 수 있다.
[ 해결 코드 (예시)]
A. 기본 코드 예시)
#include <Servo.h> #define servoPin 10 #define VAR A0 Servo myservo; void setup() { Serial.begin(9600); myservo.attach(servoPin); //10번 핀과 모터 연결 pinMode(servoPin, OUTPUT); } void loop() { int varValue = map(analogRead(VAR), 0, 1023, 0, 179); Serial.println(varValue); myservo.write(varValue); delay(10); // 서버모터가 움직일 시간을 트 }
B. 보강 코드 예시)
#include <SoftwareSerial.h> #include <Servo.h> #define servoPin 10 Servo myservo; #define VAR A0 int conVAR=0; int currentVar=0; int previousVar=0; void setup() { Serial.begin(9600); myservo.attach(servoPin); //10번 핀과 모터 연결 pinMode(servoPin, OUTPUT); } void loop() { conVAR = map(analogRead(VAR), 0, 1023, 0, 179); currentVar = constrain(conVAR,2,178); Serial.println(currentVar);
// 0~4 사이 값의 변화는 모터에 출력을 보내지 아니함 (값 조절 가능) if ((currentVar > previousVar+4) or (currentVar < previousVar-4)) { myservo.attach(servoPin); myservo.write(currentVar); delay(90); // 서버모터가 움직일 시간을 줌 previousVar = currentVar; }
// 서보모터 연결을 해제하는 트릭으로 모터가 움직이지 않토록 함
myservo.detach(); // 서보모터 연결 해제
}
<보강된 코드로 해결 된 영상>
다음번 글 영상에서는 블루투스 통신으로 제어되는 흔들림 보정된 영상을 올릴 예정
※ 매우 만족스럽게 해결 된 것을 볼 수 있다.
물론, 단순히 위의 기본 코드만 가지고, 별다른 센서 사용없이 직접제어를 한다면, 보강 코드 없이도 서보모터의 떨리는 증상 없이 잘 작동 할 수는 있다. 하지만, 서두에서 언급한 것 처럼, 특정 센서나 블루투스 모듈등을 사용하여 응용하거나 할 때 이런 문제가 심각하게 발생할 수 있다. 또한 반드시 해결하기를 원한다면, 이상과 같은 처리나 보강 코드로 해결을 시도해 보기 바란다. 물론, 적용하려는 회로에 따라 해결이 바로 안 될 수도 있겠지만, 앞서 설명한 내용을 차분히 되짚어 본다면, 충분한 해결점에 도달 할 수 있을 것으로 생각된다.
【 아두이노모듈#17】아두이노 2대로 블루투스 통신하여 LED ON/OFF 제어하기! (HC-05)
지난 시간 HC-05 모듈을 이용해서 블루투스 설정과 기본 페어링에 대해 학습해 보았다.
이번 시간 부터는 본격적으로 블루투스 상호간 통신을 활용한 응용작품 들을 구현해보고자 한다.
선없이 무선으로 컨트롤 된다는 것은 매우 매력적이며, 관심과 흥미 또한 엄청나게 커질 것이다.
그 첫 시간으로 블루투스(회로) 기기 상호간 버튼제어를 해보려 한다. BT Master(회로)에서 버튼을 누르면, BT Slave(회로) 에서 LED가 켜지도록 할 것이다. 또한 그 반대도 가능하도록 두 회로 모두 버튼과 LED를 달아서, 동일한 회로 두개를 만들면 된다. 코딩도 마스터, 슬레이브 구분 없이 동일한 코드를 사용한다.
(단, 기계식의 버튼(스위치)을 사용하게 되면 , 예전에 다룬 것처럼 채터링 현상(바운싱)이 일어 나게 되니, 채터링 방지 루틴을 참고하여 넣을 것이다. 아래, 선수 학습 참조)
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); } } }
아두이노 두 대 상호간 통신을 통해 데이터를 서로 주고 받을 수 있는 방법이 있다. 바로 블루투스 모듈인 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 통신 명령어를 이용하여 마스터/슬레이브 설정과 여러가지 설정이 가능해진다.
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 단자는 연결하지 않으며, 블루투스 모듈의 보호를 위해 분배저항을 반드서 넣어서 작업한다.
※ 분명 똑같이 한 것 같은데, 영상에서 처럼 동작이 안 될 경우가 있을 것이다. 아래 몇 가지 사항을 체크 해보자.
[ 블루투스 페어링(연결)의 기본 조건 : 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된 기기 정보 리스트를 보거나 삭제 할 수 있는 명령어들이 있으니 필요할 경우 참고하면 좋을 것이다)
위 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는 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모드 진입이 반드시 필요하다면, 새로 최신 펌웨어 버전의 블루투스 모듈을 구매하길 바란다. 그렇게 하는 것이 정신건강에 좋다. 그리고 같은 판매처에서 구매하다보면, 다른 버전을 구매해도 같은 제품이 배달되는 경우가 더러 있는 것 같으므로, 구매처를 바꾸어 구매하는 것이 좋을 것 같다.
▶ 실습 목표 : 1. [ 키보드 키 값 제어 함수에 대해 이해할 수 있다. ] 2. [ 레오나르도 보드를 이용해 PC를 제어(종료)할 수 있다. ]
3. [ 레오나르도 보드와 Joystick 모듈을 이용해 PC 마우스를 만들어 볼 수 있다. ]
▶ 실습 회로도면 : (이미지 클릭하면 확대 가능)
▶ 프로그램 코드 및 설명 1 :
/* 아두이노 조이스틱 마우스 만들기 */
#include <Mouse.h> const int LEFT_BT=4; //마우스 좌버튼 const int MIDDLE_BT=3; //마우스 가운데 버튼 const int RIGHT_BT=2; //마우스 우버튼 const int X_AXIS =0; //마우스 X 축 (A0) const int Y_AXIS =1; //마우스 Y 축 (A1)
void setup ( ) {
Mouse.begin(); // 마우스 컨트롤 관련 함수 선언 pinMode(LEFT_BT, INPUT); pinMode(MIDDLE_BT, INPUT); pinMode(RIGHT_BT, INPUT);
}
void loop ( ) {
int xVal=readJoystick(X_AXIS); //x축값 읽어 저장 int yVal=readJoystick(Y_AXIS); //Y축값 읽어 저장
Mouse.move(-xVal, yVal, 0); //해당 좌표로 마우스 이동 // '-' 부호를 통해 상하좌우 위치 반대로 조정 가능 readButton(LEFT_BT, MOUSE_LEFT); //좌측 버튼 readButton(MIDDLE_BT, MOUSE_MIDDLE); //가운데 휠 버튼 readButton(RIGHT_BT, MOUSE_RIGHT); //우측 버튼 delay(5); }
int readJoystick(int axis) { int val=analogRead(axis); val=map(val, 0, 1023, -4, 4); //입력값 맵핑(미세조정 :-3,-3 ~ -10, 10) if(val <=2 && val >= -2) // 미세한 이동 값은 반영 되지 않도록 함 return 0; else return val; //맵핑된 값 전달 }
// 버튼 누름 판별하여 마우스 클릭 처리 (함수) void readButton(int pin, char mouseCommand) { // 버튼을 눌렀을 때, if(digitalRead(pin)==HIGH) { if(!Mouse.isPressed(mouseCommand)) { //클릭상태가 아니라면, Mouse.press(mouseCommand); // 클릭 처리 } } else { // 이미 클릭 되어 있던 상태라면 if(Mouse.isPressed(mouseCommand)) { Mouse.release(mouseCommand); //릴리즈(누르지 않음)처리 } } }
아두이노 레오나르도(Leonardo)를 이용하여 주변이 어두워지면, PC를 자동으로 종료 시켜 보도록 하자. 원리는, 레오나르도 보드는 키보드(마우스)와 같은 장치로 인식되며, <Keyboard.h> 함수를 활용하여, 키보드 키값을 PC로 입력할 수 있다. 이에 따라 '윈도우 종료 단축키를 활용하거나, shutdown.exe 명령과 조합하면 PC를 쉽게 종료시킬 수 있다.
본 내용에서는 윈도우 운영체제를 기준으로 하지만, 내용을 잘 참고하면, 다른 OS의 PC도 종료 가능 할 것이다.
▶ 실습 목표 : 1. [ 레오나르도 보드에 광센서(cds)를 연결하여 제어할 수 있다.] 2. [ 키보드 키 값 제어 함수에 대해 이해할 수 있다. ] 3. [ 레오나르도 보드를 이용해 PC를 제어(종료)할 수 있다. ]
▶ 실습 회로도면 : (이미지 클릭하면 확대 가능)
▶ 프로그램 코드 및 설명 1 :
/* 어두워지면 자동 PC 종료 시전하기 */
/* 어두울 때 자동 PC 종료 시키기 */
#include <Keyboard.h>
const int CDS = 0; //cds 센서를 A0 포트에 연결
const int PC_Off = 10;
void setup ( ) {
Keyboard.begin(); //키보드 컨트롤 관련 함수 선언
Serial.begin(9600);
}
void loop ( ) {
int Brightness = analogRead(CDS); //조도값을 읽음
Serial.println(Brightness);
// PC_Off 값 이하가 되면 종료 배치파일(단축키) 실행
if(Brightness < PC_Off) {
Keyboard.press(KEY_LEFT_CTRL); // '왼쪽 윈도우 키'
Keyboard.press('x'); //소문자'x', ASCII값 (120)도 가능
delay(200); // 일정시간 값이 입력 되도록 시간지연
Keyboard.releaseAll( ); // 키를 계속 누르지 있지 않도록 함
delay(200);
Keyboard.press('u'); // ‘u’ 단축키 누르기|
delay(200);
Keyboard.releaseAll( );
delay(200);
Keyboard.press('u'); // ‘u’ 단축키 한번 더 누르기|
delay(200);
Keyboard.releaseAll( ); delay(200); }
} // ※ 단, 윈도가 업데이트 필요한 상태이면 업데이트를 완료해야 적용 됨
② 항목 위치 입력 란에, 다음을 입력 : ' shutdown.exe -s -f -t 60 '
→ 띄어 쓰기 주의! 옵션 : -s (윈도우 종료) , -f (실행중프로그램도 강제종료)
-t 60 (60초 후 종료, 1시간 후 종료는 3600, 즉시 종료는 0 입력)
③ 바로가기 이름 제목에 PC종료(아무 이름 입력 가능)
④ 바로 가기 키 부분에 마우스 커서를 클릭 해놓고 Ctrl +Alt 키를 누르면서 'x' 키를 누르면 자동으로 단축키가 입력됨
⑤ 바로가기 단축키는 Shift 도 가능하고, x 아닌 다른 문자 등의 조합, 2키 조합, 모두 가능, 단 윈도우 응용프로그램 등에서 사용하는 단축키와 겹칠 수 있기에 사용하지 않는 단축키로 지정하면 되고, 'x' 와 같은 알파벳은 소문자를 입력해도 자동으로 대문자로 입력이 된다. 하지만 아두이노 프로그램에서는 반드시 소문자로 입력해야 함.
⑥ 만들어진 "PC 종료" 바로가기 아이콘
이제 'Ctrl+Alt+x' 키를 실행해도, 또는 이 파일을 직접실행 더블 클릭 실행하여도 PC가 종료 될 것이며, 아두이노와 CDS 센서를 이용하여 어두워지면 자동으로 PC를 종료시켜볼 수 있다.
★ 바로가기( shutdown.exe ) 파일 활용의 장점 :
바로가기 파일 없이, 윈도우 단축키 만으로도 종료가 가능하나, 운영체제 별로 단축키가 다르기 때문에 불편하고, shutdown.exe 바로가기를 만들면 단축키를 원하는대로 지정 고정 시킬 수 있어서 좋다.
아두이노 레오나르도(Leonardo)를 이용하여 밝기에 따라 PC화면을 잠금 모드로 전환 시켜보자 !
원리는, 레오나르도 보드는 키보드(마우스)와 같은 장치로 인식되며, <Keyboard.h> 함수를 활용하여, 키보드 키값을 PC로 입력할 수 있다. 이에 따라 '윈도우 화면 잠금' 단축키 ( '윈도우키' + 'L') 를 입력시켜 화면 잠금을 제어할 수 있는데, 광도전셀(cds) 소자를 이용해 어두울 때 화면 잠금이 되도록 구현 할 수 있다.
Let's get it~!
▶ 선수 학습 : 1. [레오나르도 활용#1]레오나르도 보드 사용법(보드 스팩& 설치-연결 참조) ☜ (클릭) 2. [아두이노 기초#3]포토레지스터(CDS)제어(cds 광센서 참조) ☜ (클릭)
▶ 실습 목표 : 1. [ 레오나르도 보드에 광센서(cds)를 연결하여 제어할 수 있다. ] 2. [ 키보드 키 값 제어 함수에 대해 이해할 수 있다. ] 3. [ 레오나르도 보드를 이용해 PC를 제어할 수 있다. ]
▶ 실습 회로도면 : (이미지 클릭하면 확대 가능)
▶ 프로그램 코드 및 설명 1 : /* 어두울 때 자동 PC 잠금모드 시키기 */
#include <Keyboard.h> const int CDS = 0; //cds 센서를 A0 포트에 연결 const int PC_Hold = 30; void setup ( ) { Keyboard.begin(); //키보드 컨트롤 관련 함수 선언 Serial.begin(9600); }
void loop ( ) { int Brightness = analogRead(CDS); //조도값을 읽음 Serial.println(Brightness); // PC_Hold 값 이하가 되면 잠금모드 키 실행 if(Brightness < PC_Hold) { Keyboard.press(KEY_LEFT_GUI); // '왼쪽 윈도우 키' Keyboard.press('l'); //소문자'l', ASCII값 (108)도 가능 delay(100); // 일정시간 값이 입력 되도록 시간지연 Keyboard.releaseAll(); // 키를 계속 누르지 있지 않도록 함 } }
【 Leonardo #3】Visualize Temperature&Brightness Data on your PC withLeonardo
Using the Arduino Leonardo board, you can store data from a temperature sensor and a light sensor (CDS) in real time on a PC. This data can be visualized through the Processing IDE. Let's have fun!
1. Screen size (width x height pixels): 500 x 500)You can connect and operate the temperature sensor (Tmp36) and the light sensor (cds) circuit on the Leonardo board.
2. Background color and lines: background (180), stroke (0), strokeWeight (5), fill (255, 20)You can send data from the temperature sensor and the light sensor to the notepad.
3. Circle drawing uses ellipse (x, y, diam, diam) functionTransmitted data can be visualized with processing IDE coding.
▶ 실습 목표 : 1. [ 레오나르도 보드에 온도센서(Tmp36)와 광센서(cds) 회로를 연결하고 동작시킬 수 있다.] 2. [ 온도센서와 광센서로 부터의 데이터 값을 PC메모장을 통해 전송 시킬 수 있다.] 3. [ 전송된 데이터를 엑셀 등을 이용해서 활용해 볼 수 있다 ]
4. [ 전송된 데이터를 프로세싱 IDE 코딩을 통해 보기 좋게 비주얼화 시킬 수 있다. ]
▶ Connection diagram : ( Click image to enlarge )
▶ 실행 결과 이미지 :
온도 밝기 센싱값 출력화면
▶【Arduino Coding】 : /* Leonardo board Transfer temperature & brightness data to PC with Leonardo board */
#include <Keyboard.h> const int TEMP = 0; // A0 port const int CDS = 1; // A1 port const int LED = 12; const int BUTTON = 11; boolean lastBtn = LOW; boolean currentBtn = LOW; boolean running = false; int counter = 1;
void loop ( ) { currentBtn = debounce (lastBtn); if (lastBtn == LOW && currentBtn == HIGH) //Click the button { running = !running; // Change state values backwards } lastBtn = currentBtn; // Update button state values if (running) // Writing data { digitalWrite(LED, HIGH); // The millis () function returns the data in ms. // So this function is used when the delay () function is not available if (millis()%1000 == 0) // Execute if statement every second { int temperature = analogRead(TEMP); int brightness = analogRead(CDS); float mVoltage = temperature*5000.0/1024.0; //Converted to Celsius temperature float TempDotC = (mVoltage - 500) / 10.0; //Converted to Celsius temperature Keyboard.print(counter); // Data numbering before each line Keyboard.print(","); Keyboard.print(TempDotC); // Temperature data Keyboard.print(","); Keyboard.print(brightness); // Brightness data Keyboard.print("\n"); counter++; } } else { digitalWrite(LED, LOW); } }
// Generate subfunctions to prevent button bouncing boolean debounce(boolean last) { boolean current = digitalRead (BUTTON); if(last != current) { delay(5); current = digitalRead(BUTTON); } return current; }
▶ Arduino Code download : ( The code is zip compressed.)
▶ Making Processing Font (In order to use the window font on the processing output screen, it is necessary to convert the bitmap font into a usable bitmap font in the following process)
[Tools menu 》 "Create font" 》 Select font (size) 》 "Click OK" 》 Copy file name 》 "Paste into processing code]
▶ Troubleshooting : 【 If you get the following error when running a sketch in the Arduino IDE: 】
If the above error appears, you need to confirm that you have selected the board as a Leonardo board from the board menu under Tools menu in the Arduino sketch. If the board selection is not selected by Leonardo, it will not be able to run even if it is compiled, and this will cause a 'Keyboard' error.