Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - bobyAndCo

Pages: 1 ... 18 19 [20] 21 22 ... 27
286
Bibliothèques / Re : Bibliothèque Nmra.Dcc.h
« le: octobre 24, 2017, 09:11:13 pm »
Alors moi je fais du modélisme ferroviaire, pas du planeur !!! Là j'avoue ne plus rien comprendre du tout. Sans avoir examiné plus que cela la source que tu cites :

Le programme que j'ai pris comme base de travail (NMRADccMultiFunctionDecoder_1) lit ces données dans la partie "déclaration des données" et non pas dans la partie setup ou loop.

et que je trouve sur le GitHub ici : https://github.com/mrrwa/NmraDcc/blob/master/examples/NmraDccMultiFunctionDecoder_1/NmraDccMultiFunctionDecoder_1.ino

je vois un superbe void setup() ligne 163 et encore un void loop() ligne 184. Et qui plus est, le fichier possède une extension .ino bien rassurante dans notre petit univers Arduino.

287
Bibliothèques / Re : Bibliothèque Nmra.Dcc.h
« le: octobre 24, 2017, 06:15:06 pm »
Merci Dominique pour ces précisions.

Benoit,

Il faut que tu nous adresses l'intégralité de ton code sinon, c'est presque impossible de le comprendre et encore moins de le tester. En bas à gauche de la fenêtre de rédaction de message, tu as un lien "Fichiers joints et autres options..." puis plus bas quand tu cliques sur le lien choisissez un fichier. Tu sélectionnes alors ton fichier .ino.

Bien amicalement.

Christophe

288
Bibliothèques / Re : Bibliothèque Nmra.Dcc.h
« le: octobre 23, 2017, 08:59:26 am »
En relisant mon message, je me suis aperçu qu'il y avait d'autres erreurs :

Je doute que tes servos fonctionnent dans des plage de 0 à 255 ! Tout au plus, un servo a un angle d'action de 180°.

Petit conseil, la fonction writeMicroseconds() offre un nombre de pas plus important (de 700 à 2300 bien souvent) ce qui permet des mouvements plus fluides et des positions d'arrivée plus précises.

Plutôt qu'un long discours  :



Enfin, dans les boucles for je te suggère d'utiliser les incrémentations pos++ ou décrémentations pos-- plus conventionnelles et surtout plus compactes.

Bien amicalement,

Christophe

289
Bibliothèques / Re : Bibliothèque Nmra.Dcc.h
« le: octobre 22, 2017, 09:54:02 am »
Bonjour,

Tout d'abord, pense à utiliser la balise code quand tu mets des programmes sur le forum, c'est plus clair et lisible.

J'aimerai que cette montée ou descente n'intervienne qu'au moment de l'appui sur le bouton de la MS2.

Je ne comprends pas bien ton code, il n'y a pas de setUp et pas de loop. Même si tu ne devais rien avoir à l'intérieur de ces balises, elles doivent être écrites dans le code.

Ensuite, je ne vois pas non plus de déclaration et encore moins d'initialisation pour FuncState et FN_BIT_01 ???

Bref, il vaudrait mieux que tu envoies "tout" le code, éventuellement en fichier joint.

Quoiqu'il en soit, il semble assez évident que c'est la variable FuncState qui devrait permettre que le programme ne fonctionne pas en continue. Il faut donc que cette condition soit vérifiée seule tout d'abord et non pas if( (FuncState && FN_BIT_01) == 1). Dans ce cas, le else est toujours exécuté quand  FuncState est à false. N'ayant pas tout le code, il n'est pas évident de comprendre tout ton programme, mais une rédaction comme ci-dessous devrait permettre que ça fonctionne mieux. A la fin du programme, tu vois que j'ai ajouté FuncState == false qui remet la variable FuncState à false jusqu'à ce qu'une nouvelle commande la remette à true et permette la montée ou la descente du pantographe.

Mais on peut aussi se demander si FuncState sert à quelque chose dans ton programme !

Bien amicalement.

Christophe



