Doc GOMI

Doc GOMI

Internet of things : Cablage et config Arduino promini/FTDI/Ethernet ENC28J60

Plutôt que de gérer mes documents du moment par des bookmarks, je publie ici des notes sur une réflexion technique en cours concernant "l'internet of things" ou internet des objets.

 

Le monde tel que nous l 'avons connu se métamorphose sous nos yeux, et après la connexion des ordinateurs, puis des mobiles et tablettes vient maintenant le temps de la connexion des objets.

 

Ce qui est ici intéressant est l'utilisation possible de l'open source et de l'open hardware pour que nous apprivoisions ces objets, et qu'ils puissent échanger des données que nous maitrisons.

 

Dans cette optique , j ai commencé un projet d'interface web/arduino, basé sur des composants ultra low cost : arduino, et interface ENC28J60. Je compte vérifier la faisabilité avec les versions miniaturisées pro mini.

 

Ceci permet d'échanger des données avec le web, donc de fabriquer des objets du quotidien qui nous renvoient ces données de façon ergonomique, agréable (plutôt qu 'en consultant une page web).

 

Et inversement, les capteurs peuvent remonter des données vers le web, le cloud, un serveur déporté....

 

Le premier projet est un truc de bord de mer : une horloge a marée qui fonctionne !

En effet celles du commerce ne sont jamais à l'heure , puisque les marées changent.

Récupération des données sur internet, formatage , puis affichage....

 

Capture d’écran 2014-05-10 à 11.24.28.png

 

 

Récupération des données web :

 

Récupérer des données web, c'est faire du scraping ou "harvesting", et c'est déjà un métier en soi : les moteurs de recherche le font, et beaucoup de banques de données sont alimentées par des algorithmes de scraping.

 

Ici toutefois nous n'allons pas faire "lourd" donc pas de serveur pour le data mining ou le formatage des données, on va faire au plus court.

 

Après avoir cherché les fonctionnalités des librairies dispo avec l'ENC28J60, Ether a récemment mis a disposition une fonction permettant de prolonger une connexion TCP/IP : ether.persistTcpConnection(true) ; un lien vers un exemple d'utilisation se trouve en bas de page.

 

Il y a dans ce cas nécessité de réduire la page au maximum, afin de ne pas avoir trop de données en entrée, et ceci peut se faire en ligne : plusieurs moteurs de flux RSS permettent la création de flux a partir de pages web , dont feed43 et yahoo pipes.

 

Capture d’écran 2014-05-10 à 13.18.28.png

 

Ils nécessitent un apprentissage, mais sont intéressants, et peuvent être combinés et utilisés de façon concomitante.

En pointant la librairie Ether vers la page du flux rss, on récupère des données bien formatées, avec éventuellement des arguments et balises ("fabriquées" dans feed43) : ci dessous flux feed43 en entrée de yahoo pipes.

 

Capture d’écran 2014-05-10 à 13.21.28.png

 

 

 

Ceci a toutefois quelques inconvénients : le délai de mise a jour du flux RSS est de 6 heures pour une utilisation gratuite (feed43) , et un maillon supplémentaire dans la chaine est un risque technique supplémentaire.

J 'ai donc basculé vers l'utilisation de la lib UIPEthernet, qui gère bien mieux la pile TCP/IP et permet de gober d'un coup une grosse page web avec une carte arduino ; ne pas oublier de reconfigurer le pinout (CS sur pin 10 au lieu de 8).

 

Exemple de code ci dessous, j ai passé le baudrate à 115200, ça va plus vite ;-) 

 

 

PARSING DES DONNEES WEB :

 

Après avoir regardé du coté de //playground.arduino.cc/Code/TextFinder, une librairie qui permet de parser les données, j ai décidé de reprendre les choses avec feed43 et yahoo pipes, afin de formater et baliser les données issues de la page web.

 

- ici la page web d origine des données :

//maree.info/58

- ici le flux rss sortant de feed43.com :

//feed43.com/5525033514074040.xml

- ici le flux sortant de yahoo pipes, en provenance de feed43 avec les balises permettant le parsing. (HH avant les heures, MM avant les hauteurs d'eau, CO avant les coefficients).

les fonctions regex de yahoo pipes sont très puissantes et permettent une mise en forme et l'intégration de balises au flux rss.

 

Capture d’écran 2014-05-10 à 16.39.14.png

 

//pipes.yahoo.com/pipes/pipe.info?_id=7b9d0de979f84b3491b5547de1e4ab14

 

 

Seul le dernier coefficient de marée n'a pas été tagué, car il ne m'est pas utile.

 

Ne reste plus qu'a récupérer le flux yahoo pipes rss avec l arduino, utiliser la méthode PHP proposée par pipes, ce qui nous donne un lien utilisable par notre lib Arduino ;  code Arduino :

 

#include <SPI.h>
#include <UIPEthernet.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
//IPAddress server(74,125,232,128); // numeric IP for Google (no DNS)
char server[] = "pipes.yahoo.com"; // name address for Google (using DNS)

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192,168,0,177);

// 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;

void setup() {
// Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}

// start the Ethernet connection:
if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to configure Ethernet using DHCP");
// no point in carrying on, so do nothing forevermore:
// try to congifure using IP address instead of DHCP:
Ethernet.begin(mac, ip);
}
// give the Ethernet shield a second to initialize:
delay(1000);
Serial.println("connecting...");

