- 아두이노에 푸쉬버튼 스위치를 달고 버튼의 입력을 감지하여 LED를 켜고 끄는 실습을 진행합니다.
- 버튼제어는 비록 단순해 보이지만 아두이노를 다루는데 있어 핵심적인 개념입니다. 버튼이라는 입력 조건에 따라 LED라는 출력을 제어하는 개념입니다.
- 그리고 여기에 필요한 코딩을 연습하고 이해함으로서, 아두이노의 입력에 따른 출력제어라는 중요한 개념이해가 되는 것입니다.
- 이 번 개념을 잘 이해하면, 입력에 버튼이 아니라 각종 센서를 대체하고, 출력에 LED가 아니라 모터나, LCD등의 디스플레이 등으로 연결하면, 활용가능성이 무한대로 늘어나고 이를 제어 할 수 있는 기본기를 익히는 것이기 때문에 이후 학습에 있어서 매우 중요하다고 할 수 있습니다.
: 푸쉬 버튼을 누를 때 마다(누르고 있는 동안 계속) 불이 들어 오면 정상 동작 하는 것입니다.
오늘 학습내용은 여기까지 이며, 다음 학습영상을 기대해주세요~
감사합니다. ~~~ ^^
=== 아두이노 에러 대처 법 ===
1. 흔히 저지르기? 쉬운 에러 상황 #1
- 두 단어의 조합으로 구성된 아두이노의 명령어는 두 번째 단어 첫 문자를 대문자로 표시하여 정해 놓았다.
- 대·소 문자를 구분하지 않아 아래와 같은 에러를 발생시키는 경우가 종종 있다.
2. 흔히 저지르기? 쉬운 에러 상황 #2
- 한 줄 코드 끝부분에는 반드시 ';' 세미콜론을 넣게 되어 있으나, 이를 빼먹는? 경우가 종종 발생한다.
=== 아두이노 코딩을 잘하는 비결 ===
: (#1) 책이나 교재 혹은 타인의 코드를 그대로 따라 해보고 동작이 되었다고 해서 바로 다음 과제로 넘어가지 마라!
에러 없이 동작된 코드를 놓고, 궁금한 부분을 이리저리 만저보면서 변경해보는 실험들을 스스로 충분히 해보아야 한다. 대부분의 경우 동작만 성공한 것이지 특정 코드부분을 이해하지 못한채 새로운 코드를 학습하게 되기 때문이다. 물론 여러번 해봐도 완벽히 이해되지 않을 때는 우선 넘어가도 좋다. 이럴때는 나중에 다시 이해할 수 있는 기회가 생긴다.
(#2) 아두이노 공부를 하면서 닥쳐오는 수많은 에러에 스트레스를 받지 마라~!
근력운동할 때 괜시리 무겁고 버거운 기구를 드는게 아니듯, 발생되는 각종 다양한 에러를 경험하고 찾아내는 과정 속에서 여러분의 코딩 근력이 형성된다. 코딩을 배울 때 에러 경험을 많이 하면 할 수록 좋다. 경험하고 학습된 에러는 이후 잘 반복되지 않으며, 경험으로 비추어 쉽게 찾아 낼 수 있기 때문이다.
조이스틱은 직관적인 인터페이스 덕분에 활용성이 높으면서도 복잡않아 여러가지 응용 작품을 만들때 자주 사용된다.
주로 움직임 동작이 필요한 RC카 제어나, 드론, 게임기 제어 등에 사용된다.
따라서 조이스틱의 기본 사용법을 익혀보면 여러가지 프로젝트에 도움이 많이 될 것이다.
이번 시간은 조이스틱 모듈의 기본적인 동작원리에 대해 다루어 보도록 하겠다.
▶ 선수 학습 :
없음.
▶조이스틱 모듈 (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 를 아날로그 단자에 연결 -영상과 같은 회로] 스위치 눌림에 따라 값이 입력되도록 하였으며, 따라서 눌림의 정도가 일정하지 않음
[ 회로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 신호를 활용할 수 있습니다
RFID(Radio Frequancy Identification)는 무선 주파수를 이용하여 RFID 태그와 RFID리더간 데이터를 교환하는 장치이다.
교통카드, 학생신분증 겸용카드, 연구실 및 회사 출입문카드, 구내식당 카드, 마트 등의 상품 진열 및 관리 등등 다방면에서 이용되고 있다.
지난 실습에서 아두이노와 RFID모듈을 연결하고 특정 ID카드의 ID를 등록하여 시리얼모니터를 통해 승인 또는 거부 표시를 해보았다. 이번에는 좀더 실제적으로 응용이 가능하도록 서보모터와 LED를 이용해서 도어락 기능을 구현해보려 한다. 선수학습을 잘 따라왔다면, 크게 어렵지않고 더욱 흥미가 생길 것이다.
5. [ '서보 모터'와 , 'RGB LED'를 적용하여 RFID모듈 제어를 할 수 있다.]
▶ 실습 회로도면 : (이미지 클릭하면 확대 가능)
▶ 실습 절차 :
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// 리셋 핀 설정 MFRC522rfid(SS_PIN, RST_PIN);// 'rfid' 이름으로 클래스 객체 선언
#include <Servo.h>// 서보 라이브러리를 지정
#define servoPin 8// 서보 모터핀을 지정
Servo servo;// 서보 라이브러리 변수를 선언
intpos=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())
#include <SPI.h> #include <MFRC522.h> #define SS_PIN 10// spi 통신을 위한 SS(chip select)핀 설정 #define RST_PIN 9// 리셋 핀 설정 MFRC522rfid(SS_PIN, RST_PIN);// 'rfid' 이름으로 클래스 객체 선언
void setup ( ) {
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())
Serial.println(); Serial.print("Message : "); content.toUpperCase(); // UID값이 아래 값과 같으면 승인 처리 if (content.substring(1) == "85 7C FB D1") // 승인 하고자하는 UID 기록 { Serial.println("Authorized access"); Serial.println(); delay(3000); // 카드 접촉 및 연속체크 시간에 대한 딜레이 주기 } // UID값이 다르다면 엑세스 거부 처리 else{ Serial.println(" Access denied"); delay(3000); // 카드 접촉 및 연속체크 시간에 대한 딜레이 주기 }
3. 설치된 라이브러리가 제공하는 예제파일을 열어 실행시킨다. (ReadNUD : UID 스캔 프로그램)
(메뉴 : 파일 》 예제 》 MFRC522 》 ReadNUD 클릭)
4. 프로그램을 동작시키고 카드키를 RC522본체에 접촉시킨 후 시리얼 모니터창을 통해 UID값을 확인한다.
▶ 프로그램 코드 및 설명 :
/* RC522.h 라이브러리에 포함된 ReadNUID 예제 참조 */
#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' 이름으로 클래스 객체 선언 MFRC522::MIFARE_Key key; byte nuidPICC[4];// 카드 ID들을 저장(비교)하기 위한 배열(변수)선언
void setup ( ) {
Serial.begin(9600); SPI.begin(); // SPI 통신 시작
rfid.PCD_Init(); // RFID(MFRC522) 초기화
// ID값 초기화
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
// MIFARE 타입의 카드키 종류들만 인식됨을 표시
Serial.println(F("This code scan the MIFARE Classsic NUID."));
Serial.print(F("Using the following key:"));
printHex(key.keyByte, MFRC522::MF_KEY_SIZE);
}
void loop ( ) {
// 새카드 접촉이 있을 때만 다음 단계로 넘어감
if ( ! rfid.PICC_IsNewCardPresent()) return;
// 카드 읽힘이 제대로 되면 다음으로 넘어감 if ( ! rfid.PICC_ReadCardSerial())
지난시간 스마트 화분을 만들고 수분의 상태를 간단히 체크할 수 있는 FND ( 7 Segment)를 부착해 보았다.
이번에는 여기에 LCD를 추가하여 화분의 수분 상태를 좀더 그럴싸(?)하게 출력해보고자 한다.
아울러 이런 과정을 통하여 LCD를 다루는법과 코딩 연습에도 도움이 될 것이다.
처음부터 멋지게 코딩을 잘짜는 천재는 없다. 이것 저것 여러가지 방법으로 직접코딩해보고(Ctrl+C, Ctrl+V는 지양) ,수많은 연습을 거치면서 경험이 쌓이다 보면 코딩이 점점 쉬워지며, 비로소 코딩능력이 갖춰지는 것이다. 무엇보다 할 수 있다는 자신감을 갖는 것이 중요하다. 태어나면서 부터 코딩전문가가 따로 있는 것이 아니지 않는가? 지금의 어떤 분야 전문가들도 기껏(?) 대학때 공부한 것으로 전공을 정해서 시작한 후로 제대로 공들인 시간은 그렇게 많지는 않을 것이다. 그 어떤 완전 무지한 분야라도, 그래서 생초보부터 시작하더라도 집중과 몰입을 해준다면 충분히 그 분야 전문가 수준의 역량을 쌓을 수 있다. 그러니 스스로 "나는 저쪽은 잘 몰라?", "저 것은 할 수 없을 거야?" 라는 스스로의 한계선을 미리부터 긋지 말았으면 한다.
다시 본론으로 돌아가서, 지난시간 토양습도센서 모듈에서 나오는 아날로그 출력 단자(AO) 값(0V~5V)을 아두이노의 아날로그 입력(A0)단자로 받아서 FND로 출력해 보았다. (0~9의 10단계 숫자 값)
맵핑이라는 함수를 사용하여 쉽게 처리 할 수 있었는데, ex) map(sensorVal, 0, 1023, 9, 0);
이번에는 여기에 LCD를 추가하도록 해볼 예정이다. LCD상에 숫자도 표현하고, 화분속의 수분의 상태를 직관적으로 알수 있도록 레벨바 형태로 표시해보고자 한다. (오늘 과제에서 FND 부분은 생략해도 상관이 없다)
▶ 2. 또 한가지 LCD관련 에러는 , no matching function for call to ‘LiquidCrystal_I2C::begin(); 라고 뜨는 경우!
라이브러리 파일도 똑같은 이름이지만, 제공자에 따라 내부코드가 다른 라이브러리인 경우가 종종 있어요. 그래서 만약 제가 실험에서 사용한 라이브러리가 아닌, 같은 이름이지만 다른 라이브러리를 사용할 경우 위와 같은 에러 표시를 낼 수 있습니다. 라이브러리는 분명 설치되어 있지만 그래서 프로그램이 인지는 하는데, 코드에서 사용한 함수 적용이 되지 않을 때 이런 에러를 띄우게 됩니다. 그럼, 해결책은 실험에 사용한(적용한) 그 라이브러리를 다시 설치해 주어야 하는데요, 이 때 중요한 것은 아두이노에서는 똑 같은 이름의 라이브러리가 두 개 설치될 경우 또다른 중복에러를 띄우게 됩니다. 그러니 잘 못 설치된 라이브러리는 찾아서 반드시 삭제하거나, 다른이름으로 임시 변경해 놓거나, 나중에 다른 프로그램에서 사용해야 할 경우를 대비해서 압축해 놓고 원본은 지워 놓으면 됩니다.
그럼 기존 라이브러리를 찾아서 삭제를 하거나 하려면 설치된 라이브러리를 찾아야 겠죠?
찾는 위치는 보통 아래 두 곳입니다. (윈도우10 기준이며, 윈도우7도 비슷한 위치)
두 곳으로 나뉘어 설치되는 이유는 아두이노 IDE의 "라이브러리 관리 메니저" 창을 통해 검색으로 설치되는 기본위치가 있고(아두이노 설치된 경로), '.zip 라이브러리' 추가로 설치되는 위치가(도큐멘트 문서 저장영역-Doucuments) 따로 있어서 그렇습니다.
< .zip 라이브러리 추가 메뉴에서 추가한 라이브러리 설치 위치 >
1. C:\Users\유저-이름\Documents\Arduino\libraries
<라이브러리 관리 메뉴창에서 라이브러리 직접 검색으로 설치된 라이브러리 위치 >
2. C:\Program Files (x86)\Arduino\libraries
위 두 곳에서 찾아서 삭제를 하세요. (그냥, 폴더 째로 삭제하면 됩니다.)
그리고 아래 첨부하는 라이브러리를 다운받아 압축파일 그대로 .zip 라이브러리 추가 메뉴로 추가해 주세요.
만약, 압축파일 그대로 추가할 때 에러가 난다면, 앞축을 풀고 xxxxx.h 가 있는 폴더만 "C:\Users\유저-이름\Documents\Arduino\libraries" 경로에 붙여넣기 하면 됩니다. 이때 아두이노 스케치 IDE는 모두 닫고 재실행 해야 적용 됩니다.
본 예제에서 사용한 라이브러리 다운로드 받기 :
※ 중요! : 여기에서 제시된 코드로 작성할 경우 반드이 이 라이브러리로 설치하셔야 합니다. 만약, 여러분의 PC에 똑 같은 이름의 라이브러리가 있을 경우 반드시 삭제를 하거나 압축해서 백업을 해 놓으면 충돌이 일어나지 않습니다.!!!
▶ (추가) L9110S 모터 모듈을 보강한 회로도:
앞서의 회로는 기본 아두이노 전원으로 LCD와 FND 그리고 모터를 돌려야 하기 때문에 동작이 조금 불안정 할 수 있어요. 따라서 모터에 공급되는 출력을 증폭시켜 줄 수 있는 모터드라이버 모듈을 보강한 회로와 관련 코드를 첨부하니 참고하세요. 참고로, 그래도 불안정할 경우, 모터드라이버 모듈에 별도의 전원 3.5V~5V(펌프모터 허용 전압)을 공급해주면 훨씬 안정적이고 더욱 오래 작동됩니다. 이때, GND를 아두이노 회로의 GND와 합선(결합) 시켜 주면 됩니다.
※ 시중에 YL-38, YL-69 두 종류가 있다, 기능상의 차이는 없으며 핀배열이 조금 상이할 뿐이다. 여기서는 YL-38을 가지고 제작 하려고 한다.
▶워터 펌프 스팩
※ 위에 사용된 호수는 외경이 6 mm 이고 내경이 4mm 입니다. 그리고 펌프 출수구에 호수를 끼울때 호수를 출수구 바같으로 감싸듯 끼우게 되는데요, 펌프출수구의 외경이 7.4mm 됩니다. 이렇게 어느정도 역으로 크기 차이가 나야 호수가 수압에 의해 쉽게 빠지지 않습니다. 다만, 지금 정도의 차이에서, 끼워보니 상당히 빡빡했어요. 이럴때는 호수 내부에 물기를 살짝 묻혀서 끼워보면 조금 쉽게 끼워집니다. ^^
▶ 실습 목표 :
1. [ 토양습도 센서에 대해 이해 할 수 있다. ]
2. [ 워터펌프에 대해 이해 할 수 있다. ]
3. [ 토양 센서 값에 따라 펌프를 작동시켜 물공급 조절을 할 수 있다.]
▶ 실습 회로도면 : (이미지 클릭하면 확대 가능)
※ 위 회로에 대해 모터 작동이 원활 하지 않을 수 있고, 장시간 사용시 아두이노 보드에 무리가 갈 수 있어 아래 처럼 NPN타입의 TR과 저항을 추가하여 보강하였다. 가급적이면 아래 회로를 참조하여 구성해주면 좋을 것이다.
(TR은 NPN 타입의 ' 2SC 9013 '을 사용하였으나, TR 타입이 NPN타입 이면 어떤 것이든 동일하게 사용 가능하다. )
- C9011과 C9012, C9013은 모두 핀 배열이 동일함( E B C)
- C1815는 핀배열이 E C B 임
[ 위 회로에서 주의 하셔야 할 것은 아두이노 회로에서 주로 사용되는 TR의 경우(2SA, 2SC타입) NPN형 타입은 PNP형 타입과 마찬가지로 핀의 순서가 있으니 주의 하셔야 합니다.
우선, 도면에 사용된 NPN형 TR은 2SC9011 이며, 라벨이 적인 면의 왼쪽을 기준으로 핀 이름이 1. 2SC9011 : - E B C - 순서로 되어 있고,
2. 2SC1815 : - E C B - 순서로 되어 있으니 반드시 확인 후 연결하세요.
또한, 이외의 TR을 사용할 경우 미니 테스터기 혹은 인터넷 검색으로 핀 순서를 확인하여 도면대로 연결하시면 문제 없이 동작 할 거예요. ]
[ 추가로 위 회로의 모터 연결 방식은 장시간 사용하기에는 좀 무리가 따르며, 전원을 별도로 넣어 줄 수 있는 릴레이 모듈이나, L298 모터 드라이버 모듈을 연결해서 사용하시는 걸 권장합니다. 조만간 보강된 회로의 업로드 버전도 올려 볼게요. ^^; ]
▶ 실습 절차 :
1. 부품을 준비하여 위와 같은 회로를 구성한다.
2. 물펌프는 물통 속에 담겨진다. 따라서 물펌프의 전선이 빠져나오는 부분은 필요한 경우 글루건 등으로 보강처리 할 필요가 있다.
3. 우선 본 실험처럼 작은 물통을 준비하고, 간이 화분을 준비해서 실험을 해 본 후 실제 화분에 설치해보면 좋을 것이다. 또한 필요한 경우 센서를 두 개 이상 설치할 수도 있고, 두개의 화분을 하나의 보드로 연결하여 관리 해 볼 수 있을 것이다.
4. 다음 버전에서는 수분 값 등을 FND 혹은 LED, LCD 등을 부착하여 표시해보려고 한다.
아두이노를 사용하다보면 대부분 5V~12V 사이의 회로 위주로 제어하게 되는데, 실생활에서 사용되는 선풍기, 등기구 등의 제어를 하고 싶어 질 때가 있다. 이를 가능하게 해주는 부품이 바로 릴레이 이며, 낮은 전압으로 높은 전압을 사용하는 기기 제어가 가능 한 것이 릴레이 사용의 주 목적이다.(코일의 유도전기 원리 이용)
릴레이 부품을 직접 사용하여도 좋지만, 여기서는 아두이노에서 간단한 핀연결 만으로 사용할 수 있는 릴레이 모듈을 소개하고자 한다. 또한, 1채널(1ch)릴레이에 대해 소개하지만, 2ch 이상의 모듈을 사용하면 동시에 여러가지 기기기를 제어 할 수 있다는 것을 기억하면 도움이 된다.
또한, 릴레이를 멀티탭이나 콘센트에 직접 설치하여 제어하게 되면 거의 모든 전기 제품을 제어 할 수 있을 것이다.
▶ 선수 학습 :
없음.
▶
릴레이모듈 (1ch, JQC-3FF-S-Z) 세부 스팩
※ 릴레이 사용법 - 릴레이는 코일에 전류를 흘려 코일의 유도 작용에 의해 접점을 On / Off 해주는 스위치이다. - 이를 이용하면, 낮은 전압(예, 5V)으로 220V의 전원을 끊거나 연결시킬 수 있다. - 좌측 IN에 HIGH(또는 LOW) 신호가 가해지면 Com단자와 NO 단자가 연결되어 스위치 형태로 작동 된다. - NC (Normal Close : 평상시 연결되어 있음) - NO (Normal Open : 평상시 열려 있음, 연결 끊어짐)
- NC단자와 Com 단자가 디폴트로 연결 되어 있고, 릴레이가 동작이 되면 이 연결이 끊어지고, Com단자가 NO단자와 연결이 됩니다. 이 부분을 전기제품이나 콘센트의 한 쪽 부분의 연결을 끊어 스위치 형태로 구성할 수 있다.
▶ 실습 목표 :
1. [ 릴레이의 사용목적에 대해 이해 할 수 있다. ]
2. [ 릴레이 모듈의 동작 방법에 대해 이해 할 수 있다.]
3. [ 등기구를 대신한 LED의 On/Off 제어 회로를 이해 할 수 있다.]
▶ 실습 회로도면 : (이미지 클릭하면 확대 가능)
※ 부품 목록 :
▶ 실습 절차 :
1. 부품을 준비하여 위와 같은 회로를 구성한다.
2. 여기서 소개하는 릴레이가 아니더라도 동일하게 구성하면 되고, 9V, 12V 릴레이 모듈을 사용할 수 있도록 별도 전원연결 형태로 회로를 그렸으나, 5V 릴레이의 경우 릴레이에 별도전원 연결 없이 , 아두이노 전원만으로도 충분히 사용가능하다. (아래 실제 제작 동영상 참조)
3. 아래 코딩을 실행하면 LED가 On 되어 있으며, 푸쉬버튼 스위치를 누르게 되면 LED가 Off 된다. 이와 같이 동작 확인이 되면, 반대로 동작하도록 코딩의 내용을 스스로 변경해보라.
※RTC(리얼 타임 클럭) 모듈은 DS1307과 DS3231 두 종류가 많이 사용된다. 두 모듈의 차이는 DS3231 모듈의 오차가 1년에 수분 정도로 조금 더 정밀도가 높아 진 것인데, DS1307을 사용해도 큰 오차가 나는 것이 아니기에 걱정말고 사용해보자. (DS1307 : 한 달 약 5분 미만, DS3231 : 1년 약 5분 미만 오차)
【 RTC 모듈 시계의 구동원리 】
: 시계를 만들때 현재의 시간을 맞추어 주어야 하는데, RTC를 가지고 PC와의 시간을 동기화 시키면,그 시간이 RTC모듈의 메모리에 저장되며, 모듈에 있는 베터리로 인해 시계회로에 공급되는 전원이 차단 되어도 메모리에 저장된 기준시간은 유지된되게 된다. 시계회로에서는 이 RTC 모듈에서 보통 1초마다 현재 시간값을 가지고와서 출력(사용)하게 된다.
▶ 실습 목표 :
1. [ RTC 모듈에 대해 이해할 수 있다. ]
2. [ PC의 현재 시간을 RTC모듈에 동기화 시킬 수 있다.]
3. [ 동기화된 시간을 아두이노 IDE의 시리얼 모니터 창을 통해 출력할 수 있다. ]
4. [ TM1637 모듈에 14:49 (시 : 분) 형태로 출력해 볼 수 있다. ]
5. [ 전원이 차단 되어도 시간이 유지되는 것을 확인 할 수 있다 ]
▶ 실습 회로도면 : (이미지 클릭하면 확대 가능)
▶ 실습 절차 :
1. 필요한 라이브러리 등을 '라이브러리 매니저'등을 통해서 설치한다. ( <RTClib.h> , <Wire.h> )
2. i2c 통신을 이용하는 모듈이기 때문에 <Wire.h> 라이브러리가 필요하며, 비교적 연결이 간단하고 쉽다.
3. RTC의 메모리에 현재시간 값을 기록 하기 위해, Set Time 코드를 실행시킨다.(선수학습의 1번 항목 참고1. [아두이노 모듈#8] )
[ 만약 <TM1637Display.h> 관련한 에러가 나는 경우 해당 라이브러리가 설치 되지 않았거나 중복 설치, 잘못된 라이브러리 설치 등의 이유입니다. 해당 라이브러리 설치 안내는 선수학습: https://rasino.tistory.com/209 참고하시고, 별도로 라이브러리는 아래 다시 첨부하니 다운받아 설치해서 다시 실행해보세요 ]
TM1637Display 라이브러리 다운로드 : (압축풀지말고 라이브러리 메니저 창에서 zip 형태로 추가하기)
TM1637 Grove 제품의 경우 핀배열이 Catalex 사와 같을 거예요. 하지만, 핀이 달려있는 위치가 다르니, 역시 핀배열을 잘 확인 하셔야 해요. Grove 사 모듈을 뒤집어 보면 위에서 부터 GND, VCC, DIO, CLK 이런 순으로 되어 있을 거예요. 그럼 연결만 그 핀에 맞추어 제대로 하면 됩니다.
그리고 제일 중요한 것, DIO핀과 CLK핀을 아두이노에 연결 한 핀 번호랑, 코드에서 적어준 번호와 일치해야 제대로 동작합니다.
아래 아두이노 코드는 TM1637 Grove사에서 제공하는 테스트 프로그램 이에요. 아래 코드를 다운받아 핀번호 확인후 업로드해서 실행시켜 보세요.