bool FuncState = false;

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  if (FuncState) { // L'action a été lancée, FuncState est à true
    if (FN_BIT_01) == 1) {// Condition MS2-F01 = 1
      for (pos = 0; pos <= 255; pos += 1) { // goes from 0 degrees to 255 degrees in steps of 1 degree
        PANTOGRAPHE.write(pos);              // tell servo to go to position in variable 'pos'
        delay(15);                       // waits 15ms for the servo to reach the position
        Serial.print("MONTEE PANTOGRAPHE:");
      } // End for
    }// End if
    else { // Condition MS2-F01 = 0
      for (pos = 255; pos >= 0; pos -= 1) { // goes from 255 degrees to 0 degrees
        PANTOGRAPHE.write(pos);              // tell servo to go to position in variable 'pos'
        delay(15);                       // waits 15ms for the servo to reach the position
        Serial.print("DESCENTE PANTOGRAPHE:");
      } // End for
    }// End else

    FuncState == false; // On met FuncState à false pour éviter de tourner sans fin

  }
}




290
Présentez vous ! / Re : Présentation nouveau membre
« le: septembre 21, 2017, 05:52:49 am »
Bonjour Marco,

Ce dont tu parles m'intéresse beaucoup et devrait aussi je pense en intéresser d'autres. Tout d'abord JMRI et toute la suite d'applications dans son sillage sont des produits très performants et aboutis. Tellement complets que ça semble vraiment complexe à prendre en main. Mais je pense que ça doit permettre de répondre à pas mal de besoins des modélistes ferroviaires. Et autant que j'ai pu en voir, une bonne partie de la documentation est en français.

