Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2018-03-12 11:18:27 Processing --> arduino et Console (cp5)

Marsat
nouveau membre
Date d'inscription: 2017-02-19
Messages: 8

Processing --> arduino et Console (cp5)



Bonjour à tous et happy coding wink

J'essaie actuellement de faire une interface de contrôle d'envoie de signaux radios, j'utilise donc pour ça un arduino avec virtualWire et pour choisir ce que j'envoie, une interface processing classique équipée de controlP5, ainsi que d'une console (plus pratique pour lire les dernières commandes). Hors, lorsque je lance processing -sur le bon com je précise que j'ai vérifié ceux-ci-... La communication se bloque au bout d'un moment. En cause, ceci :

StringIndexOutOfBoundsException: String index out of range: -1

Comment faire pour ne plus avoir cette erreur? Je sèche complètement là :'(

Je vous joint le code processing (arduino a la suite) :

/// cmd programme
int TEST = 0;


import processing.serial.*;
import controlP5.*;
Serial myPort;  // Create object from Serial class
String val = "_";     // Data received from the serial port
String message;     // Data received from the serial port

ControlP5 cp5;
Println console;
Textarea myTextarea;


void setup() {
  size(1920, 1080);
  cp5 = new ControlP5(this);
  frameRate(30);

  cp5.addBang("bang")
    .setPosition(250, 50)
    .setSize(20, 20)
    .setTriggerEvent(Bang.RELEASE)
    .setLabel("test")      
    ;

  cp5.addBang("ClearConsole")
    .setPosition(20, 1010)
    .setSize(20, 20)
    .setTriggerEvent(Bang.RELEASE)
    .setLabel("Clear console")      
    ;

  console();


  if (TEST == 0) {
    String portName = Serial.list()[1]; //change the 0 to a 1 or 2 etc. to match your port
    myPort = new Serial(this, portName, 9600);
    myPort.bufferUntil('\n');
  }
}

void draw() {
  if (TEST == 0) {
    if ( myPort.available() > 0) {  // If data is available,
      val = myPort.readStringUntil('\n');         // read it and store it in val
      println("Mariner = " + val + " ");
    } else {
      //println("Not connected");
    }
  }
}


public void bang() {
  println("boum");
  send("bonjour");
}

public void ClearConsole() {
  console.clear();
}

void send(String sending) {
  if (TEST == 0) {
    myPort.write(sending);
  }
  println("Cmd == "+ sending);
}

//     console.clear();


void console() {
  cp5 = new ControlP5(this);
  cp5.enableShortcuts();
  myTextarea = cp5.addTextarea("Transmissions")
    .setPosition(0, 0)
    .setSize(200, 1000)
    .setFont(createFont("Overpass-Regular-14", 14))
    .setLineHeight(14)
    .setColor(color(200))
    .setColorBackground(color(50,50,50, 200))
    .setColorForeground(color(255, 100));
  console = cp5.addConsole(myTextarea);//
  
}

Et le code arduino:

#include <VirtualWire.h>

String val = "Radio waiting for orders";
void setup() {
  Serial.begin(9600);
  Serial.println("Radio connected");

  vw_set_rx_pin(3);
  vw_set_tx_pin(13);

  vw_setup(1000);
  vw_rx_start();

}

void loop() {

  Serial.println("Radio connected");

  byte message[VW_MAX_MESSAGE_LEN];
  byte taille_message = VW_MAX_MESSAGE_LEN;
  byte paquet[27];

  if (Serial.available() > 0) {
    val = Serial.read();
    strcpy(paquet, Serial.read());
    vw_send(paquet, 27);
    vw_wait_tx();
    Serial.print(val);
    Serial.println("....send");
  }

  vw_wait_rx_max(1000);


  if (vw_get_message(message, &taille_message)) {
    Serial.println((char*) message); // Affiche le message
  }

delay(10);
}

