Raspberry – 11 – Contrôler un moteur pas à pas

Créé le : 24 août 2014
Catégorie: Raspberry
Mise à jour : 24 mai 2016

Raspberry – 11 – Contrôler un moteur pas à pas

Ici on va apprendre à faire tourne un moteur de type pas à pas piloté avec les PIN du Raspberry. J’avais déjà fait quelques tests en d’autres langage que le C (python et même bash) mais la vitesse d’exécution était très lente, il fallait plusieurs dizaines de secondes pour faire un tour complet ce qui me paraissais très (trop) long. Selon les besoins que vous avez vous pouvez très bien programmer votre Raspberry avec un autre langage, le principe est le même.

Principe d’un moteur pas à pas

Schéma d’un moteur pas à pas

cyberscooty_moteur_pas_a_pas

Le principe est de faire varier alternativement la tension des bobines en 8 étapes

  1. A B C D
  2. A B C D
  3. A B C D
  4. A B C D
  5. A B C D
  6. A B C D
  7. A B C D
  8. A B C D

 

Ajout de la bibliothèque wiringpi (pour piloter les PIN en C)

  • Aller sur https://git.drogon.net/?p=wiringPi;a=summary
  • cliquer sur « snapshot » (le premier de la liste pour avoir la dernière version) et enregistrer le fichier
  • décompresser le fichier
  • Avec la console il faut autoriser l’exécution puis lancer la compilation
cd wiringPi-xxxxxxxx

AJOUT:

chmod +x build
./build

Création du script

Créer un fichier vide nommé script.c

nano script.c

Code du script

Je me suis grandement inspiré de ce script que j’ai modifié pour augmenter la vitesse d’exécution, pour que le script s’arrête après un tour complet et pour afficher un petit compteur


#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int vitesse = 1; //constante
// données sous forme de Triplets (led, etat, duree)
// led, Etat (1=On / 0=Off) , duree
uint8_t data [] =
{ //A=7, B=0, C=1, D=2 - mettre ici vos propres n° de PIN logique, visible avec la commande gpio readall
0, 1, 1, // on allume B --> A B c d
7, 0, 1, // on éteint A --> a B c d
1, 1, 1, // on allume C --> a B C d
0, 0, 1, // on éteint B --> a b C d
2, 1, 1, // on allume D --> a b C D
1, 0, 1, // on éteint C --> a b c D
7, 1, 1, // on allume A --> A b c D
2, 0, 1, // on éteint D --> A b c d
9, 9, 9, // marque de fin de la séquence
} ;
void testLed (int n) {
int led, t;
for (t = 0 ; t < n ; ++t) { // on fait clignoter n fois
for (led = 0 ; led < 8 ; ++led) { // on allume les led
pinMode (led, OUTPUT) ;
digitalWrite (led, 1) ;
}
delay (100) ;
for (led = 0 ; led < 8 ; ++led) { // on éteint les led
pinMode (led, OUTPUT) ;
digitalWrite (led, 0) ;
}
delay (100) ;
for (led = 0 ; led < 8 ; ++led) { // on éteint les led
pinMode (led, OUTPUT) ;
digitalWrite (led, 0) ;
}
delay (100) ;
}
}
void init () {
int led;
testLed (3); //on vérifie que toutes les led s'allument
pinMode (0, OUTPUT) ;// on allume A
digitalWrite (0, 1) ;
for (led = 1 ; led < 8 ; ++led) { // on éteint les autres
pinMode (led, OUTPUT) ;
digitalWrite (led, 0) ;
}
delay (vitesse) ;
//résultat : on a --> A b c d
}
int main (void)
{
int dataPtr ;
int led, etat, duree ;
int compteur ;
printf ("Raspberry Pi : moteur pas à pas, faire 1 tour \n") ;
if (wiringPiSetup () == -1) exit (1) ;
init();
compteur=0 ;
dataPtr = 0 ;
for (;;)
{
led = data [dataPtr++] ; // LED
etat = data [dataPtr++] ; // State
duree = data [dataPtr++] ; // Duration (10ths)
if ((led + etat + duree) == 27) // = End marker (9 + 9 + 9)
{
dataPtr = 0 ;
continue ;
}
digitalWrite (led, etat) ;
delay (duree * vitesse) ;
printf ("compteur= %d \r",compteur);
compteur=compteur++;
if (compteur >=4100) //1 tour=4100 boucles
{
printf ("compteur= %d \n",compteur);
break;
}
}
return 0 ;
}

Faire CTRL+x puis o (oui) pour enregistrer les modifications

Compiler le script pour créer un exécutable

gcc -o script script.c

Cette commande fonctionne mais pour compiler avec des commandes propres à wiringpi il y a des messages d’erreurs et la compilation échoue

/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../arm-linux-gnueabihf/crt1.o: In function `_start':
 (.text+0x34): undefined reference to `main'
 /tmp/ccpI3gq7.o: In function `testLed':
 script.c:(.text+0x30): undefined reference to `pinMode'
 script.c:(.text+0x3c): undefined reference to `digitalWrite'
 script.c:(.text+0x5c): undefined reference to `delay'
 script.c:(.text+0x74): undefined reference to `pinMode'
 script.c:(.text+0x80): undefined reference to `digitalWrite'
 script.c:(.text+0xa0): undefined reference to `delay'
 /tmp/ccpI3gq7.o: In function `init':
 script.c:(.text+0xe4): undefined reference to `pinMode'
 script.c:(.text+0xf0): undefined reference to `digitalWrite'
 script.c:(.text+0x108): undefined reference to `pinMode'
 script.c:(.text+0x114): undefined reference to `digitalWrite'
 script.c:(.text+0x13c): undefined reference to `delay'
 collect2: ld returned 1 exit status

SOLUTION, taper cette commande pour ajouter la bibliothèque à la compilation:

gcc -o script script.c -L/usr/local/lib -lwiringPi

 

Commandes à retenir

éditer = nano script.c

compiler = gcc -o script script.c -L/usr/local/lib -lwiringPi

lancer = sudo ./script

 

sources:
http://cplus.about.com/od/raspberrypi/a/programming-c-On-The-Raspberry-Pi.htm = compiler en C sur Raspberry
http://www.pobot.org/Moteur-pas-a-pas-pilote-par.html#programmation_du_pilote_en_c = modèle du script en C
https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/ = library pour piloter les PIN
http://forum.lemaker.org/viewthread.php?tid=353 = compiler en C sur Raspberry avec wiringPi
https://fr.wikipedia.org/wiki/Printf#C = language C , afficher valeur d’une variable

Laissez un commentaire