Par ailleurs, JMRI est compatible avec DCC++ (c'est plutôt bien vu à Locoduino) et si en plus c'est compatible avec les bibliothèque de Thierry, alors là...

N'y aurait-il pas moyen de se dispenser de Sprog qui vaut tout de même de l'ordre de 70€ ?

Ce serait bien si tu pouvais nous faire de petits retours sur tes configurations et tests. Sur un nouveau fil de préférence.

Pour t'aider à résoudre ton problème, il faudrait que tu mettes ton code Arduino en téléchargement avec "Fichiers joints et autres options…" en bas à gauche de la fenêtre de rédaction de message.

Bienvenue et bien amicalement.

Christophe

291
Vos projets / Re : COMMANDE MOTEUR TORTOISE NEXTION
« le: septembre 18, 2017, 01:56:15 pm »
Quelques réflexions à la suite du projet de Marcel maintenant opérationnel.

L'exemple de lecture des messages envoyés par le NEXTION à l'Arduino :

if (message !="") {
 if (message == "65 0 1 0 ffff ffff ffff") {
    ......
 }
}

Cet exemple est très présent sur internet sans doute parce qu'il a le grand avantage de la simplicité. Après 65, le chiffre est le n° de la page dans laquelle est implanté le bouton, le deuxième chiffre nous l'avons vu est le n° du bouton sur lequel on a appuyé, le troisième chiffre, l'état du bouton; 0 (zéro) bouton appuyé, 1 bouton relaché. Attention donc, quand on appuie sur un bouton et qu'on le relache, le NEXTION envoie 2 messages : "65 0 1 0 ffff ffff ffff" position DOWN, "65 0 1 1 ffff ffff ffff" position UP.

Ce type de message est donc facile à interpréter dans un programme Arduino comme on le voit dans le scketch de Marcel. A mon avis, une meilleure solution aurait même été d’utiliser la fonction sscanf qui permet d’extraire rapidement et facilement les valeurs du message qui sont séparées par un espace :

// String message == "65 0 1 0 ffff ffff ffff"
int ns;        // Non signifiant
int page;        // numéro de la page
char bouton[3];           // numéro du bouton (hexadecimal)
int etat              // Etat du bouton
 
sscanf(message, "%d %d %s %d", &ns, &page, bouton, &etat);

La fonction sscanf permet de récupérer les valeurs significatives et en décimal (ou alpha pour le n° du bouton) dans des variables déclarées juste avant. Pratique et puissant !

Mais ce type de sketch fonctionne avec une bibliothèque <Nextion.h> disponible ici : https://github.com/bborncr/nextion qui porte le même nom que la bibliothèque "officielle" <Nextion.h> disponible ici : https://github.com/itead/ITEADLIB_Arduino_Nextion bibliothèque par ailleurs autrement plus complète que la première. Elle permet entre autres choses l'échange d'informations entre l'écran et l'Arduino et entre l'Arduino et l'écran ce que ne permet pas la première.

Il y a donc conflit qui pourrait se résoudre en changeant le nom du fichier pour la première bibliothèque puis en modifiant le début du code également pour ce nouveau fichier ".h". Compliqué donc, d'autant qu'il est à peu prés certain que les deux bibliothèques chargées dans le même sketch entreront en conflit.

Voilà, il n'y a probablement pas de solution miracle. Soit, à mon avis, votre Nextion ne vous sert que d'écran tactile avec des boutons pour déclancher des actions au travers de l'Arduino; alors la première bibliothèque, utilisée comme Marcel l'a fait, à laquelle vous pouvez ajouter la fonction sscanf que je vous ai proposée, cette bibliothèque donc peut vous suffire.

Soit vous voulez réaliser des projets plus élaborés et il vous faudra recourir à la bibliothèque officielle et "oublier" la première.

Christophe

292
Présentez vous ! / Re : gestion canton avec arduino
« le: septembre 17, 2017, 12:12:51 pm »
Bonjour Jean-Bernard,

Je trouve assez bizarre le procédé !!!

Si encore le code que tu présentes n'avait pas d'erreurs, mais ce n'est pas le cas (variables non déclarées, syntaxe fausse...) Et donc au final un code qui ne fonctionne pas.

Locoduino est me semble t'il un site de partage. Alors soit tu partages, soit tu ne partages pas. De toutes les façons, rien qu'à voir la "tête" de ton code, je ne suis pas certain que les programmeurs Arduino et c++ aient quelque chose à apprendre de ton œuvre !

Sur ce et bien amicalement.

Christophe

293
Vos projets / Re : COMMANDE MOTEUR TORTOISE NEXTION
« le: septembre 15, 2017, 08:34:20 pm »

Le problème est décrit sur internet et j'ai chargé la bibliothèque Nextion modifiée ici : https://github.com/bborncr/nextion. Je l'ai installée à partir du menu "ajouter la bibliothèque.zip", sans enlever l'autre bibliothèque NeoNextion

Ouuuuuh là, c'est inquiétant. Avec le téléchargement et l'installation du zip, ça marche maintenant chez moi. Alors que je rappelle qu'avec le terminal, ça n'avait pas fonctionné.

294
Vos projets / Re : COMMANDE MOTEUR TORTOISE NEXTION
« le: septembre 15, 2017, 08:15:33 pm »
Bon, j'ai aussi fait la même manip (charger la biblio de "bborncr/nextion") mais par le terminal. Et ça ne marche pas chez moi. Oui c'est assez inquiétant que deux biblio portent le même nom mais ne sont absolument pas substituables.

Seul Marcel à l'équipement pour tester totalement mais il rencontre un bug sur la ligne 59 : val = strtoul(message[6], 0, 16);

Je lui ai envoyé un nouveau code de test... A suivre !

Bien amicalement.
Christophe


295
Vos projets / Re : COMMANDE MOTEUR TORTOISE NEXTION
« le: septembre 15, 2017, 09:46:20 am »
Bon, j'ai récupéré un MEGA et mon IDE Arduino. Mais ça commence mal. J'ai une erreur à la compilation :

sketch_sep15a:46: error: 'class Nextion' has no member named 'listen'
   String message = myNextion.listen(); //check for message

La bibliothèque est installée et reconnue. J'ai passé les premières étapes de compilation comme  myNextion.init();

Il se dit sur les forum qu'il y aurait peut-être une incompatibilité avec la biblio : SoftwareSerial.h ??? Peux-tu me confirmer Marcel que tu arrives à lire : String message = myNextion.listen(); ? Moi je suis en Mac avec l'IDE en 1.8.3.

Je me demande dans quelle mesure ce code dont tu as recopié les bases sur des forum est fiable.

Quelqu'un a t'il des infos en particulier sur l'utilisation de SoftwareSerial.h ?

Est-il possible que quelques uns puisse aussi tester ce code ?

#include <SoftwareSerial.h>
#include <Nextion.h>
//#include "Nextion.h"
#define YES !1
#define NO !0
#define NBRE_MOTEURS 16
#define DUREE_IMPULS_MOTEUR 100
SoftwareSerial nextion(10, 11);
Nextion myNextion(nextion, 9600);

const byte relais[] = {22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52};
const byte pinOut[] = {23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53};
bool buttonState[NBRE_MOTEURS];
unsigned long previous[NBRE_MOTEURS];

// int recv, trxv; -> mis en commentaire car ne semble pas être utilisé !!!
String message;

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

  for ( int i = 0; i < NBRE_MOTEURS; i++) {
    buttonState[i] = 0;
    pinMode(pinOut[i],  OUTPUT);
    digitalWrite(pinOut[i], LOW); // Toutes les pins sont mises à LOW
    pinMode((relais[i]), OUTPUT);
    digitalWrite((relais[i]), NO);
    previous[i] = 0;
  }

  while (!Serial) {};
  Serial.println("Serial On");

  int brightness = 255;
  int bright = map(brightness, 0, 1024, 0, 100);
  String dim = "dim=" + String(bright);
  myNextion.sendCommand(dim.c_str());

} // Fin Setup

