POCL : Poke : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
(Usages)
(Question de sécurité)
Ligne 304 : Ligne 304 :
 
===Question de sécurité===
 
===Question de sécurité===
 
* le système est très facilement "spamable".
 
* le système est très facilement "spamable".
* la config individuelle n'est pas très sécurisée, quel qu'un pourrait reconfigurer des POCL au hasard.
 
  
 
===Sources d'infos===
 
===Sources d'infos===

Version du 22 décembre 2021 à 12:47

Résumé du Projet

Le POCL: Poke est un POCL communautaire interactif. Sa fonction est d'envoyer et recevoir un message, nommé "pokou" vers ou provenant des autres POCL: Poke.

Le projet a été réalisé par Alma, Wing-Anh, Tony, Antony, Gaelle

Il envoie un message à la communauté de ses homomorphes, qui réagissent par une ou des actions perceptibles par leurs possesseurs (signal lumineux, vibration etc...)

POCL-equipe-poke.JPG POCL-equipe-poke2.JPG

Prototype réalisés

4 prototypes différents ont été réalisés, chacun apportant une évolution/modification supplémentaire.

  • Le premier prototype est fait, en plus de l'électronique, de carton et de papier.
  • Le deuxième prototype consiste en du bois découpé au laser pour remplacer le carton et mieux emprisonner le papier. Cette deuxième génération donnera la forme générale quasiment finale.
  • Le troisième prototype a intégré un bouton dans la structure d'un couvercle pour pouvoir interagir réellement avec les autres POCL.
  • Le quatrième et dernier prototype s'est vu octroyer trois boutons supplémentaires pour pouvoir envoyer plus de "pokous", ainsi que d'un "maintien d'élégance" pour permettre aux fils d'en sortir sans détériorer le papier sur la durée.

Fabrication d'un POCL: Poke

La construction d'un POCL: Poke se fera sur la base du prototype le plus à jour, c'est-à-dire le quatrième.
Attention, les photos du montage proviennent des deuxième et troisième prototypes

Proto

POCL-Prototype-poke.JPG POCL-PrototypePoke2.JPG


