Buonasera,
voglio condividere con voi il mio piccolo esperimento con Arduino e un router Alice AGPF che monta OpenWRT e chiedervi qualche informazione.
Ho connesso Arduino Duemilanove alla porta USB dell'AGPF,
installati i pacchetti:
kmod-usb-serial
kmod-usb-serial-ftdi
e l'arduino risponde bene sulla /dev/ttyUSB0.
Per comunicare con arduino devo aprire una connessione con
cat /dev/ttyUSB0
oppure
tail /dev/ttyUSB0
altrimenti non funziona.
Fino ad ora scambio informazioni con
echo qualcosa > /dev/ttyUSB0
Per interagire con arduino via LAN o wifi ho eseguito dei piccoli script cgi che fanno banalmente echo sulla seriale, ma ho bisogno di aprire attraverso un'altra shell la comunicazione con cat o tail.
Volevo chiedere, esiste qualche libreria o un altro metodo per comunicare attraverso l'interfaccia web con Arduino?
Il mio scopo è quello di inviare dei comandi magari via http anche attraverso un terminale Android o comunque da una pagina web e magari ottenere informazioni elaborate dall'arduino stesso.
Grazie.
Io per un sistema che uso ho aperto un server web in python e ho aperto via python una comunicazione seriale stabile, cosi' che tutti i dati siano sempre disponibili, e poi vado a chiamare le pagine del mio server web che mi restituiscono i valori che occorrono...
Forse non si capisce niente
Codice:
Python Server Web
import os,sys
import socket
from BaseHTTPServer import HTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
from CGIHTTPServer import CGIHTTPRequestHandler
from arduino_client import ClientUino
print 'starting arduino ...'
ARDUINO=ClientUino()
print '... arduino started'
class CommandServerHandler(SimpleHTTPRequestHandler,CGIHTTPRequestHandler):
def do_GET(self):
try:
getattr(ARDUINO,self.path[1:])()
except Exception, e:
print e
if __name__=='__main__':
server_address = ('', 8000)
cmdServer=HTTPServer(server_address,CommandServerHandler)
cmdServer.serve_forever()
Funzioni:
#!/usr/bin/env python
import time
import serial
class ClientUino(object):
def __init__(self):
self.server=serial.Serial(2) #COM3
time.sleep(2)
def start(self):
return self.server.write('s 0 1')
def end(self):
return self.server.write('s 0 0')
Su un pc, ma openWRT mi ricordavo avesse il python dentro, mi sbaglio?
Al limite puoi tradurlo in qualche altro linguaggio... io ho incollato il mio per capire meglio di che parlavo
Ciao Riddick86, io ho un AGA 2 Plus WiFi con il FW UsRobotics di Roleo, sapresti dirmi (visto che io e la linea di comando andiamo poco d'accordo) che linee di codice hai eseguito per far riconoscere al modem l'arduino?
Grazie
Ciao Guglio,
ho dovuto installare due pacchetti per OpenWRT che in pratica aggiungono i moduli del kernel per il riconoscimento dei dispositivi usb-seriale.
Il firmware US Robotics è diverso da OpenWRT ma se non sbaglio, quello di Roleo, integra busybox, quindi puoi provare a vedere se ti riconosce la periferica.
Se sei arrivato alla linea di comado del router, connetti arduino alla porta usb e lancia il comando:
dmesg
e vedi se tra le ultime linee dell'output c'è scritto qualcosa relativo all'arduino tipo: FTDI o usb serial;
trovate queste info ci dovrebbe essere un riferimento ad un percorso del tipo:
/dev/tty.....
che rappresenta il tuo dispositivo.
Ad esempio su OpenWRT, l'arduino è visto come:
/dev/ttyUSB0
Spero di esserti stato di aiuto. Tienici aggiornati.
A dire la verità al momento ho l'alimentatore dell' AGA rotto, va a singhiozzo devo andare a rubarlo a qualche mio amico
Ho provato con la fonera2.0n (Open WRT) e mi ha installato i pacchetti
root@Fonera:~# opkg install kmod-usb-serial
Package kmod-usb-serial (2.6.23.17-rb532-1) installed in root is up to date.
root@Fonera:~# opkg install kmod-usb-serial-ftdi
Package kmod-usb-serial-ftdi (2.6.23.17-rb532-1) installed in root is up to date.
Eseguendo dmesg mi restituisce
RT305x_ESW: Link Status Changed
RT305x_ESW: Link Status Changed
RT305x_ESW: Link Status Changed
hub 1-0:1.0: state 7 ports 1 chg 0000 evt 0002
hub 1-0:1.0: port 1, status 0101, change 0001, 12 Mb/s
hub 1-0:1.0: debounce: port 1: total 100ms stable 100ms status 0x101
usb 1-1: new full speed USB device using dwc_otg and address 7
usb 1-1: ep0 maxpacket = 8
usb 1-1: default language 0x0409
usb 1-1: new device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1: Product: FT232R USB UART
usb 1-1: Manufacturer: FTDI
usb 1-1: SerialNumber: A400fOjy
usb 1-1: uevent
usb 1-1: usb_probe_device
usb 1-1: configuration #1 chosen from 1 choice
usb 1-1: adding 1-1:1.0 (config #1, interface 0)
usb 1-1:1.0: uevent
drivers/usb/core/inode.c: creating file '007'
hub 1-0:1.0: state 7 ports 1 chg 0000 evt 0002
hub 1-0:1.0: port 1 enable change, status 00000103
hub 1-0:1.0: state 7 ports 1 chg 0000 evt 0002
hub 1-0:1.0: port 1 enable change, status 00000100
hub 1-0:1.0: port 1 disabled by hub (EMI?), re-enabling...
hub 1-0:1.0: port 1, status 0100, change 0002, 12 Mb/s
usb 1-1: USB disconnect, address 7
usb 1-1: unregistering device
usb 1-1: usb_disable_device nuking all URBs
usb 1-1: unregistering interface 1-1:1.0
usbdev1.7_ep81: ep_device_release called for usbdev1.7_ep81
usbdev1.7_ep02: ep_device_release called for usbdev1.7_ep02
usb 1-1:1.0: uevent
usbdev1.7_ep00: ep_device_release called for usbdev1.7_ep00
usb 1-1: uevent
hub 1-0:1.0: state 7 ports 1 chg 0000 evt 0002
hub 1-0:1.0: port 1, status 0101, change 0001, 12 Mb/s
hub 1-0:1.0: debounce: port 1: total 100ms stable 100ms status 0x101
usb 1-1: new full speed USB device using dwc_otg and address 8
usb 1-1: ep0 maxpacket = 8
usb 1-1: default language 0x0409
usb 1-1: new device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1: Product: FT232R USB UART
usb 1-1: Manufacturer: FTDI
usb 1-1: SerialNumber: A400fOjy
usb 1-1: uevent
usb 1-1: usb_probe_device
usb 1-1: configuration #1 chosen from 1 choice
usb 1-1: adding 1-1:1.0 (config #1, interface 0)
usb 1-1:1.0: uevent
drivers/usb/core/inode.c: creating file '008'
hub 1-0:1.0: state 7 ports 1 chg 0000 evt 0002
hub 1-0:1.0: port 1 enable change, status 00000103
Solo che navigando dentro a /dev/ non vedo nulla che assomigli ad un ttyUSB o simile
da
sb 1-1: Product: FT232R USB UART
usb 1-1: Manufacturer: FTDI
usb 1-1: SerialNumber: A400fOjy
l'FTDI viene visto, probabilmente non come ttyUSB ma come usbdev1.1
test veloce: "echo qualcosa > /dev/usbdev1.1" e arduino dovrebbe leggere "qualcosa"
se il test funziona, sappi che è abbastanza normale che non ci sia ttyUSB perchè i nomi delle periferiche son settati in base alle politicy di UDEV che non sono sempre standard... anche la mia arch linux faceva una cosa simile (metteva le usb dentro delle cartelle)
ho risolto così: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1284506214
root@Fonera:/dev# echo 1 > /dev/usbdev1.1
root@Fonera:/dev# echo 1 > /dev/usbdev1.1_ep00
-ash: cannot create /dev/usbdev1.1_ep00: No such device or address
root@Fonera:/dev# echo 1 > /dev/usbdev1.1_ep00
-ash: cannot create /dev/usbdev1.1_ep00: No such device or address
root@Fonera:/dev# echo 1 > /dev/usbdev1.1_ep81
-ash: cannot create /dev/usbdev1.1_ep81: No such device or address
root@Fonera:/dev# echo 1 > /dev/usbdev1.2
root@Fonera:/dev# echo 1 > /dev/usbdev1.2_ep00
-ash: cannot create /dev/usbdev1.2_ep00: No such device or address
root@Fonera:/dev# echo 1 > /dev/usbdev1.2_ep02
-ash: cannot create /dev/usbdev1.2_ep02: No such device or address
root@Fonera:/dev# echo 1 > /dev/
-ash: cannot create /dev/: Is a directory
root@Fonera:/dev# echo 1 > /dev/usbdev1.2_ep81
-ash: cannot create /dev/usbdev1.2_ep81: No such device or address
root@Fonera:/dev# echo 1 > /dev/usbdev1.2_ep81
-ash: cannot create /dev/usbdev1.2_ep81: No such device or address
root@Fonera:/dev# echo 1 > /dev/usbdev1.2_ep81
E sull'arduino non s'è accesa la spia TX...
(Anche perchè inviando 1 s'accende il led sul 13 quindi me ne sarei accorto)
Ho cercato la cartella udev dentro a etc ma non c'è...
Stasera smonto il trasformatore dell' AGA magari si è scollegato qualche filo dentro, molto probabile visto che muovendolo un po' torna a funzionare...
@lesto: prima o poi voglio configurare il mio udev per dare un nome piuì decoroso di ttyUSBx agli arduini... avevo visto quelle istruzioni ma in generale non mi aveva aiutato piu' di tanto, ma ci avevo speso poco tempo. Grazie per avermi rinfrescato la memoria!
QUÌ sembra aver funzionato la comunicazione.... sicuro del codice di arduino? considera che non hai impostato baud rate e mille altre cose, quindi arduino non riceverà quasi sicuramente l'1 ma un cifro di caratteri strani...
io userei questo codice:
void setup(){
Serial.start(9600);
}
void loop(){
if (Serial.avaiable()>0){
//accendi led
}
}
root@Fonera:/dev# echo 1 > /dev/
-ash: cannot create /dev/: Is a directory
quì cosa fai!!!! è così che si combinano i danni.. ;D spero che almeno questi test non li hai fatti da root :
@federico: ammetto che il mio inglese fa schifo, ho riletto l'articolo e fa davvero pena... se ti serve una mano sono disponibile!