Twitter, arduino et processing dans une boite

Posez une question, secouez la boite, et elle vous donne une réponse sur un écran digital. Autour du projet de Romain Poirier, quelques solutions techniques.

Attention : ce script est en cours de construction. Il est incomplet et peut contenir des erreurs.

Précédent | 21/26 | Suivant

Ce projet met bout à bout une page php, un script en processing, la communication par Xbee à un module arduino pilotant un écran à cristaux liquides. Plus un capteur de choc (piezo) et un haut parleur. pour mémo, ici quelques codes.

La page php

On secoue une boite, et elle affiche un texte. Ce texte est une recherche sur twitter sur base du critère "parce que". La page php va renvoyer une résultat du type :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
</head>
<body>
---
C'est  parce que quand je suis content je vomis, et la, je suis hyper content !
</body>
</html>

Le triple tiret est là pour signaler à Processing, qui va lire ce code, à quel endroit il doit trouver le contenu. C’est une façon un peu cheap de faire du parsing (d’extraire l’information qui nous intéresse dans ce code), bien suffisante dans ce cas.

Le code Processing

boolean lis=false;
boolean checke=false;
String adresse="http://codedrops.net/readme/get_and_clean.php";

import processing.serial.*;

Serial myPort;  // Create object from Serial class
int val;        // Data received from the serial port

void setup(){
 size(200, 200);
 // I know that the first port in the serial list on my mac
 // is always my  FTDI adaptor, so I open Serial.list()[0].
 // On Windows machines, this generally opens COM1.
 // Open whatever port is the one you're using.
 String portName = Serial.list()[0];
 myPort = new Serial(this, portName, 9600);
}

void draw(){
 if(checke==true){
   println("Okay, je lis le fichier");
   String lines[] = loadStrings(adresse);
   for (int i=0; i < lines.length; i++) {
     if(lis==true){
       
       // decomposer la string
       int longueur=lines[i].length();
       for(int u=0;u<longueur;u++){
         myPort.write(lines[i].charAt(u));
         println(lines[i].charAt(u));
         
       }
       
       lis=false; // on a besoin que d'une seule ligne
       checke=false; // on quitte le check pour ne pas appeller plusieurs fois le fichier.
     }
     
     if(lines[i].contains("---")){
       lis=true;
     }
   }
 }
 delay(1000); //on checke toutes les secondes
 
 // attends une demande de la boite
 if ( myPort.available() > 0) {  // If data is available,
   val = myPort.read();         // read it and store it in val
   if(val=='A'){ // on reçoit une demande
     checke=true; // initialisation de checke
     myPort.clear(); // vider d'autres infos eventuelles.
   }
 }
 
}

Le code arduino

(temporaire)

char phrase[256]={'\0'}; // chaine vide

void setup(){
 // start serial port at 9600 bps:
 Serial.begin(9600);
 
}

void loop(){
 if (Serial.available() > 0) {
   printe_tout();

 }

 // envoi
 
 delay(2000);
 Serial.print('A');   // send an initial string
}

void printe_tout(){
 int compteur=0;
 while(Serial.available() > 0){
   int incomingByte = Serial.read();
   phrase[compteur]=incomingByte;
   //Serial.println(incomingByte, DEC);
   compteur++;
   delay(100);
 }
 phrase[compteur]='\0'; // finir la string
 
}

Astuce pour les xbee

Attention, il y a deux jumpers sur les Xbee. "usb" et "xbee". L’arduino branché sur l’ordinateur doit avoir ses jumpers sur "usb" et celui dans la boite sur "xbee". En fait "usb" fait transiter l’information directement du port usb vers l’autre Xbee. Ce qui signifie que l’arduino connecté à l’ordinateur ne fait rien. Il transite l’information, de manière transparente, vers l’arduino "distant".

Jouer un simple son (arduino)

Une fonction à ajouter, plus une boucle.

int hp=4; // pour un haut parleur sur la pin 4

void setup(){
pinMode(hp,OUTPUT);
}

void loop(){
 for(int i=0;i<2000;i++){ // duree de la note : 2000 cycles
 playTone(1912); // note C
 }
}

void playTone(int tone) {
 digitalWrite(hp, HIGH);   // point haut de la frequence
 delayMicroseconds(tone);                  // attendre la duree de tone
 digitalWrite(hp, LOW);    // point bas de la frequence
 delayMicroseconds(tone);                  // attendre la duree de tone
 
}