我正在做一个需要多个数字信号的项目,我正在考虑CD74HC4067 (在断板上)作为一个多路复用器工作。更具体地说,我正在尝试构建一个带有多个ttp123断线板的键盘。每个ttp123信号连接到CD74HC4067的0-15引脚之一.S0-S3引脚连接到pro迷你版上的数字针7-4。信号在A0上,EN在A1上。A1和EN有一个4K7电阻接地。我用一个独立的5v和arduino连接在一个pc usb端口的设置。
我希望当一个ttp123被按下触发一个高事件时,这个事件将被传递给SIG引脚。这是我的代码:
//Using CD74HC4067 16-Channel Analog Multiplexer
//Mux control pins
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信号连接到74HC4067上的channel12。有了ttp123,当我向S0-S3写入{0,0,1,1}时,我希望SIG的值会很高。所有其他渠道都应该是低的。然而,我得到的是:
在启动后的第一次运行中:
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和接地吗?为什么这不管用?
发布于 2022-02-06 08:38:56
由于代码中也有一个基本故障,所以我想在这里发布解决方案:
我未能将A0引脚初始化为输入:
pinMode(SIG_pin,INPUT);
下面是一组工作代码:
// interfacing mux with tp223
//Mux control pins
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(){
//Loop through and read all 16 values
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
};
//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 = digitalRead(SIG_pin);
//return the value
return val;
}
我要指出的是,电缆也有问题。我用10k电阻拉下信号引脚。
https://stackoverflow.com/questions/70803536
复制相似问题