The Embedded Notes Blog

The official Embedded Notes Blog. [Tue Dec 12 2017]

IDE Arduino per ESP8266

IDE Arduino per l'ESP8266... Ho trovato su hackaday.com un articolo sulla versione di IDE Arduino per l'ESP8266!

Dal sito github si può scaricare l'IDE per il proprio computer. Io ho scaricato e provato la versione per Windows7 64 ed è andato tutto liscio. Ho provato gli esempi a corredo dell'installazione ed anche quelli descritti dalla pagina github. Veramente semplice!

  • dopo aver avviato l'IDE Arduino, nel mio caso la versione 1.6.1, ho selezionato dal menu "Tool" la voce "Board" e poi "Generic ESP8266 Board". Io ho una ESP8266 "classico" a 8 pin.
  • Sempre dal menu "Tool" ho selezionato "Programmer" per poi scegliere "esptool".
  • ho collegato al PC l'FTDI a cui è connesso l'ESP, in modalità download, con GPIO0 a GND, ed ho selezionato dal menu "Tool" la voce "Port" per poi seleziona la COM corrispondente all'FTDI.
  • ho compilato e fatto il download!

Fatto! Al riavvio l'ESP era programmato! Dal monitor seriale, vedevo anche i messaggi.

Tutto funzionante insomma!

Per adesso sono disponibili le funzioni per gestire il GPIO e l'interrupt, la lettura dell'ADC con analogRead, la I2C master mode, la seriale.

Ci sono alcune librerie già pronte per il DHT11, Dallas Temperature e per MQTT. Ed ovviamente si ha accesso a tutta la parte di gestione del WiFi.

Mancano ancora delle cose, come la SPI e il PWM, ma già così è utilizzabile! Considerando poi tutto il software prodotto con Arduino: ne vedremo delle belle!

Cortex-M0 a 8pin

LPC810 un piccolo Cortex-M0+

Voglio parlare di questo processore della NXP. Si tratta di un Cortex-M0+ in DIP8. I GPIO liberi per i collegamenti sono 6. Le periferiche classiche ci sono "quasi" tutte! Due USART, una SPI e una I2C. E ancora: CRC engine, Timer... Purtroppo manca l'ADC... ma andiamo con ordine...

Il Cortex-M0+ è il processore ARM pensato per entrare in diretta competizione con il mondo delle MCU a 8bit . Veloce, 2.42 CoreMark/MHz, con un basso consumo, 9.8µW/MH, e ad un costo del tutto equiparabile alle MCU 8bit, dice la ARM, offre i vantaggi di una MCU a 32bit [1].

La versione con cui ho giocato è della NXP < href="http://www.nxp.com/products/microcontrollers/product_series/lpc800/LPC810M021FN8.html">[5] ed è montata su di una piccola board adatta alla prototipazione [2]. Per lo sviluppo ho usato LPCXpresso, e FlashMagic per "bruciare", l'eseguibile nella MCU, usando un collegamento seriale.

La programmazione di questa MCU a 8 pin deve essere orientata all'efficienza: 4KB di flash e 1KB di RAM! Ma la cosa simpatica è la programmazione delle periferiche. Si perché se serve una UART, una SPI o una I2C, si deve prima agire sulla "Switch Matrix", per programmarla sui pin giusti, e poi la si usa. La NXP ha messo a disposizione questo programma [3] che, partendo da un editor grafico, genera direttamente il codice di configurazione delle periferiche.

I programmi che ho realizzato sono due, in uno ho pilotato con la SPI due MAX7221 in cascata, collegati ad una matrice a LED 8x8 bicolore. Il programma legge dalla seriale il messaggio in ASCII che deve essere visualizzato sul display e poi lo invia ai due MAX7221. Nel secondo programma, uso la SPI per leggere prima un ADC, e poi per scrivere in un DAC. Il valore letto dell'ADC la uso come valore di frequenza per programmare un DDS; al DAC invio poi i campioni letti dal DDS. Il programma cambia dinamicamente la configurazione della SPI, spostando tra due GPIO la funzionalità del chip select.

Internet Of Things

L'andamento della Internet of Things interessa tutti, in maniera trasversale. I numeri che riguardano questo fenomeno, e le relative previsioni, sono immensi. Da IBM a CISCO, da Gartner a Accenture, tutti si propongono per spiegare e sviluppare questa nuova tecnologia, questo nuovo modo di essere che, a come dicono, ci caratterizzerà nei prossimi 5/10 anni. Sinceramente sono più incuriosito dalla tecnologia che c'è dietro la IoT. E molto di più mi attrae la tecnologia del Vehicle To Vehicle (V2V) e del Vehicle To Infrastructure (V2I). I standard di comunicazione: ZigBee, Thread, 6LoWPAN. Ma i numeri di cui si legge in questi documenti, indubbiamente, distraggono...

Cortex-M7

