Jumping Jack Flash weblog

Programmare l’ESP8266 con Arduino IDE

Posted in arduino, hardware, Uncategorized by jumpjack on 15 gennaio 2017

Brevissimo tutorial su come rendere il NodeMCU Amica con ESP8266 ESP12 a bordo programmabile tramite IDE Arduino.

  1. Scaricare esp8266_flasher.exe.
  2. Scaricare i file del firmware ESP_Easy (*).
  3. Collegare il NodeMCU (ad esempio Amica o Lolin) al PC tramite USB
  4. Avviare l’IDE arduino per verificare quale porta sia stata associata al dispositivo (menu Strumenti –> Porta)
  5. Aprire il monitor seriale di Arduino
  6. Premere e rilasciare il tasto reset sul NodeMCU per verificare se effettivamente il dispositivo comunica con l’IDE attraverso quella porta
  7. Chiudere l’IDE
  8. Avviare esp8266_flasher.exe
  9. Impostare il numero di porta
  10. Caricare il file .bin corretto, che dipende dalle dimensioni della flash a bordo del dispositivo (4MB o 4096 kbyte sull’ESP12, montato su Huzzah Adafruit, NodeMCU Lolin, NodeMCU Amica)
  11. Tenere premuto il tasto FLASH sul dispositivo, premere il tasto reset, rilasciare reset e rilasciare il tasto FLASH: in questo modo il dispositivo si predispone per la riprogrammazione (re-flashing)
  12. Cliccare DOWNLOAD: in realtà non verrà scaricato un file DA internet, ma inviato il firmware al dispositivo
  13. Attendere il completamento dell’operazione.
  14. Riaprire l’IDE di Arduino
  15. Ripetere il punto 11
  16. Caricare sul dispositivo uno sketch di esempio che stampi qualcosa sul monitor seriale

 

Metodo alternativo:

Per flashare il firmware è possibile usare direttamente anche il file eseguibile presente nel pacchetto ESP_Easy (*), che però è un po’ meno intuitivo. Una volta nota la porta a cui è collegato il dispositivo (v. punto 4 sopra) e la memoria disponibile (v. punto 10 sopra), mettere il dispositivo in modalità FLASH (punto 11 sopra), avviare esptool e indicare in sequenza il numero di porta, la dimensione della flash e la versione del fimware, cioè il numero dopo la “R” nel nome del file; ad esempio, ESPEasy_R108_4096.bin è la versione 108 per l’ESP da 4096 kbyte.

Nota: per scoprire quant’è grande la Flash RAM sul dispositivo si potrebbe usare questo comando:

esptool.py flash_id

Ma la cosa richiede di preinstallare e configurare un interprete python, che è una noia e una rogna, sto cercando un modo più semplice e alla portata di tutti.

 

(*) Il file .zip contiene vari file .bin, che sono firmware adatti a moduli ESP con Flash RAM di dimensioni diverse: 512 kbyte, 1924 kbyte, 4096 kbyte; ad esempio, il file ESPEasy_R108_1024.bin è per un ESP da 1024 kbyte (1Mbit); R108 è il numero di “build”, cioè di versione.

 

 

Dispositivi di monitoraggio batterie al litio

Posted in arduino, batterie, scooter elettrici by jumpjack on 6 giugno 2014

Alternative possibili al celllog8s:

BVM-8S (però non logga) – 14$ su Amazon

Frsky voltage sensor – 21$ (richiede anche convertitore seriale da 18$, totale 39$). 10$ su hobbyking? 10 sterline in inghilterra (anche qui). Non logga, ma avendo l’uscita seriale si può loggare con Arduino.

Xtrema Lithium Balancer – 20 euro – non logga, ma fornisce in uscita le singole tensioni,ed esiste un cavo USB per collegarlo al PC;esce con protocollo i2c, per il quale arduino è già predisposto:

The protocol to the Xtrema Lithium Balancer is public by request. You have requested to here it is at this link http://tmenet.com/pdf/Xtrema%20Balancer%20I2C%20Commands.pdf

It is an I2C protocol and is perfect for an Arduino. Full pin out and command specifications are included in the document. Please keep in touch with your progress and if possible please place your application on our forum when you get logged in. 

 

