반응형

【 아두이노초급#4-1 아두이노 초급 강좌! #04 "아날로그 입출력하기 1편"(Arduino for Absolute beginner!)

아두이노 아날로그 입출력 1편

 

 - 아두이노에서 아날로그 데이터를 입력받는 과정과 처리에 대해 설명합니다. 
 - 아두이노 Analog port (A0~A5)로 가변저항을 이용해서 데이터를 입력 받으면,  아두이노 내부에 10bit ADC (아날로그를 디지털로 변환하는 회로) 컨버터에 의해 즉, 2의 10승 (0~1023) 의 데이터를 입력 받게 됩니다.  
   이를 아두이노 IDE의 시리얼 모니터를 통해 확인할 수 있는 실습입니다.  
  이번 실습은 이어지는 다음 실습과 연결되어 있으니 바로 이어서 실습해 보세요. 
[ 이어지는 다음실습 :  rasino.tistory.com/317
 ] 

【 이전 영상 보기 

 아두이노쌩초보 영상 #3  ☜ 클릭!
 아두이노쌩초보 영상 #2  ☜ 클릭!
 아두이노쌩초보 영상 #1  ☜ 클릭!

 

【 실습절차 

1.  아래와 같은 회로를 조립하세요 ( 연결도 )

2. 부품준비
 -  아두이노 (우노)  x 1 개
 - 가변저항 또는 반고정 저항 1 개 (용량은 크게 상관 없음)

 3. 주의 사항
 - 가변저항의 가운데 핀을 반드시 아두이노의 A0 포트에 연결해 주어야 합니다. 

 

【 아두이노 코드 

int VAR = 0; 
void setup() {
  Serial.begin(9600); // 시리얼통신 사용선언
}
void loop() {  
  VAR = analogRead(A0); 
  Serial.println(VAR);
  delay(100);
}

▶ 코드 다운로드 

AnalogInOut_basic.zip
0.00MB

【 동작확인 및 강의 영상 

 

 

반응형
반응형

【 아두이노레오나르도활용#6사람이 감지되면 홍보 동영상 플레이 시키기!
   ( Movie Play! with Arduino Leonardo using Ultra Sonic Sensor! )

 아두이노 레이나르도 보드와 초음파 센서를 이용해서 모니터 앞으로 사람이 다가서면, 홍보용 동영상을 자동으로 띄워 재생 시킬 수 있는 응용품에 대해 다루고 있습니다. 

 

 - 이번 영상에서는 아두이노 레오나르도 보드와 초음파 센서를 이용해서 사람이 다가서면 PC에 있는 홍보영상이 자동으로 플레이되도록 구현해보겠습니다.

 코드가 간단하며, 아두이노 보드 종류 중에, 키보드와 같은 HID 장치로 인식이 되는 레오나르도 보드나 프로마이크로 보드를 이용하면 손쉽게 PC에 있는 영상을 단축키로 지정해서 플레이할 수 있게 됩니다.

 

【 이전 영상 보기 

【영상 강의 보기-YouTube

아래 영상 클릭 ~!

 

[ 강의 내용 요약 ]

1. 부품 준비

 

2. 회로 연결

 

3. 아두이노 코드

/*  초음파 센서로 동영상 실행시키기             */
/*  라이즈이IOT http://Rasino.tistory.com   */
#include 
int distance;
int triggerPin = 6;
int echoPin = 7;
void setup() {
  Keyboard.begin(); //키보드 컨트롤 관련 함수 선언  
  Serial.begin(9600); 
  pinMode(triggerPin, OUTPUT);  // 트리거 핀을 출력으로 설정
  pinMode(echoPin, INPUT);       // 에코 핀을 입력으로 설정
}
void loop() {
  digitalWrite(triggerPin, LOW);    // 트리거 핀 초기화
  digitalWrite(echoPin, LOW);      //  에코 핀 초기화
  delayMicroseconds(2);      // 트리거 핀으로 10 us의 펄스를 발생
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW); 
  distance = pulseIn(echoPin, HIGH)/58; //에코핀 입력의 거리값을 cm단위로 계산
  Serial.println("Distance(cm) = " + String(distance));
  delay(1000); 
  if (distance < 20) {       // 물체(사람)가 20cm 이하 되면 감지(LED경보 작동)
    Keyboard.press(KEY_LEFT_CTRL); // '왼쪽 Ctrl 키'
    delay(2);  
    Keyboard.press(KEY_LEFT_ALT);  // '왼쪽 Alt 키'
    delay(2);  
    Keyboard.press('1'); // 숫자'1' 
    delay(500);          // 시간지연을 두어 여러번 실행되는 것을 방지함
    Keyboard.releaseAll(); // 키를 계속 누르지 있지 않도록 함
    delay(10000);
  }
}

 

4. 아두이노 코드 직접 다운로드 

: 다운받은 후 압축파일을 풀고 사용하세요

UltraPlayer.zip
0.00MB

 

 

5. 동작확인

: 작동은 위 유튜브 영상을 통해서도 확인 가능합니다.

 

 

6. 상세 설명

  - 위 회로도를 보고 초음파 센서와 보드를 연결해주세요

  - 네오나르도 보드는 키보드나 마우스와 같은 HID 장치로 인식하기 때문에, 처음 PC와 연결할 때 장치 드라이버 설치가 필요합니다.

- 다음으로 플레이를 시킬 동영상을 준비합니다. 그리고 PC에 동영상 플레이어가 설치되어 있으면 됩니다. 영상에서는 다음 카카오플레이어가 설치되어 연결 되어 있습니다.

 

