- Torzio a écrit:
- Bonjour Cadrature,
Mon système de diviseur est extrêmement simple. Il faut exactement 28800 pas moteur (de mémoire) que l'on va nommer NPM, pour faire un tour exact de broche.
Donc, pour tailler une roue de 33 dents on va diviser 28800 par 33, ce qui fait 872,7272727272727. Problème, on a besoin de nombres entiers. Un petit programme va intercaler de temps en temps 1 pas supplémentaire pour arriver à une suite de nombres entiers pour arriver à exactement un tour complet. L'erreur sera minime et largement acceptable mécaniquement. Pour s'en assurer il suffit de diviser le périmètre de la roue par le NPM pour 1 tour exact.
Cette suite de nombres correspondant au nombre de pas pour la division de chaque dent. Dans le cas présent, 872 ou quelque fois 873 pas vont faire tourner la roue à tailler d'1/33 de tour. Ces suites de nombres sont contenu dans des fichiers textes. 33 dents, va avoir pour nom de fichier 33.TXT.
Au lancement, le Raspberry va demander le nombre de dents, On va renseigner 33, il va alors ouvrir le fichier 33.TXT et mémoriser les valeurs qu'il contient. Ensuite, avec notre accord (je passe quelques autres infos) il va commencer à tailler les dents en schématisant.
Là ou je bute, c'est pour l'écriture du code pour transposer mon principe écrit en Basic sur PC sur Raspberry avec Python.
@+
JC.
Bonjour
Voici un petit problème de maths amusante.
C'est mieux à mon avis de faire le calcul des pas dans le programme principal en Python
et demander de divider 33 dents. Un seul programme très simple peut tout faire assez simplement.
C'est idiot, ce matin j'ai fait tout un petit montage avec un Raspberry Pi pour montrer
comment lire un fichier sur un clé USB, envoyer les ordres de ce fichier au moteur pas-à-pas.
J'ai donc configuré la Raspberry Pi et écrit un petit programme Python.
Je reviendrai sur ton problème précis mais voici ce que ça donne pour ceux que ça intéresse:
Désolé, c'est un peu long et finalement ça ne répond pas vraiment à ton besoin précis (que je n'avais
pas vraiment bien saisi)...
#######
# Petit Tuto
#######
Montage:
#######
- Vieux RaspberryPi (un collector !) branché à un écran et un clavier de récup'
- A4988 (contrôleur de pas à pas)
- Moteur pas-à-pas
- Capacité 100uF 40V
- Alimentation 12V
- Quelques LED et des résistances 1kohm sur on veut s'assurer de l'alimention
On branche de 2 à 6 PINs depuis le Raspberry vers le A4988 (moi je n'ai branché que deux)
- Step (sert à faire un pas)
- Dir (indique la direction)
Et éventuellement (je le l'ai pas fait ce matin)
- Enable (indique de relâcher le couple, pour bouger le moteur à la main)
- MS1, MS2, MS3 (ces trois trucs servent à contrôler le micro-stepping. On ne branche rien pour un pas normal de 18° (400 pas pour un tour sur un Nema 17 standard), mais si on branche, on peut diviser l'angle de quelques valeurs)
Sur le A4988:On fait un pont entre Sleep et Reset
On alimente 5Vcc sur Vdd
On alimente 12Vcc sur VMOT en y mettant une capacité de découplage entre VMOT et GND au plus près du contrôleur
On met la masse à GND (deux fois)
On branche les 4 fils au moteur pas-à-pas
Sur le Raspberry Pi:
On branche 5v sur 5v de A4988
Ground à GND de A4988
14 à Step de A4988
15 à Dir de A4988
Ça donne ceci:
Programmation
###########
Nous voici à devoir maintenant programmer.
Je passe à Python (c'est pas ma tasse de thé, mais JC préfère)
Voici un exemple qui "analyse" un fichier input.dat et fait ce qu'il y a dedans sur ce moteur.
C'est un exemple.
On écrit ce programme tranquillement sur son PC avec un bon IDE (par exemple Visual Studio Code)
On enregistre sur une clé USB
programme.py
- Code:
-
'''
Petit script Python pour faire tourner un moteur pas-à-pas branché
sur les pins GPIO (General Purpose Input/Output) d'un Raspberry Pi
Le programme lit un fichier "input.dat" et exécute les ordres qui s'y trouvent
Cadrature 2023/01/22
'''
# Importer cette bibliothèque qui permet de configurer les ports GPIO de la Raspberry Pi
import gpiod
# Importer cette bibliothèque qui permet de faire des pauses
import time
'''
Je définis deux fonctions qui arrêtent le processus
usleep(x) arrête x micro-secondes
msleep(x) arrête x milisecondes
'''
usleep = lambda x : time.sleep(x/1000000.0)
msleep = lambda x : time.sleep(x/1000.0)
# définition du temps en micro-secondes entre deux états du moteur pas-à-pas (dépend des moteurs, 2us convient pour moi)
pulseWidthMicros = 2.0
# définition du temps en milli-secondes entre deux pas du moteur pas-à-pas (dépend des moteurs, 1ms convient pour moi)
millisBtwnSteps = 1.0
# chip du port GPIO (généralement "gpiochip0" sur Raspberry Pi)
chip = gpiod.chip("gpiochip0")
# On branche sur le PIN 14 step et sur le PIN 15 dir. On peut faire autrement et surtout brancher d'autres choses
step_line = chip.get_line(14)
dir_line = chip.get_line(15)
# configuration de la communication
config = gpiod.line_request()
config.consumer = "pap"
config.request_type = gpiod.line_request.DIRECTION_OUTPUT
step_line.request(config)
dir_line.request(config)
# Petite routine qui fait tourner le moteur:
# direction (0 ou 1)
# steps (nombre de pas)
# speed (coefficient de vitesse)
def motor(direction, steps, speed):
dir_line.set_value(direction)
for i in range(steps):
step_line.set_value(1)
usleep(pulseWidthMicros)
step_line.set_value(0)
msleep(millisBtwnSteps * speed)
# On ouvre le fichier "input.dat" pour le mettre dans une liste de lignes
with open("input.dat", "r") as file:
lines = file.readlines()
# Pour chacune de ces lignes, on décompose les éléments séparés par des espaces
# une ligne se présente sous forme "code value1 value2 value3... valuek"
# selon le code, on fait une action avec value1 value2 value3... valuek comme paramètres
for line in lines:
values = line.split()
code = values[0]
# le code "clockwise" demande un nombre de pas et une vitesse. Le moteur tourne en sens horaire
if code == "clockwise":
motor(1, int(values[1]), int(values[2]))
# le code "counterclockwise" demande un nombre de pas et une vitesse. Le moteur tourne en sens anti-horaire
elif code == "counterclockwise":
motor(0, int(values[1]), int(values[2]))
# le code "sleep" demande une durée en milisecondes et attend
elif code == "sleep":
msleep(int(values[1]))
# etc... (on peut ajouter des codes comme on veut)
# On relâche les deux lignes
step_line.release()
dir_line.release()
Configuration du RaspberryPi
##############
Moi je n'avais qu'un système Linux lite faute de place sur ma carte SD
Installation bibliothèque giopd (ce qui va permettre de faire l'import)
sudo apt install gpiod libgpiod-dev
D'autres bibliothèques sont disponibles, celle-ci est puissante et complète.
Pour le montage de la clé USB et la lecture du fichier qui s'y trouve (je branche une clé USB Windows dessus)
Attention c'est éventuellement différent chez vous, il faut comprendre ce qu'on fait
sudo mkdir /mnt/USB
sudo mount /dev/sda1 /mnt/USB
pour démonter (avant de débrancher la clé):
sudo umount /mnt/USB
Faire tourner le code
##############
taper
cd /mnt/USB
python programme.py
exemple de fichier input.dat qui fait faire un tour lentement, attend 1 seconde et refait le tour dans l'autre sens rapidement:
- Citation :
- counterclockwise 400 5
sleep 1000
clockwise 400 1
Voici
Si ça peut aider quelqu'un c'est parfait.
Bon dimanche
Cadrature