// if you get a connection, report back via serial:
if (client.connect(server, 80)) {
Serial.println("connected");
// Make a HTTP request:
client.println("GET /pipes/pipe.run?_id=7b9d0de979f84b3491b5547de1e4ab14&_render=php HTTP/1.1");
client.println("Host: pipes.yahoo.com");
client.println("Connection: close");
client.println();
}
else {
// kf you didn't get a connection to the server:
Serial.println("connection failed");
}
}

void loop()
{
// if there are incoming bytes available
// from the server, read them and print them:
if (client.available()) {
char c = client.read();
Serial.print(c);
}

// if the server's disconnected, stop the client:
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();

// do nothing forevermore:
while(true);
}
}

 

 

Ce qui nous envoie sur la console série de l'arduino :

 

connecting...
connected
HTTP/1.1 200 OK
Date: Sat, 10 May 2014 15:26:28 GMT
P3P: policyref="//info.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV"
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=900
Content-Type: text/php;
Age: 0
Connection: close
Via: http/1.1 r16.ycpi.ams.yahoo.net (ApacheTrafficServer/4.0.2 [cMsSfW])
Server: ATS

a:2:{s:5:"count";i:1;s:5:"value";a:6:{s:5:"title";s:7:"marées";s:11:"description";s:12:"Pipes Output";s:4:"link";s:75:"//pipes.yahoo.com/pipes/pipe.info?_id=7b9d0de979f84b3491b5547de1e4ab14";s:7:"pubDate";s:31:"Sat, 10 May 2014 15:26:28 +0000";s:9:"generator";s:29:"//pipes.yahoo.com/pipes/";s:5:"items";a:1:{i:0;a:4:{s:5:"title";s:152:"Sam. 10 HH04h21 HH11h00 HH16h56 HH23h26 MM8,75m MM3,75m MM9,00m MM3,55m CO46 CO52 Dim. 11 HH05h17 HH11h54 HH17h46 MM9,30m MM3,20m MM9,55m CO57 63";s:7:"y:title";s:152:"Sam. 10 HH04h21 HH11h00 HH16h56 HH23h26 MM8,75m MM3,75m MM9,00m MM3,55m CO46 CO52 Dim. 11 HH05h17 HH11h54 HH17h46 MM9,30m MM3,20m MM9,55m CO57 63";s:7:"content";s:152:"Sam. 10 HH04h21 HH11h00 HH16h56 HH23h26 MM8,75m MM3,75m MM9,00m MM3,55m CO46 CO52 Dim. 11 HH05h17 HH11h54 HH17h46 MM9,30m MM3,20m MM9,55m CO57 63";s:11:"description";N;}}}}
disconnecting.

 

Voilà, les horaires de marées + coef + marnages sont formatés et balisés et a disposition dans l arduino, reste plus qu'à les parser, ce qui va être easy.

 

La suite bientôt....

 

 

 

 

 

 

 

 

 

 

Aide mémoire de configuration

Promini alimentée en 3v3 pour compatibilité modules RF / éthernet / RFID

Pro mini tourne sous voltée sans aucun problème ; finalement si : le port série ne suuit pas les instructions console et se cale sur un baudrate différent

FTDI reconnu en dev/tty/usbserial sous mac OS

Carte configurée en arduino pro ou pro mini (3,3V 8MHZ) w ATmega 328 dans le log Arduino

Connection FTDI :  RX au TX carte et RX au TX carte.

 

 

IMG_0615-2.jpeg

 

 

Cablage du shield ethernet ENC28J60

Capture d’écran 2014-05-08 à 19.36.54.png

 

 

 

La lib compatible avec ENC28J60 :  Ethercard

 

Cablage d'apres la lib : pas de pin reset ni de int/D2

Capture d’écran 2014-05-09 à 13.42.20.png

 

 

Difficultés de gestion de la pile TCP/IP > non gestion de la pile / buffer avec la lib Ether deux solutions :

fonction ether.persistTcpConnection(true) de  Clark, un peu sport.

 

ou mieux utiliser la lib UIPethernet, qui implémente la gestion de TCP/IP  pile d’Adam Dunkels et gère la persistance.

Cablage de pin : attention CS sur pin dix pour cette lib.

Gros avantage : compatible avec la lib Ethernet "stock" arduino.

 

//www.lucadentella.it/en/category/enc28j60-arduino/

//bibi21000.gallet.info/index.php/fr/domotique/82-arduino-fr/185-arduino-et-enc28j60-ethercard-ou-uipethernet.html

//www.rogerclark.net/?p=499

//defidataplus.net/tutoriaux/recuperer-flux-rss-arduino/

//arts-numeriques.codedrops.net/Recuperer-une-info-dans-une-page

//web-sniffer.net/

 

 

 

 sraping page Web sur lib UIPEthernet : juste modifier le nom de la lib en UIPEthernet, et ça roule

 

/*
  Web client
 
 This sketch connects to a website (//www.google.com)
 using an Arduino Wiznet Ethernet shield. 
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 
 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe, based on work by Adrian McEwen
 
 */


#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 mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
//IPAddress server(74,125,232,128);  // numeric IP for Google (no DNS)
char server[] = "www.google.com";    // name address for Google (using DNS)

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192,168,0,177);

// 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;

void setup() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    // try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip);
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /search?q=arduino HTTP/1.1");
    client.println("Host: www.google.com");
    client.println("Connection: close");
    client.println();
  } 
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop()
{
  // if there are incoming bytes available 
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    while(true);
  }
}

 

 

 



08/05/2014
2 Poster un commentaire

A découvrir aussi


Inscrivez-vous au blog

Soyez prévenu par email des prochaines mises à jour

Rejoignez les 52 autres membres