Telecommande-Robosapiens

De LOAD.

Nous avons récupéré un robosapiens V2 à al déchetterie (merci A. Lagreze) Malheureusement celui-ci avait les hanches déboité et surtout pas de télécommande!

Les hanches ont pu être réparées avec un peu de mouchoir en papier pour caler les fixations.

Pour la télécommande le protocole est dispo sur plusieurs sites par exemples celui-là En gros il faut utiliser une porteuse IR 39.2khz et un codage particulier des 12 bits de commande :

Timing based on 1/1200 second clock (~.833ms) Signal is normally high (idle, no IR). Start: signal goes low (IR on) for 8/1200 sec. Data bits: for each of 12 data bits, space encoded signal depending on bit value

   Sends the most significant data bit first
   If the data bit is 0: signal goes high (IR off) for 1/1200 sec, and low(IR on) for 1/1200 sec.
   If the data bit is 1: signal goes high for 4/1200 sec, and low for 1/1200 sec.

When completed, signal goes high again. No explicit stop bit. Minimal between signals is not known.

The first 4 bits (prefix nibble) indicate the robot model:

   1: "0001" RoboRaptor. More Info.
   2: "0010" RoboPet. More Info.
   3: "0011" RoboSapien V2. See below for details.
   4: "0100" RoboReptile. More Info.
   5: "0101" RS Media. More Info.
   6: "0110" RoboQuad. More Info.
   7: "0111" RoboBoa. More Info.
   F: "FFFF" Sometimes used for testing 

les autres bits sont les commandes (ex 0x350 le fait danser, 0x36B provoque un "Hey Baby !")

La télécommande de test à été faite avec un pic 18f2550 qui commande une led IR à travers un 2n2222 (pour plus de peche, la led directement sur le pic ne porte qu'a quelques dizaine de cm) Aprés avoir bataillé pendant un moment sur le codage et ses inversion (High ? Low ? IR pas IR ?...) nos prières furent exaucées et le miracle s’accomplit enfin : le robot se leva et marcha !

Vidéo : Renaissance ! divers Photo : en cours

ci dessous le programme du pic sous XC8 (compilo gratuit microchip)
fichiers pinouts.h

    #include <xc.h>
    //-------------IO----------------
    #define         button      PORTBbits.RB5
    
    #define         led_IR      LATCbits.LC2
    #define         led_debug   LATCbits.LC1

fichier main.c

    /* 
    * Author: Thibault
    *
    * Created on 29 septembre 2013
    * telecommande IR pour robot sapiens V2
    */
   // #define __18F4550
   #include "config_bits.h"
   #include "pinout.h"
   #include <stdio.h>
   #include <stdlib.h>
   #include <p18cxxx.h>
   #include "timers.h"
   #include "pwm.h"
   #include "portb.h"
   #include <xc.h>
   //---------- constantes -----------
   #define high    30  //150 = 50% duty cycle
   //---------- variable globales --------
   //----------- fonctions -------------
   void delay_ms(int delay)
   {
       for (int i = 0; i < delay; i++) __delay_ms(1);
   }
   void init_pwm(){
       //active PWM @ 39.47khz
       OpenTimer2(TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_16);
       OpenPWM1(75);
       SetDCPWM1(0);
   }
   void send_start(){
       SetDCPWM1(high);
       __delay_ms(6);
       __delay_us(664);
   }
   void send(char data){
       SetDCPWM1(0);
       __delay_us(833);
       if (data){
           __delay_us(833);
           __delay_us(833);
           __delay_us(833);
       }
       SetDCPWM1(high);
       __delay_us(833);
   }
   void send_cmd(unsigned short cmd){
       signed char pos;
       send_start();
       for(pos=11;pos>=0;pos--){
           send(1 & (cmd >> (pos)));
       }
       SetDCPWM1(0);   //on coupe l'ir à la fin d'une commande
   }
   void main(void)
   {
       short int commande;
       // ADC OFF
       ADCON1 = 15;
       /* init IO*/
       PORTA = 0;
       PORTB = 0;
       PORTC = 0;
       TRISA = 0;
       TRISB = 255;
       TRISC = 0;
       // pull up portB
       INTCON2bits.RBPU = 0;
       //PWM
       init_pwm();
       SetDCPWM1(high);
       SetDCPWM1(0);     //duty cycle 0%
       commande = 0x350;
       /* Main Loop*/
       while (1)
       {
           if (button){
               led_debug = 0;
           }
           else {
               led_debug = 1;
               send_cmd(commande);        // 350 = touche D démo
               commande++;                // on prend une autre action au hasard
               delay_ms(150);
           }
       }
   }
Outils personnels