запись голоса на ардуино.

akz
Offline
Зарегистрирован: 08.11.2011

 Хочу записать свой голос на ардуино, а потом его произвести.Написал программу сейчас под рукой нет ардуино чтобы проверить код.Что думаете?

1.int i = 0;
2.void setup(){
3.Serial.begin(9600);
4.pinMode(5,INPUT);
5.pinMode(3,INPUT);
6.pinMode(7,INPUT);
7.pinMode(1,OUTPUT);
8.}
9.void loop(){
10.while (digitalRead(5) == HIGH){ //пока кнопка нажата считываем частоту и записываем ее в массив.
11.delay(5);
12.val = pulseIn(7,HIGH) + pulseIn(7,LOW);
13.Serial.println(1000000/val);//так мы получаем частоту т.к
14.1/(val/1000000) = 1000000/val
15.int myArray[] = Serial.read;
16}
17.while(digitalRead(3) == HIGH){ //пока 2-ая кнопка нажата воспроизводим записанное
18.delay(5);
19.i = 0;
20.i++;
21.tone(1,myArray[i],5000);
22.}
 

alix1995alix
Offline
Зарегистрирован: 30.11.2011

Попробуй в протеусе провер, ком порт там есть, источник сигнала там тоже есть, ну и увидиш какие ошибки это может выдать.

Микрофон то наверное надо подключать через микрофонный усилитель, а то сигнал будет слишком слабым, или как вы записывать его собираетесь?

 

akz
Offline
Зарегистрирован: 08.11.2011

alix1995alix пишет:

Микрофон то наверное надо подключать через микрофонный усилитель, а то сигнал будет слишком слабым, или как вы записывать его собираетесь?

 

 Да микрофонный усилитель уже собран и проверен схему взял отсюда:http://www.cxem.net/sound/soundpred/soundpred5.php

akz
Offline
Зарегистрирован: 08.11.2011

микрофон у меня электретный.

Заново выставляю код, потому что в первом были ошибки.

1.int i = 0;
2.void setup(){
3.Serial.begin(9600);
4.pinMode(5,INPUT);
5.pinMode(3,INPUT);
6.pinMode(7,INPUT);
7.pinMode(1,OUTPUT);
8.}
9.void loop(){
10.while (digitalRead(5) == HIGH){ //пока кнопка нажата считываем частоту и записываем ее в массив.
11.delay(5);
12.val = pulseIn(7,HIGH) + pulseIn(7,LOW);
13.delay(1);
14.Serial.println(1000000/val);//так мы получаем частоту т.к 1/(val/1000000) = 1000000/val
15.int myArray[] = Serial.read;
16}
17.while(digitalRead(3) == HIGH){ //пока 2-ая кнопка нажата воспроизводим записанное
18.delay(5);
19.i = 0;
20.i++;
21.tone(1,myArray[i],5000);
22.} 

 

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Что то я в коде логики не вижу. 

Причем тут голос и tone?

Звуки записывать нужно через аналоговый порт

Но проблема в том что оперативки не зватит даже для щелчка, не говоря уже о более серьезном звуке

Вернее только и хватит для щелчка

 

akz
Offline
Зарегистрирован: 08.11.2011

carduino.ru пишет:

Причем тут голос и tone?

tone - функция воспроизводящая сигнал определенной частоты.

carduino.ru пишет:

Но проблема в том что оперативки не зватит даже для щелчка, не говоря уже о более серьезном звуке

да об этом я не подумал тогда, что делать покупать ram?

carduino.ru пишет:

логики не вижу


 

 почему все логично функция pulseIn используется мной для измерения частоты т.к pulseIn(7,HIGH) + pulseIn(7,LOW) = T в микросекундах.T/1000000 = T в секундах,а дальше вспоминаем физику f=1/T

 

 

akz
Offline
Зарегистрирован: 08.11.2011

принципи место pilseIn можно использовать функцию freqcounter http://www.interface.khm.de/index.php/lab/experiments/arduino-frequency-counter-library/

carduino.ru
Offline
Зарегистрирован: 06.12.2011

akz пишет:
 

 почему все логично функция pulseIn используется мной для измерения частоты т.к pulseIn(7,HIGH) + pulseIn(7,LOW) = T в микросекундах.T/1000000 = T в секундах,а дальше вспоминаем физику f=1/T

 
 

Потому что кроме длительности еще и уровень семпла нужно измерять.

Еще нужно все измерения привязать к частоте семплинга которая как минимум должна быть 2*Fmax.

Минимальная частота для записи голоса 8000Гц , Что соответствует диапазону частот голосового спектра 100-4000Гц