Matériel

  • 1 D1 Mini
  • 1 Ruban de LED ou autre objet au choix permettant un stimulus sensoriel pour l'utilisateur
  • 1 Bouton poussoir (4 s'il est prévu d'augmenter la capacité de pokous)
  • Fils conducteurs
  • Découpeuse laser
  • Planches de bois de 5mm d'épaisseur (ou carton facile à découper)
  • Papier fin (des feuilles A4 font parfaitement l'affaire)
  • Colle à bois (optionnel)
  • Connexion internet
  • Ciseaux

Découpe du bois

Découper le bois à la découpeuse laser

Découpe papier

Découper le papier en une bande large de 6 cm et longue de 28 cm (27.4 cm pour une feuille A4)

Prélude

La boîte est un cylindre dont le matériau laisse passer la lumière de façon diffuse comme le papier.

Les extrémités du cylindre sont faites de bois découpé au laser afin de renforcer la structure. Le carton peut le remplacer si besoin.

Pour une meilleure apparence finale, les gravures des pièces doivent être orientées vers l'extérieur de l'objet.

Étape 1

Prendre l'anneau troué, et enfoncer dedans les piliers dédiés, le côté épais orienté vers l'intérieur de la pièce

(Photo)

Étape 2

Enrouler la bande de papier autour de l'ossature précédemment créée.

Un chevauchement des deux bouts est attendu, et utile pour la suite

(Photo)

Étape 3

Insérer les deux anneaux de renforts (les plus grands et fins) autour du papier afin de le pincer avec l'ossature. Les garder à un tiers de la distance de chaque bord pour l'instant.

(Photo)

Étape 4

Insérer le disque troué sur les piliers pour entièrement bloquer le papier et fermer le cylindre d'un côté.

Il s'agit de l'étape la plus délicate du montage, prendre son temps et y aller par petits pas est vivement recommandé.

Note: la photo montre un anneau troué, mais la pièce est bien pleine dans le plan.

Note: Il est conseillé pour des raisons de simplification de la tâche d'insérer préalablement les boutons poussoir dans les 4 trous centraux et de les raccorder à des fils pour faciliter les connexions futures.

(Photo)

Électronique

POCL-Poke-etape2.JPG POCL-Poke-etape3.JPG POCL-Poke-etape.JPG

MQTT

L'interaction entre les POCL passe par un serveur MQTT (Message Queuing Telemetry Transport)

Ce serveur est basé sur le broker libre Mosquitto.

POCL : envoyer un pokou au POCL poke

Le Broker MQTT Shiftr.io (obsolète)
Devant les limitation de la démo de ce broker, nous avons monté notre propre server MQTT


Aller sur cette page pour trouver le bouton permettant d'envoyer des pokous (en phase de test, ne laissez pas trop vos POCL branchés, à cause de la liitation du sevreur Shifter.io) :

Arduino

Le code Arduino présenté correspond à celui du quatrième modèle

BibliothequeMQTTPOCL.png

/////////////////////////
//      POCL Poke      //
/////////////////////////
/*
 * Un POCL imaginé et réalisé au Hackathon POCL à l'édulab Rennes 2 les 9 et 10 décembre 2021.
 * 
 * Difficultés :
 * Configurez le logiciel Arduino pour gérer la carte D1 mini (ESP8266).
 * Intégrer les biobliothèues requises par le projet :
 ** #include <MQTT.h> -> pour gérer le protocole de communication c'est la bibliothèque MQTT de Joël Gähwiler : https://github.com/256dpi/arduino-mqtt
 ** #include <Adafruit_NeoPixel.h> -> pour gérer les rubans de led
 * 
 *                                      BROCHAGE                            
                                _________________                        
                               /     D1 mini     \                       
                           -  |[ ]RST        TX[ ]| -                    
                           -  |[ ]A0  -GPIO  RX[ ]| -                    
                              |[ ]D0-16    5-D1[ ]| -                    
                              |[ ]D5-14    4-D2[ ]| -                    
                    Bouton -  |[X]D6-12    0-D3[X]| - ruban de leds             
                           -  |[ ]D7-13    2-D4[ ]| LED_BUILTIN          
                           -  |[ ]D8-15     GND[X]| - GND (Boutons, ruban de leds)             
                           -  |[ ]3V3 .      5V[X]| - ruban de Led        
                              |       +---+       |                     
                              |_______|USB|_______|                      

Matériel :
- des fils dupont.
- un ruban de led RGB WS28B12
- D1 mini (Wemos, LOLIN,...)
- bouton poussoir
- une alimentation 5V
*/
/*
 * Un travail d'équipe de :
 * Alma Oskouei
 * Gaëlle Bescond
 * Tony Vanpoucke
 * Wing-Anh Luy
 * Antony Le Goïc-Auffret
   ___
 / ___ \
|_|   | |
     /_/ 
     _   ___   _ 
    |_| |___|_| |_
         ___|_   _|
        |___| |_|
Les petits Débrouillards - décembre 2021 CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/
// Programme inspiré de celui par Joël Gähwiler
// https://github.com/256dpi/arduino-mqtt
*/
#include <ESP8266WiFi.h>
#include <MQTT.h>
#include <Adafruit_NeoPixel.h>

const char ssid[] = "LeNomDeVotreReseauWifi";
const char pass[] = "LeCodeDeVotreWifi";

WiFiClient net;
MQTTClient client;
#define BROKER_IP "debrouillards.ddns.net" //IP du serveur sur lequel est installé le Broker MQTT

unsigned long lastMillis = 0;

//=============élément pour le ruban de led et le bouton===============

// Broche de connexion du ruban de LED
#define PIN D3 // 

int brocheBouton = 12; //GPIO de la broche D6

// Nombre de Led RDGB dans votre ruban
#define NUMPIXELS 13 

// on configurer un riban nommé "pixels"
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

#define T 1 // temps pour gérer le fade du ruban
//==============================================================

void connect() {
  Serial.print("checking wifi...");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
  }

  Serial.print("\nconnecting...");
  //connection au serveur MQTT : identifiant, User, mot de passe
  while (!client.connect("LeNomDeVotrePOCL", "poclpokou", "pokou")) {
    Serial.print(".");
    delay(1000);
  }

  Serial.println("\nconnected!");

// on s'abonne au sujet (topic) "/Poke" 
  client.subscribe("/Poke"); // Attention à la casse !! La casse c'est maj ou minuscule
  // client.unsubscribe("/Poke");// Pour se désiscrire
}

