.. note::
Ciao e benvenuto nella Community di appassionati di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Esplora più a fondo il mondo di Raspberry Pi, Arduino e ESP32 con altri appassionati.
**Perché unirsi a noi?**
- **Supporto Esperto**: 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 alle nuove comunicazioni sui prodotti e agli spoiler.
- **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri nuovi prodotti.
- **Promozioni Festive e Giveaway**: Partecipa a giveaway e promozioni per le festività.
👉 Pronto per esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso!
.. _1.3.3_motor:
1.3.3 Motore Passo-passo
===========================
Introduzione
---------------
I motori passo-passo, grazie al loro design unico, possono essere controllati
con un alto grado di precisione senza bisogno di meccanismi di feedback.
L’albero di un motore passo-passo, montato con una serie di magneti, è
controllato da una serie di bobine elettromagnetiche che si attivano positivamente
e negativamente in una sequenza specifica, muovendolo con precisione in piccoli
"passi" avanti o indietro.
Componenti
-------------
.. image:: img/list_1.3.3.png
Principio
------------
**Motore Passo-passo**
Esistono due tipi di motori passo-passo, unipolari e bipolari, ed è importante
sapere con quale tipo si sta lavorando. In questo esperimento useremo un motore
passo-passo unipolare.
Il motore passo-passo è un dispositivo a quattro fasi che utilizza una corrente
continua unipolare. Alimentando tutti gli avvolgimenti del motore in una sequenza
temporale appropriata, il motore può ruotare passo dopo passo. Lo schema di un
motore passo-passo reattivo a quattro fasi:
.. image:: img/image129.png
Nella figura, al centro del motore si trova un rotore - un magnete permanente a
forma di ingranaggio. Attorno al rotore ci sono denti numerati da 0 a 5. Più
all’esterno, sono presenti 8 poli magnetici, collegati a coppie tramite avvolgimenti,
formando quattro fasi da A a D. Ogni fase ha due terminali collegati rispettivamente
agli interruttori SA, SB, SC e SD. Così, le quattro fasi sono in parallelo nel circuito,
e i due poli magnetici in una fase sono in serie.
**Funzionamento di un motore passo-passo a 4 fasi:**
Quando l’interruttore SB è acceso e gli interruttori SA, SC e SD sono spenti,
i poli magnetici della fase B si allineano con i denti 0 e 3 del rotore. Nel
frattempo, i denti 1 e 4 creano uno sfasamento con i poli delle fasi C e D.
Accendendo SC e spegnendo SA, SB e SD, il rotore ruota grazie al campo magnetico
della fase C, e i denti 1 e 4 si allineano ai poli magnetici della fase C, con
le altre coppie di denti che mantengono uno sfasamento rispetto alle altre fasi.
Attivando le fasi A, B, C e D in sequenza, il rotore ruoterà nell'ordine A, B, C e D.
.. image:: img/image130.png
Il motore passo-passo a quattro fasi ha tre modalità operative: quattro passi
singoli, quattro passi doppi e otto passi. Gli angoli di passo sono uguali per
i quattro passi singoli e doppi, ma la coppia è inferiore nel caso dei quattro
passi singoli. Gli otto passi dimezzano l'angolo di passo e aumentano la coppia
e la precisione di controllo.
Il motore passo-passo che usiamo ha un rotore con 32 poli magnetici, quindi una
rotazione completa richiede 32 passi. L’albero di uscita è collegato a un
riduttore con un rapporto di 1/64, quindi una rotazione completa richiede
32*64=2048 passi.
**ULN2003**
Per integrare il motore nel circuito, è necessario utilizzare una scheda driver.
Il Driver del Motore Passo-passo ULN2003 è un circuito a 7 canali. Quando il
pin di ingresso è ad alto livello, il pin di uscita è a basso livello, e
viceversa. Se IN1 è impostato su livello alto, mentre IN2, IN3 e IN4 su livello
basso, l'uscita OUT1 sarà a livello basso e le altre uscite saranno a livello alto.
Il driver del motore passo-passo con chip ULN2003 e 4 LED è illustrato di seguito.
Nella scheda, IN1, IN2, IN3 e IN4 fungono da ingressi e i quattro LED, A, B, C e D,
indicano lo stato dei pin di ingresso. Inoltre, OUT1, OUT2, OUT3 e OUT4 sono collegati
a SA, SB, SC e SD sul driver del motore passo-passo. Quando IN1 è a livello alto, il
LED A si accende, SA si attiva e il motore ruota di un passo. Continuando con sequenze
temporali specifiche, il motore ruota passo dopo passo.
.. image:: img/image132.png
Schema del Circuito
-----------------------
.. image:: img/image339.png
Procedure Sperimentali
---------------------------
**Step 1:** Costruire il circuito.
.. image:: img/image134.png
:width: 800
Per gli Utenti di Linguaggio C
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**Passo 2**: Accedi alla cartella del codice.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/1.3.3/
**Passo 3**: Compila il codice.
.. raw:: html
.. code-block::
gcc 1.3.3_StepperMotor.c -lwiringPi
**Passo 4**: Esegui il file eseguibile.
.. raw:: html
.. code-block::
sudo ./a.out
Durante l'esecuzione del codice, il motore passo-passo ruoterà in senso
orario o antiorario in base all'input che inserirai: \'a\' per antiorario
o \'c\' per orario.
.. note::
Se non funziona dopo l'esecuzione o appare un messaggio di errore: \"wiringPi.h: No such file or directory\", consulta :ref:`faq_c_nowork`.
**Codice**
.. code-block:: c
#include
#include
const int motorPin[] = {1, 4, 5, 6};
int rolePerMinute = 15;
int stepsPerRevolution = 2048;
int stepSpeed = 0;
void rotary(char direction){
if(direction == 'c'){
for(int j=0;j<4;j++){
for(int i=0;i<4;i++)
{digitalWrite(motorPin[i],0x99>>j & (0x08>>i));}
delayMicroseconds(stepSpeed);
}
}
else if(direction =='a'){
for(int j=0;j<4;j++){
for(int i=0;i<4;i++)
{digitalWrite(motorPin[i],0x99<>i));}
delayMicroseconds(stepSpeed);
}
}
}
void loop()
{
char direction = '0';
while (1)
{
printf("select motor direction a=anticlockwise, c=clockwise: ");
delay(100);
direction=getchar();
if (direction == 'c')
{
printf("motor running clockwise\n");
delay(100);
break;
}
else if (direction == 'a')
{
printf("motor running anti-clockwise\n");
delay(100);
break;
}
else
{
printf("input error, please try again!\n");
delay(100);
}
}
while(1)
{
rotary(direction);
}
}
void main(void)
{
if (wiringPiSetup() == -1)
{
printf("setup wiringPi failed !");
return;
}
for (int i = 0; i < 4; i++)
{
pinMode(motorPin[i], OUTPUT);
}
stepSpeed = (60000000 / rolePerMinute) / stepsPerRevolution;
loop();
}
**Spiegazione del Codice**
.. code-block:: c
int rolePerMinute = 15;
int stepsPerRevolution = 2048;
int stepSpeed = 0;
**rolePerMinute:** Rivoluzioni per minuto, l'RPM del motore passo-passo
utilizzato in questo kit dovrebbe essere compreso tra 0 e 17.
**stepsPerRevolution:** Numero di passi per ogni giro completo; il motore
passo-passo utilizzato in questo kit richiede 2048 passi per rivoluzione.
**stepSpeed:** Tempo necessario per ogni passo. Nel main(), il valore viene
assegnato tramite la formula:「(60000000 / rolePerMinute) / stepsPerRevolution」
(60.000.000 us = 1 minuto)
.. code-block:: c
void loop()
{
char direction = '0';
while (1)
{
printf("select motor direction a=anticlockwise, c=clockwise: ");
direction=getchar();
if (direction == 'c')
{
printf("motor running clockwise\n");
break;
}
else if (direction == 'a')
{
printf("motor running anti-clockwise\n");
break;
}
else
{
printf("input error, please try again!\n");
}
}
while(1)
{
rotary(direction);
}
}
La funzione loop() è suddivisa in due parti (situate tra due cicli while(1)):
La prima parte ottiene il valore del tasto. Quando viene premuto 'a' o 'c', il ciclo si interrompe e l'input viene fermato.
La seconda parte chiama rotary(direction) per far funzionare il motore passo-passo.
.. code-block:: c
void rotary(char direction){
if(direction == 'c'){
for(int j=0;j<4;j++){
for(int i=0;i<4;i++)
{digitalWrite(motorPin[i],0x99>>j & (0x08>>i));}
delayMicroseconds(stepSpeed);
}
}
else if(direction =='a'){
for(int j=0;j<4;j++){
for(int i=0;i<4;i++)
{digitalWrite(motorPin[i],0x99<>i));}
delayMicroseconds(stepSpeed);
}
}
}
Per far ruotare il motore passo-passo **in senso orario**, lo stato di livello di motorPin è mostrato nella tabella seguente:
.. image:: img/image340.png
Il valore di scrittura per MotorPin viene implementato utilizzando un ciclo for a due livelli.
Nel Passo1, j=0, i=0~4.
motorPin[0] sarà impostato su livello alto(10011001&00001000=1)
motorPin[1] sarà impostato su livello basso(10011001&00000100=0)
motorPin[2] sarà impostato su livello basso(10011001&00000010=0)
motorPin[3] sarà impostato su livello alto(10011001&00000001=1)
Nel Passo2, j=1, i=0~4.
motorPin[0] sarà impostato su livello alto(01001100&00001000=1)
motorPin[1] sarà impostato su livello basso(01001100&00000100=1)
e così via.
Per far ruotare il motore passo-passo **in senso antiorario**, lo stato di
livello di motorPin è mostrato nella seguente tabella.
.. image:: img/image341.png
Nel Passo1, j=0, i=0~4.
motorPin[0] sarà impostato su livello alto(10011001&10000000=1)
motorPin[1] sarà impostato su livello basso(10011001&01000000=0)
Nel Passo2, j=1, i=0~4.
motorPin[0] sarà impostato su livello alto(00110010&10000000=0)
motorPin[1] sarà impostato su livello basso(00110010&01000000=0)
e così via.
Per Utenti Python
^^^^^^^^^^^^^^^^^^^^^
**Passo 2**: Vai nella cartella del codice.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python/
**Passo 3**: Esegui il file eseguibile.
.. raw:: html
.. code-block::
sudo python3 1.3.3_StepperMotor.py
Quando il codice viene eseguito, il motore passo-passo ruoterà in senso
orario o antiorario a seconda del tuo input 'a' o 'c'.
**Codice**
.. note::
Puoi **Modificare/Ripristinare/Copiare/Eseguire/Arrestare** il codice sottostante. Prima, però, è necessario accedere al percorso del codice sorgente come ``davinci-kit-for-raspberry-pi/python``.
.. raw:: html
.. code-block:: python
import RPi.GPIO as GPIO
from time import sleep
motorPin = (18,23,24,25)
rolePerMinute =15
stepsPerRevolution = 2048
stepSpeed = (60/rolePerMinute)/stepsPerRevolution
def setup():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
for i in motorPin:
GPIO.setup(i, GPIO.OUT)
def rotary(direction):
if(direction == 'c'):
for j in range(4):
for i in range(4):
GPIO.output(motorPin[i],0x99>>j & (0x08>>i))
sleep(stepSpeed)
elif(direction == 'a'):
for j in range(4):
for i in range(4):
GPIO.output(motorPin[i],0x99<>i))
sleep(stepSpeed)
def loop():
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!')
while True:
rotary(direction)
def destroy():
GPIO.cleanup()
if __name__ == '__main__':
setup()
try:
loop()
except KeyboardInterrupt:
destroy()
**Spiegazione del Codice**
.. code-block:: python
rolePerMinute = 15
stepsPerRevolution = 2048
stepSpeed = (60/rolePerMinute)/stepsPerRevolution
**rolePerMinute:** Rivoluzioni per minuto, l'RPM del motore passo-passo
utilizzato in questo kit dovrebbe essere tra 0 e 17.
**stepsPerRevolution:** Numero di passi per ogni rotazione, il motore
passo-passo utilizzato in questo kit richiede 2048 passi per una rotazione
completa.
**stepSpeed:** Il tempo impiegato per ogni passo, calcolato come 「
(60 / rolePerMinute) / stepsPerRevolution」(60s=1 minuto).
.. code-block:: python
def loop():
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!')
while True:
rotary(direction)
La funzione loop() è suddivisa in due parti (situate in due cicli while(True)) :
La prima parte serve a ottenere il valore della chiave. Quando viene premuto
'a' o 'c', il ciclo si interrompe e l'input si arresta.
La seconda parte richiama rotary(direction) per avviare il motore passo-passo.
.. code-block:: python
def rotary(direction):
if(direction == 'c'):
for j in range(4):
for i in range(4):
GPIO.output(motorPin[i],0x99>>j & (0x08>>i))
sleep(stepSpeed)
elif(direction == 'a'):
for j in range(4):
for i in range(4):
GPIO.output(motorPin[i],0x99<>i))
sleep(stepSpeed)
Per far ruotare il motore passo-passo in senso orario, lo stato di livello
dei motorPin è mostrato nella tabella seguente:
.. image:: img/image342.png
Il valore di scrittura per MotorPin viene implementato utilizzando un ciclo
for a due livelli.
Nel Passo1, j=0, i=0~4.
motorPin[0] sarà impostato su livello alto(10011001&00001000=1)
motorPin[1] sarà impostato su livello basso(10011001&00000100=0)
motorPin[2] sarà impostato su livello basso(10011001&00000010=0)
motorPin[3] sarà impostato su livello alto(10011001&00000001=1)
Nel Passo2, j=1, i=0~4.
motorPin[0] sarà impostato su livello alto(01001100&00001000=1)
motorPin[1] sarà impostato su livello basso(01001100&00000100=1)
e così via.
Per far ruotare il motore passo-passo in senso antiorario, lo stato di
livello dei motorPin è mostrato nella tabella seguente:
.. image:: img/image343.png
Nel Passo1, j=0, i=0~4.
motorPin[0] sarà impostato su livello alto(10011001&10000000=1)
motorPin[1] sarà impostato su livello basso(10011001&01000000=0)
Nel Passo2, j=1, i=0~4.
motorPin[0] sarà impostato su livello alto(00110010&10000000=0)
motorPin[1] sarà impostato su livello basso(00110010&01000000=0)
e così via.
Immagine del Fenomeno
-------------------------
.. image:: img/image135.jpeg