Go Down

Topic: controler déplacements robot avec un clavier et processing (Read 2225 times) previous topic - next topic

killian.rohaut

sakut, erci pour ton lien, il pourrais m'etre utile pour plus tard, mais j'aimerais controler le robot avec Z = front, s= back, etc .. car mon robot aura 9sens ...

quentin131

Comment compte tu relier le robot à l'ordinateur? Avec un fil ce n'est pas très pratique surtout si il est mobile. En revanche, tu peux faire du sans fils avec les modules NRF24L01, tu branche un arduino à l'ordinateur relié au NR24L01 qui va faire office de passerelle entre l'app processing et le robot.

Pour l'app processing, tu fais en sorte que lorsque tu appuie sur une touche, tu envoie un caractère sur la voie série pour le recevoir à travers l'arduino. Ensuite tu le traite sous forme d'ordre que tu envois au robot en radio. voila une base pour le code:
Code: [Select]

//on importe la bibliotheque pour la communication série
import processing.serial.*;

Serial mySerial;

void setup(){
   size(300,300);
   
   mySerial = new Serial(this,Serial.list()[0],9600);
   mySerial.bufferUntil('\n');
     
 
}
void draw(){
   background(255);
   stroke(0);
   fill(0);
   textSize(20);
   text("Controle du robot",75,25);
   
   if(keyPressed == true){
      if(key == 'z')mySerial.write('Z');
      if(key == 's')mySerial.write('S');
   }
}


Essaie ça dans processing.

killian.rohaut

le pc sera sur le robot et je controlerais ce pc a distance, comme ca en cas de panne pas besoin de me déplacé jusqu'au robot :) , merci pour le code j'essaie ca :)

quentin131

Donc si j'ai bien compris, tu met un PC(portable?) que tu contrôles en wifi. Je trouve ta solution originale, néanmoins, la batterie du robot va vite se décharger(avec le poids de l'ordinateur).
Bonne chance!!!

killian.rohaut

#19
Jun 06, 2017, 09:24 pm Last Edit: Jun 06, 2017, 09:30 pm by killian.rohaut
pour la batterie il y aura un socle de recharge pour le robot :)

j'ai essayer ton code mais aucune réaction du robot ( désolé je débute vraiment avec processing ), j'ai du surement faire une erreur....

#define dir_1 2
#define pwm_1 3
#define dir_2 4
#define pwm_2 5
#define dir_3 7
#define pwm_3 6
#define dir_4 8
#define pwm_4 9
int pwm_value;

void setup() {
 Serial.begin(9600);
 while (!Serial); // pour certains Arduino on attend que le port Série soit connecté
 pinMode(pwm_1,OUTPUT);
 pinMode(dir_1,OUTPUT);
 pinMode(pwm_2,OUTPUT);
 pinMode(dir_2,OUTPUT);
 pinMode(pwm_3,OUTPUT);
 pinMode(dir_3,OUTPUT);
 pinMode(pwm_4,OUTPUT);
 pinMode(dir_4,OUTPUT);
}

void loop() {
 if (Serial.available() > 0) {
   int r = Serial.read();
   switch (r) {
     // the keyboard
     if(r == 'Z'){
       digitalWrite(dir_1,HIGH);    //controls the direction the motor
       digitalWrite(dir_2,HIGH);
       analogWrite(pwm_2,30);        
       analogWrite(pwm_1,30);
       digitalWrite(dir_3,HIGH);    //controls the direction the motor
       digitalWrite(dir_4,HIGH);
       analogWrite(pwm_3,30);        
       analogWrite(pwm_4,30);
       Serial.println("UP");
       break;
     }
     case 'D':
     digitalWrite(dir_1,LOW);    //controls the direction the motor
 digitalWrite(dir_2,LOW);
 analogWrite(pwm_2,30);        
 analogWrite(pwm_1,30);
 digitalWrite(dir_3,LOW);    //controls the direction the motor
 digitalWrite(dir_4,LOW);
 analogWrite(pwm_3,30);        
 analogWrite(pwm_4,30);
       Serial.println("DOWN");
       break;
     case 'L':
     digitalWrite(dir_1,LOW);    //controls the direction the motor
 digitalWrite(dir_2,HIGH);
 analogWrite(pwm_2,30);        
 analogWrite(pwm_1,30);
 digitalWrite(dir_3,HIGH);    //controls the direction the motor
 digitalWrite(dir_4,LOW);
 analogWrite(pwm_3,30);        
 analogWrite(pwm_4,30);  
       Serial.println("LEFT");
       break;
     case 'R':
     digitalWrite(dir_1,HIGH);    //controls the direction the motor
 digitalWrite(dir_2,LOW);
 analogWrite(pwm_2,30);        
 analogWrite(pwm_1,30);
 digitalWrite(dir_3,LOW);    //controls the direction the motor
 digitalWrite(dir_4,HIGH);
 analogWrite(pwm_3,30);        
 analogWrite(pwm_4,30);
       Serial.println("RIGHT");
       break;


     // upon release
     case 'S':
     analogWrite(pwm_2,0);        
 analogWrite(pwm_1,0);
 analogWrite(pwm_3,0);        
 analogWrite(pwm_4,0);
       Serial.println("STOP");
       break;
   }
 }
}

