Forums LR PRESSE

Où il est question de trains, petits et grands

  • Advertisement

Conseil sur faisabilité de mon projet

Toutes les discussions sur l'Arduino !

Modérateur: MOD

Re: Conseil sur faisabilité de mon projet

Publié: Lun 31 Août 2015, 20:45 
Je pense que tu te lances dans un sacré projet...

Si j'ai bien compris, un logiciel PC (UTS) développé pour être géré avec des cartes à base de PIC doit maintenant fonctionner avec une carte à base d'Arduino.

Donc, tu simules le fonctionnement de la carte PIC avec un Arduino.

Et, j'imagine que les cartes PIC fonctionnaient avec l'interface série RS232.
Et tu voudrais, en plus, que, puisque l'Arduino est, lui, relié au PC avec un USB, il continue à fonctionner via le bus série, présent dans le PC et dans l'Arduino.

Disons que, comme premier projet, c'est du costaud... :?

Normalement, la fonction donnée par jlb (WaitAndRead() ) attend qu'il y ait un octet valide (= différent de 0x00). Puis elle lit cet octet et renvoie son contenu à l'Arduino.
Là, tu peux utiliser des IF pour analyser le contenu et rechercher 0x01.
Puis il faut que l'Arduino renvoie un 0x83 d'accusé réception de réception par un Serial.write.
Puis il attend la suite (WaitAndRead), en particulier le 0x08.
Jusque là, j'ai à peu près compris.
Et le PC balance 52 octets. Que veux-tu que l'Arduino en fasse ??
Là, je décroche. :mort:
J'y arriverai ... demain !
Avatar de l’utilisateur
groumfit
Papotier
 
Messages: 143
Inscrit le: Sam 25 Oct 2014, 11:25
Âge: 61
Prénom: Denis

Re: Conseil sur faisabilité de mon projet

Publié: Lun 31 Août 2015, 21:20 
Pour le projet tu as bien compris
un méga reçoit la trame et renvoi vers 16 uno (1 par canton)

"Puis il attend la suite (WaitAndRead), en particulier le 0x08.
Jusque là, j'ai à peu près compris.
Et le PC balance 52 octets. Que veux-tu que l'Arduino en fasse ??
Là, je décroche. "
pour l' instant je veux récupérer les 16 premiers octets correspondant au 16 valeurs de pwm des 16 cantons
puis dans un 2eme temps les 2 octets suivant pour la gestion des 16 sens (1 bit par sens 0/1 et par cantons)
déjà si j' arrive là
SYLTRAIN80
 
Messages: 29
Inscrit le: Mar 24 Fév 2015, 10:47
Echelle pratiquée: HO - N
Prénom: Sylvain

Re: Conseil sur faisabilité de mon projet

Publié: Jeu 03 Sep 2015, 22:38 
Si tu mets des Serial.println(l'octet que tu veux), tu dois voir ce que tu as reçu en regardant dans le bus série (la loupe en haut à droite dans l'IDE Arduino).

ex pour le 1er :
Serial.println(pwm_r0);

Il va t'en sortir plein.
Pour arrêter l'affichage de la liste et les lire tranquillement, tu décoches dans la fenêtre de l'affichage la case en bas à gauche "arrêt défilement".

Au fait, il faut aussi mettre la bonne vitesse (38400) dans la case en bas à droite, sinon, tu as des hiéroglyphes.

A+
J'y arriverai ... demain !
Avatar de l’utilisateur
groumfit
Papotier
 
Messages: 143
Inscrit le: Sam 25 Oct 2014, 11:25
Âge: 61
Prénom: Denis

Re: Conseil sur faisabilité de mon projet

