In questo articolo vedremo come trasformare Arduino con l’aiuto del modulo DFPlayer Mini, montato sullo shield DFPlayer in un voltmetro parlante. Per maggiori informazioni relativo allo shied vedere articolo Shield con DFPlayer Mini – Costruzione
Indice
Descrizione progetto
Il progetto proposto permette di dare la parola ad Arduino.
Sarà così possibile, per esempio, ascoltare attraverso l’altoparlante il valore in volt della tensione misurata.
Se si utilizzerà anche il display OLED, lo stesso valore sarà possibile leggerlo su un display.
Il tutto è possibile utilizzando il modulo DFPlayer mini con cui è possibile memorizzare e riprodurre file audio in formato wave/MP3 salvati nell’apposita memoria MicroSD.
Schema del progetto
Sotto è riportato lo schema equivalente presente nello shield DFPlayer per utilizzarlo come voltmetro parlante.
- DFPLayer mini: sono visibili i collegamenti al modulo DFPlayer Mini , in particolare i pin RX-TX per dialogare in seriale con Arduino (pin D2, D3), i pin di alimentazione e quelli con l’altoparlante. Sulla linea in uscita dal pin 2 occorre inserire una resistenza da 1kΩ come indicato dal costruttore.
Per maggiori informazioni vedere l’articolo DFPlayer Mini Riproduttore MP3 per Arduino
- SP1 – altoparlante 8 Ω 3 W max. da collegare ai pin 6 e 8 del modulo ;
- Display OLED: sono visibili i pin per l’interfacciamento di un display OLED 0.96″ 128×64 -SSD1306, il display dialoga con Arduino tramite un protocollo I2C , questi si collegheranno ai pin dedicati della scheda Arduino oppure ai pin A4 (SDA) e A5 (SCL). Sono poi presenti i collegamenti al +5V e GND;
- Un trimmer da 10 KΩ il cui contatto centrale è collegato al pin di ingresso analogico A0 di Arduino; sarà possibile avere sul pin una tensione continua con un valore variabile tra 0 e 5V;
Utilizzo dello shield
Per facilitare i collegamenti, in questo caso è stato utilizzato uno speciale shield autocostruito.
Maggiori informazioni le potete trovate nell’articolo Shield con DFPlayer Mini – Costruzione
Le principali caratteristiche delle shield per DFPlayer mini sono:
- Shield compatibile con scheda Arduino UNO;
- Connettore per DFPlayer mini;
- Connettore per altoparlante;
- Tre pulsanti configurabili;
- Led RGB a comando seriale tipo WS2812B;
- Trimmer per regolazione tensione verso pin analogico;
- Ricevitore/decodificatore IR tipo IRM-3638T ;
- Connettori per collegamento sensori a 3 pin
- Connettore per sensori digitali I2C (BMP180, MLX90614 GY-906, MAX44009, etc.);
- Possibilità di montare un display OLED 0.96″ 128×64 -SSD1306;
NOTA:
Potete trovare lo schema elettrico, il PCB realizzato con l’applicazione EasyEDA presso il link https://oshwlab.com/adrirobot/shield-arduino-per-dfplayer-mini.
Il PCB potrà essere realizzato tramite il sito JLCPCB, anche i componenti SMD potranno essere saldati direttamente da sito per cui la scheda vi arriverà già parzialmente montata.
Lettura tensione variabile
Ruotando il trimmer si cambia la quantità di resistenza su entrambi i lati del pin centrale del potenziometro. Questo cambia la resistenza relativa tra il pin centrale e i pin esterni, dando una tensione diversa all’ingresso analogico.
Quando l’albero è girato completamente in una direzione, non vi è resistenza tra il pin centrale e il pin collegato a GND. La tensione al pin centrale è quindi 0 volt.
Quando l’albero è girato tutto nella direzione opposta, non vi è resistenza tra il pin centrale e il pin collegato a +5 volt. La tensione al pin centrale è quindi di 5 volt.
Per la lettura e successiva conversione del valore da Analogico a Digitale, utilizzeremo la possibilità data dalle schede Arduino che contengono un convertitore da analogico a digitale multicanale a 10 bit.
Ciò significa che mapperà le tensioni di ingresso comprese tra 0 e la tensione operativa (5 V) in valori interi compresi tra 0 e 1023, che si traduce in una risoluzione tra le letture di: 5 volt / 1024 unità o , 0,0049 volt (4,9 mV) per unità.
Per leggere il valore utilizzeremo il comando analogRead (), e per ricavare il valore di tensione letto utilizzeremo la formula :
1 |
Vmis = (5.0 * analogRead(A0) * 100.0) / 1024 |
Preparazione della SD Card per il DFPlayer mini
Per il funzionamento del programma è necessario salvare nella memoria del Modulo audio i file che serviranno per pronunciare il valore della tensione letta.
La scheda di memoria utilizzata dal DFPLayer mini è del tipo MicroSD contrazione di Micro Secure Digital , per maggiori informazioni relative al tipo di memoria vedere il seguente link.
La scheda dovrà avere le seguenti caratteristiche: dimensioni massime di 23Gb ed essere formattate con file system (Fat16 o Fat32 ) oppure se possedete un Mac OS X, selezionare ExFat e poi copiare i file wav
Sarà sufficiente trasferire i file presenti nel link, nella memoria MicroSD
Caricamento librerie necessarie
Per funzionare il programma ha bisogno di alcune librerie:
- DFRobotDFPlayerMini
- Adafruit_SSD1306
- Adafruit GFX Library
Libreria per DFPLayer mini
Se non l’avete già fatto occorrerà caricare la relativa libreria, per cui aprire sotto il menù Sketch, #include libreria, “Gestore Librerie”
e inserire nel campo ricerca “DFRobotDFPlayerMini” e basterà premere il tasto Installa,
Libreria per gestione display OLED
Per utilizzare il display OLED è necessario installare l’apposita libreria. Può essere cercata tra le librerie installabili nell’IDE, basterà inserire nel campo di ricerca “Adafruit_SSD1306“.
Sarà anche mostrata una finestra che segnala che la libreria ha una dipendenza con la libreria grafica “Adafruit GFX Library“. Procedete premendo su “Install all”.
Sketch utilizzato
Sotto è riportato lo sketch da caricare nella memoria di Arduino per trasformare lo shield DFPlayer in un voltmetro parlante.
Nella parte iniziale sono incluse le librerie necessarie e definiti alcuni valori .
Segue poi la sezione Setup() dove sono inizializzati il modulo audio e il display.
Nella sezione Loop() viene letto il pin analogico e dopo la conversione viene scritto il valore della tensione sia sul monitor seriale che sul display OLED.
Viene inoltre richiamata la routine speakvoltage() che si occupa di trasformare la cifra letta nelle sue componenti e richiamare i corretti file audio per pronunciare a voce il valore.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
#include "SoftwareSerial.h" #include "DFRobotDFPlayerMini.h" // Impostazione OLED #include <Adafruit_SSD1306.h> #define OLED_ADDR 0x3C #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET 1 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Impoostazione per voltmetro int pinval = 0; int oldpinval = 0; // Pin analogico lettura int pin_tensione = A0; float vout = 0.0; double vmax; int dec; float refVolt = 5.1;//valore alimentazione //impostazione DFPlayer SoftwareSerial ss(2, 3); //RX, TX DFRobotDFPlayerMini mp3; void setup() { Serial.begin(9600); // Inizializza OLED display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR); display.display(); delay(2000); display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(15, 0); display.println("www.adrirobot.it"); display.display(); delay(1000); // Inizializza DFPlayer mini ss.begin(9600); delay(500); if (!mp3.begin(ss)) { Serial.println("Errore mp3"); for (;;); } mp3.volume(20); } void loop() { // Legge il pin analogico pinval = analogRead(pin_tensione); //converte il valore letto vmax = pinval * (refVolt / 1024.0); // Scrive il valore della tensione su monitor seriale Serial.print ("Valore PIN: " ); Serial.println (pinval); Serial.print ("Valore in volt: " ); Serial.println (vmax, 1); // Scrive valore su OLED display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(10, 20); display.print("Tensione"); //Cancella precedente valore su OLED display.fillRect(0, 40, 128, 30, SSD1306_BLACK); display.display(); display.setTextColor(WHITE); display.setCursor(10, 40); display.print(vmax, 1); display.println(" V"); display.display(); if (pinval != oldpinval) { oldpinval = pinval; // Riproduce a voce il valore letto speakvoltage(); delay (2000); } } void speakvoltage() { if (int(vmax) > 0) { mp3.play(int(vmax)); //dice i volt } else if (int(vmax) == 0) { mp3.play(14); //dice zero } delay(1000); // ritardo mp3.play(13); //dice virgola delay(1000); //arrotonda ai centesimi dec = (vmax * 10) + .5; // calcola i decimi di volt dec = dec % 10; if (dec > 0) { // dice i decimi di volt mp3.play(dec); } else if (dec == 0) { mp3.play(14); //dice zezo } delay(800); mp3.play(11); //dice volts delay(600); } |
Versione del progetto ridotta
Nel caso non foste in possesso del display o voleste solo provare le capacità del modulo, è possibile assemblare lo schema sotto riportato, in cui non è presente il modulo display.
Sketch utilizzato
Sotto è riportato lo sketch, in cui è stata eliminata la sezione di gestione del display, da caricare nella memoria di Arduino per trasformare lo shield DFPlayer in un voltmetro parlante.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
#include "SoftwareSerial.h" #include "DFRobotDFPlayerMini.h" //Impoostazione per voltmetro int pinval = 0; int oldpinval = 0; // Pin analogico lettura int pin_tensione = A0; float vout = 0.0; double vmax; int dec; float refVolt = 5.1;//valore alimentazione SoftwareSerial ss(2, 3); //RX, TX DFRobotDFPlayerMini mp3; void setup() { ss.begin(9600); Serial.begin(9600); delay(500); if (!mp3.begin(ss)) { Serial.println("Errore mp3"); for (;;); } mp3.volume(15); } void loop() { // Legge il pin analogico pinval = analogRead(pin_tensione); //converte il valore letto vmax = pinval * (refVolt / 1024.0); Serial.print ("Valore PIN: " ); Serial.println (pinval); Serial.print ("Valore in volt: " ); Serial.println (vmax, 1); if (pinval != oldpinval) { oldpinval = pinval; // Riproduce a voce il valore letto speakvoltage(); delay (2000); } } void speakvoltage() { if (int(vmax) > 0) { mp3.play(int(vmax)); //dice i volt } else if (int(vmax) == 0) { mp3.play(14); //dice zero } delay(1000); // ritardo mp3.play(13); //dice virgola delay(1000); //arrotonda ai centesimi dec = (vmax * 10) + .5; // calcola i decimi di volt dec = dec % 10; if (dec > 0) { // dice i decimi di volt mp3.play(dec); } else if (dec == 0) { mp3.play(14); //dice zezo } delay(800); mp3.play(11); //dice volts delay(600); } |
Video con altri progetti con moduli audio
Modulo JQ6500
Modulo WYV20SD-16P
Modulo LPM11162
Su questo sito sono già stati presentati molti moduli che permettono di decodificare file in vari formati come WAV o MP3, gestibili tramite comandi manuali oppure trasmessi, di solito in seriale, da schede come Arduino.
LPM11162 (fuori produzione) |
WTV020-SD |
JQ6500 |
WT588D-16P |
Modulo wireless MP3 |
XY-V17-B-D |