Работа с источником сигнала
Следующая схема представляет собой упрощенную версию более сложной системы. В целях тестирования был добавлен таймер 555, который служит источником тестового сигнала с частотами, устанавливаемыми последовательно соединенными резисторами. Каждый произвольный сигнал обозначается кнопкой, и Arduino должен уметь различать, какая кнопка была нажата. К сожалению, кнопок может быть только 3 и больше добавить нельзя. Вот где возникает проблема. Как вы можете надежно указать, какая кнопка была нажата, не мешая произвольной форме волны?
Сначала я хотел, чтобы Arduino сэмплировал сигнал, основанный на этом сэмпле, чтобы Arduino мог сказать, какая кнопка нажата.
При нажатии кнопки 1, выделенной розовым цветом, Arduino получает следующее: образец сигнала.
843
848
849
849
849
849
// Время 0, когда кнопка нажата
532
414
500
373
463
346
425
370
386
476
346
442
642
788
Перемещение ввода
// При t = 0 последовательный монитор читает ноль
998
998
998
998
998
0
0
0
0
0
998
0
0
0
0
0
0
0
0
0
998
0
0
0
0
998
0
0
0
998
998
998
0
998
0
0
0
998
0
0
0
0
Перемещение аналогового входа не облегчает определение того, какая кнопка была нажата. Вот почему я решил спросить сообщество о том, как с этим бороться. Я пытался использовать реле и просто жестко кодировать все случаи, но в результате система не очень надежна и уязвима, и со временем ее легко сломать.
2 ответа
Лучший ответ:
После дня или двух работы над этой проблемой я обнаружил, что лучше избегать использования аналоговых выводов и держаться подальше от прямого взаимодействия с таймером 555. Это упрощенная версия более сложной схемы, а таймер 555 представляет собой некоторый произвольный источник сигнала. Например, на мобильном радио вы нажимаете кнопку, чтобы передать определенную частоту. В этом и суть, только частоты пока не настраиваются. Теперь, когда выяснилось, что таймер 555 был помещен в схему для целей отладки, вот лучшее решение, которое я нашел для этой проблемы. Во-первых, я обнаружил, что считывать данные с аналогового вывода на Arduino можно, но не так просто. Это оставляет много места для ошибки, поскольку форма сигнала является произвольной с некоторой случайной частотой. Поэтому я решил использовать цифровые контакты на Arduino. с помощью цифровых контактов мне теперь нужно беспокоиться только о том, находится ли кнопка на высоком или низком уровне. Затем NPN-транзисторы использовались в качестве переключателей при нажатии кнопки. Затем были добавлены диоды для поддержания постоянного напряжения на базе транзистора. В целях тестирования ЖК-дисплей был удален и заменен светодиодом. Что касается кода, то в нем нет ничего экстраординарного или сложного, как показано ниже. Поэтому я считаю, что это может быть лучшим способом решить эту проблему.
const int D_pin10 = 10;
const int D_pin9 = 9;
const int D_pin8 = 8;
int led = 13;
void setup()
{
pinMode(D_pin10 , INPUT); // контакт 10 является входом
pinMode(D_pin9 , INPUT); // контакт 10 является входом
pinMode(D_pin8, INPUT); // контакт 10 является входом
pinMode(led, OUTPUT);
}
void loop()
{
int High_Low10 =0;
int High_Low9 =0;
int High_Low8 =0;
High_Low10 = digitalRead(D_pin10);
High_Low9 = digitalRead(D_pin9);
High_Low8 = digitalRead(D_pin8);
if(High_Low10 == HIGH)
{
digitalWrite(led, HIGH);
}
else if(High_Low9 == HIGH)
{
digitalWrite(led, HIGH);
}
else if(High_Low8 == HIGH)
{
digitalWrite(led, HIGH);
}
else
{
digitalWrite(led, LOW);
}
delay(1000);
}
Если ваша цель состоит в том, чтобы точно обнаруживать нажатия кнопок и использовать один контакт на кнопку, вам не нужны транзисторы, диоды или любое другое оборудование, кроме кнопок. Вы можете напрямую подключиться к кнопке через внутренний подтягивающий резистор и точно считывать состояния кнопки., @Siddharth Kothari
Цель состоит в том, чтобы управлять нестабильным таймером 555 с помощью кнопок. Диоды и транзисторы работают как переключатель., @David Wisniewski
Существует простой способ добиться считывания нескольких кнопок с помощью одного аналогового входа.
Все, что вам нужно сделать, это создать несколько делителей напряжения на разные напряжения, которые можно считать с помощью AnalogRead. Последний резистор, R6, на диаграмме ниже гарантирует, что на выводе отображается 0, когда никакая кнопка не нажата (т. е. подтягивающий резистор). На схеме ниже подключите Vcc к 5V на Arduino.
Попробуйте, вы сможете получить хорошо разнесенные значения для разных кнопок!
R1 ... R5 могут иметь разные значения, что может более равномерно распределять диапазоны по кнопкам., @DataFiddler
Относительно «1M»: обратите внимание, что на Uno АЦП рассчитан на выходное сопротивление источника не более 10 кОм., @Edgar Bonet
@EdgarBonet 1M - это просто выпадающее меню для предотвращения плавания. Благодаря такому высокому значению вход не плавает, когда кнопки не нажаты, и в то же время мало влияет на показания. В худшем случае выходное сопротивление при нажатой кнопке 1 составит 799,36 Ом. Когда ничего не нажато, нет выхода *иметь* импеданс. Просто заземление через резистор. Да, это может замедлить переход от действительного чтения к нулю, но это не проблема., @Majenko
@Majenko: «ничего» — правильное прочтение., @Edgar Bonet
Да, но это не активно действующее чтение, которым управляет остальная часть схемы, а просто ничто "перестань плавать"., @Majenko
Это правильно, но использование делителя напряжения в этом сценарии довольно сложно., @David Wisniewski
- Среднеквадратичное значение напряжения
- Регистр ADCH Arduino Uno завис на значении 255 при чтении из ISR
- Есть ли способ воспроизводить звуки с Arduino без использования звукового экрана?
- Подключение HX711 к трехпроводному датчику нагрузки
- Как отправлять данные через I2C без проводной библиотеки?
- Arduino с 12-битным ЦАП (MCP4725) не работает
- Сопряжение наушников TRRS с Arduino Uno
- ШИМ на выводах не ШИМ
Какова роль микросхемы 555 в этой схеме?, @chrisl
Чип 555 используется для генерации 3 волн., @David Wisniewski
Отвечает ли это на ваш вопрос? Несколько кнопок на один вход, @Juraj
Я должен извиниться за предыдущую формулировку моего вопроса, я считаю, что я затруднил его понимание. Я все еще относительно новичок в электронике, в будущем я буду работать над этим., @David Wisniewski