Raspberry Pi - Interrupteur de fin de course pour moteur pas à pas

Ce didacticiel vous explique comment utiliser un Raspberry Pi pour contrôler un moteur pas à pas via un interrupteur de fin de course et un pilote L298N. Plus précisément, nous aborderons :

Préparation du matériel

1×Raspberry Pi 4 Model B
1×Limit Switch (KW12-3)
1×Limit Switch (V-156-1C25)
1×Stepper Motor Nema 17
1×L298N Motor Driver Module
1×12V Power Adapter
1×DC Power Jack
1×Jumper Wires
1×(Optional) Screw Terminal Block Shield for Raspberry Pi
1×(Optional) USB-C Power Cable with On/Off Switch for Raspberry Pi 4B
1×(Optional) Plastic Case and Cooling Fan for Raspberry Pi 4B
1×(Optional) HDMI Touch Screen Monitor for Raspberry Pi

Or you can buy the following sensor kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

À propos du moteur pas à pas et de l'interrupteur de fin de course

Si vous n'êtes pas familier avec le moteur pas à pas et l'interrupteur de fin de course (y compris le brochage, la fonctionnalité, la programmation, etc.), les tutoriels suivants peuvent vous aider :

Diagramme de câblage

Ce tutoriel fournit le schéma de câblage pour deux cas : Un moteur pas à pas + un interrupteur de fin de course, Un moteur pas à pas + deux interrupteurs de fin de course.

  • Schéma de câblage entre Raspberry Pi, moteur pas à pas et un interrupteur de fin de course
Schéma de câblage du moteur pas à pas et interrupteur de fin de course pour Raspberry Pi

This image is created using Fritzing. Click to enlarge image

  • Schéma de câblage entre Raspberry Pi, moteur pas à pas et deux interrupteurs de fin de course
Schéma de câblage du moteur pas à pas Raspberry Pi et de deux interrupteurs de fin de course

This image is created using Fritzing. Click to enlarge image

Pour simplifier et organiser votre câblage, nous vous recommandons d'utiliser un Screw Terminal Block Shield pour Raspberry Pi. Ce shield garantit des connexions plus sûres et plus faciles à gérer, comme illustré ci-dessous :

Raspberry Pi Screw Terminal Block Shield

※ Note:

La connexion de câblage entre le moteur pas à pas et le L298N peut varier en fonction du type de moteur pas à pas. Examinez attentivement le tutoriel Raspberry Pi - Moteur pas à pas. pour apprendre à lier correctement le moteur pas à pas au pilote de moteur L298N.

Code Raspberry Pi - Arrêter le moteur pas à pas par un interrupteur de fin de course

Un moteur pas à pas est programmé pour tourner en continu avec le code suivant, et s'arrêtera instantanément lorsqu'un interrupteur de fin de course est touché, puis reprendra le mouvement si l'interrupteur est relâché.

Étapes rapides

  • Assurez-vous d'avoir Raspbian ou tout autre système d'exploitation compatible avec le Raspberry Pi installé sur votre Pi.
  • Assurez-vous que votre Raspberry Pi est connecté au même réseau local que votre PC.
  • Assurez-vous que votre Raspberry Pi est connecté à internet si vous avez besoin d'installer des bibliothèques.
  • Si c'est la première fois que vous utilisez le Raspberry Pi, consultez Installation du logiciel - Raspberry Pi..
  • Connectez votre PC au Raspberry Pi via SSH en utilisant le client SSH intégré sur Linux et macOS ou PuTTY sur Windows. Consultez comment connecter votre PC au Raspberry Pi via SSH.
  • Assurez-vous d'avoir la bibliothèque RPi.GPIO installée. Sinon, installez-la en utilisant la commande suivante :
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Créez un fichier de script Python stepper_limit_switch.py et ajoutez le code suivant :
# Ce code Raspberry Pi a été développé par newbiely.fr # Ce code Raspberry Pi est mis à disposition du public sans aucune restriction. # Pour des instructions complètes et des schémas de câblage, veuillez visiter: # https://newbiely.fr/tutorials/raspberry-pi/raspberry-pi-stepper-motor-limit-switch import RPi.GPIO as GPIO import time # Define GPIO pins for L298N driver and limit switch IN1 = 12 IN2 = 16 IN3 = 20 IN4 = 21 LIMIT_SWITCH_PIN = 27 # Set GPIO mode and configure pins GPIO.setmode(GPIO.BCM) GPIO.setup(IN1, GPIO.OUT) GPIO.setup(IN2, GPIO.OUT) GPIO.setup(IN3, GPIO.OUT) GPIO.setup(IN4, GPIO.OUT) GPIO.setup(LIMIT_SWITCH_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Define constants DEG_PER_STEP = 1.8 STEPS_PER_REVOLUTION = int(360 / DEG_PER_STEP) # Function to move the stepper motor one step forward def step_forward(delay): GPIO.output(IN1, GPIO.HIGH) GPIO.output(IN2, GPIO.HIGH) GPIO.output(IN3, GPIO.LOW) GPIO.output(IN4, GPIO.LOW) time.sleep(delay) GPIO.output(IN1, GPIO.LOW) GPIO.output(IN2, GPIO.HIGH) GPIO.output(IN3, GPIO.HIGH) GPIO.output(IN4, GPIO.LOW) time.sleep(delay) # Function to check the limit switch status def is_limit_switch_pressed(): return GPIO.input(LIMIT_SWITCH_PIN) == GPIO.LOW try: # Set the delay between steps delay = 0.001 while not is_limit_switch_pressed(): # Move the stepper motor forward endlessly step_forward(delay) except KeyboardInterrupt: print("\nExiting the script.") finally: # Clean up GPIO settings GPIO.cleanup()
  • Enregistrez le fichier et exécutez le script Python en tapant la commande suivante dans le terminal :
