Использование библиотеки емкостных датчиков с мультиплексором 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 отправки и получения в мультиплексоре?

Мы будем признательны за любую помощь.

, 👍1

Обсуждение

Вот ссылка на библиотеку: http://playground.arduino.cc/Main/CapacitiveSensor, @juliusbangert

А вот видео моего неработающего примера: https://www.youtube.com/watch?v=4bGJw1UrgOk. Установка в видео немного отличается от иллюстрации выше; У меня есть контактные площадки, подключенные к C6-C15 на мультиплексоре, и я прокручиваю их в обратном порядке, чтобы отобразить их по порядку на последовательном мониторе. Но дело в том, что кажется, что только последний вывод мультиплексора влияет на все показания., @juliusbangert

Возможно, потребуется установить режим вывода включения мультиплексора (muxEnPin) для вывода в setup()., @Mikael Patel


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();
}


,