Plan (hide)

  1.   1.  Arduino Yún
  2.   2.  Anatomie
    1.   2.1  Livre de reset
  3.   3.  Yún et le wifi
    1.   3.1  zeroconf
  4.   4.  Carte SD et MAJ
    1.   4.1  Carte SD
    2.   4.2  Mise à jour
  5.   5.  Première connexion ssh
  6.   6.  Programmation
    1.   6.1  L'aide d'une LED
    2.   6.2  Commande d'une led RGB au travers du web
  7.   7.  Sources

1.  Arduino Yún

Un des reproches que l'on peut faire aux Arduinos de base est le manque de connectivité et pour avoir essayé le shield wifi en plus d'être encombrant c'est un peu galère surtout si vous rêvez d'un internet des objets facile à configurer et utiliser. De plus il faut souvent lutter contre la place consommée. L'Arduino Yún apporte une solution intéressante. Il s'agit d'un Arduino avec WiFi intégré et un second microprocesseur qui permet d'avoir une version légère de Linux ainsi que le langage Python préinstallé.

Nous allons commander par wifi des LEDs. Cela constitue une base qu'il est ensuite possible de réutiliser pour réaliser des choses plus sophistiquées. Dans un premier temps nous allons passer en revue les différentes étapes de mise à jour et de configuration.

J'utilise linux sous une distribution archlinux.

2.  Anatomie


Les resets du Yún

Les éléments importants sont :

  • Le processeur ATmega 32U4 il pilote les broches comme d'habitude.
  • Le processeur Atheros AR9331 qui pemet d'avoir du Wifi et un linux embarqué. La distribution est OpenWRT.
  • Trois ports : l'USB standard, un micro USB et ethernet.
  • Trois boutons resets.
  • Un emplacement pour une carte micro SD.

IL n'y a pas de régulateur 5V intégré. Donc attention à bien l'alimenter avec une tension correcte, si vous le faite autrement que par le câble USB connecté à votre ordinateur.

2.1  Livre de reset

  • Le reset Linux redémarre l'AR9331.
  • Pour redémarrer le 32U4 et relancer le dernier programme téléversé dans l'Arduino, pressez deux fois le reset de l'Arduino.
  • Lorsque vous pressez le reset Wifi, la led WLAN se met à clignoter. Si vous changez de réseau et ne pouvez plus vous connecter par wifi au Yún en passant par l'interface web. Réinitialisez la configuration réseau du Yún en appuyant sur le reset du WiFi plus de 5 secondes et moins de 30. L'AR9331 redémarrera et la configuration WiFi sera réinitialisée. Le Yún crée alors son propre réseau WiFi Arduino Yun-XXXXXXXXXXXX.
  • Si vous voulez revenir à la configuration d'usine, appuyez sur le bouton reset du Wifi pendant au moins 30 secondes. Bien sur si vous avez fait une mise à jour de linux, vous la conserverez.

3.  Yún et le wifi

Le Yún se comporte comme un point d'accès wifi. Il est donc assez facile de se connecter à ce dernier et de le configurer de façon à ce qu'il se connecte ensuite au réseau wifi de chez vous, par exemple.


Connection au Yún.

Une fois connecté vous pouvez utilisez votre navigateur pour interroger votre Yún. Normalement l'url est la suivante arduino.local. Si vous n'y arrivez pas route peut vous aider :

 % route
 Kernel IP routing table
 Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
 default         Duinuy.lan      0.0.0.0         UG    600    0        0 wlo1
 192.168.240.0   *               255.255.255.0   U     600    0        0 wlo1

C'est donc Duinuy.lan mais surtout on a l'adresse en dur 192.168.240.1. Il suffit donc de l'utiliser. Vous devrez voir normalement la page suivante :


Login au Yún.

Le mot de passe par défaut est arduino. Connectez vous. Vous arriverez alors sur une page d'information.


Page d'information du Yún.

Cliquez ensuite sur configure et rentrez les informations concernant votre réseau.


Configuration du wifi du Yún.

Cliquez ensuite sur configure and restart.


Sauvegarde et redémarrage.

