.. note:: 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 [|link_sf_facebook|] e unisciti oggi stesso! .. _1.3.3_py_pi5: 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. .. image:: ../python_pi5/img/1.3.3_stepper_motor_list.png .. raw:: html
Schema Elettrico ------------------- .. image:: /python_pi5/img/1.3.3_stepper_motor_schematic.png Procedure Sperimentali ------------------------- **Passo 1:** Costruisci il circuito. .. image:: ../python_pi5/img/1.3.3_stepper_motor_circuit.png **Passo 2:** Apri il file del codice. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python-pi5 **Passo 3:** Esegui. .. raw:: html .. code-block:: 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. .. warning:: Se compare l'errore ``RuntimeError: Cannot determine SOC peripheral base address``, consulta :ref:`faq_soc` **Codice** .. note:: 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. .. raw:: html .. code-block:: python #!/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. ``gpiozero`` per il controllo dei pin GPIO e ``time`` per la funzione sleep utilizzata nel controllo temporale. .. code-block:: python #!/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. .. code-block:: python # 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. .. code-block:: python # 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 ``rotary`` controlla 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. .. code-block:: python 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. .. code-block:: python 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 ``destroy`` spegne tutti i pin del motore. È utilizzata per un arresto sicuro, garantendo che il motore si fermi quando il programma termina. .. code-block:: python def destroy(): """ Safely turns off all motor pins, used for clean shutdown. """ for pin in motorPin: pin.off() #. Il programma principale chiama ``loop`` e gestisce le interruzioni da tastiera (come Ctrl+C) per fermare il motore in modo sicuro utilizzando ``destroy``. .. code-block:: python # Esecuzione principale del programma try: loop() except KeyboardInterrupt: destroy() # Gestisce l'interruzione da tastiera per arrestare il motore in modo sicuro