사물인터넷(IoT)2016. 7. 2. 10:00

이전 글에서는 ESPlorer 를 이용해서 간단한 코드를 작성하고 업로드하고 실행해 보았습니다. 이번에는 ESP8266 개발보드인 Amica 의 GPIO 단자를 제어해 보겠습니다. GPIO 단자에 LED를 연결해서 제어해 보는 것 입니다. 아두이노의 Blink 예제와 비슷한 것입니다. 다만 다른 점이라면 하드웨어가 다르고 C 언어를 사용하는 아두이노와 다르게 Lua 언어를 사용한다는 점 입니다. Amica 보드의 입출력 단자는 ESP-12E 기반으로 모든 단자를 이용할 수 있도록 되어 있습니다.


ESP8266 Amica Board Pin Definition - http://artofcircuits.com

핀의 배치는 위와 같습니다. 13개의 GPIO 단자가 있습니다. 여기에 LED를 연결하고 제어해 보겠습니다.


■ 연결 & 준비

Amica 보드의 D1 에 LED의 + 를 연결하고 GND에 - 를 연결했습니다. 보드는 PC에 연결하고 ESPlorer 를 실행 하고 Open 버튼을 눌러서 보드와 통신을 연결해 줍니다.


ESPlorer 가 실행된 모습 입니다. Open 을 눌러 줍니다.


ESP8266 과 연결이 되었습니다.


코딩 준비 끝.


■ 소스


1
2
3
4
5
6
7
8
while 1 do
  gpio.write(1, gpio.HIGH)
  print("LED ON")
  tmr.delay(1000000)   -- wait 1,000,000 us = 1 second
  gpio.write(1, gpio.LOW)
  print("LED OFF")
  tmr.delay(1000000)   -- wait 1,000,000 us = 1 second
end
cs


소스창에 위와 같이 입력하고 'Send to ESP' 를 클릭해서 보드에서 실행해 봅니다. 여기서 알고 넘어가야 할 것이 Send to ESP 는 임시로 보드에 올려서 코드를 테스트 해 보는 것입니다. 보드를 USB 에서 뺏다가 다시 실행하는 경우 프로그램이 날아갑니다. 하지만 ESPlorer 의 Reset 버튼을 눌러서 Soft Reset 하는 경우는 프로그램이 날아가지 않습니다. 전원을 빼거나 보드의 리셋 버튼을 눌러서 Hard Reset 하는 경우만 프로그램이 날아갑니다. 


반면 Save to ESP 는 전원을 제거하거나 Hard Reset 하는 경우도 프로그램이 사라지지 않습니다. 보드에 저장이 되는 것이죠. 이 경우 수정하려면 ESPlorer 에서 프로그램을 재작성해서 Save to ESP 해서 덮어 쓰거나 file.remove("파일명") 해서 삭제 후 재 업로드 하는 방법이 있습니다. 가끔 아무리 리셋을 해도 예전에 Save to ESP 했던 프로그램이 사라지지 않고 ESPlorer에서 인식도 되지 않는 경우가 있는데 이럴 경우 다소 무식한 방법이지만 고민하지 말고 펌웨어를 다시 올려서 보드를 완전 초기화 시켜 버리면 됩니다.


소스는 간단합니다. 문법은 lua 를 사용하기 때문에 아두이노의 C언어와는 다릅니다. while 문에 의해서 계속 반복이 되는 코드 입니다. 아두이노의 loop() 같이 무한반복이 되겠죠. gpio.write(1, gpio.HIGH) 는 D1 에 HIGH 신호를 보냅니다. LED가 켜지는 것이죠. 타이머 같은 경우는 아두이노의 경우 밀리세컨드 단위로 조절을 했는데 여기서는 나노세컨드 단위 입니다. 0 이 세 개 더 붙습니다. 고로 tmr.delay(1000000) 하면 1초 동안 동작을 delay 합니다. print 는 시리얼 창에 출력을 해 줍니다.


실행 결과를 보겠습니다.



이상으로 ESP8266 보드인 Amica 에 LED 를 달아서 GPIO 를 통해서 제어해 보았습니다.



▶추가내용(2016.07.04) : 위의 기능과 같은 소스를 while 문이 아니라 NodeMCU 의 Timer 모듈(Modules)을 통해서 구현할 수도 있습니다. 사실 이 방법이 훨씬 좋은 방법 입니다. 위의 소스는 무한루프가 돌게 되어 있어 프로그램 수정이 불가능할 수도 있습니다. 타이머 같은 경우도 무한루프이긴 하지만 tmr.stop(타이머ID) 명령으로 무한루프를 멈출 수 있거든요.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-- Pin definition 
local pin = 7            --  GPIO13
local status = gpio.LOW
local duration = 1000    -- 1 second duration for timer
 
-- Initialising pin
gpio.mode(pin, gpio.OUTPUT)
gpio.write(pin, status)
 
-- Create an interval
tmr.alarm(0, duration, tmr.ALARM_AUTO, function ()
    if status == gpio.LOW then
        status = gpio.HIGH
    else
        status = gpio.LOW
    end
 
    gpio.write(pin, status)
end)
cs


위의 소스에서 tmr.alarm() 부분이 NodeMCU 의 Timer 모듈 입니다. 파라미터를 통해서 동작하는데 첫 번째부터 Timer ID, 반복 간격 (Milli Second 단위), Timer Mode, 그 다음 실행할 Function 으로 구성되어 있습니다. 더욱 자세한 모듈에 대한 설명은 [여기] 를 클릭하시면 볼 수 있습니다.

반응형
Posted by 대네브 (deneb)

댓글을 달아 주세요