.. note:: Ciao, benvenuto nella Community di SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati. **Perché Unirsi?** - **Supporto Esperto**: Risolvi problematiche post-vendita e sfide tecniche con l’aiuto della nostra comunità e del nostro team. - **Impara e Condividi**: Scambia consigli e tutorial per migliorare le tue competenze. - **Anteprime Esclusive**: Ottieni accesso anticipato a nuovi annunci di prodotti e anticipazioni. - **Sconti Speciali**: Goditi sconti esclusivi sui nostri ultimi prodotti. - **Promozioni Festive e Giveaway**: Partecipa a giveaway e promozioni speciali durante le festività. 👉 Pronto per esplorare e creare con noi? Clicca [|link_sf_facebook|] e unisciti oggi stesso! .. _1.3.3_motor_c_pi5: 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 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 che si caricano positivamente e negativamente in una sequenza specifica, muovendolo in avanti o indietro a piccoli "passi". Componenti ------------- .. image:: img/list_1.3.3.png Principio ------------- **Motore Passo-passo** Esistono due tipi di motori passo-passo, unipolari e bipolari, ed è molto importante sapere con quale tipo si sta lavorando. In questo esperimento, useremo un motore passo-passo unipolare. Il motore passo-passo utilizzato è a quattro fasi e sfrutta un'alimentazione in corrente continua unipolare. Finché si alimentano le fasi del motore seguendo una sequenza temporale appropriata, è possibile farlo ruotare passo dopo passo. Il diagramma schematico di un motore passo-passo a quattro fasi è mostrato di seguito: .. image:: img/image129.png Nell’immagine, al centro del motore c'è un rotore, un magnete permanente a forma di ingranaggio. Intorno al rotore, i denti vanno da 0 a 5. Più esternamente, ci sono 8 poli magnetici, con ciascuna coppia opposta collegata da un avvolgimento di bobina. Formano così quattro coppie, da A a D, chiamate fase. Il motore ha quattro fili collegati a interruttori SA, SB, SC e SD. Pertanto, le quattro fasi sono in parallelo nel circuito, e i due poli magnetici in una fase sono in serie. **Come funziona un motore passo-passo a 4 fasi:** Quando l'interruttore SB è acceso, mentre gli interruttori SA, SC e SD sono spenti, i poli magnetici della fase B si allineano con i denti 0 e 3 del rotore. Allo stesso tempo, i denti 1 e 4 creano denti sfalsati con i poli delle fasi C e D. I denti 2 e 5 creano denti sfalsati con i poli magnetici delle fasi D e A. Quando l'interruttore SC è acceso e gli interruttori SB, SA e SD sono spenti, il rotore ruota sotto l'influenza del campo magnetico della fase C, allineandosi con i denti 1 e 4. Energizzando le fasi A, B, C e D in sequenza, il rotore ruoterà in ordine di fasi A, B, C e D. .. image:: img/image130.png Il motore passo-passo a quattro fasi ha tre modalità operative: passo singolo a quattro fasi, doppio passo a quattro fasi e passo a otto fasi. L'angolo di passo per il passo singolo e il doppio passo a quattro fasi è lo stesso, ma la coppia di trascinamento per il singolo passo è inferiore. L'angolo di passo della modalità a otto fasi è la metà di quello delle modalità a quattro fasi singolo e doppio, permettendo una coppia di trascinamento elevata e una maggiore precisione di controllo. Lo statore del motore passo-passo che utilizziamo ha 32 poli magnetici, quindi un giro completo richiede 32 passi. L'albero di uscita del motore passo-passo è collegato a un set di ingranaggi di riduzione, con un rapporto di riduzione di 1/64. Quindi, per far ruotare un giro completo dell'albero di uscita finale sono necessari 32*64=2048 passi. **ULN2003** Per applicare il motore nel circuito, è necessario utilizzare una scheda driver. Il driver del motore passo-passo ULN2003 è un circuito invertitore a 7 canali. Ovvero, quando il pin di ingresso è a livello alto, il pin di uscita di ULN2003 è a livello basso, e viceversa. Se forniamo un livello alto a IN1 e un livello basso a IN2, IN3 e IN4, allora l’uscita OUT1 sarà a livello basso, mentre tutte le altre uscite saranno a livello alto. Di seguito è mostrata la struttura interna del chip. .. image:: img/image338.png Il driver del motore passo-passo costituito dal chip ULN2003 e da 4 LED è mostrato qui sotto. Sulla scheda, IN1, IN2, IN3 e IN4 fungono da ingressi e i quattro LED, A, B, C, D sono gli indicatori dei pin di ingresso. Inoltre, OUT1, OUT2, OUT3 e OUT4 sono collegati rispettivamente a SA, SB, SC e SD sul driver del motore passo-passo. Quando il valore di IN1 è impostato a livello alto, si accende A; l'interruttore SA si attiva, e il motore passo-passo compie un passo. Questo schema si ripete continuamente. Pertanto, fornendo una sequenza temporale specifica al motore passo-passo, esso ruoterà passo dopo passo. L'ULN2003 viene utilizzato per fornire sequenze temporali specifiche al motore passo-passo. .. image:: img/image132.png Schema Elettrico ------------------- .. image:: img/image339.png Procedure Sperimentali -------------------------- **Passo 1:** Montare il circuito. .. image:: img/image134.png :width: 800 **Passo 2:** Accedere alla cartella del codice. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/c/1.3.3/ **Passo 3:** Compilare il codice. .. raw:: html .. code-block:: gcc 1.3.3_StepperMotor.c -lwiringPi **Passo 4:** Eseguire il file eseguibile. .. raw:: html .. code-block:: sudo ./a.out All'esecuzione del codice, il motore passo-passo ruoterà in senso orario o antiorario in base all'input che fornisci, 'a' o 'c'. .. note:: Se il programma non funziona dopo l'esecuzione o compare un errore come : \"wiringPi.h: Nessun file o directory di questo tipo", 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:** Giri al minuto, ovvero il numero di RPM del motore passo-passo utilizzato in questo kit, che dovrebbe essere compreso tra 0 e 17. **stepsPerRevolution:** Numero di passi per ogni giro. Il motore passo-passo utilizzato in questo kit richiede 2048 passi per una rotazione completa. **stepSpeed:** Tempo utilizzato per ciascun passo, e nel main() assegnamo il valore con 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() è divisa in due parti principali (entrambe contenute tra due while(1)): La prima parte acquisisce il valore del tasto premuto. Quando viene ottenuto 'a' o 'c', si esce dal ciclo e si interrompe l'input. La seconda parte chiama rotary(direction) per avviare 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 fare in modo che il motore passo-passo **ruoti in senso orario**, lo stato di livello di motorPin è riportato nella tabella seguente: .. image:: img/image340.png Pertanto, l’assegnazione del potenziale a MotorPin viene eseguita utilizzando un doppio ciclo for. Nel Passo1, j=0, i=0~4. motorPin[0] verrà impostato su livello alto(10011001&00001000=1) motorPin[1] verrà impostato su livello basso(10011001&00000100=0) motorPin[2] verrà impostato su livello basso(10011001&00000010=0) motorPin[3] verrà impostato su livello alto(10011001&00000001=1) Nel Passo2, j=1, i=0~4. motorPin[0] verrà impostato su livello alto(01001100&00001000=1) motorPin[1] verrà impostato su livello basso(01001100&00000100=1) e così via. Per fare in modo che il motore passo-passo ruoti **in senso antiorario**, lo stato di livello di motorPin è riportato nella tabella seguente. .. image:: img/image341.png Nel Passo1, j=0, i=0~4. motorPin[0] verrà impostato su livello alto(10011001&10000000=1) motorPin[1] verrà impostato su livello basso(10011001&01000000=0) Nel Passo2, j=1, i=0~4. motorPin[0] verrà impostato su livello alto(00110010&10000000=0) motorPin[1] verrà impostato su livello basso(00110010&01000000=0) e così via.