.. 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