NodeMCU가 이미 국내에 보급되었으나 제대로 된 규격서도 없거니와 핀들의 역할에 대해서도 잘 알려져 있지 않다. 특히 데이터 핀들에 대한 정확한 정보가 없어 기존 아두이노 우노에서 흔히 사용하던 배선을 재현하는데 많은 어려움이 있다.
이번 블로그에서는 3색 LED를 사용하여 3개의 데이터 핀 선을 사용 배선하고 별도의 데이터 핀을 지정하여 스위치에 의한 인터럽트 실험을 위한 배선 작업을 하였다. 이러한 회로를 바탕으로 NodeMCU의 데이터 핀 전체 D0∼D10까지 전체를 대상으로 인터럽트 가능 여부를 조사하였다.
삼색 LED는 4개의 다리를 가지는 배선 구조이다. 가장 긴 선이 공통(Common)선이며 나머지 3선이 RGB 선이다.
극성 확인을 위해서는 가장 긴 선과 나머지 배선을 하나 선택하여 2볼트 이내의 약한 전압을 가해 확인하면 된다. 점등이 되지 않으면 방향을 바꾸어 본다.
그림의 배선을 참고로 삼색 RGB 다리 배선을 아두이노 NodeMCU 데이터 핀 D0,D1,D2에 연결하고 가장 다리가 긴 Common 선과 200옴
저항을 연결하여 아두이노 NodeMCU GND에 접지하였다.
이 회로만으로도 간단하게 pinMode 명령과 digitalWrite 명령을 사용하여 LED를 on OFF 할 수 있다.
프로그램에 의해 RGB를 하나씩 순차적으로 on OFF 하면 LED 하나와 200옴 저항이 하나의 회로를 형성하여 작동하고 나머지 2개는 OFF 상태가 된다. 3V의 전압이 가해진다면 200옴 저항으로 인해 전류가 기껏해야 15mA 이하가 될 것이다. 일반적으로 LED 회로를 꾸밀 때에 반드시 저항을 직렬로 넣도록 할 것이며 그 값은 대체로 200옴, 330옴 또는 470옴 정도가 적절하다. 저항 값이 지나치게 커지면 흐를 수 있는 전류 값이 적어져 LED on 상태를 확인하기 어려워진다. 그렇다고 저항 없이 배선하게 되면 3V의 전압에서도 LED가 타버리기 십상이니 주의하기 바란다.
그림에서 3번째 우측의 회로는 Interrupt 배선이다. 측면에서 찍은 사진을 통해 인터럽트 스위치 및 40k옴 저항배선도를 살펴보자.
GND는 삼색LED 측의 GND와 공유한다. 스위치 양단을 연결한 후 주황색 배선은 3V에 연결한다. 인터럽트 발생 시 3V 즉 HIGH 상태로 가게 된다.
스위치를 누르면 아두이노 NodeMCU의 3.3V에 연결되어 40k옴 저항 윗 단에 3.3V 전압이 가해지며 D7 디지털 핀에 0V에서 3.3V로 상승하는(RISING) 전압이 걸리게 된다. 여기에서도 전류 제한 목적으로 저항이 사용되는데 10k옴 이상이면 충분하다.
만약에 D7(GPIO 13) 핀에 인터럽트 기능이 설정되어 있다면 NodeMCU 가 이를 인식하여 현재 CPU에서 돌고 있는 프로그램을 멈추고 인터럽트 프로그램을 실행할 수 있는 상태가 된다.
아래의 명령문 사례를 참고하자.
attachInterrupt(D7, toggle, RISING); 또는 attachInterrupt(13, toggle, RISING);
NodeMCU에서 인터럽트 명령의 시험적인 사용 결과 D7 과 GPIO 번호 즉 13 모두가 입력되면 작동이 되었음을 확인하였다.
하지만 현재 실험에서는 별도의 인터럽트 프로그램이 준비되어 있지 않으며 단지 삼색 LED on OFF 하는 과정을 중지하게 된다. 다시 스위치를 누르면 인터럽트가 취소되어 중지되었던 프로그램이 다시 돌게 된다. 하지만 아래의 프로그램에서는 스위치를 누를 경우에 발생할 수도 있는 debouncing 현상을 감안하지 않았음을 지적한다.
프로그램 구조를 살펴보자. setup()에서 for 루프에 의해 3색 LED가 출력 상태로 지정된다. 하지만 인터럽트가 발생하지 않으면 loop()로 넘어간다.
loop()에서 LED_display(LED_data)루틴을 호출하면 argument로 넘겨지는 LED_data 즉 첨음에 0000 0001 상태로 정의된 비트 데이터에 대해 for 루프의 인덱스 i가 0,1,2로 실행됨에 따라 첫 번째 비트, 두 번째 비트 세 번째 비트가 0인지 1인지를 bitRead() 명령이 체크하여 결과를 0이나 1로 주게 되면 LED가 OFF 또는 on 상태가 된다.
for(i=0; i<3;i++)
digitalWrite(LED[i],bitRead(data, i));
결과적으로 3개의 삼색 LED 중 첫 번째가 on되고 나머지 2개는 OFF된다.
loop()에서 LED_display(LED_data)루틴 호출 후 아래와 같이 Time_STOP을 체크한다. 처음에 0으로 정의 되었으므로 다음 명령으로 넘어가 LED_data가 0x08 즉 0000 0100인지 체크한다. 이는 세번째 LED가 on인지 확인하는 것이다. 세 번째가 on이 아니라면 LED_data에서 비트를 하나씩 이동 시키다. 그렇게 되면 다음번 LED_display(LED_data) 호출 때 두 번째 LED가 on된다.
if(Time_STOP == 0) {
if(LED_Data == 0x08) LED_Data =0x01;//0x08은 이진법으로 0000 0100에 해당
else LED_Data <<= 1;
}
아래의 프로그램을 참조하기 바란다.
NodeMCU_Interrupt_01
byte LED[3] {16,5,4}; //D0,D1,D2
byte LED_Data=0x01;
volatile byte Time_STOP = 0;
void setup() {
byte i;
for(i=0; i<3;i++)
pinMode(LED[i],OUTPUT);
// 인터럽트 핀 번호: 1. D5=GPIO 14 success :2.D10=GPIO 1 X :2.D4=GPIO 2 x : 3.D2=GPIO 4 sucess
//: 4.D0=GPIO 16 X :5.D1=GPIO 5 sucess : 6.D3=GPIO 0 X 7.D0=GPIO 16 X: 8:D4=GPIO 2 X
//9:D6=GPIO 12 success 10:D7=GPIO 13 success 11.:D8=GPIO 15 success 12.D9=GPIO 3 X
// 안되는 핀:D10, D4, D0, D3,D9
attachInterrupt(D7, toggle, RISING);
}
void toggle() {
if(Time_STOP == 0)
Time_STOP = 1;
else
Time_STOP = 0;
}
void loop() {
LED_display(LED_Data);
if(Time_STOP == 0) {
if(LED_Data == 0x08) LED_Data =0x01;
else LED_Data <<= 1;
}
delay(100);
}
void LED_display(byte data){
byte i;
for(i=0; i<3;i++)
digitalWrite(LED[i],bitRead(data, i));
delay(1000);
}
이 실험에서 D7 핀이 인터럽트가 가능한지 체크하였다. 이러한 방식의 NodeMCU의 핀 전체를 대상으로 조사해 본 결과 핀 D1,D2,D5,D6,D7,D8 핀들이 인터럽트가 가능하다는 것이 확인되었으며 반면에 D0,D3,D4,D9,D10 핀들은 인터럽트가 작동되지 않음을 확인하였다.
아래의 동영상에서 인터럽트 과정을 참조하기 바람.
'아두이노프로세싱 프로그래밍' 카테고리의 다른 글
웹의 불필요한 favicon request에 따른 아두이노 NodeMCU 웹서버의 반응과 대책 (0) | 2017.02.22 |
---|---|
아두이노 NodeMCU에서 그림파일 불러오는 HTML img 태그 사용법 (0) | 2017.02.20 |
NodeMCU 1.0 WiFi Webserver에 의한 스마트폰 다음지도 마커표시 보완 (0) | 2017.02.16 |
HTML SVG 그래픽 언어로 프로그램한 Arduino NodeMCU Scope에 의해 아날로그 파형 및디지털 듀티 신호 real time 측정 (0) | 2017.02.15 |
Blink LED 코드를 이용한 Arduino NodeMCU Scope용 디지털 듀티 신호 생성 (0) | 2017.02.15 |