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.

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
  
}