void loop()
{
  String message = myNextion.listen(); //check for message
  if (message != "") {
    //Serial.println(message, HEX); // En l'etat, ne retourne sans doute rien de signifiant
      int val;
      switch (message[6]) {
      case '1':
        if (message[7] == '0')
          val = 16;
        else
          val = 1;
        break;
      default:
        val = strtoul(message[6], 0, 16);
    }

    buttonState[val] = !buttonState[val];
    digitalWrite(relais[val], buttonState[val]);
    digitalWrite(pinOut[val], HIGH);
    previous[val] = millis(); // On enregistre l'heure qu'il est
  } // End of -> if (message != "")

  for(int i = 0; i < NBRE_MOTEURS; i++) {
    if(pinOut[i] == HIGH) { // Pour les seules pin en etat haut
      if(millis() - previous[i] > DUREE_IMPULS_MOTEUR) { // l'interval est dépassé
        digitalWrite(pinOut[i], LOW); // On met la pin à LOW
      }
    }
  }
} // Fin Loop


296
Vos projets / Re : COMMANDE MOTEUR TORTOISE NEXTION
« le: septembre 15, 2017, 06:36:25 am »
Ok, je comprends mieux. Sinon, je ne voyais pas l'intérêt de conserver l'état du bouton dans la variable buttonState

En fait, dans le loop, l'appui sur un bouton permet de changer l'état d'un relais (et donc de l'aiguille) en mettant simultanément les deux pins paires et impaires (exemple 22 et 23) à l'état HIGH. Ce n'est pas une pin à HIGH et l'autre à LOW on est bien d'accord ? Puis il faut une nouvelle impulsion sur le même bouton pour mettre ces mêmes deux pins à LOW et du coup faire revenir l'aiguille dans sa position initiale.

Il n'y a donc pas besoin de faire revenir les pins automatiquement à leur état LOW après un petits laps de temps comme je le faisais avec la fonction delay() ou millis(). Ce qui simplifirait encore le code.

Par ailleurs, au démarrage du MEGA, tel que c'est actuellement, toutes tes pins sont commutées sur LOW, donc toutes tes aiguilles sont dans la même position. Tu ne cherches pas à enregistrer en EEPROM la position que tu souhaiterais au démarrage pour chacune des aiguilles, tournée ou non tournée ?

Merci de me confirmer ces points et je te proposerai un code modifié.

PS : Tu vas encore me trouver un peu ch**nt, mais si les deux pins paires et impaires envoient en même temps le même signal électrique (5V ou 0V), pourquoi ne pas utiliser une seule pin et faire le dédoublement (distribution) au niveau du relais ??? Si encore, une envoyait un HIGH sur une pin et sur l'autre un LOW, mon petit cerveau comprendrait sans doute mieux. Mais, tu me diras peut-être, avec 53 pins sur un MEGA, au diable l'avarice !!! De plus, ça ne change rien fondamentalement au code.

Bien amicalement.

Christophe

297
Vos projets / Re : COMMANDE MOTEUR TORTOISE NEXTION
« le: septembre 14, 2017, 08:20:41 pm »
Au fait Marcel, il y a quoi relié à tes pins impaires : 23 à 53 ???

298
Les réseaux / Re : Projet Dominique
« le: septembre 14, 2017, 05:58:07 pm »
Ouuuuuuh, là, les projets permettent de rester jeune. Tu en as encore pour au moins 50 ans alors.

Et plein de bonnes choses pour ton opération.

Christophe.

299
Vos projets / Re : COMMANDE MOTEUR TORTOISE NEXTION
« le: septembre 14, 2017, 03:11:22 pm »
Proposition : Le même code mais en remplaçant delay() par millis().

Bien amicalement.

Christophe


#include <SoftwareSerial.h>
#include <Nextion.h>
#define YES !1
#define NO !0
#define NBRE_MOTEURS 16
#define DUREE_IMPULS_MOTEUR 100
SoftwareSerial nextion(10, 11);
Nextion myNextion(nextion, 9600);