- 동영상을 플레이시키는 원리는 이렇습니다. 네오나르도 보드는 PC를 통해 키보드의 키입력이 가능합니다. 따라서 동영상을 단축키로 지정해서 실행 시키면 됩니다.

 

- 그럼 동영상을 단축키로 지정하기 위해 바로가기 아이콘을 바탕화면에 만들어 보겠습니다.

- 찾아 보기를 눌러 플레이시킬 동영상을 선택해줍니다.

- 이름을 적당히 정한 후 확인을 눌러 줍니다.

- 바로가기 아이콘에서 마우스 우클릭 후 속성을 클릭합니다.

- 바로가기 키 항목에서 ctrl + Alt 키를 동시에 누른 상태에서 숫자 1을 입력합니다.

- 사실 숫자 1만 입력하여도 Ctrl+Alt키는 자동 입력됩니다.

- 그럼, 단축키가 제대로 먹히는지 ctrl+Alt+1을 눌러봅니다.

 

- 동영상이 잘 실행됩니다.

- 하지만 문제는 동영상이 전체화면 모드로 실행되지 않습니다.

 - 이럴때는 플레이어 옵션에서 동영상 실행시 전체화면 모드로 실행 옵션을 찾아서 체크해주면 해결 됩니다.

 - 카카오 팟플레이어의 경우 왼쪽 상단의 설정메뉴로 들어가보면 환경설정 메뉴가 있습니다.

 

 - 환경설정으로 들어가서 재생항목에 보면, 재생시 창 크기 설정이 있고, 여기를 최대화 화면으로 설정해주면 됩니다.

 - 그럼 보드를 연결하고 코드를 업로드 해줍니다.

 

「 이 과정에서 OS버전이나 PC환경에 따라 업로드가 잘 안 되는 문제가 생길 수 있는데, 레오나르도 보드의 특성상 키보드장치로 인식이 되어 있을 때 업로드를 위한 통신이 안 되기 때문입니다. 이럴 때는 업로드 버튼을 누르자마자 보드의 리셋키를 눌러 키보드 장치 인식이 끊어진 순간 데이터를 업로드 하면 해결되는데, 타이밍을 잘 맞추어야 합니다.

현재는 업데이트 되어 자동으로 장치 인식기능을 켜고 끄면서 업로드가 자연스럽게 잘 됩니다.

만약, 그 밖의 에러가 날 경우, 통신포트가 제대로 체크되어 있는지? 네오나르도 보드로 선택이 잘 되어 있는지 한 번더 확인해보세요.」

 

 - 코드를 살펴보면, 초음파 센서로 물체와의 거리 값을 구해냅니다.

 distance = pulseIn(echoPin, HIGH)/58; //에코핀 입력의 거리값을 cm단위로 계산 

 

 - 그래서 물체가 20cm 이하로 들어오게 되면, 동영상의 바로가기 아이콘에서 지정해 놓은 단축키를 누르도록 코딩이 되어 있기 때문에 영상에서처럼 동영상이 자동으로 실행이 됩니다.

  if (distance < 20) {       // 물체(사람)가 20cm 이하 되면 감지(LED경보 작동) 
    Keyboard.press(KEY_LEFT_CTRL); // '왼쪽 Ctrl 키' 
    delay(2);   
    Keyboard.press(KEY_LEFT_ALT);  // '왼쪽 Alt 키' 
    delay(2);   
    Keyboard.press('1'); // 숫자'1'  
    delay(500);          // 시간지연을 두어 여러번 실행되는 것을 방지함 
    Keyboard.releaseAll(); // 키를 계속 누르지 있지 않도록 함 
    delay(10000); 
  } 

 

- 마지막으로 시리얼 모니터창을 열어 측정되는 거리값과 함께 영상이 잘 실행되는지 확인해보세요.

만족스럽게 실행이 잘 될 것입니다.  ^^

 

 

만약 PC를 라즈베리파이로 바꾼다면 더욱 소형화 시킨 작품을 만들 수 있겠네요.

 

 

 

오늘 학습내용은 여기까지 이며,  다음 학습영상을 기대해주세요~

감사합니다. ~~~ ^^

 

 

=== 아두이노 네오나르도 에러 잡기! ===

1. 만약 아래와 같은 HID.h  HID.cpp 에러가 난다면, HID.cpp 파일을 아래 경로에서 찾아 백업후, 삭제를 하거나 파일명을 변경해 놓는다.

 

[ 에러 증상 ]

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\HID.cpp:17:10: fatal error: Platform.h: No such file or directory
 #include "Platform.h"
          ^~~~~~~~~~~~
compilation terminated.
"Keyboard.h"를 위한 복수개의 라이브러리가 발견되었습니다
 사용됨: C:\Program
"HID.h"를 위한 복수개의 라이브러리가 발견되었습니다
 사용됨: C:\Program
exit status 1
보드 Arduino Leonardo 컴파일 에러.

 

[ 에러 해결법 ]

HID.cpp 파일을 아래 경로에서 찾아 백업후, 삭제를 하거나 파일명을 변경해 놓는다.

경로 : C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino

