Обсуждаем контроллеры компании Atmel.
Ответить

Re: Ардуино - запись звука

Пт июл 01, 2022 15:01:58

бсд 4 бита соответствует хексу - преобразовывать ничего не надо.

а вот обратно - только если повезёт :roll: (если в младшей тетраде не окажется записано число больше 9) тебе, похоже повезло... но тут все вопросы к источнику числа...

Re: Ардуино - запись звука

Пт июл 01, 2022 15:23:36

Как так получается что если я присваиваю переменной младшую тетраду шестнадцатиричного числа то получаю в переменной ее десятичное выражение и смогу вывести ее в lcd в десятичном виде.

А вот так: от 0 до 9 числа совпадают.

Изображение

Re: Ардуино - запись звука

Пт июл 01, 2022 16:27:38

Все понятно

Re: Ардуино - запись звука

Вт июл 26, 2022 10:13:17

olegue писал(а):а вот это надо бы попробовать

попробуй ещё добавить стабилизацию входа... как советует даташит.



Цитирю сообщение полносттью потому что помогло. Теперь значения стоят как вкопанные!

Добавлено after 2 hours 8 minutes 57 seconds:
не могу понять! Запись начинается лишь спустя 3-4 секунды после нажатия на кнопку. В чем может быть проблема?
вот весь скетч


Добавлено after 16 minutes 46 seconds:
фонарик зажигается сразу , а преобразование начинается только через 3-4 сек. Странная ситуация

Добавлено after 8 hours 32 minutes 33 seconds:
загрузил оригинал . и там такая же фигня. Запись начинает только со 3-4 секунды


Добавлено after 23 minutes 24 seconds:
Нашел проблему. На карте было 5000 файлов. Очистил карту - проблема решилась . Запись теперь сразу пишется, без задержек.

Добавлено after 1 hour 37 minutes 51 second:
Подскажите плз,как мне теперь сделать проигрывание файлов в этом же скетче. Какие могут быть варианты?

у меня есть сложный вариант. Вот отсюда http://avr-start.ru/?p=1874
код для Меги8



как-то попытаться засунуть в скетч или сделать библиотеку. А может есть уже готовая легкая библиотека чисто для проигрывания?

Добавлено after 1 minute 45 seconds:
и что бы она не конфликтовала с текущим кодом.

Re: Ардуино - запись звука

Вт июл 26, 2022 12:51:47

ты решил нас добить своими библиотеками... )) сделай всё на чистом AVR да и всё )) :facepalm:

а лучше бы сделал не запись звука... а передачу звука)) раз со звуком ты уже разобрался...

в сети столько проектов интересных... работа со звуком...
начиная от самодельного GSM телефона...
GSM.jpg
(68.36 KiB) Скачиваний: 28

набор.jpg
(26.91 KiB) Скачиваний: 27

телефон.jpg
(62.76 KiB) Скачиваний: 35

...
есть простое управление с телефона...
авто.jpg
(58.6 KiB) Скачиваний: 22

есть ГОЛОСОВОЕ управление с телефона... говоришь "лампочка гори !"... и лампочка горит))
команды голосом.jpg
(52.67 KiB) Скачиваний: 26

:)

Добавлено after 3 minutes 47 seconds:
а лучше сделал бы самодельный типа Скайп))
схема.jpg
(50.42 KiB) Скачиваний: 32

через бесплатный Wi-Fi...
1.jpg
(39.78 KiB) Скачиваний: 29

живое общение намного интересней чем просто писать/читать флешки))
VoIP.jpg
(49.16 KiB) Скачиваний: 33

:tea:

Re: Ардуино - запись звука

Вт июл 26, 2022 15:09:54

Это все в планах. Про номеранобератель идея - крутая. Я тоже как то об этом думал.

Добавлено after 35 seconds:
но надо сначало порешать с выводом звука

Добавлено after 1 hour 29 minutes 41 second:
есть ГОЛОСОВОЕ управление с телефона... говоришь "лампочка гори !"... и лампочка горит))



а без телефона каккие есть варианты ГОЛОСОВОГО управления ? чисто на ардуино

Добавлено after 26 seconds:
ну или на АВР

Re: Ардуино - запись звука

Вт июл 26, 2022 21:45:32

звук...

на ардуино + флешке можно сделать... автоответчик))
в совсем старых телефона автоответчик делали на кассетах))
1.jpg
(36.49 KiB) Скачиваний: 32

в не таких старых телефонах автоответчик делали на флешке... встроенная флешка...
2.jpg
(39.06 KiB) Скачиваний: 29

:roll:
ещё можно сделать голосовое оповещение )) тупо записать на флешку разные короткие сообщения... а затем ардуина будет их воспроизводить в зависимости на какую кнопку нажать))

