Go Down

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

killian.rohaut

Jun 03, 2017, 04:28 pm Last Edit: Jun 03, 2017, 06:41 pm by killian.rohaut
bonjour,
(changement de sujet )
 j'ai actuellement un robot en prototypage, j'ai creer des programmes qui tournent en boucle pour que le robot ce déplace ( carte arduino UNO ), mais j'aimerais controler les déplacements du robot via mon clavier en restant appuyer sur les touches pour qu'il ce deplace, j'ai souvent entendu parler de proccessing mais je n'ai pas trouver mon bonheur...


merci d'avance

J-M-L

  Bonjour, oui c'est tout à fait possible mais quelle est donc  exactement votre question  et de quels composants disposez-vous pour faire communiquer votre PC avec votre carte ?
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

killian.rohaut

désolé j'ai changer de sujet j'aimerais essayer avec procesing maintenant

J-M-L

Oui processing peut recevoir des commandes depuis le clavier ou une manette - la question reste   Comment  comptez vous envoyer ces commandes à votre robot?
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

killian.rohaut

je ne sais pas encore si vous avez des propositions je suis ouvert :)

J-M-L

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

killian.rohaut

Pour l'instant le robot tourne en boucle via un programme mais je ne le contrôle pas ...

J-M-L

est-ce que le robot dispose d'un composant de communication sans fil? bluetooth, wifi ou autre radio ?
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


J-M-L

En gros c'est relativement simple

1. connectez un lien quelconque visible sous forme d'un port Série sur votre PC et relié au port série de votre Arduino du robot

--> pour le test par exemple un câble USB relié à l'arduino
--> des modules bluetooth SPP correctement configurés
--> du Zigbee, RF24 etc...

l'important c'est que votre PC puisse envoyer des messages au port série de votre Arduino.

Pour tester mon exemple, mettez simplement le câble USB vers un Arduino Uno (mais fonctionne de manière similaire, en réglant la vitesse en baud au bon niveau) avec d'autres moyens de communications Série


2. Une fois que vous  avez fait cela il faut que, côté PC, votre programme  écoute le clavier ou la souris ou la manette, transforme la commande reçue en un ordre que vous envoyez sur le Port Série, par exemple sous forme d'un seul caractère (tient sur 1 octet, c'est pratique) 'U' pour up, 'L' pour LEFT etc.
Eventuellement le code peut écouter aussi le port série, si l'Arduino envoie aussi des messages (utiles pour dessiner une interface par exemple sur le PC) -> il faut donc écrire ce bout de code

3. Pendant ce temps là l'Arduino dans sa boucle attend des ordres et quand il en reçoit un, il fait ce qu'il faut au niveau des moteurs, éventuellement renvoie un message à Processing et se remet à attendre un ordre.

Voici deux bouts de code assez simple à comprendre si vous avez bossé un peu processing et l'Arduino


Côté Processing;
Code: [Select]
import processing.serial.*;

Serial arduinoSerial;      // The serial port

color c = #000000;
char message = '\0';
boolean updateNeeded = true;

void setup() {
  size(100, 100);
  // List all the available serial ports:
  printArray(Serial.list());
  // Open whatever port is the one you're using - here Serial.list()[1]
  arduinoSerial = new Serial(this, Serial.list()[1], 115200);
  message = '\0';
  updateNeeded = true;

  arduinoSerial.clear(); // vide le buffer
  arduinoSerial.bufferUntil('\n'); // attend '\n' avant d'appeler serialEvent()
}


void draw() {

  if (updateNeeded) {
    updateNeeded = false;
    background(0);
    fill(c);
    rect(25, 25, 50, 50);
  }
}


void keyPressed() {
  char previousMessage = message;

  if (key == CODED) {
    switch (keyCode) {
    case UP:
      c= #0000FF;
      message = 'U';
      break;

    case DOWN:
      c= #80FF00;
      message = 'D';
      break;

    case LEFT:
      c= #FF0000;
      message = 'L';
      break;

    case RIGHT:
      c= #CC66FF;
      message = 'R';
      break;
    }
  }

  // sendonly if we got a new command, don't handle multiple keys pressed at once
  if (previousMessage != message) {
    arduinoSerial.write(message);
    previousMessage = message;
    updateNeeded = true;
  }
}

