Archives de Catégorie: OpenWRT

Instabilité de l’Arduino relié au WR703N – Part 2

Comme je l’avais dis dans mon précédent billet, j’ai des soucis de stabilité de lecture du port serie depuis le WR703N.

J’ai donc modifié le programme de lecture pour faire une fermeture puis une réouverture du port série, le problème se reproduit donc ce n’est pas la solution.

En complément j’ai modifié mon code Arduino pour allumer une led pendant la mesure, la led reste donc allumée quelques secondes avant de s’éteindre pendant la phase d’attente. J’ai bien constaté que pendant le figeage des lecture la led s’allumait et s’éteignait. L’Arduino n’est donc pas figé.

Le problème semble donc se situer au niveau du module cdc_acm ou du programme C. Sachant que le meme programme se déroule sans encombre sur mon PC Linux, je privilégie un pb module ou une spécificité à apporter à l’initialisation du port série. 

Pour le moment je n’ai pas d’idée comment avancer … si un lecteur en a … je prends

Publicités

Instabilité de l’Arduino relié au WR703N

Comme je l’ai décris ici a plusieurs reprises, j’utilise un WR703N pour lire la liaison série de l’Arduino.

Cependant le montage s’arrête au bout d’un certain temps sans raison apparente. J’ai d’abord incriminé le matériel et le système, après tout le WR703N est du low cost Made in China ^^ et la version d’OpenWRT est en Bleeding Edge (danger Béta ^^).

L’Arduino me paraissait hors de cause vu qu’une fois branché sur l’USB du Linux il marche pendant des jours.

Il y a quelques jours je suis tombé sur l’article d’Andy Brown qui a eu le même soucis.

Lui a récupéré les données par un autre biais qu’un programme C, une lecture direct par le shell . Son hypothèse étant d’ouvrir à chaque lecture le port. Chez lui ça à l’air de fonctionner. Apres en avoir discuté ensemble je me suis mis en tete de modifier mon programme de lecture pour ré ouvrir le port périodiquement.

Mais hier, j’ai eu une autre idée (vous ne vous y attendiez pas hein ^^), et si le problème ne venait pas du système (un bug sur le driver cdc_acm qui m’aurait fort embetté) ? Hier j’ai donc fait le test en ajoutant une alimentation externe à l’Arduino.

 

Au moment où je vous parle (H+12), ça tourne toujours sans planter …

Est-ce la solution ? L’avenir le dira …

EDIT : J’ai parlé trop vite, en rentrant cet apres-midi j’ai trouvé la bête figée, plus d’accès au port ttyACM1 😦 Dans ces cas là obligé de relancer l’Arduino (électriquement)

 

Passer un Arduino en wifi avec un WR703N

Le problème dans un appartement c’est bien souvent de faire passer des câbles et je trouve les shields réseau pour Arduino horriblement couteux. Rien que le shield ethernet coute une trentaine d’euro, et le wifi, si mes souvenirs sont bons est au moins une cinquantaine.

Possédant un WR703N qui allie le wifi et l’ethernet pour un prixé dérisoire, j’avais déjà pris le pari dans les articles précédents de lire les données de l’arduino depuis celui-ci. La connexion était en filaire, j’ai un peu cherché dans différents tutoriels pour activer le  mode client en WPA sur openwrt.

J’ai failli m’arreter sur celui-ci , utilisant wpa_supplicant, mais il n’est pas intégré aux outils de configuration d’OpenWRT ce que je trouvais dommage.

Apres quelques tâtonnements j’ai trouvé la configuration suivante :

  • /etc/config/network
config interface 'wan'
 option ifname 'wlan0'
 option 'proto' 'static'
 option 'ipaddr' '192.168.2.99'
 option 'netmask' '255.255.255.0'
  • /etc/config/wireless
config wifi-iface
 option device 'radio0'
 option mode 'sta'
 option ssid 'ssid de votre réseau Wifi'
 option encryption 'psk'
 option key 'mot de passe du wifi'

