CoursObjets
Présentation de la semaine
vidéo d'intro
(généralités objets connectés, protocoles, différents shields..)
Les objets connectés sont de plus en plus présents dans notre quotidien, dans de très nombreux domaines (Surveillance, Santé, Domotique...). Vous en avez probablement tous un dans la poche, et oui votre téléphone est un objet connecté qui vous permet à la fois de téléphoner, d'être appelé et de surfer sur internet. Vous connaissez probablement les googles glasses - ces lunettes connectées qui vous permettent d'obtenir des informations sur ce que vous voyez via une connection internet intégrée - ou les google cars ces voitures sans pilotes connectées à des systèmes de cartographie et au réseau satellitaire. Vous avez aussi sûrement entendu parler des montres connectées qui permettent au jogger d'enregistrer ses performances et autre frigidaires connectés. Les exemples sont multiples. Les années à venir annoncent l'augmentation exponentielle des objets connectés dans notre quotidien, on parle de l'internet des objets.
En fabrication numérique, l'intérêt de pouvoir connecter des objets apparaît rapidement. Dans les fablabs on utilise fréquemment 3 appareils pour fabriquer rapidement des objets connectés: la raspberry pi, un mini ordinateur, le beagle bone à la fois ordinateur et micro controleur et bien entendu le célèbre arduino qui vous est de plus en plus familier à mesure de l'avancée de ce MooC
Vous avez jusqu'à présent réussi à fabriquer un objet capable, de manière autonome, de collecter des informations à partir de capteur, d'allumer des leds ou de faire tourner un petit moteur. Nous allons voir à présent comment transformer cet objet en un objet connecté.
L'objet de ce module est donc de vous présenter les possibilités pour faire communiquer un objet.
Imaginez vous transporté au coeur de Tokyo,incapable de comprendre ou de lire le japonais, vous aurez probablement recours à l'anglais voir à un language corporel plus ou moins improvisé pour vous faire comprendre. Sans le savoir vous tenterez alors de construire un protocole de communication.
En effet pour échanger des informations, il faut utiliser un langage commun, c'est ce qu'on appelle un protocole.
Dans la vraie vie, nous disposons de langues parlées, de languages des signes. Dans le monde numérique il existe de nombreux protocoles normalisés, ouverts ou propriétaires.
Lorsque l'on maîtrise les deux extrémités, on peut envisager d’utiliser son propre protocole. Mais c'est assez rarement le cas, c'est pourquoi des organismes internationaux ont pour mission de formaliser les échanges de communication.
Sans rentrer trop dans les détails, un MooC réseau est disponible à ce sujet, comme le rappelle wikipédia, les organismes internationaux de normalisaiton (ISO) ont défini un modèle appelé modèle OSI (de l'anglais Open Systems Interconnection). Il s'agit d'un standard de communication, en réseau, de tous les systèmes informatiques. C'est un modèle de communications entre ordinateurs qui décrit les fonctionnalités nécessaires à la communication et l'organisation de ces fonctions. Le modèle OSI (Open System Interconnection) propose un découpage en 7 niveaux de la communications entre 2 entités, de la couche physique (le circuit imprimé, par analogie l'air pour le language parlé car dans l'espace on n’entendrait rien) à la couche applicative (toujours par analogie la grammaire et le vocabulaire d'une langue).
Les nombreux protocoles de la couche 1 (physique), peuvent être séparés en 2 grandes familles : filaires et sans-fil. Les protocoles sans fil sont nombreux, ça va du GSM (votre bon vieux téléphone d'il y a 10 ans, au wifi (votre boxe) en passant par le NFC (paiement sans contact sur certaines cartes bancaires) mais on peut aussi citer le zigbee, le bluetooth, la 4G et bien d'autres. Vous connaissez aussi probablement le protocole HTTP (Hypertext Protocol) qui sert sur Internet. On reviendra plus en détail sur ce protocole car il est au coeur des objets connectés.
Outre des aspects de portée, débit et consommation, le choix de cette couche sera souvent contraint par la nature de l'objet. Reprenons notre analogie, si vous êtes dans une petite pièce, une conversation normale entre 2 personnes parlant la même langue sera parfaite. Plaçons un mur entre les personnes il faudra soit crier plus fort, soit percer un trou, soit passer par des messages écrits. Les objets connectés ne sont pas différents, selon le type d'informations qu'on souhaite faire passer et l'environnement on utilisera tel ou tel protocole. Vous n'imaginez pas devoir connecter tous vos ordinateurs, tablettes et smartphones à votre boxe, le protocole Wifi est fait pour ça. Ce protocole est parfait mais ceux qui ont des grandes maisons avec des murs épais savent que le Wifi a ses limites et qu'il est parfois nécessaire de passer par des courants porteurs de ligne CPL (on revient alors en filaire). Le Wifi est aussi très consommateurs (ne devez vous pas recharger très régulièrement votre téléphone?) aussi il est inadapté pour des petits objets devant fonctionner sur pile pendant des dizaines d'années. Comme souvent tout est histoire de compromis.
Dans nos exemples, nous utiliserons bien sûr l'Arduino. Dans sa version de base ses possibilités de communication sont assez réduites. Heureusement l'ajout de cartes supplémentaires appelées shields permet d'avoir de nombreuses possibilités de connexion.
Nos vidéos de présentation vous montrerons 2 types de connections possibles, et vous mettrez en oeuvre des exemples en TP.
texte de la vidéo 2
Vidéo illustration:WhereIsBeach un object connecté via un shield Ethernet
Salut à tous,
Cette semaine nous allons vous présenter 2 projets réalisés au sein du FabLab de Lannion.
Ce sont bien sur des objets connectés. Chacun a ses spécificités. D’abord “Where is the beach” qui est un object connecté via un shield Ethernet.
Ce projet vise à rendre tangible un ensemble de données (météo, géo, web,..) pour rendre le choix d’une plage le plus pertinent possible.
Supposons que l’été arrive (c’est audacieux comme postulat de départ – on vous l’accorde -), vous avez fait le choix insensé et courageux de découvrir le Trégor, vous souhaitez soit aller faire une bronzette iodée, soit défier les locaux sur votre planche à voile flambant neuve, ou alors tenter une action de sociabilisation avec d’irréductibles gaulois.
Or vous ne connaissez pas trop la région, ¿WhereIsTheBeach? est fait pour vous.
L’objet consiste en une carte munie d’un potentiomètre (sélecteur du critère) de leds pour la représentation des plages (on a prévu une led rouge au cas où la seule option soit de rester à la maison..) et un petit servomoteur pour gérer la girouette.
Comme la cote de Granit Rose propose un grand nombre de plage sur environ 180° à partir de Lannion, la girouette est au centre de cette ville.
Après le choix de l'activité planche à voile via le sélecteur, le petit drapeau nous désigne la plage la plus adaptée à ce moment.
Si on recherche plutôt une plage populaire sur le web, il suffit de tourner le sélecteur.
Le drapeau nous désigne une autre plage et la diode correspondante s'allume.
Et si l’on veut bronzer la plage de XX est désignée
Comment ça marche ?
A la position du potentiomètre de sélection correspond une tension qui est présente sur une entrée de l'Arduino qui connaît donc l'activité demandée.
Une requête HTTP est construite afin d'interroger le service Web dédié. Cette requête est émise via un shield Ethernet.
En effet, comme cet objet est destiné à être à l’intérieur (Office du Tourisme par ex), on suppose que l’on a accès à l’énergie et a internet par câble.
La réponse est traité par l'Arduino, le drapeau est tourné et la diode est allumée.
Quel est le code utilisé pour cet objet ?
Comme nous l’avons vu lors de la video précédente, il faut monter le lien IP en utilisant Ethernet.begin(mac);
Pour les diodes et le servo-moteur, on les commande classiquement, comme vous l’avez vu dans les modules précédents.
Vous voyez maintenant la fonction développée pour requêter notre serveur Web.
La chaine de caractères MyReq contient la requête HTTP a émettre.
La fonction readPage permet elle de lire la réponse.
La lecture se fait de façon séquentielle entre 2 caractère définis, ici < et >.
On remplit donc notre chaîne avec les caractères reçus, avant de l'analyser pour positionner la girouette et allumer la LED.
La plage idéale est maintenant trouvée!
Morgan va vous présenter à présent un second objet, différemment connecté.
Vidéo illustration Bzzz: un objet connecté en GSM
On va vous présenter à présent un second objet connecté. Cet objet a été créé dans le cadre du projet Bzzz , un projet qui vise à surveiller en temps réel des ruches. Du coup il fallait concevoir un objet capable de collecter des informations (la masse, la température, la luminosité et l’état de la batterie) et de les transmettre.
Mais, contrairement à l’objet précédent, il fallait concevoir un objet autonome électriquement parlant - on a utilisé un panneau solaire et une batterie - et capable de communiquer via un réseau mobile., l’objet est au milieu des champs, il n’est pas question de tirer un fil. En fait on transforme notre bon vieux arduino en un téléphone mobile un peu particulier... Les valeurs des différents capteurs sont transmises par l’arduino au shield GSM qui envoie un SMS. Ce SMS est récupéré sur un serveur et les données sont mises en base données. Un traitement informatique détecte si les valeurs sont anormales. Dans ce cas le système avertit l’apiculteur par SMS, mail ou en déclenchant un appel téléphonique. Mais concentrons nous sur l’arduino, si vous voulez plus d’information sur le reste de la chaîne, vous pouvez toujours contacter le fablab de Lannion ou poser des questions sur le forum du MooC.
Le shield GSM ressemble au shield Ethernet que vous connaissez, sauf qu’il doit être équipé d’une carte SIM pour la connexion au réseau mobile, et qu’il n’a bien sur pas de prise RJ45
Il existe plusieurs modèles de shields GSM.
Pour utiliser le shield GSM qu’on a choisi, il faut la librairie SoftwareSerial, utilisée pour la communication entre Arduino et le shield GSM.
On déclare le shield GSM sur les pin 7 et 8 (Rx/Tx)
Puis dans le Setup, on ouvre le port série vers le shield GSM
Les échanges se font en commandes AT via le port série.
Au lieu d’écrire dans la console, vous pourrez écrire des messages que le shield transmettra par SMS.
le shield est compliant avec le Standard - GSM 07.07 & 07.05 et les commandes SIMCOM AT
Je ne vais pas détailler les commandes AT, c’est assez barbare mais vous trouverez plein de littérature sur le sujet sur internet.
Le shield GSM est assez onéreux, comptez plus de 50€ + la carte SIM. Il est aussi assez consommateur en énergie. Des librairies simplifient grandement son utilisation. Pas besoin d’être un spécialiste des Télécoms pour pouvoir s’en servir.
Reste à trouver les services qui vont avec...
TP 1: domotique
<Tangi + Théo>
L'objet de ce TP est à partir d'un montage précédent, être capable d'allumer ou d'éteindre les leds. Pour simplifier on imagine que ce TP puisse être fait chez vous. Vous devrez connecter votre arduino en filaire sur votre boxe via le shield Ethernet. Depuis un browser sur votre PC vous enverrez une requête http de la forme http://192.168.1.x?led=on ou http://192.168.1.x?led=off
pré-requis: repartir du TP de base avec les 3 leds, ajouter le shield Ethenet, intégrer la librairie http://arduino.cc/en/reference/ethernet
Ce TP sea l'occasion d'évoquer les concepts
- adresse IP, MAC
- protocole DHCP
- protocole HTTP
Video illustration
- comment mettre le shield
- installation PC + (arduino+shield) + box
TP 2: web service
< Vincent + Morgan >
Le but de ce TP est de provoquer une action (visualisaiton de la température via l'allumage de 0,1,2 ou trois led) suite à l'envoi d'une requête web à un site internet.
prérequis: on repart du TP de base, on rajoute le shield ethernet. On connecte l'arduino en filaire à sa boxe. on se basera sur web service http://api.openweathermap.org/data/2.5/weather?q=Lannion,fr depuis votre PC, vous indiquez à l'arduino le nom de la ville l'arduino va chercher l'information sur internet et visualise le résultat via les leds
température -20 et 0 => aucune led 0 et 10 => led verte 10 et 20 => led verte + orange > 20 => led verte + orange + rouge
notions à aborder
- architecture internet
- DNS
- web services
Première version du TP : en utilisant la version XML (déjà segmenté; permet d'utiliser la méthode "endsWith" de String), sans allumer de leds, sans préciser le nom de la ville. Pourrait servir de TP de démonstration? (plus parlant que l'interrogation google, verbeuse, des exemples arduino et aussi permettant d'aborder le parsing):
#include <SPI.h> #include <Ethernet.h> // Enter a MAC address for your controller below. // Newer Ethernet shields have a MAC address printed on a sticker on the shield byte clientMAC[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress clientIP(192,168,1,20); IPAddress serverIP(146,185,182,33); // api.openweathermap.org char serverName[] ="api.openweathermap.org"; // Initialize the Ethernet client library // with the IP address and port of the server // that you want to connect to (port 80 is default for HTTP): EthernetClient client; const int requestInterval = 60000; // delay between requests boolean requested; // whether you've made a request since connecting long lastAttemptTime = 0; // last time you connected to the server, in milliseconds String currentLine = ""; // string to hold the text from server String temperature = ""; // string to hold the temperature boolean readingTemperatureElement = false; // if you're currently reading the temperature Element boolean readingTemperatureAttribute = false; // if you're currently reading the temperature Attribute void setup() { // reserve space for the strings: currentLine.reserve(256); temperature.reserve(150); // initialize serial: Serial.begin(9600); // attempt a DHCP connection: if (!Ethernet.begin(clientMAC)) { // if DHCP fails, start with a hard-coded address: Ethernet.begin(clientMAC, clientIP); } // connect to openweathermap: connectToServer(); } void loop() { if (client.connected()) { if (client.available()) { // read incoming bytes: char inChar = client.read(); // add incoming byte to end of line: currentLine += inChar; // if you get a newline, clear the line: if (inChar == '\n') { //Serial.println(currentLine); currentLine = ""; } if ( currentLine.endsWith("</city>")) { // temperature element is beginning. Clear the temperature string: readingTemperatureElement = true; temperature = ""; Serial.println("Temperature Element is coming!"); } if (readingTemperatureElement) { if (readingTemperatureAttribute){ if (inChar != '"') { temperature += inChar; } else{ Serial.println(temperature); client.stop(); } } else{ if (inChar == '"') { readingTemperatureAttribute=true; Serial.println("Temperature Attribute is coming!"); } } } } } else if (millis() - lastAttemptTime > requestInterval) { // if you're not connected, and two minutes have passed since // your last connection, then attempt to connect again: connectToServer(); } } void connectToServer() { // attempt to connect, and wait a millisecond: Serial.println("connecting to server..."); if (client.connect(serverName, 80)) { Serial.println("making HTTP request..."); // make HTTP GET request to twitter: client.println("GET /data/2.5/weather?q=Lannion&units=metric&lang=fr&mode=xml HTTP/1.1"); client.println("HOST: api.openweathermap.com"); client.println(); } else { Serial.println("Carambar encore rated!"); } // note the time of this connect attempt: lastAttemptTime = millis(); }
Quizz
Généralités
1. Indiquez les protocoles de communication (plusieurs choix possibles)
a) Zigbee b) RJ45 c) HTTP d) GSM
2. Les objets connectés utilisent souvent le réseau GSM. Qu'est il nécessaire d'ajouter ua arduino pour pouvoir mettre en place une communication de ce type
a) un shield ethernet b) un shield GSM c) un shield GSM + carte SIM d) un shield ethernet + shield GSM + carte SIM
3. Lors de la création de votre objet, quels paramètres doivent être pris en compte pour choisir le protocole le plus adapté (plusieurs choix possible)
a) l'autonomie (consommation électrique) b) la portée c) le débit d) le nombre de capteurs
IP, url, HTTP, @, shield ethernet
1. Quelle ligne est correcte
a) IPAddress ip(192,168,3,177); b) IPAddress ip(192,168,3,1689); c) IPAddress ip(0x90, 0xA2, 0xDA, 0x00, 0xF8, 0xCD ); d) IPAddress ip(google.com)
2. Quel élément du réseau peut attribuer une adresse IP?
a) serveur HTTP b) serveur DNS c) serveur DHCP d) serveur Radius
3. Lors de l'initialisation du shield Ethernet, quelle ligne est incorrecte
a) Ethernet.begin(); b) Ethernet.begin(mac); c) Ethernet.begin(mac, ip); d) Ethernet.begin(mac, ip, dns);
4. Parmi les noms suivants quels sont noms se rapportant au protocole HTTP
a) SET, UNSET, CONNECT b) REGISTER, INVITE, SUBSCRIBE, NOTIFY c) Setup, loop d) PUT, GET, POST, DELETE