Rotator sur base d'Arduino Uno+ Motorshield + L298N

Bonjour,

Tout d'abord, merci à ceux qui prendront le temps d'étudier mon problème car j'ai quelques difficultés dans la compréhension d'un programme arduino malgré ma pratique de nombreux autres langages informatiques.

Je dispose d'un appareil mécanique qui est un rotateur : on fixe sur le rotateur un appareil photo, puis grâce à la motorisation du rotateur, on peut faire tourner la caméra jusqu'à atteindre une position désirée, le rotateur lui est fixe. Ca permet de choisir l'angle de l'appareil photo pour un cadrage parfait.

Le rotateur possède un moteur dont l'arbre de sortie tourne lentement car il dispose d'un étage micro-réducteur ainsi que son capteur. C'est un moteur DC alimenté en 12V, au même titre que le capteur. Le capteur possède son câble pour pouvoir compter les impulsions quand il est connecté à une entrée analogique.

Le rapport de réduction du rotateur, de sorte que :

-> pour faire tourner la caméra de 360°, je dois compter 112000 impulsions du capteur.

Mon souhait : renseigner un angle (positif ou négatif) dans la console arduino qui surveille mon port COM, et faire tourner le rotateur de cet angle (donc dans un sens ou dans un autre) et s'arrêter, puis attendre un autre angle pour bouger de nouveau.

=> J'aimerais voir affichés en live le nombre d'impulsions comptées ainsi que la correspondance angulaire.

Merci.

Pour l'instant je n'arrive pas à afficher ni à compter en direct (quand le moteur tourne) le nombre d'impulsions renvoyées par le capteur.

Voici pour l'instant mon code :

//Moteur connecté sur la carte L298N du fait du voltage 12V nécessaire à son fonctionnement
int L298N_IN1=1; //contrôle un sens de rotation, relié sur le shield moteur pin 1
int L298N_IN2=2; //contrôle l'autre sens de rotation, relié sur le shield moteur pin 2
int L298N_enA=3; //contrôle la vitesse de rotation, relié sur le shield moteur pin 3

//Alimentation du capteur aussi en 12V, donc aussi sur le L298N
int L298N_IN4=4; //relié sur le shield moteur pin 4
int sensorPin = A1; //relié sur le shield moteur pin analogique A1
int sensorValue = 0; //valeur initiale du nombre d'impulsions = 0

void setup() {
  pinMode(L298N_IN1,OUTPUT);
  pinMode(L298N_IN2,OUTPUT); 
  pinMode(L298N_enA,OUTPUT);
  pinMode(L298N_IN4,OUTPUT);
  Serial.begin(115200); //initialise le port serie à 115200 bauds //grâce à l'observation du port je tente de voir le nombre d'impulsions
         delay(1);
         Serial.println("");
}

void loop() {

  
  StopRotator();
  delay(2000);
  
  leftTurn();
  delay(1000);


  StopRotator();
  delay(2000);
  
  rightTurn();
  delay(1000);
}

void StopRotator()
{
  digitalWrite(L298N_IN1,LOW);
  digitalWrite(L298N_IN2,LOW);
    sensorValue = analogRead(sensorPin);
  Serial.print(sensorValue);
}


void leftTurn()
{
  digitalWrite(L298N_IN1,HIGH);
  digitalWrite(L298N_IN2,LOW);
  analogWrite(L298N_enA,200);
    sensorValue = analogRead(sensorPin);
  Serial.print(sensorValue);
}


void rightTurn()
{
  digitalWrite(L298N_IN1,LOW);
  digitalWrite(L298N_IN2,HIGH);
  analogWrite(L298N_enA,200);
    sensorValue = analogRead(sensorPin);
  Serial.print(sensorValue);
}

bonjour,
les impulsions sont de quelle ordre en voltage?

Je ferai une mesure avec mon multimètre.
En pièce jointe le pdf du codeur, mais il n'indique pas ce genre d'information.

J'avais lu un code pour interpréter justement la tension sur le port analogique A1 sur lequel le codeur est connecté.

void mesureTensionSensor(){
    float tension = map(valeurLue, 0, 1023, 0, 12000);
    tension = tension/1000; //conversion des mV en V
}

Mais ça ne lit rien, ou alors mon code est erroné.

Ceci est mon code qui tente d'afficher la tension (j'ai un nombre qui s'affiche sur la ligne "Lecteur du capteur" mais qui semble tjs être la même).

#include <Servo.h> 
int SERVO=A1;

Servo myservo;            // create servo object to control a servo 
                          // a maximum of eight servo objects can be created 
 
