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
}