Nota
Ciao e benvenuto nella Community di Appassionati di SunFounder per Raspberry Pi, Arduino ed ESP32 su Facebook! Esplora a fondo il mondo di Raspberry Pi, Arduino ed ESP32 insieme a tanti altri appassionati.
Perché Unirsi?
Supporto da Esperti: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del nostro team.
Impara e Condividi: Scambia consigli e tutorial per migliorare le tue competenze.
Anteprime Esclusive: Ottieni accesso anticipato agli annunci dei nuovi prodotti e a contenuti inediti.
Sconti Speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
Promozioni Festive e Giveaway: Partecipa a concorsi e promozioni festive.
👉 Pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi stesso!
1.3.3 Motore Passo-Passo
Introduzione
I motori passo-passo, grazie al loro design unico, possono essere controllati con un’elevata precisione senza necessità di meccanismi di feedback. L’albero di un motore passo-passo, montato con una serie di magneti, è controllato da una serie di bobine elettromagnetiche caricate positivamente e negativamente in una sequenza specifica, consentendogli di avanzare o retrocedere in piccoli "passi".
Componenti Necessari
In questo progetto, abbiamo bisogno dei seguenti componenti.
Schema Elettrico
Procedure Sperimentali
Passo 1: Costruisci il circuito.
Passo 2: Apri il file del codice.
cd ~/davinci-kit-for-raspberry-pi/python-pi5
Passo 3: Esegui.
sudo python3 1.3.3_StepperMotor.py
Quando il codice è in esecuzione, il motore passo-passo ruoterà in senso orario o antiorario a seconda dell’input “a” o “c” inserito.
Avvertimento
Se compare l’errore RuntimeError: Cannot determine SOC peripheral base address, consulta Se gpiozero non funziona.
Codice
Nota
Puoi Modificare/Reimpostare/Copiare/Eseguire/Interrompere il codice qui sotto. Prima di farlo, però, vai al percorso del codice sorgente, come davinci-kit-for-raspberry-pi/python-pi5. Dopo aver modificato il codice, potrai eseguirlo direttamente per vedere il risultato.
#!/usr/bin/env python3
from gpiozero import OutputDevice
from time import sleep
# Inizializza i pin del motore sui pin GPIO 18, 23, 24, 25
motorPin = [OutputDevice(pin) for pin in (18, 23, 24, 25)]
# Imposta i parametri di velocità di rotazione del motore
rotationPerMinute = 15
stepsPerRevolution = 2048
# Calcola il tempo di attesa tra ogni passo per un funzionamento fluido del motore
stepSpeed = (60 / rotationPerMinute) / stepsPerRevolution
def rotary(direction):
"""
Controls the rotation of the motor based on the specified direction.
:param direction: 'c' for clockwise, 'a' for anti-clockwise
"""
if direction == 'c':
# Esegue la sequenza di passi per la rotazione in senso orario
for j in range(4):
for i in range(4):
if 0x99 << j & (0x08 >> i):
motorPin[i].on()
else:
motorPin[i].off()
sleep(stepSpeed)
elif direction == 'a':
# Esegue la sequenza di passi per la rotazione in senso antiorario
for j in range(4):
for i in range(4):
if 0x99 >> j & (0x08 >> i):
motorPin[i].on()
else:
motorPin[i].off()
sleep(stepSpeed)
def loop():
"""
Continuously prompts the user to select the motor rotation direction
and controls the motor based on this input.
"""
while True:
direction = input('Select motor direction a=anticlockwise, c=clockwise: ')
if direction == 'c':
print('Motor running clockwise\n')
break
elif direction == 'a':
print('Motor running anti-clockwise\n')
break
else:
print('Input error, please try again!')
# Mantiene il motore in rotazione nella direzione selezionata
while True:
rotary(direction)
def destroy():
"""
Safely turns off all motor pins, used for clean shutdown.
"""
for pin in motorPin:
pin.off()
# Esecuzione principale del programma
try:
loop()
except KeyboardInterrupt:
destroy() # Gestisce l'interruzione da tastiera per arrestare il motore in modo sicuro
Spiegazione del Codice
Questa sezione importa le librerie necessarie.
gpiozeroper il controllo dei pin GPIO etimeper la funzione sleep utilizzata nel controllo temporale.#!/usr/bin/env python3 from gpiozero import OutputDevice from time import sleep
Inizializza i pin GPIO 18, 23, 24 e 25 come dispositivi di output per controllare il motore passo-passo.
# Inizializza i pin del motore sui pin GPIO 18, 23, 24, 25 motorPin = [OutputDevice(pin) for pin in (18, 23, 24, 25)]
Imposta la velocità di rotazione del motore e calcola l’intervallo di tempo tra ogni passo per un funzionamento fluido.
# Imposta i parametri di velocità di rotazione del motore rotationPerMinute = 15 stepsPerRevolution = 2048 # Calcola il tempo di attesa tra ogni passo per un funzionamento fluido del motore stepSpeed = (60 / rotationPerMinute) / stepsPerRevolution
La funzione
rotarycontrolla la rotazione del motore. Utilizza operazioni sui bit e una sequenza di passi per attivare i pin del motore nell’ordine corretto per la rotazione in senso orario o antiorario.def rotary(direction): """ Controls the rotation of the motor based on the specified direction. :param direction: 'c' for clockwise, 'a' for anti-clockwise """ if direction == 'c': # Esegue la sequenza di passi per la rotazione in senso orario for j in range(4): for i in range(4): if 0x99 << j & (0x08 >> i): motorPin[i].on() else: motorPin[i].off() sleep(stepSpeed) elif direction == 'a': # Esegue la sequenza di passi per la rotazione in senso antiorario for j in range(4): for i in range(4): if 0x99 >> j & (0x08 >> i): motorPin[i].on() else: motorPin[i].off() sleep(stepSpeed)
Questa funzione chiede continuamente all’utente di scegliere la direzione di rotazione del motore e controlla il motore in base all’input ricevuto.
def loop(): """ Continuously prompts the user to select the motor rotation direction and controls the motor based on this input. """ while True: direction = input('Select motor direction a=anticlockwise, c=clockwise: ') if direction == 'c': print('Motor running clockwise\n') break elif direction == 'a': print('Motor running anti-clockwise\n') break else: print('Input error, please try again!') # Mantiene il motore in rotazione nella direzione selezionata while True: rotary(direction)
La funzione
destroyspegne tutti i pin del motore. È utilizzata per un arresto sicuro, garantendo che il motore si fermi quando il programma termina.def destroy(): """ Safely turns off all motor pins, used for clean shutdown. """ for pin in motorPin: pin.off()
Il programma principale chiama
loope gestisce le interruzioni da tastiera (come Ctrl+C) per fermare il motore in modo sicuro utilizzandodestroy.# Esecuzione principale del programma try: loop() except KeyboardInterrupt: destroy() # Gestisce l'interruzione da tastiera per arrestare il motore in modo sicuro