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.


Sujets - Yves21000

Pages: [1]
1
Vos projets / Bibliothèque TMRpcm
« le: février 22, 2020, 09:44:37 pm »
Bonjour à tous

Je voulais vous faire part d'un problème que j'ai rencontré avec la bibliothèque TMRpcm. Je l'ai évoqué ici http://forum.locoduino.org/index.php?topic=912.msg9587#msg9587, mais ce n'est plus en rapport avec le titre, d'où l'ouverture d'un nouveau sujet.

En voulant utiliser une carte SD et la bibliothèque TMRpcm pour ajouter du son, je n'ai pas eu de problème quand je l'ai testée seule pour écouter les sons au bon format  Ca marche même très bien.
Par contre, en voulant l'utiliser pour sonoriser un passage à niveau, j'avais un fonctionnement bizarre des servos qui ne bougeaient pas alors que la variation d'angulation allait bien à son terme.
J'avais donc un controle des barrières fermées alors qu'elles étaient toujours ouvertes  ::)

Après pas mal d'essais et recherches, j'ai découvert que la bibiothèque TMRpcm utilisait le même timer que la bibliothèque Servo. (timer1).
Comme je ne suis pas en mesure de modifier les accès et la gestion direct du processeur, j'ai trouvé une autre bibiothèque PWM pour les servos (Servo_Hardware_PWM) mais qui ne fonctionne que sur Mega (avec un autre timer). Dans ce cas, les 2 bibliothèques sont compatibles.
Il y a quelques restrictions sur les bornes utilisables en PWM, mais ça fonctionne.

Il fallait que je reprenne un peu mon programme pour commander les servos.

Finalement, j'ai pu tester DFPlayer qui fonctionne parfaitement avec les servos sans rien changer. En plus, pas de contrainte particulière sur la spécification des fichiers son (à par la numérotation).
J'ai adopté cette solution.
J'utiliserai TMRpcm dans un autre montage.

Yves


2
Vos projets / Carte son DFR0534
« le: février 18, 2020, 11:18:26 am »
Bonjour à tous

Comme je l'ai deja évoqué par ailleurs, je suis en train de réaliser un passage à niveau à l'identique.
Il sera bientot greffé sur une maquette HO avec les moteurs alsthom trouvés ici https://www.decapod.fr/passages-a-niveau/769-demi-barrieres-de-pn-sur-moteur-alsthom-ho--2001500028967.html
et les feux correspondants trouvés ici https://www.production-ludo-modelisme.fr/Feux-doubles-2-Leds-Resistances-cbaaaaaTa.asp

Grace au site et aux contributions de plusieurs d'entre vous, mon projet PN est quasiment terminé (photo en P.J.).

Tout ceci fonctionne :
  • Preavis
    pulsation des feux à 70/mn
    Temps de descente et de remontée
    Fonction train croiseur
    KBrO et KBrF (controle de position des barrières)
    Afficheur état du PN (n'existe pas en vrai, mais pour un autre projet à greffer dessus !)

Il me reste un point où je bute depuis plusieurs jours (semaines même puisque je l'avais acheter en décembre).
J'ai une carte son DFR0534 qui me paraissait interessante.
Par contre, je ne comprends pas son fonctionnement.
J'ai pu y ajouter mes sons, les faire jouer sur une carte individuelle (uno ou mega) avec l'exemple fourni (en boucle), mais je n'arrive pas à commander comme je le souhaite.

Plusieurs points nébuleux :
l'utilisation de la bibliothèque softwareserial :
pourquoi une déclaration de variable Serial1 (il n'y a qu'un port série sur uno)
Pourquoi ça marche sur les bornes 10 et 11, alors que la liaison est en Tx et Rx (normalement 0 et 1 sur uno) ?

Comment choisir le son voulu (ce sont des adresses en hexa), mais je ne comprends pas "char order [4]
A quoi servent les serial1.write (order, 4), (play, 6), volume, 5) : le chiffre dans la parenthèse ?

Pour commencer, je voudrai, à partir d'un inverseur, commander le son 17 (hex 11) ou le son 20 (hex14) et l'arreter au bout de 10s.
Je joins mon croquis en l'état et la doc de la carte. Helas, je ne trouve quasiment rien sur ce produit sur le net.

S'il y avait une bonne ame pour m'aider à comprendre l'usage de cette carte (surtout du langage C !) et me sortir du gué, je pourrais finir proprement   ;)

Merci par avance


https://drive.google.com/file/d/1S2yN067opf4_LBSVU3QdSNBBUJ6oP7TW/view?usp=sharing








3
Présentez vous ! / dernier arrivé
« le: février 12, 2020, 06:52:11 pm »
Bonjour

Je viens de voir que je ne me suis pas présenté depuis mon inscription du 9 décembre dernier !

Je suis retraité de la SNCF et j'ai passé beaucoup de temps sur les passages à niveau et postes d'aiguillage.
Par contre, je n'ai jamais fait de modélisme.
Je m'intéresse à arduino depuis quelque temps et j'ai découvert ce site de passionnés en voulant chercher des infos sur la modélisation d'un passage à niveau.
J'ai entrepris de réaliser un passage à niveau avec toutes les fonctions réelles pour en faire une maquette.

Si vous avez besoin d'infos sur le fonctionnel, je serai à votre disposition (j'ai déja donné quelques infos dans la rubrique "réalsation d'un passage à niveau").
Par contre, je pense que je vais avoir besoin d'aide pour comprendre une partie des subtilités d'arduino :
La gestion du son
La gestion de PWM
La gestion d'affichage

