venerdì 23 ottobre 2015

NodeMcu Lua ESP8266 ESP-12E WIFI Development Board

Questo dispositivo e' un microcontrollore con abbinato capacita' WiFi a basso costo simile ad Arduino, che si puo' programmare con Arduino....ma non e' Arduino (ha piu' o meno le dimensioni di una Arduino Nano)



Il costo di ogni kit e' di circa 7 Euro (sui vari ecommerce cinesi per esempio Banggood)
Per la programmazione su Windows Xp e' necessario prima scaricare il driver della porta CP210x da questo link


In seguito e' conveniente flashare il modulo mediante il programma (senza questa operazione non riuscivo a comunicare con la scheda) che puo' essere reperito a questo link (cartella WIN32/Realease/ESP8266Flasher.exe) .

La scheda mi e' arrivata con questo firmware
NodeMcu 0.9.2 build 20141207  powered by Lua 5.1.4
ed e' stata aggiornata a 
NodeMCU 0.9.5 build 20150318  powered by Lua 5.1.4

(i firmware di sviluppo si scaricano da questo indirizzo)

Con il primo firmware c'era sempre un errore sul comando tmr, con il secondo firmware tutti gli script che si trovano su internet funzionano correttamente

L'uso e' molto semplice, basta selezionare la porta COM e lanciare l'operazione che dura un paio di minuti


Come dice il nome il metodo di programmazione della scheda e' in LUA e si puo' utilizzare il programma LuaLoader


Per connettersi con la scheda si deve andare nel menu Settings/COMM Port Settings e selezionare la porta virtuale (nel mio caso la Comm37) e poi effettuare il Connect. In caso di connessione diventa verde il box in alto a sinistra.

Esiste anche un'altro ambiente di sviluppo ESPlorer (non e' stato impiegato durante la scrittura di questo post)



Per caricare i programmi questi si scrivono in un editor di testo ed poi effettuato l'upload con il comando Upload File. Per mandare in esecuzione il programma si seleziona dal menu a tendina lo script desiderato e si lancia dofile

Attenzione : tutti i file di cui si fa l'upload rimangono in memoria. Per rimuoverli si devono selezionare dal menu a tendina e poi eseguire remove. Per visualizzare la memoria libera si puo' cliccare sul pulsante Heap

Per mandare in esecuzione automatica un programma all'accensione si deve nominare come init.lua. Questo espone ad un rischio ovvero che se il programma va in loop inifinito non c'e' modo di  riprendere il controllo della scheda (i file sopravvivono ad un flash della scheda) . Conviene scrivere un init.lua che comprenda righe del tipo

-----------------------------------------
tmr.alarm(0, 1000000, 0, function()
dofile("mioprogramma.lua")
end)
--------------------------------------------------
in modo da ritardare la partenza di mioprogramma.lua di 10 secondi e poter nel frattempo premere il comando tmr.stop per interrompere l'esecuzione automatica


Il pinout della scheda e' il seguente


Per modificare lo stato dei pin digitali si puo' eseguire le seguenti chiamate
In questo caso si setta a 1 il pin GPIO 1 ovvero D10
pin=1 
gpio.mode(pin, gpio.OUTPUT)
gpio.write(pin, gpio.HIGH)

e per invece settare 0 sul pin 1
gpio.write(pin, gpio.LOW)

La scheda ha una tensione di lavoro di 3.3 V per cui lo stato 1 vale 3.3 V

Ovviamente avendo una scheda WiFi e' interessante sfruttare la connessione di rete
Con questo script la scheda diventa un web server
-------------------------------------------------------------
-- Simple NodeMCU web server (done is a not so nodeie fashion :-)
--
-- Written by Scott Beasley 2015
-- Open and free to change and use. Enjoy.
--

-- Your Wifi connection data
local SSID = "XT1032 3365"
local SSID_PASSWORD = "XXXXXXXX"

local function connect (conn, data)
   local query_data

   conn:on ("receive",
      function (cn, req_data)
         query_data = get_http_req (req_data)
         print (query_data["METHOD"] .. " " .. " " .. query_data["User-Agent"])
         cn:send ("Hello World from ESP8266 and NodeMCU!!")
         -- Close the connection for the request
         cn:close ( )
      end)
end

function wait_for_wifi_conn ( )
   tmr.alarm (1, 1000, 1, function ( )
      if wifi.sta.getip ( ) == nil then
         print ("Waiting for Wifi connection")
      else
         tmr.stop (1)
         print ("ESP8266 mode is: " .. wifi.getmode ( ))
         print ("The module MAC address is: " .. wifi.ap.getmac ( ))
         print ("Config done, IP is " .. wifi.sta.getip ( ))
      end
   end)
end

-- Build and return a table of the http request data
function get_http_req (instr)
   local t = {}
   local first = nil
   local key, v, strt_ndx, end_ndx

   for str in string.gmatch (instr, "([^\n]+)") do
      -- First line in the method and path
      if (first == nil) then
         first = 1
         strt_ndx, end_ndx = string.find (str, "([^ ]+)")
         v = trim (string.sub (str, end_ndx + 2))
         key = trim (string.sub (str, strt_ndx, end_ndx))
         t["METHOD"] = key
         t["REQUEST"] = v
      else -- Process and reamaining ":" fields
         strt_ndx, end_ndx = string.find (str, "([^:]+)")
         if (end_ndx ~= nil) then
            v = trim (string.sub (str, end_ndx + 2))
            key = trim (string.sub (str, strt_ndx, end_ndx))
            t[key] = v
         end
      end
   end

   return t
end

-- String trim left and right
function trim (s)
  return (s:gsub ("^%s*(.-)%s*$", "%1"))
end

-- Configure the ESP as a station (client)
wifi.setmode (wifi.STATION)
wifi.sta.config (SSID, SSID_PASSWORD)
wifi.sta.autoconnect (1)

-- Hang out until we get a wifi connection before the httpd server is started.
wait_for_wifi_conn ( )

-- Create the httpd server
svr = net.createServer (net.TCP, 30)

-- Server listening on port 80, call connect function if a request is received
svr:listen (80, connect)
-------------------------------------------------------------

Un altro aspetto e' quello di settare l'ESP8266 come un Access Point con i comandi
-------------------------------------------------------------
cfg={}
 cfg.ssid="LucaInno"
 cfg.pwd="xxxxxxxxxxxxxi"
 wifi.ap.config(cfg)
 wifi.setmode(wifi.SOFTAP)
-------------------------------------------------------------