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

Обсуждаем контроллеры компании Atmel.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

мнне нужно обрабатывать 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 должно быть количество нажатий.
Реклама
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

не вижу антидребезг...
дребезг.jpg
(34.43 КБ) 56 скачиваний
: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 КБ) 79 скачиваний
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

Эх, Роман, лучше бы Вы мой код прокоментировали. Я в своем разобраться не могу. А вы мне эту простыню подсовываете.
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

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

А ещё мы знаем скорость выполнения инструкций процессором при битовых операциях... С учётом того что мы находимся в прерывании...
Но тебе это не понять))
:tea:
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

Код: Выделить всё

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?
Реклама
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

[uquote="olegue",url="/forum/viewtopic.php?p=4267854#p4267854"]лучше бы Вы мой код прокоментировали[/uquote]
а чё там комментировать... антидребезг добавить надо... да и всё))

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

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

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

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

}
:roll:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

мне здесь дребезг не нужен. Это не я нажимаю.

Добавлено after 2 minutes 36 seconds:
в базу транзисторного ключа сигнал приходит.
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

olegue писал(а):Это не я нажимаю.
:)))

я верю тому что написано))

if (digitalRead(5) ==LOW && timerON==0) //нажали
...
if (digitalRead(5) ==HIGH && timerON=1) //отпустили кнопку
...
:dont_know:
olegue писал(а):в базу транзисторного ключа сигнал приходит.
ну так и пиши тогда... "внешний сигнал от ключа" (дребезг не учитывать !).
:tea:

Добавлено after 11 minutes 14 seconds:
[uquote="olegue",url="/forum/viewtopic.php?p=4267857#p4267857"]

Код: Выделить всё

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?[/uquote]
ну получишь count 1... если кнопка без дребезга)) и таймер нормальный...

я не знаю что значит timer=millis(); ? это какая-то ардуиновская приблуда))

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

timer=millis(10);

я не разбираюсь в ардуино))
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

в ардуине засекаем таймер
timer=millis();
а потом измеряем прошедшее время
t=millis()-timer;

millis() работает на прерываниях в отличии от delay(500)
Вот какой я грамотный теперь
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

olegue писал(а):Вот какой я грамотный теперь
:o
на прерываниях какого таймера ? в ардуино их аж целых три ! ))
:)
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

да вопрос хороший, когда то разбирал эту тему и знал, а теперь просто гугление уже не дает результата. Надо копать глубже.
Поставщик валерьянки для Кота
Сообщения: 1988
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

millis() -> timer0, prescaler 64
Контактная информация:
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

[uquote="olegue",url="/forum/viewtopic.php?p=4268497#p4268497"]Надо копать глубже.[/uquote]
в обычной ардуине три таймера...
таймер №0 - 8-ми битный 0...255
таймер №1 - 16-ти битный 0...65535
таймер №2 - 8-ми битный 0...255

для millis() обычно используют таймер №1.
потому что таймер №1 - 16 битный.
что позволяет задавать значение таймера в пределах 0...65535
:)
Поставщик валерьянки для Кота
Сообщения: 1988
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

[uquote="roman.com",url="/forum/viewtopic.php?p=4268611#p4268611"]...
для millis() обычно используют таймер №1.
...[/uquote]
Посм. C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\wiring.c:
Спойлер

Код: Выделить всё

#if defined(TIM0_OVF_vect)
ISR(TIM0_OVF_vect)
#else
ISR(TIMER0_OVF_vect)
#endif
{
	// copy these to local variables so they can be stored in registers
	// (volatile variables must be read from memory on every access)
	unsigned long m = timer0_millis;
	unsigned char f = timer0_fract;

	m += MILLIS_INC;
	f += FRACT_INC;
	if (f >= FRACT_MAX) {
		f -= FRACT_MAX;
		m += 1;
	}

	timer0_fract = f;
	timer0_millis = m;
	timer0_overflow_count++;
}
Спойлер

Код: Выделить всё

unsigned long millis()
{
	unsigned long m;
	uint8_t oldSREG = SREG;

	// disable interrupts while we read timer0_millis or we might get an
	// inconsistent value (e.g. in the middle of a write to timer0_millis)
	cli();
	m = timer0_millis;
	SREG = oldSREG;

	return m;
}
Контактная информация:
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

:o
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

такой вопрос! А что если я буду писать звук не на sd карту посредство библиотеки sdfat а в файл по сети. Сеть wifi c хорошим доступом. Нужна ли будет буферизация? Теоретически проблем не вижу. А вот что из этого реально получится пока не представляю.
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

надо смотреть тайминги...
:roll:
что то мне подсказывает... что буферизация нужна))
:tea:

Добавлено after 1 hour 22 minutes 53 seconds:
в принципе... можно и без буферизации... надо по подробней посмотреть тайминги...

вот я передаю данные по радио...
PCM-256 nRF24L01.jpg
(150.59 КБ) 59 скачиваний
вот я передаю данные по Wi-Fi...
PCM-256 Wi-Fi.jpg
(138.82 КБ) 61 скачивание
нет никакой разницы))
:tea:

короче... проблем быть не должно...
проблемы будут с шифрованием ))
в Ардуино слишком медленно работает шифрование...
ATmega8_AES_256.jpg
(121.31 КБ) 56 скачиваний
:roll:
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

запись звука... в файл... на ПК... по сети...
ПК.jpg
(96.01 КБ) 70 скачиваний
:tea:
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

снова вопрос по звуку. Возможно ли звук 8бит 8кгц передавать потоком через gprs?
Объясните пож и желательно обоснуйте. Спасибо.
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

с gprs никада не работал... сказать ничего не могу...
слышал что gprs работает до 320 кБит/c... но это не точно))

с Ethernet и Wi-Fi проблем нет)) всё работает чётко.
:tea:
Ответить

Вернуться в «AVR»