const byte relais[] = {22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52};
const byte pinOut[] = {23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53};
bool buttonState[NBRE_MOTEURS];
unsigned long previous[NBRE_MOTEURS];

// int recv, trxv; -> mis en commentaire car ne semble pas être utilisé !!!
String message;

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

  for ( int i = 0; i < NBRE_MOTEURS; i++) {
    buttonState[i] = 0;
    pinMode(pinOut[i],  OUTPUT);
    digitalWrite(pinOut[i], LOW); // Toutes les pins sont mises à LOW
    pinMode((relais[i]), OUTPUT);
    digitalWrite((relais[i]), NO);
    previous[i] = 0;
  }

  while (!Serial) {};
  Serial.println("Serial On");

  int brightness = 255;
  int bright = map(brightness, 0, 1024, 0, 100);
  String dim = "dim=" + String(bright);
  myNextion.sendCommand(dim.c_str());

} // Fin Setup

void loop()
{
  String message = myNextion.listen(); //check for message
  if (message != "") {
    Serial.println(message, HEX);

    int val = atoi(message);
    //    val = val..... (retraiter ici la vraie valeur retournée)

    buttonState[val] = !buttonState[val];
    digitalWrite(relais[val], buttonState[val]);
    digitalWrite(pinOut[val], HIGH);
    previous[val] = millis(); // On enregistre l'heure qu'il est
  } // End of -> if (message != "")

  for(int i = 0; i < NBRE_MOTEURS; i++) {
    if(pinOut[i] == HIGH) { // Pour les seules pin en etat haut
      if(millis() - previous[i] > DUREE_IMPULS_MOTEUR) { // l'interval est dépassé
        digitalWrite(pinOut[i], LOW); // On met la pin à LOW
      }
    }
  }
} // Fin Loop


300
Vos projets / Re : COMMANDE MOTEUR TORTOISE NEXTION
« le: septembre 14, 2017, 01:57:43 pm »
J'ai essayé d'optimiser le code mais je n'ai pas ce qu'il faut pour le tester. Il est certainement encore améliorable, mais je pense que déjà les bugs de lecture des messages devraient trouver ici une solution. Ligne 48, il faut retraiter la valeur retournée pour retrouver une valeur de bouton sélectionné dans une plage de [0] à [16].

En fin de programme, il est mieux de passer par la fonction millis() qui est "non bloquante" que delay(). Mais ça ne conditionne pas le fonctionnement du programme, on pourra le faire plus tard.

#include <SoftwareSerial.h>
#include <Nextion.h>
#define YES !1
#define NO !0
#define NBRE_MOTEURS 16
#define DUREE_IMPULS_MOTEUR 100
SoftwareSerial nextion(10, 11);
Nextion myNextion(nextion, 9600);

const byte relais[] = {22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52};
const byte pinOut[] = {23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53};
bool buttonState[NBRE_MOTEURS];

// int recv, trxv; -> mis en commentaire car ne semble pas être utilisé !!!
String message;

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

  for ( int i = 0; i < NBRE_MOTEURS; i++) {
    buttonState[i] = 0;
    pinMode(pinOut[i],  OUTPUT);
    digitalWrite(pinOut[i], LOW); // Toutes les pins sont mises à LOW
    pinMode((relais[i]), OUTPUT);
    digitalWrite((relais[i]), NO);
  }

  while (!Serial) {};
  Serial.println("Serial On");

  int brightness = 255;
  int bright = map(brightness, 0, 1024, 0, 100);
  String dim = "dim=" + String(bright);
  myNextion.sendCommand(dim.c_str());

} // Fin Setup

void loop()
{
  String message = myNextion.listen(); //check for message
  if (message != "") {
    Serial.println(message, HEX);

    int val = atoi(message);
    //    val = val..... (retraiter ici la vraie valeur retournée)

    buttonState[val] = !buttonState[val];
    digitalWrite(relais[val], buttonState[val]);
    digitalWrite(pinOut[val], HIGH);
    // mais ne faut-il pas remettre pinOut[val] à LOW après quelques secondes
    // je crois que ce type de moteur ne nécessite qu'une très courte impulsion de courant
    // aussi faudrait-il écrire...
    delay(DUREE_IMPULS_MOTEUR); // mettre ici le temps désiré
    digitalWrite(pinOut[val], LOW);
    // Il serait cependant mieux de passer par une fonction millis()
  }
} // Fin Loop

Pages: 1 ... 18 19 [20] 21 22 ... 27