записываешь команды... потом нажимаем на кнопки... Ардуина говорить голосом все команды))
голосовой ответчик.jpg
(74.66 KiB) Скачиваний: 32

аналогичным образом работал автоответчик на старых телефонных станциях...
АТС.jpg
(105.07 KiB) Скачиваний: 34

связисты его называли "Какаду" ))
какаду.jpg
(42.82 KiB) Скачиваний: 32

))
набираешь служебный номер типа 097...
а автоответчик АТС тебе говорит: "температура воздуха в центре города +20 градусов".

причём четко слышно что это "склейка"... иногда даже из разных голосов)) это же кто-то сидел записывал))
:))

набираешь служебный номер типа 085...
а автоответчик АТС тебе говорит: "наберите номер вашего телефона".
набираешь номер своего телефона с помощью дтмф клавиатуры...
дтмф.jpg
(52.78 KiB) Скачиваний: 25

а автоответчик АТС тебе говорит: "на вашем счету 100 рублей".
:)
всё это умеет делать и Ардуина)) можно сделать управление с любого телефона с помощью дтмф кодов...
Адруина всё оцифрует... и расшифрует команду...
частоты.jpg
(44.25 KiB) Скачиваний: 25

затем голосов скажет "кнопка один нажата"... )) и т.д.
:))
ещё ардуина умеет синтезировать простые сигналы... типа генератор сигналов))

с голосовым управлением чуть сложнее...
:roll:

конкретно тут голосовое правление сделали на сервисе гугла... голос распознаёт сервер гугл))
команды голосом.jpg
(55.09 KiB) Скачиваний: 28

аналогично работает и яндекс станция алиса...
https://www.youtube.com/watch?v=Kru5-hfMKTU
короче... всё работает через Интернет))

теоретически можно сделать свой сервер распознавания голоса...
надо подумать...
:roll:

простейший вариант - записать в ардуину сначала набор голосовых команд...

потом при поступлении новой голосовой команды Ардуина просто сравнивает новую команду с ранее записанными...

при совпадении Ардуина выполняет команду...
голосовое управление.jpg
(97.32 KiB) Скачиваний: 31

это Ардуина умеет))
:)
вопрос только в точности сравнения... но над этим можно поработать))
:tea:

Re: Ардуино - запись звука

Вс июл 31, 2022 09:47:26

подскажите пож, правильно ли я понимаю тему.

Atmega328, биты ADCH и ADCL

Известно,что у этого МК один АЦП, и он 10ти битный. У меня вопрос по результату преобразования.

1. Результат преобразования всегда 10ти битный? Вне зависимости от "других настроек"?
2. Если я читаю только ADCH то получаю 8битный результат?

Вывод: "битность" результата зависит от того как я его считываю (выше написал)?

Добавлено after 3 minutes 46 seconds:
но так как ADCH и ADCL 8ми битные регистры,то потенциально резушьтат может быть 16ти битный. Это, как я понял для совместимости сделано со старшими моделями?

Re: Ардуино - запись звука

Вс июл 31, 2022 09:56:39

Как ни странно ( :) ), все ответы - в документации чипа.

ATmega328, стр. 246:
10-bit Resolution

При чтении ADCL регистр данных ADC не обновляется до тех пор, пока не будет прочитан ADCH. Следовательно, если в результате останется корректируется и требуется не более 8-битной точности, достаточно прочитать ADCH. В противном случае ADCL должен быть сначала читать, потом ADCH.
Вложения
328_adc.jpg
(77.94 KiB) Скачиваний: 29

Re: Ардуино - запись звука

Вс июл 31, 2022 10:35:34

olegue писал(а):Atmega328, биты ADCH и ADCL

Atmega328, регистры ADCH и ADCL
olegue писал(а):1. Результат преобразования всегда 10ти битный? Вне зависимости от "других настроек"?

да.
olegue писал(а):2. Если я читаю только ADCH то получаю 8битный результат?

результат зависит от того как настроен АЦП...
olegue писал(а):Вывод: "битность" результата зависит от того как я его считываю (выше написал)?

результат зависит от того как настроен АЦП...
olegue писал(а):но так как ADCH и ADCL 8ми битные регистры,то потенциально резушьтат может быть 16ти битный.

да.
olegue писал(а):Это, как я понял для совместимости сделано со старшими моделями?

нет.
просто 10-ти битный результат не влез в один регистр...
пришлось делать два регистра...
ADCH = 00000011
ADCL = 11111111
итого: 10 бит.

Re: Ардуино - запись звука

Вс июл 31, 2022 10:45:26

т.е если я делаю
rs=ADCW, то получаю в rs 10ти битное представление результата

а если выравнивают влево (ADLAR=1) и делаю rs=ADCH, то получаю 8битное представление результата?

Re: Ардуино - запись звука

Вс июл 31, 2022 11:09:33

