Go Down

Topic: [RESOLU] Decoder un signal infra-rouge (Read 1 time) previous topic - next topic

Biloulil

Nov 19, 2013, 11:05 pm Last Edit: Dec 02, 2013, 09:58 pm by Jean-François Reason: 1
Salut,
J ai démonté un petit hélicoptère radiocommandé par infra-rouge.
J'ai récupéré les divers signaux de commande envoyés par la télécommande à l aide d un capteur infra-rouge et de la librairie IRRemote.
J obtiens donc des codes hexadécimaux que je traduis en binaire
C est la que ça se complique ... Je ne sais pas à quoi correspond quoi et je ne trouve pas de lien pour ce problème dans l immensité d internet. De plus, je ne comprends pas pourquoi ça passe sur 2 valeurs oO (si on en envoie que une, le moteur ne réagi pas)
Le but serait donc de pouvoir modifier avec un joystick ou des potard la vitesse des 2 moteurs
Je me tourne donc vers vous ;)

Merci d avance

Ps: en lien la photo des codes ( arrêt/ moteur max+tourner à gauche/ moteur max+tourner à droite)

B83s

Salut, m'étant essayé au décodage d'une télécommande de clim ... J'ai quelques pistes à étudier ... Mais pas de réponse toute faite !

As-tu un oscillo sous la main  pour 'voir' le signal émis par la télécommande ? (Trames en continu à vitesse Max par exemple ? ou lors des changements seulement?)
Est-que tu arrives à lire plusieurs fois le même signal pour la même commande ? Sinon ça va etre chaud !

J'ai laissé tombé librairie IR remote pour m'en faire une avec mon décodage et codage perso ... Et ça fonctionne, mais sans oscillo ça aurait été impossible (il faut connaître la duree de ce que j'appelle le préambule avant le code lui même, la durée des pulses haut-bas,  durée des pulses courts et longs ...qui ne sont pas forcément les mêmes pour les télécommandes exotiques ...)

Si ça peut t'aider

Biloulil

C'est presque bon :)
J'ai repris le code de ce site et je l'ai adapté a ma télécommande :
Code: [Select]
const int IRpin = 7;

#define SIGNAL_SIZE 35

unsigned int SignalValues[SIGNAL_SIZE];

void setup(){
  Serial.begin(115200);
  pinMode(IRpin, INPUT);
}

void loop(){

  while(pulseIn(IRpin, LOW)  < 3500){
  }
   
  for(int i=0; i < SIGNAL_SIZE; i++){
    SignalValues[i]=pulseIn(IRpin, LOW);
  }
  for(int i=0; i < SIGNAL_SIZE; i++){
      Serial.print(SignalValues[i]);
      Serial.print("\t");
  }
  Serial.println();
}


Mais après je suis obligé de copier coller dans dans un tableur et tracer une courbe (open office) alors que lui utilise processing.
J'aimerais faire comme lui mais je reçois toujours le même code d'erreur et je trouve pas la solution:
Code: [Select]
import processing.serial.*;

Serial myPort;

int[] mPulses = new int[29];

static int PULSE_WIDTH = 30;

void setup() {

size(1000, 600);

// List all the available serial ports:

println(Serial.list());

String portName = Serial.list()[1];

myPort = new Serial(this, portName, 115200);

}

void draw() {

background(0);

stroke(255);

for(int i=0; i<29; i++){

rect(i*(PULSE_WIDTH + 3), 0, PULSE_WIDTH, mPulses[i] - 400);

}

}

void serialEvent(Serial myPort) {

String oneLine = myPort.readStringUntil('\n');

if(oneLine != null){

String[] lineElements = oneLine.split("\t");

//println(lineElements);

if(lineElements.length == 30){

for(int i=0; i<29; i++){

mPulses[i] = Integer.valueOf(lineElements[i]);

}

println("OK " + asInt(mPulses, 0, 6) + " - " + asInt(mPulses, 7, 12));

}

}

}

private int asInt(int[] pulses, int start, int end){

StringBuilder strB = new StringBuilder();

for(int i=start; i<end; i++){

strB.append(getBit(pulses[i]));

}

return Integer.parseInt(strB.toString(), 2);

}

private int getBit(int pulse){

if(pulse > 450 && pulse < 550) return 0;

if(pulse > 850 && pulse < 950) return 1;

return -1;

}


Quote
WARNING:  RXTX Version mismatch
   Jar version = RXTX-2.2pre1
   native lib Version = RXTX-2.2pre2
  • "COM3"
    Exception in thread "Animation Thread" java.lang.ArrayIndexOutOfBoundsException: 1
       at sketch_dec01a.setup(sketch_dec01a.java:38)
       at processing.core.PApplet.handleDraw(Unknown Source)
       at processing.core.PApplet.run(Unknown Source)
       at java.lang.Thread.run(Thread.java:662)[/color]

(Je suis conscient que quand ça marcheras entre l'arduino et processing je devrait modifier le code)
Merci d'avance  :)

Biloulil

C'est bon j'ai trouvé la reponse a ma question tout seul :)
Merci quand meme  ;)

