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
Le principe est de faire varier alternativement la tension des bobines en 8 étapes
- A B C D
- A B C D
- A B C D
- A B C D
- A B C D
- A B C D
- A B C D
- 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