Venditori vari EU:

http://robotbirds.co.uk/catalog/product_info.php?products_id=8227

http://www.brchobbies.co.uk/catalog/index.php?cPath=8_121

http://www.giantshark.co.uk/product/169346/cell-log-cell-voltage-monitor-2-8s-lipo

http://www.hobbyking.com/hobbyking/store/uh_viewItem.asp?idProduct=36288

Ecco “Displog”, il DISPlay che LOGga!

Posted in arduino, hardware by jumpjack on 8 aprile 2013

Una volta domato il bastardo Ardulog, crearci nuove applicazioni è solo questione di fantasia!

Ecco quindi nascere DISPLOG, il primo display con logger incorporato, o logger con display incorporato, fate vobis:

DISPLOG - DISPLAY + LOGGER on SD card

DISPLOG – DISPLAY + LOGGER on SD card

La faccenda è molto semplice: il display grafico/alfanumerico 3110/5110 (aka Philips PCD8544) può essere pilotato tramite 5 soli pin (addirittura 4 in casi particolari), e su Ardulog ci sono 4 pin analogici disponibili (A1, A3, A4 e A5), più RX e TX (D0 e D1); quindi si tratta solo di giocherellare un po’ con le impostazioni di un banale sorgente di esempio sul playground, fare 5 saldature, ed ecco ottenuto un display che supporta le micro SD card!

Tutto quello che cè da fare è modificare le prime linee di codice in questo modo:

#define PIN_SCE   0
#define PIN_RESET 1
#define PIN_DC    A3
#define PIN_SDIN  A4
#define PIN_SCLK  A5

Manca un PIN libero per accendere la retroilluminazione, ma Hobbytronics ha previdentemente predisposto due piazzole libere vicino ai due LED, quindi si può facilmente utilizzare il pin 5 o 13 per comandare la retroilluminazione.

Il pin analogico A1 rimane disponibile per collegare un qualunque sensore analogico.

Olimex PIC32 Pinguino MICRO pinout mapping

Posted in arduino by jumpjack on 17 gennaio 2013
Olimex Pinguino PIC32 MICRO total pinout mapping

Olimex Pinguino PIC32 MICRO total pinout mapping

Olimex Pinguino PIC32 MICRO minimal pinout mapping

Olimex Pinguino PIC32 MICRO minimal pinout mapping

Problemi vari con scheda Arduino

Posted in arduino, Programmazione by jumpjack on 4 dicembre 2010

Lista di alcuni problemi trovati nell’utilizzare la scheda Arduino, con relative soluzioni.

Scheda utilizzata: Arduino Uno

Sistema utilizzato: PC AMD 2.8 GHz, 3 GB RAM, Windows XP SP3

1)
PROBLEMA: Impossibile utilizzare l’IDE. Quando si prova ad avviarlo, succede questo:

*doppio click su arduino IDE;
*compare splash screen;
*rimane lì per 5 o 6 minuti
*”Bling” (segnale acustico di errore): dialog di errore, ci sono stati problemi nell’avvio dell’applicazione, si può solo premere OK;
*nuovo doppio click su icona IDE, stessa storia.
*altro doppio click, uguale.
*dopo 10 minuti appaiono 3 finestre dell’IDE.  Shocked
*cliccando sul menu TOOLS, si ha un blocco totale dell’applicazione, il menu non si apre. Stessa cosa per tutte e tre le finestre. E’ impossibile anche chiuderle.
* dopo 10 minuti rivado su una delle finestre: si è apertoil menu TOOLS…  Huh Selezionano Arduino Uno….  si riblocca tutto…

SOLUZIONE
Se avete incontrato questo tipo di problema, e sul PC è installato il driver Bluetooth “IVT Bluseoleil”, provate a terminare manualmente i processi BlueSoleil.exe e BTNtService.exe usando il task manager (CTRL+SHIFT+ESC), e a riavviare l’IDE: questa volta dovrebbe funzionare correttamente.

 

2)
PROBLEMA: Collegandosi alla arduino tramite porta seriale “simulata” sulla porta USB, ogni volta che la porta viene aperta, la scheda si resetta e il programma a bordo riparte da capo.

