Code motoencodeur arduino

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour a tous, Je réalise un projet de terminale cependant une petite chose m’échappe mais je ne sais laquelle: Je me suis appuyer de code sur le net afin de pouvoir contrôler la vitesse de mon moteur

Je voudrais contrôler sa vitesse que dans un seul, par conséquent, je n’ai pas besoin de pont en H mais plutôt d’un transistor mosfet pour contrôler mon moteur.

Je me suis appuyer d’un code qui lui utilise un pont en H pour contrôler à la fois la vitesse du moteur et sa direction, voici le code :

```// Prérequis savoir utiliser un timer 
#include <TimerOne.h> // Pour le timer


// Prérequis savoir utiliser les define
// Partie à modifier pour indiquer en define quel pin est branché où A et B à brancher sur 2 et 4
#define ENCODEURA 2
#define ENCODEURB 4


// prérequis : volatile => pour toute variable qui sera utilise dans les interruptions 

volatile int count =0; // comptage de tick d'encoder  qui sera incrémenté sur interruption " On change " sur l'interruption matériel 0 qui se fait sur le pin 2
volatile double speed =0; // vitesse du moteur 
volatile byte laststate =0;  // etat précédent de l'encodeur 


// Contrôle PWM simple
#define A 5 // Contrôle vitesse moteur 1
#define B 6 //controle direction moteur 1

void stop() //Stop
{
digitalWrite(A,LOW);
digitalWrite(B,LOW);
}

void advance(char a) // En avant
{
analogWrite (A,a); // Contrôle de vitesse en PWM
digitalWrite(B,HIGH);
}

void back_off (char a) // En arrière
{
analogWrite (A,a);
digitalWrite(B,LOW);
}

void setup()
{
// on initialise les entrées et sorties
 pinMode(ENCODEURA, INPUT_PULLUP);
 pinMode(ENCODEURB, INPUT_PULLUP);
 
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
 
attachInterrupt(0,counter, CHANGE); // on crée l'interruption sur changement sur la pin 2 => interruption 0, la routine counter va se faire toute seule sans l'appeler à chaque changement d'état sur le pin 2

Timer1.initialize(100000); // On défini le timeur : 100000 microseconds ( 0.1 sec - or 10Hz )
Timer1.attachInterrupt( timerIsr ); // attach the service routine here la fonction timerIsr est une routine qui va se faire automatiquement 10* par secondes sans l'appeler

Serial.begin(9600); // Définit vitesse de transmission série
Serial.println("Execution du controle par clavier");
}

void loop()
{
if(Serial.available()){
char val = Serial.read(); //récupération des caractères sur le
if(val != -1)             //port série
{
switch(val)
{
case 'z':// En avant si touche "z"
advance (255-255); // en avant vitesse max
                  // le driver fonctionne à l'état bas en marche avant
break;
case 's':// En arrière si touche "s"
back_off (255); // en arrière vitesse max
              // le driver fonctionne à l'état haut en marche arrière
break;
case 'x': // arrêt si touche "x"
stop();
break;
}
}
else stop();
}

Serial.println("speed");             
Serial.println(speed); 
}


// Encoder counter 0

void counter()
{
  byte state=PIND;
  
  state|=B11101011;  // mask pour ne regarder que les changements sur 2 et 4 
  // Modifier le MASK  B01111011 par BXXXXXXXX mettre des 0 là où sont les pins utilisés par l'encodeur
  if( state!=laststate)
  {
    (((state&(1<<ENCODEURA))>>ENCODEURA)^((state&(1<<ENCODEURB))>>ENCODEURB))?count--:count++;
    laststate=state;
  }
}


// Timer event to calculate speed from counters

void timerIsr()
{
    speed=count; // on a le nombre de tick ( signé ) par unité de temps  = vitesse
    count=0; // On remet le compteur de tick à 0 
}
``


Je sais que je n'ai pas besoin de la sortie B, j'ai alors modifié le code :




``#include <TimerOne.h> // Pour le timer

// Prérequis savoir utiliser les define
// Partie à modifier pour indiquer en define quel pin est branché où A et B à brancher sur 2 et 4

#define ENCODEURA 2

// prérequis : volatile => pour toute variable qui sera utilise dans les interruptions 

volatile int count =0; // comptage de tick d'encoder  qui sera incrémenté sur interruption " On change " sur l'interruption matériel 0 qui se fait sur le pin 2
volatile double speed =0; // vitesse du moteur 
volatile byte laststate =0;  // etat précédent de l'encodeur 

// Contrôle PWM simple
#define A 5 // Contrôle vitesse moteur 1
void stop() //Stop
{
    digitalWrite(A,LOW);
}
  void advance(char a)
    {
analogWrite (A,a); // Contrôle de vitesse en PWM
    }
void setup()
{
// on initialise les entrées et sorties
;
pinMode(A, OUTPUT);

attachInterrupt(0,counter, CHANGE); // on crée l'interruption sur changement sur la pin 2 => 

interruption 0, la routine counter va se faire toute seule sans l'appeler à chaque changement d'état sur le pin 2

Timer1.initialize(100000); // On défini le timeur : 100000 microseconds ( 0.1 sec - or 10Hz )
Timer1.attachInterrupt( timerIsr ); // attach the service routine here la fonction timerIsr est 

une routine qui va se faire automatiquement 10* par secondes sans l'appeler

Serial.begin(9600); // Définit vitesse de transmission série
Serial.println("Execution du controle par clavier");
}
void loop()
{
if(Serial.available()){
char val = Serial.read(); //récupération des caractères sur le
if(val != -1)             //port série
{
switch(val)
{
case 'z':// En avant si touche "z"
advance (255-255); // en avant vitesse max
                  // le driver fonctionne à l'état bas en marche avant
break;
case 'x': // arrêt si touche "x"
stop();
break;
}
}
else stop();
}
Serial.println("speed");             
Serial.println(speed); 
}

// Encoder counter 0
void counter()
{
  byte state=PIND;
  state|=B11111011;  // mask pour ne regarder que les changements sur 2 et 4 
  // Modifier le MASK  B01111011 par BXXXXXXXX mettre des 0 là où sont les pins utilisés par l'encodeur
  
if( state!=laststate)
  {
    (((state&(1<<ENCODEURA))>>ENCODEURA))?count--:count++;
    laststate=state;
  }
}
// Timer event to calculate speed from counters
void timerIsr()
{
    speed=count; // on a le nombre de tick ( signé ) par unité de temps  = vitesse
    count=0; // On remet le compteur de tick à 0 
}
```arduino

L’orsque je lance le code et que je branche le moteur sur les bonnes sorties de l’Arduino la console affiche "Speed : 0" que le moteur soit arrêté ou a plein régime

Qu’elle erreur ai-je faite ?,

PROJET CAPTURE.PNG
PROJET CAPTURE.PNG

Je tiens à expliquer que nous nous intéressons seulement à la partie gauche, en guise d’explication : Les trois fils non connectés sont reliés à un capteur (je n’ai pas trouver de capteur sur fritzing) et le bouton est un bouton d’arrêt d’urgence exemple : si on appuie dessus la sortie 2 est nul et ça arrête le moteur

Édité par Bidilbo

+0 -0

Salut ! ;)

Pense à mettre ton code dans un bloc code avec le bouton < > bleu en haut de la zone de commentaires car là il est illisible. De plus, pourrais-tu nous fournir un schéma de ton montage (fritzing, etc…) pour savoir si ça vient de là ou non ?

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte