Jumping Jack Flash weblog

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.

Una Risposta

Subscribe to comments with RSS.

  1. [...] Problemi vari con scheda Arduino [...]


Puoi inserire un commento qui sotto; diventerà visibile dopo la moderazione dell'amministratore

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.

Unisciti agli altri 70 follower

%d blogger cliccano Mi Piace per questo: