FurbySerial

De Centre de Ressources Numériques - Labomedia
Aller à : navigation, rechercher

Description du projet

Communiquer avec un Furby, charmant animal de compagnie virtuel, bardé de capteurs et de poils soyeux et au langage attendrissant.

Furby

Furby serial 02.jpg

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.

Furby serial 01.jpg

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