Si vous avez la moindre idée, cela m'aiderait énormément :'(

Merci à tous et bonne journée.

Hors ligne

 

#2 2018-03-12 20:42:10 Re : Processing --> arduino et Console (cp5)

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: Processing --> arduino et Console (cp5)



Bonsoir,

N'ayant pas d'Arduino sous la main, je ne peux que lancer des pistes.
Tu devrais préciser ton "Au bout d'un moment" c'est 3 heures iu quelques secondes ?
J'entrevois  une possible erreur puisque tu utilises la méthode bufferUntil() à priori elle attends la méthode serialEvent() que tu aurais du implémenter. Cf doc

Je te conseille d'enlever l'instruction bufferUntil() et de regarder la doc de readStringUntil() pour l'initialisation.

L'autre solution serait de faire un test sur la chaîne pour ne pas quelle soit null.

A suivre

Bon courage

Hors ligne

 

#3 2018-03-12 23:11:53 Re : Processing --> arduino et Console (cp5)

Marsat
nouveau membre
Date d'inscription: 2017-02-19
Messages: 8

Re: Processing --> arduino et Console (cp5)



Bonjour

J'ai réussi à régler le problème, il semblerait que cela venait de l'arduino dont je mes le code en dessous. J'ai ajouté ceci au début:

while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

De cette manière il ne s'active que quand processing ce connecte wink


Par contre, toujours pas de retour de message quand j'envoie une info à arduino, j'ai même essayé avec Serial.write("blablabla"); mais rien, n'y fait. Pourtant la led clignote quand j'envoie une info.

C'est à n'y rien comprendre.

voici le code de l'arduino pour aider ceux qui auraient le même pb de serial, et ceux qui pourrait m'apporter une réponse du pourquoi du comment la communication ne fonctionne pas hmm :

#include <VirtualWire.h>

String val ;
void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  vw_set_rx_pin(3);
  vw_set_tx_pin(13);

  vw_setup(1000);
  vw_rx_start();
}

void loop() {

  Serial.println("Radio connecte! ");

  byte message[VW_MAX_MESSAGE_LEN];
  byte taille_message = VW_MAX_MESSAGE_LEN;
  byte paquet[27];

  while (Serial.read() > 0) {
    val = Serial.read();
    strcpy(paquet, Serial.read());
    vw_send(paquet, 27);
    vw_wait_tx();
    Serial.write("send");
    if (Serial.read() == "bonjour") {
      Serial.println("SALUT");
    }
  }

  vw_wait_rx_max(1000);
  if (vw_get_message(message, &taille_message)) {
    Serial.println((char*) message); // Affiche le message
  }

  delay(100);
}

Hors ligne

 

#4 2018-03-13 19:36:11 Re : Processing --> arduino et Console (cp5)

imdidi
membre
Date d'inscription: 2012-10-05
Messages: 242

Re: Processing --> arduino et Console (cp5)



Bonjour a toi
quesce que tu cherche a faire ? 1 arduino qui communique avec un pc sans fil ou 2 arduino qui communique ensemble  sans fil car la librarie virtualWire Cest surtout pour les communication sans fil

j'ai l'impression que tu mélange le serial et le virtualWire

Hors ligne

 

#5 2018-03-13 22:15:57 Re : Processing --> arduino et Console (cp5)

Marsat
nouveau membre
Date d'inscription: 2017-02-19
Messages: 8

Re: Processing --> arduino et Console (cp5)



Je cherche à avoir deux arduino communicant par radio. Ce qui fonctionne déjà, mais processing permettrait d'envoyer des données détaillées, et de traiter les données reçues pour mettre le tout en 3D (déplacement de drone).

Donc en gros processing--->arduino qui envoie ensuite à un autre arduino.

La reception de données sera aussi traité.

Hors ligne

 

#6 2018-03-14 00:20:15 Re : Processing --> arduino et Console (cp5)

imdidi
membre
Date d'inscription: 2012-10-05
Messages: 242

Re: Processing --> arduino et Console (cp5)



Ok et ma derniere question la communication entre le processing et le arduino echange til plusieurs variable a la fois ou 1 seul a la fois

Hors ligne

 

#7 2018-03-14 11:12:28 Re : Processing --> arduino et Console (cp5)

Marsat
nouveau membre
Date d'inscription: 2017-02-19
Messages: 8

Re: Processing --> arduino et Console (cp5)



Seulement un String, jamais différentes variables à la fois.

