Работа с источником сигнала

Следующая схема представляет собой упрощенную версию более сложной системы. В целях тестирования был добавлен таймер 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 в этой схеме?, @chrisl

Чип 555 используется для генерации 3 волн., @David Wisniewski

Отвечает ли это на ваш вопрос? Несколько кнопок на один вход, @Juraj

Я должен извиниться за предыдущую формулировку моего вопроса, я считаю, что я затруднил его понимание. Я все еще относительно новичок в электронике, в будущем я буду работать над этим., @David Wisniewski


2 ответа


Лучший ответ:

1

После дня или двух работы над этой проблемой я обнаружил, что лучше избегать использования аналоговых выводов и держаться подальше от прямого взаимодействия с таймером 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


3

Существует простой способ добиться считывания нескольких кнопок с помощью одного аналогового входа.

Все, что вам нужно сделать, это создать несколько делителей напряжения на разные напряжения, которые можно считать с помощью 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