Votre Yún en principe redémarre et se connecte au wifi comme un grand. Cependant j'ai rencontré quelques problèmes, une solution est donc de débrancher et rebrancher votre Yún. En principe vous devez trouver votre protégé à l'adresse <le_nom_que_vous_lui_avez donne>.local. Ma bestiole refuse ! Si vous aussi, nmap peut vous rendre service.

 % sudo nmap -T4 -sP 192.168.0.0/24

  Starting Nmap 7.01 ( https://nmap.org ) at 2015-12-27 11:31 CET
  Nmap scan report for 192.168.0.21
  Host is up (0.0037s latency).
  MAC Address: 00:00:00:00:D0:66 (Synology Incorporated)
  Nmap scan report for 192.168.0.23
  Host is up (0.079s latency).
  MAC Address: 00:00:00:00:D0:66 (Nintendo)
  Nmap scan report for 192.168.0.24
  Host is up (0.079s latency).
  MAC Address: 00:00:00:00:D0:66 (Hon Hai Precision Ind.)
  Nmap scan report for 192.168.0.27
  Host is up (0.12s latency).
  MAC Address: 90:A2:DA:F2:0A:6B (Gheo SA)
  Nmap scan report for 192.168.0.254
  Host is up (0.0028s latency).
  MAC Address: 00:00:00:00:D0:66 (Freebox SAS)
  Nmap scan report for 192.168.0.16
  Host is up.
  Nmap done: 256 IP addresses (6 hosts up) scanned in 3.14 seconds

À l'aide de nmap on a scanné toutes les adresses comprises entre 192.168.0.0 et 192.168.0.255. Il faut bien sur remplacer cela par votre adresse de base. Ici mon Yún est à l'adresse 192.168.0.27 (Gheo SA). Une fois l'adresse connue on peut vérifier les ports ouverts.

 % sudo nmap -F 192.168.0.27
 Starting Nmap 7.01 ( https://nmap.org ) at 2015-12-27 11:38 CET
 Nmap scan report for 192.168.0.27
 Host is up (0.0029s latency).
 Not shown: 97 closed ports
 PORT    STATE SERVICE
 22/tcp  open  ssh
 80/tcp  open  http
 443/tcp open  https
 MAC Address: 90:A2:DA:F2:0A:6B (Gheo SA)

En utilisant mon navigateur j'obtiens à l'adresse 192.168.0.25 la page suivante :

3.1  zeroconf

L'utilisation de zeroconf vous permettra de résoudre peut-être vos éventuels problèmes de résolution de nom. Sous archlinux il faut installer avahi et nss-mdns si ce n'est déjà fait.

 % yaourt -S avahi nss-mdns

Lancer le serviémarrage

 % sudo systemctl enable avahi-daemon.service

et modifier le fichier /etc/nsswitch.conf en changeant la ligne hosts en :

 hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4 leNomDeVotreMachine

4.  Carte SD et MAJ

La mémoire Flash interne du Yún à un nombre limité d'écritures possibles. Il est préférable d'utiliser une carte microSD (ou une clé USB) comme mémoire externe pour sauvegarder données, pages web, etc. Nous allons de plus l'utiliser pour une mise à jour d'OpenWRT. Les opérations que je décris ici, se font sous linux. J'utilise une distribution archlinux.

4.1  Carte SD

On va tout d'abord formater la carte SD. La première chose est d'identifier le device. Vous pouvez utiliser lsblk ou encore dmesg.

 % dmesg | tail[281710.917862] 
 [281710.917862] mmc0: card aaaa removed
 [281713.208108] mmc0: cannot verify signal voltage switch
 [281713.311768] mmc0: new ultra high speed SDR104 SDHC card at address aaaa
 [281713.311867] mmcblk0: mmc0:aaaa SE16G 14.8 GiB 
 [281713.320446]  mmcblk0: p1 p2  

Le device correspondant est donc mmcblk0 que l'on va pouvoir formater, mais avant on vérifie les partitions déjà présentes.

 % sudo fdisk /dev/mmcblk0

 Bienvenue dans fdisk (util-linux 2.27.1).
 Les modifications resteront en mémoire jusqu'à écriture.
 Soyez prudent avant d'utiliser la commande d'écriture.


 Commande (m pour l'aide) : p
 Disque /dev/mmcblk0 : 14,9 GiB, 15931539456 octets, 31116288 secteurs
 Unités : secteur de 1 × 512 = 512 octets
 Taille de secteur (logique / physique) : 512 octets / 512 octets
 taille d'E/S (minimale / optimale) : 512 octets / 512 octets
 Type d'étiquette de disque : dos
 Identifiant de disque : 0x00000000

 Périphérique   Amorçage Début      Fin Secteurs Taille Id Type
 /dev/mmcblk0p1              16   250047   250032 122,1M  b W95 FAT32
 /dev/mmcblk0p2          250048 15564799 15314752   7,3G 83 Linux

Il y a deux partitions sur ma carte. Je vais donc les supprimer pour en recréer une seule.

 Commande (m pour l'aide) : d
 Numéro de partition (1,2, 2 par défaut) : 

 La partition 2 a été supprimée.

 Commande (m pour l'aide) : d
 Partition 1 sélectionnée
 La partition 1 a été supprimée.

On crée une partition primaire

 Commande (m pour l'aide) : n
 Type de partition
    p   primaire (0 primaire, 0 étendue, 4 libre)
    e   étendue (conteneur pour partitions logiques)
 Sélectionnez (p par défaut) : p
 Numéro de partition (1-4, 1 par défaut) : 
 Premier secteur (2048-31116287, 2048 par défaut) : 
 Dernier secteur, +secteurs ou +taille{K,M,G,T,P} (2048-31116287, 31116287 par défaut) : 

 Une nouvelle partition 1 de type « Linux » et de taille 14,9 GiB a été créée. On termine en modifiant le type de partition (fat32). 

 Commande (m pour l'aide) : t

 Partition 1 sélectionnée
 Type de partition (taper L pour afficher tous les types) : c
 Type de partition « Linux » modifié en «  W95 FAT32 (LBA) ».

 Commande (m pour l'aide) : w
 La table de partitions a été altérée.
 Appel d'ioctl() pour relire la table de partitions.
 Synchronisation des disques.

On formate ensuite :

 % sudo mkfs.vfat /dev/mmcblk0p1

4.2  Mise à jour

La première chose à faire est de récupérer la dernière version OpenWRT pour votre arduino et désarchiver.

 % unzip  YunSysupgradeImage_v1.5.3.zip
 Archive:  YunSysupgradeImage_v1.5.3.zip
   inflating: openwrt-ar71xx-generic-yun-16M-squashfs-sysupgrade.bin 

Il faut copier openwrt-ar71xx-generic-yun-16M-squashfs-sysupgrade.bin à la racine de la carte SD. La commande mount ou votre navigateur de fichier vous permettent de connaitre le chemin.

 % mount

 /dev/mmcblk0p1 on /run/media/damien/9502-4341 type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=100,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)

On copie

 % cp openwrt-ar71xx-generic-yun-16M-squashfs-sysupgrade.bin /run/media/damien/9502-4341/
 % sync
 % sudo umount /run/media/damien/9502-4341/

Il reste à éjecter la carte SD et la mettre dans l'emplacement prévu du Yún.

Cliquez sur Reset et attendez !

Vous pourrez utiliser votre carte SD ensuite pour stocker vos fichiers.

5.  Première connexion ssh

 % ssh root@192.168.0.27
 The authenticity of host '192.168.0.27 (192.168.0.27)' can't be established.
 RSA key fingerprint is SHA256:XABfo7n6k8pTRyb4EoE6p9TgQOmWPBk0NKvuARfp/wM.
 Are you sure you want to continue connecting (yes/no)? yes
 Warning: Permanently added '192.168.0.27' (RSA) to the list of known hosts.
 root@192.168.0.27's password: 


 BusyBox v1.19.4 (2014-11-13 19:03:47 CET) built-in shell (ash)
 Enter 'help' for a list of built-in commands.

   _______                     ________        __
  |       |.-----.-----.-----.|  |  |  |.----.|  |_
  |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
  |_______||   __|_____|__|__||________||__|  |____|
           |__| W I R E L E S S   F R E E D O M
  -----------------------------------------------------

Il faut ensuite mettre à jour les différents packages :

 root@Duinuy:~# opkg update
 Downloading http://downloads.arduino.cc/openwrtyun/1/packages/Packages.gz.
 Updated list of available packages in /var/opkg-lists/attitude_adjustment.
 Downloading http://downloads.arduino.cc/openwrtyun/1/packages/Packages.sig.
 Signature check passed.

Si vous avez une carte SD que vous avez formatté en suivant les indications précédentes vous pouvez déterminer son point de montage :

 root@Duinuy:~# mount
 rootfs on / type rootfs (rw)
 /dev/root on /rom type squashfs (ro,relatime)
 proc on /proc type proc (rw,noatime)
 sysfs on /sys type sysfs (rw,noatime)
 tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime,size=30560k)
 tmpfs on /dev type tmpfs (rw,noatime,size=512k,mode=755)
 devpts on /dev/pts type devpts (rw,noatime,mode=600)
 /dev/mtdblock3 on /overlay type jffs2 (rw,noatime)
 overlayfs:/overlay on / type overlayfs (rw,relatime,lowerdir=/,upperdir=/overlay)
 debugfs on /sys/kernel/debug type debugfs (rw,relatime)
 /dev/sda1 on /mnt/sda1 type vfat  (rw,sync,relatime,fmask=0022,dmask=0022,codepage=cp437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
 none on /proc/bus/usb type usbfs (rw,relatime)

Elle est donc accessible en /mnt/sda1 et on va supprimer le fichier de maj.

 root@Duinuy:~# rm /mnt/sda1/openwrt-ar71xx-generic-yun-16M-squashfs-sysupgrade.bin

L'étape suivante consiste à créer un répertoire arduino qui pourra être monté automatiquement sous /mnt/sd et utilisable dans vos programmes "sketch arduino" (.ino).

 root@Duinuy:~# mkdir /mnt/sda1/arduino
 root@Duinuy:~# chmod 777 /mnt/sda1/arduino

Il faut également créer un répertoire www qui sera automatiquement lié à /www.

 root@Duinuy:~# mkdir /mnt/sda1/arduino/www

6.  Programmation

Je vous propose de faire comme d'habitude d'allumer et d'éteindre une led ....

6.1  L'aide d'une LED

Cet exemple est tiré du tutorial associé à l'arduino Yún. On se contente d'allumer et d'éteindre la led 13 intégrée par l'intermédiaire de la console accessible par le wifi.

/*
  Exemple adapté de
  http://arduino.cc/en/Tutorial/ConsolePixel
*/


#include <Console.h> // On inclut la librarie Console qui est l'équivalent de Serial mais en Wifi...

const unsigned int broche = 13; // On définit une constance entière pour nommer le pin de la led
char valeur_entree;             // On crée un variable pour stocker les valeurs que l'on enverra via la console

void setup() {
  // Initialisation de la console et attente de l'ouverture du port
  Bridge.begin();            // On démarre Bridge qui permet la communication entre Arduino et Linux
  Console.begin();           // On démarre la console (remplace le moniteur série)
  // Pensez à configure l'IDE arduino en conséquence outil->port->le wifi du Yun
  pinMode(broche, OUTPUT);   // On définit la broche 13 en sortie
  while (!Console);          // On attend que la console se connecte
}


void loop() {
  static boolean unique = true;
  if (unique) {
    Console.println("Tapez A ou E pour (A)llumer ou (E)teindre led 13");
    unique = false;
  }

  valeur_entree = Console.read();      // On lit la console
  if (valeur_entree > 90) valeur_entree -= 32;  // Minuscules -> majuscules
  if (valeur_entree == 'A') {
    digitalWrite(broche, HIGH);        // On allume
  }
  if (valeur_entree == 'E') {
    digitalWrite(broche, LOW);         // On éteint la led
  }
}

6.2  Commande d'une led RGB au travers du web

Pour cela on utilise l'architecture REST (representational state transfer) qui permet de rendre accessible par exemple les broches par l'intermédiaire d'une URI. REST repose sur le protocole HTTP et on accède donc à une ressource grace à son URI unique. On peut réaliser diverses opérations (GET lecture / POST écriture / PUT modification / DELETE suppression).

Les services web sont associés à ce que REST appelle un point terminal. Le Yún en connait deux (remplacer duinuy par le nom de votre Yún) :

  1. http://duinuy.local/arduino
  2. http://duinuy.local/data

Tout ce que vous ajouterez après http://duinuy.local/arduino sera communiqué au serveur web s'exécutant sous linino au sketch tournant sur la partie arduino (32U4). La partie http://duinuy.local/data sert à stocker des données de type Clef/Valeur. Les appels possibles sont :


Le pont entre la partie Linux et Arduino (source : https://www.arduino.cc/en/uploads/Guide/BridgeBlockDiag.png)

L'exemple du tutorial arduino met cela en œuvre (http://arduino.cc/en/Tutorial/Bridge) et d'ailleurs ce que nous proposons dans ce qui suit en est très largement inspiré, puisque ce n'est qu'une version allégée.

Le montage

Il vous faut :

  • Une led RGB avec en commun l'anode ;
  • 3 résistances de 330Ω ;
  • Quelques fils ;

Le code

  1. /*
  2.   D'après Arduino Yun Bridge example
  3.   Version allégée
  4.   http://arduino.cc/en/Tutorial/Bridge
  5.  
  6.   Utilisation des appels REST utilisable à l'aide d'un navigateur.
  7. */
  8.  
  9.  
  10. #ifdef DEBUG
  11. #include <Console.h> // On inclut la librarie Console qui est l'équivalent de Serial mais en Wifi...
  12. #endif
  13. #include <Bridge.h>
  14. #include <YunServer.h>
  15. #include <YunClient.h>
  16.  
  17. const unsigned int lesBroches[] = {9, 10, 11};
  18. YunServer serveur;
  19.  
  20. void setup() {
  21.   Bridge.begin();           // On démarre Bridge entre linino et arduino
  22. #ifdef DEBUG
  23.   Console.begin();
  24.   while (!Console);
  25.   Console.println("Initialization du Yun réalisée");
  26. #endif
  27.   pinMode(13, OUTPUT);      // Broche 13 en sortie
  28.   digitalWrite(13, LOW);    // On etteint la led 13
  29.   digitalWrite(13, HIGH);   // On allume la led 13 quand bridge est lancé
  30.   unsigned int i;
  31.   for (i = 0; i < sizeof(lesBroches) / sizeof(int) ; i++) {
  32.     pinMode(lesBroches[i], OUTPUT);
  33.   }
  34. #ifdef DEBUG
  35.   Console.println("Lancement du serveur");
  36. #endif
  37.   serveur.listenOnLocalhost(); // On n'accepte que les connexions venant du même réseau
  38.   serveur.begin();             // On lance le serveur
  39. #ifdef DEBUG
  40.   Console.println("Serveur lancé");
  41. #endif
  42. }
  43.  
  44. void loop() {
  45.   YunClient client = serveur.accept();      // On accepte les connexions
  46.   if (client) {                             // Si il y a un nouveau client
  47.     gestion_requete(client);                // On traite la requete du client
  48.     client.stop();                          // Sinon on ferme la connexion et on libère des ressources
  49.   }
  50.   delay(50); // On fait cela toutes les 50 millisecondes
  51. }
  52.  
  53. /*
  54.    Gestion des requètes.
  55.    Sous la forme http://<nomDuYun>/arduino/<numeroDeLaLed>/<luminosité>
  56.    Ex : http://duinuy.local/arduino/11/167
  57. */
  58. void gestion_requete(YunClient client)
  59. {
  60.   int broche = client.parseInt(), valeur;
  61.   if (client.read() == '/')
  62.   {
  63.     valeur = client.parseInt();
  64.     digitalWrite(broche, valeur);
  65.  
  66.     // On envoie des indications au client pour dire que tout va bien
  67.     // HTML activé
  68.     client.println("Status: 200");
  69.     client.println("Content-type: text/html; charset=UTF-8");
  70.     client.println();
  71.     client.println("<B><Center>");
  72.     client.print("Broche ");
  73.     client.print(broche);
  74.     client.print(" reglée à ");
  75.     client.println(valeur);
  76.     client.println("</B></Center>");
  77.  
  78.     // On met à jour la valeur entrée dans la mémoire du linino sous la clef D
  79.     // On peut la consulter par  http://<nomDuYun>/data/get/D
  80.     // Ex : http://duinuy.local/data/get
  81.     String clef = "D";
  82.     clef += broche;
  83.     Bridge.put(clef, String(valeur));
  84.   }
  85.   else client.println("ERREUR");
  86. }

Ce code ouvre en mode déverminage une console qui permet de tracer le programme au travers du wifi. Pour cela il faut définir une macro sous la forme d'un #define DEBUG en première ligne. Les lignes 13,14 et 15 déclarent les headers nécessaires, le bridge (Bridge.h) qui permet comme on l'a déjà vu la communication entre la partie arduino et linux, le serveur web (YunServer.h) et le client (YunClient.h).

La fonction setup() définit les broches utilisées et lance le serveur ligne 38.

La fonction loop() consiste à accepter les connexions, les requêtes et lorsqu'il y en a, à les traiter. Le traitement est effectué par la fonction void gestion_requete(YunClient client) qui est définie ligne 58. Une requête doit être sous la forme http://<nomDuYun>/arduino/<numeroDeLaLed>/<luminosité>

  • <nomDuYun> vous remplacez cela par le nom de votre arduino ou son adresse ip.
  • <numeroDeLaLed> correspond à la broche souhaitée.
  • <luminosité> à l'intensité dont la valeur est comprise entre 0 et 255.
Ex : http://duinuy.local/arduino/11/167 led de la broche 11 (B) 167 de luminosité.

Le traitement est simple on récupère la broche ligne 60. parseInt() réalise une analyse lexicale et retourne le premier nombre lu dans la requête, ensuite on vérifie que le caractère non numérique qui suit est un / ligne 61. Il reste à récupérer la valeur et écrire sur la broche correspondante, ligne 64. On renvoie des informations au client sous la forme d'une page html.

Pour http://duinuy.local/arduino/10/255 vous obtiendrez la page web suivante :

<B><Center>
Broche 10 reglée à 255
</B></Center>

La suite du code (81 à 83) met à jour la valeur entrée au niveau du linino sous la clef D. On peut alors la consulter par http://<nomDuYun>/data/get/D<numeroDeLaLed>. Pour notre exemple http://duinuy.local/data/get/D10 on obtient :

 {"value":"255","key":"D10","response":"get"}

Vous pouvez aussi essayer http://duinuy.local/data/get qui vous donnera la totalité des valeurs.

 {"value":{"D9":"255","D11":"255","D10":"255"},"response":"get"}

Cela peut être utile pour lire des capteurs, par exemple.

Une version plus sophistiquée

L'idée est maintenant d'utiliser javascript et en particulier JQuery pour réaliser une interface web plus interactive et convaincante que celle que nous venons de voir. On écrit tout d'abord le code HTML/Javascript qui va résider sur notre Yún.

  1. <html lang="fr">
  2. <head>
  3.     <title>Manip d'une led RGB</title>
  4.    <link href="http://code.jquery.com/ui/1.11.1/themes/smoothness/jquery-ui.css" rel="Stylesheet"
  5.        type="text/css" />
  6.    <script src="http://code.jquery.com/jquery-1.10.2.js"></script>
  7.    <script type="text/javascript" src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
  8.    <style type="text/css">
  9.        #output
  10.        {
  11.            width: 100px;
  12.            height: 100px;
  13.            border: solid 1px #ccc;
  14.        }
  15.        #redslide, #greenslide, #blueslide
  16.        {
  17.            height: 15px;
  18.            margin: 10px 0px;
  19.            width: 350px;
  20.        }
  21.  
  22.        #redslide .ui-slider-range
  23.        {
  24.            background: red;
  25.        }
  26.        #redslide .ui-slider-handle
  27.        {
  28.            border-color: red;
  29.        }
  30.        #greenslide .ui-slider-range
  31.        {
  32.            background: green;
  33.        }
  34.        #greenslide .ui-slider-handle
  35.        {
  36.            border-color: green;
  37.        }
  38.        #blueslide .ui-slider-range
  39.        {
  40.            background: blue;
  41.        }
  42.        #blueslide .ui-slider-handle
  43.        {
  44.            border-color: blue;
  45.        }
  46.    </style>
  47.    <script language="javascript">
  48.        $(document).ready(function () {
  49.            $("#redslide, #greenslide, #blueslide").slider({
  50.                orientation: "horizontal",
  51.                range: "min",
  52.                max: 255,
  53.                value: 127,
  54.                slide: maj,
  55.                change: majLed
  56.            });
  57.            $("#redslide").slider("value", 150);
  58.            $("#greenslide").slider("value", 60);
  59.            $("#blueslide").slider("value", 100);
  60.  
  61.        });
  62.        function maj() {
  63.            var hexa = getHexaFromRGB($("#redslide").slider("value"),
  64.             $("#greenslide").slider("value"),
  65.             $("#blueslide").slider("value"));
  66.             $("#output").css("background-color", "#" + hexa);    
  67.        }
  68.  
  69.        function majLed() {
  70.            maj();
  71.            setRGBled($("#redslide").slider("value"), $("#greenslide").slider("value"),$("#blueslide").slider("value") );
  72.        }
  73.  
  74.         function setRGBled(r, g, b) {
  75.             $.ajax({
  76.                      type: "POST",
  77.                      url:"http://duinuy.local/arduino/changeRGB/" + r + "." + g + "." + b});
  78.         }
  79.  
  80.        function getHexaFromRGB(r, g, b) {
  81.            var hexa = [r.toString(16), g.toString(16), b.toString(16)];
  82.            $.each(hexa, function (nr, val) {
  83.                if (val.length === 1) {
  84.                    hexa[nr] = "0" + val;
  85.                }
  86.            });
  87.            return hexa.join("").toUpperCase();
  88.        }
  89.  
  90.    </script>
  91. </head>
  92. <body>
  93. <h1>Manipulation d'une LED RGB<br></h1>
  94.     <div id="output"></div>
  95.     <div id="redslide"></div>
  96.     <div id="greenslide"></div>
  97.     <div id="blueslide"></div>
  98. </body>
  99. </html>

Je ne vais pas détailler les éléments d'interface et la mise en forme. Par contre il me semble intéressant de noter que tout le travail s'effectue dans

	function setRGBled(r, g, b) {
    	    $.ajax({
      		     type: "POST",
      		     url:"http://duinuy.local/arduino/changeRGB/" + r + "." + g + "." + b});
   	}

La fonction $.ajax() permet d'envoyer une requête HTTP. Le fichier ciblé est fixé par url et le type de requête par type. On utilise dons l'architecture REST et on poste donc quelque chose qui ressemble à http://duinuy.local/arduino/changeRGB/10.56.234 par exemple. Une fois ce programme réalisé, nous allons le stocker sur la carte SD de notre Yun. Pour cela on crée un répertoire /mnt/sda1/arduino/www/changeRGB

 % ssh root@duinuy.local
 root@duinuy.local's password: 


 BusyBox v1.19.4 (2014-11-13 19:03:47 CET) built-in shell (ash)
 Enter 'help' for a list of built-in commands.

   _______                     ________        __
  |       |.-----.-----.-----.|  |  |  |.----.|  |_
  |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
  |_______||   __|_____|__|__||________||__|  |____|
           |__| W I R E L E S S   F R E E D O M
  -----------------------------------------------------


 root@Duinuy:~# mkdir /mnt/sd/arduino/www/changeRGB
 root@Duinuy:~# exit
 Connection to duinuy.local closed.

On copie le fichier html contenant le script

 % scp RGB.html root@duinuy.local:/mnt/sd/arduino/www/changeRGB/index.html
 root@duinuy.local's password: 
 RGB.html                                                                                                            100% 2861     2.8KB/s   00:00

On peut maintenant accéder à l'adresse http://duinuy.local/sd/changeRGB/ à la page correspondante.

Le sketch si j'ai été suffisamment clair précédemment ne pose pas de problème. On utilise la même structure de programme.

  1. #include <Bridge.h>
  2. #include <YunServer.h>
  3. #include <YunClient.h>
  4.  
  5. YunServer serveur;
  6.  
  7. // On fixe les broches de la led RGB suivant le montage
  8. int brocheRouge = 11;
  9. int brocheVerte = 9;
  10. int brocheBleue = 10;
  11.  
  12. void setup() {
  13.   Bridge.begin();
  14.   serveur.listenOnLocalhost();
  15.   serveur.begin();
  16. }
  17.  
  18. void loop() {
  19.   unsigned int r, g, b;
  20.  
  21.   YunClient client = serveur.accept();             // Le serveur accepte les connexions
  22.   if (client) {                                    // S'il y a un client, on traite
  23.     String command = client.readStringUntil('/');
  24.     // La requete est de la forme : changeRGB/<R>.<G>.<B> exemple : changeRGB/10.145.0
  25.     if (command == "changeRGB") {
  26.       r = client.parseInt();
  27.       analogWrite(brocheRouge, r );
  28.       g = client.parseInt();
  29.       analogWrite(brocheVerte, g);
  30.       b = client.parseInt();
  31.       analogWrite(brocheBleue, b);
  32.     }
  33.     // On ferme la connexion
  34.     client.stop();
  35.   }
  36.   delay(25); // Traitement toute les 25ms
  37. }

Vous pouvez donc commander votre led par internet maintenant ! Tout cela pour ça !

7.  Sources

(:googleplusone size=small:)