Il Cortex-M7 è l'ultimo nato in casa ARM. E' un processore di elevate performance, e il fatto che sia stato posizionato nella fascia Cortex-M sta ad indicare la volontà di ARM a potenziare questo segmento, che già ne aveva viste di performance con il Cortex-M4, per entrare prepotentemente ed efficacemente nell'IoT. Migliore FPU e DSP, interfacciamento a 64bit con la memoria esterna. Ma quello che fa la differenza è la presenza della Tightly coupled memory (TCM). Questa tecnologia è presente nella serie A ed R dei Cortex. La si può usare come una vera e propria cache, ma è anche disponibile allo sviluppatore come area RAM. In essa possono essere copiate quelle parti di codice critico, che devono essere eseguite velocemente ed in maniera deterministica.

ESP8266 WiFi x tutti

ESP8266 NodeMCU L'ESP8266 è un recente dispositivo WiFi, molto economico e veramente semplice da usare. Il collegamento con l'host avviene tramite una porta seriale, impartendo dei semplici comandi AT. Supporta il WEB ed il WAP, ed è programmabile come softAP. Si alimenta a 3.3 Volt e NON è 5 Volt tolerant quindi attenzione a come lo si collega. In Internet c'è una grande quantità di tutorial ed howto. Questa è una lista di link molto utili che ho trovato: Ma non finisce qui. In Internet è possibile scaricare il sistema di sviluppo per questo dispositivo, Si può arrivare a compilare nuovamente il firmware, magari facendo modifiche e miglioramenti. Questo è il link al forum dove trovare informazioni a riguardo. Altra cosa molto interessante, è la disponibilità di un interprete Lua. Una volta flashato l'interprete nell'ESP8266 abbiamo a disposizione la gestione dei GPIO, della SPI, della I2C, del PWM e la possibilità di usare Lua come linguaggio di programmazione. In prativa: invece di pilotare l'ESP8266 con i comnadi AT, con Lua possiamo far eseguire del nostro codice al processore interno al modulo. La versione di ESP che sto provato è il modulo classico con 8 pin, che rende disponibili alla programmazione, oltre alla seriale, due GPIO. Esistono però altri moduli in commercio che espongono molti più pin, come quello della foto. E con Lua abbiamo a disposizione dei moduli già pronti, per pilotare sensori come il: DHT22, BMP085, DS3231, BH1750 e inoltre si possono pilotare i led WS2812. Esistono inoltre almeno due editor per Lua, con integrata la gestione al collegamento seriale al modulo, e varie shotcut. Io sto usando: LuaLoader for windows. Nel sito ci sono anche indicazioni su come usarlo e dei semplici programmi Lua per iniziare.
Alcuni programmi che ho fatto in Lua (github)
-- Legge l'IP con cui naviga in Internet tramite dyndns
print('getmyip.lua started')		  
conn = nil
conn=net.createConnection(net.TCP, 0) 
-- show the retrieved web page
conn:on("receive", function(conn, payload) 
         success = true
         -- print(payload) 
         print(string.sub(payload,string.find(payload, "<body>")+string.len("<body>"),string.len(payload)-16));
         end)
-- when connected, request page (send parameters to a script)
conn:on("connection", function(conn, payload) 
         print('\nConnected') 
         conn:send("GET /"
          .." HTTP/1.1\r\n" 
          .."Host: checkip.dyndns.org\r\n" 
           .."Connection: close\r\n"
          .."Accept: */*\r\n" 
          .."User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n" 
          .."\r\n")
         end) 
-- when disconnected, let it be known
conn:on("disconnection", function(conn, payload) print('\nDisconnected') end)
conn:connect(80,'checkip.dyndns.org') 

		  

-- Legge, da un sito fortune, frasi da uomini famosi in inglese.
-- http://wertarbyte.de/gigaset-rss/?limit=140&cookies=1&lang=en&format=txt&jar=people
-- Source: http://lua-users.org/wiki/MakingLuaLikePhp
-- Credit: http://richard.warburton.it/
function explode(div,str)
    if (div=='') then return false end
    local pos,arr = 0,{}
    for st,sp in function() return string.find(str,div,pos,true) end do
        table.insert(arr,string.sub(str,pos,st-1))
        pos = sp + 1
    end
    table.insert(arr,string.sub(str,pos))
    return arr
end
print('fortune.lua started')
conn = nil
conn=net.createConnection(net.TCP, 0) 
-- show the retrieved web page
conn:on("receive", function(conn, payload) 
         success = true
         --print(payload) 
         local t={}
         t=explode('\n', payload)
         print(t[9])
         end) 

-- when connected, request page (send parameters to a script)
conn:on("connection", function(conn, payload) 
       print('\nConnected') 
       conn:send("GET /gigaset-rss/?limit=140&cookies=1&lang=en&format=txt&jar=people"
        .." HTTP/1.1\r\n" 
        .."Host: wertarbyte.de\r\n" 
        .."Connection: close\r\n"
        .."Accept: */*\r\n" 
        .."User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n" 
        .."\r\n")
        end) 
-- when disconnected, let it be known
conn:on("disconnection", function(conn, payload) print('\nDisconnected') end)
conn:connect(80,'wertarbyte.de')