Два резултата (ADCL и ADCH): по 8 бит.
Для 10 бит: необх. собрать результат: rs = ADCH << 8 | ADCL;
Для 8 бит: чтение только ADCH при ADLAR = 1 (mode = Left Adjust)

в некоторых компиляторах (avr-gcc) уже сделано, просто берете то, что нужно:
int16_t rs = ADCW;

И нужно дождаться времени конверсии. Лучше всего: проверив соответствующий бит:
напр. while (bit_is_set(ADCSRA, ADSC));

С 8 битами / против 10 бит / выигрываете время, но теряете разрешение.

Re: Ардуино - запись звука

Вс июл 31, 2022 14:05:28

//ADLAR=1
// Выравнивание результата в левую сторону < (8-бит):
// ADCH // 1111 1111 - читать вторым (или первым, тогда последние 2 бит потеряем)
// ADCL // 0000 0011 - читать первым

//ADLAR=0
// Выравнивание результата в правую сторону > (10-бит):
// ADCH // 0000 0011 - читать вторым
// ADCL // 1111 1111 - читать первым

:roll:

я всегда делаю так:
//ADLAR=0
// Выравнивание результата в правую сторону > (10-бит):
// ADCH // 0000 0011 - читать вторым
// ADCL // 1111 1111 - читать первым

rs=ADCW, получаю в rs 10-ти битное представление результата.
:tea:

Re: Ардуино - запись звука

Вт авг 02, 2022 10:00:11

мнне нужно обрабатывать 1-2-3 нажатие в пределах времени. посмотрите опытным глазом

flag=0
count=0

if (digitalRead(5) ==LOW && timerON==0) //нажали
{
timerON=1; // включим таймер
timer=millis();
}


if (digitalRead(5) ==LOW && timerON==1 && millis()-timer<600 && flag==0 && count<3) //нажали, таймер включен
{
count++; // зачтем нажатие
flag=1; // флаг регистрации состояния кнопки (нажата/отпущена)
}


if (digitalRead(5) ==HIGH && timerON=1) //отпустили кнопку в пределах времени работы таймера
{
flag=0; //

}

if (millis()-timer>600) {timerON=0;} // отключу таймер (время вышло)

далее в переменной count должно быть количество нажатий.

Re: Ардуино - запись звука

Вт авг 02, 2022 12:35:26

не вижу антидребезг...
дребезг.jpg
(34.43 KiB) Скачиваний: 24

:roll:

Добавлено after 18 minutes 44 seconds:
мы делали отдельные кнопки))
https://www.youtube.com/watch?v=qWojRM-tjP0

антидребезг...


мы опрашивали кнопки отдельно в прерывании... устанавливали флаг нажатия кнопки...

interrupt [TIM0_OVF] void timer0_ovf_isr(void) // 4.000.000/8=500.000/256= цикл 1.953 ,125
{
if (PIND.5==0) flag_k0 = 1; // флаг кнопки 0 // (........) 0- Вкл(Выкл)меню
if (PIND.6==0) flag_k1 = 1; // флаг кнопки 1 // (........) 1- Выбор меню / Вкл(Выкл) LCD
if (PINB.0==0) flag_k3 = 1; // флаг кнопки 3 // (....1...) 3- Вкл(Выкл) фары
//if (PINC.4==0) flag_k4 = 1; // флаг кнопки 4 // скорость
if (PIND.7==0) flag_k5 = 1; // флаг кнопки 5 // (..1.....) 5- Вкл(Выкл) резервный аккумулятор
if (PINC.3==0) flag_k6 = 1; // флаг кнопки 6 // (.1......) 6- Вкл выгрузка
if (PINC.5==0) flag_k7 = 1; // флаг кнопки 7 // 7- круиз-контроль
}


а антидребезг делали в основной программе...

/////////////////////////////////////////////////////////////////////////
///////////////////////////////////// (....1...) 3- Вкл(Выкл) фары
//if ( (PINB.0==0) && (k3==0) ) { // цикл 31,25 ms
if ( (flag_k3) && (k3==0) ) { // цикл 31,25 ms
k3++; // счёт
// kb3 = ~kb3; // kb3 - буфер
PORTB.1=1; // звук зуммер - вкл.

k = k ^ 0b00001000; // (....1...) 3- Вкл(Выкл) фары

};
if ( (8>k3) && (k3) ) {k3++;}; // счёт
if (k3 == 8) {
PORTB.1=0; // звук зуммер - выкл.
k3++;
};
///////////////////////////////
if ( (PINB.0==1) && (k3 == 9) ) {k3++;};
if (k3 > 9) {k3++;}; // счёт
if (k3 == 17) {
k3=0; // сброс
flag_k3=0; // сброс
};
/////////////////////////////////////////////////////////////////////////

:roll:

хотя можно всё делать и в основной программе...

