FurbySerial
Description du projet
Communiquer avec un Furby, charmant animal de compagnie virtuel, bardé de capteurs et de poils soyeux et au langage attendrissant.
Furby
Le Furby en plus d'être mignon parle le Furbish, et si on en colle plusieurs - disons deux face à face, en plus d'échanger des propos de manière sonore pour donner le change aux enfants discutent de géopolitique internationale via des émetteurs / récepteurs infrarouges placés entre leurs yeux. C'est ce protocole que nous allons ici utiliser pour provoquer leur réaction.
Émetteur Infrarouge
L’émetteur infrarouge est ici réalisée au plus simple, nous utilisons le circuit présenté ici pour sa capacité à griller les ports série : LIRC : Serial Port Transmitters. Ce dernier sera installé sur une adaptateur USB-Série no-name trouvable sans difficulté sur internet.
Nous ajoutons une LED en plus de la LED Infrarouge pour pouvoir observer le message à l’œil nu et nous obtenons le prototype suivant qui sera largement suffisant pour nos tests.
Protocole
Nous sommes déjà en 2012, ce qui outre le fait de nous vieillir réduit le nombre de ressources relatives à la communication avec les Furbys, il ne reste à priori a l'heure actuelle que la Blank Frank's Furby Stimulation Page qui heureusement pour nous contient des informations détaillées dans la partie "Technical Furby Comms Stuff".
Code
Le prototype est réalisé en Java aussi j'utilise ici l'API javax.comm malheureusement non portée hors de Windows.
package furbyclem;
import javax.comm.*; import com.sun.comm.Win32Driver; import java.io.OutputStream; import java.util.Scanner;
/**
* * @author Clément Didier */
public class Main {
static CommPortIdentifier portId = null; static OutputStream out = null; static int[][] messages = { {0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 1, 0, 0}, {0, 1, 0, 1}, {0, 1, 1, 0}, {0, 1, 1, 1}, {1, 0, 0, 0}, {1, 0, 0, 1}, {1, 0, 1, 0}, {1, 0, 1, 1}, {1, 1, 0, 0}, {1, 1, 0, 1}, {1, 1, 1, 0}, {1, 1, 1, 1},};
public static void write_low() throws Exception { out.write((char) 239); System.out.print("_"); }
public static void write_high() throws Exception { out.write((char) 255); System.out.print("-"); }
public static void main(String[] args) {
System.out.println("Bonjour Furby"); try {
// DRIVER Win32Driver w32Driver = new Win32Driver(); w32Driver.initialize();
// PORT portId = CommPortIdentifier.getPortIdentifier("COM15");
// PORT OPEN SerialPort port = null; port = (SerialPort) portId.open("ClemFurby", 10000);
// PORT SET port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); port.setSerialPortParams( 9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
// OUT out = port.getOutputStream();
// LECTURE SAISIE Scanner in = new Scanner(System.in); int numero = 16;
while (true) {
System.out.println("Parle : ");
numero = in.nextInt();
// SORTIE if (numero < 0 || numero > 15) { break; }
// DESCRIPTION int[] message = messages[numero];
// WRITE
for (int k = 0; k < 6; k++) {
// BIT DE DEBUT write_low();
// MESSAGE for (int i = 0; i < message.length; i++) { int signal = message[i]; //System.out.print(message[i]); if (signal == 1) { write_high(); } else { write_low(); } }
// MESSAGE COMPLEMENTAIRE for (int i = 0; i < message.length; i++) { int signal = message[i]; // System.out.print(message[i]); if (signal == 0) { write_high(); } else { write_low(); } }
// ATTENTE 80ms Thread.sleep(80); System.out.println();
}
Thread.sleep(1000); }
// CLOS out.close(); port.close(); in.close();
System.out.println("Bye Furby");
} catch (Exception ex) { ex.printStackTrace(); }
}
}
Évolution
Une piste intéressante serait d'utiliser une Arduino pour contrôler l'émission, on peut ensuite imaginer ajouter la réception, puis dans une élan de folie coupler ça à l'Internet :D