Il suffit alors de rebooter ou tout simplement de lancer la commande

wifi up

Reste à le passer en mode dhcp pour coller à la topologie du réseau de la maison, mais l’essentiel est fait.

Actuellement je mesure 0.5W en consommation pour l’Arduino (avec le programmes d’acquisition des températures et de la luminosité) et le WR70N avec Wifi et LAN activé. Je serais curieux de comparer avec un shield wifi, si quelqu’un à l’info …

D’ailleurs je cherche un câble USB « court » A mâle vers B mâle pour alimenter l’arduino depuis le WR703N, le plus court que j’ai fait son mètre et c’est un peu ridicule pour relier deux petites machines qui sont cote a cote. Alors si quelqu’un sait ou s’en procurer des pas cher (ou des connecteurs USB pas cher pour faire un câblage maison …)

EDIT : A lire la procédure de Andy Brown qui part dans le même sens que moi, mais à une autre approche que moi pour la lecture des données venant de l’arduino (je l’avais détaillée ). Comme on dit en perl : tmtowtdi.

1 seul SSID sur un Access Point ? C’est dépassé ! Scotty, energize

Je suis tombé sur ce tutoriel qui semble créer un second point d’accès sur une même carte wifi , WTF ?!?! Je croyais que ce genre de choses risquais de distendre la nature même du continuum espace temps. Ok j’ai abusé de Doctor Who ça doit être pour ça.

Bon on tente alors ?

Le but est d’avoir sur une même machine

  • un réseau sécurisé qui donne accès à internet via la passerelle et au réseau local
  • ET un réseau pas sûr du tout, ouvert même, qui donne accès a un site web local, genre piratebox, accès http pour arduino, …

Donc voici le contenu de nos désormais célèbres fichiers de config

  • /etc/config/network
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'

config interface 'lan'
option ifname 'eth0'
option type 'bridge'
option proto 'static'
option ipaddr '192.168.2.1'
option netmask '255.255.255.0'
option gateway '192.168.2.3'
list dns '192.168.2.1'
list dns '8.8.8.8'
list dns '8.8.4.4'

config interface 'wan'
option ifname 'wlan0'
option 'proto' 'static'
option 'ipaddr' '192.168.3.1'
option 'netmask' '255.255.255.0'

config interface 'guest'
option 'proto' 'static'
option 'ipaddr' '10.0.0.1'
option 'netmask' '255.255.255.0'

Je ne comprends pas l’absence de ligne interface mais ça marche sans, il me créé un wlan0-1 (et pourquoi pas un eth0-1 ou un lo-1 ???)

  • /etc/network/wireless
config wifi-device 'radio0'
option type 'mac80211'
option channel 11
option macaddr '14:e6:e4:a7:09:d2'
option hwmode '11ng'
option htmode 'HT20'
list ht_capab 'SHORT-GI-20'
list ht_capab 'SHORT-GI-40'
list ht_capab 'RX-STBC1'
list ht_capab 'DSSS_CCK-40'
option disabled '0'

config wifi-iface
option device 'radio0'
option network 'wan'
option mode 'ap'
option 'ssid' 'Hot Sec'
option encryption 'psk2'
option key 'JeSuisUnMotDePasseWPA2'

config wifi-iface
option device 'radio0'
option network 'guest'
option mode 'ap'
option 'ssid' 'Public Box'
option encryption 'none'

à noter que ce genre de config ne semble pas aimer le WEP, quand j’ai essayé de mettre WEP comme mode d’encryption il m’a jeté, donc on abaisse les boucliers et ça roule.

  • /etc/config/dhcp