( ※ 아두이노가 설치된 환경이 다를 수 있으므로, 'avr  이부분을 참고하여 찾거나, 찾기 명령으로 ' HID.CPP ' 파일을 찾아서 처리한다. )

 

 

반응형
반응형

【 아두이노모듈#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

 

(카카오로 보기)

 

반응형
반응형

【 레오나르도활용#1】 아두이노 레오나르도 보드 사용법 #1(Leonardo

▶ 아두이노 Leonardo보드는 아두이노 우노(Uno) 계열의 보드로서, 특징은 PC와 연동하여 활용하기 좋은 보드이다. 기본적인 기능이나 스펙은 우노 보드와 유사하다.  하지만, 우노 보드와 달리 PC와 연결하면 마우스, 키보드와 같은 가상 직렬 포트로 인식되어  PC 제어가 쉬운 특징이 있다.  우노에서의 USB 시리얼 통신(FTDI) 담당 칩인 Mega16u2를 제거하고 그 대신, USB 처리 기능이 있는 프로세서 칩인 ATmega32U4를 사용하였다. 

※ Leonardo는 PC 연결 시, 가상 직렬포트(CDC)로 인식되어, 키보드나 마우스와 같은 HID(Human Interface Device) 장치로 작동 가능한 특징이 있어 키보드 또는 마우스 클래스를 이용하여, PC를 제어하는 용도의 프로젝트에 강점이 있다.

우선, 먼저 레오나르도(Leonardo)에 대해 자세히 알아보고 연결해보도록(드라이버 설치) 하겠다 

아두이노 레오나르도

▶ 레오나르도 사양 :     

Leonardo 상세 사양

▶ 레오나르도 연결(드라이버 설치) :    

 레오나르도를 처음 연결하게 되면 장치가 인식되지 않는데, 
윈도 시작메뉴시작 메뉴로 가서,  제어판 》 장치 관리자 》 기타 장치  쪽을 살펴봐야 한다.

 아래처럼 주의 표시나, 알 수 없는 장치 표시가 뜨게 된다.

그럼 이제 마우스 우클릭하여 드라이버 설치를 진행해보자.

 그럼 아래처럼 드라이브 업데이트 방법에 대한 선택 창이 뜨는데, 
검색으로 찾지 말고, 컴퓨터에서 드라이버 소프트웨어 검색을 눌러준다.

그다음, '찾아보기(R)' 버튼을 눌러,  드라이버의 위치를 아두이노가 설치되어 있는 폴더 아래에 보면 drivers라는 폴더가 있는데, 그 폴더로 선택해준다. (아두이노가 설치된 위치는 다를 수 있음)
 그런데, 이렇게 지정하여도 드라이버 설치가 제대로 안 되는 경우가 있는데, 아두이노 IDE를 너무 오래전 버전을 사용하게 되면 그럴 수 있다.  따라서, 아두이노 사이트에서 아두이노IDE를 최신 버전으로 업데이트해보면 잘 될 것이다. 

 

그러면 드디어 아래처럼, 'Arduino Leonardo(COMxx)' 라며 선명하게 잡히는 것을 볼 수 있을 것이다.


▶ 
레오나르도 특징 :

 아두이노 우노 보드에서는,  보드와 PC 사이 통신(USB to Serial)을 담당해주는 보조 칩인 "mega 16u2"가 따로 존재한다.
하지만, 아두이노 레오나르도 보드에서는 메인칩을 'ATmega32 U4'로 바꾸면서 그 기능까지 담당하게 하였다. 
덕분에 레오나르도 보드의 가격이 우노보다 저렴해진 장점이 있다.  하지만, PC와 연결된 상태에서 리셋 버튼을 누르게 되면 PC와 연결이 끊겼다가 다시 연결되는데, 이 과정에서 장치 목록이 리프레쉬되고 시리얼 통신 중인 연결(데이터)이 끊기게 된다.  별도의 칩이 있어 리셋 버튼에 영향을 받지 않는 우노와 다른 점이다.   
 그래서 
스케치(IDE) 코드를 업로드하거나, 통신을 할 때 영향을 줄 수 있으니 레오나르도 보드를 사용할 때는 약간의 주의가 필요하다.  예를 들면,  레오나르도 보드에서는 PC에서 직렬(Serial) 포트를 열어도 스케치를 다시 시작하지 않는다. 즉, 보드에 의해 PC로 이미 전송된 시리얼 데이터는 (예, Setup { } 문의 내용들) 처음 순간 금방 전송되어 버리고 나면, 다시 확인할 수 없다.  이후 루프(loop { }  ) 안에 있는 내용만 시리얼 창을 통해 확인 가능하게 된다.

 하지만, 큰 장점도 있다. 하나의 메인 CPU로 스케치를 실행하고 USB 연결도 담당하니, 컴퓨터와의 유연성이 증가하게 되고, 펌웨어를 통해서 USB의 다양한 기능을 사용할 수 있어서 강력한 제어가 가능해진다. 

 그리고, 레오나르도 보드의 ATmega32U4 칩에는 D0(RX)핀, D1(TX)핀에서 사용할 수 있는 USB를 통한 UART TTL(5V) 시리얼 통신 기능을 지원한다.  이 것은 PC로 하여금 레오나르도 보드를 USB(2.0) (가상) 장치로 인식할 수 있게 해 준다. 
이는 아두이노(레오나르도) 보드를 이용해서 마우스나 키보드와 같은 기능을 구현할 수 있음을 뜻한다. 

 또한, 물리적인 시리얼 포트와 가상 COM 포트가 분리되어 있기 때문에, RX, TX단자에 블루투스와 같은 통신 모듈을 연결하여 사용하더라도, 스케치에 데이터를 업로드할 때 장치를 분리하지 않고도 업로드가 가능하다. (우노에서는, 블루투스가 연결되어 동작(통신)되고 있는 상태에서는 스케치를 통해서 업로드가 되지 않기 때문에 PC↔우노↔블루투스 형태의 통신을 위해 우노와 블루투스는 일반 포트를 이용한 소프트웨어 시리얼 통신을 이용하게 된다)

또 하나의 장점으로 위 테이블 표에서도 알 수 있듯이, 레오나르도 보드는 소프트웨어적으로 아두이노 보다 더 많은 총, 20 개의 Digital 입출력 핀과,  12개의 Analog 입력 핀을 설정하여 사용할 수 있다.  (물리적인, 핀 수는 우노와 동일하다)

레오나르도 보드의 뒷면을 살펴보라

위 이미지들은 사용할 수 있는 포트를 명기해 놓은 이미지이며, 보기에 편한 이미지를 사용하면 된다. 

많이 복잡해 보여도 실제 코딩에서는 관련 헤더 파일의 함수와 클래스를 이용하면 쉽게 다룰 수 있다.

그럼, 다음 회차부터는 본격적으로 레오나르도 보드를 사용해 재미나는 회로를 만들어 보려고 한다. 

 

반응형
반응형

【 아두이노모듈#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

 

반응형
반응형

 아두이노Proj#5 아두이노 스마트 화분 만들기 Ver 3 with LCD

 지난시간 스마트 화분을 만들고 수분의 상태를 간단히 체크할 수 있는 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 부분은 생략해도 상관이 없다)

 