python3 stepper_limit_switch.py
  • Si le câblage est correct, le moteur devrait tourner dans le sens horaire.
  • Lorsque le commutateur de fin de course est activé, le moteur doit s'arrêter immédiatement.
  • Ensuite, si le commutateur de fin de course est relâché, le moteur tourne à nouveau.

Le script s'exécute en boucle infinie jusqu'à ce que vous appuyiez sur Ctrl + C dans le terminal.

En modifiant la valeur de la variable delay dans le code, vous pouvez changer la vitesse du moteur pas à pas.

Explication du Code

Consultez l'explication ligne par ligne contenue dans les commentaires du code source !

Code Raspberry Pi - Changer la direction du moteur pas à pas par un interrupteur de fin de course

Un moteur pas à pas sera mis en mouvement de manière continue et sa direction sera modifiée lorsqu'un interrupteur de fin de course sera activé.

Étapes rapides

  • Créez un fichier de script Python stepper_direction.py et ajoutez le code suivant :
# Ce code Raspberry Pi a été développé par newbiely.fr # Ce code Raspberry Pi est mis à disposition du public sans aucune restriction. # Pour des instructions complètes et des schémas de câblage, veuillez visiter: # https://newbiely.fr/tutorials/raspberry-pi/raspberry-pi-stepper-motor-limit-switch import RPi.GPIO as GPIO import time # Define GPIO pins for L298N driver and limit switch IN1 = 12 IN2 = 16 IN3 = 20 IN4 = 21 LIMIT_SWITCH_PIN = 27 # Set GPIO mode and configure pins GPIO.setmode(GPIO.BCM) GPIO.setup(IN1, GPIO.OUT) GPIO.setup(IN2, GPIO.OUT) GPIO.setup(IN3, GPIO.OUT) GPIO.setup(IN4, GPIO.OUT) GPIO.setup(LIMIT_SWITCH_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Define constants DEG_PER_STEP = 1.8 STEPS_PER_REVOLUTION = int(360 / DEG_PER_STEP) # Global variable to store the previous state of the limit switch prev_limit_switch_state = GPIO.HIGH # Function to move the stepper motor one step forward def step_forward(delay): GPIO.output(IN1, GPIO.HIGH) GPIO.output(IN2, GPIO.HIGH) GPIO.output(IN3, GPIO.LOW) GPIO.output(IN4, GPIO.LOW) time.sleep(delay) GPIO.output(IN1, GPIO.LOW) GPIO.output(IN2, GPIO.HIGH) GPIO.output(IN3, GPIO.HIGH) GPIO.output(IN4, GPIO.LOW) time.sleep(delay) # Function to move the stepper motor one step backward def step_backward(delay): GPIO.output(IN1, GPIO.LOW) GPIO.output(IN2, GPIO.LOW) GPIO.output(IN3, GPIO.HIGH) GPIO.output(IN4, GPIO.HIGH) time.sleep(delay) GPIO.output(IN1, GPIO.HIGH) GPIO.output(IN2, GPIO.LOW) GPIO.output(IN3, GPIO.LOW) GPIO.output(IN4, GPIO.HIGH) time.sleep(delay) try: # Set the delay between steps delay = 0.001 # Set the initial direction direction = 'forward' while True: # Check if the limit switch state changes limit_switch_state = GPIO.input(LIMIT_SWITCH_PIN) # Change direction if the limit switch changes from HIGH to LOW if limit_switch_state == GPIO.LOW and prev_limit_switch_state == GPIO.HIGH: direction = 'backward' if direction == 'forward' else 'forward' # Move the stepper motor based on the direction if direction == 'forward': step_forward(delay) elif direction == 'backward': step_backward(delay) # Update the previous state of the limit switch prev_limit_switch_state = limit_switch_state except KeyboardInterrupt: print("\nExiting the script.") finally: # Clean up GPIO settings GPIO.cleanup()
  • Enregistrez le fichier et exécutez le script Python en entrant la commande suivante dans le terminal :
