LOCODUINO

Aide
Forum de discussion
Dépôt GIT Locoduino
Flux RSS

vendredi 29 mars 2024

Visiteurs connectés : 36

Les différents types de mouvements d’un servomoteur

. Par : Dominique, Guillaume, Jean-Luc

Article mis à jour le 13 août 2023 pour ajouter un lien vers l’article SlowMotionServo.Les angles donnés sont à titre d’exemple, ils ne refléteront pas ceux de votre réseau. Les valeurs limites seront à trouver avec une application dédiée. Aller-retours La première application est très simple, il s’agit de faire faire au servo des (...)

Retourner à l'article

Vous répondez à :

Bonjour Dominique,
J’aimerai votre aide pour répondre à 1 questions et résoudre un problème en lien avec l’eeprom.
Q1 : Pour quelle raison les numéros des pines servos dans votre programme ne correspondent pas aux pines des sorties PWM des mega ?
Problème :
Je rencontre un problème similaire à celui de Patrice en 2017, Il m’est impossible de rentrer dans l’eeprom les angles min et max des servos qui sont dans le tableau tablePos[MaxAig][2].
j’ai bien tapé 0 dans le champ de saisie du moniteur, le programme m’indique bien ENREGISTREMENT EEPROM. Mais lorsque je retourne sur le moniteur, les données restent toujours les mêmes.
15:28:44.206 -> Version 17
15:28:44.206 -> 0:1500,1600
15:28:44.206 -> 1:1500,1600
15:28:44.206 -> 2 :-1,-1
15:28:44.206 -> 3 :-1,-1
15:28:44.206 -> 4 :-1,-1
15:28:44.206 -> 5 :-1,-1
15:28:44.206 -> 6 :-1,-1
15:28:44.206 -> 7 :-1,-1
15:28:44.206 -> 8 :-1,-1
15:28:44.206 -> 9 :-1,-1
15:28:55.106 -> Enregistrement EEPROM

Pour "apprivoiser" et déterminer les paramètres, j’ai câblé mon mega avec 1 seul servo et un seul interrupteur-pas de LED pour le moment. Mon but est de commander 15 servos en utilisant toutes les sorties PWM du Mega 2560.
Ci apprès le sketch qui est une copie du votre dans lequel j’ai choisi la pin2 pour le servo et 22 pour l’interrupteur.
Cela fait plusieurs soirées que je bute sur ce problème d’angle mini et maxi qui ne sont pas enregistrés dans l’eeprom.
Je profite de message pour vous remercier pour le fantastique travail de vulgarisation et d’aide que toutes les personnes de Locoduino offrent.

Sketch qui ne fonctinne pas bien :

// VERSION 1.1 du 1 Decembre 2016

#include <Arduino.h>
#include <Servo.h>
#include <Bounce2.h>
#include <EEPROM.h>
#include "Dix_aiguilles.h"


#define MaxAig 10                   // nombre d'ensembles Aiguille+Inter+2leds


const int tablePins[MaxAig][4] = { // pour chaque aiguille il faut renseigner les No de pins :
  {02, 22, 16 ,17},                // pin Servo, pin Inter, pin Led Directe, pin led Déviée
  {18, 19, 20, 21},                // c'est geroupé par blocs de quatre
  {14, 23, 23, 25},                // correspondant au groupes de 4 connecteurs 
  {26, 27, 28, 29},                // sur la carte fakir
  {30, 31, 32, 33},
  {34, 35, 36, 37},
  {38, 39, 40, 41},
  {42, 43, 44, 45},
  {46, 47, 58, 49},
  {50, 51, 52, 53} 
};

int tablePos[MaxAig][2] = { // butées Min et Max en globales
  {1200, 1800},
  {1500, 1600},
  {1500, 1600},
  {1500, 1600},
  {1500, 1600},
  {1500, 1600},
  {1500, 1600},
  {1500, 1600},
  {1500, 1600},
  {1500, 1600}  
};

CommandeAiguille*  aiguille0=new CommandeAiguille();
CommandeAiguille*  aiguille1=new CommandeAiguille();
CommandeAiguille*  aiguille2=new CommandeAiguille();
CommandeAiguille*  aiguille3=new CommandeAiguille();
CommandeAiguille*  aiguille4=new CommandeAiguille();
CommandeAiguille*  aiguille5=new CommandeAiguille();
CommandeAiguille*  aiguille6=new CommandeAiguille();
CommandeAiguille*  aiguille7=new CommandeAiguille();
CommandeAiguille*  aiguille8=new CommandeAiguille();
CommandeAiguille*  aiguille9=new CommandeAiguille();

CommandeAiguille* tableAiguille[MaxAig] {
  aiguille0, aiguille1, aiguille2, aiguille3, aiguille4, 
  aiguille5, aiguille6, aiguille7, aiguille8, aiguille9
};

