OpenWRT e Arduino

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 :slight_smile:

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')

Chiamate py per leggere e usare i valori

#!/usr/bin/env python



import urllib

chiamata=urllib.urlopen("http://localhost:8000/start")

chiamata.read()

Mi piace python, ma tu lo esegui su un router o un pc?

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

Si, sembra anche a me. Appena posso proverò anche questa strada, grazie.

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 :wink:

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 :stuck_out_tongue:
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

Hai Arduino Duemilanove o Arduino UNO?

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" :slight_smile:
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

Arduino 2009

D'oh!

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!

Che ne pensate di questa libreria?
http://www.pyaler.org/

Implementa la comunicazione con Arduino attraverso API REST.

Appena posso lo provo ad eseguire sul router.

Che ne pensate di questa libreria?
http://www.pyaler.org/

Interessante come progetto, non lo conoscevo!

@guglio:
root@Fonera:/dev# echo 1 > /dev/usbdev1.1

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 ::slight_smile:

@federico: ammetto che il mio inglese fa schifo, ho riletto l'articolo e fa davvero pena... se ti serve una mano sono disponibile!

Azzo che rabbia sta fonera!

void setup(){
  Serial.begin(9600);
  pinMode(13,OUTPUT);
}
void loop(){
  if (Serial.available()>0){
    digitalWrite(13,HIGH);
  }
}

dmesg: Andrea Guglielmini

Come collego l'usb mi compaiono in /dev/ usbdev1.2 usbdev1.2_ep02 usbdev1.2_81, scrive solo sul primo e il led non s'accende!

root@Fonera:/dev# echo qualcosa > /dev/usbdev1.2
root@Fonera:/dev# echo 'qualcosa' > /dev/usbdev1.2
root@Fonera:/dev# echo "qualcosa" > /dev/usbdev1.2

Ho provato anche a scrivere sui 3 tty ma non succede nulla!!
:o :o :o :o

non so perchè compaiano quelle usbdev, ma da dmesg pare che quella giusta è la 1.1:
usb 1-1: Product: FT232R USB UART
usb 1-1: Manufacturer: FTDI

echo qualcosa > /dev/usbdev1.1

provale un po' tutte, occhio che sei root e puoi fare danni!(beh nulla che un reboot non possa sistemare, se non elimini nulla)