Использование CD74HC4067 16-канальный аналоговый мультиплексор Демультиплексор работает не так, как ожидалось
Я работаю над проектом, который нуждается в нескольких цифровых сигналах, и я рассматриваю CD74HC4067 (на разрывной плате) для работы в качестве мультиплексора. Более конкретно, я пытаюсь построить клавиатуру с несколькими выключателями ttp123. Каждый сигнал ttp123 подключается к одному из контактов 0-15 CD74HC4067. Контакты S0-S3 подключаются к цифровым контактам D6 - D9 на Pro mini. Сигнал находится на A0, а EN-на A1. A1 и EN имеют резистор 4K7 для заземления. Я включаю установку с помощью отдельного 5 В, а arduino подключается к USB-порту ПК.
Я ожидаю, что при нажатии ttp123 будет вызван ВЫСОКИЙ уровень и это событие будет передано на контакт SIG. Вот мой код:
//Использование 16-канального аналогового мультиплексора CD74HC4067
//Управляющие контакты Mux
int s0 = 6;
int s1 = 7;
int s2 = 8;
int s3 = 9;
//Mux in "SIG" pin
int SIG_pin = A0;
int EN_pin = A1;
void setup(){
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(EN_pin, OUTPUT);
digitalWrite(s0, LOW);
digitalWrite(s1, LOW);
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
digitalWrite(EN_pin, LOW);
Serial.begin(9600);
Serial.println("keypad interfacing_CD74HC4067 starting...");
}
void loop(){
String a;
//digitalWrite(EN_pin, HIGH);
Serial.println(" press any key to continue ...");
//digitalWrite(EN_pin, LOW);
while (!Serial.available());
while(Serial.available()) {
//Loop through and read all 16 values
for(int i = 0; i < 16; i ++){
//Serial.print("Value at channel ");
//Serial.print(i);
//Serial.print("is : ");
//Serial.println(readMux(i));
float volts = readMux(i);
Serial.print("Value at channel ");
Serial.print(i);
Serial.print(" is : ");
Serial.print(volts);
Serial.println();
//delay(1000);
}
a= Serial.readString();// read the incoming data as string
}
}
float readMux(int channel){
int controlPin[] = {s0, s1, s2, s3};
int muxChannel[16][4]={
{0,0,0,0}, //channel 0
{1,0,0,0}, //channel 1
{0,1,0,0}, //channel 2
{1,1,0,0}, //channel 3
{0,0,1,0}, //channel 4
{1,0,1,0}, //channel 5
{0,1,1,0}, //channel 6
{1,1,1,0}, //channel 7
{0,0,0,1}, //channel 8
{1,0,0,1}, //channel 9
{0,1,0,1}, //channel 10
{1,1,0,1}, //channel 11
{0,0,1,1}, //channel 12
{1,0,1,1}, //channel 13
{0,1,1,1}, //channel 14
{1,1,1,1} //channel 15
};
//loop through the 4 sig
for(int j = 0; j < 4; j ++){
digitalWrite(controlPin[j], muxChannel[channel][j]);
}
//read the value at the SIG pin
int val = analogRead(SIG_pin);
//return the value
float voltage = (val * 5) / 1024.0;
return voltage;
}
Просто для простоты я подключил только один ttp123 в системе, сигнал ttp123 к каналу 12 на 74HC4067. При касании ttp123 я ожидал бы получить высокий уровень SIG, когда я пишу {0,0,1,1} в S0-S3. Все остальные каналы должны быть НИЗКИМИ. Однако вот что я получаю:
Во время моей первой пробежки после загрузки:
press any key to continue ...
Value at channel 0 is : 2.53
Value at channel 1 is : 2.58
Value at channel 2 is : 2.53
Value at channel 3 is : 2.60
Value at channel 4 is : 2.51
Value at channel 5 is : 2.55
Value at channel 6 is : 2.50
Value at channel 7 is : 2.52
Value at channel 8 is : 2.42
Value at channel 9 is : 2.47
Value at channel 10 is : 2.43
Value at channel 11 is : 2.50
Value at channel 12 is : 2.40
Value at channel 13 is : 2.43
Value at channel 14 is : 2.38
Value at channel 15 is : 2.44
а затем после каждого запуска выборки все каналы, похоже, получают более низкие значения...
press any key to continue ...
Value at channel 0 is : 1.70
Value at channel 1 is : 1.76
Value at channel 2 is : 1.71
Value at channel 3 is : 1.78
Value at channel 4 is : 1.70
Value at channel 5 is : 1.76
Value at channel 6 is : 1.72
Value at channel 7 is : 1.77
Value at channel 8 is : 1.67
Value at channel 9 is : 1.72
Value at channel 10 is : 1.69
Value at channel 11 is : 1.76
Value at channel 12 is : 1.69
Value at channel 13 is : 1.73
Value at channel 14 is : 1.67
Value at channel 15 is : 1.74
и я не получаю кайфа на 12-м канале, как следовало бы.
Есть ли необходимость в подтягивающих или подтягивающих резисторах в этой установке? Должен ли я подключить резистор к каждому S0-S3 с землей? Почему это не работает?
Правка:
Когда система отдыхает, я измеряю 4,93 В при ttp Vs к GND и 0 В TTP_SIGNAL к GND. Когда ttp касаются TTP_SIGNAL к GND, я измеряю 3,94-3,88 В. Но самое странное, что когда я прикасаюсь к ttp, я измеряю 2.xx вольт на всех каналах mux. Я думаю, что где-то должно быть какое-то короткое замыкание, но его не видно. Проблема в том, что я не могу протестировать еще один CD74HC4067, так как сейчас у меня есть только один. Если нет другого предложения, я буду искать пару из них (CD74HC4067) как можно скорее.
Edit2:
Я раздобыл новый CD74HC4067 и подключил только одну емкостную сенсорную панель. Когда ничего не трогается/не нажимается, я получаю следующее:
press any key to continue ...
Value at channel 0 is : 1.01
Value at channel 1 is : 0.90
Value at channel 2 is : 0.81
Value at channel 3 is : 0.62
Value at channel 4 is : 0.44
Value at channel 5 is : 0.42
Value at channel 6 is : 0.43
Value at channel 7 is : 0.43
Value at channel 8 is : 0.31
Value at channel 9 is : 0.28
Value at channel 10 is : 0.24
Value at channel 11 is : 0.18
Value at channel 12 is : 0.15
Value at channel 13 is : 0.23
Value at channel 14 is : 0.22
Value at channel 15 is : 0.13
Когда я касаюсь панели (подключенной к c0), я получаю:
press any key to continue ...
Value at channel 0 is : 4.15
Value at channel 1 is : 3.74
Value at channel 2 is : 3.75
Value at channel 3 is : 3.54
Value at channel 4 is : 3.76
Value at channel 5 is : 3.33
Value at channel 6 is : 2.88
Value at channel 7 is : 2.64
Value at channel 8 is : 3.77
Value at channel 9 is : 3.52
Value at channel 10 is : 3.07
Value at channel 11 is : 2.76
Value at channel 12 is : 2.04
Value at channel 13 is : 1.83
Value at channel 14 is : 1.67
Value at channel 15 is : 1.51
Я измеряю вольты между сигналом и землей на емкостной сенсорной панели, при прикосновении я получаю 3,9 В
@thermike, 👍2
Обсуждение1 ответ
Наконец-то мне удалось найти решение своей проблемы. Кроме того, была проблема с кабелями и программным обеспечением. Во - первых, я снял Сигнал с помощью резистора 10K. Таким образом, у меня прекратились эти случайные вольтовые измерения.
Во-вторых, в коде у меня была элементарная ошибка инициализации аналогового вывода A0 как: pinMode(SIG_pin, INPUT);
Вот окончательный код:
// сопряжение мультиплексора с tp223
//Управляющие выводы Mux
const int s0 = 6;
const int s1 = 7;
const int s2 = 8;
const int s3 = 9;
//Mux in "SIG" pin
int SIG_pin = A0;
int EN_pin = 10;
void setup(){
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(SIG_pin, INPUT);
pinMode(EN_pin, OUTPUT);
digitalWrite(s0, LOW);
digitalWrite(s1, LOW);
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
digitalWrite(EN_pin, LOW);
Serial.begin(115200);
Serial.println("keypad interfacing_CD74HC4067 starting...");
}
void loop(){
//Перебрать и прочитать все 16 значений
for(int i = 0; i < 16; i ++){
int val = readMux(i);
if (val > 0) {
Serial.print(i);
Serial.print(" pressed ");
Serial.print(val);
Serial.println();
}
}
}
float readMux(int channel){
int controlPin[] = {s0, s1, s2, s3};
int muxChannel[16][4]={
{0,0,0,0}, //channel 0
{1,0,0,0}, //channel 1
{0,1,0,0}, //channel 2
{1,1,0,0}, //channel 3
{0,0,1,0}, //channel 4
{1,0,1,0}, //channel 5
{0,1,1,0}, //channel 6
{1,1,1,0}, //channel 7
{0,0,0,1}, //channel 8
{1,0,0,1}, //channel 9
{0,1,0,1}, //channel 10
{1,1,0,1}, //channel 11
{0,0,1,1}, //channel 12
{1,0,1,1}, //channel 13
{0,1,1,1}, //channel 14
{1,1,1,1} //channel 15
};
//цикл через 4 sig
for(int j = 0; j < 4; j ++){
digitalWrite(controlPin[j], muxChannel[channel][j]);
}
//считайте значение на SIG pin
int val = digitalRead(SIG_pin);
//возвращает значение
return val;
}
- Использование библиотеки емкостных датчиков с мультиплексором 74HC4067
- Мультиплексирование трех ламп VFD — почему сегменты и синхронизация отображения неверны?
- Помогите в личном проекте будильника, не могу записать время на семисегментный дисплей
- Могу ли я подключить аналоговый мультиплексор к Arduino Nano?
- Изменить значение только одного регистра на 8-разрядной регистровой интегральной схеме (74hc273 / DM74LS273)?
- Выход TPIC6B595 не может обеспечить подачу питания на 7-сегментный дисплей
- avrdude ser_open() can't set com-state
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
Вы упомянули об отдельном питании, нищие любят забывать о заземлении. Во всяком случае, медленно меняющиеся показания АЦП где-то далеко от 0 или 5 обычно указывают на плавающий вход. Вы должны измерить все, протестировать этот мультиплексор отдельно..., @KIIV
@KIV спасибо за ваш комментарий. Основания двух отдельных источников соединены между собой. Я еще раз все измерю и вернусь., @thermike
Размещение схемы того,как вы ее подключили, очень поможет. Даже нарисованная от руки схема лучше, чем завитая картинка., @Gil
@Gil я отредактировал вопрос, как вы предложили., @thermike
Я получил новый CD74HC4067 и протестировал его. Я отредактировал сообщение выше. Есть какие-нибудь предложения?, @thermike