void messageReceived(String &topic, String &payload) {
  digitalWrite(LED_BUILTIN, HIGH);
  fade();
  Serial.println("incoming: " + topic + " - " + payload);
  if (payload == "pokou"){
    Serial.println("clic !");
    digitalWrite(LED_BUILTIN, LOW);
    delay(100);
    digitalWrite(LED_BUILTIN, HIGH);
  }
  // Note: Do not use the client in the callback to publish, subscribe or
  // unsubscribe as it may cause deadlocks when other things arrive while
  // sending and receiving acknowledgments. Instead, change a global variable,
  // or push to a queue and handle it in the loop after calling `client.loop()`.
}

void fade() {
  for (int sig=0; sig<3; sig++){
  for (int b=0; b<255; b++){
  pixels.setBrightness(b);
  
  for(int i=0; i<NUMPIXELS; i++) {
    pixels.setPixelColor(i, pixels.Color(250, 150, b));
  }
  pixels.show();   // On allume les rubans
  delay(T);
  }

  for (int b=255; b>1; b--){ //boucle de gestion de la brillance
  pixels.setBrightness(b);
  
  // n'oubliez pas que le premier pixel porte le Numéro 0
  for(int i=0; i<NUMPIXELS; i++) { // Pour chaque pixel...

    // pixels.Color() prends les valeurs RGB de 0,0,0 jusqu'à 255,255,255
    pixels.setPixelColor(i, pixels.Color(b, 50, 255));
  }
  pixels.show();   // on affiche les pixels
  delay(T);
  }
  }
}

void setup() {
  Serial.begin(115200);
  pixels.begin(); //on initialise le ruban "pixels"
  pinMode(brocheBouton,INPUT_PULLUP);
  
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  WiFi.begin(ssid, pass);

  // on se connecte au client
  client.begin(BROKER_IP, 1883, net); // (IP, port,je ne sais pas à quoi correspond "net")
  client.onMessage(messageReceived);

  connect();
}

void loop() {
  pixels.clear(); // Set all pixel colors to 'off'
  pixels.show();
  
  client.loop();
  delay(10);  // <- fixes some issues with WiFi stability

  if (!client.connected()) {
    connect();
  }

  // publish a message roughly every second.

  if ( digitalRead(brocheBouton) == LOW ){
  Serial.println("Appuis Bouton"); 
  client.publish("/Poke", "pokou");
  delay(250);
  }
}

Retours d'expérience

ça marche !

shiftr.io, le service MQTT utilisé pour le prototype a une limitation : au bout de 6 heures d'utilisations, le service s'arrête pendant 15 minute !!

Déjà fait

  • 18/12/2021 créer notre propre serveur MQTT
  • 20/12/2021 mettre wifimanager pour gérer la configuration de connexion

Piste de développement à faire pour une V2

  • évaluer les questions de sécurité
  • imaginer des fonctionnalités supplémentaires (du son façon R2D2, du mouvement )
  • un système de configuration de la couleur (via MQTT et une interface web ?)

Configuration via MQTT

  • chaque D1 mini dispose d'un identifiant unique.
  • il est possible de créer un topic MQTT avec cet identifiant qui serait le canal de configuration.
  • le POCL est abonné à ce topic et reçoit donc les infos de configuration qu'il peut stocker dans la mémoire.
  • on peut créer une page web dans laquelle on renseigne l'identifiant et la couleur (ou tout autre paramètre à configurer).
  • la page web envoie la config au topic.

Mieux, Configuration via la fonctionnalité "Point d'Accès"

  • rajouter un sélecteur (interrupteur) qui activé, met le D1 mini en mode config.
  • une interface web qui demande la config : wifi, couleur, fonctionnalité,....

Question de sécurité

  • le système est très facilement "spamable".

Sources d'infos

  • www.martyncurrey.com/esp8266-and-C-arduino-ide-part-5-adding-wifimanager/
  • Voir exemple de la bib WiFiManager AutoconnectwithFSparamaters

Usages

  • Mobiliser les concepts de Many-to-many au lieu de one-to-one
  • concept de POCL communautaire
  • Un POCL qui a des heures d'ouverture ? (8h à 20h par exemple) ?
  • Conserver le fait d'avoir reçu un pokou ?