:: Problemi noti del sistema Arduino ::

PAGINA IN COSTRUZIONE

Questa pagina raggruppa vari problemi noti riscontrati su Arduino e sul suo IDE, e dove possibile vengono fornite le relative soluzioni.

Navigazione

Problemi risolti

Problemi aperti

Problemi risolti

Hardware

  • Autoreset

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

ESEMPIO in python:

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


  • Arduino bloccata

PROBLEMA: Ogni upload tentato non va a buon fine ed esce la scritta rossa:

 avrdude: stk500_getsync(): not in sync: resp=0x00
 avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51.

PROBABILE SOLUZIONE:

Il tastino di reset non è come il reset del computer, che fa riavviare la macchina e cancella il programma in memoria. La memoria su cui è memorizzato lo sketch non è RAM, che si cancella senza alimentazione, è di tipo Flash e mantiene quindi il programma fino a successiva riprogrammazione.

La Manovra d'emergenza di solito serve quando il micro è bloccato sulla seriale ma non sembra bloccato sulla seriale, sembra invece "sordo", nel senso che non comunica più col computer, ed è la sequente:

 1) aprire l'IDE
 2) caricare uno sketch qualunque, anche il "blink" modificato (prova a mettere un delay doppio)
 3) prendere l'Arduino e tenere premuto il pulsante "reset".
 4) MENTRE si tiene questo tasto pigiato, collegare l'Arduino al PC.
 5) adesso, MENTRE si continua a tenere pigiato il pulsantino, premere il tasto di upload dello sketch
 6) ora rilasciare il pulsantino di reset
 7) se si è trovato la sincronizzazione giusta tra la pressione del pulsante grafico di upload dello sketch ed il rilascio del reset, verrà caricato lo sketch

http://arduino.cc/forum/index.php/topic,59668.msg429965.html#msg429965


  • Shield ethernet bloccato

Lo shield ethernet puo' bloccarsi in loop infinito, col led giallo che lampeggia continuamente.

Per evitarlo, mettere un condensatore da 47 nanoFarad tra piedino di massa e piedino di reset.

======================

Software

  • IDE non si avvia

http://jumpjack.wordpress.com/2010/12/04/problemi-vari-con-scheda-arduino/

  • Istruzioni uso Ethernet Shield troppo generiche

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 codice di 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 90a2da00235d sulla arduino, nell’esempio sottostante si usa l’istruzione:

byte mac[] = { 0×90, 0xA2, 0xDA, 0×00, 0×23, 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.

Nelo sketch Arduino, 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 semplicemente che a tutti i dati che inverà sulla rete aggiungerà un'etichetta "porta 80", per cui solo i programmi autorizzati a leggere i programmi con questa etichetta (si dice che tali programmi sono in ascolto sulla porta 80) potranno leggere quei dati e inviarne altri al programma stesso.

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.

Nello sketch per Arduino, 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 a 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.

Sembra complicatissimo, ma questo schema dovrebbe spiegare tutto:

PC "Tizio" -------- INTERNET ------ porta pubblica: 72 --- ROUTER --- porta interna: 35 ----- Arduino

Nella figura, il PC "Tizio" è collegato a Internet, e si trova in capo al mondo; per collegarsi alla nostra Arduino, dovrà collegarsi al nostro router, che su internet viene "visto" come "porta 80 di un certo indirizzo IP", ad esempio 123.123.234.255:72 ; quindi, sul browser di quel PC basterà scrivere questo indirizzo, con il numero della porta dopo i ":", per collegarsi al nostro router.

Il nostro router sarà stato poi programmato in modo che tutti i dati che gli arrivano sulla porta 72 lui li invierà alla Arduino, usando internamente la porta 35. Invece i dati che arrivano sulla porta 80, il router saprà che sono normali "dati internet", e li invierà al nostro browser sulla porta 80, che è quella standard usata appunto dai browser internet.

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[] = { 0×00, 0×25, 0×22, 0×20, 0xee, 0×99 };
 byte mac[] = { 0×90, 0xA2, 0xDA, 0×00, 0×23, 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.

Problemi aperti

Hardware

  • 1
  • 2

Software

  • 1
  • 2

Share