config dnsmasq
option domainneeded '1'
option boguspriv '1'
option filterwin2k '0'
option localise_queries '1'
option rebind_protection '1'
option rebind_localhost '1'
option local '/lan/'
option domain 'lan'
option expandhosts '1'
option nonegcache '0'
# option authoritative '1'
option readethers '1'
option leasefile '/tmp/dhcp.leases'
option resolvfile '/tmp/resolv.conf.auto'

config dhcp 'wan'
option interface 'wan'
option start '200'
option limit '225'
option leasetime '12h'

config dhcp 'guest'
option interface 'guest'
option start '200'
option limit '225'
option leasetime '12h'
  • /etc/config/firewall

Juste une petite zone de plus

config zone
option name guest
option network 'guest'
option input REJECT
option output ACCEPT
option forward REJECT

config rule

option name Allow-DHCP
option src guest
option proto udp
option dest_port 67-68
option src_port 67-68
option target ACCEPT

C’est encore un work in progress, pour le moment pas encore de serveur Web, donc rien de fonctionnel. Donc pour le moment les clients se connectent, reçoivent une ip via DHCP et … c’est tout.

Un petit coup d’opkg install uhttp et un mini index.html dans /www devraient faire l’affaire pour un service web minimal.

Il me reste a faire une redirection automatique de tout requête HTTP/HTTPS vers le serveur web qui sera hébergé.

dans le fichier firewall,

config redirect                       
        option 'proto' 'tcp'          
        option '_name' 'Website'      
        option 'src' 'guest'               
        option 'src_dport' '80'  
        option 'dest_ip' '10.0.0.1'
        option 'dest_port' '80'

config rule                                                 
        option proto tcp                   
        option dest_port 80                     
        option src      guest                   
        option target ACCEPT

Le problème est que notre petit serveur web génère des messages « File Not Found » que j’ai mis du temps à comprendre. En fait cela marchait en tapant http://www.google.fr depuis mon client mais pas en faisant un http://www.google.fr/search…
Alors une idée ?
C’est tout simple mon serveur web cherchait une page /search et comme c’est un uhttpd assez basique il ne renvoi pas de page 404 « lisible ».
Donc solution : générer une page pour le cas 404 Not Found qui fasse un redirect vers la base du site, un truc qui encapsule ce genre de tag en somme :

meta http-equiv="refresh" content="0; url=http://10.0.0.1/"

Il faut donc aussi modifier le fichier de config de uhttpd pour prendre en compte cette page 404 :

option error_page       /404.html

OpenWrt comme AP Wifi en WPA

Je ne sais pas si je l’ai déjà dis, mais j’adore openwrt 😉

J’ai un réseau en 192.168.2.X et par un malencontreux coup du sort je suis contraint d’utiliser une carte wifi du serveur pour accéder au Grand Ternet. Je n’ai plus de wifi résidentiel donc la tablette fait la grise mine (plus d’accès au NAS 😦 )

Bref, ce soir j’ai parametré openwrt en AP WPA en suivant cette procédure, claire, concise, efficace …

  • /etc/config/network
config interface 'lan'
option ifname 'eth0'
option type 'bridge'
option proto 'static'
option ipaddr '192.168.2.1'
option netmask '255.255.255.0'
option gateway '192.168.2.3'
list dns '192.168.2.1'
list dns '8.8.8.8'
list dns '8.8.4.4'

config interface 'wan'
option ifname 'wlan0'
option 'proto' 'static'
option 'ipaddr' '192.168.3.1'
option 'netmask' '255.255.255.0'
  • /etc/config/wireless
config wifi-device 'radio0'
option type 'mac80211'
option channel 11
option macaddr '14:e6:e4:a7:09:d2'
option hwmode '11ng'
option htmode 'HT20'
list ht_capab 'SHORT-GI-20'
list ht_capab 'SHORT-GI-40'
list ht_capab 'RX-STBC1'
list ht_capab 'DSSS_CCK-40'
option disabled '0'

