<?xml version="1.0"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Java dans le hard(ware)</title>
    <link>http://lhuet.github.io/blog</link>
    <atom:link href="http://lhuet.github.io/blog/feed.xml" rel="self" type="application/rss+xml" />
    <description>Java dans le hard(ware)</description>
    <language>en-gb</language>
    <pubDate>mer., 2 nov. 2016 18:20:34 +0100</pubDate>
    <lastBuildDate>mer., 2 nov. 2016 18:20:34 +0100</lastBuildDate>

    <item>
      <title>Programmez votre ESP8266 comme un arduino !</title>
      <link>http://lhuet.github.io/blog/2015/09/esp8266-with-arduino-ide.html</link>
      <pubDate>mar., 29 sept. 2015 00:00:00 +0200</pubDate>
      <guid isPermaLink="false">http://lhuet.github.io/blog/2015/09/esp8266-with-arduino-ide.html</guid>
      	<description>
	&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Voici venu le troisième volet de la série de billets sur l&amp;#8217;ESP8266, celui sur la programmation !
Pour les plus avertis, le SDK est directement disponible avec makefile et touti quanti !
Dans notre cas, nous allons passer par un IDE assez populaire, celui d&amp;#8217;Arduino.
En effet, à partir de la version 1.6.4 (assez récemment donc), l&amp;#8217;IDE Arduino permet d&amp;#8217;ajouter facilement
le support de cartes tièrces.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_installation_de_l_ide&quot;&gt;Installation de l&amp;#8217;IDE&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour commencer, téléchargez l&apos; &lt;a href=&quot;https://www.arduino.cc/en/Main/Software&quot;&gt;IDE Arduino sur le site officiel&lt;/a&gt; et installez le dans le répertoire de votre choix.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Vous trouverez tout ce qu&amp;#8217;il faut sur le &lt;a href=&quot;https://github.com/esp8266/Arduino&quot;&gt;repo github&lt;/a&gt; du projet de support de l&amp;#8217;ESP8266 dans l&amp;#8217;IDE Arduino.
En fonction de votre humeur joueuse ou non, je vous laisse choisir l&amp;#8217;URL de la dernière version stable ou celle de la version &lt;em&gt;staging&lt;/em&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Version stable : &lt;a href=&quot;http://arduino.esp8266.com/stable/package_esp8266com_index.json&quot;&gt;http://arduino.esp8266.com/stable/package_esp8266com_index.json&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Version &lt;em&gt;staging&lt;/em&gt; : &lt;a href=&quot;http://arduino.esp8266.com/staging/package_esp8266com_index.json&quot;&gt;http://arduino.esp8266.com/staging/package_esp8266com_index.json&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Suivez les étapes suivantes pour configurer votre IDE :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ajouter l&amp;#8217;URL ci-dessus dans les préférences de l&amp;#8217;IDE (menu Fichier/Préférences &amp;#8594; champ &quot;Additional Boards Manager URLs&quot;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Via le menu Outils/Type de carte/Boards manager, accéder à l&amp;#8217;outil qui permet d&amp;#8217;ajouter le support de l&amp;#8217;ESP8266&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sélectionnez l&amp;#8217;item ESP8266 et cliquez sur le bouton &lt;em&gt;Install&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cette phase d&amp;#8217;installation va télécharger tout ce qu&amp;#8217;il faut pour compiler et flasher votre microcontroleur préféré !&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sélectionner le type de carte adéquat avec le menu Outils/Type de carte (Olimex MOD-WIFI-ESP8266 dans mon cas)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sélectionner le port série qui relie votre PC à votre ESP8266 (/dev/ttyUSB0 dans mon cas).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Vous devriez être maintenant prêt à coder et flasher votre micro-controlleur.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_exemple_em_hello_world_em_em_blink_em_d_une_led&quot;&gt;Exemple &lt;em&gt;Hello World&lt;/em&gt; (&lt;em&gt;blink&lt;/em&gt; d&amp;#8217;une led)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour faire simple, on va partir du classique &lt;em&gt;Hello World&lt;/em&gt; du hardware : Faire clignoter une led !&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_cablage&quot;&gt;Cablage&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Comme une image vaut largement mieux qu&amp;#8217;un beau discours, voici le schéma Fritzing qui illustre le montage à cabler :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/esp8266_led.png&quot; alt=&quot;Led pilotée par ESP8266&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les boutons Reset et Flash (sur le GPIO0) facilitent l&amp;#8217;upload du programme sur le micro-contrôleur.
Sans ces boutons, vous devriez faire des &quot;shunts&quot; à la main.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_programme&quot;&gt;Programme&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Voici le programme qui suit la structure standard des programmes Arduino (fontions setup et loop) :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint c language-c&quot;&gt;&lt;code&gt;  int ledPin = 5;

  void setup() {
    // Initialisation du GPIO5 en sortie
    pinMode(ledPin, OUTPUT);
    // Initialisation de la sortie série (pratique pour débugguer)
    Serial.begin(115200);
    Serial.println();
    Serial.println(&quot;Starting ...&quot;);
  }

  void loop() {
    // On allume la led
    digitalWrite(ledPin, HIGH);
    Serial.println(&quot;Led on ...&quot;);
    // Attente de 500 ms
    delay(500);
    // On éteind la led
    digitalWrite(ledPin, LOW);
    Serial.println(&quot;Led off ...&quot;);
    // Attente de 500 ms à nouveau
    delay(500);
  }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;En appuyant sur les 2 boutons Reset et Flash et en ne relachant que le bouton Reset, votre ESP8266 est prêt à être flashé.
Cliquez sur l&amp;#8217;icône &lt;em&gt;Téléverser&lt;/em&gt; de l&amp;#8217;IDE Arduino et le programme est compilé puis uploadé sur votre ESP8266.
Le programme démarre tout seul lorsque l&amp;#8217;upload est terminé.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Vous pouvez utiliser le terminal série de l&amp;#8217;IDE Arduino (en 115200) pour vérifier les sorties &lt;em&gt;Led on &amp;#8230;&lt;/em&gt; et &lt;em&gt;Led off &amp;#8230;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_exemple_de_pilotage_des_gpio_via_le_wifi&quot;&gt;Exemple de pilotage des GPIO via le Wifi&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Vous me direz, c&amp;#8217;est bien beau de faire clignoter une Led mais pour le moment, on n&amp;#8217;a pas encore utiliser la connectivité Wifi de notre ESP8266.
Au delà du faible coût, c&amp;#8217;est quand même cette fonctionnalité qui est super intéressante sur l&amp;#8217;ESP8266.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Notre second programme va donc être de piloter la led à travers un serveur Web embarqué dans l&amp;#8217;ESP8266.
Une simple requête HTTP nous permettra donc d&amp;#8217;allumer ou d&apos;éteindre notre Led.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour cela, direction &lt;a href=&quot;http://arduino.esp8266.com/stable/doc/reference.html&quot;&gt;la doc officielle de l&amp;#8217;API&lt;/a&gt; !
Vous pouvez aussi vous appuyer sur ce document plutôt complet : &lt;a href=&quot;http://neilkolban.com/tech/wp-content/uploads/2015/09/Kolbans-Book-on-the-ESP8266-September-2015.pdf&quot;&gt;http://neilkolban.com/tech/wp-content/uploads/2015/09/Kolbans-Book-on-the-ESP8266-September-2015.pdf&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le code du second programme est ci-dessous. Il est assez simple pour être suffisament explicite.
La console série vous permettra d&amp;#8217;obtenir l&amp;#8217;adresse IP de votre ESP8266 au démarrage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint c language-c&quot;&gt;&lt;code&gt;  #include &amp;lt;ESP8266WiFi.h&amp;gt;
  #include &amp;lt;WiFiClient.h&amp;gt;
  #include &amp;lt;ESP8266WebServer.h&amp;gt;

  // Constantes Wifi
  const char* ssid = &quot;ssid&quot;;
  const char* password = &quot;password&quot;;

  // Variables globales
  int ledPin = 5;               // Pin de pilotage de la lod
  ESP8266WebServer server(80);  // Instance du serveur Web

  void handleRoot() {
    Serial.println(&quot;HTTP GET /&quot;);
    String message = &quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Bienvenue sur votre ESP8266 !&amp;lt;/h1&amp;gt;&quot;;
    message += &quot;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&apos;/on&apos;&amp;gt;Led on&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&quot;;
    message += &quot;&amp;lt;li&amp;gt;&amp;lt;a href=&apos;/off&apos;&amp;gt;Led off&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&quot;;
    server.send(200, &quot;text/html&quot;, message);
  }

  void handleLedOn() {
    Serial.println(&quot;HTTP /on -&amp;gt; Led on&quot;);
    digitalWrite(ledPin, HIGH);
    server.send(200, &quot;text/html&quot;, &quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Led On !&amp;lt;/h1&amp;gt;&amp;lt;/html&amp;gt;&quot;);
  }

  void handleLedOff() {
    Serial.println(&quot;HTTP /off -&amp;gt; Led off&quot;);
    digitalWrite(ledPin, LOW);
    server.send(200, &quot;text/html&quot;, &quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Led Off !&amp;lt;/h1&amp;gt;&amp;lt;/html&amp;gt;&quot;);
  }

  void handleNotFound(){
    String message = &quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Not Found !!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&quot;;
    server.send(404, &quot;text/html&quot;, message);
  }

  void setup() {
    // Initialisation du port série (pour débugguer)
    Serial.begin(115200);
    Serial.println();
    Serial.println(&quot;Starting ...&quot;);com

    // Initialisation du GPIO5 en sortie
    pinMode(ledPin, OUTPUT);

    // Initialisation de la connexion Wifi
    WiFi.begin(ssid, password);
    Serial.println(&quot;&quot;);

    // Attente de la connexion
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(&quot;.&quot;);
    }
    Serial.println(&quot;&quot;);
    Serial.print(&quot;Connecté au SSID : &quot;);
    Serial.println(ssid);
    Serial.print(&quot;Adresse IP : &quot;);
    Serial.println(WiFi.localIP());

    // Routage des requêtes HTTP
    server.on(&quot;/&quot;, handleRoot);
    server.on(&quot;/on&quot;, handleLedOn);
    server.on(&quot;/off&quot;, handleLedOff);
    server.onNotFound(handleNotFound);
    server.begin();
    Serial.println(&quot;Serveur HTTP démarré&quot;);
  }

  void loop() {
    server.handleClient();
  }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour le tester, vous pouvez utiliser les commandes Curl suivantes :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;curl &lt;a href=&quot;http://&amp;lt;ip&amp;gt;&quot;&gt;http://&amp;lt;ip&amp;gt;&lt;/a&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;curl -X POST &lt;a href=&quot;http://&amp;lt;ip&amp;gt;/on&quot;&gt;http://&amp;lt;ip&amp;gt;/on&lt;/a&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;curl -X POST &lt;a href=&quot;http://&amp;lt;ip&amp;gt;/off&quot;&gt;http://&amp;lt;ip&amp;gt;/off&lt;/a&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Voilà ! Vous avez maintenant prêt à créer votre super montage que vous avez imaginer sur Arduino &amp;#8230; en le connectant au Web très facilement.
Vous pouvez continuer en regardant tous les exemples fournis. Vous verrez que vous pourrez même faire un portail captif très facilement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A vous de jouer maintenant !&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>Cabler et Flasher son ESP8266</title>
      <link>http://lhuet.github.io/blog/2015/06/esp8266-wiring-and-flashing.html</link>
      <pubDate>dim., 28 juin 2015 00:00:00 +0200</pubDate>
      <guid isPermaLink="false">http://lhuet.github.io/blog/2015/06/esp8266-wiring-and-flashing.html</guid>
      	<description>
	&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Après une &lt;a href=&quot;http://lhuet.github.io/blog/2015/05/esp8266-overview.html&quot;&gt;présentation générale de l&amp;#8217;ESP8266&lt;/a&gt;,