Ce que je ne comprends pas c'est que j'avais utiliser exactement les même codes (que j'ai littéralement copié-collé) dans un autre programme et que cela fonctionnait parfaitement... J'ai aussi vérifié mes ports usb.

Hors ligne

 

#8 2018-03-14 22:23:27 Re : Processing --> arduino et Console (cp5)

imdidi
membre
Date d'inscription: 2012-10-05
Messages: 242

Re: Processing --> arduino et Console (cp5)



voila j'ai ramener sa au base et il son d’ailleurs faite avec les exemples tu na plus qua adapter

Processing

/// cmd programme

import processing.serial.*;
import controlP5.*;

Serial myPort;  // Create object from Serial class
ControlP5 cp5;
Textarea myTextarea;
Println console;

String serialData;

void setup() {
  size(displayWidth, displayHeight);
  cp5 = new ControlP5(this);
  cp5.enableShortcuts();
  frameRate(50);
  
  myTextarea = cp5.addTextarea("Transmissions")
                  .setPosition(0, 0)
                  .setSize(200, displayHeight)
                  .setFont(createFont("Overpass-Regular-14", 14))
                  .setLineHeight(14)
                  .setColor(color(200))
                  .setColorBackground(color(50,50,50, 200))
                  .setColorForeground(color(255, 100));
  ;
  
  console = cp5.addConsole(myTextarea);
  
  cp5.addBang("bang")
     .setPosition(250, 50)
     .setSize(20, 20)
     .setTriggerEvent(Bang.RELEASE)
     .setLabel("test")      
  ;
  
  cp5.addBang("ClearConsole")
     .setPosition(250, 500)
     .setSize(20, 20)
     .setTriggerEvent(Bang.RELEASE)
     .setLabel("Clear console")      
  ;
  
  String portName = Serial.list()[0]; //change the 0 to a 1 or 2 etc. to match your port
  myPort = new Serial(this, portName, 9600);
}

void draw() {
 background(100);
 if (myPort.available() > 0) {
   serialData = myPort.readStringUntil('\n'); 
   if (serialData != null) {
     print("Arduino: "+ serialData);
   }
   serialData = "";
 }
}

public void bang() {
  send("bonjour");
}

public void ClearConsole() {
  console.clear();
}

void send(String sending) {
  myPort.write(sending);
  println("Cmd: "+ sending);
}

et Arduino

#include <VirtualWire.h>

char serialCharData;

void setup() {
  Serial.begin(9600);
  while (!Serial) {;}
  vw_set_rx_pin(3);
  vw_set_tx_pin(13);

  vw_setup(1000);
  vw_rx_start();
}

void loop() {

 /* byte message[VW_MAX_MESSAGE_LEN];
  byte taille_message = VW_MAX_MESSAGE_LEN;
  byte paquet[27];

  vw_wait_rx_max(1000);
  if (vw_get_message(message, &taille_message)) {
  Serial.println((char*) message); // Affiche le message
  }

  delay(100);*/
}

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    String serialData = Serial.readString();
    Serial.println(serialData);
    serialData = "";
    
  /*  char charBuf[serialData.length() + 1];
    strcpy(serialCharData, Serial.read());
    vw_send(serialCharData, charBuf);
    vw_wait_tx();*/
  }
}

Dernière modification par imdidi (2018-03-14 22:25:51)

Hors ligne

 

#9 2018-03-15 10:59:40 Re : Processing --> arduino et Console (cp5)

Marsat
nouveau membre
Date d'inscription: 2017-02-19
Messages: 8

Re: Processing --> arduino et Console (cp5)



Woh, je ne m'attendais pas à tant d'aide °___°

Merci beaucoup, c'est vraiment génial, je fonce essayer smile

Si je comprends bien, il fallait simplifier le tout en somme?

Hors ligne

 

#10 2018-03-15 11:29:32 Re : Processing --> arduino et Console (cp5)

Marsat
nouveau membre
Date d'inscription: 2017-02-19
Messages: 8

Re: Processing --> arduino et Console (cp5)



Toujours le même problème, ça m'étonne...
Je vais remplacer portName par COM7 et je verrais une fois la liaison avec mon ordi retrouvée...

(Je ne suis pas sur l'ordi en journée, j'utilise teamviewer, la connection vient d'être perdue)

Hors ligne

 

#11 2018-03-15 12:24:48 Re : Processing --> arduino et Console (cp5)

imdidi
membre
Date d'inscription: 2012-10-05
Messages: 242

Re: Processing --> arduino et Console (cp5)



A tu changer le numero du port chez moi je lai changer poir 0 alors que toi cetait ecrit 1

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

Hors ligne

 

#12 2018-03-19 22:17:19 Re : Processing --> arduino et Console (cp5)

Marsat
nouveau membre
Date d'inscription: 2017-02-19
Messages: 8

Re: Processing --> arduino et Console (cp5)



MERCI!!!!! cela fonctionne parfaitement big_smile

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024