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

Pages: [1]
1
Composants / PCA9685 et servos
« le: mai 21, 2022, 07:29:43 pm »
Bonsoir,
Peut-on lire la position d'un servo à travers un PCA9685, c'est à dire l'équivalent d'un "servo.read()" quand le servo est branché sur l'Arduino ?

2
Discussions ouvertes / Loco DCC et courant haché
« le: mars 21, 2022, 06:06:21 pm »
Bonjour,
Quel serait le comportement d'une loco digitalisée (équipée d'un décodeur DCC) sur une voie alimentée en courant haché (PWM) via un L2298 ?

3
Vos projets / Mes servos chantent même à l'arrêt
« le: février 20, 2022, 05:18:35 pm »
Bonjour,
Je viens de programmer un Arduino Mega pour gérer le mouvement de deux servos utilisés comme moteurs d'aiguillages lents pour les aiguilles 1a et 1b (les moteurs sont des DLY2de DLYmoteur).
Pour le moment, je les commande avec des caractères saisis sur le moniteurs série de l'ordi, à titre d'essai.
Quand le sketch démarre, tt est ok, mais après un premier mouvement, le servo est en position, mais continue le même petit bruit léger que quand il bouge.
Du coup, après avoir utilisé les 2 aiguillages, même sans mouvement, j'entends les servos qui continuent à "chanter" à l'arrêt.
Comment éviter cela ?
Mon code :
#include <Servo.h>

const byte dir_1a = 60;      // Position ("angle") pour aig1a en voie directe
const byte dev_1a = 130;     // Position ("angle") pour aig1a en voie déviée
const byte dir_1b = 60;      // Position ("angle") pour aig1b en voie directe
const byte dev_1b = 130;     // Position ("angle") pour aig1b en voie déviée
Servo moteur_aig_1a;         // crée l’objet pour contrôler le servomoteur "moteur_aig_1a"
Servo moteur_aig_1b;         // crée l’objet pour contrôler le servomoteur "moteur_aig_1b"

void setup()
{
    Serial.begin(9600);
    Serial.println("_________");
    Serial.println("");
    Serial.println("Démarrage (A pour Aig1a en voie déviée | Z pour Aig1a en voie directe | Q pour Aig1b en voie déviée | S pour Aig1a en voie directe)");
    Serial.println("_________");
    moteur_aig_1a.attach(9);
    moteur_aig_1b.attach(10);
}

void loop()
{
    if( Serial.available())
    {
        byte incomingByte = Serial.read();
        if (incomingByte == 65)                      // Si on reçois un A du moniteur série
        {
            bouge_moteur(moteur_aig_1a, dev_1a);     // On met Aig1a en voie déviée
        }
        else if (incomingByte == 90)                 // Si on reçois un Z du moniteur série
        {
            bouge_moteur(moteur_aig_1a, dir_1a);     // On met Aig1a en voie directe
        }
        else if (incomingByte == 81)                 // Si on reçois un Q du moniteur série
        {
            bouge_moteur(moteur_aig_1b, dev_1b);     // On met Aig1b en voie déviée
        }
        else if (incomingByte == 83)                 // Si on reçois un S du moniteur série
        {
            bouge_moteur(moteur_aig_1b, dir_1b);     // On met Aig1b en voie directe
        }
    }
}

void bouge_moteur(Servo moteur, byte position)
{
    if (position>moteur.read())                           // Si l'angle final est supérieur à l'initial
    {
        for (int i = moteur.read() ; i < position ; i++)  // On boucle de la position actuelle à la position demandée en incrémentant de 1
        {
            moteur.write(i);                              // On met le servo dans la position incrémentée
            delay(20);                                    // On attend 20 ms
        }
    }
    else if (position<moteur.read())                      // Si l'angle final est inférieur à l'initial
    {
        for (int i = moteur.read() ; i > position ; i--)  // On boucle de la position actuelle à la position demandée en décrémentant de 1
        {
            moteur.write(i);                              // On met le servo dans la position décrémentée
            delay(20);                                    // On attend 20 ms
        }
    }
}
:

4
Vos projets / L298 et relais
« le: janvier 15, 2022, 07:58:06 pm »
Bonsoir,

Petit "au secours !"... pour mon réseau "terminus/montagne" (va falloir que je lui trouve un nom plus sympa !) décrit sur :

Je me pose encore des questions sur la commande de l'alimentation des voies.
Je prévois 4 secteurs d'alimentation :
  • une pour la gare terminus en mode manœuvre,
  • une pour les itinéraires de et vers la voie 1 dans la gare terminus vers la coulisse au travers de la zone montagne
  • une pour les itinéraires de et vers la voie 2 dans la gare terminus vers la coulisse au travers de la zone montagne
  • la dernière pour les itinéraires de et vers la voie unique directement vers la coulisse

