« CoursObjets » : différence entre les versions

De Kernel Fablab Lannion
Ligne 49 : Ligne 49 :


TODO Vincent
TODO Vincent


==== Vidéo illustration:WhereIsBeach un object connecté via un shield Ethernet ====
==== Vidéo illustration:WhereIsBeach un object connecté via un shield Ethernet ====

Version du 2 mai 2014 à 17:59

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.

support de cours

Généralités (liées à la vidéo)

script de la vidéo

HTTP, URL, adresse IP

TODO Vincent


Vidéo illustration:WhereIsBeach un object connecté via un shield Ethernet

¿WhereIsTheBeach? est un projet qui 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/ou courageux de découvrir le Trégor, vous souhaitez soit aller faire bronzette iodée, soit défier les locaux sur votre planche à voile flambant neuve, soit 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. En revanche si l'on veut bronzer, la diode rouge s'allume. Les conditions météo rendent cette activité impossible.

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. Un requête HTTP est construite afin d'interroger le service Web dédié. Cette requête est émise via un shield Ethernet connecté au WEB. La réponse est traité par l'Arduino, le drapeau est tourné et la diode est allumé.

GSM, SIM

Vidéo illustration Bzzz: un objet connecté en GSM

(GSM + création d'un protocole ad-hoc au dessus de GSM, autonomie)

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