»
Добавить статью

MPR121 и Arduino: подключение, схема и программа

2020-02-23 в 09:40

Как известно, ардуинщики делятся на две категории: которые ещё не применяют модуль на микросхеме MPR121, потому что о нём не знают, и которые знают и применяют. Третьего не дано, ведь это очень удобная вещь. Мало того, что целых 12 кнопок позволяет подключить, заняв у Arduino всего две "ноги", так ещё и кнопки - емкостные, которые могут быть изготовлены самостоятельно из бросовых материалов, грубо говоря - хоть из "фольги от шоколадки", что пусть и частично, но компенсирует стоимость модуля.Более того, несколько модулей могут занимать всё те же две "ноги" Arduino совместно, нужно только перемычками задать им разные адреса - это классическое свойство шины I2C, о котором часто забывают. А ещё емкостные датчики, в отличие от широко применявшихся ранее сенсорных пластин, могут быть и покрыты слоем диэлектрика - реакция на прикосновение всё равно будет.

И это решение значительно выгоднее плат серии Teensy, где ничего дополнительного для реализации той же функции не требуются. Но всё же, если модулей несколько, то получается довольно дороговато. А можно ли подключить к одному модулю в той раза больше емкостных датчиков, правда, ценой потери функции мультитача? Оказывается, можно, и автор сайта Arduino Project Hub под довольно необычным ником Arduino “having11” Guy рассказывает, как. Свой проект он выложил по адресу https://create.arduino.cc/project....-f98144 под лицензией GPL версии 3 или более новой на ваш выбор.

Весь секрет - в вот такой сетке из полос фольги:

подключение mpr121

Изготовить-то её несложно, чуть сложнее догадаться, как она работает. Нет, между собой горизонтальные полосы с вертикальными при прикосновении не соединяются. Друг от друга, как и от пальца пользователя, они должны быть изолированы всегда. Просто палец при поднесении к пересечению воздействует одновременно на две полосы: одну горизонтальную и одну вертикальную. И программа определяет, какое из 36 пересечений выбрал пользователь. А если прикоснуться одновременно, например, к двум пересечениям, возникнет неопределённость - поэтому в такой конфигурации мультитач и невозможен.

Схему мастер показывает вот так:

arduino к mpr121

Это даже не Fritzing, это обычная фотография. Но по ней всё понятно. Учтите, что питать устройство необходимо напряжением в 3,3 В - от 5 В модуль выходит из строя. Далее - скетч:

Код
#include <Wire.h>
#include "Adafruit_MPR121.h"

Adafruit_MPR121 cap_sense = Adafruit_MPR121();

#define MPR121_ADDR 0x5A
#define PRINT_DELAY 200

uint32_t sensedPoints[6][6];
volatile bool readFlag = false;

// Rows are pin 0-5, cols are pins 6-11
/*

Pin 6 | 7 | 8 | 9 | 10 | 11
0 | | | | | |
------|---|---|---|----|---
1 | | | | | |
------|---|---|---|----|---
2 | | | | | |
------|---|---|---|----|---
3 | | | | | |
------|---|---|---|----|---
4 | | | | | |
------|---|---|---|----|---
5 | | | | | |
------|---|---|---|----|---

*/

void setup()
{
  Serial.begin(115200);
  while(!Serial);
  if(!cap_sense.begin(MPR121_ADDR))
  {
  //Serial.println("Error setting up MPR121");
  while(1);
  }
  attachInterrupt(digitalPinToInterrupt(2), updateSensedFlagSet, FALLING);
  //Serial.println("Ready to sense");
}

void loop()
{
  /*if(readFlag)
  {
  readFlag = false;
  updateSensed();
  }*/
  updateSensed();
  printTable();
  delay(PRINT_DELAY);
}

void printTable()
{
  Serial.println("TABLE");
  for(int i=0; i<6; i++)
  {
  for(int j=0; j<6; j++)
  {
  if(j != 5) Serial.print(String(sensedPoints[i][j]) + " | ");
  else Serial.println(String(sensedPoints[i][j]));
  }
  //if(i == 5) Serial.println("\n-------------------\n");
  }
   
}

void updateSensedFlagSet()
{
  readFlag = true;
}

void updateSensed()
{
  //Serial.println("Reading");
  for(uint8_t i=0; i<6; i++)
  {
  for(uint8_t j=0; j<6; j++) sensedPoints[i][j] = cap_sense.filteredData(i) * cap_sense.filteredData(j + 6);
  }
  //Serial.println("Table updated");
}

Требуется библиотека Adafruit_MPR121.h, она лежит здесь: https://github.com/adafruit/Adafruit_MPR121. При этом модуль может быть и другого производителя, не обязательно Adafruit, главное - на таком же чипе.

В текущем виде программа выводит данные о прикосновениях в монитор последовательного порта. Вам же остаётся реализовать какой-нибудь проект - либо на ПК, смартфоне или планшете, подключённом к Arduino, либо на самом Arduino. Это может быть, например, научный калькулятор - 36 кнопок для него в самый раз, а мультитач не требуется: кнопку 2ndF или просто F надо нажимать не одновременно с другой, а перед ней. Ещё можно сделать синтезатор - одноголосный, зато трёхоктавный, что весьма удобно. Но чтобы возможности одноголосного синтезатора были достаточно широкими, следует предусмотреть в нём возможность выбора множества различных тембров - именно так часто компенсируют одноголосность, и слушатель часто даже не догадывается, что она есть.

Разумеется, этими двумя примерами применение 36 емкостных датчиков без мультитача не ограничивается. Что ещё можно на них реализовать, подскажет ваша фантазия, а помогут в реализации - навыки программиста.

Не пропустите обновления! Подписывайтесь на нашу группу Вконтакте и страницу в Twitter!
Так же у нас есть Telegram канал.

Вам понравился наш материал? Поделитесь с друзьями!

Оценка статьи: 0.0 из 5. Уже оценило 0 читателей
Автор: tormozedison
Источник: https://create.arduino.cc/projecthub/gatoninja236/capacitive-touch-sensing-grid-f98144


Вам может быть это интересно

Всего комментариев: 0
Добавить комментарий
Все смайлы
Сейчас читают