Перейти к содержанию

Точное переключение кнопок


kodkey

Рекомендуемые сообщения

Здравствуйте! Сложно было отнести вопрос к какому-то разделу, но он достаточно простой для тех, кто с такой ситуацией сталкивался, поэтому оставлю тут.

Есть устройство - музыкальный синтезатор, планирую в качестве клавиш использовать обычные SMD кнопки с 4-контактами. Такого типа, как на фото.

Опрос кнопок - на микроконтроллере, который опрашивает кнопки с некоторой частотой f.

Сложность в том, что для компактности устройства хотелось бы обойтись без громоздких схем избавления от дребезга, при этом варианты с конденсаторами не очень хорошо проходят - даже задержка от момента нажатия до изменения уровня в 10 мс создает проблемы, ведь устройство музыкальное и реакция на нажатие должна быть как можно меньшая(скажем 1мс уже приемлимо).

Задача лишь гарантированно без ошибок считать, какие кнопки были нажаты и при этом не засчитать одно нажатие за несколько. Как возможно это реализовать? Как реализуют? Думал над разными вариантами, но приемлемого для себя не нашел.

Ситуация осложнена тем, что микроконтроллер выполняет генерацию звукового сигнала в реальном времени - по точкам, и фактически время на подумать нету.

Возможно я бы и согласился повесить RS-триггер, но к сожалению не нашел трехтактных кнопок в SMD варианте.

 

 

 

taktovaya-knopka-smd-5x5-h1-5-4pin-1[1].jpg

Изменено пользователем kodkey
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Вариантов-вагон с прицепом!От ртутных герконов до датчиков Холла.Оптическое управление-от перекрытия луча,до отражения...

Бюджет какой?

Не можешь-научим! Не хочешь-не надо!P.S. А достанешь-заБАНят!

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

Не тратьте силы, возьмите молоток побольше!

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Согласен с предыдущим оратором. Плюс 1) поставить МК помощнее или 2) поставить 2 МК - один опрашивает кнопки (мигает светодиодами, и т.д) и передает коды второму, а второй МК принимает колы и (поет песни) играет музыку.

Настоящему коту и в декабре март!

Ссылка на комментарий
Поделиться на другие сайты

Ни в коем случае эти кнопки, быстро начнут глючить.

Идеально будет перекрытие по свету, как это сделано в комп.мышах на колесе. И если уж есть МК, то заодно можно отслеживать усилие нажатия, то есть взрыв по фронту и по спаду нажатия. Это сложнее, но зато вечное и сразу отсекаем помехи включения кнопки

Ссылка на комментарий
Поделиться на другие сайты

Оптопара со шторкой дребезжит ничуть не хуже механической кнопки, всё равно потребуется дополнительная обработка.  Датчик Холла с дискретным выходом, например А314х, был бы лучше - он имеет встроенный триггер Шмитта. Бюджет - рублей 500 - 600 за сотню, включая магниты.
А вот интересный вопрос - как планируется обрабатывать одновременное нажатие нескольких клавиш? Или инструмент планируется одноголосый, по принципу: кто первый встал - того и тапки?

"Я не знаю какой там коэффициент, я просто паять умею. "

Ссылка на комментарий
Поделиться на другие сайты

Вообще у меня там целый набор микросхем, которые формируют данные для МК из множества клавиш. Он рабочий с тем условием, что кнопка используется трехтактная и дребезг подавляется RS-триггером. 

В идеале для меня был бы простой вариант - двухтактная кнопка, но как сделать это на RS-триггере большой вопрос.

Ссылка на комментарий
Поделиться на другие сайты

ОЧЕНЬ сильный дребезг подавляется керамикой на кнопке, а третье неизвестное состояние подавляется гистерезисом, то есть сработало при 2.6 В, а отпустило при 2.5 В или 2.4 В, принцип как у реле.

А вообще, обработка кнопок программно - завести счетчик для каждой кнопки без таймера и считать нажатие. Если меньше 128, значит дребезг. Если 128-250, значит нажато, обнуляем, взводим флаг и следующие 255 пропускаем.

Ссылка на комментарий
Поделиться на другие сайты

В 06.04.2019 в 15:57, kodkey сказал:

Ситуация осложнена тем, что микроконтроллер выполняет генерацию звукового сигнала в реальном времени - по точкам,

А МК, небось, tiny2313?

Ссылка на комментарий
Поделиться на другие сайты

