Contrôle de la position de la casquette par codeur

Objectif : Contrôler la position de la casquette sans avoir à ajouter de détecteur de position (fin de course)

Nous allons utiliser un bouton poussoir et deux capteurs fin de course :

  • BP1 : Bouton-poussoir pour faire sortir la casquette

  • BP2 : Bouton-poussoir pour faire rentrer la casquette

Le codeur incrémental

Le moto-réducteur est équipé d'un codeur incrémental pour fournir une indication précise sur le nombre de tours qu'il a fait. Des impulsions sont envoyées régulièrement lors de la rotation du moteur, il suffit de compter ces impulsions et de connaître le nombre d'impulsions par tour pour déterminer la position angulaire de l'arbre du moteur.

Ainsi, on peut le commander pour faire 2,5 tours en descente et le commander pour qu'il refasse 2,5 tours précisément en montée. La casquette reviendra donc exactement à sa position initiale.

 

On peut voir sur l'image qu'il y a plus que deux bornes : il faut commander le moteur et on peut lire de combien de degrés le moteur a tourné.

Réaliser le câblage de la photo suivante :

Remarques :

  • La broche « OUT » du bouton poussoir reliée à une borne JAUNE de la carte.

  • La broche « VCC » du bouton poussoir reliée à une borne ROUGE de la carte.

  • La broche « GND » du bouton poussoir reliée à une borne NOIRE de la carte.

Faire vérifier votre câblage au professeur avant de mettre les piles et de relier la carte au PC. [pdf]

Ouvrir le programme « Arduino »

Aller dans le menu « Outils - Type de carte » et choisir « Arduino/Genuino Mega or Mega2560 ».

Raccorder votre carte à votre ordinateur avec le câble USB fourni.

 

Aller dans le menu « Outils - Port » et choisir le port USB où votre carte est reliée.

Saisir le programme suivant.

1
#include "MeMegaPi.h"
2
#include <SoftwareSerial.h>
3
4
MeEncoderOnBoard encoder_1(SLOT1);
5
6
uint8_t rpmMoteur = 50;// A configurer sans dépasser l'indication sur le moteur
7
uint8_t reductionMoteur = 46;// A configurer en regardant votre moteur
8
uint8_t nbrEncoches = 8;// A configurer en regardant votre moteur
9
const int BP_1 = A6;  // BP1 connecté sur la broche A6
10
const int BP_2 = A7;  // BP2 connecté sur la broche A7
11
12
// définition des variables //
13
int BP1;    // BP1 de déclenchement en mode manuel, =0 si appuyé //
14
int BP2;    // BP2 de déclenchement en mode manuel, =0 si appuyé //
15
int prog = 0;    // variable
16
17
18
void gestion_impulsions_encoder1()
19
{
20
    if (digitalRead(encoder_1.getPortB()) == 0) encoder_1.pulsePosMinus();
21
    else encoder_1.pulsePosPlus();
22
}
23
24
void setup()
25
{
26
    pinMode(BP_1,INPUT_PULLUP); // broches en entrée avec une résistance de tirage à +5V
27
    pinMode(BP_2,INPUT_PULLUP); // broches en entrée avec une résistance de tirage à +5V
28
    attachInterrupt(encoder_1.getIntNum(), gestion_impulsions_encoder1, RISING);
29
    //set pwm 1khz
30
    // gestion du port 1 (le plus à droite)
31
    TCCR1A = _BV(WGM10);//PIN12
32
    TCCR1B = _BV(CS11) | _BV(CS10) | _BV(WGM12);
33
34
    encoder_1.setPulse(nbrEncoches);
35
    encoder_1.setRatio(reductionMoteur);
36
    encoder_1.setPosPid(1.8,0,0.5);
37
    encoder_1.setSpeedPid(0.18,0,0);
38
}
39
40
void loop()
41
{
42
  BP1 =digitalRead(BP_1); // lecture des entrées des BP
43
  if(BP1==LOW) {     // BP1 appuyé
44
  prog=1;
45
 }
46
  BP2 =digitalRead(BP_2);
47
   if(BP2==LOW) {     // BP2 appuyé
48
  prog=2;
49
 }
50
    switch(prog){
51
52
            case 1: // Sortir la casquette
53
                encoder_1.moveTo(360, rpmMoteur); // +1 tour moteur / position initiale
54
                break;
55
            case 2: // Rentrer la casquette
56
                encoder_1.moveTo(-360, rpmMoteur); // -1 tour moteur / position initiale
57
                break;
58
        }
59
    encoder_1.loop();
60
61
  
62
}

Téléverser votre programme dans la carte .

 

FAIRE VALIDER le fonctionnement par le professeur (ne pas oublier de mettre les 6 piles AA et de mettre l'interrupteur sur ON)

  

Contrôle des codeurs

Passons au codeur.

Un moteur DC (à courant continu) tourne lorsqu'on lui impose une tension. Les bornes de sortie du codeur envoient des signaux. Par exemple, le codeur pourrait envoyer 100 impulsions lorsque l'axe de rotation fait un tour complet. Les signaux permettent donc de savoir de combien de degrés le moteur à tourner.

On veut tourner de 1/4 de tours (90°) en sachant qu'on possède un codeur qui envoie 100 impulsions par tour ? C'est simple : il vous suffit de le faire fonctionner jusqu'à avoir obtenu 25 impulsions de sortie (un quart de 100). Simple et efficace.

Observer le signal rouge parvenant à traverser le disque dans le système de codage ci-dessous :

Si vous comptez, vous pourrez voir qu'il y a 16 trous qui permettent le passage du signal rouge. Du coup, 16 détections d'apparition du lumière rouge veut dire qu'on a fait un tour complet, 360°.

 

Connaissant le pas de la crémaillère et le nombre d'impulsions par tour, PROPOSER une méthode pour calculer le nombre d’impulsions envoyées par le codeur pour un déplacement de 60 mm.

 

MODIFIER le programme précédent pour que la casquette se déplace de 60 mm.

 

FAIRE VALIDER le fonctionnement par le professeur.