int NbImp=0;              // variable to store the servo position
int A=0;                  // variable de stockage des octets reçus par port série
int L298N_IN2_sensor=4;   //alimentation du capteur en 12V sur le L298N
int NbPuls=0;
int ReceptionNombre=0;    // variable de calcul du nombre reçu par port série

float tension;
//const int monCapteur = A1; //le sensor sur la broche A1
int valeurLue = 0;        //la valeur lue sera comprise entre 0 et 1023
 
void setup() 
{ 
  pinMode(L298N_IN2_sensor,OUTPUT);
  myservo.attach(SERVO);
  pinMode(SERVO,INPUT);
  digitalWrite(SERVO,HIGH);
  digitalWrite(L298N_IN2_sensor,HIGH);

                      
  
  Serial.begin(115200); //initialize serial connexion at 115200 bauds
  Serial.println("Welcome Rotator, quel angle de rotation ?");

} 



 
void loop() 
{ 
        delay(500);
        digitalWrite(SERVO,HIGH);
        digitalWrite(L298N_IN2_sensor,HIGH);

      
if (Serial.available()>0) {

         while (Serial.available()>0) {

          A=Serial.read();
          A=A-48;
          if ((A>=0)&&(A<=9))     ReceptionNombre = (ReceptionNombre*10)+A;

          
          delay(1); //pause for Serial to read all characters


          Serial.println("");
          Serial.print("Angle voulu ? ");
          Serial.print(ReceptionNombre);
          delay(2000);
         } 

      
          convertDegPuls();
          
          
          for (NbPuls =0; NbPuls < NbImp; NbPuls++)
                    {

                      valeurLue = analogRead(SERVO);
                      Serial.println("");
                      Serial.print("Lecture du capteur = ");
                      Serial.print(valeurLue);
                      
                      mesureTensionSensor();
                      Serial.println("");
                      Serial.print("La tension vaut = ");
                      Serial.print(tension);
                      Serial.print(" mV");




                      
           //           digitalWrite(L298N_IN1,HIGH);
                      digitalWrite(SERVO,HIGH);
            //          digitalWrite(L298N_IN2,LOW);
                      //NbPuls=NbPuls+1;
                      Serial.println("");
                      Serial.print("Impulsion en cours = ");
                      Serial.print(NbPuls);
                    }
         //   digitalWrite(L298N_IN1,LOW);
         //digitalWrite(SERVO,HIGH);
         A=0; 
         ReceptionNombre=0;
         //   digitalWrite(L298N_IN2,LOW);
         Serial.println("");
         Serial.print("Welcome Rotator, quel angle de rotation ?");     
                          }
}


void mesureTensionSensor(){
    float tension = map(valeurLue, 0, 1023, 0, 12000);
    tension = tension/1000; //conversion des mV en V
}


int convertDegPuls(){
  NbImp=round(ReceptionNombre*112000/720);
  Serial.println("");  
  Serial.print("Nombre d'impulsions necessaires = ");
  Serial.print(NbImp);
  delay(2000);
}

void serialEvent() //déclaration de la fonction d'interruption sur la voie série
{
    //lit toutes les données (vide le buffer de réception)
    while(Serial.read() != -1); 
    
    //puis on arrête le moteur
    digitalWrite(SERVO, LOW);
    digitalWrite(L298N_IN2_sensor,LOW);  
}

FR_IE2-16_DFF.PDF (356 KB)

bonjour
pourquoi veut tu passer par de l'acquisition analogique ? alors que ton capteur sort une info numerique.
la sortie est en collecteur commun , il faut simplement compter le nombre d'impulsions (digitalread() ou interruption)

compter les impulsions, oui, mais il en sort quoi en voltage du module pour les impulsions?
d'où ma question :wink:

infobarquee:
compter les impulsions, oui, mais il en sort quoi en voltage du module pour les impulsions?
d'où ma question :wink:

salut IB
regarde le DS c'est une sortie en collecteur commun
tu connecte à VCC

Il sort du 25 mV.

Je n'arrive pas à afficher un compteur d'impulsion en live, mais uniquement en début de loop ou dans un void.

En gros après réflexion peut-être que la solution est là, mais je ne connais pas suffisamment le C++ :
Pourriez-vous m'aider ?
Je vais vous présenter le schéma arduino prochainement.

Ai = angle initial
Af =? // angle demandé

A = Af-Ai
si A<0 ; //tourner dans le sens horaire
si A>0 ; //tourner dans le sens anti-horaire
Ai=A //on mémorise Ai comme nouvelle reference

NI = conversion de abs(A) en nombre d'impulsions


"boucle" :

tant que impulsion < NI
faire tourner le moteur
impulsion = impulsion +1

bon bhen c est bon j'ai réussi en quelques jours à pondre un code qui fonctionne ! chuis bien content.

Merci pour votre participation.