SOLUZIONE: Bisogna disattivare il flag DTR (Data Terminal Ready) quando si configura la porta seriale.

ESEMPIO in Visual Basic for Applications (incluso in Microsoft Office):
Connettere prima al progetto la libreria Microsoft Comm Control (MSCOMM32.OCX) , poi usare questo codice:

Dim MSComm1 As Object

Sub ArduinoOpen()
Set MSComm1 = CreateObject(“MSCOMMLib.MSComm”)
MSComm1.Settings = “9600,n,8,1”
MSComm1.CommPort = 4
MSComm1.InBufferCount = 0
MSComm1.DTREnable = False
MSComm1.PortOpen = True
If Err Then
MsgBox “COM” & MSComm1.CommPort & “: not opened, Sorry!”
Exit Sub
End If
End Sub

Sub ArduinoClose()
MSComm1.PortOpen = False
Set MSComm1 = Nothing
End Sub

Usando invece python:

ser = serial.Serial(‘COM4′, 9600, bytesize=8, parity=’N’, stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=True)

 

3) PROBLEMA: le istruzioni su come usare la scheda ethernet sono troppo generiche: dicono “lo shield ethernet va configurato secondo come è configurata la propria rete”.

SOLUZIONE:
Serve una rapida infarinatura su indirizzi IP, indirizzi MAC e “porte”.

L’indirizzo MAC (MAC address) è un codicedi 12 caratteri che identifica ogni singolo apparato in grado di connettersi a una rete. Normalmente un apparato contiene questo codice codificato indelebilmente nei propri circuiti, ma nella scheda ethernet per arduino puo’ essere programmata a piacere; lo svantaggio è che se per sbaglio si usa un codice già usato da un altro dispositivo presente sulla rete, nessuno dei due funzionerà.

Dopo vedremo quindi come scoprire i MAC address dei propri dispositivi.

Per impostare il MAC sulla arduino,nell’esempio sottostante si usa l’istruzione:

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x23, 0x5D };

E’ preferibile usare l’indirizzo che si trova scritto sull’adesivo attaccato allo shield ethernet, per evitare conflitti e incompatibilità con altri dispositivi.

L’indirizzo IP (IP Address) è una sequenza di 4 numeri compresi tra 0 e 255, e identifica ogni dispositivo all’interno di una rete,similmente al MAC; anche questo quindi dev’essere univoco per ogni dispositivo sulla rete. Non se ne può però assegnare uno a caso: ogni rete ha TUTTI i suoi IP configurati secondo le stesse regole, che DEVONO essere rispettate se di aggiunge un dispositivo alla rete.

Queste regole sono definite dalla subnet mask, un’altra sequenza di 4 numeri, che indicano quali dei quattro numeri dell’IP sono modificabili a piacere: se la subnet mask vale 255.255.255.0,  vuol dire che per gli IP su quella rete puo’ cambiare solo l’ultimo numero, quindi si possono collegare al massimo solo 256 dispositivi.
E’ la configurazione tipica che si trova sui PC “casalinghi”.

Ogni indirizzo di rete locale avrà in genere la forma 192.168.aaa.bbb , cioe’ 192 e 168 saranno fissi e aaa e bbb potranno cambiare. Una volta stabilito che gli indirizzi devono essere nella forma, per esempio, 192.168.1.bbb, tutti gli altri dispositivi su quella rete dovranno avere un “1” come terzo numero.

Nel programma, l’IP viene impostato con:

byte ip[] = { 192,168,0, 177 };

Notare le virgole al posto dei punti.

 

La porta TCP/UDP

La “porta” è un numero compreso tra 0 e 65535, ed è solo una convenzione: non corrisponde a una “porta fisica”, cioè a un connettore. Dire che un programma “comunica sulla porta 80” vuol dire solo che si serve sempre  della porta di rete fisica, che è una sola, ma che solo programmi “in ascolto” sulla porta logica 80 potranno “leggere” i dati scritti dal programma su quella porta.

Perche’ si dica “in ascolto” se poi si parla di “leggere” e “scrivere” è un antico mistero dell’informatica… 😉