МК - STM32. Просто это, скажем так, real-time секвенсор с возможностью задать и характер звучания, и частоту и длительность конкретного звукового такта. При этом пользователь может поменять настройку какой-нибудь ноты в любой момент. Поэтому там много математики которая буквально высчитывается для каждой точки - гармонические составляющие, огибающая и т.п.. Потом всё заведено на cs4335 по последовательному каналу связи, а это тоже долго.

Изменено пользователем kodkey
Ссылка на комментарий
Поделиться на другие сайты

17 часов назад, kodkey сказал:

всё заведено на cs4335

Смысл? Сто мешает использовать внутренние ЦАП МК? Или же взять STM с аудиоинтерфейсом, типа PCM,  и подключить быстрый ЦАП?

 

17 часов назад, kodkey сказал:

а это тоже долго.

Для того, чтобы не было долго, есть DMA. Пока он шлет одну пачку данных, просчитывается вторая.

 

23 часа назад, kodkey сказал:

которые формируют данные для МК из множества клавиш

Зачем там какие-то микросхемы? Что мешает сделать опрос кнопок прямо в МК, как в клавиатуре.

Ссылка на комментарий
Поделиться на другие сайты

Мдя, что-то не то. Проц в СТМ свободен, только команды раздает, периферия сама выполняет. I2C вообще-то быстрая шина1 Мбит тянет легко, вот только зачем его задействовать ? 

