LOCODUINO

Discussions Générales => Présentez vous ! => Discussion démarrée par: PB le janvier 17, 2020, 07:28:48 pm

Titre: rampe accélération / décélération
Posté par: PB le janvier 17, 2020, 07:28:48 pm
Bonjour
Nouveau dans votre communauté, merci de m'accueillir

Evidemment je pratique le modélisme à l'échelle HO et je suis occupé a piloter le tout avec arduino.
Je réalise la traction avec un Arduino uno au travers d'une sortie PWM  et une consigne de vitesse avec un potar en entré analogique.

Mon soucis est que chaque demarrage et arret vont de 0 à la consigne un peu vite et donc pas trés réaliste.
Il serait souhaitable d'avoir une "rampe" réglable pour chacun des démarrage / arret quelque soit la consigne de vitesse.
Quelqu'un peut'il m'aider sur le sujet ?

Merci d'avance pour votre retour
Titre: Re : rampe accélération / décélération
Posté par: Tony04 le janvier 17, 2020, 08:15:19 pm
Bonsoir PB,

pour mon train de jardin en G (où la courbe de vitesse est encore plus vitale pour la mécanique) je sépare la vitesse demandée (par la position du potar) de la vitesse réelle (envoyée par le PWM. Entre les 2 je mets une boucle temporisée qui va faire monter ou descendre la vitesse à son rythme (paramétrable).
Essaye de partir dans cette optique pour régler ton problème. Si tu n'y arrive pas je tacherai de te faire un petit résumé de mon sketch.

Bonne soirée
Antoine
Titre: Re : rampe accélération / décélération
Posté par: msport le janvier 17, 2020, 08:26:45 pm
Bonjour et bienvenue,

en confirmation du message d'Antoine, une boucle for, utilisant les millis devrait permettre de faire évoluer progressivement la valeur du PMW d'une valeur à un moment donné jusqu'au réglage de la consigne, donc simulant une inertie.
En prime, la fonction map : https://www.arduino.cc/reference/en/language/functions/math/map/ pour le seuil.
Pas évident de trouver des exemples sur le net.
Titre: Re : rampe accélération / décélération
Posté par: Tony04 le janvier 17, 2020, 10:49:37 pm
à PB,

peux-tu me préciser comment tu fais actuellement ton inversion de marche et si tu utilises la course complète du potar pour 1 seul sens de marche ou préfères-tu une version avec le stop au centre du potar, marche avant à droite et marche arrière à gauche ?

Antoine
Titre: Re : rampe accélération / décélération
Posté par: PB le janvier 18, 2020, 09:42:56 am
Bonjour Tony04 et  msport

Merci beaucoup pour vos reponses
J'ai omis de vous dire que je suis novice sur arduino; mon premier arduino uno n'a que 1 mois et donc il me faut un peu de temps pour "digérer" vos propositions.

Pour te repondre Tony : mon reseau comprend 2 boucles  avec chacun leurs sens de marche, je n'ai pour l'instant pas d'inversion du sens de marche des trains et je varie sur toute la course du potar dans 1 seul sens.
Ma sortie attaque un transistor de puissance; pour inversion il me faudrait un pont en " H "; je m'attacherai à cela un peu plus tard mais je trouve ton idée d'inversion de sens avec 50% de la course du potar géniale !!

Je vais etudier et testé vos propositions, néanmions il me vient une question:
j'ai bien compris qu'une temporisation devrait répondre a mes attentes, mais pendant ce temps es-ce que le programme continue ou s'arrete; auquel cas il risque de "rater" des opérations ?

PB
Titre: Re : rampe accélération / décélération
Posté par: msport le janvier 18, 2020, 10:06:55 am
Bonjour,
tout le monde a débuté un jour, mais il faut commencer avec le playground d'Arduino et les exemples des bibliothèques.
Sans compter le site de reference d'arduino.cc et le site éditorial de Locoduino.
Toute la différence entre un test sur millis et delay, c'est que millis n'arrête pas le programme.
Titre: Re : rampe accélération / décélération
Posté par: Tony04 le janvier 18, 2020, 10:41:26 am
Bonjour PB (le prénom serait plus sympa),

voici en PJ une version épurée de mon sketch pour apporter une courbe d'accélération (ou décélération) à ta loco.
Je ne l'ai pas essayé mais avec les commentaires tu devrais arriver à le déboguer si nécessaire.
Cette version ne tient pas compte du sens de marche et utilise la course totale du potar. Si tu veux tester par la suite la version "point milieu" du potar (plus complexe) fais le moi savoir.

Merci de me tenir informé du résultat.

Bon WE
Antoine
Titre: Re : rampe accélération / décélération
Posté par: PB le janvier 18, 2020, 11:30:11 am
RE

Tu as raison, je suis resté discret sur ma présentation ne sachant ce qui se pratique dans les forums (c'est ma premiére inscription......)
J'ai 62 ans et je suis en retraite depuis 3 mois, mon véritable nom est Patrick BAILLEUL
J'ai repris le modélisme depuis ce temps, arreter depuis  plus de 20 ans par manque de moyens (place, budget, temps, etc.)
Pour etre un peu plus précis j'ai fais de la programmation industrielle au debut de ma carriere il y a bien longtemps: à l'époque des automates "PB" de chez Merlin Gerin pour ceux qui connaissent.
Je maitrise donc l'algebre de BOOLE et le GRAFCET, mais je ne decouvre ARDUINO que tout récemment.

Je te remercie pour ta contribution, je vais mettre en pratique ton programme  et je te tiens informer du résultat

Je serais absent quelque temps, mais je ne manquerai pas de revenir vous tenir au courant de mes avancements et/ou deboires
Merci beaucoup a vous 2
msport, je vais suivre tes conseils sur le site de reference et l'éditorial
Titre: Re : rampe accélération / décélération
Posté par: PB le février 13, 2020, 07:24:57 pm
Bonjour, de retour dans notre communauté apres quelques "déboires"

Je n'ai pas eu l'occassion d'essayer la rampe d'accélération pour le moment; je le ferai plus tard et je ne manquerai pas de vous tenir informé.
J'ai pour l'instant un autre probléme a resoudre: je programme l'automatisme du réseau avec du grafcet
Je souhaite simplement visualiser sur moniteur serie (mon PC) la valeur "vrai" ou "faux" de l'état de mes étapes.
Le "serial.print" me donne le numero d'étape mais pas sa valeur binaire
Quelqu'un peut'il me venir en aide.

Merci beaucoup
Titre: Re : Re : rampe accélération / décélération
Posté par: Dominique le février 13, 2020, 08:55:54 pm
Bonjour, de retour dans notre communauté apres quelques "déboires"


Le "serial.print" me donne le numero d'étape mais pas sa valeur binaire
Quelqu'un peut'il me venir en aide.

Merci beaucoup
Peut-être faut-il spécifier le format binaire (,BIN) dans le Serial.print.. mais pour quoi faire ?
Titre: Re : rampe accélération / décélération
Posté par: PB le février 14, 2020, 11:11:22 am
Bonjour
meme avec le format "BIN", j'ai le resultat = 2 ?
l'objectif est de savoir si les etapes de mon grafcet sont activés et lesqelles
Titre: Re : rampe accélération / décélération
Posté par: PB le février 14, 2020, 11:17:02 am
voici ma methode:

transitions [autorisation_circuler_G1] = etapes [arret] && circuler_G1;
    Serial.print ("; arret  = ");
    Serial.write(,BIN );
 
arret est mon etape
j'ai le meme pb avec les transitions
Titre: Re : rampe accélération / décélération
Posté par: Dominique le février 14, 2020, 11:24:57 am
Serial.print(,BIN); ne suffit pas, il faut lui donner la variable à imprimer !
Titre: Re : rampe accélération / décélération
Posté par: PB le février 14, 2020, 11:49:37 am
ma variable est l'etape "arret";
j'ecris donc:

Serial.print (" arret =")
Serial.print (arret, BIN);

mais ca ne marche ps=as, j'ai le message suivant: no matching function for call to 'HardwareSerial::write(<unnamed enum>, int)
Titre: Re : rampe accélération / décélération
Posté par: Jean-Luc le février 14, 2020, 03:57:00 pm
Bonjour,

Comment est défini "arret" ?
Titre: Re : rampe accélération / décélération
Posté par: PB le février 15, 2020, 02:36:12 pm
"arret" est defini comme ceci:

#define Maxetapes 4      //definition du nombre d'etape
char etapes[Maxetapes];// variables des etapes dans tableau
enum { arret, circulation, occupation, liberation };//liste des etapes

void setup(){.............}

void loop () {
for (int i = 0; i < Maxetapes; i++) {
    etapes = 0;
  }
etapes [arret] = 1;
}
Titre: Re : Re : rampe accélération / décélération
Posté par: Jean-Luc le février 15, 2020, 04:36:33 pm
"arret" est defini comme ceci:

#define Maxetapes 4      //definition du nombre d'etape
char etapes[Maxetapes];// variables des etapes dans tableau
enum { arret, circulation, occupation, liberation };//liste des etapes

void setup(){.............}

void loop () {
for (int i = 0; i < Maxetapes; i++) {
    etapes [i] = 0;
  }
etapes [arret] = 1;
}

Ok,

Le compilateur vous explique que même si un enum se ramène de manière ultime à un entier, ça n'est pas suffisant pour considérer que le print qui affiche un entier est éligible.

Ensuite, je comprends ce que vous essayez de faire mais je ne pense pas que l'utilisation de tableaux pour mettre en œuvre une machine à états aboutisse au code le plus lisible qu'il soit.

PS: utilisez la balise code (le # dans la barre de bouton), j'ai eu un ascenseur émotionnel en lisant votre bout de code dont le [i] avait sauté car interprété comme la balise d'ouverture de texte en italique en bbcode
Titre: Re : rampe accélération / décélération
Posté par: PB le février 16, 2020, 05:35:03 pm
OK, effectivement j'ai trouvé une solution plus simple et plus compréhensible;
Mon probléme est que je suis "possédé" par ma formation et je suis tenté d'utiliser le grafcet à toute les sauces

Merci pour votre aide précieuse.
Titre: Re : rampe accélération / décélération
Posté par: Jean-Luc le février 16, 2020, 05:37:50 pm
J'avais fait un article sur ce type de problème : https://www.locoduino.org/spip.php?article25

Peut être que ça vous aidera
Titre: Re : rampe accélération / décélération
Posté par: PB le février 17, 2020, 11:56:53 am
ok je regarde cela; merci beaucoup

Je reviens sur ma rampe d'accélération/décélération;
Je tiens a te remercier Tony04, cela fonctionne trés bien tel que; j'ai néanmions un petit soucis:
je souhaite pouvoir asservir ces rampes (accélération/décélération) à 1 commande tout ou rien
autrement dit avec un interrupteur ou un capteur arreter et redémarrer la loco toujours avec les rampes jusqu'au point de consigne initiale;
Je n'y arrive pas; apres plusieurs essais, soit j'arrete "brusquement", soit je n'arrete rien....
 
Aurais tu une idee sur le sujet?
merci d'avance
Titre: Re : rampe accélération / décélération
Posté par: Jean-Luc le février 17, 2020, 01:01:41 pm
Ben, il faut faire une fonction linéaire du temps pour calculer le rapport cyclique de PWM

Si dateInitiale est la date de démarrage de l'accélération en millisecondes, que acceleration est ce que le nom de la variable dit en augmentation/diminution de PWM par seconde, alors la PWM à une date obtenue par millis() est

pwm = constrain(((millis() - dateInitiale) * acceleration) / 1000, 0, 255);

(j'ai pas testé)

acceleration peut être positive ou négative (décélération donc) voir même variable au cours du temps

Si vous ne partez pas à 0 il faudra mettre une fonction affine et ajouter votre PWM initiale à l'expression ci-dessus (dans le premier argument de constrain)

constrain permet de garder la valeur entre 0 et 255
Titre: Re : rampe accélération / décélération
Posté par: Tony04 le février 17, 2020, 01:50:59 pm
Bonjour Patrick ,

je n'ai pas beaucoup de temps en ce moment mais je te livre un sketch qui permet de commander 2 sorties PWM avec potar et inter. Attention, le sketch n'est pas un modèle du genre car vite fait lors de mon passage dans un musée du jouet qui m'a demandé une démo de ce que peut faire un Arduino, mais il devrait te permettre de sortir ce dont tu as besoin et l'adapter au premier sketch. Sinon je vois cela un peu plus tard.

Cordialement
Antoine
Titre: Re : rampe accélération / décélération
Posté par: PB le février 17, 2020, 06:07:20 pm
Merci, j'etudie ca et je reviens vers vous
Titre: Re : rampe accélération / décélération
Posté par: PB le février 17, 2020, 06:37:55 pm
Ho là; je suis un peu perdu, tres  loin de ce niveau !!
Serait'il possible  avec 1 seul moteur et 1 seul sens de marche pour commencer; sinon c'est l'indigestion........;
Pour memoire j'ai pris l'exemple  de rampe avec la fonction "map" qui fonctionne trés bien; je pense qu'il  serait bon de repartir de cet exemple........
Titre: Re : rampe accélération / décélération
Posté par: Dominique le février 17, 2020, 06:49:25 pm
Bah oui, il faut commencer par les bases qu'on s'est évertué à mettre sous forme d'articles sur http://www.locoduino.org (http://www.locoduino.org). Ca vous prendra un peu de temps à digérer  ::)
Titre: Re : Re : rampe accélération / décélération
Posté par: Tony04 le février 17, 2020, 08:38:58 pm
Serait'il possible  avec 1 seul moteur et 1 seul sens de marche pour commencer; sinon c'est l'indigestion........;
Pour memoire j'ai pris l'exemple  de rampe avec la fonction "map" qui fonctionne trés bien; je pense qu'il  serait bon de repartir de cet exemple........

Ok, je m'y penche dès que le temps me le permet, promis.
Antoine
Titre: Re : rampe accélération / décélération
Posté par: Tony04 le février 17, 2020, 08:56:28 pm
Sans l'avoir testé, je pense que si tu remplaces la ligne de lecture du potar par:

//----------------------------------------------
// est-ce que l'inter est sur marche ?
//----------------------------------------------
if(digitalRead(inter) == LOW) { // on a basculé l'inter sur marche
// lecture et conversion de la valeur de ton potar
vitesse_demande = map(analogRead(potar), 0, 1023, 0, 255); // c'est la ligne d'origine
}
else {
vitesse_demande = 0;
}

cela devrait le faire, essaye et tiens moi au courant STP

Antoine
Titre: Re : rampe accélération / décélération
Posté par: PB le février 18, 2020, 09:14:14 am
Bonjour Antoine

formidable et en plus d'une simplicité remarquable; j'ai l'esprit trop 'tordu' :je cherche bien souvent des solutions compliquées alors que la solution tient en 2 lignes !!

Merci a toi et a bientot
Patrick
Titre: Re : rampe accélération / décélération
Posté par: Tony04 le février 18, 2020, 04:11:16 pm
RE,

comme j'avais un peu de temps à perdre  :) j'ai essayé d'anticiper tes questions sur la rampe d'accélération et me suis dit que tôt ou tard tu voudrais inverser le sens de marche.

Voici comment je fais chez moi (PJ)

Par contre je n'ai pas testé le sketch (mais pas d'erreur à la compilation) et te demanderais de me tenir informé, normalement il y a suffisamment de commentaires pour comprendre le principe.

Bonne fin d'après-midi
Antoine
Titre: Re : rampe accélération / décélération
Posté par: PB le mars 02, 2020, 04:00:22 pm
Bonjour,
Merci Antoine, effectivement j'y suis confronté, mais ce sera pour un peu plus tard
En tous cas je te tiens informé de l'évolution de mon reseau.

Je suis occupé à faire l'automatisme generale du réseau: le pilotage est réalisé avec 5 ARDUINO MEGA , en gros 3 pour le cantonnement, 1 pour la signalisation et 1 pour les aiguilles.
Mon soucis est que ces cartes doivent communiquer entre elles et j'avoue que je m'y perds un peu entre le I2C, le SDI , les UARTS et les liaisons series !!!
Sachant qu'il m'est simplement nécessaire d'aller chercher des valeurs d'E/S ou variables sur d'autre cartes, j'ai prévu 1 liaison  "TX-RX" par carte ?

Merci de votre retour d'experience sur le sujet
Titre: Re : rampe accélération / décélération
Posté par: Tony04 le mars 02, 2020, 05:58:46 pm
Bonsoir Patrick,

je pense que tout le monda va être d'accord avec moi, si tu veux une communication robuste il n'y a que le bus CAN qui va te le permettre, il y a une excellente explication ici: http://locoduino.org/spip.php?article130 et chez moi j'utilise les cartes : https://fr.aliexpress.com/item/32226587480.html?src=google&src=google&albch=shopping&acnt=494-037-6276&isdl=y&slnk=&plac=&mtctp=&albbt=Google_7_shopping&aff_platform=google&aff_short_key=UneMJZVf&&albagn=888888&albcp=6459793138&albag=77316928277&trgt=743612850714&crea=fr32226587480&netw=u&device=c&gclid=EAIaIQobChMI8NiMyZ_85wIVCZzVCh2XWgn4EAQYASABEgL1ovD_BwE&gclsrc=aw.ds
que tu trouves très facilement.

J'ai également fait un petit sketch avec tous les éléments de bases qui sont nécessaires dans tes sketchs pour utiliser le bus CAN et beaucoup de commentaires (voir PJ).

Pas mal d'utilisateurs du forum pourront t'aider en cas de problème.

Cordialement
Antoine
Titre: Re : rampe accélération / décélération
Posté par: Tony04 le mars 02, 2020, 08:48:17 pm
Une petite proposition qui pourrait être utile et pratique si tu décides de partir sur le bus CAN,

puisque tu utilises des MEGA, j'ai développé pour ma centrale sans fil: http://locoduino.org/spip.php?article237  un PCB qui se glisse directement sur le MEGA et qui est prévue pour:
- La petite carte CAN de mon précédent message
- Un NRF24L01
- Un module Bluetooth

cela t'éviterais de réinventer le stylo à bille et il m'en reste quelques unes.

Bonne soirée
Antoine
Titre: Re : rampe accélération / décélération
Posté par: Tony04 le mars 02, 2020, 09:03:40 pm
Un autre exemple concret du bus CAN à considérer comme apprentissage, allumer une led à distance avec un émetteur et un récepteur relié par le bus CAN

J'arrête là (pour ce soir  :) )

Antoine
Titre: Re : rampe accélération / décélération
Posté par: PB le mars 03, 2020, 08:46:31 am
Merci ANTOINE
Je regarde tout cela et je reviens vers toi...........;
Titre: Re : rampe accélération / décélération
Posté par: Dominique le mars 03, 2020, 09:59:59 am
Bravo Antoine,

Il y a vraiment besoin de tester le Can pour se rendre compte de ses avantages !