Non tutte le porte sono disponibili “a piacimento”: molte sono “riservate”, cioe’ sono comunemente usate da programmi specifici, quindi non si possono usare per programmi propri, a meno che l’intento non sia proprio quello di comunicare con quei programmi. Per esempio, i programmi di posta elettronica usano le porte 25 e 110, i browser internet la 80 e la 8080, ecc.

Nel programma, la porta è impostata con:

Server server(80);

 

Infine, il router.

Quando un PC di casa non è il solo apparecchio a connettersi a internet, ma ce n’è almeno un altro, serve un router. Questo dispositivo possiede varie porte ethernet invece che una, e ognuna di esse puo’ essere usata per permettere a un dispositivo di accedere a internet….anche una Arduino.

PERO’, le persone che da internet cercheranno di collegarsi alla nostra Arduino, prima di essa “incontreranno” il nostro router, che si frappone tra la Arduino e la rete. Dovremo quindi spiegare al router come distinguere le “cose” che da internet sono dirette al PC (le pagine web che vogliamo visitare, la posta che scarichiamo) da quelle dirette all’Arduino (tentativi di leggere e/o impostare i pin). Per farlo, ci serviamo del meccanismo di redirezionamento delle porte (port forwarding) messo a disposizione dal router.

Col port forwarding, indicheremo al router quale numero di porta si dovrà usare da internet per collegarsi alla Arduino, e quale numero di porta usa invece effettivamente l’arduino per collegarsi al router: può essere la stessa, se non ci sono altri dispositivi collegati; ma se, per esempio, sul PC è installato un webserver che comunica tramite la porta standard 80, l’arduino non potrà comunicare tramite quella porta locale, ma dovremo specificarne un’altra, che rimarrà del tutto sconosciuta a chi si collega da internet, che invece vedrà la porta pubblica impostata sul router.

 

Per conoscere IP e MAC di tutti i dispositivi collegati alla propria rete, su Windows si usa il comando

ipconfig /all

da DOS.

 

Questo è il programma di esempio fornito con la libreria ethernet di Arduino: per poterlo usare, dovremo modificare le suddette righe, qui evidenziate; il programma è stato leggermente modificato rispetto all’originale in modo da produrre una pagina HTML corretta, con giuste intestazioni e pie’ di pagina nel codice, e per fare in modo che si aggiorni automaticamente una volta al secondo, in modo da permettere di veder cambiare in tempo reale i valori.

Notare che i pin non collegati a niente avranno valori variabili in modo casuale.

 

/*
Web  Server

A simple web server that shows the value of the analog input pins.
using an Arduino Wiznet Ethernet shield.

Circuit:
* Ethernet shield attached to pins 10, 11, 12, 13
* Analog inputs attached to pins A0 through A5 (optional)

created 18 Dec 2009
by David A. Mellis
modified 4 Sep 2010
by Tom Igoe

*/

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
//byte mac[] = { 0x00, 0x25, 0x22, 0x20, 0xee, 0x99 };
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x23, 0x5D };
byte ip[] = { 192,168,0, 177 };

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
Server server(80);

void setup()
{
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
}

void loop()
{
// listen for incoming clients
Client client = server.available();
if (client) {
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
// if you’ve gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == ‘\n’ && currentLineIsBlank) {
// send a standard http response header
client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println();
client.println(“<html>”);
client.print(“<head><meta http-equiv=\”refresh\” content=\”1\”></head>”);
client.println(“<body>”);
client.println(“Arduino says:”);

// output the value of each analog input pin
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
client.print(“analog input “);
client.print(analogChannel);
client.print(” is “);
client.print(analogRead(analogChannel));
client.println(“<br />”);
}
client.println(“</body></html>”);
break;
}
if (c == ‘\n’) {
// you’re starting a new line
currentLineIsBlank = true;
}
else if (c != ‘\r’) {
// you’ve gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
}
}

 

 

Per leggere dati utili da un sensore, ci si puo’ collegare un potenziometro, collegando il connettore centrale al pin A0, uno di quelli laterali al pin +5V e l’altro al pin GND.