▶ 선수 학습 :

   1. [아두이노 센서#34]  토양 센서( YL-38) Sensor 다루기  ☜ (클릭)

   2. [아두이노 기초#11] FND 구동실습 II (숫자 카운트하기)  ☜ (클릭) 

   3. [아두이노 센서#14]     ...I2C LCD 사용하기    ☜ (클릭) 

   4. [아두이노 프로젝트#1] 아두이노 스마트화분 만들기Ver1 ☜ (클릭) 

   5. [아두이노 프로젝트#2] 아두이노 스마트화분 만들기Ver2 ☜ (클릭) 

 

 토양습도센서 (YL-38 , YL-69) 세부 스팩

  ※ 위 선수 부분 참조

 

 워터 펌프 스팩

  ※ 위 선수 부분 참조

 

▶ 실습 목표 :  

  1. [ 토양습도 센서에 대해 이해 할 수 있다. 

 2. [ 워터펌프에 대해 이해 할 수 있다. ]

 3. [ 토양 센서 값에 따라 펌프를 작동시켜 물공급 조절을 할 수 있다.]

 4. [ FND에 숫자를 표현 할 수 있다 ]

 5. [ 습도 data를 숫자 0~9 값으로 맵핑해 출력 할 수 있다 ]

 6. [ LCD를 레벨바 형태로 표현하고 다룰 수 있다.]

 

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

[ 위 회로에서 주의 하셔야 할 것은  아두이노 회로에서 주로 사용되는 TR의 경우(2SA, 2SC타입)  NPN형 타입은 PNP형 타입과 마찬가지로 핀의 순서가 있으니 주의 하셔야 합니다. 

우선, 도면에 사용된 NPN형 TR은 2SC9011 이며, 라벨이 적인 면의 왼쪽을 기준으로 핀 이름이 
1.   2SC9011 :  - E B C -  순서로 되어 있고, 

2.   2SC1815 :  - E C B - 순서로 되어 있으니 반드시 확인 후 연결하세요. 

 

- C9011과 C9012, C9013은 모두 핀 배열이 동일함( E B C)

또한, 이외의 TR을 사용할 경우 미니 테스터기 혹은 인터넷 검색으로 핀 순서를 확인하여 도면대로 연결하시면 문제 없이 동작 할 거예요. ]

 

[ 추가로 위 회로의 모터 연결 방식은 장시간 사용하기에는 좀 무리가 따르며, 전원을 별도로 넣어 줄 수 있는 릴레이 모듈이나, L298 모터 드라이버 모듈을 연결해서 사용하시는 걸 권장합니다. 조만간 보강된 회로의 업로드 버전도 올려 볼게요. ^^; ]   

 

▶ 실습 절차  : 

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

2.   물펌프는 물통 속에 담겨진다. 따라서 물펌프의 전선이 빠져나오는 부분은 필요한 경우 글루건 등으로 보강처리 할 필요가 있다. 

3.  우선 본 실험처럼 작은 물통을 준비하고, 간이 화분을 준비해서 실험을 해 본 후 실제 화분에 설치해보면 좋을 것이다. 또한 필요한 경우 센서를 두 개 이상 설치할 수도 있고, 두개의 화분을 하나의 보드로 연결하여 관리 해 볼 수 있을 것이다.

4.  선수학습을 참고하여 FND를 다루는 법을 먼저 익혀보고, 아래 코드에서 처럼, 배열과 for 구문을 이용하여 FND를 좀더 세련되게 코딩하는 법에 대해 숙지 하면 좋다. 

5. 처음 LCD를 다루는 사람은 선수 학습부분을 참고하면 도움이 되며, 여기서는 단순 숫자 값을 그래픽 형태의 레벨바로 표현해 보는 실습이다.  여기에 본인만의 아이디어를 추가하여 연습해보면 코딩 연습에도 도움이 될 것이다.

 

▶ 프로그램 코드 및 설명 : 

/* Auto Water Pot - 자동 물공급 화분 with LCD */

#define A0Pin 0

#include <LiquidCrystal_I2C.h>       // i2c LCD 사용위한 선언

LiquidCrystal_I2C lcd (0x27, 16,2);    // (고유ID, 16칸2줄LCD)

int sensorVal = 0;

int pump = 9;

byte digits[10][7] = {

//  {a,b,c,d,e,f,g}   FND 핀 배열

    {1,1,1,1,1,1,0},      // 0을 출력

    {0,1,1,0,0,0,0},      // 1을 출력

    {1,1,0,1,1,0,1},      // 2를 출력

    {1,1,1,1,0,0,1},      // 3을 출력

    {0,1,1,0,0,1,1},      // 4를 출력

    {1,0,1,1,0,1,1},      // 5를 출력

    {0,0,1,1,1,1,1},      // 6을 출력

    {1,1,1,0,0,1,0},      // 7을 출력

    {1,1,1,1,1,1,1},      // 8을 출력

    {1,1,1,1,0,1,1},      // 9를 출력

};
void setup ( ) {
 Serial.begin(9600); 

 lcd.begin();              // LCD 시작 & 초기화

 lcd.clear();
 
pinMode(pump, OUTPUT); 

 for (int i=2; i<9; i++) {

      pinMode(i,OUTPUT);    // 2~8번, 9(pump) 포트 모두 출력 설정 

  } 
}

 

void displayDigit(int num)   {    // FND 숫자표시 함수

  int pin = 2;
  
for (int i=0; i<7; i++)     {       
    
digitalWrite(pin+i, digits[num][i]);   

  }
}
void loop ( ) {  
  
int FNDVal=0;
  
sensorVal = analogRead(A0Pin);        // 토양센서값 읽어 저장

  Serial.print("Asensor = ");
  
Serial.println(sensorVal);                  // 0(습함) ~ 1023(건조)값 출력

  FNDVal = map(sensorVal,0,1023,9,0); // 습도값을 FND 출력값으로 맵핑
  // 매우습함 : 9,  매우건조 : 0

  displayDigit(FNDVal);                       // FND에 숫자를 표시한다.
  
// 습도 값에 따라 출력 처리 다르게 해줌

  Serial.print("FND Val =");

  Serial.println(FNDVal);

  lcd.clear();

  lcd.setCursor(0,0); 

  lcd.print("Dry---------Wet");           // 첫 줄에 적힐 내용

  lcd.setCursor(7,0);                       // 첫 줄 8째 칸으로 커서 이동

  lcd.print(FNDVal,1);                      // FND 출력 값을 LCD 첫 줄 가운데 출력

  lcd.setCursor(2,1);                        // 두 번째 줄에 3째 칸에 커서 위치

 switch(FNDVal) {
   
case 1:
     
lcd.print("                ");           // 남아 있던 레벨바 잔상 제거
      lcd.write(B11111111);              // 레벨바 모양의 아스키 코드 값
     
break;

    case 2:
     
lcd.print("                ");
     
lcd.write(B11111111);
     
lcd.write(B11111111);
     
break;

    case 3:
     
lcd.print("                ");      
     
for (int i=0; i<3; i++) {       // FNDVal 숫자 만큼 레벨바 생성

        lcd.write(B11111111);
      }
     
break;

    case 4:
     
lcd.print("                ");
     
for (int i=0; i<4; i++) {
       
lcd.write(B11111111);
      }
     
break;

    case 5:
     
lcd.print("                ");
     
for (int i=0; i<5; i++) {
       
lcd.write(B11111111);
     
}

      break;    
   
case 6:
     
lcd.print("                ");   
     
for (int i=0; i<6; i++) {
       
lcd.write(B11111111);
      }
     
break;     

    case 7:
     
lcd.print("                ");   
     
for (int i=0; i<7; i++) {
       
lcd.write(B11111111);
     
}

      break;     

    case 8:
     
lcd.print("                ");   
     
for (int i=0; i<8; i++) {
       
lcd.write(B11111111);
      }
     
break;     

    case 9:
     
lcd.print("                ");   
     
for (int i=0; i<9; i++) {
       
lcd.write(B11111111);
      }
     
break;     
 
}

// 값이 '2'이하로 건조해지면 1초동안 펌프작동

if ( FNDVal <= 2) {   

    Serial.println(" Very Dry ! ");       

    Serial.println(" Punping for 1 Second ! ");       

    digitalWrite(pump, HIGH);   

    delay(1000);     // 펌프 작동시간 설정(1000→1초)

  }

  else {

    Serial.println(" Very Wet ! ");   

    digitalWrite(pump, LOW);  // 펌프작동 멈춤
 
}   
  delay(3000);      //정보수집 시간(간격) 설정

}                             

 

▶ 실행영상 :  

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

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

▶ 아두이노 파일다운 :

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

RasINO_AutoPotFND_LCDok.zip
0.00MB

 

【 LCD관련 에러나 동작이 안 될 때 】

 LCD관련한 라이브러리 에러나 코드 에러에 대한 안내를 드립니다.   크게 아래와 같은 두 가지 형태를 보이는데요, 

 

▶ 1. 코드를 실행하기전 LiquidCrystal_I2C.h: No such file or directory 에러라고 뜨는 경우!

 

 이때는 LCD 헤더파일이 설치가 되어 있지 않았을 경우입니다.  아예 관련 라이브러리(해더 파일)가 설치 되지 않은 경우입니다. 

해결법은 바로 아래에 첨부한 라이브러리를 다운받아 압축을 풀지 말고 라이브러리 관리 메뉴에서  .zip 라이브러리 추가 메뉴를 이용해서 추가해주세요.

경로 :  아두이노IDE >  스케치  라이브러리 포함하기  .zip 라이브러리 추가...  "다운받은 라이브러리파일 선택"

 

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는 모두 닫고 재실행 해야 적용 됩니다.

 

 본 예제에서 사용한 라이브러리 다운로드 받기 :

Arduino-LiquidCrystal-I2C-library-master.zip
0.01MB

  ※ 중요! : 여기에서 제시된 코드로 작성할 경우 반드이 이 라이브러리로 설치하셔야 합니다.   만약, 여러분의 PC에 똑 같은 이름의 라이브러리가 있을 경우 반드시 삭제를 하거나 압축해서 백업을 해 놓으면 충돌이 일어나지 않습니다.!!!

(추가) L9110S 모터 모듈을 보강한 회로도:

 앞서의 회로는 기본 아두이노 전원으로 LCD와 FND 그리고 모터를 돌려야 하기 때문에 동작이 조금 불안정 할 수 있어요.   따라서 모터에 공급되는 출력을 증폭시켜 줄 수 있는 모터드라이버 모듈을 보강한 회로와 관련 코드를 첨부하니 참고하세요.    참고로, 그래도 불안정할 경우, 모터드라이버 모듈에 별도의 전원 3.5V~5V(펌프모터 허용 전압)을 공급해주면 훨씬 안정적이고 더욱 오래 작동됩니다.  이때, GND를 아두이노 회로의 GND와 합선(결합) 시켜 주면 됩니다.

< L9110S 모듈 스팩 참고 >

2019/05/07 - [아두이노/3. 아두이노 모듈] - 【 아두이노모듈#15】 L9110S #1(모터 드라이버) 모듈 사용하기

 

이미지를 클릭하면 확대 되며, 아래 클릭하여 다운로드도 가능해요
(Ras2-보강)WaterPotL9110_도면.png
0.49MB

 

[ L9110S 모터 드라이버 모듈 추가한 코드 다운로드 받기 ]

AutoPotFND_LCD_L9110S.zip
0.00MB

[ 작동영상 ]

 

 

  개인적인 견해로,  위의 회로들은 작품의 구현과 비주얼을 위해 LCD를 달았는데요, 전원소모가 좀 있고, 모터와 같이 돌리다 보니, 다소 불안정 하기도 해서,  LCD는 빼고 하셔도 좋습니다. 

 그리고 가장 일반적으로 많이 사용하는 그래서 초급자 분들도 접근하기 쉽도록 우노 보드로 제작하였는데요?   좀더 실용적이려면,  아두이노 보다 작은,  나노보드나, 프로미니 같은 보드로 제작하면, 전력소모도 줄고 크기도 줄어들어 실제 화분에 장착하기도 용이할 거예요. 

 

 

 [ 차세대 버전 예고 ]

 차기 버전에서는,  디스플레이 장치를 미니 OLED를 달고 ,  보드도 사이즈가 작은 보드를 사용하고, 리튬폴리머 배터리를 적용하여 실제로 화분에 부착할 수도 있는 사이즈로 제작할 예정입니다. 

또한, Wemos D1 mini 보드를 사용하여 화분의 습도 상태를 웹의 서버에 기록하도록 해볼 예정입니다. 

 차세대 버전 링크 :

『 매번 물 주기 귀찮은 화분! 말라죽는 우리 집 화분을 구해주세요! 』 아두이노 활용 프로젝트 콘텐츠 소개! 』

 

 

 

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

 

 

[ 다운받은 프리징 부품 입력시키는 방법 ]

 

 

위 본문에 사용한 프리징 부품 입니다  : 
(원래 기본 카테고리에 없는 부품들은 사용자 개인들이 만든 것을 구글검색으로 찾아 넣어야 합니다)

Fritzing Part 4개 압축.zip
0.06MB

프리징 부품 추가하는 방법 :

 압축을 풀고 그리고 있던 작업 파일에서  부품검색창으로 갑니다. 

검색창의 검색 목록중  '▽'를 제일 아래쯤으로 가보면,  MINE 혹은 TEMP 라는 비어있는 항목이 나올거에요.  거길 클릭한다음,  그 빈공간에 다시 마우스 우클릭 하면, Import...   새로운 저장소....  등등의 팝업 메뉴가 보일거에요. 

거기서 Import... 를 클릭해서  좀전에 다운받아 압축풀어 놓은 프리징 부품들을 선택하면 부품을 불러올 수 있고 회로도 그릴 때도 집어 넣을 수 있게 됩니다.  

 

 

반응형
반응형

【 아두이노모듈#10】 1채널 릴레이(JQC-3FF-S-Z) 사용하기

 

 아두이노를 사용하다보면 대부분 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 된다. 이와 같이 동작 확인이 되면, 반대로 동작하도록 코딩의 내용을 스스로 변경해보라.

 

 

 

▶ 프로그램 코드 및 설명 : 

 

/* 1채널 릴레이 다루어 보기  */

 

int relay = 7;

int button = 2;

 

void setup ( ) {

  pinMode(relay, OUTPUT); // 릴레이 연결 핀 출력으로 설정

  pinMode(button, INPUT); // 버튼 연결 핀 입력으로 설정

  Serial.begin(9600);

}

 

 

void loop ( )  {

  Serial.println(digitalRead(button));    

  Serial.println(digitalRead(relay));    

  if (digitalRead(button)== HIGH) {

    digitalWrite(relay, LOW);   // 이 부분을 수정하면 반대로 동작

  }

  else {

    digitalWrite(relay, HIGH);  // 이 부분을 수정하면 반대로 동작

  }

}

 

▶ 실행영상 :  

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

 

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

https://youtu.be/X-cczSjPhtg

 

▶ 아두이노 파일다운 :

 

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

relay1.zip
다운로드

 

 

반응형
반응형

【 아두이노모듈#9】 TM1637 & DS1307 리얼타임 시계 만들기


 지난시간 RTC 모듈의 기본사용법에 대해 학습해보았다. 이번 시간에는 이 RTC 모듈의 기록된 시간을 동기화 하여 시계회로의 전원이 차단 되더라도 흘러가는 시간이 유지되는 시계회로를 완성해 보고자 한다. 



▶ 선수 학습 :

   1. [아두이노 모듈#8] DS1307 리얼타임클럭 모듈 ☜ (클릭)

   2. [아두이노 모듈#9] TM1637(시:분) 시계 만들기 ☜ (클릭)


▶ DS1307 세부 스팩 


※ .라이브러리 다운로드

 - DS1307RTC:https://github.com/PaulStoffregen/DS1307RTC

 - RTClib : https://github.com/adafruit/RTClib  


  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] )

4. 아래의 코드를 실행시켜 시계프로그램을 완성한다. 


▶ 프로그램 코드 및 설명 : 


/* RTC 모듈에 있는 시간 값을 불러와 TM1637로 출력  */


#include <TM1637Display.h> // FND 시계모듈 라이브러리

#include <RTClib.h>     // RTC 기본 라이브러리

RTC_DS1307 RTC;         // RTC 모듈 객체 생성

#define CLK 8

#define DIO 9

TM1637Display display(CLK, DIO);

int Time, Minute;

char daysOfTheWeek[7][12] = {"SUN", "MON", "TUE", "WEN", "THU", "FRI", "SAT"};      //요일 관련 배열 선언 (생략가능)


void setup ( ) {

Serial.begin(9600);  

  display.setBrightness(7);    // 0~7, 밝기 조절

  Serial.begin(9600);

  RTC.begin();

  if (! RTC.begin()) {     // RTC모듈 연결 확인 루틴

    Serial.println("Couldn't find RTC");

    while (1);

  }

  if (! RTC.isrunning()) {

    Serial.println("RTC is NOT running!");

  }

}


void loop ( )  {

  DateTime now=RTC.now(); // RTC에 저장된 값을 불러옴

  Serial.print(now.year(), DEC);

  int Time = now.hour();

  int Minute = now.minute();

  

  int digitoneT = Time / 10;

  int digittwoT = Time % 10;

  int digitoneM = Minute / 10;

  int digittwoM = Minute % 10;


   uint8_t data[] = { 0x0, 0x0, 0x0, 0x0};

   uint8_t segto;

   data[0]=display.encodeDigit(digitoneT); 

   data[1]=display.encodeDigit(digittwoT);

   data[2]=display.encodeDigit(digitoneM); 

   data[3]=display.encodeDigit(digittwoM); 


// 시와 분 사이 ' : ' 출력하고 깜빡임

   segto = 0x80 | display.encodeDigit(digittwoT);

   display.setSegments(&segto,1,1);

   delay(500);   // ' : ' 깜빡임 속도 조절하는 딜레이

   display.setSegments(data);     

   delay(500);   // ' : ' 깜빡임 속도 조절하는 딜레이


// 아래는 시리얼 모니터창에 시간출력(생략 가능) 

  Serial.print(now.year(), DEC);

  Serial.print('-');

  Serial.print(now.month(), DEC);

  Serial.print('-');

  Serial.print(now.day(), DEC);

  Serial.print(" (");

  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);

  Serial.print(") ");

  Serial.print(now.hour(), DEC);

  Serial.print(':');

  Serial.print(now.minute(), DEC);

  Serial.print(':');

  Serial.print(now.second(), DEC);

  Serial.println();

}


▶ 실행영상 :  

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




▶ 아두이노 파일다운 :

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


[ 위 시계 프로그램-아두이노- ]

OK_ds1307_4digit_Watch.zip



[ RTC 타이머에 현재시간 셋팅 프로그램-아두이노-   순서상으로 이걸 먼저하고 바로 위 코드를 다시 업로드 시켜야 합니다.]

(RTC 타이머에 PC로 부터 동기된 현지 시간을 셋팅해주는 프로그램입니다.

따라서 현재시간을 RTC모듈에 이프로그램으로 기록하고 나서, 다시 위 프로그램을 업로드 하면, 

수정된 현지시간으로 시계가 돌아가게 됩니다. )

DS1307_SetTime2.zip


[ 만약 <TM1637Display.h> 관련한 에러가 나는 경우  해당 라이브러리가 설치 되지 않았거나 중복 설치, 잘못된 라이브러리 설치 등의 이유입니다.    해당 라이브러리 설치 안내는 선수학습: https://rasino.tistory.com/209  참고하시고,  별도로 라이브러리는 아래 다시 첨부하니 다운받아 설치해서 다시 실행해보세요 ]  


TM1637Display 라이브러리 다운로드 :  (압축풀지말고 라이브러리 메니저 창에서 zip 형태로 추가하기)

TM1637-master.zip


TM1637 Grove 제품의 경우 핀배열이 Catalex 사와 같을 거예요.  하지만, 핀이 달려있는 위치가 다르니, 역시 핀배열을 잘 확인 하셔야 해요.  Grove 사 모듈을 뒤집어 보면 위에서 부터 GND, VCC, DIO, CLK 이런 순으로 되어 있을 거예요.  그럼 연결만 그 핀에 맞추어 제대로 하면 됩니다. 

그리고 제일 중요한 것, DIO핀과 CLK핀을 아두이노에 연결 한 핀 번호랑, 코드에서 적어준 번호와 일치해야 제대로 동작합니다. 


아래 아두이노 코드는 TM1637 Grove사에서 제공하는 테스트 프로그램 이에요.  아래 코드를 다운받아 핀번호 확인후 업로드해서 실행시켜 보세요.

TM1637_Grove.zip


  


반응형
반응형

【 아두이노모듈#8】 DS1307 (RTC) 리얼타임클럭 모듈 배우기 #1


 지난시간 TM1637 FND 모듈로 시계를 만들어 보았다. 하지만 오차가 0.001 초만 나더라도 시간이 갈 수록 시간 오차가 커질 것이다. 이문제를 해결하기 위해서 좀더 정밀한 클럭을 지닌 RTC 모듈에 시간값을 동기화 시켜서 사용하게되는데,  오늘은 시계를 구성하기에 앞서 이 RTC 모듈에 대해 알아보도록 하자. 



▶ 선수 학습 :

   없음.


▶ DS1307 세부 스팩 



※ .라이브러리 다운로드

 - DS1307RTC:https://github.com/PaulStoffregen/DS1307RTC

 - RTClib : https://github.com/adafruit/RTClib  


  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. [ 2019/3/15(날짜)와 14:49:12(시간) 형태로 출력해 볼 수 있다. ]



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



▶ 실습 절차  : 


1.   필요한 라이브러리 등을 '라이브러리 매니저'등을 통해서 설치한다. ( <RTClib.h> , <Wire.h>  )

2.   i2c 통신을 이용하는 모듈이기 때문에 <Wire.h> 라이브러리가 필요하며, 비교적 연결이 간단하고 쉽다.  브레드보드 없이 직접 연결이 가능하지만, 추후에 FND모듈을 함께 연결하려면 , 필요할 수 있으니 브레드보드를 사용해서 연결해본다. 
3. 시리얼모니터를 통해 설정된 날짜와 시간값을 확인하게 되는데, 에러가 날 경우에는 통신속도(보드레이트)를 서로 같도록 맞추어 주었는지 확인하도록 한다.  


▶ 프로그램 코드 및 설명 : 


/* RTC 모듈에 PC를 이용하여 현재의 일시를 동기화 하기 */


#include <RTClib.h> // RTC 기본 라이브러리

#include <Wire.h>   // i2c 통신 라이브러리

RTC_DS1307 RTC;    // RTC클래스 생성


void setup ( ) {

Serial.begin(9600);  

Wire.begin();

RTC.begin();

RTC.adjust(DateTime(__DATE__,__TIME__));

//연결된 pc의 현재시간을 RTC모듈 기억소자에 동기화 함

//위 동기화 명령라인은 처음 한 번만 실행하고 하고 이후로는 주석처리

}

void loop ( )  {

DateTime now=RTC.now(); // RTC에 저장된 값을 불러옴

// 시리얼 모니터창에 아래의 형식으로 출력함

Serial.print(now.year(), DEC); 

Serial.print('/'); 

Serial.print(now.month(), DEC); 

Serial.print('/'); 

Serial.print(now.day(), DEC); 

Serial.print(' '); 

Serial.print(now.hour(), DEC); 

Serial.print(':'); 

Serial.print(now.minute(), DEC); 

Serial.print(':'); 

Serial.print(now.second(), DEC); 

Serial.println(); 

delay(1000);    //1초마다 현재의 일시를 모니터로 출력.

}


▶ 참고 자료 :  

 없음.

▶ 실행영상 :  

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



▶ 아두이노 파일다운 :

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


반응형
반응형

【 아두이노 에러 잡기   #2 exit status 1 컴파일 에러


▶ 에러 증상  

 

.

.

.

exit status 1 

보드 Arduino/Genuino Uno 컴파일 에러 






▶ 에러 원인   

 주로 스케치에서 #include 로 헤더파일 등의 함수를 쓰겠다고 선언 하였으나, 함수(라이브러리)가 스케치상에서 추가가 되지 않은 경우 발생한다.  




▶ 에러 증상 예시 :


포함시켜 놓은 라이브러리가 스케치에 추가가 되지 않아 에러 발생!



▶ 에러 해결 방법   


해결하기 쉬운 순서대로 :


 ① 라이브러리 직접 검색으로 추가하기 :

스케치 프로그램 메뉴에서  스케치메뉴  라이브러리 포함하기메뉴  라이브러리 관리...을 클릭!


 아래 처럼 메니저 창이 나타나면 검색창에 pitches 정도만 입력 하면 설치파일이 등록되어 있는 경우 아래처럼 설치버전이 나타남.   설치 버튼을 클릭 하여 설치한 후 다시 컴파일 하면 에러 해결 됨. (그래도 에러가 날 경우 스케치 파일을 종료하고 다시 열어서 실행해 볼 것) 

 



 ② pitches.zip 라이브러리를 인터넷에서 검색 후 다운 받아 추가하기 :

 스케치 프로그램 메뉴에서  스케치메뉴  라이브러리 포함하기메뉴  .ZIP 라이브러리 추가...를 클릭!  


 ③ '파일 추가'로 라이브러리 추가 하기 :


 pitches.h 헤더 파일만 가지고 있는 경우 아래 경로로 pitches 라는 새폴더를 만들고 그 속에 pitches.h 파일을 복사해 넣는다.


그런다음, 

  스케치 프로그램 메뉴에서  스케치메뉴  파일 추가...메뉴를 클릭!

하여 라이브러리를 추가한다.




반응형