voici le second billet pour vous expliquer comment cabler et flasher un ESP8266.
La programmation arrivera dans le billet suivant. Soyez patient !&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_cablage&quot;&gt;Cablage&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le cablage peut varier selon les modèles que vous utilisez.
Dans mon exemple, je vais montrer le cablage d&amp;#8217;un &lt;a href=&quot;https://www.olimex.com/Products/IoT/MOD-WIFI-ESP8266-DEV/open-source-hardware&quot;&gt;modèle de chez Olimex&lt;/a&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/MOD-WIFI-ESP8266-DEV-1.jpg&quot; alt=&quot;Modèle Olimex MOD-WIFI-ESP8266-DEV&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Olimex fait du hardware en Open Source. On peut donc retrouver les schémas sans soucis, dont  &lt;a href=&quot;https://www.olimex.com/Products/IoT/MOD-WIFI-ESP8266-DEV/resources/MOD-WIFI-ESP8266-DEV_schematic.pdf&quot;&gt;celui qui montre le design&lt;/a&gt;.
Quelque soit votre modèle, vous devez avoir un document qui devrait vous indiquer à quoi correspond chaque Pin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour le module Olimex, voici le &quot;pinout&quot; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/pinout_esp8266_olimex.png&quot; alt=&quot;Pinout Olimex MOD-WIFI-ESP8266-DEV&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour le moment, 6 pins vont nous intéresser :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;pin 1: 3.3V&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pin 2: GND&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pin 3: TX / GPIO1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pin 4: RX / GPIO3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pin 13: RESET&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pin 21: GPIO0 (permet de mettre l&amp;#8217;ESP8266 en mode &quot;flash&quot;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_alimentation&quot;&gt;Alimentation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;L&amp;#8217;ESP8266 utilise des niveaux de tension de 3.3v (comme sur les GPIO des Raspberry Pi).
L&amp;#8217;alimentation de la plupart des &quot;modules&quot; ESP8266 se fait également en 3.3v.
C&amp;#8217;est peut-être cet aspect qui va vous gêner le plus.
En effet, les alimentations 5V sont courantes &amp;#8230; celles en 3.3V le sont beaucoup moins !
Vous aurez donc sûrement besoin d&amp;#8217;un régulateur 3.3V ou d&amp;#8217;un converstisseur DC/DC du genre :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://fr.farnell.com/stmicroelectronics/ld1117av33/regulateur-ldo-3-3v-1117-to-220/dp/1087165&quot;&gt;Exemple de régulateur chez Farnell&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://www.ebay.fr/itm/LM2596-DC-Module-Alimentation-Reglable-Convertisseur-Voltmetre-LED-pratique-/121369365296&quot;&gt;Exemple de convertisseur DC/DC LM2596&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Tip&lt;/div&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
Si vous avez une carte Arduino dans un coin, vous pouvez vous servir des pins GND et 3.3V pour alimenter momentanément votre module ESP8266.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Tip&lt;/div&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
Il existe des &lt;a href=&quot;http://www.electrodragon.com/product/esp8266-smd-adapter-board/&quot;&gt;adaptateurs d&amp;#8217;ESP8266&lt;/a&gt; intégrant un régulateur 3.3V vous permettant d&amp;#8217;alimenter votre montage en 5V.
Cela permet également d&amp;#8217;avoir un module avec des pins qui ont le même pas que les plaques d&amp;#8217;essai.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Une fois que vous avez votre alimentation en 3.3V, il n&amp;#8217;y a plus qu&apos;à brancher sur les Pins 1 et 2 :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/olimex_8266_alim.jpg&quot; alt=&quot;Pinout Olimex MOD-WIFI-ESP8266-DEV&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_liaison_uart&quot;&gt;Liaison UART&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour pouvoir communiquer en filaire avec l&amp;#8217;ESP8266, vous avez une bonne vieille liaison série !
Les Pins 3 et 4 vous offre la connectivité pour cela.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Munissez-vous d&amp;#8217;un convertisseur USB/UART au préalable.
Vous en trouverez à pas cher sur &lt;a href=&quot;http://www.ebay.com/itm/NEW-CP2102-USB-2-0-to-UART-TTL-6PIN-Module-Serial-Converter-/170813830162&quot;&gt;ebay&lt;/a&gt; si vous n&amp;#8217;avez pas cela sous le coude.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La seule chose à faire attention est de croiser les RX et TX entre votre convertisseur et l&amp;#8217;ESP8266.
Donc le RX de mon convertiseur USB/UART, je le branche sur le pin 3 (TX) et le TX de mon convertisseur sur le pin 4 (RX).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/olimex_8266_alim_uart.jpg&quot; alt=&quot;Pinout Olimex MOD-WIFI-ESP8266-DEV&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Dans la plupart des cas, les modules ESP8266 sont livrés avec un firmware qui permet de discuter sur l&amp;#8217;UART en 115200 bps.
Vous pouvez donc utiliser votre &quot;moniteur série&quot; préféré selon votre OS (minicom, screen, putty, &amp;#8230;). Dans mon cas, j&amp;#8217;utilise screen :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;screen /dev/ttyUSB0 115200&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Si vous faites un reset (en mettant le pin 13 à la masse et en le relachant), vous devriez voir des choses apparaître sur votre écran.
Il y a même de forte chance que vous puissiez intéragir sur la console car la plupart du temps,
le firmware installé par défaut est celui qui permet de se servir de votre ESP8266 en modem Wifi.
Ci-dessous, vous voyez quelques commandes :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AT: Commande pour vérifier la connexion&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AT+GMR: Donne la version du firmware&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AT+CWMODE?: Donne le mode de fonctionnement : 1=STA(station), 2=AP(Access Point), 3=BOTH&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AT+CWLAP: Donne la liste des SSID&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;ready
AT

OK
AT+GMR
00160901

OK
AT+CWMODE?
+CWMODE:1

OK
AT+CWLAP
+CWLAP:(0,&quot;&quot;,0)
+CWLAP:(2,&quot;home&quot;,-64)
+CWLAP:(0,&quot;AI-THINKER_A11343&quot;,-8)

OK&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_flasher_votre_esp8266&quot;&gt;Flasher votre ESP8266&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Si, comme moi, vous souhaitez utiliser votre ESP8266 comme autre chose qu&amp;#8217;un modem Wifi, vous allez devoir changer le firmware.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_outil_pour_flasher&quot;&gt;Outil pour flasher&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Il existe plusieurs outils selon l&amp;#8217;OS que vous utiliser. Les plus répandus sont :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;esptool : Disponible sur un &lt;a href=&quot;https://github.com/themadinventor/esptool&quot;&gt;repo GitHub&lt;/a&gt; - Outil Python multi-OS&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;flash_download_tool : Outil windows officiel disponible sur le &lt;a href=&quot;http://bbs.espressif.com/viewtopic.php?f=5&amp;amp;t=433&quot;&gt;forum Espressif&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;nodemcu-flasher : Outil spécifique Windows disponible sur un &lt;a href=&quot;https://github.com/nodemcu/nodemcu-flasher&quot;&gt;repo GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Je vous fais confiance pour suivre la documentation qui va bien pour installer l&amp;#8217;outil de votre choix.
De mon coté, j&amp;#8217;utilise l&amp;#8217;outil python esptool (utilisé dans certains makefile).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_flash_d_un_firmware&quot;&gt;Flash d&amp;#8217;un firmware&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Avant de flasher un firmware, il faut mettre votre ESP8266 en &quot;mode flash&quot;.
Pour cela, il faut mettre le GPIO0 (Pin 21 sur l&amp;#8217;Olimex) à la masse puis faire un reset (Pin 13 à mettre à la masse et relacher).
Quand vous avez flasher plusieurs fois votre ESP8266, vous comprenez l&amp;#8217;intéret de certains modules qui comportent 2 boutons (Reset et Flash) !&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Dans le cas le plus simple, vous aurez un fichier unique et une simple commande vous permettra de flasher votre ESP8266.
Voici un exemple pour flasher &lt;a href=&quot;https://github.com/nodemcu/nodemcu-firmware/releases/latest&quot;&gt;la dernière version du firmware NodeMCU&lt;/a&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;esptool.py --port /dev/ttyUSB0  write_flash 0x000000 ./nodemcu_float_0.9.6-dev_20150406.bin&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Selon les firmwares, il est possible que vous ayez plusieurs fichiers. Dans ce cas, il faudra préciser l&amp;#8217;offset où flasher chaque fichier.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Voilà ! Vous avez maintenant tout ce qu&amp;#8217;il faut pour commencer à coder &amp;#8230; au moins en Lua avec &lt;a href=&quot;http://nodemcu.com/index_en.html&quot;&gt;NodeMCU&lt;/a&gt;.
Les plus courageux pourront tenter un HelloWorld (pilotage d&amp;#8217;une led) en C comme &lt;a href=&quot;https://github.com/esp8266/source-code-examples/tree/master/blinky&quot;&gt;ici&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>ESP8266 - Overview</title>
      <link>http://lhuet.github.io/blog/2015/05/esp8266-overview.html</link>
      <pubDate>lun., 18 mai 2015 00:00:00 +0200</pubDate>
      <guid isPermaLink="false">http://lhuet.github.io/blog/2015/05/esp8266-overview.html</guid>
      	<description>
	&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Depuis la fin 2014, j&amp;#8217;ai découvert un micro-contrôleur très abordable (&amp;lt;5€) avec connectivité WiFi intégré.
Ses capacités en font un candidat de choix pour tous vos projets d&amp;#8217;objets connectés !&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Voici donc le premier billet d&amp;#8217;une série sur ce micro-controleur aux multiples facettes :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/esp8266_esp01.jpg&quot; alt=&quot;ESP8266 / ESP01&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_cot_hardware&quot;&gt;Coté hardware&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les cartes à base d&amp;#8217;ESP8266 sont plus à comparer aux cartes de type Arduino qu&amp;#8217;aux cartes de type Raspberry Pi.
Il s&amp;#8217;agit en effet d&amp;#8217;un micro-controleur ayant comme atout principal une connectivité WiFi intégré.
Ce qui est d&amp;#8217;autant plus appréciable, c&amp;#8217;est que la puce ESP8266 supporte de
manière native le WPA et que le SSL est de la partie (Les spécialistes de la sécurité y trouveront encore d&amp;#8217;autres atouts).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_soc_expressif&quot;&gt;SoC Expressif&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://espressif.com/&quot;&gt;Espressif&lt;/a&gt; est le fabricant de la puce &lt;a href=&quot;http://espressif.com/en/products/esp8266/&quot;&gt;ESP8266&lt;/a&gt;.
Les principales caractéristiques de ce SoC (&quot;System On Chip&quot;) sont :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CPU Risc 32 bit @80MHz&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WiFi 2.4 GHz (802.11 b/g/n)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;64 Kb RAM (selon le wiki)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;gt;512 Kb Flash SPI (dépend des versions de cartes)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GPIO / PWM / ADC&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;UART / I2C / SPI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alimentation en 3,3V&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;De quoi connecter quelques capteurs et alimenter vos plate-formes &quot;BigData&quot; !&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_diff_rentes_versions&quot;&gt;Différentes versions&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Selon vos besoins, il existe différentes versions avec plus ou moins de fonctionnalités (ie. nombre de pins disponibles).
Les versions sont notées ESP-XX avec XX allant de 01 à 13.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La page de wiki suivante vous donnera un bon aperçu de cette diversité :
 &lt;a href=&quot;http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family&quot;&gt;http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour vous donner une idée de la taille, voici quelques exemplaires à côté d&amp;#8217;un cutter :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/esp8266_xx.jpeg&quot; alt=&quot;Variétés d&quot; width=&quot;ESP8266&apos;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_cot_applicatif_quoi_faire_comment&quot;&gt;Coté applicatif : Quoi faire ? Comment ?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Comme il s&amp;#8217;agit d&amp;#8217;un micro-contrôleur, le terme &quot;firmware&quot; est souvent utilisé.
Vous l&amp;#8217;aurez compris, il s&amp;#8217;agit du programme qui tourne sur cette carte.
Et pour changer de &quot;firmware&quot;, on va utiliser un outil de type &quot;flash&quot; est utilisé.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour faire court, côté applicatif, il y a plusieurs possibilités dont les utilisations les plus courantes sont :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Mode modem (Commandes AT) qui permet d&amp;#8217;apporter une connectivité Wifi à une carte arduino par exemple&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Interpreteur Lua avec le firmware &lt;a href=&quot;https://github.com/nodemcu/nodemcu-firmware&quot;&gt;NodeMCU&lt;/a&gt; (scripts LUA uploadés sur la flash SPI)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Coder en C votre propre firmware avec le &lt;a href=&quot;http://bbs.espressif.com/viewforum.php?f=5&quot;&gt;SDK officiel&lt;/a&gt; et la &lt;a href=&quot;https://github.com/pfalcon/esp-open-sdk&quot;&gt;toolchain GCC&lt;/a&gt; qui va bien !&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;C&amp;#8217;est la 3ème solution que j&amp;#8217;ai utilisé pour la démo du talk DevoxxFr 2015 animé en avril dernier avec Philippe Charrière :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/esp8266_nest_like.jpg&quot; alt=&quot;NEST-like avec ESP8266&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La suite dans les prochains billets ;-)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>Serveur Web sur Tessel</title>
      <link>http://lhuet.github.io/blog/2014/10/webserver-tessel.html</link>
      <pubDate>ven., 31 oct. 2014 00:00:00 +0100</pubDate>
      <guid isPermaLink="false">http://lhuet.github.io/blog/2014/10/webserver-tessel.html</guid>
      	<description>
	&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Dans un &lt;a href=&quot;http://lhuet.github.io/blog/2014/10/getting-started-tessel.html&quot;&gt;article précédent&lt;/a&gt;, je présentais la carte Tessel permettant d&apos;écrire des programmes en JavaScript.
Cette carte disposant d&amp;#8217;une puce Wifi, il est tentant de faire tourner un serveur Web !&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_configuration_r_seau&quot;&gt;Configuration Réseau&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Avant de pouvoir mettre un serveur Web sur la carte Tessel, il faut disposer d&amp;#8217;une connexion réseau &amp;#8230; et donc configurer l&amp;#8217;accès Wifi.
L&amp;#8217;outil CLI fournit tout ce qu&amp;#8217;il faut pour cela.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La première chose à faire est de vérifier que la carte voit bien votre SSID :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;$ tessel wifi -l
TESSEL! Connected to TM-00-04-f0009a30-00584f4b-704e6249.
INFO Requesting wifi status...
Currently visible networks (1):
	home (61/127)
INFO Connected: 0&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour se connecter, vous pouvez utiliser &lt;a href=&quot;https://tessel.io/docs/wifi#connecting-to-wifi-from-js&quot;&gt;l&amp;#8217;API JavaScript&lt;/a&gt; (pour inclure la connexion dans votre code) ou l&amp;#8217;outil en ligne de commande.
C&amp;#8217;est cette dernière option que j&amp;#8217;ai choisi :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;$ tessel wifi -n home -p &amp;lt;password&amp;gt; -s [wpa|wpa2|wep]
TESSEL! Connected to TM-00-04-f0009a30-00584f4b-704e6249.
INFO Connecting to &quot;home&quot; with [wpa|wpa2|wep] security...
INFO Acquiring IP address.
.
INFO Connected!

IP	 192.168.0.8
DNS	 212.27.40.241
DHCP	 192.168.0.254
Gateway	 192.168.0.254&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les informations de connexion sont persistantes et lorsque vous redémarrez la carte, la connexion Wifi s&amp;#8217;active au démarrage.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_serveur_web_node_js_basique&quot;&gt;Serveur Web Node.js basique&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Node.js offre l&amp;#8217;API de base pour faire tourner un serveur HTTP. J&amp;#8217;ai donc commencé par cela :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint javascript language-javascript&quot;&gt;&lt;code&gt;var http = require(&apos;http&apos;);

var server = http.createServer(function (request, response) {
  response.writeHead(200, {&quot;Content-Type&quot;: &quot;text/plain&quot;});
  response.end(&quot;Hello World\n&quot;);
});

server.listen(80);

console.log(&quot;Server running ...&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Vous remarquerez qu&amp;#8217;on peut utiliser le port 80 sans souci (pas de sécurité pour les ports inférieurs à 1024 !).
Il n&amp;#8217;y a plus qu&apos;à lancer le programme :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;$ tessel run http-server.js
TESSEL! Connected to TM-00-04-f0009a30-00584f4b-704e6249.
INFO Bundling directory /home/lhuet/dev/hardware/tessel/webserver
INFO Deploying bundle (1.25 MB)...
INFO Running script...
Server running ...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le programme fonctionne très bien mais semble un peu lent.
Effectivement, la simple requête GET met plus d&amp;#8217;une seconde :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;$ time curl http://192.168.0.8
Hello World

real	0m1.334s
user	0m0.012s
sys	0m0.004s&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A comparer avec le même programme sur mon PC (core i7 qui n&amp;#8217;a rien de comparable &amp;#8230;) :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;time curl http://127.0.0.1:8000
Hello World

real	0m0.007s
user	0m0.006s
sys	0m0.000s&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Vous l&amp;#8217;avez compris, on ne va pas utiliser la carte Tessel pour faire un bench. Elle n&amp;#8217;est pas faite pour cela non plus.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_framework_vs_vanilla_node_js&quot;&gt;Framework vs Vanilla (node)JS&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Avec des ressources limitées et le résultat ci-dessus, la question d&amp;#8217;utiliser ou non un framework est donc légitime.
D&amp;#8217;un côté, disposer d&amp;#8217;un framework avec routeur et autres joyeusetés est appréciable pour code vite.
D&amp;#8217;un autre côté, comme dans tout framework, nous n&amp;#8217;avons souvent besoin que d&amp;#8217;un sous ensemble.
Sur un serveur &quot;classique&quot;, on ne se pose pas (assez ?) souvent la question mais sur microcontrolleur, c&amp;#8217;est déjà beaucoup que de faire tourner du JavaScript &amp;#8230; alors un framework !&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Un &lt;a href=&quot;https://twitter.com/technicalhumans/status/433365690511155200&quot;&gt;tweet&lt;/a&gt; m&amp;#8217;a donné l&amp;#8217;espoir de faire tourner &lt;a href=&quot;http://expressjs.com/&quot;&gt;Express&lt;/a&gt;.
Je suis vite tombé sur un bug bloquant pour faire tourner les versions récentes d&amp;#8217;Express et n&amp;#8217;ait pas trouvé une version fonctionnelle sur la carte Tessel.
J&amp;#8217;ai donc cherché une autre piste et trouvé rapidement la librairie &lt;a href=&quot;https://github.com/pirumpi/tiny-router&quot;&gt;tiny-router&lt;/a&gt; plus légère et ayant pour cible la carte Tessel.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Vite, un &quot;Hello World&quot; pour voir ce que ça donne :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint javascript language-javascript&quot;&gt;&lt;code&gt;var router = require(&apos;tiny-router&apos;);

router.get(&apos;/&apos;, function(req, res) {
  res.send(&apos;Hello World&apos;);
});

router.listen(80);
console.log(&quot;Server running ...&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Un petit test pour vérifier que ça marche :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;time curl http://192.168.0.8
Hello World
real	0m1.194s
user	0m0.000s
sys	0m0.010s&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On voit qu&amp;#8217;on n&amp;#8217;est dans le même ordre de grandeur qu&amp;#8217;avec l&amp;#8217;API de base.
Pour aller (un petit peu) plus loin, j&amp;#8217;ai utilisé l&amp;#8217;exemple qui permet de commencer à jouer avec les leds sur la carte et on retrouve une application qui ressemble à ce qu&amp;#8217;on a avec Express:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint javascript language-javascript&quot;&gt;&lt;code&gt;var router = require(&apos;tiny-router&apos;),
    tessel = require(&apos;tessel&apos;);

var lights = {
    green: tessel.led[0],
    blue: tessel.led[1],
    red: tessel.led[2],
    amber: tessel.led[3]
};

router
    .get(&apos;/&apos;, function(req, res) {
        res.send(&apos;Simple light web API&apos;);
    })
    .get(&apos;/lights&apos;, function(req, res){
        res.send(lights);
    })
    .get(&apos;/green&apos;, function(req, res){
        var state = lights.green.read();
        lights.green.write(state);
        res.send({status: state});
    })
    .get(&apos;/green/{state}&apos;, function(req, res){
        var state = parseInt(req.body.state);
        lights.green.write(state);
        res.send({status: state});
    });

router.listen(80);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Avec ce programme, on peut jouer avec la led verte de la carte en utilisant les URLs :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://192.168.0.8/green/0&quot;&gt;http://192.168.0.8/green/0&lt;/a&gt; pour allumer la led&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://192.168.0.8/green/1&quot;&gt;http://192.168.0.8/green/1&lt;/a&gt; pour éteindre la led&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;En conclusion, je dirais que cette librairie tiny-router est amplement suffisante pour utiliser la carte Tessel.
Je n&amp;#8217;ai pas fait de tests, mais je me demande si une simple carte arduino avec un shield Ethernet ne serait pas plus rapide car les temps de réponse, bien qu&amp;#8217;acceptables, ne sont pas impressionnants.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>Tessel Getting Started</title>
      <link>http://lhuet.github.io/blog/2014/10/getting-started-tessel.html</link>
      <pubDate>sam., 18 oct. 2014 00:00:00 +0200</pubDate>
      <guid isPermaLink="false">http://lhuet.github.io/blog/2014/10/getting-started-tessel.html</guid>
      	<description>
	&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tessel est une carte à base de microcontrôleur ARM ayant pour particularité de se programmer en JavaScript.
A l&amp;#8217;occasion de &lt;a href=&quot;http://bdx.io&quot;&gt;BDX.IO&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/k33_org&quot;&gt;k33g_org&lt;/a&gt; m&amp;#8217;a gentiment prêté sa carte Tessel.
Voici donc un retour sur mes premières expérimentations.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_qu_est_ce_qu_elle_a_dans_le_ventre&quot;&gt;Qu&amp;#8217;est-ce qu&amp;#8217;elle a dans le ventre ?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/tessel.png&quot; alt=&quot;Tessel&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://tessel.io/docs/hardware&quot;&gt;Coté matériel&lt;/a&gt;, elle dispose de quelques atouts intéressants :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Processeur Cortex M3 à 180 MHz&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Puce WIFI TI CC3000&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;32 Mb RAM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;32 Mb Flash&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Si on compare à un Arduino, la carte Tessel est une bête de course et les 2 cartes ne jouent pas tout à fait dans la même cours !
Pour la mémoire, on parle en Mb coté Tessel et en Kb coté Arduino.
Pour le microcontrôleur, l&amp;#8217;Arduino UNO est à 16MHz et le Tessel à 180 MHz.
On est clairement dans un autre monde.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;En terme de connectivité, la carte Tessel dispose :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;de bus classiques : 2 I2C, 1 SPI et 3 UART&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;de GPIO (General Purpose Input/Output) pour les entrées/sorties numériques (j&amp;#8217;en ai compté 18 répartis sur les 5 connecteurs) dont 3 sont utilisables en PWM (Pulse Width Modulation).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;d&amp;#8217;entrées analogiques (j&amp;#8217;en ai vu 6) avec un ADC 10 bits.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Un système de connecteur générique avec 3 GPIO, I2C, SPI, 3.3V et GND est utilisé pour mettre en place un écosystème de module.
La photo suivante montre un exemple d&amp;#8217;utilisation de plusieurs modules.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/TM-00-00-fullyloaded-top.jpg&quot; alt=&quot;Modules Tessel&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Voici quelques subtilités glanées dans la &lt;a href=&quot;https://tessel.io/docs/hardware&quot;&gt;documentation&lt;/a&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Il y a 1 seul bus SPI partagées sur tous les connecteurs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Il y a 2 bus I2C (le 1er partagé sur les connecteurs A, B et GPIO et le second sur les connecteurs C et D)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Seuls les connecteurs A, B et D disposent d&amp;#8217;un UART hardware. Les UART des connecteurs C et GPIO sont software et seront intégrés dans un firmware futur.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_prise_en_main&quot;&gt;Prise en main&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Démarrer avec la Tessel est super simple, en particulier pour quelqu&amp;#8217;un qui est familier avec Node.js.
Tout est basé sur Node.js: les outils et le code à produire.
Toutes les APIs core de Node.js ne sont cependant pas implémentées sur le Tessel comme l&amp;#8217;indique une page dédiée de la &lt;a href=&quot;https://tessel.io/docs/compatibility&quot;&gt;documentation&lt;/a&gt;.
Je n&amp;#8217;ai pas regardé si c&apos;était gếnant ou pas.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La &lt;a href=&quot;http://tesseil.io/start&quot;&gt;&lt;em&gt;page de démarrage&lt;/em&gt;&lt;/a&gt; vous prend la main pour commencer en douceur.
Il faut commencer par installer l&amp;#8217;outil CLI et les drivers USB. Sur linux, c&amp;#8217;est assez simple :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;sudo npm install -g tessel&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;suivi de&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;sudo tessel install-drivers&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cela se termine en suivant les instructions pour mettre à jour le firmware :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/tessel_update.png&quot; alt=&quot;Update de firmware&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour vérifier que tout fonctionne, une commande permet d&amp;#8217;exécuter un bout de code rudimentaire qui fait clignoter les leds sur la carte :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;tessel blink&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;__hello_world&quot;&gt;&quot;Hello World&quot;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On fait son premier programme en suivant la doc. Un copier/coller du code suivant dans le fichier blinky.js et on est prêt !&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint javascript language-javascript&quot;&gt;&lt;code&gt;// Import the interface to Tessel hardware
var tessel = require(&apos;tessel&apos;);

// Set the led pins as outputs with initial states
// Truthy initial state sets the pin high
// Falsy sets it low.
var led1 = tessel.led[0].output(1);
var led2 = tessel.led[1].output(0);

setInterval(function () {
    console.log(&quot;I&apos;m blinking! (Press CTRL + C to stop)&quot;);
    // Toggle the led states
    led1.toggle();
    led2.toggle();
}, 100);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Il est possible de lancer le code depuis sa console :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;tessel run blinky.js&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Si on veut que son programme reste sur la carte, il faut &quot;flasher&quot; son code avec la commande :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;tessel push blinky.js&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That&amp;#8217;all !&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_premi_res_conclusions&quot;&gt;Premières conclusions&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La carte est très simple d&amp;#8217;accès. Reste à voir comment aller plus loin pour mieux exploiter ses capacités aussi bien au niveau réseau (via Wifi) qu&amp;#8217;au niveau hardware.
Mes premiers essais ont montrés qu&amp;#8217;on peut facilement se connecter en Wifi mais je n&amp;#8217;ai pas encore fait de serveur Web dessus par exemple (mon prochain article ?).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Malgré tout ces points encourageant, je ne sais pas si j&amp;#8217;acheterais cette carte.
Elle est assez cher (&lt;a href=&quot;https://www.trycelery.com/shop/TEC&quot;&gt;75 $ sur le site web officiel&lt;/a&gt;).
Je n&amp;#8217;ai pas une vision globale du marché pour comparer avec une carte équivalente.
Dans mes cartons, j&amp;#8217;ai une carte STM Nucleo qui se rapproche de la Tessel en terme de capacité hardware que j&amp;#8217;ai achetée environ 11 € &amp;#8230;
Je ne suis peut-être pas non plus la cible des utilisateurs (JavaScript).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>Réseau &quot;low cost&quot; d&amp;#8217;objets connectés en DIY avec le RS485</title>
      <link>http://lhuet.github.io/blog/2014/10/iot-arduino-rs485.html</link>
      <pubDate>dim., 5 oct. 2014 00:00:00 +0200</pubDate>
      <guid isPermaLink="false">http://lhuet.github.io/blog/2014/10/iot-arduino-rs485.html</guid>
      	<description>
	&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Une installation domotique est constituée de multiples capteurs et autres objets connectés (buzzword oblige). L&amp;#8217;aspect communication est un élément clé de ce type d&amp;#8217;installation. J&amp;#8217;ai cherché à résoudre ce problème dans l&amp;#8217;esprit du DIY et vous restitue dans ce billet la solution que j&amp;#8217;ai commencée à mettre en oeuvre.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_r_seau_rs485&quot;&gt;Réseau RS485&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Je n&amp;#8217;ai pas retenu les solutions à base de bus &quot;industriels&quot; (KNX par exemple) ou de composants &quot;sans fils&quot; du marché (ZigBee, Wifi, &amp;#8230;). En effet, ce type de solution requiert un composant de communication assez couteux. Ce surcoût dépend beaucoup de la technologie. Cela peut aller de 10/15€ à plusieurs dizaines d&amp;#8217;euros.
Pour du Wifi par exemple, on peut trouver des éléments à base de CC3000 chez &lt;a href=&quot;https://www.sparkfun.com/products/12072&quot;&gt;SparkFun&lt;/a&gt; ou &lt;a href=&quot;http://www.adafruit.com/product/1469&quot;&gt;Adafruit&lt;/a&gt; pour une trentaine d&amp;#8217;euros. Si vous avez juste besoin d&amp;#8217;activer un relais ou de récupérer une température, le cout de l&apos;élément de communication devient prépondérant !&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mon choix s&amp;#8217;est porté sur une solution à base de &lt;a href=&quot;http://fr.wikipedia.org/wiki/EIA-485&quot;&gt;RS485&lt;/a&gt;. En effet, il s&amp;#8217;agit d&amp;#8217;un bus série avec les caractéristiques suivantes :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;32 &quot;devices&quot; possibles sur le même bus&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jusqu&apos;à 100kbits/s sur une longueur d&amp;#8217;environ 1000 m&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Half-duplex (du full-duplex pourrait se faire en RS422)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sa mise en oeuvre est plutôt aisée :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;utilisation de cables simples (paires torsadées de cable téléphonique par ex.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;transceiver&quot; bon marché&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;liaisons série UART répandues (Raspbery Pi, Arduino, &amp;#8230;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;J&amp;#8217;ai choisi les &lt;a href=&quot;http://datasheets.maximintegrated.com/en/ds/MAX1487-MAX491.pdf&quot;&gt;composants MAX485&lt;/a&gt; qui sont très courant :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/max485.jpg&quot; alt=&quot;IC MAX485&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/max485_pinconfig.png&quot; alt=&quot;Configuration des pins du MAX485&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_objets_connect_s_avec_arduino&quot;&gt;Objets connectés avec Arduino&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/arduino-mini-pro.jpg&quot; alt=&quot;Arduino Mini Pro&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour connecter les capteurs, j&amp;#8217;ai choisi d&amp;#8217;utiliser des arduinos dans la version &quot;mini&quot; pour son coût modique et sa très grosse communauté (et les librairies qui vont avec) !&lt;br&gt;
Les arduinos permettent d&amp;#8217;utiliser à peu près n&amp;#8217;importe quel capteur en offrant :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;une dizaine de GPIO (entrée/sorties digitales)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;des entrées (6) et sorties analogiques (6 PWM)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;de l&amp;#8217;I2C / SPI / UART (utilisée pour la communication sur le bus RS485).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le choix Arduino ouvre donc pas mal de possibilités.&lt;br&gt;
Le bus RS485 n&amp;#8217;apporte cependant que la partie physique du réseau sans aucun protocole de communication. Ce protocole doit donc être implémenté sur les cartes arduino.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_r_seau_low_cost&quot;&gt;Réseau &quot;low cost&quot;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Comme pour beaucoup de projet en DIY, le coût est très faible.
Pour la liaison RS485, on peut trouver des MAX485 pour &lt;a href=&quot;http://www.ebay.fr/itm/5PCS-MAXIM-MAX485CPA-MAX485-DIP-8-RS-485-RS-422-Transceiver-/130757415748?_trksid=p3984.m1497.l2649&amp;amp;ssPageName=STRK:MEWNX:IT&quot;&gt;à peine plus d&amp;#8217;1 € les 5 sur ebay&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour les arduinos, on peut trouver des &quot;mini pro&quot; &lt;a href=&quot;http://cgi.ebay.fr/New-Pro-Mini-atmega328-Board-5V-16M-Replace-ATmega128-Arduino-Compatible-Nano-/131278764259?pt=LH_DefaultDomain_0&amp;amp;hash=item1e90d2f8e3&quot;&gt;à moins de 2 €&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Au final, la &quot;stack&quot; pour connecter un objet coute de l&amp;#8217;ordre de &lt;strong&gt;2 euros&lt;/strong&gt; !&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La mise en oeuvre d&amp;#8217;un POC sera abordée dans mon prochain billet. En voici un aperçu pour vous donner l&amp;#8217;eau à la bouche ;-)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/poc_rs485_oscillo.jpg&quot; alt=&quot;IC MAX485&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>Groovy, Gradle and Vert.x on Beaglebone with GVM</title>
      <link>http://lhuet.github.io/blog/2014/06/gvm-on-beaglebone.html</link>
      <pubDate>lun., 23 juin 2014 00:00:00 +0200</pubDate>
      <guid isPermaLink="false">http://lhuet.github.io/blog/2014/06/gvm-on-beaglebone.html</guid>
      	<description>
	&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://gvmtool.net/&quot;&gt;GVM - the Groovy enVironment Manager&lt;/a&gt; is a great tool for managing multiple versions of Groovy, Grails, Gradle, &amp;#8230;
If you want to use Groovy, Vert.x and Gradle on Beaglebone like me, you have to check/install GVM dependencies.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Generally, Debian distrib. is used with Beaglebone and Raspberry Pi.
You can use the latest JDK from &lt;a href=&quot;http://www.oracle.com/technetwork/java/javase/downloads/jdk8-arm-downloads-2187472.html&quot;&gt;Oracle&lt;/a&gt;.
While the JDK tar.gz file is uncompressed, you can add the following lines on my &lt;code&gt;~/.profile&lt;/code&gt; file&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;PATH=&quot;$PATH:$HOME/jdk1.8.0/bin&quot;
JAVA_HOME=&quot;$HOME/jdk1.8.0/bin&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To check the JDK installation, use the &lt;code&gt;java -version&lt;/code&gt; command&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;debian@beaglebone:~$ java -version
java version &quot;1.8.0&quot;
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) Client VM (build 25.0-b70, mixed mode)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GVM is a bash tool and depends only on curl and unzip.
Unfortunately, unzip is not installed by default.
You&amp;#8217;ll have to install these dependencies with a command like&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;sudo apt-get install curl unzip&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can now install GVM easily with the following command lines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;curl -s get.gvmtool.net | bash
source ~/.gvm/bin/gvm-init.sh&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To check the installation, you can use the &lt;code&gt;gvm version&lt;/code&gt; command&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;debian@beaglebone:~$ gvm version
Groovy enVironment Manager 1.3.13&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The latest version of Groovy, Gradle and vert.x can be installed with the following commands&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;gvm install groovy
gvm install vertx
gvm install gradle&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following command tells you which Vert.x versions are installed / available&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;debian@beaglebone:~$ gvm list vertx

================================================================================
Available Vertx Versions
================================================================================
 &amp;gt; * 2.1
     2.0.2-final
     2.0.1-final
     2.0.0-final
     1.3.1.final
     1.3.0.final
     1.2.2.final
     1.2.1.final
     1.2.0.final
     1.1.0.final

================================================================================
+ - local version
* - installed
&amp;gt; - currently in use
================================================================================&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can check Vert.x installation with the following command&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;debian@beaglebone:~$ vertx version
2.1 (built 2014-05-27 12:39:02)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And now, you are ready to use &lt;a href=&quot;http://vertx.io/&quot;&gt;Vert.x&lt;/a&gt; on Beaglebone :-)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>&quot;LikeBox&quot; du BreizhCamp</title>
      <link>http://lhuet.github.io/blog/2014/06/likebox.html</link>
      <pubDate>lun., 9 juin 2014 00:00:00 +0200</pubDate>
      <guid isPermaLink="false">http://lhuet.github.io/blog/2014/06/likebox.html</guid>
      	<description>
	&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;L&apos;édition 2014 du &lt;a href=&quot;http://www.breizhcamp.org&quot;&gt;BreizhCamp&lt;/a&gt; a été l&amp;#8217;occasion pour la team d&amp;#8217;innover en mettant en place un boitier de vote pour récupérer le feedback des participants à la sortie de chaque conférence.
L&amp;#8217;idée n&apos;était pas si originale que cela puisque nous avons découvert en cours de réalisation que Devoxx France allait également avoir ce type de boitier.
Bien évidemment, le notre était beaucoup mieux :-p&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/boitier_vote/boitier_final.jpeg&quot; alt=&quot;LikeBox&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Dans cet article, je me focalise sur la partie technique à l&amp;#8217;intérieur du boitier.
&lt;a href=&quot;http://blog.loof.fr/2014/06/votre-avis-nous-interesse-aka-likebox.html&quot;&gt;Nicolas&lt;/a&gt; donne un autre point de vue sur la partie organisationnelle / habillage du hardware / marketing / whatever &amp;#8230;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_de_l_id_e_au_prototype&quot;&gt;De l&amp;#8217;idée au prototype&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;L&amp;#8217;idée de départ était de voir ce qu&amp;#8217;on pouvait mettre en place pour que les participants puissent s&amp;#8217;exprimer autrement qu&amp;#8217;en mettant une croix sur une feuille A3 (solution utilisée pour l&apos;édition 2013).
Intéressé par le hardware, c&amp;#8217;est naturellement par ce coté que j&amp;#8217;ai commencé.
Le premier prototype fait sur un coin de table était à base d&amp;#8217;arduino :&lt;/p&gt;
&lt;/div&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;iframe width=&quot;640&quot; height=&quot;480&quot; src=&quot;//www.youtube.com/embed/y5-cCQxtZTw&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le code n&apos;était pas d&amp;#8217;une finesse extrême, mais c&apos;était un prototype fonctionnel !
Pour ceux que ça intéresse, vous pouvez le retrouver &lt;a href=&quot;http://lhuet.github.io/blog/boitier_vote/boitiervote.ino&quot;&gt;ici&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Au delà de l&amp;#8217;aspect technique, ce prototype a été une base de discussion avec la team sur les fonctionnalités à mettre en oeuvre :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Nombre de boutons (2, 3, +) ?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ecran texte ou Ecran graphique ?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Forme/Type de bouton ?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Intégration de l&amp;#8217;ensemble&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;#8230;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_choix_techniques&quot;&gt;Choix techniques&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Globalement, les choix techniques du coeur du boitier ont été guidés par les compétences de l&apos;équipe, le matériel dejà disponible et le coût.
Le leitmotiv de l&apos;équipe a été de faire &lt;strong&gt;simple&lt;/strong&gt; et &lt;strong&gt;robuste&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_c_t_hardware&quot;&gt;Côté hardware&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La partie hardware est constitué de 3 élements principaux :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Les boutons de vote (interaction avec les utilisateurs &amp;#8230; donc aspect fondamental du boitier)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L&apos;écran de visualisation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La carte contenant pour faire tourner la partie software&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour les boutons de vote, le bouton type &quot;champignon&quot; nous est paru essentiel.
Cela a été le choix le plus difficile à faire compte tenu du nombre de boutons disponibles sur le marché et de la diversité des tarifs.
Pour les côtés robuste et visuel, nous avons retenu des boutons métaliques industriels et passé commande chez &lt;a href=&quot;http://fr.farnell.com/itw-switches/76-9450-439088r/commutateur-rouge-domed/dp/241520?MER=en-me-pd-r2-alte-swi&quot;&gt;Farnell&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/boitier_vote/green_switch.jpg&quot; alt=&quot;Bouton &apos;Domed&apos;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour les écrans, j&amp;#8217;ai fait quelques tests avec divers écrans LCD Texte 2/4 lignes, LCD graphique entre 2 et 3&quot;.
Au final, nous avons retenu l&apos;écran LCD Texte sur 4 lignes avec un fond bleu pour des questions de lisibilité et de simplicité.
Une version avec bus I2C a été choisie dans un souci de simplicité de cablage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/boitier_vote/ecrans.jpg&quot; alt=&quot;Test d&apos;écrans&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour la carte principale, le choix a été rapide : Raspberri Pi.
Nous n&apos;étions pas nombreux à avoir de l&amp;#8217;expérience sur Arduino et nous avions plusieurs Raspberry Pi (pas d&amp;#8217;achat à prévoir de ce coté).
L&amp;#8217;arduino aurait été une solution plus robuste mais la Raspberry Pi apportait d&amp;#8217;autres possibilités (sortie HDMI pour gérer un autre affichage, connectivité réseau intégré, &amp;#8230;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Allez hop, les commandes ont été passées et nous étions prêt pour notre soirée montage avec la matière première :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/boitier_vote/pieces.jpg&quot; alt=&quot;Pièces avant montage&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/alexlg&quot;&gt;Alexandre&lt;/a&gt; nous a préparé pour l&amp;#8217;occasion un joli schéma &lt;a href=&quot;http://fritzing.org/&quot;&gt;Fritzing&lt;/a&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/boitier_vote/wiring.jpg&quot; alt=&quot;Schéma Fritzing&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alexandre a même optimisé / conçu le cablage pour avoir une mise en oeuvre la plus simple possible :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;pas de condensateur anti-rebond (gestion coté soft)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;boutons en mode &lt;em&gt;pull up&lt;/em&gt; (plus de pins GND disponibles que de 3.3 V)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_c_t_software&quot;&gt;Côté software&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les sources sont disponibles sur Github dans &lt;a href=&quot;https://github.com/BreizhJUG/breizhcamp-vote&quot;&gt;repo dédié&lt;/a&gt;.
Dans le contexte du BreizhCamp, le développement a été guidé par la simplicité de mise en oeuvre et par la robustesse.
En termes de spécifications, cela peut se traduire par :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;je branche &amp;#8594; ça marche&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;je m&amp;#8217;endors sur le bouton &amp;#8594; pas grave, un seul vote est pris en compte&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tolérant aux pannes réseau (réseau filaire que la team a mis en place)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;support des changements de programme de dernière minute&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;boitiers autonomes et envoi des votes régulièrement à un serveur si c&amp;#8217;est possible&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Il y a 2 parties software :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/BreizhJUG/breizhcamp-vote/tree/master/client&quot;&gt;la partie cliente&lt;/a&gt; sur le boitier de vote&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/BreizhJUG/breizhcamp-vote/tree/master/server&quot;&gt;la partie serveur&lt;/a&gt; qui aggrège les données de l&amp;#8217;ensemble des boitiers de vote (nous en avions 5) et les expose sous forme d&amp;#8217;API REST.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour faire simple et léger (en particulier sur le Raspberry Pi), &lt;a href=&quot;http://nodejs.org/&quot;&gt;Node.js&lt;/a&gt; a été choisi.
En plus de la légèreté, la diversité de ses modules, notamment pour l&amp;#8217;interfaçage Hardware, a contribué à ce choix.
Les principaux modules utilisés sont :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/fivdi/onoff&quot;&gt;onoff&lt;/a&gt; pour gérer les boutons (GPIO)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/wilberforce/lcd-pcf8574&quot;&gt;lcd-pcf8574&lt;/a&gt; pour gérer l&apos;écran LCD 4 lignes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/mapbox/node-sqlite3&quot;&gt;sqlite3&lt;/a&gt; pour stocker localement les données de vote dans une base de données fichier SQLite3.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/danwrong/restler&quot;&gt;restler&lt;/a&gt; pour l&amp;#8217;implémentation du client REST sur les boitiers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.npmjs.org/package/express&quot;&gt;express&lt;/a&gt; pour la partie serveur&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les modules cités vous auront déjà donnés la puce à l&amp;#8217;oreille. La communication entre les boitiers et le serveur se fait uniquement sur HTTP (simple API REST).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La restitution est réalisée avec une simple &lt;a href=&quot;https://github.com/BreizhJUG/breizhcamp-vote/blob/master/server/static/index.html&quot;&gt;page Web&lt;/a&gt; sur laquelle on n&amp;#8217;est pas peu fier de retrouver sa session ;-) :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/boitier_vote/top5.jpg&quot; alt=&quot;Top 5 des talks&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tout n&amp;#8217;a pas été aussi rose, nous avions un peu sous-estimé le temps de mise en oeuvre, notamment des copies de cartes SD.
En effet, copier une carte SD de 8Go peut parfois prendre plus de 40mn.
Ceci étant, une fois les boitiers en place et les rares bugs corrigés (dont un souci de performances sur un module node &amp;#8230; coté serveur), tout à fonctionné à merveille !&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/boitier_vote/boitier_final_bzhcmp2.jpg&quot; alt=&quot;Boitier en fonctionnement&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Au final, ce système a permis de prendre en compte près de &lt;strong&gt;2500 votes&lt;/strong&gt; !&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Je tiens à conclure pour souligner que ceci résulte d&amp;#8217;un véritable travail d&apos;équipe :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Infrastructure réseau (5 routeurs configurés dans chaque salle sur lesquels les boitiers étaient reliés au réseau)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Montage de l&amp;#8217;ensemble des boitiers en une soirée par toute l&apos;équipe&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Développement &lt;a href=&quot;https://github.com/BreizhJUG/breizhcamp-vote/graphs/contributors&quot;&gt;du code à 4&lt;/a&gt; (je me compte dedans même si j&amp;#8217;ai plus été &quot;product owner&quot; que développeur)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Préparation de l&amp;#8217;intégration (plaques plexi, pieds, &amp;#8230;) par Nicolas et son fils Julien&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Montage de 3 TV en HDMI sur 3 des boitiers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configuration système de l&amp;#8217;ensemble des éléments (boitiers et serveur)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Prochaine étape : Diffusion du projet sur le portfolio du &lt;a href=&quot;http://www.labfab.fr/&quot;&gt;LabFab&lt;/a&gt; prêt à promouvoir notre &lt;em&gt;LikeBox&lt;/em&gt; en vue d&amp;#8217;une réutilisation sur d&amp;#8217;autres évènements.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>Teleinfo - Préparation d&amp;#8217;une Raspberry Pi</title>
      <link>http://lhuet.github.io/blog/2014/01/teleinfo-raspberrypi.html</link>
      <pubDate>dim., 26 janv. 2014 00:00:00 +0100</pubDate>
      <guid isPermaLink="false">http://lhuet.github.io/blog/2014/01/teleinfo-raspberrypi.html</guid>
      	<description>
	&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Vous avez lu attentivement mon post précédent sur le &lt;a href=&quot;http://lhuet.github.io/blog/2014/01/montage-teleinfo.html&quot;&gt;montage teleinfo&lt;/a&gt;, récupéré l&amp;#8217;optocoupleur qui va bien et sorti votre Raspberry Pi du placard. Maintenant, vous être prêt à passer à la partie soft.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_pr_paration_de_l_0s&quot;&gt;Préparation de l&amp;#8217;0S&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_la_carte_sd&quot;&gt;La carte SD&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le point de départ est la distribution &lt;a href=&quot;http://www.raspberrypi.org/downloads&quot;&gt;raspbian officielle&lt;/a&gt; que vous devez télécharger. Pour flasher une carte SD, je vous suggère de suivre les instructions sur le site &lt;a href=&quot;http://elinux.org/RPi_Easy_SD_Card_Setup&quot;&gt;elinux.org&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Si vous êtes sous linux, vous pouvez utiliser une commande du genre :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre&gt;dd bs=4M if=./2013-09-25-wheezy-raspbian.img of=/dev/sdb&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Attention, dans mon cas, &lt;code&gt;/dev/sdb&lt;/code&gt; correspond à ma carte SD. Ne pas copier/coller cette ligne &quot;à l&amp;#8217;aveugle&quot; &amp;#8230; Si &lt;code&gt;/dev/sdb&lt;/code&gt; correspond chez vous à un disque dur, vous risquez d&amp;#8217;avoir quelques sueurs froides !&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_d_sactivation_de_la_console_s_rie&quot;&gt;Désactivation de la console série&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La Raspberry Pi ne dispose que d&amp;#8217;un seul port série. Celui-ci est utilisé par défaut pour avoir une console. Il faut donc libérer le port série pour le montage téléinfo.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Désactiver de la console série au boot en modifiant le fichier &lt;code&gt;/boot/cmdline.txt&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre&gt;dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;à remplacer par :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre&gt;dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Désactiver la console &lt;code&gt;getty&lt;/code&gt; en modifiant le fichier &lt;code&gt;/etc/inittab&lt;/code&gt;. Il suffit de commenter la dernière ligne du fichier (ajout d&amp;#8217;un &lt;code&gt;#&lt;/code&gt;):&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre&gt;#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_logguer_les_donn_es_dans_une_base_a_href_http_www_mongodb_org_mongodb_a&quot;&gt;Logguer les données dans une base &lt;a href=&quot;http://www.mongodb.org/&quot;&gt;MongoDB&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cette partie corresond à l&amp;#8217;installation et la configuration d&amp;#8217;un programme &lt;a href=&quot;http://nodejs.org/&quot;&gt;nodejs&lt;/a&gt; pour logguer les infos dans une base MongoDB. Dans mon cas, j&amp;#8217;utilise une formule d&amp;#8217;hébergement gratuite avec 512 Mo chez &lt;a href=&quot;https://mongolab.com/&quot;&gt;MongoLab&lt;/a&gt;. Vous pouvez choisir n&amp;#8217;importe quel fournisseur à ce niveau (&lt;a href=&quot;http://www.mongohq.com/&quot;&gt;MongoHQ&lt;/a&gt; offre le même type de formule par exemple).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_installation_de_nodejs&quot;&gt;Installation de nodejs&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Il y a quelques temps, il était difficile de trouver une version nodejs pour processeur ARM. Il fallait donc compiler les sources sur Raspberry Pi (~45 mn de temps de compilation) ou, pour les plus avertis, en &quot;Cross Compiling&quot; (moins de 2mn sur mon core i7). Désormais, une version officielle est disponible mais pas toujours dans la dernière version. Il faut donc fouiller dans les répertoires &lt;a href=&quot;http://nodejs.org/dist/&quot;&gt;http://nodejs.org/dist/&lt;/a&gt;. La dernière version à ce jour est la &lt;a href=&quot;http://nodejs.org/dist/v0.10.24/node-v0.10.24-linux-arm-pi.tar.gz&quot;&gt;v0.10.24&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;L&amp;#8217;installation consiste uniquement à décompresser l&amp;#8217;archive :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre&gt;tar -xzvf node-v0.10.24-linux-arm-pi.tar.gz&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Si vous installez nodejs dans le répertoire &lt;code&gt;/opt&lt;/code&gt;, vous pouvez ajouter les lignes suivantes au fichier &lt;code&gt;/etc/profile&lt;/code&gt; pour positionner les variables d&amp;#8217;environnement pour node :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;NODE_JS_HOME=&quot;/opt/node&quot;
PATH=&quot;$PATH:$NODE_JS_HOME/bin&quot;
NODE_PATH=&quot;$NODE_JS_HOME/lib/node_modules&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_application_nodejs&quot;&gt;Application nodejs&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Vous pouvez commencer en utilisant mon application (en cours de développement) en clonant le repo git associé :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre&gt;git clone https://github.com/lhuet/teleinfo-app.git&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour obtenir les dépendances node, utilisez la commande classique node :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre&gt;npm install -g&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le programme va chercher les éléments de configuration dans des variables d&amp;#8217;environnement que vous pouvez positionner avec la commandes suivantes :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;export MONGO_LOGIN=&quot;LOGIN_MONGOLAB&quot;
export MONGO_PASSWORD=&quot;PASSWORD_MONGOLAB&quot;
export MONGO_HOST=&quot;HOST_MONGOLAB&quot;
export MONGO_PORT=&quot;PORT_MONGOLAB&quot;
export MONGO_DATABASE=&quot;BASE_MONGOLAB&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour lancer l&amp;#8217;application manuellement, vous devez positionner ces variables d&amp;#8217;environnement et utiliser la commande :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre&gt;node teleinfo-app.js&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_script_de_d_marrage&quot;&gt;Script de démarrage&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lancer manuellement son application suffit en phase de développement. Pour être certain que le script se lance au démarrage de votre Raspberry Pi, vous devez faire un script du genre :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;prettyprint bash language-bash&quot;&gt;&lt;code&gt;#!/bin/sh
#/etc/init.d/node-teleinfo

export PATH=$PATH:/opt/node/bin
export NODE_PATH=$NODE_PATH:/opt/node/lib/node_modules
export MONGO_LOGIN=&quot;LOGIN_MONGOLAB&quot;
export MONGO_PASSWORD=&quot;PASSWORD_MONGOLAB&quot;
export MONGO_HOST=&quot;HOST_MONGOLAB&quot;
export MONGO_PORT=&quot;PORT_MONGOLAB&quot;
export MONGO_DATABASE=&quot;BASE_MONGOLAB&quot;

case &quot;$1&quot; in
  start)
  exec forever --sourceDir=/home/pi/teleinfo-app -p /tmp teleinfo-app.js
&amp;amp;
  ;;
stop)
  exec forever stop --sourceDir=/home/pi/teleinfo-app teleinfo-app.js
  ;;
*)
  echo &quot;Usage: /etc/init.d/node-teleinfo {start|stop}&quot;
  exit 1
  ;;
esac

exit 0&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La commande suivante permet de configurer votre système pour que le script se lance au démarrage :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre&gt;sudo update-rc.d node-teleinfo defaults&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_pour_la_suite&quot;&gt;Pour la suite &amp;#8230;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Maintenant que les données sont stockées, il va falloir les restituer ! Je n&amp;#8217;ai pas encore beaucoup avancé sur cette partie. J&amp;#8217;ai commencé à intégrer express pour avoir des infos &quot;live&quot; (puissance instantanée, intensité instantanée et index) . Il reste toute la partie exploitation des données.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;J&amp;#8217;ai oublié de le préciser, mais j&amp;#8217;accepte les pull-requests ;-)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A suivre donc.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>Montage teleinfo pour Raspberry Pi / BeagleBone</title>
      <link>http://lhuet.github.io/blog/2014/01/montage-teleinfo.html</link>
      <pubDate>dim., 19 janv. 2014 00:00:00 +0100</pubDate>
      <guid isPermaLink="false">http://lhuet.github.io/blog/2014/01/montage-teleinfo.html</guid>
      	<description>
	&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cela fait quelques mois que j&amp;#8217;ai testé et mis en place un montage simple pour brancher mon compteur EDF sur Beaglebone et Raspberry Pi. Je vous restitue donc tout ce qu&amp;#8217;il faut pour reproduire celui-ci chez vous. L&amp;#8217;inspiration de ce montage provient du forum &lt;a href=&quot;http://www.chaleurterre.com/forum/viewtopic.php?p=51607#p51607&quot;&gt;chaleurterre.com&lt;/a&gt;. J&amp;#8217;ai finalisé ce montage avec l&amp;#8217;aide de zzdomi du forum &lt;a href=&quot;http://www.touteladomotique.com/forum/viewtopic.php?f=30&amp;amp;t=1513&amp;amp;start=576&quot;&gt;touteladomotique.com&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_principe&quot;&gt;Principe&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le compteur EDF fourni un signal appelé téléinfo pouvant être transformé en signal série TTL compatible avec les cartes Raspberry Pi ou BeagleBone. Les spécifications du signal teleinfo et de son protocole sont disponibles sur le &lt;a href=&quot;http://www.erdf.fr/sites/default/files/ERDF-NOI-CPT_02E.pdf&quot;&gt;site d&amp;#8217;ERDF en PDF&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;L&amp;#8217;objet du montage de ce post est de réaliser cette transformation pour obtenir un signal compatible avec les UART des cartes récentes de type Raspberry Pi / BeagleBone / &amp;#8230; (niveaux en 3.3V).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le signal teleinfo des compteurs EDF doit être activé (configuration interne du compteur). Si ce signal n&amp;#8217;est pas activé, il faut demander à EDF de venir chez vous le configurer. En effet, la configuration est réalisée sur la partie haute du compteur &amp;#8230; qui vous est interdite d&amp;#8217;accès (plombage). Ayant un compteur configuré dès son installation, je ne pourrais pas vous guider plus sur la démarche à suivre.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_bornier_client_compteur_edf&quot;&gt;Bornier client compteur EDF&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le bornier client du compteur EDF se situe sur sa partie basse comme le montre le schéma suivant :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/teleinfo_compteur.jpg&quot; alt=&quot;Bornier compteur EDF teleinfo&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les bornes I1 et I2 fournissent le signal convoité. Vous pouvez utiliser du simple cable téléphonique et, dans des conditions optimales, la longueur de ce cable peut aller jusqu&apos;à 500m (donnée des spécifications).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_montage_teleinfo_uart_ttl&quot;&gt;Montage teleinfo &amp;#8594; UART TTL&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le montage utilise uniquement uniquement 3 composants :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1 optocoupleur &lt;a href=&quot;http://www.vishay.com/docs/83675/sfh620a.pdf&quot;&gt;SFH620A&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1 résistance 1.2k&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1 résistance 3.3k&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Attention à prendre la référence exacte de l&amp;#8217;optocoupleur car les latences (de basculement) de celui-ci sont importantes. Inutile donc de chercher des équivalences avec le même montage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Comme le montre le schéma suivant, le montage est assez basique :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/teleinfo_schema.jpg&quot; alt=&quot;Schéma montage Teleinfo&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Vous pouvez tester ce montage sur une carte d&amp;#8217;essai (breadboard) avant de passer à la soudure. Pour cela, utilisez un logiciel capable de lire un port série (screen ou minicom par exemple). Les caractéristiques de la communication sont &quot;1200 7E1&quot;, ie. 1200 bauds, 7 bits de données, parité paire, 1 bit stop.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_cablage_sur_raspberry_pi_beaglebone_black&quot;&gt;Cablage sur Raspberry Pi / Beaglebone Black&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le schéma Fritzing suivant montre le cablage pour la Raspberry Pi :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/teleinfo_rpi.jpg&quot; alt=&quot;Cablage RPi Teleinfo&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La même chose avec la Beaglebone Black :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/teleinfo_bbb.jpg&quot; alt=&quot;Cablage Beaglebone Black Teleinfo&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_pour_aller_plus_loin&quot;&gt;Pour aller plus loin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Après la partie hardware, il faut passer à la partie software. Vous pouvez utiliser les programmes &lt;a href=&quot;https://github.com/lhuet/teleinfo/tree/master/python/home/pi/teleinfo/python&quot;&gt;Python&lt;/a&gt; ou &lt;a href=&quot;https://github.com/lhuet/tarifbleu-node&quot;&gt;JavaScript&lt;/a&gt; (node.js) que j&amp;#8217;ai écrit par exemple.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>Java 7 et 8 sur BeagleBone Black (BBB)</title>
      <link>http://lhuet.github.io/blog/2013/12/jdk7-jdk8-sur-beaglebone.html</link>
      <pubDate>sam., 14 déc. 2013 00:00:00 +0100</pubDate>
      <guid isPermaLink="false">http://lhuet.github.io/blog/2013/12/jdk7-jdk8-sur-beaglebone.html</guid>
      	<description>
	&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mon second post est une réponse détaillée à une question posée par &lt;a href=&quot;https://twitter.com/CodeStory/status/404649263134941185&quot;&gt;@CodeStory&lt;/a&gt; sur twitter.
140 caractères étaient largement insuffisants ! Ma réponse va également un peu plus loin puisque je compare les performances du JDK7 et du JDK8.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_quel_jdk_pour_beaglebone_black&quot;&gt;Quel JDK pour BeagleBone Black ?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La première question qu&amp;#8217;on peut se poser est : &lt;strong&gt;Quelle version de JDK utiliser ?&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sur le site d&amp;#8217;Oracle, on trouve 2 versions différentes pour le JDK 7:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&quot;Linux ARM v6/v7 Hard Float ABI&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Linux ARM v6/v7 Soft Float ABI&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Aucun JDK8 n&amp;#8217;est proposé sur le site d&amp;#8217;Oracle (pas encore de version finale). On trouve une &quot;Early Access Release&quot; sur &lt;a href=&quot;https://jdk8.java.net/download.html&quot;&gt;jdk8.java.net&lt;/a&gt; sous le nom :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&quot;Linux ARMv6/7 VFP, HardFP ABI&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ces JDK peuvent être utilisés sur BBB (ARM v7) et sur Raspberry Pi (ARM v6) &amp;#8230; mais pas sous n&amp;#8217;importe quelle version d&amp;#8217;OS.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_hard_float_vs_soft_float&quot;&gt;Hard Float vs Soft Float&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&quot;Hard Float&quot; et &quot;Soft Float&quot; sont des termes utilisés pour des jeux d&amp;#8217;instruction spécifiques des processeurs ARM. Historiquement, le JDK d&amp;#8217;Oracle n&apos;était disponible qu&amp;#8217;en version &quot;Soft Float&quot;.
Quelques éléments de réponses se trouvent également dans les slides de mon quickie de Devoxx France 2013 sur &lt;a href=&quot;http://parleys.com/play/5156c4d6e4b0c779d7881405&quot;&gt;parleys&lt;/a&gt;.&lt;br&gt;
Pour faire court, les JDK en version HFP (Hard Float) ne peuvent être utilisés que sur des OS compatible HFP.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_quel_os_utiliser&quot;&gt;Quel OS utiliser ?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La carte BBB est livrée avec une distribution Angström &amp;#8230; qui est compilée en &quot;Soft Float&quot;. Seul le JDK 7 &quot;Soft Float&quot; peut donc être utilisé avec cet OS. Aucune version &quot;Soft Float&quot; du JDK 8 n&amp;#8217;est disponible à ma connaissance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour utiliser les JDK 7 et 8 en version HFP, il faut un Linux compatible. C&amp;#8217;est le cas d&amp;#8217;Ubuntu. Vous pouvez vous inspirez du &lt;a href=&quot;http://learn.adafruit.com/beaglebone-black-installing-operating-systems/overview&quot;&gt;tutoriel d&amp;#8217;Adafruit&lt;/a&gt; pour installer une nouvelle version d&amp;#8217;OS sur la BBB ou, comme je l&amp;#8217;ai fait, booter sur une microSD externe contenant Ubuntu.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_tests_de_performances&quot;&gt;Tests de performances&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;J&amp;#8217;ai repris les mêmes types de tests que pour mon &lt;a href=&quot;http://parleys.com/play/5156c4d6e4b0c779d7881405&quot;&gt;quickie de Devoxx France 2013&lt;/a&gt;, à savoir, des tests &lt;a href=&quot;http://www.dacapobench.org/&quot;&gt;dacapo&lt;/a&gt; (avrora, fop et xalan). Les scores sont ramenés sur une base 100 ayant pour référence les résultats sur JDK7 sur Rapsberry Pi de mon Quickie. J&amp;#8217;ai consigné les valeurs brutes dans un &lt;a href=&quot;http://lhuet.github.io/blog/perfs_jdk7_jdk8_bbb.ods&quot;&gt;fichier LibreOffice&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
Ces tests ont seulement pour objectif de comparer grossièrement les JDK &amp;#8230; et n&amp;#8217;ont fait l&amp;#8217;objet d&amp;#8217;aucune méthodologie, analyse statistique, &amp;#8230; Pour avoir des résultats indiscutables, il faudrait des tests réalisés par des spécialistes de JVM, ce que je ne suis pas !
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Voici donc 2 graphes avec/sans référence à la Raspberry Pi.&lt;/p&gt;
&lt;/div&gt;
&lt;style type=&quot;text/css&quot;&gt;
.legend {
    /* width: 13em; */
    /* border: 1px solid black; */
}

.legend .title {
    display: block;
    margin: 0.2em;
    border-style: solid;
    border-width: 0 0 0 1em;
    padding: 0 0.3em;
}
#perfWithRPiLegend, #perfWithoutRPiLegend {
    /* display: inline-block;
    position: absolute; */
    margin-top: 20px;
}
#perfsWithRPi, #perfsWithoutRPi {
    margin-top:20px;
}
&lt;/style&gt;

&lt;div class=&quot;container&quot;&gt;
    &lt;div class=&quot;row&quot;&gt;
        &lt;div class=&quot;col-md-8 col-md-offset-2&quot;&gt;
            &lt;div class=&quot;panel panel-default&quot;&gt;
                &lt;div class=&quot;row&quot;&gt;
                    &lt;div class=&quot;col-md-8&quot;&gt;
                        &lt;canvas id=&quot;perfsWithoutRPi&quot;&gt;&lt;/canvas&gt;
                    &lt;/div&gt;
                    &lt;div class=&quot;col-md-4&quot;&gt;
                        &lt;div id=&quot;perfWithoutRPiLegend&quot;&gt;&lt;/div&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
                &lt;div class=&quot;panel-footer text-center&quot;&gt;JDK 7/8 SFP/HFP Beaglebone Black&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&quot;row&quot;&gt;
        &lt;div class=&quot;col-md-8 col-md-offset-2&quot;&gt;
            &lt;div class=&quot;panel panel-default&quot;&gt;
                &lt;div class=&quot;row&quot;&gt;
                    &lt;div class=&quot;col-md-8&quot;&gt;
                        &lt;canvas id=&quot;perfsWithRPi&quot;&gt;&lt;/canvas&gt;
                    &lt;/div&gt;
                    &lt;div class=&quot;col-md-4&quot;&gt;
                        &lt;div id=&quot;perfWithRPiLegend&quot;&gt;&lt;/div&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
                &lt;div class=&quot;panel-footer text-center&quot;&gt;JDK 7/8 SFP/HFP BBB et Raspberry Pi&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;script src=&quot;/blog/js/Chart.min.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
/* &lt;a href=&quot;https://github.com/bebraw/Chart.js.legend&quot;&gt;https://github.com/bebraw/Chart.js.legend&lt;/a&gt; */
function legend(parent, data) {
    parent.className = &apos;legend&apos;;
    var datas = data.hasOwnProperty(&apos;datasets&apos;) ? data.datasets : data;

    datas.forEach(function(d) {
        var title = document.createElement(&apos;span&apos;);
        title.className = &apos;title&apos;;
        title.style.borderColor = d.hasOwnProperty(&apos;strokeColor&apos;) ? d.strokeColor : d.color;
        title.style.borderStyle = &apos;solid&apos;;
        parent.appendChild(title);

        var text = document.createTextNode(d.title);
        title.appendChild(text);
    });
}
&lt;/script&gt;
&lt;script&gt;
var data = {
	labels : [&quot;Avrora&quot;,&quot;Fop&quot;,&quot;Xalan&quot;],
	datasets : [
		{
			fillColor : &quot;rgba(0, 69, 134, 0.8)&quot;,
			strokeColor : &quot;rgba(0, 69, 134,1)&quot;,
			data : [100,100,100],
            title : &quot;JDK7 Soft Float - RPi&quot;
		},
		{
			fillColor : &quot;rgba(255, 66, 14, 0.8)&quot;,
			strokeColor : &quot;rgba(255, 66, 14,1)&quot;,
			data : [21.76,41.23,30.35],
            title : &quot;JDK7 Soft Float - BBB&quot;
		},
		{
			fillColor : &quot;rgba(255, 210, 31, 0.8)&quot;,
			strokeColor : &quot;rgba(255, 210, 31,1)&quot;,
			data : [22.9,40,31.07],
            title : &quot;JDK7 Hard Float - BBB&quot;
		},
		{
			fillColor : &quot;rgba(87, 157, 28, 0.8)&quot;,
			strokeColor : &quot;rgba(87, 157, 28, 1)&quot;,
			data : [23.55,42.58,31.49],
            title : &quot;JDK8 Hard Float - BBB&quot;
		}
	]
}
var data2 = {
	labels : [&quot;Avrora&quot;,&quot;Fop&quot;,&quot;Xalan&quot;],
	datasets : [
		{
			fillColor : &quot;rgba(255, 66, 14, 0.8)&quot;,
			strokeColor : &quot;rgba(255, 66, 14,1)&quot;,
			data : [21.76,41.23,30.35],
            title : &quot;JDK7 Soft Float - BBB&quot;
		},
		{
			fillColor : &quot;rgba(255, 210, 31, 0.8)&quot;,
			strokeColor : &quot;rgba(255, 210, 31,1)&quot;,
			data : [22.9,40,31.07],
            title : &quot;JDK7 Hard Float - BBB&quot;
		},
		{
			fillColor : &quot;rgba(87, 157, 28, 0.8)&quot;,
			strokeColor : &quot;rgba(87, 157, 28, 1)&quot;,
			data : [23.55,42.58,31.49],
            title : &quot;JDK8 Hard Float - BBB&quot;
		}
	]
}
var options = {
    scaleOverride: true,
    scaleSteps : 5,
    scaleStepWidth: 20,
    scaleStartValue: 0
}
var options2 = {
    scaleOverride: true,
    scaleSteps : 5,
    scaleStepWidth: 10,
    scaleStartValue: 0
}

function draw() {
    var perfsWithRPi = document.getElementById(&quot;perfsWithRPi&quot;);
    perfsWithRPi.width = perfsWithRPi.parentNode.clientWidth - 30;
    perfsWithRPi.height=350;
    console.log(perfsWithRPi.width);
    var ctx = perfsWithRPi.getContext(&quot;2d&quot;);
    new Chart(ctx).Bar(data, options);

    var perfsWithoutRPi = document.getElementById(&quot;perfsWithoutRPi&quot;);
    perfsWithoutRPi.width = perfsWithoutRPi.parentNode.clientWidth - 30;
    perfsWithoutRPi.height=350;
    var ctx2 = perfsWithoutRPi.getContext(&quot;2d&quot;);
    new Chart(ctx2).Bar(data2, options2);
}
draw();
legend(document.getElementById(&quot;perfWithRPiLegend&quot;), data);
legend(document.getElementById(&quot;perfWithoutRPiLegend&quot;), data2);

window.onresize = function() {
    /* Canvas à redessiner, responsive oblige ! */
    draw();
};
&lt;/script&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;En conclusion, les performances ne sont pas fondamentalement différentes. Si vous êtes sur l&amp;#8217;OS de base sur la Beaglebone, vous n&amp;#8217;avez donc pas besoin d&amp;#8217;en changer &amp;#8230; sauf si vous voulez tester les nouveautés du JDK8.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Autre enseingement : Si vous faites tourner du code Java sur une Raspberry Pi, vous auriez avantage à passer sur Beaglebone Black !&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>Premiers pas avec la BeagleBone Black (BBB)</title>
      <link>http://lhuet.github.io/blog/2013/12/beaglebone-black-overview.html</link>
      <pubDate>dim., 8 déc. 2013 00:00:00 +0100</pubDate>
      <guid isPermaLink="false">http://lhuet.github.io/blog/2013/12/beaglebone-black-overview.html</guid>
      	<description>
	&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mon premier post technique sera sur la carte &lt;a href=&quot;http://www.beagleboard.org/Products/BeagleBone%20Black&quot;&gt;BeagleBone Black&lt;/a&gt; (ma 3ème BeagleBone).
Pas de Java pour le moment, mais ça va venir &amp;#8230; Je préfère commencer par le Hard !&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_pr_sentation_de_la_beaglebone_black&quot;&gt;Présentation de la BeagleBone Black&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Il s&amp;#8217;agit d&amp;#8217;une carte à base de processeur ARMv7 avec un coût relativement modique (~45$) et une consommation électrique faible (de l&amp;#8217;ordre du Watt).
Cette carte est parfois appelée &lt;em&gt;BeagleBone Next-gen&lt;/em&gt;
car elle a été précédée par une première version très proche physiquement : &lt;a href=&quot;http://www.beagleboard.org/Products/BeagleBone&quot;&gt;la BeagleBone&lt;/a&gt;.
Open source &quot;sur toute la ligne&quot; (hardware et software), vous pouvez retrouvez les plans complets sur &lt;a href=&quot;https://github.com/CircuitCo/BeagleBone-Black&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Son rapport &quot;coût/connectivité&quot; est assez intéressant. Ceci en fait un choix pertinent pour des installations de type domotique, robotique, &amp;#8230;
(possibilité de gérer de nombreux capteurs).&lt;br&gt;
Avant d&amp;#8217;aller plus loin, la voici en image :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/CONN_REVA5A.jpg&quot; alt=&quot;Beaglebone Black&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_caract_ristiques_techniques&quot;&gt;Caractéristiques techniques&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_cot_hardware&quot;&gt;Coté hardware&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On retrouve :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CPU ARM Cortex-A8 @1GHz&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;512 Mo RAM DDR3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2 Go eMMC (stockage interne)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ethernet / 1xUSB / µHDMI / MicroSD / 2 ports d&amp;#8217;extension 2x23 pins&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les ports d&amp;#8217;extension méritent un détour. C&amp;#8217;est d&amp;#8217;ailleurs un atout majeur de cette carte :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;65 GPIO (entrée/sortie numérique)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;8 PWM (&quot;Pulse Width Modulation&quot; ~ sorties analogiques pour caricaturer)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;7 entrées analogiques&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;5 UART (ports série)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bus divers (3 I2C, 1 SPI, 1 CAN)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Il y a d&amp;#8217;autres possibilités pour une utilisation plus avancée (PRU, Timers, &amp;#8230;) sur lesquels je ne vais pas aller plus loin (pour le moment).
Pour avoir plus de détails, vous pouvez consulter la dernière version
de la &lt;a href=&quot;https://github.com/CircuitCo/BeagleBone-Black/blob/master/BBB_SRM.pdf?raw=true&quot;&gt;documentation de référence&lt;/a&gt; disponible sur le projet &lt;a href=&quot;https://github.com/CircuitCo/BeagleBone-Black&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_cot_software&quot;&gt;Coté software&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Il ne s&amp;#8217;agit pas d&amp;#8217;une carte avec micro-controlleur (ARM Cortex-M, Atmel sur Arduino, &amp;#8230;) mais d&amp;#8217;une carte avec un micro-processeur.
Cela signifie que cette carte fonctionne avec un OS.
Même si cet environnement est restreint, vous êtes très proche de ce que vous pourriez avoir sur n&amp;#8217;importe quel système avec OS.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les OS connus pour fonctionner sont (liste non exhaustive) :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Linux (Angstöm, Debian, Ubuntu, &amp;#8230;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Android&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;QNX&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;FreeBSD&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_quelles_diff_rences_avec_la_raspberrypi&quot;&gt;Quelles différences avec la RaspberryPi ?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les différences majeures portent sur:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;le CPU : de génération différente (ARMv7 vs ARMv6), la beaglebone est un cran au dessus (non négligeable pour exécuter du Java !).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;la connectique : Cf. la liste ci-dessus, il n&amp;#8217;y a pas photo ! La beaglebone est beaucoup plus complète.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;le GPU : Capable de décoder des vidéos HD, la RaspberryPi est par contre meilleure dans ce domaine.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour le reste, il y a eu plein d&amp;#8217;articles comparatifs sur le web.
Celui sur le site &lt;a href=&quot;http://makezine.com/magazine/how-to-choose-the-right-platform-raspberry-pi-or-beaglebone-black/&quot;&gt;makezine.com&lt;/a&gt; me paraît pas trop mal.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour résumer, la beaglebone est plus puissante que la Raspberry Pi sauf pour une utilisation multimédia.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_par_o_commencer&quot;&gt;Par où commencer ?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_d_marrage&quot;&gt;Démarrage&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le démarrage est extrêmement simple.
En effet, la beaglebone est livrée avec une distribution Linux pré-installée (distribution &lt;a href=&quot;http://www.angstrom-distribution.org/&quot;&gt;Angstöm&lt;/a&gt; orientée embarqué).
Pas besoin de préparer une carte SD comme avec la Raspberry Pi. Tout ce qu&amp;#8217;il y a à faire, c&amp;#8217;est de brancher l&amp;#8217;alimentation !
Ecran/Clavier/Souris sont optionnels si vous utilisez une connexion réseau.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;_alimentation_via_usb_5v&quot;&gt;Alimentation via USB / 5V&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La BBB a besoin d&amp;#8217;une alimentation en 5V. Pour faciliter le démarrage, vous n&apos;êtes pas obligé d&amp;#8217;avoir une alimentation externe.
Vous pouvez utiliser le cable USB fourni pour le brancher directement sur votre PC en utilisant le connecteur mini-USB coté BBB.
Dans ce cas, un disque partagé sera mis à disposition (USB Mass Storage) sur lequel vous trouverez la documentation et les éventuels drivers requis.
Si vous êtes, comme moi, sous Linux, vous n&amp;#8217;aurez besoin d&amp;#8217;aucun driver pout disposer de l&amp;#8217;interface réseau &quot;USB to LAN&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/bbb_usb_pc.jpg&quot; alt=&quot;Accès SSH sur Beaglebone Black&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;_services_disponibles&quot;&gt;Services disponibles&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Si vous utilisez un cable ethernet, la BBB utilisera votre DHCP pour obtenir une adresse IP.
Si vous utilisez le cable USB fourni, vous aurez une interface réseau sur votre PC mise à disposition par la carte sur l&amp;#8217;IP 192.168.7.1.
La BBB aura l&amp;#8217;IP 192.168.7.2. Le login root a un mot de passe vide par défaut. Vous pouvez donc vous connecter par SSH très facilement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/bbb_ssh.png&quot; alt=&quot;Accès SSH sur Beaglebone Black&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Un environnement de développement JavaScript (Cloud9) est également mis à disposition avec une version (un peu ancienne) de node.js.
La librairie &lt;a href=&quot;https://github.com/jadonk/bonescript&quot;&gt;BoneScript&lt;/a&gt; fournie permet d&amp;#8217;avoir une API &quot;arduino like&quot;.
Ce service est disponible sur l&amp;#8217;URL &lt;a href=&quot;http://192.168.7.1:3000&quot;&gt;http://192.168.7.1:3000&lt;/a&gt; avec quelques exemples pour démarrer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot; style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/blog/img/bbb_cloud9.jpg&quot; alt=&quot;Cloud9 sur Beaglebone Black&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_aller_plus_loin_et_changer_d_os&quot;&gt;Aller plus loin &amp;#8230; et changer d&amp;#8217;OS&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour aller plus loin, vous aurez certainement envie de changer d&amp;#8217;OS pour, par exemple,
installer &lt;a href=&quot;http://elinux.org/BeagleBoardUbuntu&quot;&gt;Ubuntu&lt;/a&gt; et disposer d&amp;#8217;un OS compatible avec le dernier build du &lt;a href=&quot;https://jdk8.java.net/download.html&quot;&gt;JDK8&lt;/a&gt; (version &quot;Hard Floating Point&quot;).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>
    <item>
      <title>Yet another blog !</title>
      <link>http://lhuet.github.io/blog/2013/12/yet-another-blog.html</link>
      <pubDate>dim., 1 déc. 2013 00:00:00 +0100</pubDate>
      <guid isPermaLink="false">http://lhuet.github.io/blog/2013/12/yet-another-blog.html</guid>
      	<description>
	&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cela faisait longtemps que je voulais créer ce blog. C&amp;#8217;est maintenant chose faite !&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_h_bergement&quot;&gt;Hébergement&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mon besoin principal (et oui, c&amp;#8217;est un besoin !) est de partager diverses expériences à travers quelques billets.
Comme elles sont souvent liées à du code, rien de plus naturel que de mettre ces billets à coté de celui-ci sur GitHub !&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Coté hébergement, mon choix s&amp;#8217;est donc rapidement porté sur &lt;a href=&quot;http://pages.github.com/&quot;&gt;GitHub pages&lt;/a&gt; &amp;#8230; d&amp;#8217;autant plus que ce service est gratuit !&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_outils_de_publication&quot;&gt;Outils de publication&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt; est le choix naturel suggéré par la documentation GitHub.
N&apos;étant pas fan de Ruby ni des gems à installer, j&amp;#8217;ai longtemps hésité à franchir le pas.
Entre temps, j&amp;#8217;ai beaucoup entendu parler (en bien) de &lt;a href=&quot;http://asciidoctor.org&quot;&gt;Asciidoctor&lt;/a&gt;, notamment sur sa mise en place sur des projets
comme &lt;a href=&quot;http://groovy.codehaus.org/&quot;&gt;Groovy&lt;/a&gt;, &lt;a href=&quot;http://hibernate.org/&quot;&gt;Hibernate&lt;/a&gt;, ou &lt;a href=&quot;http://golo-lang.org/&quot;&gt;Golo&lt;/a&gt;.
La migration du &lt;a href=&quot;http://melix.github.io/blog/&quot;&gt;blog de Cédric Champeau&lt;/a&gt; m&amp;#8217;a définitivement décidé à franchir le pas en me montrant la voie à suivre.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ce blog est donc écrit en &lt;a href=&quot;http://asciidoc.org/&quot;&gt;AsciiDoc&lt;/a&gt; et les pages statiques générées par &lt;a href=&quot;http://jbake.org&quot;&gt;JBake&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_a_venir&quot;&gt;A venir&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les billets à venir porteront sur Java &amp;#8230; et le hardware &amp;#8230; une fois que j&amp;#8217;aurais bien appréhender l&amp;#8217;AsciiDoc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stay tuned !&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;En bas de page, vous pourrez constater que les publications de ce site sont sous licence &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/4.0/&quot;&gt;Creative Commons by-nc-sa&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
	</description>
    </item>

  </channel> 
</rss>