quentin131

Ok, donc déja, dans ton switch pourquoi tu met un if(...). Tu dois mettre case 'Z': tu met les instructions et tu finis par break.
Dans le code que je t'ai passé, je l'ai fait que pour 2 touches. voici donc le code réel:
Code: [Select]


//on importe la bibliotheque pour la communication série
import processing.serial.*;

Serial mySerial;

void setup(){
   size(300,300);
   
   mySerial = new Serial(this,Serial.list()[0],9600);
   mySerial.bufferUntil('\n');
     
 
}
void draw(){
   background(255);
   stroke(0);
   fill(0);
   textSize(20);
   text("Controle du robot",75,25);
   
   if(keyPressed == true){
      if(keyCode == UP)mySerial.write('A');//
      if(keyCode == DOWN)mySerial.write('D');//recule   
      if(keyCode == RIGHT)mySerial.write('R');//tourne a droite
      if(keyCode == LEFT)mySerial.write('L');//tourne a gauche
      if(key == ' ')mySerial.write('S');//arrete les moteurs.
   }
}




et pour l'arduino:

Code: [Select]

#define dir_1 2
#define pwm_1 3
#define dir_2 4
#define pwm_2 5
#define dir_3 7
#define pwm_3 6
#define dir_4 8
#define pwm_4 9
int pwm_value;

void setup() {
  Serial.begin(9600);

   pinMode(pwm_1,OUTPUT);
   pinMode(dir_1,OUTPUT);
   pinMode(pwm_2,OUTPUT);
   pinMode(dir_2,OUTPUT);
   pinMode(pwm_3,OUTPUT);
   pinMode(dir_3,OUTPUT);
   pinMode(pwm_4,OUTPUT);
   pinMode(dir_4,OUTPUT);
}

void loop() {
  if(Serial.available()){
    char c = Serial.read();
    switch(c){
      case 'A':
        digitalWrite(dir_1,HIGH);    //controls the direction the motor
        digitalWrite(dir_2,HIGH);
        analogWrite(pwm_2,30);       
        analogWrite(pwm_1,30);
        digitalWrite(dir_3,HIGH);    //controls the direction the motor
        digitalWrite(dir_4,HIGH);
        analogWrite(pwm_3,30);       
        analogWrite(pwm_4,30);
        Serial.println("UP");
        break;
      case 'D':
        digitalWrite(dir_1,LOW);    //controls the direction the motor
        digitalWrite(dir_2,LOW);
        analogWrite(pwm_2,30);       
        analogWrite(pwm_1,30);
        digitalWrite(dir_3,LOW);    //controls the direction the motor
        digitalWrite(dir_4,LOW);
        analogWrite(pwm_3,30);       
        analogWrite(pwm_4,30);
        Serial.println("DOWN");
        break;
      case 'R':
        digitalWrite(dir_1,HIGH);    //controls the direction the motor
        digitalWrite(dir_2,LOW);
        analogWrite(pwm_2,30);       
        analogWrite(pwm_1,30);
        digitalWrite(dir_3,LOW);    //controls the direction the motor
        digitalWrite(dir_4,HIGH);
        analogWrite(pwm_3,30);       
        analogWrite(pwm_4,30);
        Serial.println("RIGHT");
        break;
      case 'L':
        digitalWrite(dir_1,LOW);    //controls the direction the motor
        digitalWrite(dir_2,HIGH);
        analogWrite(pwm_2,30);       
        analogWrite(pwm_1,30);
        digitalWrite(dir_3,HIGH);    //controls the direction the motor
        digitalWrite(dir_4,LOW);
        analogWrite(pwm_3,30);       
        analogWrite(pwm_4,30); 
        Serial.println("LEFT");
        break;
      case 'S':
        analogWrite(pwm_2,0);       
        analogWrite(pwm_1,0);
        analogWrite(pwm_3,0);       
        analogWrite(pwm_4,0);
        Serial.println("STOP");
        break;
       

    }

  }
 
}


Le robot se pilote avec les flèches du clavier.

J-M-L

Quote
j'aimerais savoir comment faire pour utiliser avec la lettre z par exemple ? je ne trouve pas sur internet... peut etre que je fais mal mes recherches...
Du côté processing il suffit de tester l'appui de 'z' et d'envoyer 'z' comme message
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up