Ces 3 points me posent problème car ils utilisent delay qui bloque l'ensemble du programme principale.

Au plaisir de prochains échanges  ;)


4
Vos projets / Affichage ecran
« le: février 12, 2020, 06:21:35 pm »
Bonjour

Je reposte mon sujet que j'ai mis par erreur dans la rubrique "un automatisme de passage à niveau".

Je suis en train de réaliser un passage à niveau au plus près de la réalité.
Presque tout fonctionne correctement, mais je me heurte à un problème d’affichage sur un écran.

Je voudrais afficher en permanence sur un écran LCD I2C, l’état de 4 relais pour indiquer l’état du PN.
J’arrive bien à faire fonctionner mon affichage dans un programme isolé en utilisant la fonction delay().
Par contre, quand j'insère ce programme dans le programme principal, delay() me bloque l’ensemble (c'est logique !).
Comment pourrais-je m’en sortir et remplacer delay par autre chose ?
J’avais pensé à utiliser MsTimer2, mais là, je suis bloqué !

Il y a bien msport qui m'a répondu  ;), mais je ne vois pas où gérer millis().

Merci de votre aide

/* Fonctionnement d'un ecran LCS I2C sur Mega *****************
 *  Branchement en +VCC, GND, SDA (20) et SLC (21)
 *  Informations provenant de 4 contats de relais
 *  branchés en A0, A1, A2 et A3 avec Resistances et capa
 *  pour gérer les rebonds (avec un trigger sur la carte finale
 *  ***********************************************************/

/* programme non compatible avec le reste du passage à niveau
 *  du fait de l'utilisation de la fonction delay(1000) pour
 *  l'affichage des différents états à l'écran (blocage du prog)
 *  *********************************************************/

#include <LiquidCrystal_PCF8574.h>
#include <Wire.h>
#include <MsTimer2.h>

LiquidCrystal_PCF8574 lcd(0x27); // set the LCD address to 0x27 for a 16 chars and 2 line display
int show = -1;
#define PIN_S0  A0
#define PIN_S1  A1
#define PIN_S2  A2
#define PIN_S3  A3
boolean etat0 ;
boolean etat1 ;
boolean etat2 ;
boolean etat3 ;
int etatbouton = 1;

void setup(){
// declaration des boutons en entrée
  pinMode (PIN_S0, INPUT);
  pinMode (PIN_S1, INPUT);
  pinMode (PIN_S2, INPUT);
  pinMode (PIN_S3, INPUT);

//  MsTimer2 :: set (1000, ecran); periode de 1s
//  MsTimer2 :: start();
 
  int error;
  Serial.begin(115200);
  Serial.println("LCD...");
  // wait on Serial to be available on Leonardo
  while (!Serial);
  Serial.println("Dose: check for LCD");
  // Voir http://playground.arduino.cc/Main/I2cScanner pour tester le port I2C.
  Wire.begin();
  Wire.beginTransmission(0x27);
  error = Wire.endTransmission();
  Serial.print("Error: ");
  Serial.print(error);
  if (error == 0) {
    Serial.println(": LCD found.");
    show = 0;
    lcd.begin(16, 2); // initialize the lcd
  } else {
    Serial.println(": LCD not found.");
  } // fin if
} // fin setup()

void loop(){
  etat0 = digitalRead(PIN_S0);
  etat1 = digitalRead(PIN_S1);
  etat2 = digitalRead(PIN_S2);
  etat3 = digitalRead(PIN_S3);
  lcd.setBacklight(255);
  lcd.home();
  lcd.clear();

  Serial.print(etat0);
  Serial.print(etat1);
  Serial.print(etat2);
  Serial.print(etat3);

switch (etatbouton) {
  case 1: if (etat0 == LOW){ //HIGH avec bascule de schmitt (inversion du signal) sinon LOW
      lcd.setCursor(0, 0);
      lcd.print(" PN a 298 metres ");
      lcd.setCursor(0, 1);
      lcd.print("  ");
  }
  case 2: if (etat1 == LOW){
    lcd.setCursor(0, 0);
    lcd.print(" PN a 240 metres ");
    lcd.setCursor(0, 1);
    lcd.print("     Ferme");
  }
  case 3: if (etat2 == LOW){
    lcd.setCursor(0, 0);
    lcd.print("     Danger ");
    lcd.setCursor(0, 1);
    lcd.print(" Ne pas franchir ");
  }
  case 4: if (etat3 == LOW){
    lcd.setCursor(0, 0);
    lcd.print("  Route barree");
    lcd.setCursor(0, 1);
    lcd.print("     travaux");
  }
 case 5: if (etat0==HIGH && etat1==HIGH && etat2==HIGH && etat3==HIGH){
    lcd.setCursor(0, 0);
    lcd.print("   Etat du PN ");
    lcd.setCursor(0, 1);
    lcd.print("   indetermine");
}
delay(1000); 
}
} //fin de loop

Pages: [1]