Biloulil

Bon au cas ou ça intéresserais quelqu'un, les codes pour Arduino et Processing ( Il est possible de régler le nombre de bits que contient le signal mais le programme Processing est surtout spécifique a cet helico ):

Arduino :
Code: [Select]
const int IRpin = 7; // recepteur IR branché sur le Pin 7 digital

#define SIGNAL_SIZE 33 // regler le nombre de bits

unsigned int SignalValues[SIGNAL_SIZE];

void setup(){
  Serial.begin(115200);
  pinMode(IRpin, INPUT);
}

void loop(){

  while(pulseIn(IRpin, LOW)  < 3000){
  }
   
  for(int i=0; i < SIGNAL_SIZE; i++){
    SignalValues[i]=pulseIn(IRpin, LOW);
  }
  for(int i=0; i < SIGNAL_SIZE; i++){
      Serial.print(SignalValues[i]);
      Serial.print("\t");
  }
  Serial.println();
}


Processing :
Code: [Select]
import processing.serial.*;
Serial myPort;

static int PULSE_WIDTH = 25; // largeur (graph)
int LS = 33; // longueur du signal

int[] mPulses = new int[LS];
int[] MB = new int[LS];


void setup() {
  size(1000, 600);
  // List all the available serial ports:
  println(Serial.list());
  myPort = new Serial(this, Serial.list()[0], 115200);
}

void draw() {
  background(0);
  stroke(255);
  for(int i=0; i<LS; i++){
    // if(MB[i]==1) rect(i*(PULSE_WIDTH + 3), 400, PULSE_WIDTH, 200);
    stroke(100);
    // Moteur 1
    stroke(0, 255, 0);
    line(25,320,25,305);
    line(200,320,200,305);
    line(299,320,299,305);
    line(25,320,299,320);
    text("Moteur 1",27,332);
    // Avancer / Reculer
    stroke(255, 0, 0);
    line(301,320,301,305);
    line(425,320,425,305);
    line(449,320,449,305);
    line(449,320,301,320);
    text("Avancer / Reculer",303,332);
    // Trim
    stroke(100, 100, 255);
    line(451,320,451,305);
    line(475,320,475,305);
    line(624,320,624,305);
    line(451,320,624,320);
    text("Trim",454,332);
    // Moteur 2
    stroke(0, 0, 255);
    line(650,320,650,305);
    line(800,320,800,305);
    line(650,320,800,320);
    text("Moteur 2",652,332);
   
    stroke(255);
    if(MB[i]==1){
      line(i*PULSE_WIDTH, 200, i*PULSE_WIDTH+25, 200);
      if(i!=0 && MB[i-1]==0) line((i-1)*PULSE_WIDTH+25, 300, (i-1)*PULSE_WIDTH+25, 200);
    }
    else{
      line(i*PULSE_WIDTH, 300, i*PULSE_WIDTH+25, 300);
      if(i!=0 && MB[i-1]==1) line(i*PULSE_WIDTH, 200, (i-1)*PULSE_WIDTH+25, 300);
    }
  }
}

void serialEvent(Serial myPort) {
  String oneLine = myPort.readStringUntil('\n');
  if(oneLine != null){
    println("Nouvelles Valeurs !");
    String[] lineElements = oneLine.split("\t");
    if(lineElements.length == 34){
      for(int i=0; i<LS; i++){
        mPulses[i] = Integer.valueOf(lineElements[i]);
        println(mPulses[i]);
      }
    }
    else println("PROBLEME !");
    conversion();
  }
}

void conversion(){
  for(int i=0; i<LS; i++){
    if (mPulses[i]>250 && mPulses[i]<400) MB[i]=0;
    else MB[i]=1;
  }
  println("En attente ... ");
}


Voila :)
Bon codage ;)

Go Up