void mousePressed() {
  char previousMessage = message;

  switch (mouseButton) {
  case LEFT:
    c= #0DD0FF;
    message = 'l';
    break;

  case RIGHT:
    c= #8EFFE0;
    message = 'r';
    break;

  case CENTER:
    c= #FFC0C0;
    message = 'c';
    break;
  }

  // sendonly if we got a new command, don't handle multiple keys pressed at once
  if (previousMessage != message) {
    arduinoSerial.write(message);
    previousMessage = message;
    updateNeeded = true;
  }
}


void mouseReleased() {
  keyReleased(); // similar as if a key is a released
}

void keyReleased() {
  // whatever key we released (if many were pressed) will send 'S' (stop)
  c= #000000;
  message = 'S';
  arduinoSerial.write(message);
  updateNeeded = true;
}


void serialEvent(Serial aPort) {
  // read what the Arduino sent us back
  while (aPort.available() > 0) print((char) aPort.read());
}

le code se lit assez simplement, on attend des évènement soit clavier (touche appuyée ou relâchée) soit souris (un des 3 boutons appuyé ou relâché) et on envoie une commande correspondante à l'arduino et on dessine un petit rectangle d'une couleur particulière pour chaque action. Quand la fenêtre est noire, c'est qu'on a envoyé l'ordre STOP

la seule ligne à changer éventuellement c'est le 1 dans
  arduinoSerial = new Serial(this, Serial.list()[1], 115200);
il faut regarder ce que dit la console Processing qui va afficher tous les ports séries et prendre le N° qui correspond à votre moyen de communication avec votre Arduino.


Côté Arduino - je ne pilote rien côté Arduino, je renvoie juste en texte une chaîne de caractère qui apparaîtra dans la console Processing
Code: [Select]
void setup() {
  Serial.begin(115200);
  while (!Serial); // pour certains Arduino on attend que le port Série soit connecté
}

void loop() {
  if (Serial.available() > 0) {
    int r = Serial.read();
    switch (r) {
      // the keyboard
      case 'U':
        Serial.println("UP");
        break;
      case 'D':
        Serial.println("DOWN");
        break;
      case 'L':
        Serial.println("LEFT");
        break;
      case 'R':
        Serial.println("RIGHT");
        break;


      // The mouse
      case 'l':
        Serial.println("left");
        break;

      case 'r':
        Serial.println("right");
        break;

      case 'c':
        Serial.println("center");
        break;


      // upon release
      case 'S':
        Serial.println("STOP");
        break;
    }
  }
}

 
Attention vous ne pouvez pas, si vous utilisez un câble USB, avoir le programme processing qui tourne et en même temps la console Arduino ouverte. Toute la communication Série de l'Arduino est renvoyée à votre programme Processing
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

killian.rohaut

merci pour les codes, sachant que je suis débutant en la matière et que je découvre proccessing, pour controler un moteur en appuyant sur une touche, dans l'arduino j'ai juste a mettre la fonction de mon moteur apres par exemple : case 'c':
        Serial.println("center");
        fonctionnement moteur;
        break;


J-M-L

Oui - mais uniquement après avoir lu les tutos d'eskimon sur les moteurs sinon vous allez tout griller...
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

killian.rohaut

Yes merci, j'avais deja regarder et pour eviter d'utiliser autant de composants j'ai acheter et fait mes test et programme sur des cartes mdd10a de chez cytron

killian.rohaut

merci pour ton code il marche parfaitement, mais 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...

quentin131

Bonjour, j'ai moi même fait un robot arduino que l'on peut piloter avec le clavier via processing. et en plus. on peut visualiser les obstacles sur l'écran grâce à son radar.
Si ça vous intéresses:
http://quentin-fr.ddns.net/realisations/realisation.php?id=19
Bonne chance!!!!!!

Go Up