Motorașul meloman
Multe aplicații de divertisment necesită combinarea redării audio cu comanda unei mișcări care, cel mai adesea, este implementată cu ajutorul unui motor electric. În cadrul proiectului de față vom vedea cum putem realiza acest lucru: redarea unei piese audio și comanda simultană a unui servomotor (a fost ales acest tip de motor deoarece este un motor ce poate realizări mișcări de precizie – se poate ușor modifica exemplul pentru un alt tip de motor electric).
Pentru implementarea exemplului vom utiliza o placă de dezvoltare Arduino UNO, un servomotor 9g și un modul de redare audio Adafruit VS1053:
https://www.robofun.ro/mecanice/servo/servomotor_9g
Schema de interconectare dintre componente este următoarea:
Modulul Adafruit VS1053 este un modul bazat pe circuitul DSP VS1053 ce este capabil să redea o varietate mare de formate audio (MP3, AAC, OGG, WMA, MIDI, FLAC, WAV) și chiar să înregistreze flux audio cu codare PCM (WAV) sau OGG. Conexiunile cu placa de dezvoltare sunt următoarele:
- alimentare: pinul 3.3V al modulului la pinul 3.3V al plăcii de dezvoltare, GND la GND;
- pin SCLK modul – pin D13 placă de dezvoltare;
- pin MISO modul – pin D12 placă de dezvoltare;
- pin MOSI modul – pin D11 placă de dezvoltare;
- pin CS modul – pin D10 placă de dezvoltare;
- pin RST modul – pin D7 placă de dezvoltare;
- pin XDCS modul – pin D8 placă de dezvoltare;
- pin SDCS modul – pin D4 placă de dezvoltare;
- pin DREQ modul – pin D3 placă de dezvoltare;
- mufă jack audio: AGND – pin centru mufă, LOUT – pin stânga margine mufă, ROUT – pin dreapta margine mufă.
Funcționarea modulului necesită un card microSD pe care să încărcăm un fișier audio – programul dispozitivului se așteaptă ca fișierul redat să aibă numele 1.mp3 dar acest lucru poate fi modificat. Mufa jack audio poate fi utilizată pentru conectarea unor boxe pasive dar pentru un volum decent se recomandă utilizarea unor boxe active (cu alimentare proprie și amplificare).
Pentru mai multe informații legate de utilizarea modului Adafruit VS1053 puteți consulta:
Adafruit VS1053 MP3/AAC/Ogg/MIDI/WAV Codec Breakout Tutorial
https://learn.adafruit.com/adafruit-vs1053-mp3-aac-ogg-midi-wav-play-and-record-codec-tutorial/
Comanda servomotorului utilizează pinul D9 (plus alimentare 5V și GND). În cazul în care se dorește manipularea unui obiect de dimensiuni mai mari se poate utiliza un servomotor mai puternic dar trebuie avut în vedere faptul că un astfel de motor este posibil să necesite alimentare suplimentară față de ce oferă placa de dezvoltare.
Programul va utiliza biblioteca Adafruit VS1053 externă mediului Arduino IDE:
https://github.com/adafruit/Adafruit_VS1053_Library
#include <SPI.h>
#include <Adafruit_VS1053.h>
#include <SD.h>
#include „Servo.h”
#define BREAKOUT_RESET 7
#define BREAKOUT_CS 10
#define BREAKOUT_DCS 8
#define CARDCS 4
#define DREQ 3
Adafruit_VS1053_FilePlayer musicPlayer =
Adafruit_VS1053_FilePlayer(BREAKOUT_RESET, BREAKOUT_CS,
BREAKOUT_DCS, DREQ, CARDCS);
#define SERVO_PIN 9
Servo myservo;
int pos = 10;
În cadrul secțiunii setup() se vor inițializa obiectele necesare interacțiunii cu servomotorul și cu modulul VS1053:
void setup() {
myservo.attach(SERVO_PIN);
Serial.begin(9600);
Serial.println(„Motorasul meloman”);
if (! musicPlayer.begin()) {
Serial.println(F(„Nu gasesc VS1053…”));
while (1);
}
Serial.println(F(„VS1053 ok”));
if (!SD.begin(CARDCS)) {
Serial.println(F(„Eroare SD…”));
while (1);
}
Serial.println(„SD ok”);
musicPlayer.setVolume(0,0);
if (! musicPlayer.
useInterrupt(VS1053_FILEPLAYER_PIN_INT))
Serial.println(F(„Pinul DREQ nu este pin
de intrerupere externa…”));
}
Secțiunea loop() va comanda redarea fișierului audio și va mișca servomotorul cu 5o la fiecare secundă scursă din melodie (de la 10o până la maxim 170o). La finalul piesei audio se va readuce servomotorul la poziția de 10o. Ciclul se va relua după o oră (360 secunde = 60 minute). Folosind capacitatea modulului Adafruit VS1053 de a reda piesa audio independent de rularea programului pe placa Arduino se pot imagina diverse alte combinații de mișcare a servomotorului în paralel cu redarea audio (legănare, modificare viteză de mișcare, indicare a timpului scurs ș.a.m.d.).
void loop() {
musicPlayer.playFullFile(„1.mp3”);
if (! musicPlayer.startPlayingFile(„1.mp3”)) {
Serial.println(„Nu pot accesa 1.mp3 …”);
while (1);
}
Serial.println(F(„Start”));
while (musicPlayer.playingMusic) {
Serial.print(„.”);
if (pos<170) myservo.write(pos);
pos += 5;
delay(1000);
}
Serial.println(„Gata”);
for (int i=pos; i>10; i-=5) myservo.write(pos);
delay(60000);
}
Programul a fost dezvoltat și testat cu Arduino IDE 1.6.12, Arduino AVR Boards 1.6.14 și biblioteca Adafruit VS1053 1.0.0.
Pentru documentare suplimentară puteți consulta și următoarele proiecte:
Arduino MP3 player with DTMF decode to control servos and PWM (RGB LEDS)
Arduino DCC Function Servo Sound decoder
https://rudysmodelrailway.wordpress.com/2015/02/11/arduino-dcc-function-servo-sound-decoder/
Turn body movement into music with Arduino
https://blog.arduino.cc/2016/05/13/turn-body-movement-into-music-with-arduino/
Moving a Servo To Sound Signals
http://www.instructables.com/id/Moving-a-Servo-To-Sound-Signals/
Christmas Greeting Wreath Arduino and MP3
http://www.instructables.com/id/Christmas-Greeting-Wreath-Arduino-and-MP3/