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 - Thierry

Pages: [1] 2 3 ... 23
1
Beau boulot de recherche et de mise au point. En informatique on appelle ça un jeu d'essai qui sert à vérifier tous les cas de figure. Enfin tous ceux auxquels on pense. Le dernier et le plus laborieux cas de figure à tester reste toujours le 'gros' jeu d'essai. Celui qui sature tous les compteurs par sa taille plus que par sa complexité...

2
Bibliothèques / Re : Bibliothèque Accessories
« le: septembre 07, 2018, 09:35:15 am »
La réponse la plus simple tient dans les identifiants 'inutiles' ! Au lieu de 456, mets DCCINT(125,0)...

Tel que tu l'as codé, le bouton poussoir envoie un seul événement que tu gères manuellement dans le loop. Tu peux aussi laisser Commanders et Accessories discuter entre eux : tu fixes deux événements au lieu d'un pour le poussoir, et tu donnes le même identifiant au servo. Bien entendu, il ne faut pas oublier le Commanders::loop(); !
Voici ma version avec l'option DCC en remarque:

#include <Accessories.h>
#include <Commanders.h>
 

// Le poussoir...
ButtonsCommanderPush boutonPoussoir;
 
// Le moteur
AccessoryServo AIGL;

 
// Les ports pour connecter le moteur et les DELs.
PortServo portAIGL;

#define SERVOMIN  201
#define SERVOMAX  202
 
// code pour un accessoire à l'adresse DCC 125 piloté par un bouton On et un bouton Off (cas de ma MS2 Marklin...)
//#define SERVOMIN  DCCINT(125,0)
//#define SERVOMAX  DCCINT(125,1)
 
void setup()
{
  Commanders::begin(LED_BUILTIN);

  DccCommander.begin(0x00, 0x00, digitalPinToInterrupt(3), true);
  // Memoriser les positions des moteurs dans l'EEPROM.
  Accessories::begin(0, 500);
 
  // Evènement du bouton 100 branché sur la borne 6...
  boutonPoussoir.AddEvent(SERVOMIN, COMMANDERS_EVENT_MOVEPOSITIONID, 0); // Le dernier argument ne sert pas pour ce type d'evenement
  boutonPoussoir.AddEvent(SERVOMAX, COMMANDERS_EVENT_MOVEPOSITIONID, 0);
  boutonPoussoir.begin(200, 6); // premier événement pour le déclanchement
 
  // Les ports avec leurs broches en digital (pas PWM)
  portAIGL.begin(12);
 
    // Le servo : pas de durée de mouvement, un débattement entre 95 et 135 degres
  // et deux positions stables annoncées avec des identifiants inutiles (mais obligatoires)
  AIGL.begin(&portAIGL, 50, 95, 135, 1);
  // Les deux positions sont au mini et au maxi :
  AIGL.AddMinMaxMovingPositions(SERVOMIN, SERVOMAX);
}

void loop()
{
  Commanders::loop();
  Accessories::loop();
}

Dans cette version, le DCC et le poussoir restent tous les deux actifs sur le même servo puisqu'ils génèrent les mêmes événements !

PS: je ne suis pas sur mon PC perso, alors ce n'est ni compilé ni testé...

3
Salut à tous, et désolé d'avoir loupé le chapitre sur DCCpp....
Je rappelle (ou je signale à ceux qui ne le savaient pas) que pour toutes mes bibliothèques une documentation HTML est disponible (en anglais uniquement...) en cliquant sur extras/Doc/index.html, ou sous Windows en lançant StartDoc.bat présent dans le répertoire de la biblio. On trouve la bonne info en cherchant l'aide sur beginMain():

4
Bibliothèques / Re : Bibliothèque Commanders
« le: août 28, 2018, 10:49:08 am »
De rien, c'est un plaisir de voir son travail utilisé...

1 : Pour les extensions, il 'suffit' effectivement de continuer à dériver les classes. Pour les détecteurs en tout genre, une classe dédiée serait la bienvenue. Je n'ai pas d'exemple pratique, c'est pour ça que je ne l'ai pas encore fait... Comme tu dis, ça ressemble beaucoup à un poussoir avec une durée d'activation un peu plus longue.
2 : Oui c'est bien ce pattern qui est utilisé, dans une implantation maison avec une instance statique de la classe CAN/I2C allouée dès qu'on en a besoin.
3 : J'ai en projet d'ajouter des événements 'appui long' ou 'double appui' sur un même bouton poussoir, mais je n'avais pas pensé à un appui simultané sur deux boutons...

Bon courage.