Je pensais alimenter chaque secteur par 1/2 L298; et ensuite alimenter chacune des petites zones par des relais qui "prennent" sur l'un des 4 "bus traction" issus d'un 1/2 L298.
Simple dans le principe... mais l'inconvénient est qu'il faut 8 relais pour chacune des zones ! Vu le nombre de zones, je vais avoir 2 kilos de relais (au sens propre !) et il va falloir les alimenter.
Je voulais éviter la solution d'un 1/2 L298 par zone (il faudrait synchroniser les PWM).
Qu'en pensez-vous ? N'y a-t-il pas une solution plus légère que les relais pour "piquer" une zone sur l'un des bus traction ?

5
Bonsoir,
Pour commander mon réseau, je vais utiliser mon téléphone, et communiquer en BT avec un HC-O6 connecté à un Arduino Mega.
Mon appli envoie une ligne de commande sous forme de chaine de 7 caractères, plus un point-virgule qui indique la fin de la commande.
Les 7 premiers caractères sont (1) un chiffre pour indiquer le module (et envoyer la commande sur un autre Arduino), (2) une lettre pour distinguer le type (Relais, Alimentation via L298, Signal, Moteur d'aiguillage, Eclairage de bâtiment ou de rue), puis un numéro sur 4 chiffre, puis un état (Marche/Arrêt, Gauche/Droite...).
Ça fonctionne... mais c'est lentissime ! De l'ordre de 1 à 2 secondes entre l'appui sur le "bouton" de l'appli et le basculement des relais dans le cadre de mon essai avec 16 relais.
Mon code Arduino :
#define hc06 Serial3            // définition de hc06 comme un objet série sur le port Serial3 (broches Rx3, Tx3)
const byte relais_1 = A7;
const byte relais_2 = A6;
const byte relais_3 = A5;
const byte relais_4 = A4;
const byte relais_5 = A3;
const byte relais_6 = A2;
const byte relais_7 = A1;
const byte relais_8 = A0;
const byte relais_16 = 22;
const byte relais_15 = 24;
const byte relais_14 = 26;
const byte relais_13 = 28;
const byte relais_12 = 30;
const byte relais_11 = 32;
const byte relais_10 = 34;
const byte relais_9 = 36;
String commande_recue="";       // création et initialisation à "" d'une chaine de caractères pour les caractères reçus du HC-06 et former la commande
byte num_relais;                // création d'une variable contenant le numéro de relais reçu du HC-06

void setup()

{
  hc06.begin(9600);             // initialise le port série Bluetooth

// ci-dessous définition des broches
  pinMode(relais_1, OUTPUT);
  pinMode(relais_2, OUTPUT);
  pinMode(relais_3, OUTPUT);
  pinMode(relais_4, OUTPUT);
  pinMode(relais_5, OUTPUT);
  pinMode(relais_6, OUTPUT);
  pinMode(relais_7, OUTPUT);
  pinMode(relais_8, OUTPUT);
  pinMode(relais_9, OUTPUT);
  pinMode(relais_10, OUTPUT);
  pinMode(relais_11, OUTPUT);
  pinMode(relais_12, OUTPUT);
  pinMode(relais_13, OUTPUT);
  pinMode(relais_14, OUTPUT);
  pinMode(relais_15, OUTPUT);
  pinMode(relais_16, OUTPUT);

// ci-dessous mise à l'état HIGH des relais pour les mettre au repos (fonctionnement inversé) :
  digitalWrite(relais_1, HIGH);
  digitalWrite(relais_2, HIGH);
  digitalWrite(relais_3, HIGH);
  digitalWrite(relais_4, HIGH);
  digitalWrite(relais_5, HIGH);
  digitalWrite(relais_6, HIGH);
  digitalWrite(relais_7, HIGH);
  digitalWrite(relais_8, HIGH);
  digitalWrite(relais_9, HIGH);
  digitalWrite(relais_10, HIGH);
  digitalWrite(relais_11, HIGH);
  digitalWrite(relais_12, HIGH);
  digitalWrite(relais_13, HIGH);
  digitalWrite(relais_14, HIGH);
  digitalWrite(relais_15, HIGH);
  digitalWrite(relais_16, HIGH);
}

void loop()
{
_______________________________________________________________
  // Lecture du HC06
  if(hc06.available())
  {
    commande_recue = hc06.readStringUntil(';');
    if ((commande_recue[0]=='4')&&(commande_recue[1]=='R'))     // Si le 1er caractère de la commande est ' (n° de module) et le 2e est 'R' (relais)
    {
      num_relais=((byte)commande_recue[4]-48)*10+((byte)commande_recue[5]-48);  // Reconstitution du n° de relais
      switch (num_relais)                           // On prend le bon numéro de pin relais via la variable
      {
        case 1:
          pin_relais=relais_1;
          break;
        case 2:
          pin_relais=relais_2;
          break;
        case 3:
          pin_relais=relais_3;
          break;
        case 4:
          pin_relais=relais_4;
          break;
        case 5:
          pin_relais=relais_5;
          break;
        case 6:
          pin_relais=relais_6;
          break;
        case 7:
          pin_relais=relais_7;
          break;
        case 8:
          pin_relais=relais_8;
          break;
        case 9:
          pin_relais=relais_9;
          break;
        case 10:
          pin_relais=relais_10;
          break;
        case 11:
          pin_relais=relais_11;
          break;
        case 12:
          pin_relais=relais_12;
          break;
        case 13:
          pin_relais=relais_13;
          break;
        case 14:
          pin_relais=relais_14;
          break;
        case 15:
          pin_relais=relais_15;
          break;
        case 16:
          pin_relais=relais_16;
          break;
        default:
          hc06.println("Mauvaise commande");
          break;
      }
      switch (commande_recue[6])                          // Et l'état de pin relais selon la commande
      {
        case 'R':
          etat_pin_relais=1;
          break;
        case 'T':
          etat_pin_relais=0;
          break;
        default:
          hc06.println("Mauvaise commande");
          break;
      }
      digitalWrite(pin_relais, etat_pin_relais);    // On envoie la commande
    }
  }
}
Auriez-vous une explication et... une solution ?
Merci d'avance !!!

6
Composants / Puissance 5V du L298
« le: mai 16, 2021, 02:31:01 pm »
Bonjour,
Un L298 alimenté en 12V pour la sortie peut aussi fournir du 5V. Savez-vous quelle puissance est disponible pour cette sortie 5V ?

7
Vos projets / Masse commune
« le: avril 25, 2021, 05:22:07 pm »
Bonjour,
Je compte utiliser des Arduino pour plusieurs choses sur mon réseau :
- commande de l'allumage des signaux,
- commande de l'éclairage du décor (bâtiments, rues...)
- commande des aiguillages,
- commande de l'alimentation des voies (réseau analogique).
Ben oui, on peut faire plein de choses, alors pourquoi pas...
Mais pour les différentes fonctions, la tension n'est pas la même (5V pour les signaux, 12V pour les voies, et je pars sur du 16V~ redressé basiquement avec une diode pour les moteurs d'aiguillages).
Pour chaque fonction, il faut que la masse soit commune entre celle de l'Arduino et celle de l'alimentation du système qu'on commande.
Ma question : si je veut commander des systèmes différents par le même Arduino, je vais me retrouver avec la masse mise en commun entre le 5V, le 12V... Ca ne risque pas de poser problème ???

