Go Down

Topic: gravar audio com Arduino (Read 2864 times) previous topic - next topic

arilson

Aí galera,
Tenho uma opção de projeto que consiste em  receber um sinal de audio e armazena-lo para coleta posterior.
Duvidas:

Qual a taxa de amostragem possível com o arduino? Ou a frequência máxima possível de ser amostrada?

Seria melhor usar um A/D e buscar estes dados via i2c, ou mesmo paralelos?

Alguém conhece algum projeto parecido?

Valeu galera até mais!! ;)

neuron_upheaval

Oi, já viu algo a respeito do chipcorder ISD17xx? São CIs que integram a solução completa de gravação e reprodução de áudio. Você poderia interfacear um desses com o Arduino via SPI, mas o chipcorder também pode rodar stand-alone se você quiser.

neuron_upheaval

#2
Feb 04, 2009, 04:45 pm Last Edit: Feb 04, 2009, 04:48 pm by neuron_upheaval Reason: 1
Eu tenho dois modelos: ISD1740 e ISD17120. A diferença entre eles é o tempo máximo nominal de gravação (40 s e 120 s, a 8 kHz, aproximadamente). A taxa de amostragem é mudada com um resistor externo e pode ir de 4 a 12 kHz.

Na verdade, o único componente ativo é o próprio CI, os demais são todos passivos. A potência de saída do CI é de 1/4 W; se você precisar de mais, aí sim você vai precisar de um amp de potência.

silverbolt

Neuron
vc. tem algum exemplo pratico rodando o ISD 17XX com arduino ?
to com uma grande dificuldade em utiliza-lo.

[]'s

Silverbolt
Acesse: www.symphony.com.br

neuron_upheaval

Olá silverbolt,

Já usei o ISD 17xx em modo standalone. Não usei ainda ele em modo SPI.

No final de semana vou tentar fazer uma montagem com ele, usando o Arduino para enviar dados via SPI, e daí te dou um alô.

arilson

Valeu pessoal,
mas fiquei com uma duvida (no datasheet),
Pelo que entendi eu posso enviar  dados (comandos) para o CI para controla-lo;
Mas não ficou claro se posso ler os dados gravados no CI através do arduino (na verdade nem sei se posso enviar grandes quantidades de dados pela SPI).

o projeto
* gravar amostras de audio
* digitaliza-las
* envia-las para um servidor.
este CI é mesmo muito bacana e simplifica muita coisa,
se eu puder extrair os dados...


neuron_upheaval

Olá arilson,

É isso mesmo, o CI não permite gravação em ou leitura direta a partir da memória porque o formato dos dados é patenteado.

neuron_upheaval

#7
Feb 09, 2009, 04:29 am Last Edit: Feb 09, 2009, 04:31 am by neuron_upheaval Reason: 1
Olá pessoal,

A comunicação SPI funcionou!

Fiz uma biblioteca para controlar a família ISD 1700 via SPI, ela está em:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1234149784/0

[]s


arilson

Obrigado meus caros,
        Minha placa da Libelium acaba de chegar, hoje ainda começo os testes, vou captar direto pela entrada analógica do Arduino e ver qual taxa máxima de amostragem.
Segundo o Datasheet o uControlador pode atingir até 15 k de amostras por segundo (resolução de 10 bits), suficiente pro meu caso, porem vamos ver no que o boot-loader vai interfirir.    
       Quanto ao ISD1700 não me atende mas agradeço a dica, posto aqui o resultado dos testes em breve
valeu :)

neuron_upheaval

#9
Feb 14, 2009, 05:50 pm Last Edit: Feb 14, 2009, 05:51 pm by neuron_upheaval Reason: 1
Arilson,

Eu estava pensando aqui o seguinte: você quer pegar 10 bits de dados a 15kSPS... 10 x 15000 = 150kbauds. Isso só de dados, sem contar com os bits de conferência de erros (paridade, CRC etc.)

Como você vai fazer para enviar esses dados para o servidor? Acho que por serial não dá. Por I2C talvez dê, pois o máximo que o I2C suporta é 400 kHz; já o SPI aguentaria, mas pode acontecer atenuação do sinal se ele tiver que trafegar por distâncias tais como a do circuito ao PC.

arilson

Ola Neuron,
na verdade eu não preciso enviar os dados a medida que recebo o sinal,
penso em digitalizar o sinal na melhor resolução possível e grava-lo.
   Depois com tempo envio o pacotão na medida em que minha banda permitir, por essa razão sua dica do ISD 1700 seria pra mim uma saida  perfeita, se eu pudesse acessar os dados gravados no CI :'(.
   Mas você tem razão, vai ser uma balaida de Bytes (MegaBytes) o ideal seria uma gravação de 3 minutos.
   Você por acaso não conhece um CI parecido com o isd1700 mas com acesso aos dados?
Até mais e obrigado pela ajuda!!  

neuron_upheaval

Que tal a série ISD15100? Parece que ela permite acesso direto a memória e compressão de dados.

arilson

   parece ser esse,
dei uma olhada no datashet e ele tem comandos de leitura de dados, agora preciso descolar um desses, enquanto isso continuam os testes com a entrada analógica do arduino!!
Valeu Neuron, caso consiga novidades posto aqui!!

Por enquanto estou me ambientando, testei esse programa chamado pelo dono de osciloscópio de pobre
o original está aqui:
http://accrochages.drone.ws/sites/accrochages.drone.ws/files/Oscilloscope.pde
 
consegui uma frequência de 33Hz
coloquei uma grade de ~4 segundo por 1 Volt
o código modificado está aqui:
Code: [Select]

/*
* Oscilloscope
* Gives a visual rendering of analog pin 0 in realtime.
*
* This project is part of Accrochages
* See http://accrochages.drone.ws
*
* (c) 2008 Sofian Audry (info@sofianaudry.com)
*
* Modificado por:
*
* Arilson Mendes (arilsonm@gmail.com) em 02/2009
*  
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>
. */
import processing.serial.*;

Serial port;  // Create object from Serial class
int val;      // Data received from the serial port
int[] values;
int i;
void setup()
{
 size(640, 480);
 // Open the port that the board is connected to and use the same speed (9600 bps)
 port = new Serial(this, Serial.list()[0], 9600);
 values = new int[width];
 smooth();
}

int getY(int val)
{
 return (int)(val / 1023.0f * height) - 1;
}

void draw()
{
 
 while (port.available() >= 3) {
   if (port.read() == 0xff) {
     val = (port.read() << 8) | (port.read());
   }
 }
 for (int i=0; i<width-1; i++)
   values[i] = values[i+1];
 values[width-1] = val;
 background(0);
 stroke(255);
  grade();
 for (int x=1; x<width; x++)
 {
   line(width-x,   height-1-getY(values[x-1]), width-1-x, height-1-getY(values[x]));
         
 }
}
void grade()
{
  stroke(0,200,0);
  for (i=1;i<5;i++)
  {
    line(width-2 ,  height/5*i,width-(width-2) , height/5*i);
  }
  for (i=3;i<20;i+=3)
  {  
    line(width/20*i ,  height,width/20*i , 0);  
  }
}      
   

/*
// The Arduino code.

#define ANALOG_IN 0

void setup() {
 Serial.begin(9600);
}

void loop() {
 int val = analogRead(ANALOG_IN);
 Serial.print( 0xff, BYTE);
 Serial.print( (val >> 8) & 0xff, BYTE);
 Serial.print( val & 0xff, BYTE);
}

*/



A razão da frequencia tão baixa (33Hz) é a comunicação serial,
inté

Go Up