CoursObjets
Présentation de la semaine
vidéo d'intro
Salut à tous, Je suis ravi de vous retrouver pour une nouvelle vidéo où l’on va parler des objets connectés. Ils sont de plus en plus présents dans notre quotidien, dans de très nombreux domaines (Surveillance, Santé, Domotique...). Vous en avez certainement 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 connexion 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. Les exemples sont multiples. Les années à venir annoncent l'augmentation exponentielle des objets connectés dans notre quotidien, on parle désormais 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.
Comme vous l’avez vu lors de la video précédente, un protocole est utilisé pour échanger des informations.
Dans la vraie vie, nous disposons de langues parlées, de langage des signes. Dans le monde numérique il existe de nombreux protocoles normalisés, ouverts ou propriétaires.
De tels protocoles sont nécessaire lorsque l'on ne maîtrise pas les deux extrémités qui doivent communiquer entre elles.
Il peut toute fois être intéressant de développer son propre protocole, surtout pour la couche applicative, qui peut de fait être, plus léger, plus souple ou mieux adapté.
Il existe deux moyens de connecter un objet, avec ou sans fil. Vous connaissez déjà la connexion filaire car vous avez déjà relié votre Arduino au PC via un cable USB. Ethernet, CPL et la connexion série sont d’autres exemple de connexion filaire.
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 box) en passant par le NFC (Near field communication, ou en français : paiement sans contact sur certaines cartes bancaires) mais on peut aussi citer le zigbee, le bluetooth, la 4G et bien d'autres.
Quelle technologie utiliser pour votre objet?
Revenons à nos objets connectés du quotidien : vos ordinateurs, tablettes et smart-phones. Il est plus pratique d’utiliser le wifi pour les Connecter à votre boxe, 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 revenir alors en filaire. Le Wifi est aussi très consommateur (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. Tout va donc dépendre de l’objet, de son environnement et son utilisation. 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 connexions. En ce qui concerne le protocole applicatif, nous verrons celui que vous utilisez le plus souvent sur internet : HTTP. Hyper Text Transfer Protocol Dans la prochaine vidéo nous vous montrerons 2 projets utilisant 2 technologies différentes. Mais pour le moment, je vous propose de voir comment configurer le shield ethernet de l’arduino, ce qui vous permetra de concevoir facilement vos premier objets connectés.
Que ce soit pour vos premières réalisations ou pour les TP, vous aurez besoin de l’environnement suivant :
- Un Arduino - Un shield ethernet qui vient se plugger sur l’arduino - Un port RJ45 libre sur votre boxe et Un cable ethernet pour relier tout ça Nous allons à présent nous interressez de plus prés au code. Pour utiliser ce shield, 2 librairies sont nécessaires :SPI.h pour la communication entre le shield et l’arduino. et ethernet.h. qui permet d'implémenter les notions vues dans la vidéo précédente
- les adresses de l’objet (mac et ip) - le rôle de l’objet : client ou serveur - les mécanismes permettant l’échange des messages http
nous allons à présent détailler ces points.
L'adresse mac est définie dans un tableau. Si sa valeur n’est pas indiquée sur le shield, prenez celle que vous voulez.
Pour l’adresse IP, un type de variable est fournit dans la librairie ethernet.h. Cette variable est intialisée avec les 4 nombres représentant l’adresse.
La fonction Ethernet.begin() permet ensuite d’initialiser le shield.
Les arguments passés à cette fonction déterminent son comportement. Par exemple, en utilisant uniquement la mac adresse, l’adresse ip sera récupéré par DHCP.
Si les adresses mac et ip sont renseignés, c’est cette dernière qui sera utilisée. D’autre comportements existent à vous de les découvrir!
Voila notre arduino est à présent connecté !
Il peut discuter avec le monde entier(ou presque).
Nous allons voir a présent, comment définir le role qu’il aura dans cette communication :
il peut être client et donc vouloir établir une connexion TCP avec le serveur. La classe à utiliser sera alors ethernetClient et la commande à lancer client.connect.On passe à cette fonction les arguments nom ou adresse du serveur et le port sur lequel l’attaquer.
S’il est serveur, il doit écouter sur un port et attendre une connexion TCP. ce qui est fait grâce à la class EthernetServer qui prend comme paramètre le port d'écoute puis via la fonction server.begin();Il est ausii nécessaire de définir un objet client qui permettra de récupérer les informations sur le client se connectant. La fonction server.available() detecte lorsqu’un client se connecte. La fonction client.connected(); sert ensuite à vérifier si la connexion est toujours active.
A ce stade les connections TCP sont donc crées, il faut à présent échanger les messages HTTP.
Que l’arduino soit serveur ou client, les même fonctions seront utilisées:
Il est possible de vérifier si le client a envoyé un message ou si le serveur à reçu un message via la commande client.available(); puis de récupérer le message caractère par caractère grâce à la fonction client.read(). (il faudra donc penser à le concaténer dans une chaîne de caractères si on veut travailler sur ce message.).
Pour écrire un message, on utilise la fonction client.println(‘string”); si l’arduino est serveur, cela revient à envoyer un message au client, si il est client, à envoyer un message au serveur.
Une fois la communication finie, pour terminer proprement la connexion, faire un client.stop(); Vous êtes à présent capable de faire communiquer des objets connectés grâce au protocole IP/HTTP. et pourquoi pas commander à distance de l’allumage d’une led : c’est d’ailleurs ce que vous aurez à réaliser dans le TP1
c’est d’ailleurs ce que vous aurez à réaliser dans le TP1
Vidéo 2 : Présentation de deux objets connectés
WhereIsBeach, un objet 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é.
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 à l'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 possibles)
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