5
Vos projets / Re : Chargeur de wagons automatique
« le: août 23, 2018, 02:34:21 pm »
Clairement, on voit bien une petite machine à états, trois vrais états plus trois tempos en l'occurrence, avec des temps d'attente gérés pas millis() entre les états. Ca ne me semble pas insurmontable. Le mieux est de (re)lire l'article de Jean Luc sur la création d'un projet simple dans son dernier article (http://locoduino.org/spip.php?article25).

6
Composants / Re : Achat d'un PC
« le: août 03, 2018, 03:43:37 pm »
Bonjour

Quasiment n'importe quel PC est capable de programmer un Arduino. Il y a seulement deux contraintes : disposer d'une prise USB, et pouvoir installer L'IDE Arduino !

7
Bus CAN / Re : Bus CAN avec DCCpp
« le: juillet 26, 2018, 04:09:18 pm »
Et je suis preneur des modifs pour les intégrer à DCCpp et ainsi un peu plus ouvrir les possibilités de la bibliothèque...

8
Bus CAN / Re : Bus CAN avec DCCpp
« le: juillet 25, 2018, 11:25:11 pm »
Tu n'as pas besoin de toucher aux différents fichiers .h . Pour utiliser la broche 1, il suffit de le dire dans le beginMain :

DCCpp::beginMain(UNDEFINED_PIN, 1, 3, A0);
Cela dit, sur un Nano les broches 10 et 5 sont utilisables pour les timers, ce qui n'est pas le cas des autres. Et le timer est obligatoire pour le DCC. Donc, pas de 10 ou de 5, pas de DCC !

9
Présentez vous ! / Re : Hello world...
« le: juillet 20, 2018, 09:17:59 am »
Bienvenue parmi nous.

C'est le rôle premier d'un forum comme le nôtre d'aider à concrétiser des projets ferroviaires utilisant l'Arduino. Nous serons donc heureux de répondre à tes questions.

10
Débuter / Re : Tableau d'objet
« le: juillet 10, 2018, 06:51:53 pm »
Après vérification, tu as raison. Le constructeur par défaut n'est créé automatiquement par le langage que si aucun autre n'existe !

11
Débuter / Re : Re : Tableau d'objet
« le: juillet 10, 2018, 05:35:27 pm »
Ta proposition de méthode init appelée explicitement par la fonction setup me paraît bien plus sûre que des constructeurs appelés on ne sait pas quand. On peut donc ignorer le constructeur par défaut dans ce cas là.

Je rebondis maintenant que mon internet est revenu...
Ignorer le constructeur par défaut n'est juste pas possible. Il est forcément appelé au moment de l'initialisation, et il est toujours présent ! Soit il est fourni par le programmeur, soit le compilateur en fourni un d'office qui ne fait rien. Quelle que soit la classe, je fais toujours un constructeur dit 'par défaut' qui va initialiser toutes les données membres de la classe à des valeurs bateau, généralement 0 ou NULL selon le type. Cela n'empêche nullement la solution de la fonction init, c'est juste un complément qui assure que les variables dans l'instance de la classe, les données membres ont une valeur connue et déterminée. Si on ne fait rien pour les initialiser, le contenu de chaque variable sera ce que la mémoire contient à leur emplacement au moment de la création de l'objet... ET si on oublie le init() ou que l'on fait quelque chose avant, on est pas du tout sur de ce qui va se passer. Pire, ce ne sera pas reproductible : un jour ça marche, le lendemain ça ne marche plus !

Donc la classe Led de Pierre deviendrait
class Led {
public:
int n;

Led() { n=0; }  // constructeur par défaut.
Led(int x) { n=x; }
};

Led MaLed;  // la donnée membre 'n' de MaLed est initialisée à 0. C'est probablement faux, mais c'est toujours faux de la même manière !

12
Bonjour

C'est évident que la bonne réponse amène beaucoup plus facilement la bonne solution, mais depuis trente ans que j'utilise des moteurs de recherche, que je forme de jeunes (ou moins jeunes) développeurs, j'en suis arrivé à la conclusion que formuler correctement la bonne question/requête présuppose tout un tas de connaissances, d'acquis, de vocabulaire, que l'on ne peux acquérir que petit à petit. A charge pour nous, les anciens :), de donner les outils pour y arriver, d'être patients et didactiques.
Et quand je parle de vocabulaire... J'ai coutume de dire à mes ouailles que chaque mot est important, qu'il donne du sens, et qu'un mot employé pour un autre change quelquefois totalement la façon de réfléchir à la solution. La première des formations est celle qui doit donner un vocabulaire commun à un groupe qui est censé parler de la même chose. Lorsque de petits nouveaux arrivent, la première chose à leur apprendre, c'est ce vocabulaire, et il ne faut pas hésiter à les reprendre lorsque le terme employé n'est pas le bon (et qu'on s'en aperçoit !) ou juste approximatif. C'est notre boulot de dégrossir les jeunes pour les faire rentrer dans le moule. A charge encore pour nous de ne pas nous enfermer dans un jargon technique abscons : un résistance de tirage, un condo de filtrage, une liste chaînée ou une fonction récursive, ça ne parle pas forcément à tout le monde !

13
Vos projets / Re : Support multi contrôleur
« le: juin 28, 2018, 02:30:41 pm »
En fait il faut s'imaginer comment plugguer cet Arduino sur un support. Comme il n'y a pas de broches en dessous, mais seulement dessus, ça nous laisse que deux possibilités : retourner le Mega pour le brancher, ou imaginer un support en dessous qui irai chercher les broches au dessus... Bref, pas simple. La proposition de dominique est la solution. Le coeur est bien un Mega 2560, mais le form factor est plus proche d'un Nano avec des broches qui partent sous le pcb.
C'est effectivement ce que je vais faire. Malheureusement je ne trouve ce modèle que sur Ebay avec un délai de livraison long, ou chez AliExpress plus rapide mais sans possibilité de payer par Paypal. Je ne donne pas de référence de carte bleue en chine, ni ailleurs non plus d'ailleurs, à part quelques rares sites bien connus comme la SNCF ou la Poste... Je continue de creuser, je ne lâche pas !


D'un autre côté, le support avance.


Le support est terminé. Il accueille au centre en bas le support de contrôleur et au dessus le circuit d'alimentation. Sur le support de contrôleur avec ses deux connecteurs 22 broches, le support de Nano R3 est monté. Sur les côtés du support on peut voir deux parties coulissantes qui vont accueillir d'un côté les boutons et potar, et de l'autre les leds et moteurs. Là encore, je ne me suis pas aperçu tout de suite que j'avais des calendriers avec un arrière blanc ... J'ai pu reprendre le support et mettre du blanc partout, le tout posé sur deux tasseaux, mais les parties amovibles sont multicolores ! Comme il me reste du blanc, pas sûr que ça ne change pas...


J'ai fait plusieurs erreurs ici. La première a été d'oublier de prévoir des trous pour les vis de fixation du support. J'ai dû en mettre au milieu du circuit et ajouter des straps pour compenser les coupures de piste... On en voit deux sur cette photo. Et j'en ai mis 4 parce que c'est lui qui va subir des branchements et débranchements à répétition... Il faut que ça tienne ! Au moment de fixer le circuit, je n'ai pas fait attention au connecteur de l'alimentation à trois broches qui se retrouve en bas à droite du pcb, alors qu'il aurait été bien mieux en haut à gauche. Qui plus est, un connecteur coudé, donc horizontal et parallèle au pcb aurait moins posé de souci dans l'avenir pour des support larges comme celui du méga. Et en plus, je voulais mettre la masse au centre, et je me suis trompé au moment des soudures... Du coup la masse ne sépare pas les deux tensions.

Bref, réfléchir avant de se lancer, c'est bien aussi !

14
C'est exactement ce qui est fait dans Commanders et Accessories. Des listes chaînées auto-gérées permettent ensuite de balayer tout ce qui est déclaré et à faire ce qu'il faut sans se poser de question. rien n'est bloquant, et tout le fonctionnement est simultané ou presque.

15
Bibliothèques / Re : Bibliothèque DCCpp
« le: juin 24, 2018, 08:58:15 pm »
Pour moi, tous les décodeurs arrivent à recevoir les messages et à faire ce qu'on leur demande. La difficulté vient de la remontée d'information qui n'est pas faite avec la même intensité et la même durée pour tout le monde. Ce n'est pas le cas ici puisque la lecture semble fonctionner. Pourtant le délai entre l'écriture et l'envoi d'une confirmation après l'écriture, ou la manière de décoder cette confirmation peuvent être différentes.
Dans le code de PacketRegister.cpp, la lecture de CV n'a pas tout à fait la même structure que la réception de confirmation. Il faudrait afficher la valeur vraiment lue par les différents analogRead qui sont faits dans writeCVByte() pour comparer. Par exemple, ajouter juste avant la fin du test "if (DCCppConfig::CurrentMonitorProg != UNDEFINED_PIN)"

#ifdef DCCPP_DEBUG_MODE
Serial.print(F("Confirmation intensity "));
Serial.println(c);
#endif

La valeur de c doit être supérieure à celle de ACK_SAMPLE_THRESHOLD (définie dans PacketRegister.h) pour valider la confirmation. Peut être faut il ajuster cette constante pour s'adapter aux capacités du décodeur ? Et puis on va faire 500 mesures de la broche analogique (constante ACK_SAMPLE_COUNT). Peut être est-ce excessif, surtout si le décodeur renvoie sa confirmation pendant bien moins longtemps que ça... Bref, il y a des choses à régler, et peut être qu'un oscillo pourrait rendre service pour étudier la forme du retour.

Pages: [1] 2 3 ... 23