Publié: Dim 17 Jan 2016, 19:49 
Bonjour à tous,
je travail sur un nouveau projet de commande analogique de mon futur réseau (car je n' ai pas réussi à exploiter la trame du logiciel UTS , hors de mes compétences :evil: )

voici les bases de mon projet :

1 arduino Nano pour la gestion de 2 cantons avec une carte L298N , 4 détecteurs IR(6 maxi), 4 servos moteurs 9G ,1 carte connection i/o et 1 module RS485

Le coût pour les 2 cantons et de 14€ sur Emachin soit 7€ par canton avec les 2 moteurs d' aiguille

La photo des modules :
Image


le tous commandé par un arduino Due et/ou un programme processing ou visualbasic

utilisation des sorties de l' arduino Uno

Variables / Sortie module / Sortie Arduino

RS485 / R0 / rx D0
....... / DI / tx D1
....... / RE-DE / D2

.pwm1 / EnA / D09 (timer à 31khz)
spwm1 / In1 / D07
........ / In2 / D08

.pwm2 / EnB / D10 (timer à 31khz)
spwm2 / In3 / D12
........ / In4 D13


Aig1 / servo 1 / D03
Aig2 / servo 2 / D05
Aig3 / servo 3 / D06
Aig4 / servo 3/ D11


CapIR1 / moduleIR1 / A0
CapIR2 / moduleIR2 / A1
CapIR3 / moduleIR3 / A2
CapIR4 / moduleIR4 / A3
CapIR5 / moduleIR5 / A4
CapIR6 / moduleIR6 / A5



Je travail donc sur la mise en place du protocole de communication du bus RS485
avec un MAITRE (pour l' instant un arduino mega) et des esclaves (les arduino Uno) .
Si j' ai bien compris c' est un protocole Ascii synchrone haft duplex

Trame envoi du maître :

01 byte de début de trame $ (valeur ascii = 36)
02 byte adresse 1 (exemple ascii = 48)
03 byte adresse 2 (exemple ascii = 49)
04 byte pwm1 (ascii 0 à 127 soit 0à254 avec pas de 2)
05 byte spwm1 (0 ou 1 0 sens direct ,1 sens inverse)
06 byte pwm2 (ascii 0 à 127 soit 0à254 avec pas de 2)
07 byte spwm2 (0 ou 1 0 sens direct ,1 sens inverse)
08 byte aig1 (0 ou 1 0 sens direct ,1 sens dévié)
09 byte aig2 (0 ou 1 0 sens direct ,1 sens dévié)
10 byte aig3 (0 ou 1 0 sens direct ,1 sens dévié)
11 byte aig4 (0 ou 1 0 sens direct ,1 sens dévié)
12 byte de fin / (valeur ascii = 47)

soit :
$, byte adresse 1, byte adresse 2, byte pwm1, byte spwm1,byte pwm1, byte spwm2, byte aig1, byte aig2, byte aig3, byte aig4,/


Trame envoi de l 'esclave

01 byte de début de trame $ (valeur ascii = 36)
02 byte adresse 1 (exemple ascii = 48)
03 byte adresse 2 (exemple ascii = 49)
04 byte capIR1 (0 ou 1 0 rien ,1 presence train)
05 byte capIR2 (0 ou 1 0 rien ,1 présence train)
06 byte capIR3 (0 ou 1 0 rien ,1 présence train)
07 byte capIR4 (0 ou 1 0 rien ,1 présence train)
08 byte capIR5 (0 ou 1 0 rien ,1 présence train)
09 byte capIR6 (0 ou 1 0 rien ,1 présence train)
10 byte de fin / (valeur ascii = 47)

soit :
$, byte adresse 1, byte adresse 2, byte capIR1, byte capIR2,byte capIR3, byte capIR4, byte capIR5, byte capIR6,/

Est ce que ces trames vous semble correcte ?

j'ai toujours du mal à comprendre les communications entre arduino
donc avec le bus série si j' ai bien compris je dois mettre la pin D2 en LOW ou en HIGH selon si je reçois un message ou si je l'envoie en inverse sur l 'esclave" ,si D2 et en LOW sur le "maître" il doit être en HIGH sur les "esclaves" et vice versa
Maintenant et comme d' habitude je bloque à nouveau sur le code à mettre en place coté « maître » avec envoi des informations et interrogation des états de capteurs des « esclaves » et coté « esclave » pour réception des trames d'info et envoi des états de capteurs quand le "maître" le demande

Si une personne peu me donner les enchaînements de logique et/ou un exemple de code, cela serait très sympa car je ne veux pas bloquer une fois de plus sur la communication entre les cartes

Autre point comment vérifier le bon fonctionnement des transmissions ?(perte de données)

J'aimerais aussi connaître si vous avez une solution pour les capteurs IR car j'ai un signal au 1er passage de loco et plusieurs après suivant le nombre de wagons (je met une étiquette blanche sous la loco pour avoir un signal net )
SYLTRAIN80
 
Messages: 29
Inscrit le: Mar 24 Fév 2015, 10:47
Echelle pratiquée: HO - N
Prénom: Sylvain

Re: Conseil sur faisabilité de mon projet

Publié: Sam 05 Mars 2016, 16:17 
Bonjour à tous,
n' ayant eu aucune réponse à mon dernier message.
j' ai repris mes travaux à zéro:
Je suis reparti avec une interface de commande avec processing et G4P
une carte arduino MEGA qui sert de réplication de port entre le pc et le bus RS485

et des cartes uno qui lisent les messages en continu et en fonction de l' adresse lue active ou pas les servos ou autres .

hypothèse de base :
255 adresses
0 à 49 (pwm des cantons)
50 à 99 (servos de contrôle des aiguillages)
100 a 255 (état des capteurs IR)

Composition de la trame de commande :
valeur 1 : adresse (0 à 255)
valeur 2 : sens pour les pwm (0 ou 1) ou présent ou libre pour les capteur IR ( ou 1)
valeur 3 : vitesse pour pwm ou angle pour servos

Mon avancement :
J' ai réalisé un panneau de contrôle sous processing pour 10 aiguillages et 4 pwm
j' arrive à envoyer et contrôler mes servos répartis sur 2 arduino NANO par l' intermédiaire du Arduino MEGA et des modules rs485

Jusque la tous va bien
mais après cela ce gâte :
je voudrais envoyer un message de réception après lecture du message par le uno vers le logiciel processing.

Après plusieurs essais de programmation du Mega et de la casse!!! (j' ai griller un MEGA et un UNO (ils ne sont plus reconnus sur les ports USB et donc plus programmable))
je n' arrive pas à lui faire lire la trame venant du bus RS485 (Serial1) et la retransmettre vers le port série du PC (Serial)

Un autre point me bloquera après : comment a partir de Processing demander aux cartes UNO d' envoyer les Etats des capteurs IR ( une bouche de demande des états pour les adresses 100 à 255 ?)

Mes notions de programmation sont rudimentaire
mais je vous joints les codes:
le code de la carte MEGA (réplication de trame entre pc et RS485)
Code: Tout sélectionner
#define SerialTxControl 20   //RS485 controle reception/emission arduino pin 20
#define RS485Transmit    HIGH
#define RS485Receive     LOW

byte in_bytes [2];


void setup() {
  // initialize both serial ports:
  Serial.begin(115200);
  Serial1.begin(115200);
  pinMode(SerialTxControl, OUTPUT);
}

void loop() {
  // Lecture du port 0, reponse sur port 1:

  digitalWrite(SerialTxControl, RS485Transmit);
  while (Serial.available () < 3) {} // jusqu'à il y a 3 Octets attente
  for (int n = 0; n < 3; n ++)
  {
    in_bytes [n] = Serial.read (); // Puis: on les lit.
    Serial1.write(in_bytes [0]);
    Serial1.write(in_bytes [1]);
    Serial1.write(in_bytes [2]);
    delay(2);
    // Serial.flush ();
  }
  Serial.flush ();

  // lecture du port 1, reponse sur port 0:
  //digitalWrite(SerialTxControl, RS485Receive);
  // if (Serial1.available()) {
  // digitalWrite(SerialTxControl, RS485Receive);
  // int inByte = Serial1.read();
  // Serial.write(inByte);
  // }
}

La partie neutralisé en bas du code et celle qui ma grillée mes arduino je pense.

Code d' un des UNO (lecture de trame, et commande servo si adresse OK)
Code: Tout sélectionner
// --- Programme Arduino ---

// --- Inclusion des librairies utilisées ---

#include <Servo.h> // librairie pour servomoteur

// --- Déclaration des constantes ---
const int POS_MIN = 550; // largeur impulsion pour position 0° servomoteur
// POS_MIN=550 pour futaba S3003
const int POS_MAX = 2330; // largeur impulsion pour position 180° servomoteur
// POS_MAS=2330 pour futaba s3003

// --- constantes des broches ---

const int broche_servo1 = 3; //declaration constante de broche
const int broche_servo2 = 4; //declaration constante de broche
const int broche_servo3 = 5; //declaration constante de broche
const int broche_servo4 = 6; //declaration constante de broche




// --- Déclaration des variables globales ---
// variable position du servomoteur en degré
int position_servo1 = 0;
int position_servo2 = 0;
int position_servo3 = 0;
int position_servo4 = 0;



// variable de stockage des valeurs reçues

int sens1 = 0;
int sens2 = 0;
int sens3 = 0;
int sens4 = 0;


int angle1 = 0;
int angle2 = 0;
int angle3 = 0;
int angle4 = 0;

byte RFin_bytes [2];

// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---
Servo mon_servo1;  // crée un objet servo pour contrôler le servomoteur
Servo mon_servo2;  // crée un objet servo pour contrôler le servomoteur
Servo mon_servo3;  // crée un objet servo pour contrôler le servomoteur
Servo mon_servo4;  // crée un objet servo pour contrôler le servomoteur




//-------Declaration Fonction rs485 ------------------
digitalWrite(SerialTxControl, RS485Receive); 
#define SerialTxControl 2  //RS485 controle reception/emission arduino pin 2
#define RS485Transmit   HIGH
#define RS485Receive    LOW


//**************** FONCTION SETUP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme
void setup()   { // debut de la fonction setup()

  // --- ici instructions à exécuter au démarrage ---

  Serial.begin(115200); // initialise connexion série à 115200 bauds
  // IMPORTANT : régler le terminal côté PC avec la même valeur de transmission




  mon_servo1.attach(broche_servo1, POS_MIN, POS_MAX);  // attache l'objet servo à la broche de commande du servomoteur
  mon_servo2.attach(broche_servo2, POS_MIN, POS_MAX);  // attache l'objet servo à la broche de commande du servomoteur
  mon_servo3.attach(broche_servo3, POS_MIN, POS_MAX);  // attache l'objet servo à la broche de commande du servomoteur
  mon_servo4.attach(broche_servo4, POS_MIN, POS_MAX);  // attache l'objet servo à la broche de commande du servomoteur





  // ------- Broches en sortie -------

  pinMode(broche_servo1, OUTPUT); //met la broche en sortie
  pinMode(broche_servo2, OUTPUT); //met la broche en sortie
  pinMode(broche_servo3, OUTPUT); //met la broche en sortie
  pinMode(broche_servo4, OUTPUT); //met la broche en sortie

  pinMode(SerialTxControl, OUTPUT);


  // ------- Broches en entrée -------


  // ------- position initiale du servomoteur
  mon_servo1.write(position_servo1);
  mon_servo2.write(position_servo2);
  mon_servo3.write(position_servo3);
  mon_servo4.write(position_servo4);



} // fin de la fonction setup()
// ********************************************************************************



//*************** FONCTION LOOP = Boucle sans fin = coeur du programme *************
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop()
{ // debut de la fonction loop()

  // --- ici instructions à exécuter par le programme principal ---

  digitalWrite(SerialTxControl, RS485Receive);

  while (Serial.available () < 3) {} // jusqu'à il y a 3 Octets attente
  for (int n = 0; n < 3; n ++)
  {
    RFin_bytes [n] = Serial.read (); // Puis: on les lit.
    Serial.write(RFin_bytes [2]);
  }
  if (RFin_bytes [0] == 51) // si correspont a l' adresse
  {
    sens1 = RFin_bytes [1];
    angle1 = RFin_bytes [2];

    mon_servo1.write(angle1);//on positionne le servomoteur avec l' angle recu
    //entre chaque changement de position
    Serial.flush ();
  }
  if (RFin_bytes [0] == 52) // si correspont a l' adresse
  {
    sens2 = RFin_bytes [1];
    angle2 = RFin_bytes [2];
   
   mon_servo2.write(angle2);//on positionne le servomoteur avec l' angle recu
    //entre chaque changement de position
    Serial.flush ();

  }
  if (RFin_bytes [0] == 53) // si correspont a l' adresse
  {
    sens3 = RFin_bytes [1];
    angle3 = RFin_bytes [2];
   
   mon_servo3.write(angle3);//on positionne le servomoteur avec l' angle recu
    //entre chaque changement de position
    Serial.flush ();

  }
  if (RFin_bytes [0] == 54) // si correspont a l' adresse
  {
    sens4 = RFin_bytes [1];
    angle4 = RFin_bytes [2];
   
   mon_servo4.write(angle4);//on positionne le servomoteur avec l' angle recu
    //entre chaque changement de position
    Serial.flush ();

  }




} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************

// --- Fin programme ---


Code logiciel Processing 3
Code: Tout sélectionner
//Besoin de la librairie serie
import processing.serial.*;

// Besoin de la librairie G4P
import g4p_controls.*;

//Déclaration des variables
int SendValue=0; // valeur envoyée à Arduino
float niveau=0.0; // 0% au départ

boolean aiguillage1 = true;
int valAig1 = 0 ;

boolean aiguillage2 = true;
int valAig2 = 0 ;

boolean aiguillage3 = true;
int valAig3 = 0 ;

boolean aiguillage4 = true;
int valAig4 = 0 ;

boolean aiguillage5 = true;
int valAig5 = 0 ;

boolean aiguillage6 = true;
int valAig6 = 0 ;

boolean aiguillage7 = true;
int valAig7 = 0 ;

boolean aiguillage8 = true;
int valAig8 = 0 ;

boolean aiguillage9 = true;
int valAig9 = 0 ;

boolean aiguillage10 = true;
int valAig10 = 0 ;


int valeur1 =0;
int valeur2 =0;
int valeur3= 0;
int valeur4=0;
int message = 0;
int sens = 0;
int sens1 =0;
int vitesse = 0;

Serial MySerialPort; // variable désignant le port série


public void setup() {
  size(480, 320, JAVA2D);
  createGUI();
  customGUI();
  // Place your setup code here

  //---- initialisation port série ---

  println(Serial.list()); // liste et affiche tous les ports disponibles
delay (1000);
  // Ouvrir le port serie que vous utilisez.
  MySerialPort = new Serial(this, Serial.list()[1], 115200); // vérifier si c'est le bon port qui est utilisé
  delay (100); // pause
}

public void draw() {
  background(230);





  println("Valeur : " + pwm1_slider1.getValueS() + "  Pwm 1  " );
  println("Valeur : " + pwm2_slider1.getValueS() + "  Pwm 2  " );
  println("Valeur : " + pwm3_slider1.getValueS() + "  Pwm 3  " );
  println("Valeur : " + pwm4_slider1.getValueS() + "  Pwm 4  " );

  //MySerialPort.write(pwm1_slider1.getValueS());   // valeur initiale + 48 pour format ASCII - envoie valeur 0 à 9
  valeur1 = int (pwm1_slider1.getValueS());
  if ((valeur1) < 0)
  {
    sens1 = 1;
  }else
{
  sens1 = 0;
}
    println("Valeur : " + valeur1 + "  Pwm 1  " +sens1 +" sens" );

  valeur2 = int (pwm2_slider1.getValueS());
  valeur3 = int (pwm3_slider1.getValueS());
  valeur4 = int (pwm4_slider1.getValueS());

  // int message[]={
  //  1, // adresse pwm
  //   sens1, // sens de rotation 0 ou 1
  //   valeur1   // vitesse
  //  };
  // MySerialPort.write(message[0]);
  //  MySerialPort.write(message[1]);
  // MySerialPort.write(message[2]);
  // MySerialPort.write('\n');
  // delay(2);



  //int message2[]={
  //   2, // adresse pwm
  //   sens, // sens de rotation 0 ou 1
  //   valeur2   // vitesse
  // };

  // MySerialPort.write(message2[0]);
  // MySerialPort.write(message2[1]);
  // MySerialPort.write(message2[2]);
  // MySerialPort.write('\n');
  //delay(2);

  //int message3[]={
  //   3, // adresse pwm
  //  sens, // sens de rotation 0 ou 1
  //  valeur3   // vitesse
  //};

  // MySerialPort.write(message3[0]);
  // MySerialPort.write(message3[1]);
  // MySerialPort.write(message3[2]);
  // MySerialPort.write('\n');
  //delay(2);

  //  int message4[]={
  //   5, // adresse pwm
  //  sens, // sens de rotation 0 ou 1
  //   valeur4   // vitesse
  // };

  // MySerialPort.write(message4[0]);
  //  MySerialPort.write(message4[1]);
  // MySerialPort.write(message4[2]);


  // MySerialPort.write('\n');
  //delay(2);

  // message5[]={
  //4, // adresse pwm
  //sens, // sens de rotation 0 ou 1
  //    valAig4   // vitesse
  // };

  //MySerialPort.write(message5[0]);
  // MySerialPort.write(message5[1]);
  // MySerialPort.write(message5[2]);


  // MySerialPort.write('\n');
  //delay(2);

  println ("Valeur : " + MySerialPort.read () + "  Reponse arduino ");



  //  delay(50);
}

// Use this method to add additional statements
// to customise the GUI controls
public void customGUI() {
}


Code: Tout sélectionner
/* =========================================================
* ====                   WARNING                        ===
* =========================================================
* The code in this tab has been generated from the GUI form
* designer and care should be taken when editing this file.
* Only add/edit code inside the event handlers i.e. only
* use lines between the matching comment tags. e.g.

void myBtnEvents(GButton button) { //_CODE_:button1:12356:
// It is safe to enter your event code here 
} //_CODE_:button1:12356:

* Do not rename this tab!
* =========================================================
*/

public void aig1_click1(GButton source, GEvent event) { //_CODE_:aig1:389626:
  //println("aig1 - GButton >> GEvent." + event + " @ " + millis());
  aiguillage1 = !  aiguillage1 ;
  if (aiguillage1) {
    valAig1 = 0;  //valeur de l' angle de depart voulu pour le servo
  } else
  {
    valAig1= 60; //valeur de l' angle de fin voulu pour le servo
  }
  int message[]={
  51, // adresse pwm
    sens, // sens de rotation 0 ou 1
    valAig1// vitesse
   
  };
 
   MySerialPort.write(message[0]);
  MySerialPort.write(message[1]);
  MySerialPort.write(message[2]);
   
  //delay(10);
} //_CODE_:aig1:389626:

public void aig2_click1(GButton source, GEvent event) { //_CODE_:aig2:753559:
  //println("aig2 - GButton >> GEvent." + event + " @ " + millis());

  aiguillage2 = !  aiguillage2 ;
  if (aiguillage2) {
    valAig2 = 0; //valeur de l' angle de depart voulu pour le servo
  } else
  {
    valAig2= 60;//valeur de l' angle de fin voulu pour le servo
  }
  int message[]={
  52, // adresse pwm
    sens, // sens de rotation 0 ou 1
    valAig2   // vitesse
  };
 
   MySerialPort.write(message[0]);
  MySerialPort.write(message[1]);
  MySerialPort.write(message[2]);
  //delay(10);
} //_CODE_:aig2:753559:

public void aig3_click1(GButton source, GEvent event) { //_CODE_:aig3:
  //println("aig3 - GButton >> GEvent." + event + " @ " + millis());
  aiguillage3 = !  aiguillage3 ;
  if (aiguillage3) {
    valAig3 = 0; //valeur de l' angle de depart voulu pour le servo
  } else
  {
    valAig3= 60;//valeur de l' angle de fin voulu pour le servo
  }
  int message[]={
  53, // adresse pwm
    sens, // sens de rotation 0 ou 1
    valAig3   // vitesse
  };
 
   MySerialPort.write(message[0]);
  MySerialPort.write(message[1]);
  MySerialPort.write(message[2]);
// delay(10);
} //_CODE_:aig3:

public void aig4_click1(GButton source, GEvent event) { //_CODE_:aig4:
  //println("aig4 - GButton >> GEvent." + event + " @ " + millis());

  aiguillage4 = !  aiguillage4 ;
  if (aiguillage4) {
    valAig4 = 0; //valeur de l' angle de depart voulu pour le servo
  } else
  {
    valAig4= 60;//valeur de l' angle de fin voulu pour le servo
  }
int message[]={
  54, // adresse pwm
    sens, // sens de rotation 0 ou 1
    valAig4   // vitesse
  };
 
   MySerialPort.write(message[0]);
  MySerialPort.write(message[1]);
  MySerialPort.write(message[2]);
// delay(10);
} //_CODE_:aig4

public void aig5_click1(GButton source, GEvent event) { //_CODE_:aig5:669227:
  //println("aig5 - GButton >> GEvent." + event + " @ " + millis());
  aiguillage5 = !  aiguillage5 ;
  if (aiguillage5) {
    valAig5 = 0; //valeur de l' angle de depart voulu pour le servo
  } else
  {
    valAig5 = 60;//valeur de l' angle de fin voulu pour le servo
  }
   int message[]={
  55, // adresse pwm
    sens, // sens de rotation 0 ou 1
    valAig5   // vitesse
  };
 
   MySerialPort.write(message[0]);
  MySerialPort.write(message[1]);
  MySerialPort.write(message[2]);
  delay(1);
} //_CODE_:aig5:669227:

public void aig6_click1(GButton source, GEvent event) { //_CODE_:aig6:705370:
  //println("aig6 - GButton >> GEvent." + event + " @ " + millis());
  aiguillage6 = !  aiguillage6 ;
  if (aiguillage6) {
    valAig6 = 0; //valeur de l' angle de depart voulu pour le servo
  } else
  {
    valAig6 = 60;//valeur de l' angle de fin voulu pour le servo
  }
   int message[]={
  56, // adresse pwm
    sens, // sens de rotation 0 ou 1
    valAig6   // vitesse
  };
 
   MySerialPort.write(message[0]);
  MySerialPort.write(message[1]);
  MySerialPort.write(message[2]);
  delay(1);
} //_CODE_:aig6:705370:

public void aig7_click1(GButton source, GEvent event) { //_CODE_:aig7:556064:
  // println("aig7 - GButton >> GEvent." + event + " @ " + millis());
  aiguillage7 = !  aiguillage7 ;
  if (aiguillage7) {
    valAig7 = 0; //valeur de l' angle de depart voulu pour le servo
  } else
  {
    valAig7= 60;//valeur de l' angle de fin voulu pour le servo
  }
   int message[]={
  57, // adresse pwm
    sens, // sens de rotation 0 ou 1
    valAig7   // vitesse
  };
 
   MySerialPort.write(message[0]);
  MySerialPort.write(message[1]);
  MySerialPort.write(message[2]);
  delay(1);
} //_CODE_:aig7:556064:

public void aig8_click1(GButton source, GEvent event) { //_CODE_:aig8:842218:
  // println("aig8 - GButton >> GEvent." + event + " @ " + millis());
  aiguillage8 = !  aiguillage8 ;
  if (aiguillage8) {
    valAig8 = 0; //valeur de l' angle de depart voulu pour le servo
  } else
  {
    valAig8 = 60;//valeur de l' angle de fin voulu pour le servo
  }
   int message[]={
  58, // adresse pwm
    sens, // sens de rotation 0 ou 1
    valAig8   // vitesse
  };
 
   MySerialPort.write(message[0]);
  MySerialPort.write(message[1]);
  MySerialPort.write(message[2]);
  delay(1);
} //_CODE_:aig8:842218:

public void aig9_click1(GButton source, GEvent event) { //_CODE_:aig9:890996:
  println("aig9 - GButton >> GEvent." + event + " @ " + millis());
  aiguillage9 = !  aiguillage9 ;
  if (aiguillage9) {
    valAig9 = 0; //valeur de l' angle de depart voulu pour le servo
  } else
  {
    valAig9 = 60;//valeur de l' angle de fin voulu pour le servo
  }
   int message[]={
  59, // adresse pwm
    sens, // sens de rotation 0 ou 1
    valAig9   // vitesse
  };
 
   MySerialPort.write(message[0]);
  MySerialPort.write(message[1]);
  MySerialPort.write(message[2]);
  delay(1);
} //_CODE_:aig9:890996:

public void aig10_click1(GButton source, GEvent event) { //_CODE_:aig10:575528:
  //  println("aig10 - GButton >> GEvent." + event + " @ " + millis());
  aiguillage10 = !  aiguillage10 ;
  if (aiguillage10) {
    valAig10 = 0; //valeur de l' angle de depart voulu pour le servo
  } else
  {
    valAig10 = 60;//valeur de l' angle de fin voulu pour le servo
  }
   int message[]={
  60, // adresse pwm
    sens, // sens de rotation 0 ou 1
    valAig10   // vitesse
  };
 
   MySerialPort.write(message[0]);
  MySerialPort.write(message[1]);
  MySerialPort.write(message[2]);
  delay(1);
} //_CODE_:aig10:575528:

public void pwm1_slider1_change1(GCustomSlider source, GEvent event) { //_CODE_:pwm1_slider1:740886:
  // println("pwm1_slider1 - GCustomSlider >> GEvent." + event + " @ " + millis());
} //_CODE_:pwm1_slider1:740886:

public void pwm2_slider1_change1(GCustomSlider source, GEvent event) { //_CODE_:pwm2_slider1:279341:
  //println("pwm2_slider1 - GCustomSlider >> GEvent." + event + " @ " + millis());
} //_CODE_:pwm2_slider1:279341:

public void textfield1_change1(GTextField source, GEvent event) { //_CODE_:pwm1:383831:
  println("pwm1 - GTextField >> GEvent." + event + " @ " + millis());
} //_CODE_:pwm1:383831:

public void textfield1_change2(GTextField source, GEvent event) { //_CODE_:pwm2:972109:
  println("pwm2 - GTextField >> GEvent." + event + " @ " + millis());
} //_CODE_:pwm2:972109:

public void pwm3_slider1_change1(GCustomSlider source, GEvent event) { //_CODE_:pwm3_slider1:780657:
  //println("pwm3_slider1 - GCustomSlider >> GEvent." + event + " @ " + millis());
} //_CODE_:pwm3_slider1:780657:

public void pwm4_slider1_change1(GCustomSlider source, GEvent event) { //_CODE_:pwm4_slider1:601549:
  // println("pwm4_slider1 - GCustomSlider >> GEvent." + event + " @ " + millis());
} //_CODE_:pwm4_slider1:601549:

public void textfield1_change3(GTextField source, GEvent event) { //_CODE_:pwm3:692294:
  println("pwm3 - GTextField >> GEvent." + event + " @ " + millis());
} //_CODE_:pwm3:692294:

public void textfield1_change4(GTextField source, GEvent event) { //_CODE_:pwm4:551334:
  println("pwm4 - GTextField >> GEvent." + event + " @ " + millis());
} //_CODE_:pwm4:551334:



// Create all the GUI controls.
// autogenerated do not edit
public void createGUI() {
  G4P.messagesEnabled(false);
  G4P.setGlobalColorScheme(GCScheme.BLUE_SCHEME);
  G4P.setCursor(ARROW);
  surface.setTitle("Sketch Window");
  aig1 = new GButton(this, 50, 50, 60, 30);
  aig1.setText("Aiguillage 1");
  aig1.addEventHandler(this, "aig1_click1");
  aig2 = new GButton(this, 120, 50, 60, 30);
  aig2.setText("Aiguillage 2");
  aig2.addEventHandler(this, "aig2_click1");
  aig3 = new GButton(this, 190, 50, 60, 30);
  aig3.setText("Aiguillage 3");
  aig3.addEventHandler(this, "aig3_click1");
  aig4 = new GButton(this, 260, 50, 60, 30);
  aig4.setText("Aiguillage 4");
  aig4.addEventHandler(this, "aig4_click1");
  aig5 = new GButton(this, 330, 50, 60, 30);
  aig5.setText("Aiguillage 5");
  aig5.addEventHandler(this, "aig5_click1");
  aig6 = new GButton(this, 50, 90, 60, 30);
  aig6.setText("Aiguillage 6");
  aig6.addEventHandler(this, "aig6_click1");
  aig7 = new GButton(this, 120, 90, 60, 30);
  aig7.setText("Aiguillage 7");
  aig7.addEventHandler(this, "aig7_click1");
  aig8 = new GButton(this, 190, 90, 60, 30);
  aig8.setText("Aiguillage 8");
  aig8.addEventHandler(this, "aig8_click1");
  aig9 = new GButton(this, 260, 90, 60, 30);
  aig9.setText("Aiguillage 9");
  aig9.addEventHandler(this, "aig9_click1");
  aig10 = new GButton(this, 330, 90, 60, 30);
  aig10.setText("Aiguillage 10");
  aig10.addEventHandler(this, "aig10_click1");
  pwm1_slider1 = new GCustomSlider(this, 95, 140, 150, 40, "red_yellow18px");
  pwm1_slider1.setRotation(PI/2, GControlMode.CORNER);
  pwm1_slider1.setLimits(0, 255, -255);
  pwm1_slider1.setNumberFormat(G4P.INTEGER, 0);
  pwm1_slider1.setLocalColorScheme(GCScheme.RED_SCHEME);
  pwm1_slider1.setOpaque(false);
  pwm1_slider1.addEventHandler(this, "pwm1_slider1_change1");
  pwm2_slider1 = new GCustomSlider(this, 141, 140, 150, 40, "red_yellow18px");
  pwm2_slider1.setRotation(PI/2, GControlMode.CORNER);
  pwm2_slider1.setLimits(0, 255, -255);
  pwm2_slider1.setNumberFormat(G4P.INTEGER, 0);
  pwm2_slider1.setLocalColorScheme(GCScheme.RED_SCHEME);
  pwm2_slider1.setOpaque(false);
  pwm2_slider1.addEventHandler(this, "pwm2_slider1_change1");
  pwm1 = new GTextField(this, 50, 300, 40, 30, G4P.SCROLLBARS_NONE);
  pwm1.setText("pwm 1");
  pwm1.setOpaque(false);
  pwm1.addEventHandler(this, "textfield1_change1");
  pwm2 = new GTextField(this, 100, 300, 40, 30, G4P.SCROLLBARS_NONE);
  pwm2.setText("pwm 2");
  pwm2.setOpaque(true);
  pwm2.addEventHandler(this, "textfield1_change2");
  pwm3_slider1 = new GCustomSlider(this, 190, 140, 150, 40, "red_yellow18px");
  pwm3_slider1.setRotation(PI/2, GControlMode.CORNER);
  pwm3_slider1.setLimits(0, 255, -255);
  pwm3_slider1.setNumberFormat(G4P.INTEGER, 0);
  pwm3_slider1.setLocalColorScheme(GCScheme.RED_SCHEME);
  pwm3_slider1.setOpaque(false);
  pwm3_slider1.addEventHandler(this, "pwm3_slider1_change1");
  pwm4_slider1 = new GCustomSlider(this, 240, 141, 150, 40, "red_yellow18px");
  pwm4_slider1.setRotation(PI/2, GControlMode.CORNER);
  pwm4_slider1.setLimits(0, 255, -255);
  pwm4_slider1.setNumberFormat(G4P.INTEGER, 0);
  pwm4_slider1.setLocalColorScheme(GCScheme.RED_SCHEME);
  pwm4_slider1.setOpaque(false);
  pwm4_slider1.addEventHandler(this, "pwm4_slider1_change1");
  pwm3 = new GTextField(this, 150, 300, 40, 30, G4P.SCROLLBARS_NONE);
  pwm3.setText("pwm 3");
  pwm3.setOpaque(true);
  pwm3.addEventHandler(this, "textfield1_change3");
  pwm4 = new GTextField(this, 201, 300, 40, 30, G4P.SCROLLBARS_NONE);
  pwm4.setText("pwm 4");
  pwm4.setOpaque(true);
  pwm4.addEventHandler(this, "textfield1_change4");
}

// Variable declarations
// autogenerated do not edit
GButton aig1;
GButton aig2;
GButton aig3;
GButton aig4;
GButton aig5;
GButton aig6;
GButton aig7;
GButton aig8;
GButton aig9;
GButton aig10;
GCustomSlider pwm1_slider1;
GCustomSlider pwm2_slider1;
GTextField pwm1;
GTextField pwm2;
GCustomSlider pwm3_slider1;
GCustomSlider pwm4_slider1;
GTextField pwm3;
GTextField pwm4;


J' espère cette fois ci avoir un peu d' aide de votre part avant d ' avoir grillé tous mes Arduinos :lol:
SYLTRAIN80
 
Messages: 29
Inscrit le: Mar 24 Fév 2015, 10:47
Echelle pratiquée: HO - N
Prénom: Sylvain

Re: Conseil sur faisabilité de mon projet

Publié: Sam 05 Mars 2016, 17:43 
Bonjour SYLTRAIN80,

Dans ton premier programme, tu as neutralisé plusieurs lignes de programme, pensant que c'était elles qui avaient fait griller tes Arduinos.

Ce qu'il faudrait, c'est avoir la façon dont tes Arduinos sont branchés avec le monde extérieur car des lignes de programme ne vont pas griller un module, ce qui le fait griller, ce sont des tensions ou des intensités trop grandes par rapport à ce que le module peut supporter. Donc, ce que tu as écrit me rend perplexe...
Avatar de l’utilisateur
Arduino
Prolixe
 
Messages: 1616
Inscrit le: Mer 25 Sep 2013, 17:14

Re: Conseil sur faisabilité de mon projet

Publié: Sam 05 Mars 2016, 18:11 
J' ai du mal comprendre aussi pourquoi
Chaque arduino est alimenté par un câble USB de mon PC et les cartes RS485 par les arduinos
Le problème vient peut être d un televersement de programme alors que le bus était encore sous tension avec les autres cartes ?
SYLTRAIN80
 
Messages: 29
Inscrit le: Mar 24 Fév 2015, 10:47
Echelle pratiquée: HO - N
Prénom: Sylvain

Re: Conseil sur faisabilité de mon projet

Publié: Sam 05 Mars 2016, 18:31 
Voici 2 photos de mon installationImageImage
SYLTRAIN80
 
Messages: 29
Inscrit le: Mar 24 Fév 2015, 10:47
Echelle pratiquée: HO - N
Prénom: Sylvain

Re: Conseil sur faisabilité de mon projet

Publié: Sam 05 Mars 2016, 21:30 
SYLTRAIN80 a écrit:J' ai du mal comprendre aussi pourquoi
....
Le problème vient peut être d un televersement de programme alors que le bus était encore sous tension avec les autres cartes ?


Possible, mais comment sont alimentés tes servos que je vois sur la photo ?
Avatar de l’utilisateur
Arduino
Prolixe
 
Messages: 1616
Inscrit le: Mer 25 Sep 2013, 17:14

Re: Conseil sur faisabilité de mon projet

Publié: Sam 05 Mars 2016, 22:34 
Ils sont alimentés par l Arduino mais 1 seul est actionné à la fois donc je ne pense pas que le pb soit la
J ai essayé les 2 Arduino HS sur un autre PC ils sont reconnus sur les ports USB mais le televersement du code n' abouti pas
SYLTRAIN80
 
Messages: 29
Inscrit le: Mar 24 Fév 2015, 10:47
Echelle pratiquée: HO - N
Prénom: Sylvain

Re: Conseil sur faisabilité de mon projet

Publié: Dim 06 Mars 2016, 00:40 
Concernant ton installation, à part l'Arduino Mega que j'ai reconnu, à quoi servent les autres cartes ?

Une semble gérer les servos : une carte du commerce ? Origine connue pour être sans problème ? Que conseille la notice concernant l'alimentation des servos ? Parce qu'il y a un jack d'alimentation il semble...

Pour le reste, tu utilises Serial (broche 0 et 1) et Serial1 (broches 19 et 18) pour communiquer ; suivant le protocole RS485 ? Pourquoi mettre la broche 20 à l'état haut ou bas avant ? As-tu essayé de transmettre à une vitesse plus basse ?

D'après ce que tu décris, on a l'impression que c'est le module de communication série qui est HS dans le µC ou bien le bootloader qui en aurait pris un coup. Pourquoi et comment ? J'avoue que je sèche un peu.
Avatar de l’utilisateur
Arduino
Prolixe
 
Messages: 1616
Inscrit le: Mer 25 Sep 2013, 17:14

Re: Conseil sur faisabilité de mon projet

Publié: Dim 06 Mars 2016, 14:26 
Oui effectivement je pense aussi que le module de communication série est HS
Concernant les modules i/o des nanos ils sont maintenant alimentés par une alimentation commune à partir des jacks des modules.
Afin de limiter les problèmes je démonte systématiquement les nanos avant de les reprogrammer .
Reste mon problème de gestion des modules rs485
Aujourd'hui les nanos arrivent à lire le message mais pas à répondre
SYLTRAIN80
 
Messages: 29
Inscrit le: Mar 24 Fév 2015, 10:47
Echelle pratiquée: HO - N
Prénom: Sylvain

Re: Conseil sur faisabilité de mon projet

Publié: Dim 06 Mars 2016, 14:47 
Tu peux peut-être réparer ton module Uno en achetant ceci :
http://www.conrad.fr/ce/fr/product/0920 ... archDetail

Le bootloader est déjà inclus, donc il n'y a qu'à échanger le µC mort contre un neuf vu qu'il y a un support de CI.

Pour le Mega2560, c'est pas la même histoire à moins d'être équippé pour dessouder et souder des CMS !

Bon, je ne veux pas faire de la pub pour Conrad, ce n'est pas le moins cher, mais ce qui existe chez Conrad existe peut-être aussi ailleurs... :wink:
Avatar de l’utilisateur
Arduino
Prolixe
 
Messages: 1616
Inscrit le: Mer 25 Sep 2013, 17:14

Re: Conseil sur faisabilité de mon projet

Publié: Dim 06 Mars 2016, 20:27 
Merci pour ce renseignement mais mes Arduino ne sont pas réparable car tous les composants sont des Cms (origine chinoise)
Mais nouveau pb mon alimentation des modules i/o en 9,5 volts pose problème sur le nano car au bout d un certain temps le nano ne s alimente plus par le module et de façon définitive , mais reste fonctionnel si on l alimente par le câble USB ?
Je n'arrive pas à trouver de Doc pour ces modules i/o pour nano acheté sur le net.
Je ne connait pas les caractéristiques pour les capacités d alimentation .
SYLTRAIN80
 
Messages: 29
Inscrit le: Mar 24 Fév 2015, 10:47
Echelle pratiquée: HO - N
Prénom: Sylvain

Précédent

Retour vers Arduino

Qui est en ligne ?

Utilisateur(s) parcourant actuellement ce forum : Aucun utilisateur inscrit et 1 invité