/////////// variable globales ///////////
  byte V0, V1;
  int val;
  int numServo, encoursServo;
  bool minmax; // min = false, max = true


/////////////////////////////////////////////////////////
void setup() 
{
  int numServo;

  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  V0 = EEPROM.read(0);
  V1 = EEPROM.read(1);
  if ((V0!=0xFF)&&(V1!=0xFF)) {
    val = V0;
    val = val << 8;
    val = val | V1;
    Serial.print("Version ");Serial.println(val);
    EEPROM.get( 2, tablePos );  //lecture de la table des min et max.
    for( int j = 0 ; j < MaxAig ; j++ ){
      Serial.print( j ); 
      Serial.print( ':' ); 
      Serial.print( tablePos[ j ][ 0 ]);
      Serial.print( ',' ); 
      Serial.print( tablePos[ j ][ 1 ]);
      Serial.println(); 
    }
  } else {
    Serial.println("EEPROM vierge");
    val = 0;
  }
    for (numServo = 0; numServo < MaxAig; numServo++) {
    tableAiguille[numServo]->SetpinServo(tablePins[numServo][0]);
    tableAiguille[numServo]->SetpinInter(tablePins[numServo][1]);
    tableAiguille[numServo]->SetpinLedDirecte(tablePins[numServo][2]);
    tableAiguille[numServo]->SetpinLedDeviee(tablePins[numServo][3]);
    tableAiguille[numServo]->SetPosMinMax(tablePos[numServo][0], tablePos[numServo][1]);
    tableAiguille[numServo]->InitCommandeAiguille();
  } 

}

//////////////////////////////////////////////////////
void loop() 
{

  for (numServo = 0; numServo < MaxAig; numServo++) {
    tableAiguille[numServo]->ServoUpdate();
    tableAiguille[numServo]->InterUpdate();
  }
  
  while (Serial.available() > 0) 
  {
    int commande = Serial.parseInt();  // lecture entier
    if (Serial.read() == '\n') 
    {
      switch (commande) {
        case 0:
        val = val + 1;
        V1 = val;
        V0 = val >> 8;
        EEPROM.update(0, V0);
        EEPROM.update(1, V1);
        Serial.println("Enregistrement EEPROM");
        EEPROM.put( 2, tablePos );  //Write array data.
        break;
        
        case 1:
        encoursServo = commande - 1;
        Serial.print("Servo "); Serial.print(encoursServo+1); Serial.print(" : ");
        Serial.print(tablePos[encoursServo][0]);Serial.print("->");
        minmax = false;
        break;
        case 2:
        encoursServo = commande - 1;
        Serial.print("Servo "); Serial.print(encoursServo+1); Serial.print(" : ");
        Serial.print(tablePos[encoursServo][0]);Serial.print("->");
        minmax = false;
        break;
        case 3:
        encoursServo = commande - 1;
        Serial.print("Servo "); Serial.print(encoursServo+1); Serial.print(" : ");
        Serial.print(tablePos[encoursServo][0]);Serial.print("->");
        minmax = false;
        break;
        case 4:
        encoursServo = commande - 1;
        Serial.print("Servo "); Serial.print(encoursServo+1); Serial.print(" : ");
        Serial.print(tablePos[encoursServo][0]);Serial.print("->");
        minmax = false;
        break;
        case 5:
        encoursServo = commande - 1;
        Serial.print("Servo "); Serial.print(encoursServo+1); Serial.print(" : ");
        Serial.print(tablePos[encoursServo][0]);Serial.print("->");
        minmax = false;
        break;
        case 6:
        encoursServo = commande - 1;
        Serial.print("Servo "); Serial.print(encoursServo+1); Serial.print(" : ");
        Serial.print(tablePos[encoursServo][0]);Serial.print("->");
        minmax = false;
        break;
        case 7:
        encoursServo = commande - 1;
        Serial.print("Servo "); Serial.print(encoursServo+1); Serial.print(" : ");
        Serial.print(tablePos[encoursServo][0]);Serial.print("->");
        minmax = false;
        break;
        case 8:
        encoursServo = commande - 1;
        Serial.print("Servo "); Serial.print(encoursServo+1); Serial.print(" : ");
        Serial.print(tablePos[encoursServo][0]);Serial.print("->");
        minmax = false;
        break;
        case 9:
        encoursServo = commande - 1;
        Serial.print("Servo "); Serial.print(encoursServo+1); Serial.print(" : ");
        Serial.print(tablePos[encoursServo][0]);Serial.print("->");
        minmax = false;
        break;
        case 10:
        encoursServo = commande - 1;
        Serial.print("Servo "); Serial.print(encoursServo+1); Serial.print(" : ");
        Serial.print(tablePos[encoursServo][0]);Serial.print("->");
        minmax = false;
        break;
        
        default:
        if ((commande > 1400) && (commande < 1700)) {
          Serial.print(commande);
          if (!minmax) {
            tablePos[encoursServo][0] = commande;
            minmax = true;
            Serial.print(", ");
            Serial.print(tablePos[encoursServo][1]);Serial.print("->");
          } else {
            tablePos[encoursServo][1] = commande;
            Serial.println();
            Serial.print("Aiguille "); Serial.print(encoursServo+1); Serial.print(" : ");
            Serial.print(tablePos[encoursServo][0]);Serial.print(", ");
            Serial.println(tablePos[encoursServo][1]);
          }
        }
        break;
      }
      
    }
  }

}
Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