/////////////////////////////////////////////////////////////////////////
///////////////////////////////////// (....1...) 3- Вкл(Выкл) фары
if ( (PINB.0==0) && (k3==0) ) { // цикл 31,25 ms
//if ( (flag_k3) && (k3==0) ) { // цикл 31,25 ms
k3++; // счёт
// kb3 = ~kb3; // kb3 - буфер
PORTB.1=1; // звук зуммер - вкл.

k = k ^ 0b00001000; // (....1...) 3- Вкл(Выкл) фары

};
if ( (8>k3) && (k3) ) {k3++;}; // счёт
if (k3 == 8) {
PORTB.1=0; // звук зуммер - выкл.
k3++;
};
///////////////////////////////
if ( (PINB.0==1) && (k3 == 9) ) {k3++;};
if (k3 > 9) {k3++;}; // счёт
if (k3 == 17) {
k3=0; // сброс
flag_k3=0; // сброс
};
/////////////////////////////////////////////////////////////////////////

но отдельно в прерывании работало стабильней))
:tea:
Вложения
пульт.c
(104.49 KiB) Скачиваний: 41

Re: Ардуино - запись звука

Вт авг 02, 2022 12:43:48

мы опрашивали кнопки отдельно в прерывании... устанавливали флаг нажатия кнопки...

interrupt [TIM0_OVF] void timer0_ovf_isr(void) // 4.000.000/8=500.000/256= цикл 1.953 ,125
{
if (PIND.5==0) flag_k0 = 1; // флаг кнопки 0 // (........) 0- Вкл(Выкл)меню
if (PIND.6==0) flag_k1 = 1; // флаг кнопки 1 // (........) 1- Выбор меню / Вкл(Выкл) LCD
if (PINB.0==0) flag_k3 = 1; // флаг кнопки 3 // (....1...) 3- Вкл(Выкл) фары
//if (PINC.4==0) flag_k4 = 1; // флаг кнопки 4 // скорость
if (PIND.7==0) flag_k5 = 1; // флаг кнопки 5 // (..1.....) 5- Вкл(Выкл) резервный аккумулятор
if (PINC.3==0) flag_k6 = 1; // флаг кнопки 6 // (.1......) 6- Вкл выгрузка
if (PINC.5==0) flag_k7 = 1; // флаг кнопки 7 // 7- круиз-контроль
}

это просто ужас какой-то. Мало того, что явное сравнение с нулём вместо !, так ещё и бесполезное. И зачем столько флагов? "Мы" совершенно не умеет работать с битами? "Мы" не знает логических операций?

Re: Ардуино - запись звука

Вт авг 02, 2022 13:05:01

Эх, Роман, лучше бы Вы мой код прокоментировали. Я в своем разобраться не могу. А вы мне эту простыню подсовываете.

Re: Ардуино - запись звука

Вт авг 02, 2022 13:05:35

if (PIND.5==0) flag_k0 = 1;
или
if (! PIND.5) flag_k0 = 1;
как хотим так и пишем))
:tea:

А ещё мы знаем скорость выполнения инструкций процессором при битовых операциях... С учётом того что мы находимся в прерывании...
Но тебе это не понять))
:tea:

Re: Ардуино - запись звука

Вт авг 02, 2022 13:08:12

Код:
flag=0;
count=0;

loop()

if (digitalRead(5) ==LOW && timerON==0) //нажали
 {
    timerON=1; // включим таймер
    timer=millis();
 }
if (digitalRead(5) ==LOW && timerON==1 && millis()-timer<600 && flag==0 && count<3) //нажали, таймер включен
 {
    count++; // зачтем нажатие
    flag=1; // флаг регистрации состояния кнопки (нажата/отпущена)
 }
if (digitalRead(5) ==HIGH && timerON=1) //отпустили кнопку в пределах времени работы таймера
 {
  flag=0; //
 }
if (millis()-timer>600) {timerON=0;} // отключу таймер (время вышло)
} //loop





скажите че будет если я просто зажму кнопку , получу ли я count 1?

Re: Ардуино - запись звука

Вт авг 02, 2022 13:13:39

лучше бы Вы мой код прокоментировали

а чё там комментировать... антидребезг добавить надо... да и всё))

опрашиваем кнопку на "нажатие":

if (digitalRead(5) ==LOW && timerON==0) //нажали
{
timerON=1; // включим таймер
timer=millis();
}

после того как нажали... надо включить таймер и немножко подождать... чтоб напряжение на кнопке "устаканилось" ))
дребезг при нажатии.jpg
(38.12 KiB) Скачиваний: 25

и только потом уже опрашивать кнопку на "отпускание":

if (digitalRead(5) ==HIGH && timerON=1) //отпустили кнопку в пределах времени работы таймера
{
flag=0; //

}
:roll:
Ответить