config wifi-iface
option device 'radio0'
option network 'wan'
option mode 'ap'
option 'ssid' 'nom du reseau'
option encryption 'psk2'
option key 'CestlaclefWPAsupersecrete'
  • /etc/config/firewall

config zone
option name lan
option network ‘lan’
option input ACCEPT
option output ACCEPT
option forward REJECT
option masq 1

config zone
option name wan
option network ‘wan’
option input ACCEPT
option output ACCEPT
option forward REJECT
option masq 1
option mtu_fix 1

config forwarding
option src wan
option dest lan

config forwarding
option src lan
option dest wan

  • /etc/config/dhcp
config dhcp 'wan'
option interface 'wan'
option start '200'
option limit '225'
option leasetime '12h'

Coté serveur linux j’ai eu la commande suivante à passer pour accéder aux machines de l’autre subnet

route add -net 192.168.3.0 netmask 255.255.255.0 gw 192.168.2.1 eth2

et le ping passe dans les deux sens, c’est déjà pas mal.

Reste à trouver comment faire fonctionner le discover DNLA depuis le subnet en 192.168.3.xx

TODO : j’ai entendu parler d’un igmpproxy qui semblerait correspondre … a faire

Cross compilation pour openwrt

Bon, j’ai un petit programme C qui lit depuis l’USB des données que crache l’arduino et j’aimerais bien le mettre sur mon wr703n.

Pour ça un peu de cross compilation me parait souhaitable, je n’imagine pas coller gcc sur une machine avec 1,5 Mo de Filesytem ^^.

Je retourne dans mon environnement de développement (j’en avais parlé  ) et … bon, ok quelles options faut-il passer à gcc ?

Heureusement que google est mon ami (pour le moment du moins) des gens bien écrivent des howto pour compiler des programmes sur OpenWRT.

Donc après la création de l’arborescence dans package et l’ajout de mon programme dans les packages du .config (en tout et pour tout rajouter un CONFIG_PACKAGE_log-avr=m dans le .config), il est le temps de faire un make.

Le temps de prendre sa douche et voilà, un log-avr tout chaud !
staging_dir/target-mips_r2_uClibc-0.9.33/root-ar71xx/bin/log-avr fait 6857 octets (à comparer avec les 17331 octets sur ma machine linux, faudra que je reprennes des options d’optimisation ^^).

On le copie sur le wr703 … on le lance  et …


1025,613,** capteur 1-wire present avec code adresse 64 bits : **
1025,618,** 28 80 F9 A7 03 00 00 6A Capteur temperature DS18B20.CRC OK **
1025,622,** 28 68 22 A8 03 00 00 56 Capteur temperature DS18B20.CRC OK **
1025,630,** 28 26 EF BB 03 00 00 4E Capteur temperature DS18B20.CRC OK **
1025,634,** 28 BD C6 BB 03 00 00 0C Capteur temperature DS18B20.CRC OK **
1025,642,** 28 93 FA A7 03 00 00 26 Capteur temperature DS18B20.CRC OK **
1025,646,***** fin de la recherche des capteurs *****
1060,599,D30001,485,204,24.19,24.50,24.25,21.44,23.87
1090,572,D60001,485,205,24.25,24.56,24.31,21.44,23.87
1120,549,D90001,484,203,24.31,24.56,24.37,21.44,23.87

ben ça marche … étonnant non ?

PS : Pour les curieux il s’agit des résultats de mesures de 2 photorésistances et de 5 capteurs de températures répartis dans le bureau.

Un arduino en mode "Shelob"

Comment transformer un arduino en araignée pleine de pattes.
Bon ... cinq capteurs de températures et deux de lumières ça fait des fils quand même ^^

WR703N et Arduino

Une de mes marottes de ces derniers mois a été de jouer avec un arduino Uno, tient essayons de les faire causer ensemble …

Premier branchement du câble USB, pas de /dev/ttyACM0 en vue, ça part mal !

Après moult tests j’ai enfin réussi, il manquait « juste » le module noyau cdc-acm.

