Versions
2014/08/04 : Création
2014/08/17 : Erratum, attente connexion TCP non bloquant. J'ai changé ma conclusion, je vais continuer les tests sur Arduino.
Contactez-nous
Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81
Monter un serveur wifi avec un Arduino et un écran LCD
Introduction
Contenu du tutoriel
Ce tutoriel présente les étapes du montage d'un serveur wifi sur une plateforme Arduino.
Nous insistons sur les élements qui nous ont posé des difficultés et nous donnons nos premières conclusions sur cette expérimentation.
Motivations
Dans le cadre du projet d'un client, nous devons simuler un peripheral bluetooth (pas wifi, bluetooth). En attendant la livraison du module bluetooth choisi (et acheté) par notre client, nous avons testé la plateforme Arduino dans un cas simple pour voir si on peut l'utiliser pour monter le peripheral de test avec.
Nous allons probablement tester aussi les plateformes Tessel, Raspberry PI et Beagleboard.
A qui s'adresse ce tutoriel
Nous partons du principe que :
- Vous savez développer et que vous avez des notions minimales (vraiment minimales) en C
- Vous êtes bidouilleur et vous savez lire des docs techniques en français ou en anglais
- Vous avec des notions minimales en électronique (genre si vous faites un court-circuit entre le +5V et la masse, vous risquez de griller votre circuit...)
Matériel nécessaire
- Le starter kit arduino : http://store.arduino.cc/product/K000007
- Si vous êtes une bille en électronique, je vous conseille le livre "Le grand livre d'arduino"
- Le shield wifi officiel (integrated antena) : http://store.arduino.cc/product/A000058
- l'IDE Arduino 1.0.5 (cf site arduino.cc - download). Attention, la version de l'IDE est importante, notamment poour la compatibilité avec le shield wifi.
Description des éléments importants
Le starter kit Arduino
Je vais m'appuyer sur ce starter kit pour décrire le montage.
Le starter kit contient notamment :
- Un guide de 170 pages contenant des montages de base pour Arduino
- Un Arduino UNO
- Une plaquette d'essai (Breadboard)
- Un écran LCD
- Des cables et des diodes pour faire les liaisons
Une grande partie du montage présenté ci-dessous s'appuie sur le montage "Crystal Ball" du guide.
Nous avons limité ce montage au branchement de l'écran LCD, changé quelques branchements pour éviter des incompatibilités avec le shield wifi et ajouté une diode comme indicateur de connexion TCP.
L'arduino UNO lui même (inclu dans le starter kit)
En résumé, l'arduino UNO est une carte électronique avec un micro-controlleur qu'on programme en C++ à travers l'interface USB de la carte. Cette carte interagit avec l'extérieur à travers ses ports numériques (en entrée ou en sortie) ou ses ports analogiques (en entrée uniquement).
Le Shield Wifi
Un shield, dans le monde arduino, c'est un composant qui fait grosso modo la taille de l'arduino et qui s'empile sur l'arduino.
Ca facilite pas mal les branchements. Les branchements se font sur le shield comme s'il remplacait l'arduino original (sauf que dans la vraie vie, le shield utilise certaines broches pour ses besoins propres, il ne faut donc plus les utiliser).
La galère du montage : l'upgrade du firmware du shield Wifi
Le shield wifi, quand on le reçoit a une version du firmware 1.0.0. Cette version n'est pas compatible avec l'IDE Arduino 1.0.5. Il faut une version 1.1.x.
Il faut donc mettre à jour ce firmware, et là c'est une opération pas simple, notamment parce qu'on trouve tout et n'importe quoi sur Internet.
Les étapes de l'upgrade
Ces étapes concernent l'upgrade pour windows, la procédure est différente pour linux ou mac os.
- Télécharger le programme FLIP (3.4.7 au 05/08/2014) chez Atmel (sans java, on n'en a pas besoin) : http://www.atmel.com/tools/flip.aspx (note : Atmel est le constructuer du circuit programmable du shield wifi)
- Télécharger le driver USB pour le shield : AVR32 USB Driver (note : ce driver USB a été récupéré d'un tutoriel trouvé sur dfrobot.com et recopié ici)
- Démonter le shield wifi de l'Arduino avant de faire l'opération
- Connecter le Jumper J3 (cf image)
- Brancher le shield wifi sur votre PC avec la prise micro USB
- Installer le driver AVR32 USB Driver
- Aller dans le répertoire bin/ du programme Flip
- cd C:\Program Files (x86)\Atmel\Flip 3.4.7\bin
- Copier les bons firmware pour l'IDE 1.0.5. On les trouve justement dans un répertoire de l'IDE Arduino 1.0.5 : (le répertoire d'installation peut être différent chez vous)
- copier C:\Program Files (x86)\Arduino\hardware\arduino\firmwares\wifishield\wifi_dnld\Release\wifi_dnld.elf dans C:\
- copier C:\Program Files (x86)\Arduino\hardware\arduino\firmwares\wifishield\wifiHD\Release\wifiHD.elf dans C:\
- Dans un cmd windows, lancer la commande suivante :
- batchisp.exe -device AT32UC3A1256 -hardware usb -operation erase f memory flash blankcheck loadbuffer C:\wifi_dnld.elf program verify start reset 0
- débrancher puis rebrancher votre prise USB, puis :
- batchisp.exe -device AT32UC3A1256 -hardware usb -operation erase f memory flash blankcheck loadbuffer C:\wifiHD.elf program verify start reset 0
- Débrancher la prise USB
- Débrancher le jumper J3
Je vais maintenant revenir sur les étapes à problème.
Installation du driver AVR32 USB Driver
Cette étape est obligatoire : si vous n'installez pas le driver mentionné vous aurez une erreur du type "AtLibUsbDfu.dll not found" au moment de la mise à jour des firmware.
- Dézippez le fichier ZIP de driver où vous voulez
- Branchez le shield wifi en USB
- ouvrez un explorateur de fichier, faites un clic droit sur "Ordinateur" > "propriétés" > Gestionnaire de périphériques > Autres périphériques
- Faites un clic droit sur le périphérique inconnu et mettez à jour le pilote en allant chercher le driver dans le zip que vous avez décompressé
Le choix du firmware
Dans les tutos qu'on trouve partout sur internet, on trouve 15 firmwares différents pour ce shield wifi.
Il faut absolument prendre les firmware qui sont dans le répertoire "hardware" de l'IDE Arduino 1.0.5 que vous avez installé.
Le montage électronique
Le montage électronique s'appuie sur le montage 11 (page 115) de l'"Arduino Project Book", le guide inclu dans le starter Kit.
Par contre, il faut faire évoluer les connexions entre le LCD et l'arduino pour éviter des incompatibilités entre le montage du LCD et les connexions du shield wifi.
Le shield Wifi utilise les broches 4, 7, 10, 11 et 12 de l'arduino.
Du coup, nous utilisons le montage ci-dessous :
Montage matériel final
Voilà le montage final. En gros il consiste à cabler l'écran LCD à l'arduino. J'ai juste ajouté une LED sur le port 13 qui s'allume quand une connexion TCP est établie.
Code C++
Le code est basic et je pense lisible.
En gros :
- Dans le setup on établit la connexion wifi et on lance le serveur wifi
- Dans la loop, on attend la connexion d'un client. Quand un client est connecté, on recopie sur l'interface série et sur l'écran LCD ce qui a été envoyé par le client TCP
Il y a des petits soucis d'encodages avec l'écran LCD, j'avoue n'avoir pas bcp creusé encore...
#include <LiquidCrystal.h> #include <WiFi.h> #include <WString.h> char ssid[] = "my_ssid"; // your network SSID (name) char pass[] = "My_password"; // your network password int status = WL_IDLE_STATUS; // the Wifi radio's status IPAddress ip; // wifi server WiFiServer server(80); LiquidCrystal lcd(9, 8, 6, 5, 3, 2); // Pin 13 has an LED connected on most Arduino boards. // give it a name: int ledArduino = 13; String readString = String(100); // the setup routine runs once when you press reset: void setup() { // initialize the digital pin as an output. pinMode(ledArduino, OUTPUT); lcd.begin(16, 2); printLcd("Kitpages Wifi", "Connecting"); // initialize serial: Serial.begin(9600); // attempt to connect using WPA2 encryption: Serial.println("Attempting to connect to WPA network..."); status = WiFi.begin(ssid, pass); // if you're not connected, stop here: if ( status != WL_CONNECTED) { Serial.println("Couldn't get a wifi connection"); printLcd("Wifi failed"); while(true); } // if you are connected, print out info about the connection: else { Serial.println("Connected to network"); Serial.print("LocalIp="); ip = WiFi.localIP(); Serial.println(ip); printWifiStatus(); printLcd("Kitpages WiFi OK"); lcd.print(ip); } server.begin(); } // the loop routine runs over and over again forever: void loop() { // Serial.println("entering loop"); WiFiClient client = server.available(); //Serial.println("client found"); if (client) { while (client.connected()) { digitalWrite(ledArduino, HIGH); if (client.available()) { char c = client.read(); Serial.write(c); if (readString.length() < 100) { //store characters to string readString += c; } printLcd("Kitpages", readString); } } // close the connection: client.stop(); Serial.println("client disonnected"); } delay(10); digitalWrite(ledArduino, LOW); } void printLcd(char* line1, char* line2) { lcd.clear(); lcd.print(line1); lcd.setCursor(0,1); lcd.print(line2); } void printLcd(char* line1, String line2) { lcd.clear(); lcd.print(line1); lcd.setCursor(0,1); lcd.print(line2); } void printLcd(char *line) { printLcd(line, ""); } void printWifiStatus() { // print the SSID of the network you're attached to: Serial.print("SSID: "); Serial.println(WiFi.SSID()); // print your WiFi shield's IP address: IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); // print the received signal strength: long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); Serial.print("Firmware version: "); Serial.println(WiFi.firmwareVersion()); }
Résultat
A l'arrivée on obtient normalement :
- Un montage qui se connecte à notre réseau wifi
- Il affiche sur l'écran LCD l'adresse IP du module wifi
- si on fait un telnet my_ip 80, il affiche dans la console série ce que l'on tape et dans l'écran LCD la même chose mais avec des petits problèmes d'encodage.
Conclusions
L'électronique, c'est plus facile qu'en 1998
J'ai commencé ma carrière en électronique (en 1998) et je bidouillais un peu avant. Avec arduino, l'électronique, c'est beaucoup plus simple qu'à l'époque. Faire un montage de ce type sans utiliser d'oscillo pour essayer de trouver ce qui foire était quelque chose d'inconcevable à l'époque.
Globalement, à part cette histoire de firmware, tout le montage s'est déroulé sans problème. Quasiment tout a marché du premier coup.
Affectivement, je trouve cette plateforme Arduino attachante, peu chère et facile à aborder.
Mais trop limité
Autant nous pouvons utiliser Arduino pour des petits prototypes limités, autant j'ai l'impression que c'est vite très limité, et pas uniquement pour des histoires de performances :
- Je n'ai pas bcp creusé, mais a priori, quand la librairie wifi attend une connexion, elle l'attent vraiment. C'est un appel bloquant. => comment gérer des connexions simultanées ? Après vérification, cet appel n'est pas bloquant.
- Mon objectif initial était que mon Arduino soit un serveur web. Toutes les solutions que j'ai trouvé pour parser une requête HTTP relevaient de la bidouille. Autant je pense qu'il y a beaucoup d'électroniciens qui jouent avec des arduino, autant, j'ai l'impression que le niveau informatique est faible dans la communauté (c'est une première impression, je suis en plus très très rouillé en C++, ça n'aide pas à retrouver les infos qu'on recherche).
Je pense continuer à creuser un peu et faire un micro serveur web très basique (réponse à des requêtes GET simples). Pour cela, il faut mettre en place un système d'event loop basique. Le shield wifi contient un lecteur de carte SD qui permettrait notamment d'enregistrer un code html / js à servir à un navigateur.
Commentaires
Note : on ne peut plus ajouter de commentaire sur ce site