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

Pages: 1 ... 6 7 [8] 9
106
Composants / Re : CJMCU-3216 : Le détecteur de proximité parfait ?
« le: juillet 09, 2020, 03:20:55 pm »
Bonjour,
Je reviens sur ce sujet pour le compléter d'un retour d'expérience plus approfondi. (et en profiter pour glisser une question... bête de bête j'en ai peur)

D'abord le REX sur les CJMCU-3216. En condensé : totalement positif... mais.
Totalement positif car du point de vue du capteur la fiabilité/reproductibilité est sans faille. Réellement.
Les problèmes, car il faut le dire il y en a, proviennent du bus I2C. Parasitages et amplification des problèmes (je crois... je n'affirme pas) du fait de l'usage de multiplexeurs I2C "TCA9548", indispensables de mon point de vue pour profiter réellement de l'intérêt de ces capteurs CJMCU-3216, c'est à dire en en faisant un large usage.

Ces problèmes ont-ils une solution ?
Ne pouvant parler que de mon expérience, il ne m'est pas possible de donner une réponse absolue car elle sera probablement propre à chaque configuration du réseau.
Je peux néanmoins dire qu'il est possible de parvenir à un fonctionnement parfait moyennant un bon filtrage. Dans son principe, celui qui fonctionne pour moi devrait pouvoir s'adapter avec profit.
Avant de le détailler, je dois probablement préciser que j'ai choisi une logique de gestion par canton, en analogique donc. Un détecteur situé à chaque frontière de canton commande :
- l'application du courant traction spécifique au convoi concerné sur le canton C+1 dès détection d'un convoi, qu'il soit poussé ou tiré ;
- l'extinction du courant traction sur le canton (devenu) n-1 dès que la totalité du convoi à franchi le détecteur (extinction légèrement temporisée).
Par ailleurs, et fort d'une expérimentation concluante, je pense tripler le nombre de détecteurs de façon à avoir en amont de chaque détecteur frontière un autre détecteur, pour ralenti final et arrêt au signal.

C'est l'ensemble de ces détecteurs, ou plutôt je le redis, des transmissions de données, qui demande à être filtré. D'abord par l'installation de condensateurs sur chaque alimentation canton, par précaution mais avec un effet pas vraiment vérifié.
Et essentiellement par un indispensable filtrage logiciel, en trois points.

Suivant l'occupation des cantons par les convois, une fonction en boucle scanne chaque canton (toutes les 25ms dans mon cas) à la recherche d'une éventuelle détection : un train T sur un canton C entraînera la surveillance du détecteur frontière entre le canton C et le canton C+1 pour CE train.

Une première détection (par seuil "haut" réglé chez moi à 200) étant censée mettre un canton donné sous tension (et l'affecter à un convoi précis), cette détection est-elle réelle ?
- dans tous les cas, une fonction de "switch" vers le canton suivant est appelée ;
- une variable booléenne "switched" enregistre ce fait.
- faute de pouvoir décider de la réalité de la détection, la fonction de switch rejette la détection mais enregistre dans une variable booléenne "IRDtoFilter[train]" le fait que le détecteur D a, pour le train N, été vu "détectant" et le met sous surveillance.

A la loop suivante, de deux choses l'une : soit le train est en pleine voie. Il n'y a donc pas de seconde (fausse) détection (cas heureusement jamais rencontré) et il faut donc le concrétiser en annulant la surveillance du détecteur fautif :

=> par exemple en tête de la fonction en loop :
    switched[train] = false ;
et à la fin de la fonction en loop :
for (byte i(0) ; i < TRAINS; ++i)
     { if (switched[i] == false)          // pas de switch pour le train i dans la boucle => une éventuelle fausse détection doit être effacée
        { if (IRDtoFilter[train] == frontIRD[train] )    // frontIRD : numéro du détecteur de sortie du canton, compte tenu des positions d'aiguille et du sens de circulation
            { firstDetection[i][IRDtoFilter[i]] = true ;   // la prochaine détection sera à nouveau vue comme étant la première
              IRDtoFilter[i] = 222 ;                             // aucun détecteur 222 ! signifie qu'il n'y a aucun détecteur à surveiller...
            }
        }
     }

- soit le train est SUR un détecteur et, dans ce cas deux loop, consécutives passeront toutes deux par la fonction de switch qui est alors chargée de faire le ménage :
void switch_to_section(byte train, byte currentSection, byte newSection, byte wichIsCutIRD)
  { // filtrage des fausses détections : second test : si 1er passage, mise sous surveillance du détecteur responsable et sortie de la fonction / premier test : si en seconde lecture ce détecteur est < seuil, il a été filtré et redevient vierge pour action à la seconde détection.
    switched[train] = true ;
    if (wichIsCutIRD != IRDtoFilter[train] && proxSensor.getProximity() < proxThreshold)
      { firstDetection[train][IRDtoFilter[train]] = true ;
        IRDtoFilter[train] = wichIsCutIRD ;
      }     
    if (firstDetection[train][wichIsCutIRD] == true)
      { IRDtoFilter[train] = wichIsCutIRD ;
        firstDetection[train][wichIsCutIRD] = false ;
        firstDetection[train][IRDtoFilter[train]] = false ;
        return ;
      }

       // suit la fonction de switch en elle-même
      }

- troisième patch de filtrage :
il arrive aussi qu'un canal I2C, aléatoire, se bloque sur une valeur... également aléatoire.
Pour pallier ce problème, chaque "loop" reset un des détecteurs, à tour de rôle :
    reset = (reset +1)%NbDeDetecteurs ;
    tcaselect(reset) ;
    proxSensor.init() ;
    proxSensor.setMode(PS);

A noter que le seul paramétrage "proxSensor.setMode(PS)" m'a finalement paru nécessaire et utile.

A l'usage donc, une fois ce filtrage OK :
- toute vraie seconde détection au dessus d'un seuil "HAUT" applique le courant traction du train N au canton C+1 et initialise une temporisation liée à ce détecteur ;
- ensuite, toute détection au dessus d'un seuil "BAS" (20 dans mon cas), réinitialise une temporisation qui signale ce détecteur comme "actif" ,
- à l'extinction de cette temporisation, cad le convoi passé, le courant traction est coupé sur le canton "arrière" qui est libéré pour un autre convoi.
De cette façon, et même convoi à l'arrêt avec un attelage en surplomb du détecteur, LE CONVOI RESTE VU ET AFFECTE AUX DEUX CANTONS encadrants. Ceci a comme avantages :
- de pouvoir repartir dans les deux sens, que la motrice ait été en poussé ou en tiré
- de conserver en permanence un feu de fin de convoi (convoi roulant s'entend ! on parle ici d'analogique).

(Accessoirement et avec un code un peu boosté, cette logique marche également pour un convoi trop long pour un canton et qui occupe donc simultanément trois cantons)

Maintenant la question.
Ce site m'a apporté et m'apporte beaucoup. Un apport absolument essentiel. J'ai lu, je lis beaucoup... mais je ne comprends pas tout !
Notamment sur cette question car elle est en rapport :
J'ai lu beaucoup de choses sur la rétrosignalisation. Je me demande... ces détecteurs 3216, ou d'autres car ils ne font en fait rien d'autre (mais avec quelques fameux avantages) que ce que font des barrières infra-rouge, n'est ce pas de la rétrosignalisation ? pour bien moins cher, bien moins compliqué que des détecteurs de consommation dont l'exploitation me semble finalement plus limitée ? C'est ça qui m'intrigue. Mais de que j'ai lu à propos des détecteurs de consommation, je m'en suis fait l'idée (éronnée ??) qu'ils étaient associés aux réseaux exploités en digital. Bien que je ne vois pas pourquoi. Il y a en tous cas une donnée qui m'échappe gravement et avant de me lancer dans un réseau digne de ce nom j'aimerais tirer ça au clair. Si quelqu'un peut m'y aider...

107
Composants / Re : Alimentation 12v
« le: juin 18, 2020, 04:17:04 pm »
Bonjour,

personnellement, après avoir fait le choix d'éliminer les alims à découpage pour la source principale (et donc d'accepter d'y mettre plus cher), j'ai choisi ceci (en N on peut faire beaucoup de choses avec 10A) :

https://www.manomano.fr/catalogue/p/alimentation-fixe-138-vcc-10-a-fps1310-1520229?product_id=2981296

mais derrière, ça découpe pour pas cher avec autant de modules que de tensions (12, 9, 5, 3.3) et que de besoins ; ceci par exemple
https://fr.aliexpress.com/item/32629860159.html?spm=a2g0w.search0303.3.86.6fe44396TFdF0z&ws_ab_test=searchweb0_0,searchweb201602_0,searchweb201603_0,ppcSwitch_0&algo_pvid=4c634779-dc39-491f-8adf-6858a806a52d&algo_expid=4c634779-dc39-491f-8adf-6858a806a52d-13

Pour ce qui est des masses, le problème survient précisément quand elles ne sont PAS interconnectées !
Ou alors du fait de fils en antenne, longs... vraiment longs.

108
Composants / Re : Un nouveau composant prometteur : le VL6180
« le: juin 08, 2020, 12:02:57 pm »
Bonjour,

Pour répondre à Jean-Luc :
- lorsqu'il n'y a rien à voir, la détection renvoie dans tous les cas une valeur de l'ordre de 35 à 40cm. Je suppose que vue la faible hauteur d'implantation, c'est le plateau qui rentre dans l'angle de vision. Mais dans le code, toute valeur supérieure à 25cm étant éliminée c'est donc sans effet.
- et je viens de mesurer l'entraxe entre mes deux voies : 39mm, très précisément.
Je précise, c'est aussi un élément de réponse à Dominique, que j'ai posé une voie "volante" de l'autre côté pour avoir deux convois encadrant celui visé par le détecteur, ceci sans influence sensible sur l'asservissement de freinage.
(je crois effectivement qu'un arrêt en fond de remise sera la meilleure utilisation possible de ce capteur)

et donc pour répondre à Dominique et compléter le précédent post :

- schéma de montage : bien qu'on voit 6 broches soudées je n'ai utilisé que VCC (3,3V mais prend le 5V), GND et le signal I2C (SDA/SCL, via un multiplexeur tca9548a mais tout à fait falcultatif), c'est tout.

- je crois que je réponds aux deux autres questions avec ceci ?
L'interaction à la centrale ? Conformément à la library, le détecteur s'intègre par :
   - la création d'instance(s)
       VL53L0X laserSensor = VL53L0X();   - et l'initialisation dans le setup :
     laserSensor.setTimeout(500);
if (!laserSensor.init())   {
  Serial.println("Failed to detect and initialize laserSensor!");
  while (1) {}   }
laserSensor.startContinuous(100);  // ( l'argument "100" reste à valider...) 

Puis dans le reste du code : Supposons, pour une section "voie de garage" (siding) donnée :
- d'une part, une fonction qui surveille qu'un CONVOI y est engagé (autrement dit, pas forcément une motrice), LEQUEL, son sens de déplacement et sa vitesse ;
   selon conditions, notamment que le convoi entre (et/ou "recule") sur cette section,  cette fonction en appellera une autre, dédiée par exemple aux sidings équipés de détection laser, laquelle contiendra une instruction de ce type :
engine[train].siding2(laserSensor.readRangeContinuousMillimeters() / 10) ;  // envoi d'une lecture à une instance engine[x] de la classe "HandleEngine"
- d'autre part donc : la classe "HandleEngine" qui gère les paramètres MOTRICE, accélérations, vitesse, arrêts etc ;
Dans cette classe il y aura :
  float _speedRef ;             // variable de calcul (signée)
  byte _latency ;               // sets a minimum PWM ("voltage") applied to the engine (!obligatoire! à prédéterminer pour chaque motrice) (pas "cste" car ajustable dans ma classe)
  (byte _velocity ;             // le pendant de "latency", bride la Vmax à une valeur réaliste (facultatif !)

public :
  float iniSpeed ;              // vitesse relevée au moment où le convoi entre dans le champ de prise en charge (25 cm... dans ma config) du laserSensor
  int speedRef ;                // consigne PWM (signée à ce stade)
  -----------------------------------------------------------------------------------------------------------
  (void siding1() ;             // éventuelle méthode dédiée aux sidings sans détection laser)
  void siding2(int laser) ;     // méthode dédiée aux sidings équipés

et donc la méthode siding2, qui recevra la mesure laser en argument et pourra ressembler à :
void HandleEngine::siding2(int laser)
  { if (joysXaxis > -200 || joysXaxis == -999)                 // ...ou autre chose, signifiant "vas-y, pas de reprise en manuel"
    { if (laser < 25 && joysXaxis < 200)
        { iniSpeed = min(iniSpeed peed, _speedRef) ;               // dans MON CAS, en marche arrière _speedRef augmente lorsque le train ralentit, d'où le "min", qui fige la vitesse initiale
         _speedRef = max(iniSpeed, (0.8*_latency + iniSpeed peed)*(laser-2)/23-0.8*_latency) ;  // idem, la valeur "max" correspond au plus petit des deux termes, le second étant un bête vitesse=a*laser+b
        }
      if ( abs(_speedRef) < 0.8 * latency)  { _speedRef = 0 ; iniSpeed = 0 ; }                       // extinction de la PWM, reset de iniSpeed
      speedRef = _speedRef ;
    }
  }

Quant-aux perturbations latérales, j'ai fait le test en encadrant la voie d'essai avec deux convois, sans perturbation sensible de la mesure.

Cordialement à tous
Phlippe

109
Composants / Re : Un nouveau composant prometteur : le VL6180
« le: juin 07, 2020, 07:14:05 pm »
@ Dominique... et à tout le monde !

Je suis allé re-regarder ce va-et-vient : vraiment super !
Il me manque quelques éléments pour comprendre ce qu'il est capable ou non de faire, par exemple si ça marche avec un convoi poussé ?

Et depuis j'ai avancé sur le capteur laser VL53L0X puisque j'en ai (enfin) reçu deux exemplaires.
Voici un petit compte rendu, rapide, plus une vidéo pour illustrer.

En résumé, il peut trouver son usage. Avec de grosses limites, mais pour ce qui est d'un joli arrêt sur ralenti il peut le faire !

Côté distance de détection (je parle uniquement pour l'échelle N) il faut compter 25cm grand max. Il vaut mieux compter sur 20cm. Mais sur une voie de garage où l'on est déjà, logiquement, en marche lente, ça permet de finir très proprement.
Autre défaut : le réglage de visée est extrêmement pointu ! Mais sa qualité, à l'inverse, c'est qu'il n'est pas significativement influencé par ce qui se passe à côté. Du moins dans ces 25cm utiles. Et même pas du tout dans les 10 derniers centimètres (sur la vidéo, les valeurs sont bien sûr des cm, plus facile à lire).
L'autre contrainte, il me semble mais je n'ai pas tout testé, c'est que le capteur doit être dans l'axe de la voie, ce qui le limite(rait ?) donc aux voies de garage... bien droites.

Voilà une idée de la taille une fois monté (à la sauvage)



Et le résultat sur vidéo : une première approche avec entrée dans la zone de détection à vitesse "relativement 'rapide" (pour une voie de garage), puis une seconde à vitesse nettement plus faible. Celle-ci avec un convoi sur la voie adjacente.

https://youtu.be/EF1OOA5fp7k/

C'est une toute première mise en œuvre, à peu près opérationnelle. Le code n'est pas sorcier : "photographie" de la vitesse PWM au moment où le train est détecté puis un ralentissement proportionnel à la distance restante jusqu'à la PWM limite inférieure de déplacement de la motrice (paramètre obligatoire, propre à chaque motrice, en EEPROM dans mon cas).

Merci par avance à tous les autres retours expériences, il y a forcément moyen de tirer de ce capteur mieux que ce premier essai.

Cordialement
PS


110
Infos et bonnes affaires / Re : Capteur de proximité VL6180X
« le: mai 24, 2020, 10:57:34 pm »
Bonsoir Antoine,

Je suis ces essais avec beaucoup d'intérêt étant de mon côté en test sur un détecteur voisin (CJMCU3216) en remplacement de barrières IR. Tests très encourageants et dont les résultats rejoignent les vôtres.

Si j'interviens, c'est en fait pour savoir pourquoi ne pas avoir utilisé ce module :
https://learn.adafruit.com/adafruit-tca9548a-1-to-8-i2c-multiplexer-breakout
pour régler ce problème d'adresse unique des capteurs (pareil avec ceux que je teste). Un module = 8 sorties I2C, chaque module pouvant avoir 8 adresses, on peut donc avoir 64 capteurs, même ayant la même adresse. De quoi voir venir !
(et pas de pins "consommés" sur l'arduino).



111
Composants / Re : Un nouveau composant prometteur : le VL6180
« le: mai 15, 2020, 02:56:36 pm »
Bonjour,

suivant avec un intérêt particulier tout ce qui a trait à la détection, je me suis bien sûr arrêté sur ce fil.

Sans avoir été y regarder de plus près, notamment la datasheet, en quoi ce composant est-il différent du VL53L0X  qui y ressemble à s'y méprendre mais est donné pour une détection à plus d'un mètre (... de quoi réaliser des arrêts sur ralentis de rêve) ?


J'en attends un exemplaire (2euro50... ça ne peut dont pas être le même !), je pourrai peut-être bientôt rapporter mon expérience

112
C’est assez amusant car j’étais justement en train de le tester, comme son grand frère le TRCT5000 qui est à peine plus encombrant, un peu plus cher, 0,79€ mais qui autorise des distances de détection beaucoup plus importantes.

J’ai mis en ligne une vidéo :

Hello Boby (et toute la compagnie bien sûr) ;

J'aimerais parler de vos tests et avoir vos conclusions ; les miennes sont négatives et je voudrais être sûr que c'est "normal".
En effet, si j'ai pu vérifier que la distance de détection est importante, j'ai aussi constaté que la mesure n'est pas reproductible et très différente selon le matériau "vu" par le détecteur.

Dans une application de détection d'une loco ou wagon, d'après mes expérimentations :
- en détection latérale, le résultat pourrait être exploitable, mais je n'ai pas fait assez de tests pour savoir si TOUTES les couleurs/textures des wagons et/ou locos peuvent être détectées sans erreurs et j'en doute ;
- mais en détection sous voie, ça ne fonctionne pas. Ou du moins les possibilités d'exploitations sont très limitées car si la réponse est immédiate et franche dès le surplomb, même par un attelage, elle disparaît dès que le signal émis se réfléchit sur les roues/essieux pour réapparaitre entre. Un convoi arrêté sur un détecteur donnera donc une réponse incertaine malgré toute tempo qu'on aura pu mettre sur le signal.

Ceci est décevant car l'avantage de ce détecteur est d'être directement lu en analogique et/ou digital sans qu'il soit besoin d'utiliser une transmission I2C. A l'inverse du CJMCU3216 qui a une détection imperturbable, mais cette qualité est pourrie par l'instabilité du bus. (Rien ne peut donc être parfait dans ce monde ?)

113
... dans le programme d'essais j'ai moi aussi le TCRT5000 ! Les premiers tests sont intéressants, la taille est un peu pénalisante en N...

Et un autre capteur à 2,50euros que j'attends : détection laser jusque 1m ! (faut-il encore savoir avec quelle cible...) :

On dirait par rapport aux photos que le capteur est le TCRT1000 de WISHAY.
Je penche plutôt pour le capteur SHARP de Jean-Luc car je ne vois pas les "yeux" sur le WISKAY ? De plus le CJMCU3216 voit bien plus loin que 3mm!
J'ai fait moi aussi une petite vidéo, en prenant modèle car je n'aurais pas aimé avoir la honte en faisant moins bien !

https://youtu.be/hdA89_zblMg/

On ne pourrait pas voir plus clairement que la détection est correcte jusqu'à 60mm.

Je comprends bien l'intérêt qu'il y aurait à déporter la tripaille sous le plateau, s'il n'y avait comme le dit Jean-Luc la question de la faisabilité question soudures, mais je ne comprends pas ceci :
De cette manière, il est possible « d’économiser » le port I2C (...)
puis-je avoir une explication ? (merci  d'avance !)

114
Bonsoir,

Quelques nouvelles, et un petit souci car j'ai eu affaire à de fausses détections. J'ai lu que ces détecteurs étaient sensibles aux parasites ; problème à traiter si c'est bien la cause mais je n'ai pas pu le confirmer clairement.

En réalité les capteurs fonctionnent parfaitement. Mais il arrive, aléatoirement, que la valeur lue sur un canal du multiplexeur se trouve recopiée sur un autre. Avec les même effets qu'une fausse détection ! C'est un problème de bus U2C, déjà chargé par ailleurs, je cherche la solution...
 
Bien cordialement
Philippe

115
Composants / CJMCU-3216 : Le détecteur de proximité parfait ?
« le: avril 30, 2020, 10:39:52 pm »
Bonjour tout le monde

Premier post, alors je commence par un grand merci à tous les contributeurs et un énorme merci aux locomotives de ce site. En partant de zéro, arduino et C++, c'était mon cas il y a un an, Locoduino est une bénédiction.
Aujourd'hui j'ai peut-être à mon tour une contribution à apporter.

De lien en lien, je suis tombé un jour sur un détecteur I2C encore jamais évoqué ici semble-il, peut-être pas parce qu'il est généralement vendu comme détecteur de luminosité  : le CJMCU-3216.

Mais c'est aussi un DETECTEUR DE PROXIMITE. Long long délai d'attente (chine + premier envoi perdu...) mais la patience valait la peine, je crois qu'il n'a que des avantages !

- Il est MINUSCULE, au point de se glisser sous la voie entre deux traverse MÊME en échelle N ;
- il détecte parfaitement UN ATTELAGE, CONVOI A L’ARRÊT OU NON ;
- il semble indifférent aux conditions de luminosité (ou pas) ambiante ;
- et il coûte presque rien.
Seul petit inconvénient (peut-être), il fonctionne au maximum sous 3,5V.

Voici la merveille. Qui va remplacer les barrières infra-rouge encombrantes, inesthétiques et parfois gaffeuses (petites gaffes mais gros bazar).


(Ça n'est encore qu'un circuit d'expérimentations. Faute de ballast, la planche est décaissée de 2mm pour loger le composant)

Ce détecteur est paramétrable.
A minima il faut le déclarer comme "détecteur de proximité en continu" (paramètre PS). Et ça suffit pour qu'il marche très bien. Je n'ai pas assez testé l'intérêt des autres paramètres sauf celui de la SENSIBILITÉ qui, en la réglant sur 4 plutôt que 2 (réglage par défaut), m'a permis la détection à tout coup des attelages (attention,  Je parle pour le N... doute pour le HO).

Exemple pour "n" détecteurs. Le " tcaselect(i)" se rapporte à l'indispensable multiplexeur vu que le composant n'est pas adressable, ce qui est normal vu sa taille. Puis il faut un proxSensor.init(); par détecteur et donc le déclarer "PS" ; le reste est facultatif.

for (byte i(0); i<n; i++)
    { tcaselect(i) ;
      proxSensor.init();
      proxSensor.setMode(PS);                       // PS: proximity sensor continous
      proxSensor.setPSGain(4);                      // Choose between 4 gain values: 1, 2(default), 4, 8 : higher gain increases sensitivity as well as noise - 2 is good.
      proxSensor.setNumberOfLEDPulses(2);           // Choose between 1(default),2,3,4 pulses of LED IR for proximity : more pulses increase (slightly) the max. distance
      proxSensor.setPSMeanTime(PS_MEAN_TIME_50);    // Meantime (milliseconds) for proximity measurement : _50, _37_5, _25 or _12_5 ; longer meantime provides less spreaded values
      proxSensor.setPSIntegrationTime(8);           // This function helps to increase the max distance. Choose value between 1 and 16.
    }

Bien sûr , on peut préférer un paramétrage individuel, en fonction d'exigences de détection différenciées.

En sortant un peu du sujet mais pas complètement et pour ceux qui auraient des problèmes de lenteur en I2C : je signale qu'avant de réussir à faire fonctionner ce senseur sur mon bus I2C déjà sollicité (transmission de données d'un MEGA vers un NANO + affichage sur OLED) j'ai eu de  gros soucis liés à la library ADAFRUIT des écrans SSD1306. Il y a des références sur le net à des problèmes de lenteur ces afficheurs ; c'est ce que j'ai connu dès le deuxième écran, le MEGA qui faisait "tout" tourner, pourtant pas grand chose, a paru d'un coup très fatigué. D'où le NANO, dédié à l'affichage... faute de bien avoir bien analysé le problème. En tous cas pb réglé... jusqu'à ce que j'ajoute un CJMCU3216 sur le bus (sur un autre multiplexeur TCA9548A avec bien sûr son adresse propre).
Impossible de faire cohabiter le tout. Des conflits sur le bus créaient un proportion importante (+- 20%) de données aberrantes, tant sur les écrans que que les CJMCU.
Avec de plus le problème toujours présent d'un rafraichissement extrêmement lent des afficheurs : 180ms par OLED, soit 360ms pour deux, à l'extrême limite de l'acceptable.
Jusqu'à trouver cette autre library ; SSD1306AsciiWire : (https://github.com/greiman/SSD1306Ascii
- de 360ms m'a loop est passée à 70... puis 40 avec un peu d'optimisation ;
- plus aucun conflit ;
- en prime, disparition de menus problèmes dont des artefacts sur les écrans.

Pour tester de détecteur, voici par exemple où je l'ai commandé : https://fr.aliexpress.com/item/32817340841.html?spm=a2g0s.9042311.0.0.2df16c37QV8oNx

Pour ma part, l'essayer fut l'adopter.

116
Vos projets / Re : Un Arduino par canton
« le: avril 18, 2020, 03:32:14 pm »
Bonjour Jean-Luc,

Désolé de vous solliciter : j'ai commencé à prendre en main le croquis "AlimentationTraction" (très formateur !) que je vais expérimenter par tranches mais je voulais vous signaler une difficulté.

Pour commencer j'ai trouvé votre librairie : https://framagit.org/locoduino.org/CommandInterpreter
mais qui étrangement provoque cette erreur :
"class CommandInterpreter' has no member named 'readUnsignedLong'; did you mean 'readUnsignedInt'?" ;

Par similitude avec l'existant, j'ai donc tenté d'ajouter dans le CommandInterpreter.h cette ligne :
bool readUnsignedLong(unsigned long& result);et dans le .cpp la fonction bool CommandInterpreter::readUnsignedLong(unsigned long& result)
{
  char **endChar;
  char *arg = mBuffer.getArg();
  if (! isANumber(arg)) return false;
  long longResult = strtol(arg, endChar, 0);
  if (**endChar != '\0' || longResult < 0 || longResult > 65535) return false;
  else {
    result = (unsigned long)longResult;
    return true;
  }
}

Ceci m'a permis de compiler (mais pas d'affirmer que le code ainsi bricolé fonctionne...)
J'espère ne pas être hors du sujet de ce fil, dans ce cas j'effacerai ce message, mais que mon retour d'expérience puisse servir.

Bien cordialement
Philippe








117
Vos projets / Re : Re : Un Arduino par canton
« le: avril 16, 2020, 02:59:37 pm »
Bonjour Jean-Luc,

Merci pour la réponse et le lien ! (chic du travail qui rentre... )

Pour ce qui est de la carte :

Je ne peux pas t'envoyer une carte en ce moment, ma poste est fermée.

... je lis que ça sera donc possible "après" ? Un grand merci d'avance, voilà certainement beaucoup de temps et de composants épargnés !! Je n'aurai "plus qu'à" trouver comme résoudre mon cas particulier évoqué en MP : ayant choisi de ne pas polariser les cantons au moyen de relais inverseurs mais via des ponts H, il me faudra mesurer une FCEM polarisée !

Bien cordialement
Philippe


118
Vos projets / Re : Un Arduino par canton
« le: avril 06, 2020, 11:40:47 am »
Bonjour Jean-Luc,
Ce fil est passionnant et contient énormément d'éléments. Mais la complexité du sujet fait quand même peur et il faudra certainement y aller doucement et "réinventer" en partie, refaire le chemin.
Objectif 1 : un premier montage qui me permette d-obtenir un signal tension représentatif de la FCEM.
Et pour cela, lui fournir les bonnes mesures comme expliqué : la moyenne de quatre sur 6, les extrêmes étant éliminées.
Pour éviter de tâtonner sur ce point là... trouver la durée de l'interruption de PWM, l'intervalle de temps entre chacune des 6 mesures etc (puisque dans le fil la seule donnée disponible est la fréquence de l'échantillonnage tous les 10us) serait-il possible d'avoir... carrément !... le bout de code qui permet d'obtenir ces valeurs ?
En vous remerciant par avance ?
Bien cordialement
Philippe

119
Présentez vous ! / Présentation perso et présentation "projet"
« le: septembre 16, 2019, 09:37:24 pm »
....................
sans intérêt


120
Débuter / PMW et timers ... pour débutant
« le: mai 31, 2019, 09:42:45 pm »
Bonsoir,

Ce site est décidément une mine ! Les perspectives que j'y ai entrevues sont... exaltantes ! Merci d'avance à tous les auteurs. Et à ceux des fils et articles que j'ai déjà exploités.

Pour l'instant, mon préalable à tout projet est de disposer d'une alimentation fiable et agréable.
Et j'y suis... presque. Par la grâce de la PWM.
Ayant compris pourquoi nos motrices n'aiment pas trop le 490Hz standard des cartes Arduino, j'ai plongé dans la littérature sur les timer. Assez pour comprendre les tenants et aboutissants... mais sans aller jusqu'à ouvrir le datasheet du processeur (comme parfois recommandé) !

Je suis sur un Arduino Mega. Pour obtenir une PWM à 4Mz ou 31 Kz, j'ai donc intégré à mon code l'une OU l'autre des deux commandes suivantes, opérant sur le timer 3 :   
TCCR3B = TCCR3B & B11111000 | B00000010;
TCCR3B = TCCR3B & B11111000 | B00000001;   

et j'aimerais une explication de ce que je constate, sur une motrice Jouef HO (+/- 1990)

- par rapport à la PWM 490 hz, pas de différence d'un point de vue sonore. (mais j'entends mal les aigus)
- pas de différence non plus en ce qui concerne la capacité à tenir un ralenti très lent.
- mais la grosse différence par rapport au 490 (que ce soit en 4 Mz ou 31kHz) est que la motrice "décolle" beaucoup plus tard : avec un rapport cyclique autour de 30% dans le premier cas, plus ou moins le double pour les hautes fréquences de PWM.

J'imagine que cela tient aux fronts de montée/extinction du signal ? Mais au delà de l'explication théorique j'aimerais savoir si c'est "normal" et surtout, s'il y a une solution car dans l'état, la plage d'utilisation des 256 valeurs de PWM devient fort réduite et la conduite moins agréable.

J'espère ne pas avoir ouvert un sujet intempestivement mais une recherche consciencieuse ne m'a pas permis de trouver une discussion traitant de cette question.
Merci par avance de vos commentaires !

Philippe


Pages: 1 ... 6 7 [8] 9