.. note::
Ciao e benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.
**Perché unirsi?**
- **Supporto esperto**: Risolvi problemi tecnici e post-vendita con l'aiuto della nostra comunità e del nostro team.
- **Impara e condividi**: Scambia suggerimenti e tutorial per migliorare le tue competenze.
- **Anteprime esclusive**: Accedi in anteprima agli annunci dei nuovi prodotti e alle anticipazioni.
- **Sconti speciali**: Godi di sconti esclusivi sui nostri ultimi prodotti.
- **Promozioni e omaggi festivi**: Partecipa a omaggi e promozioni durante le festività.
👉 Pronto per esplorare e creare con noi? Clicca [|link_sf_facebook|] e unisciti oggi!
1.3.1 Motore
=============
Introduzione
-----------------
In questa lezione, impareremo a utilizzare l'L293D per controllare un motore
DC, facendolo ruotare in senso orario e antiorario. Poiché il motore DC
richiede una corrente elevata, per ragioni di sicurezza useremo il Modulo
di Alimentazione per alimentare i motori.
Componenti
-------------
.. image:: img/list_1.3.1.png
Principio
-----------
**L293D**
L'L293D è un driver motore a 4 canali integrato in un chip ad alta tensione e
corrente. È progettato per collegarsi a livelli logici standard DTL, TTL, e per
azionare carichi induttivi (come relè, motori DC, motori passo-passo) e transistor
per il controllo di potenza. I motori DC convertono l’energia elettrica in energia
meccanica e sono ampiamente usati per il loro eccellente controllo della velocità.
Guarda l'immagine dei pin di seguito. L'L293D ha due pin (Vcc1 e Vcc2) per
l'alimentazione: Vcc2 alimenta il motore, mentre Vcc1 alimenta il chip.
Dato che qui utilizziamo un motore DC di piccole dimensioni, collega entrambi
i pin a +5V.
.. image:: img/image111.png
La figura seguente mostra la struttura interna dell'L293D. Il pin EN è un pin
di abilitazione e funziona solo con livello alto; A rappresenta l’ingresso e Y
l’uscita. La relazione tra essi è mostrata in basso a destra. Quando EN è alto,
se A è alto, Y emette livello alto; se A è basso, Y emette livello basso. Quando
EN è basso, l'L293D non funziona.
.. image:: img/image334.png
**Motore DC**
.. image:: img/image114.jpeg
Questo è un motore DC a 5V. Ruota quando viene alimentato con una tensione tra
i due terminali. Per comodità, puoi saldare i pin.
.. image:: img/image335.png
**Modulo di Alimentazione**
In questo esperimento, sono necessarie correnti elevate per alimentare il
motore, soprattutto durante l’avvio e l’arresto, il che potrebbe interferire
con il funzionamento del Raspberry Pi. Pertanto, alimentiamo separatamente il
motore con questo modulo per garantire stabilità e sicurezza.
È sufficiente collegarlo alla breadboard per fornire alimentazione. Fornisce
una tensione di 3,3V e 5V, e puoi selezionare l’opzione tramite un ponticello
incluso.
.. image:: img/image115.png
Diagramma Schematico
------------------------
Collega il modulo di alimentazione alla breadboard e inserisci il ponticello
sul pin da 5V, quindi erogherà una tensione di 5V. Collega il pin 1 dell'L293D
a GPIO22, impostandolo su livello alto. Collega il pin2 a GPIO27 e il pin7 a
GPIO17, impostando uno dei pin su alto e l’altro su basso. In questo modo puoi
cambiare la direzione di rotazione del motore.
.. image:: img/image336.png
Procedure Sperimentali
--------------------------
**Passo 1:** Costruisci il circuito.
.. image:: img/1.3.1.png
:width: 800
.. note::
Il modulo di alimentazione può essere collegato a una batteria da 9V
tramite il connettore 9V incluso nel kit. Inserisci il ponticello del
modulo di alimentazione nella striscia da 5V della breadboard.
.. image:: img/image118.jpeg
Per gli Utenti del Linguaggio C
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**Passo 2**: Accedi alla cartella del codice.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/1.3.1/
**Passo 3**: Compila.
.. raw:: html
.. code-block::
gcc 1.3.1_Motor.c -lwiringPi
**Passo 4**: Esegui il file eseguibile sopra.
.. raw:: html
.. code-block::
sudo ./a.out
Quando il codice viene eseguito, il motore ruota prima in senso orario
per 5s, quindi si ferma per 5s. Successivamente ruota in senso antiorario
per 5s e si ferma di nuovo per 5s. Questa sequenza di azioni verrà eseguita
ripetutamente.
.. note::
Se il programma non funziona, o se appare l’errore: \"wiringPi.h: No such file or directory\", consulta :ref:`faq_c_nowork`.
**Codice**
.. code-block:: c
#include
#include
#define MotorPin1 0
#define MotorPin2 2
#define MotorEnable 3
int main(void){
int i;
if(wiringPiSetup() == -1){ //in caso di errore di inizializzazione stampa il messaggio
printf("setup wiringPi failed !");
return 1;
}
pinMode(MotorPin1, OUTPUT);
pinMode(MotorPin2, OUTPUT);
pinMode(MotorEnable, OUTPUT);
while(1){
printf("Clockwise\n");
delay(100);
digitalWrite(MotorEnable, HIGH);
digitalWrite(MotorPin1, HIGH);
digitalWrite(MotorPin2, LOW);
for(i=0;i<3;i++){
delay(1000);
}
printf("Stop\n");
delay(100);
digitalWrite(MotorEnable, LOW);
for(i=0;i<3;i++){
delay(1000);
}
printf("Anti-clockwise\n");
delay(100);
digitalWrite(MotorEnable, HIGH);
digitalWrite(MotorPin1, LOW);
digitalWrite(MotorPin2, HIGH);
for(i=0;i<3;i++){
delay(1000);
}
printf("Stop\n");
delay(100);
digitalWrite(MotorEnable, LOW);
for(i=0;i<3;i++){
delay(1000);
}
}
return 0;
}
**Spiegazione del Codice**
.. code-block:: c
digitalWrite(MotorEnable, HIGH);
Abilita l’L293D.
.. code-block:: c
digitalWrite(MotorPin1, HIGH);
digitalWrite(MotorPin2, LOW);
Imposta un livello alto per 2A (pin 7); poiché 1,2EN (pin 1) è a livello alto,
2Y emetterà un livello alto.
Imposta un livello basso per 1A, così 1Y emetterà un livello basso e il motore
inizierà a ruotare.
.. code-block:: c
for(i=0;i<3;i++){
delay(1000);
}
Questo ciclo è un ritardo per 3*1000ms.
.. code-block:: c
digitalWrite(MotorEnable, LOW)
Quando 1,2EN (pin1) è a livello basso, l’L293D non funziona. Il motore si ferma.
.. code-block:: c
digitalWrite(MotorPin1, LOW)
digitalWrite(MotorPin2, HIGH)
Inverte la direzione della corrente nel motore, facendolo ruotare nel senso opposto.
Per Utenti del Linguaggio Python
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
**Passo 2**: Accedi alla cartella del codice.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python
**Passo 3**: Esegui.
.. raw:: html
.. code-block::
sudo python3 1.3.1_Motor.py
Quando il codice viene eseguito, il motore ruota prima in senso orario per 5s,
poi si ferma per 5s, successivamente ruota in senso antiorario per 5s, e si
ferma di nuovo per 5s. Questa sequenza di azioni si ripete continuamente.
**Codice**
.. note::
È possibile **Modificare/Reimpostare/Copiare/Eseguire/Arrestare** il codice qui sotto. Tuttavia, prima è necessario spostarsi nel percorso del codice sorgente, come ``davinci-kit-for-raspberry-pi/python``.
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import time
# Imposta i pin
MotorPin1 = 17
MotorPin2 = 27
MotorEnable = 22
def setup():
# Imposta la numerazione GPIO in modalità BCM
GPIO.setmode(GPIO.BCM)
# Configura i pin come output
GPIO.setup(MotorPin1, GPIO.OUT)
GPIO.setup(MotorPin2, GPIO.OUT)
GPIO.setup(MotorEnable, GPIO.OUT, initial=GPIO.LOW)
# Definisce una funzione per controllare il motore
# direzione deve essere
# 1 (orario), 0 (fermo), -1 (antiorario)
def motor(direction):
# Rotazione in senso orario
if direction == 1:
# Imposta direzione
GPIO.output(MotorPin1, GPIO.HIGH)
GPIO.output(MotorPin2, GPIO.LOW)
# Abilita il motore
GPIO.output(MotorEnable, GPIO.HIGH)
print ("Clockwise")
# Rotazione in senso antiorario
if direction == -1:
# Imposta direzione
GPIO.output(MotorPin1, GPIO.LOW)
GPIO.output(MotorPin2, GPIO.HIGH)
# Abilita il motore
GPIO.output(MotorEnable, GPIO.HIGH)
print ("Counterclockwise")
# Stop
if direction == 0:
# Disabilita il motore
GPIO.output(MotorEnable, GPIO.LOW)
print ("Stop")
def main():
# Crea un dizionario per rendere lo script più leggibile
# CW per orario, CCW per antiorario, STOP per fermare
directions = {'CW': 1, 'CCW': -1, 'STOP': 0}
while True:
# Rotazione in senso orario
motor(directions['CW'])
time.sleep(5)
# Fermo
motor(directions['STOP'])
time.sleep(5)
# Rotazione in senso antiorario
motor(directions['CCW'])
time.sleep(5)
# Fermo
motor(directions['STOP'])
time.sleep(5)
def destroy():
# Ferma il motore
GPIO.output(MotorEnable, GPIO.LOW)
# Rilascia le risorse
GPIO.cleanup()
# Se si esegue direttamente questo script:
if __name__ == '__main__':
setup()
try:
main()
# Quando viene premuto 'Ctrl+C', il programma
# eseguirà destroy().
except KeyboardInterrupt:
destroy()
**Spiegazione del Codice**
.. code-block:: python
def motor(direction):
# Rotazione oraria
if direction == 1:
# Imposta direzione
GPIO.output(MotorPin1, GPIO.HIGH)
GPIO.output(MotorPin2, GPIO.LOW)
# Abilita il motore
GPIO.output(MotorEnable, GPIO.HIGH)
print ("Clockwise")
...
Crea una funzione **motor()** il cui parametro è direzione. Quando la
condizione direction=1 è soddisfatta, il motore ruota in senso orario;
se direction=-1, ruota in senso antiorario; e quando direction=0, si ferma.
.. code-block:: python
def main():
# Crea un dizionario per rendere lo script più leggibile
# CW per orario, CCW per antiorario, STOP per fermo
directions = {'CW': 1, 'CCW': -1, 'STOP': 0}
while True:
# Rotazione oraria
motor(directions['CW'])
time.sleep(5)
# Fermo
motor(directions['STOP'])
time.sleep(5)
# Rotazione antioraria
motor(directions['CCW'])
time.sleep(5)
# Fermo
motor(directions['STOP'])
time.sleep(5)
Nella funzione main(), crea un dizionario directions[], dove CW è uguale a 1,
CCW è uguale a -1, e 0 si riferisce al comando Stop.
Quando il codice viene eseguito, il motore ruota inizialmente in senso orario
per 5 secondi, poi si ferma per altri 5 secondi. Successivamente ruota in senso
antiorario per 5 secondi, e infine si ferma di nuovo per 5 secondi. Questa sequenza di azioni si ripeterà.
Ora dovresti vedere le pale del motore ruotare.
Immagine del Fenomeno
-----------------------------
.. image:: img/image119.jpeg