.. note:: Ciao, benvenuto nella community di appassionati di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Esplora più a fondo Raspberry Pi, Arduino ed ESP32 con altri appassionati. **Perché unirsi a noi?** - **Supporto esperto**: Risolvi problemi post-vendita e sfide tecniche grazie al supporto della nostra community e del nostro team. - **Impara e condividi**: Scambia suggerimenti e tutorial per migliorare le tue competenze. - **Anteprime esclusive**: Ottieni l'accesso anticipato a nuovi annunci di prodotto e anteprime. - **Sconti speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti. - **Promozioni festive e omaggi**: Partecipa a giveaway e promozioni durante le festività. 👉 Pronto a esplorare e creare con noi? Clicca [|link_sf_facebook|] e unisciti oggi stesso! .. _ar_mpr121: 2.24 Modulo MPR121 ===================== Panoramica ------------- In questa lezione imparerai a utilizzare il modulo MPR121. È un'ottima opzione quando vuoi aggiungere molti interruttori touch al tuo progetto. Gli elettrodi del MPR121 possono essere estesi con un conduttore. Ad esempio, collegando un filo a una banana, puoi trasformare la banana in un interruttore touch, permettendo la realizzazione di progetti come il pianoforte di frutta. Componenti necessari ------------------------ .. image:: img/Part_two_24.png * :ref:`cpn_mega2560` * :ref:`cpn_breadboard` * :ref:`cpn_wires` * :ref:`cpn_mpr121` Circuito Fritzing --------------------- In questo esempio, inseriamo il MPR121 nella breadboard. Colleghiamo il GND del MPR121 al GND, 3.3V al pin 3V3, IRQ al pin digitale 2, SCL al pin SCL (21) e SDA al pin SDA (20). Ci sono 12 elettrodi per il rilevamento touch. Nota: il MPR121 è alimentato da 3.3V, non da 5V. .. image:: img/image201.png :align: center Schema elettrico -------------------- .. image:: img/image202.png :align: center Codice -------- .. note:: * Puoi aprire direttamente il file ``2.24_mpr121.ino`` nella cartella ``sunfounder_vincent_kit_for_arduino\code\2.24_mpr121``. * La libreria ``Adafruit MPR121`` viene utilizzata qui; puoi installarla dal **Library Manager**. .. image:: img/lib_mpr121.png :align: center .. raw:: html Dopo aver caricato il codice sulla scheda Mega2560, lo stato touch dei pin del MPR121, rappresentato dai valori 「1」e「0」, verrà registrato in un array booleano a 12 bit e stampato sul monitor seriale. Analisi del codice ---------------------- Questo codice facilita la comunicazione e l'operatività del sensore touch MPR121. È in grado di rilevare lo stato degli elettrodi touch e stampare informazioni sugli elettrodi toccati o rilasciati nell'interfaccia seriale. Se sono richiesti dati dettagliati del sensore, è possibile sbloccare il relativo codice. Ecco un'analisi del codice: #. Importa librerie: .. code-block:: arduino #include #include "Adafruit_MPR121.h" * ``Wire.h``: Utilizzata per la comunicazione I2C. * ``Adafruit_MPR121.h``: Libreria Adafruit per operare con il sensore touch MPR121. #. Definisce la macro ``_BV``: .. code-block:: arduino #ifndef _BV #define _BV(bit) (1 << (bit)) #endif ``_BV(bit)`` converte un dato bit nel corrispondente valore binario. #. Inizializza un'istanza della classe ``Adafruit_MPR121``: .. code-block:: arduino Adafruit_MPR121 cap = Adafruit_MPR121(); Crea un'istanza della classe ``Adafruit_MPR121`` denominata ``cap``. L'oggetto ``cap`` verrà utilizzato per comunicare e operare con il sensore touch MPR121. #. Funzione ``setup()``: Inizializza la comunicazione seriale a un baud rate di 9600, quindi inizializza il sensore touch MPR121 con l'indirizzo I2C predefinito di 0x5A. Se l'inizializzazione fallisce, stampa un messaggio di errore e entra in un ciclo infinito. .. code-block:: arduino void setup() { Serial.begin(9600); while (!Serial) { // necessario per evitare che leonardo/micro partano troppo velocemente! delay(10); } Serial.println("Test sensore touch capacitivo Adafruit MPR121"); // L'indirizzo predefinito è 0x5A; se collegato a 3.3V diventa 0x5B // Se collegato a SDA diventa 0x5C e a SCL diventa 0x5D if (!cap.begin(0x5A)) { Serial.println("MPR121 not found, check wiring?"); while (1); } Serial.println("MPR121 found!"); } #. Funzione ``loop()``: * Ottieni lo stato corrente del touch, restituito come un intero a 16 bit. .. code-block:: arduino currtouched = cap.touched(); * Itera lo stato dei 12 elettrodi (numerati da 0 a 11). .. code-block:: arduino for (uint8_t i=0; i<12; i++) { // se è stato toccato e non lo era prima, avvisa! if ((currtouched & _BV(i)) && !(lasttouched & _BV(i)) ) { Serial.print(i); Serial.println(" touched"); } // se era toccato e ora non lo è più, avvisa! if (!(currtouched & _BV(i)) && (lasttouched & _BV(i)) ) { Serial.print(i); Serial.println(" released"); } } * Se un elettrodo è toccato e non lo era prima, stampa "x toccato", dove x è il numero dell'elettrodo. * Se un elettrodo era toccato prima ma ora non lo è, stampa "x rilasciato". * Aggiorna ``lasttouched`` per memorizzare lo stato touch corrente e confrontarlo nella prossima iterazione. .. code-block:: arduino lasttouched = currtouched; * Informazioni di debug (sezione opzionale): .. code-block:: arduino // informazioni di debug Serial.print("\t\t\t\t\t\t\t\t\t\t\t\t\t 0x"); Serial.println(cap.touched(), HEX); Serial.print("Filt: "); for (uint8_t i=0; i<12; i++) { Serial.print(cap.filteredData(i)); Serial.print("\t"); } Serial.println(); Serial.print("Base: "); for (uint8_t i=0; i<12; i++) { Serial.print(cap.baselineData(i)); Serial.print("\t"); } Serial.println(); // aggiungi un ritardo per evitare sovraccarichi delay(100); Immagine del risultato -------------------------- .. image:: img/image203.jpeg :align: center