Ça parait simple comme ça mais j’ai du recompiler openwrt pour l’avoir ce module. Et vu la procédure d’installation de la piratebox que j’ai suivi je joue avec une version « bleeding-Edge » de  la bestiole.

Vu que c’est encore frais dans ma tête voila les étapes que j’ai suivi :

Installation d’une version de dev d’openwrt, j’ai juste du utiliser une version antérieure pour correspondre à ce que j’avais installé (r31214 pour les curieux).

Dans le make menuconfig j’ai coché les options suivantes :

  • Target System (Atheros AR7xxx/AR9xxx)
  • Target Profile (TP-LINK TL-WR703N)
  • Kernel modules > USB Support >  kmod-usb-acm (en module)

On sort et on enregistre tout ça, et piouf, il est l’heure de faire un make (ça faisait des années que je n’avais pas recompilé un kernel linux ça me rajeuni).

Suffit juste le ./staging_dir/target-mips_r2_uClibc-0.9.33/root-ar71xx/lib/modules/3.2.13/cdc-acm.ko généré et de le mettre dans /overlay/lib/modules/3.2.13 sur la piratebox.

Bon ça marche pas encore j’ai dû aussi rajouter un fichier dans /overlay/etc/modules.d contenant « cdc-acm » et un lien vers celui-ci depuis /overlay/etc/modules-boot.d/.

Et là après un petit boot … /dev/ttyACM0 est là, youhou !!

Une autre solution semblait de reprendre le boulot que d’autres ont fait mais cela me forçait à reflasher le WR703 et à perdre ce que j’ai pu faire dessus. Mais ce serait surement une solution plus élégante que d’avoir tout dans une seule et même image sans devoir rajouter des morceaux. Bon on verra plus tard ( j’ai commandé une seconde piratebox alors on verra pour lui réserver cette solution)

WR703N … vers l’infini et on verra

Le WR703N dont je parlait précédemment consomme peu, très peu ! Je l’ai mesuré à 0.3W.

Ça donne des idées pour la suite, déjà première inspiration le passer sur un boitier à pile, en une heure de temps j’ai fait un petit adaptateur USB/boitier de piles avec mon gamin (son premier circuit imprimé c’est touchant).

Boitier a pile avec sortie USB

En utilisant 4 piles AA rechargeable en 2000mAh la machine a tenu 11h30, pas mal, mais pour le moment il n’y avait pas de charge a part un petit script qui m’a donné la date d’arrêt ^^:

while [ 1 ]
do
date
sleep 60
done

Pas de quoi fouetter un gnou , mais 11h30 avec du réseau c’est encourageant ^^

Tient faudra que j’essaye de le mesurer en mode « piratebox » (donc avec clef USB et wifi en Access Point), ça devrait consommer plus.

La bonne surprise de la piratebox

Il y a quelque temps je suis tombé sur le blog Milanese Mederic parlant de sa piratebox, voyant le prix j’ai suivi le mouvement jusqu’à trouver des TP-Link TL-WR703N à moins de 20€ sur ebay en import Hong Kong (Frais de port compris).

WR703n

WR703n alimenté en USB avec un RJ45 et un cable USB host (a l'autre bout c'est un arduino ).

Comme conseillé j’ai suivi la procédure de David Darts et cela a fonctionné (à la seconde tentative, la premiere fois j’avais oublié de mettre la clef USB avant la manip ^^).

J’ai juste eu une petite appréhension en ne trouvant plus la nouvelle petite machine sur le réseau, c’est juste qu’elle n’était pas sur le même subnet et n’utilise pas de DHCP (192.168.1.1).

Un petit ifconfig eth2:1 192.168.1.3 et ma  machine pouvait communiquer avec la piratebox.
C’est là où on est content de connaitre la commande  ifconfig.

La piratebox a donc commencé à vivre … suite aux prochains épisodes