FurbySerial
| Ce wiki a été archivé en 2018.
Le nouveau wiki se trouve à: ressources.labomedia.org Les fonctionnalités sont désactivées: vous pouvez faire une recherche sur Google site:https://wiki.labomedia.org et découvrir La Labomedia. |
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