Basata sull'integrato ISD1760PY, questa shield per Arduino (Duemilanove, UNO o Mega), permette di registrare e riprodurre fino a 60 secondi di musica e parlato.
L'accoppiamento ad Arduino è reso molto semplice grazie ad un'apposita libreria da caricare nello sketch, che provvede alla gestione del chip vocale ISD.
Dispone di vari pulsanti di controllo (REC, PLAY, FWD, ERASE, VOL, ecc), capsula microfonica, una presa jack da c.s. per l'ingresso audio di linea e una presa per l'uscita audio.
La registrazione dei messaggi si effettua direttamente tramite la capsula microfonica, l'ingresso audio di linea IN può essere utile per registrare messaggi o musica provenienti da una fonte esterna (piastre a cassette, lettori MP3, mixer ecc).
La shield preleva l'alimentazione dai contatti 5 V e GND di Arduino.
Particolarmente utile per attivare dei messaggi a voce al verificarsi di un evento in un impianto di allarme, per un controllo I/O generico e per domotica, oppure per far riprodurre un avviso quando viene rilevato l'approssimarsi di una persona o di un veicolo in una zona.
Dimensioni (mm): 71x53.
Il seguente sketch permette di gestire le funzioni della shield.
#include
ISD1700 chip(10); // Initialize chipcorder with
// SS at Arduino's digital pin 10
int apc=0;
int vol=0; //volume 0=MAX, 7=min
int startAddr=0x10;
int endAddr =0x2DF;
int inInt=0;
void setup()
{
apc = apc | vol; //D0, D1, D2
//apc = apc | 0x8; //D3 comment to disable output monitor during record
apc = apc | 0x50; // D4 D6 select MIC REC
//apc = apc | 0x00; // D4 D6 select AnaIn REC
//apc = apc | 0x10; // D4 D6 select MIC + AnaIn REC
apc = apc | 0x80; // D7 AUX ON, comment enable AUD
apc = apc | 0x100; // D8 SPK OFF, comment enable SPK
//apc = apc | 0x200; // D9 Analog OUT OFF, comment enable Analog OUT
//apc = apc | 0x400; // D10 vAlert OFF, comment enable vAlert
apc = apc | 0x800; // D11 EOM ON, comment disable EOM
Serial.begin(9600);
Serial.println("Sketch is starting up");
}
void loop()
{
char c;
if(Serial.available())
{
/* Power Up */
chip.pu();
c = Serial.read();
switch(c)
{
case 'A':
Serial.println(chip.rd_apc(), BIN);
break;
case 'Y':
chip.play();
break;
case 'P':
chip.stop();
delay(500);
break;
case 'E':
chip.erase();
delay(500);
break;
case 'R':
chip.rec();
break;
case 'F':
chip.fwd();
delay(500);
break;
case 'Z':
chip.g_erase();
delay(500);
break;
case 'I':
Serial.println(chip.devid(), BIN);
break;
case 'W':
Serial.println(apc, BIN);
chip.wr_apc2(apc); //
break;
case 'S':
Serial.println(chip.rd_status(), BIN);
break;
case '>':
startAddr=SerialIn();
Serial.print("startAddr: ");
Serial.println(startAddr);
break;
case '<':
endAddr=SerialIn();
Serial.print("endAddr: ");
Serial.println(endAddr);
break;
case 'y':
chip.set_play(startAddr,endAddr);
break;
case 'r':
//chip.set_erase(startAddr,endAddr);
//delay(500);
chip.set_rec(startAddr,endAddr);
break;
case 'e':
chip.set_erase(startAddr,endAddr);
delay(500);
break;
}
Serial.print("Status---> ");
Serial.print(chip.CMD_ERR() "CMD_ERR ": "OK ");
Serial.print(chip.PU() "PU ": "NO PU ");
Serial.print(chip.RDY() "RDY ": "Not_RDY ");
Serial.print(chip.rd_status(), BIN);
Serial.println();
delay(1000);
}
}
int SerialIn(){
inInt=0;
while (Serial.available() <= 0)
{
delay(300);
}
while (Serial.available()) {
// get the new byte:
char c = Serial.read();
// add it to the inputString:
inInt = (inInt*10) + (c-48);
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (c == 'n') {
//stringComplete = true;
Serial.print("stringComplete ");
}
}
//c = Serial.read()-48;
//mess(c);
return (inInt);
}
/*
void mess(int num){
Serial.print("num: ");
Serial.println(num);
startAddr=(0x50*num)+0x10;
endAddr=(startAddr+0x50)-1;
Serial.print("startAddr: ");
Serial.print(startAddr, HEX);
Serial.print(" - endAddr: ");
Serial.println(endAddr, HEX);
}
*/