Походу ТС этот камень и в глаза не видел. И триггеры по идее не нужны, мощи проца хватит и кнопки опросить и кучу задач сделать. АЦП вообще 4к уровней различает, одного канала хватит

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Данная тема к "импульсникам" не относится, поэтому всё "внетемное" удаляю. Не флудим. Для обсуждения других схем создавайте отдельные темы!
    • @READART Из практики. Даже 2в1 ухитряются путаться и мешать друг другу. Что за ад будет происходить с 4в1 я с трудом представлю. Вероятнее всего он будет низведен до банального 2в1 из-за неудобства.
    • нечего там смотреть, достаточно взглянуть на картинку- это похоже болячка этой деки- присоединяюсь к теме- у меня такая же проблема!
    • @donec Спасибо, но нет. Слишком всё как то всё сложно и запутано написано там в этом коде.  Я сейчас тем временем продолжаю разбираться с дисплеем. Выяснил причину артефактов на дисплее, а она кроется в коде, но это ещё нужно понять как исправить. Собственно в чём суть дела вывод по одному символу работает корректно и всё отображается правильно, но как только я пытаюсь вывести строку то на дисплее сразу появляются всяческие артефакты. Так что тут получается нужно каким то образом править код вывода строки. Вот весь код написанный под ATMEGA16. #define F_CPU 7372800UL #define BAUND 9600L #define UBRRL_value (F_CPU/(BAUND*16))-1 #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdlib.h> #define MAIN_H_ #define LCD_H_ #define LCD_DDR DDRA #define LCD_PORT PORTA #define LCD_PIN PINA #define DATA 0b11110000 #define RS PA2 #define E PA3 #define E1 LCD_PORT|=(1<<E) #define E0 LCD_PORT&=~(1<<E) #define RS1 LCD_PORT|=(1<<RS) #define RS0 LCD_PORT&=~(1<<RS) void lcd_ini(void); void lcd_str(char* str); void lcd_pos(uint8_t line, uint8_t pos); void lcd_num(uint8_t num, uint8_t line, uint8_t pos); uint8_t n=0; void write(uint8_t n) { n<<=4; E1; //линию Е в 1 LCD_PORT&=~DATA; //удалить предыдущую отправку LCD_PORT|=n; //выставить значение на пины управления дата битами asm("nop"); //пропуск такта E0; //линию Е в 0 } void send_byte(uint8_t byte, uint8_t tip) { if (tip) //если тип данные на линии RS 1 { RS1; } else //иначе тип команда и на линии RS 0 { RS0; } write(byte>>4); //передача старшего полубайта write(byte); //передача младшего полубайта } void lcd_ini(void) { LCD_DDR|=DATA | (1<<RS) | (1<<E); _delay_ms(20); RS0; write(3); _delay_ms(5); write(3); _delay_us(150); write(3); _delay_us(50); write(2); _delay_us(50); send_byte(40,0); _delay_us(50); send_byte(12,0); _delay_us(50); send_byte(1,0); _delay_ms(2); send_byte(6,0); _delay_us(50); } void lcd_str(char* str) { uint8_t n=0; while(str[n]) { send_byte(str[n],1); n++; } } void lcd_pos(uint8_t line, uint8_t pos) { uint8_t adress=(line*0x40+pos)|0x80; send_byte(adress,0); _delay_us(50); } void init_pin(void); #define C_PC0 (~PINC&(1<<PC0)) #define C_PC1 (~PINC&(1<<PC1)) #define LED_1_ON() PORTD|=(1<<PD2) #define LED_1_OFF() PORTD&=~(1<<PD2) #define LED_2_ON() PORTD|=(1<<PD3) #define LED_2_OFF() PORTD&=~(1<<PD3) #define FLAG_END_RX (1<<3) #define FLAG_ERR_RX (1<<4) #define BUF_SIZE 20 char rx_buf[BUF_SIZE]; char buf_index = 0; char rxb; volatile start=1, flags; ISR(USART_RXC_vect) { char rxb = UDR; if(!(flags & FLAG_END_RX)) { rx_buf[buf_index]=rxb; if(rx_buf[buf_index] == 0x0D) { flags |= FLAG_END_RX; return; } buf_index++; if(buf_index >= BUF_SIZE) { buf_index = 0; flags |= FLAG_ERR_RX; } } } void init_UART() { UBRRL = UBRRL_value; UBRRH = UBRRL_value>>8; UCSRB|=(1<<TXEN); UCSRB|=(1<<RXEN); UCSRC|=((1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)); UCSRB|=(1<<RXCIE); sei(); flags = 0; } void send_UART(char value) { while(!(UCSRA&(1<<UDRE))); UDR=value; } int main(void) { init_pin(); init_UART(); _delay_ms(500); send_UART('O'); send_UART('K'); send_UART('!'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); flags = 0; DDRB = 0b10000000; PORTB = 0b11111111; lcd_ini(); while(1) { if (~PINB & (1<<1)) { send_UART('P'); send_UART('B'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); lcd_pos(0,0); send_byte('A',1); lcd_pos(1,0); lcd_str("PORT B1"); //lcd_str(" "); //lcd_pos(1,0); //lcd_str(" "); //lcd_pos(1,0); //lcd_str("GAMES AND SOFT"); //send_byte(0b01000001,1); //A //send_byte(0x41,1); //A //send_byte('A',1); //A } if (~PINB & (1<<2)) { send_UART('P'); send_UART('B'); send_UART('2'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); lcd_pos(0,0); send_byte('B',1); lcd_pos(1,0); lcd_str("PORT B2"); //lcd_pos(0,0); //lcd_str(" "); //lcd_pos(1,0); //lcd_str(" "); //lcd_str("TIFASO"); } if (~PINB & (1<<3)) { send_UART('P'); send_UART('B'); send_UART('3'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); lcd_pos(0,0); send_byte('C',1); lcd_pos(1,0); lcd_str("PORT B3"); //lcd_str(" "); //lcd_pos(1,0); //lcd_str(" "); //lcd_pos(1,0); //lcd_str("HELLO"); //lcd_pos(1,0); //lcd_str("PLAYER BT201"); } if (~PINB & (1<<4)) { send_UART('P'); send_UART('B'); send_UART('4'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); lcd_pos(0,0); send_byte('D',1); lcd_pos(1,0); lcd_str("PORT B4"); //lcd_pos(0,0); //lcd_str(" "); //lcd_pos(1,0); //lcd_str(" "); //lcd_str("FILE MUSIC MP3"); //lcd_pos(1,0); //lcd_str("USB PLAYER VOLL"); } char i = 0; if (rx_buf[i] == 'M'){ i++; if (rx_buf[i] == '1') { LED_1_ON(); LED_2_OFF(); } else if (rx_buf[i] == '2') { LED_1_OFF(); LED_2_ON(); } else if (rx_buf[i] == 'T') { LED_1_ON(); LED_2_ON(); } else if (rx_buf[i] == 'K') { LED_1_OFF(); LED_2_OFF(); } } if (C_PC0) { send_UART('P'); send_UART('C'); send_UART('0'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); lcd_pos(0,0); send_byte('E',1); lcd_pos(1,0); lcd_str("PORT C0"); } if (C_PC1) { send_UART('P'); send_UART('C'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); lcd_pos(0,0); send_byte('F',1); lcd_pos(1,0); lcd_str("PORT C1"); } } } void init_pin(void) { DDRC = 0b00000000; PORTC = 0b11111111; DDRD |= ((1<<2)|(1<<3)); PORTD &=~ ((1<<2)|(1<<3)); } Собственно за вывод символа отвечает send_byte она работает правильно, а за вывод строки отвечает lcd_str вот в ней как раз таки и вся проблема с артефактами. А что конкретно не так я пока ещё никак не пойму. Может кто более опытным глазом увидит и подскажет что нужно исправить.
    • Может, и дроссель. Синие конденсаторы мне тоже встречались.
×
×
  • Создать...