python3 stepper_direction.py
  • Si le câblage est correct, le moteur devrait tourner dans le sens des aiguilles d'une montre.
  • Lorsque vous appuyez sur l'interrupteur de fin de course, la direction du moteur pas à pas changera pour le sens inverse des aiguilles d'une montre.
  • Appuyez de nouveau sur l'interrupteur de fin de course et la direction du moteur pas à pas reviendra au sens des aiguilles d'une montre.

Code pour Raspberry Pi - Changer la direction d'un moteur pas à pas avec deux interrupteurs de fin de course

Voyons le code qui fait tourner un moteur pas à pas en continu, et lorsque l'un des deux interrupteurs de fin de course est activé, inverse la direction du moteur.

Étapes rapides

  • Créez un fichier de script Python stepper_two_limit_switches.py et ajoutez le code suivant :
# Ce code Raspberry Pi a été développé par newbiely.fr # Ce code Raspberry Pi est mis à disposition du public sans aucune restriction. # Pour des instructions complètes et des schémas de câblage, veuillez visiter: # https://newbiely.fr/tutorials/raspberry-pi/raspberry-pi-stepper-motor-limit-switch import RPi.GPIO as GPIO import time # Define GPIO pins for L298N driver and limit switches IN1 = 12 IN2 = 16 IN3 = 20 IN4 = 21 LIMIT_SWITCH1_PIN = 27 LIMIT_SWITCH2_PIN = 19 # Set GPIO mode and configure pins GPIO.setmode(GPIO.BCM) GPIO.setup(IN1, GPIO.OUT) GPIO.setup(IN2, GPIO.OUT) GPIO.setup(IN3, GPIO.OUT) GPIO.setup(IN4, GPIO.OUT) GPIO.setup(LIMIT_SWITCH1_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(LIMIT_SWITCH2_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Define constants DEG_PER_STEP = 1.8 STEPS_PER_REVOLUTION = int(360 / DEG_PER_STEP) # Global variables to store the previous state of the limit switches prev_limit_switch_1 = GPIO.HIGH prev_limit_switch_2 = GPIO.HIGH # Function to move the stepper motor one step forward def step_forward(delay): GPIO.output(IN1, GPIO.HIGH) GPIO.output(IN2, GPIO.HIGH) GPIO.output(IN3, GPIO.LOW) GPIO.output(IN4, GPIO.LOW) time.sleep(delay) GPIO.output(IN1, GPIO.LOW) GPIO.output(IN2, GPIO.HIGH) GPIO.output(IN3, GPIO.HIGH) GPIO.output(IN4, GPIO.LOW) time.sleep(delay) # Function to move the stepper motor one step backward def step_backward(delay): GPIO.output(IN1, GPIO.LOW) GPIO.output(IN2, GPIO.LOW) GPIO.output(IN3, GPIO.HIGH) GPIO.output(IN4, GPIO.HIGH) time.sleep(delay) GPIO.output(IN1, GPIO.HIGH) GPIO.output(IN2, GPIO.LOW) GPIO.output(IN3, GPIO.LOW) GPIO.output(IN4, GPIO.HIGH) time.sleep(delay) try: # Set the delay between steps delay = 0.001 # Set the initial direction direction = 'forward' while True: # Check if limit switch 1 state changes limit_switch_1 = GPIO.input(LIMIT_SWITCH1_PIN) if limit_switch_1 == GPIO.LOW and prev_limit_switch_1 == GPIO.HIGH: direction = 'backward' # Check if limit switch 2 state changes limit_switch_2 = GPIO.input(LIMIT_SWITCH2_PIN) if limit_switch_2 == GPIO.LOW and prev_limit_switch_2 == GPIO.HIGH: direction = 'forward' # Move the stepper motor based on the direction if direction == 'forward': step_forward(delay) elif direction == 'backward': step_backward(delay) # Update the previous states of the limit switches prev_limit_switch_1 = limit_switch_1 prev_limit_switch_2 = limit_switch_2 except KeyboardInterrupt: print("\nExiting the script.") finally: # Clean up GPIO settings GPIO.cleanup()
  • Enregistrez le fichier et exécutez le script Python en exécutant la commande suivante dans le terminal :
python3 stepper_two_limit_switches.py

Le script s'exécute en boucle infinie continuellement jusqu'à ce que vous appuyiez sur Ctrl + C dans le terminal.

  • Si le câblage est correct, le moteur devrait tourner dans le sens des aiguilles d'une montre.
  • Lorsque vous touchez l'interrupteur de fin de course 1, la direction du moteur pas à pas sera inversée en sens antihoraire.
  • Toucher l'interrupteur de fin de course 2 fera tourner le moteur pas à pas à nouveau dans le sens des aiguilles d'une montre.

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!