.. note:: Ciao, benvenuto nella Community su Facebook per gli appassionati di SunFounder Raspberry Pi, Arduino e ESP32! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati. **Perché unirti a noi?** - **Supporto esperto**: Risolvi i problemi post-vendita e le 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 anteprime esclusive. - **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti. - **Promozioni e Giveaway Festivi**: Partecipa a concorsi e promozioni in occasione delle festività. 👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso! 3.1.6 Controllo del Movimento ================================== Introduzione ----------------- In questa lezione, realizzeremo un semplice dispositivo di rilevamento e controllo del movimento. L’MPU6050 sarà utilizzato come sensore e il motore passo-passo come dispositivo controllato. Montando l’MPU6050 su un guanto, potrai controllare il motore passo-passo ruotando il polso. Componenti ------------ .. image:: img/list_Motion_Control.png :align: center Schema di Collegamento ------------------------- ============ ======== ======== === T-Board Name physical wiringPi BCM GPIO18 Pin 12 1 18 GPIO23 Pin 16 4 23 GPIO24 Pin 18 5 24 GPIO25 Pin 22 6 25 SDA1 Pin 3 SCL1 Pin 5 ============ ======== ======== === .. image:: img/Schematic_three_one6.png :align: center Procedure Sperimentali -------------------------- **Passo 1:** Costruisci il circuito. .. image:: img/image251.png :width: 800 :align: center **Passo 2**: Accedi alla cartella del codice. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/c/3.1.6/ **Passo 3**: Compila il codice. .. raw:: html .. code-block:: gcc 3.1.6_MotionControl.c -lwiringPi -lm **Passo 4**: Esegui il file eseguibile. .. raw:: html .. code-block:: sudo ./a.out Quando il codice è in esecuzione, se l’angolo di inclinazione di **mpu6050** sull’asse Y è superiore a **45°**, il motore passo-passo ruota in senso antiorario; se è inferiore a **-45°**, il motore ruota in senso orario. .. note:: Se non funziona dopo l'esecuzione o compare un messaggio di errore: \"wiringPi.h: No such file or directory\", consulta :ref:`faq_c_nowork`. **Spiegazione del Codice** .. code-block:: c double mpu6050(){     acclX = read_word_2c(0x3B);     acclY = read_word_2c(0x3D);     acclZ = read_word_2c(0x3F);     acclX_scaled = acclX / 16384.0;     acclY_scaled = acclY / 16384.0;     acclZ_scaled = acclZ / 16384.0;     double angle=get_y_rotation(acclX_scaled, acclY_scaled, acclZ_scaled);     return angle; } La funzione mpu6050 calcola l’angolo di inclinazione nella direzione dell’asse Y. .. 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); } } } Se il **tasto** della direzione ricevuto è **\'c\'**, il motore passo-passo ruota in senso orario; se il **tasto** è **\'a\'**, il motore ruota in senso antiorario. Consulta :ref:`1.3.3_motor_c_pi5` per ulteriori dettagli sul calcolo della direzione di rotazione del motore passo-passo. .. code-block:: c int main() { setup();     double angle;     while(1) {         angle = mpu6050();         if (angle >=45){rotary('a');}         else if (angle<=-45){rotary('c');} }     return 0; } La funzione **main()** legge l’angolo di inclinazione nella direzione dell’asse Y da **mpu6050** e, se è maggiore di **45°**, il motore passo-passo ruota in senso antiorario; se è minore di **-45°**, il motore ruota in senso orario.