Использование библиотеки емкостных датчиков с мультиплексором 74HC4067
Я пытаюсь использовать библиотеку Capacitive Sensing Library Пола Бэджера в сочетании с одним или несколькими мультиплексорами 74HC4067 для получения большого количества емкостных сенсорных входов. Я наткнулся на это видео на YouTube, где постер, кажется, выполнил то, что я пытаюсь, но я не могу' похоже, это не повторяется.
Вот установка, которую я использую с Arduino Nano, несколькими резисторами 1 МОм и коммутационным разъемом CD74HC4067:
Вот мой код Arduino:
#include <CapacitiveSensor.h>
#define muxS0Pin 7
#define muxS1Pin 6
#define muxS2Pin 5
#define muxS3Pin 4
#define muxSignalPin 3
#define muxEnPin 8
#define capSenseSendPin 2
#define sampleRate 5
int touch[4] = {};
CapacitiveSensor capSense = CapacitiveSensor( capSenseSendPin, muxSignalPin );
void setup() {
digitalWrite( muxEnPin, LOW );
Serial.begin( 115200 );
}
void loop(){
byte touchIndex = 0;
for ( byte channel = 0; channel < 4; ++channel ) {
digitalWrite( muxS0Pin, ( channel & 1 ) >> 0 );
digitalWrite( muxS1Pin, ( channel & 2 ) >> 1 );
digitalWrite( muxS2Pin, ( channel & 4 ) >> 2 );
digitalWrite( muxS3Pin, ( channel & 8 ) >> 3 );
touch[touchIndex] = capSense.capacitiveSensor( sampleRate );
++touchIndex;
}
for ( byte i = 0; i < 10; ++i ) {
Serial.print( touch[i] );
Serial.print("\t");
}
Serial.println();
}
В этом примере используются только четыре емкостные сенсорные панели, но в конечном итоге я планирую использовать все 16, а затем еще один мультиплексор, но сейчас я застрял в получении чего-либо, кажется, я получаю некоторые показания при касании последней панели, но это не так. то, что я ожидаю увидеть, и это влияет на все чтение.
Я успешно запустил версию, работающую без мультиплексора только на десяти выводах ввода-вывода, и она отлично работала. У меня также нормально работает мультиплексор в отдельном примере с 16 кнопками.
Может ли проблема быть связана со временем зарядки пэда или остановкой сигналов Capsense отправки и получения в мультиплексоре?
Мы будем признательны за любую помощь.
@juliusbangert, 👍1
Обсуждение1 ответ
Это уже поздно, но для тех, кто столкнется с этим, вот мое решение. Двумя основными моментами являются явное использование аналоговых входных контактов (которые могут быть преобразованы в цифровые значения в программном обеспечении, и убедитесь, что у вас есть резисторы на каждом считываемом канале. Кроме того, заземлите контакт EN на мультиплексоре
#include <CapacitiveSensor.h>
#define muxS0Pin 9 // Я использовал их, а не 4-7
#define muxS1Pin 10
#define muxS2Pin 11
#define muxS3Pin 12
#define muxSignalPin A0 // явно установить аналог
#define capSenseSendPin A2 //
#define sampleRate 10
#define n_inputs 16
int touch[n_inputs] = {};
CapacitiveSensor capSense = CapacitiveSensor( capSenseSendPin, muxSignalPin );
int readMux(int channel) {
int controlPin[] = {muxS0Pin, muxS1Pin, muxS2Pin, muxS3Pin};
int muxChannel[16][4] = {
{0, 0, 0, 0}, //канал 0
{1, 0, 0, 0}, //канал 1
{0, 1, 0, 0}, // канал 2
{1, 1, 0, 0}, //канал 3
{0, 0, 1, 0}, //канал 4
{1, 0, 1, 0}, //канал 5
{0, 1, 1, 0}, // канал 6
{1, 1, 1, 0}, // канал 7
{0, 0, 0, 1}, // канал 8
{1, 0, 0, 1}, // канал 9
{0, 1, 0, 1}, //канал 10
{1, 1, 0, 1}, //канал 11
{0, 0, 1, 1}, //канал 12
{1, 0, 1, 1}, //канал 13
{0, 1, 1, 1}, //канал 14
{1, 1, 1, 1} //канал 15
};
// проходим через 4 контакта управления
for (int k = 0; k < 4; k ++) {
digitalWrite(controlPin[k], muxChannel[channel][k]);
}
//читаем значение на выводе SIG
return capSense.capacitiveSensor( sampleRate );
}
void setup() {
// Очень важно установить управляющие контакты в режим вывода
pinMode(muxS0Pin, OUTPUT);
pinMode(muxS1Pin, OUTPUT);
pinMode(muxS2Pin, OUTPUT);
pinMode(muxS3Pin, OUTPUT);
digitalWrite(muxS0Pin, LOW);
digitalWrite(muxS1Pin, LOW);
digitalWrite(muxS2Pin, LOW);
digitalWrite(muxS3Pin, LOW);
Serial.begin( 9600 );
}
void loop() {
byte touchIndex = 0;
for ( byte channel = 0; channel < n_inputs; ++channel ) {
Serial.print( readMux(channel));
Serial.print("\t");
}
Serial.println();
}
- Несколько датчиков I2C с одинаковым адресом
- Чтение датчика давления от 4 до 20 мА с использованием uno
- Эмуляция 1-проводных устройств
- MAX30100 не работает
- Нужна помощь с библиотекой U8GLIB
- Датчик освещенности BH1750 всегда дает выходной сигнал 54612 лк
- Arduino IRremote перестает работать
- Проблема с сигналом датчика пульса
Вот ссылка на библиотеку: http://playground.arduino.cc/Main/CapacitiveSensor, @juliusbangert
А вот видео моего неработающего примера: https://www.youtube.com/watch?v=4bGJw1UrgOk. Установка в видео немного отличается от иллюстрации выше; У меня есть контактные площадки, подключенные к C6-C15 на мультиплексоре, и я прокручиваю их в обратном порядке, чтобы отобразить их по порядку на последовательном мониторе. Но дело в том, что кажется, что только последний вывод мультиплексора влияет на все показания., @juliusbangert
Возможно, потребуется установить режим вывода включения мультиплексора (muxEnPin) для вывода в setup()., @Mikael Patel