8
Bonjour,

Pour mon projet (http://forum.locoduino.org/index.php?topic=199.msg1911#msg1911), je compte faire dialoguer mon réseau et donc plusieurs Arduino Mega avec mon TCO sous Processing. L'idée est de connecter les Arduino via USB (en fait un mini-hub USB) au PC. Ma question est : comment, sous Processing, communiquer avec plusieurs Arduino ? C'est vrai, c'est plus une question Processing qu'une question Arduino !...

Merci d'avance de votre aide et bonne année !

Vincent

9
Vos projets / Le futur TCO de mon réseau
« le: juillet 17, 2016, 08:32:12 pm »
Bonjour à tous (et toutes),

Mon réseau est terminé en ce qui concerne la pose de la voie. Qq infos sur le forum du N : http://le-forum-du-n.forumotions.net/t17928p50-reseau-rhone-alpes.

J'hésite encore entre plusieurs systèmes de commande ; mais il y a un invariant : pas de digital, de l'analogique seulement. Si je m'engage sur une solution simple, cela pourrait être Arduino pour la commande de l'alimentation électrique des diverses zones coupées, et des aiguillages, voire des signaux quand il y en aura.

J'imagine utiliser un PC portable de récup' pour la commande sous forme d'un TCO que je programmerais, et que je ferais évoluer en fonction de mes connaissances.

Processing semble le plus adapté à Arduino, mais je pensais aussi à la solution du TCO dessiné en svg avec des éléments sur lesquels interagir, par exemple avec Javascript. Que pensez-vous de ces deux options... et la deuxième est-elle compatible avec Arduino ?

Merci de vos réactions, et aides !

Babskwal

10
Présentez vous ! / Bonjour, je suis babskwal
« le: juillet 17, 2016, 04:59:24 pm »
Bonjour à tous,

Je ne connais pas encore vraiment Arduino, à part ce que j'en ai lu sur le net, mais je sens que je peux en faire qq ch pour mon réseau miniature en N ! A ce sujet, j'ai écrit et décrit un peu sur le forum du N http://le-forum-du-n.forumotions.net/t17928p50-reseau-rhone-alpes.
J'y reviendrai dans la rubrique "Vos projets"...

A bientôt !

Pages: [1]