36 Messages

Rubrique Matériel

Le microcontrôleur ATtiny45 (1)

Le microcontrôleur ATtiny45 (2)

Le microcontrôleur ATtiny45 (3)

Le microcontrôleur ATtiny45 (4)

Le microcontrôleur ATtiny45 (5)

Le microcontrôleur ATtiny45 (6)

Le microcontrôleur ATtiny45 (7)

Le microcontrôleur ATtiny45 (8)

Le microcontrôleur ATtiny45 (9)

Le microcontrôleur ATtiny45 (10)

Fonctionnement et pilotage d’une DEL

Qu’est ce qu’une carte Arduino ?

Amplifier le signal de sortie d’un ARDUINO avec un ULN 2803

Un minimum pour jouer rapidement avec un Arduino

Où acheter ?

Résistances, kézako ?

Les cartes Teensy

Relais électromagnétique

Les diodes classiques

Détecteurs à ultrasons

De nouveaux composants pour continuer à jouer

La carte Arduino Uno

Bouton poussoir

Les différents types de mouvements d’un servomoteur

Les encodeurs en quadrature

Les indispensables du prototypage

Les écrans LCD alphanumériques

Des bus de communication pour l’Arduino

Les interrupteurs

Signaux lumineux et Arduino

Les shields de prototypage et de connexion

Commande de moteur à courant continu

Choisir sa carte Arduino

Une station DCC complète, polyvalente et économique avec JMRI.

Écran couleur tactile Kuman

Capteurs à effet Hall

Programmation des ATtiny Digispark

Ma première centrale DCC

Ma première manette DCC (1)

Une station DCC minimale avec boutons de commande et écran Oled

Ma première manette DCC (2)

Le Raspberry Pi Pico

Signalisation et sonorisation du va-et-vient pour deux trains

Configurateur de CV sur base de la station DCC minimale

Fabrication d’un programmateur pour microcontrôleurs ATtiny

Détection RailCom© avec ESP32 (ou Arduino)

Adieu Uno, bonjour Uno !

Ma nouvelle manette DCC avec ESP32 (1)

Ma nouvelle manette DCC avec ESP32 (2)

LES SATELLITES AUTONOMES : une nouvelle approche du concept de Satellites Locoduino. (1)

LES SATELLITES AUTONOMES : une nouvelle approche du concept de Satellites Locoduino. (2)

LES SATELLITES AUTONOMES : une nouvelle approche du concept de Satellites Locoduino. (3)

LES SATELLITES AUTONOMES : une nouvelle approche du concept de Satellites Locoduino.(4)

LES SATELLITES AUTONOMES : une nouvelle approche du concept de Satellites Locoduino. (5)

Les derniers articles

LES SATELLITES AUTONOMES : une nouvelle approche du concept de Satellites Locoduino. (5)


bobyAndCo

LES SATELLITES AUTONOMES : une nouvelle approche du concept de Satellites Locoduino.(4)


bobyAndCo

LES SATELLITES AUTONOMES : une nouvelle approche du concept de Satellites Locoduino. (3)


bobyAndCo

LES SATELLITES AUTONOMES : une nouvelle approche du concept de Satellites Locoduino. (2)


bobyAndCo

LES SATELLITES AUTONOMES : une nouvelle approche du concept de Satellites Locoduino. (1)


bobyAndCo

Détection RailCom© avec ESP32 (ou Arduino)


bobyAndCo, catplus

Ma nouvelle manette DCC avec ESP32 (2)


msport

Ma nouvelle manette DCC avec ESP32 (1)


msport

Adieu Uno, bonjour Uno !


Christian

Fabrication d’un programmateur pour microcontrôleurs ATtiny


Christian, Dominique, Jean-Luc

Les articles les plus lus

Commande de moteur à courant continu

Capteurs à effet Hall

Une station DCC complète, polyvalente et économique avec JMRI.

Programmation des ATtiny Digispark

Les diodes classiques

Les différents types de mouvements d’un servomoteur

Ma première centrale DCC

Relais électromagnétique

La carte Arduino Uno

Les interrupteurs