Емкостная реализация Adctouch Touch для STM32F103 Совет по разработке

Юлиусбангерт
Чт, 3 августа 2017 г., 16:20
Прежде чем я наткнулся на эти доски разработки STM32F103, которые я играл с нано Arduino и хорошей реализацией емкостного сенсорного чувства. Эта библиотека от Martin2250 Требуется только один аналоговый штифт на сенсорный Популярная емкостная библиотека чувствительности Пола Баджера потребности.

Я знаю, что эта библиотека Adctouch является своего рода реализацией Atmels QTouch и каким -то образом использует какой -то внутренний конденсатор, и я также знаю, что она, кажется, работает только на Avr Arduinos ... Но мой вопрос ... У кого -нибудь есть идеи, как я могу работать на STM32? И если нет, есть ли какие -либо другие хорошие способы получить емкостное прикосновение, работая на этих досках без дополнительного оборудования?

Вот YouTube видео Объясняя принципал.

Любые идеи, как заставить это работать на досках разработки STM32F103?

Rogerclark
Чт, 3 августа 2017 г., 22:38
Я посмотрел на код AVR и, кажется, делает следующее

Установите Pinmode на подтягивание
Сделает ли какой -то преобразование АЦП с использованием аппаратных регистров аппаратного управления AVR.
Устанавливает вывод на вход
Принимает чтение АЦП с использованием анализа

Это происходит несколько раз и в среднем.

Главное, что я не понимаю, это то, почему код, кажется, делает одно преобразование АЦП, напрямую управляя оборудованием, а затем берет образец, используя API Arduino API.

Возможно, первое преобразование - это просто способ отложить на небольшой и фиксированный период времени.
Или, возможно, эти настройки регистра AVR делают что -то еще для PIN -кода.


Я посмотрел видео, но оно не дает никаких технических деталей принципала операции.

В любом случае..
Насколько я вижу, является основной целью операции использование внутреннего резистора подтягивания в качестве источника заряда, а ADC используется для измерения напряжения на конденсаторе, поскольку он заряжается.

Rogerclark
Пт, 04 августа 2017 г. 1:52
Обновлять

Последняя версия емкостной библиотеки Touch, кажется, здесь есть

https: // github.com/paulstoffregen/емкость

Это должно быть модифицировано для работы с STM32

Насколько я вижу, код, специфичный для платформы, находится в емкость.час

эн.G Это блок кода для ESP8266

https: // github.com/paulstoffregen/capac ... H#L95-L105

Блок кода, аналогичный этому.

КСТАТИ.
Если вы собираетесь перенести это в ядро, основанное на STM HAL, вы не можете просто использовать адреса Adderes, так как каждая серия MCU STM32 имеет разные базовые адреса для своего GPIO и т. Д. Таким образом, вам будет эффективно написать функции, которые обернуты, чтобы выглядеть как макросы.

fpistm
Пт, 04 августа 2017 г. 8:30 утра
Wi6labs внесли некоторые изменения для ядра STM32 в первом выпуске, но это был не правильный подход.
Право - тот, который предложен Роджером.

Для основного вопроса, иметь Adctouch без аппаратного обеспечения, кажется интересным проверить, возможно ли это с внутренней цепью STM32.

Rogerclark
Пт, 04 августа 2017 г., 11:29
Я просто посмотрел на это снова, и есть 2 разных метода выполнения емкостного прикосновения.

Похоже, что команда Arduino использует 2 -й проволочную версию для датчика.

Я посмотрел на описание того, как работает единый проволочный «QTouch», согласно GitHub Repo, и у него есть следующее объяснение
Зарядка испытательного штифта до 5 В через резистор подтягивания (не непосредственно для предотвращения коротких замыканий)
Разряжать внутренний конденсатор ~ 14pf
Установить булавку на Tristate
Подключите конденсатор 14pf с PIN -кодом, чтобы заряд распределялся равномерно
Важным обратите внимание здесь, кажется, является способность AVR «подключить конденсатор 14pf с штифтом»

Похоже, это подразумевает, что каким -то образом у AVR есть внутренний конденсатор, который может быть подключен к PIN.

Я не уверен, где этот конденсатор. Возможно, что это побочный продукт соединения АЦП, и каким -то образом есть способ «разряжать» внутренний конденсатор независимо от его подключения к штифту.

В любом случае, я не уверен, будет ли это работать на STM32, поскольку он, кажется, полагается на внутреннюю архитектуру ADC чипа AVR.

Кроме того, я не понимаю, как это не может быть связано с сетевым пикапом.

Я знаю, что видео показывает резистор 1K в серии с пикапом, но на самом деле это вообще не укрепит пикап сети, потому что входной импеданс на STM32 во много раз выше (вероятно, на 25 х или выше)

Я попытался написать какой -то код, который поднял штифт на низком уровне, а затем сразу же отобрал АЦП, пока его значение не изменилось примерно на 1000, но внутренняя емкость была полностью завалена в результате пикапа.

Если вам нужен очень грубый датчик сенсорной.Е-где-то, что вы получите пикап, это работает ;-)

Вход - это PA4, и предполагает плату BluePill со светодиодом на PC13 Active Low
void setup() { // put your setup code here, to run once: Serial.begin(); pinMode(PA4,INPUT); pinMode(PC13,OUTPUT); } void loop() { if (abs(analogRead(PA4) - 2048)>500) { digitalWrite(PC13,LOW); delay(10); } else { digitalWrite(PC13,HIGH); } delay(1); }

fpistm
Пт, 04 августа 2017 12:20
Я только что тестировал с помощью ucleo-F103RB на основе кода LIB: (с arduino_core_stm32)
Мой набросок: int ref0, ref1; //reference values to remove offset int ADCTouch_read(byte ADCChannel, int samples) { long _value = 0; for(int _counter = 0; _counter < samples; _counter ++) { pinMode(ADCChannel, INPUT_PULLUP); analogRead(ADCChannel); /* ADMUX |= 0b11111; ADCSRA |= (1< 100 samples value0 -= ref0; //remove offset value1 -= ref1; Serial.print(value0 > 40); //send (boolean) pressed or not pressed Serial.print("\t"); //use if(value > threshold) to get the state of a button Serial.print(value1 > 40); Serial.print("\t\t"); Serial.print(value0); //send actual reading Serial.print("\t"); Serial.println(value1); delay(100); }

Юлиусбангерт
Пт, 04 августа 2017 12:29
Я буду честно, внутренние архитектуры чипа полностью над моей головой, я нуб. Но емкостный штрих с одним штифтом кажется действительно отличной вещью, чтобы работать над STM32.

Это лучшие объяснения, которые я нашел в концепции:

http: // tuomasnylund.fi/drupal6/content/ ... LE-ADC-PIN
http: // chackteria.org/wiki/qtouchadc_library_for_arduino

Парень, который написал Другая версия на основе Оригинальная библиотека Arduino от Martin2250, также начался Весь этот проект Использование того же принципала на основе, но на Attiny85.

Я попробовал оригинальную библиотеку на ATMEGA328 (NANO), и она очень хорошо работает с хорошей повторяемостью и, казалось бы, низким шумом. Как это? Является фактом, что это также работает на Attiny85 из -за той же архитектуры Atmel с внутренним конденсатором 14pf?

Rogerclark
Пт, 04 августа 2017 12:45
Фредерик,

Я попробовал то же самое, но я также построил значение ADC, отправив его в сериал и используя дисплей Arduino Plotter

Я обнаружил, что я получаю множество сетевых пикапов, что действительно большое влияние на результаты.

Он обнаруживает, когда вы касаетесь штифта, но я думаю, что это в основном из -за пикапа сети, который превышает напряжение питания

Юлиусбангерт
Ср 16 августа 2017 г. 12:38
Я пытался заставить этот Adctouch надежно работать с минимальным шумом, и я, кажется, получаю некоторые нормальные результаты, я экспериментирую с использованием Digitalsmooth Filter от Пола Баджера и калибровка входов на лету.
Серийный платтер для восьми сенсорных входов касается один за другим, выглядит так:
Снимок экрана 2017-08-16 в 13.13.16.png
Снимок экрана 2017-08-16 в 13.13.16.PNG (115.93 киб) просмотрено 2458 раз

Арпрос
Пн, 09 октября 2017 г. 18:15
Я попробовал библиотеку Adctouch на мега -клоне, и она работает хорошо (у моих детей было очень весело играть на пианино, нажав на апельсины и банки с газировкой).

Я не думаю, что это просто сеть. Сегодня я пошел в центр спортивной области с телефоном и кабелем OTG, и это было так же отзывчиво, как и в помещении. Затем я взял это в помещении, сохраняя его запуск, чтобы он сохранил те же справочные данные ( демонстрационный набросок, который я использую Получает справочные данные о запуске, и я начал в середине поля), и я не видел никаких ложных срабатываний, которые вы ожидаете, если сеть забивает все-с большим, все сработало просто в помещении с тем же справочные данные.

Я использую более низкий порог активации, чем демонстрация Adctouch, 25 вместо 40.

У меня нет STM32, легко доступного прямо сейчас (один находится внутри ящика для проекта, а другой - по почте).
Photo.jpg
фото.JPG (111.63 киб) просмотрено 2318 раз

Арпрос
Чт 12 октября 2017 г. 12:57
[fpistm - Пт. 04 августа 2017 12:20] - Я только что заменил ADMUX |= 0b11111; ADCSRA |= (1<

Арпрос
Пт 13 октября 2017 г. 3:13
Вместо того, чтобы переносить сам код Adctouch, я попытался повторить, как я понимаю код Adctouch для работы. Так как я не знал, как вытащить АЦП на землю, я только что пожертвовал PA6, написал 0 и сделал преобразование в АЦП на PA6. Код (см. Ниже), затем измеряет прикосновение к PA7.

В настоящее время есть 4.Резистор 7K между штифтом и зажимом аллигатора, к которому я прикасаюсь, потому что мой STM32 заключен в трудный для открытия проекта, а у моего PA7 Pin есть 4.7K на нем.

Результаты удовлетворяют. Без прикосновения я получаю выходные значения в однозначных цифрах, и когда я прикасаюсь к клипу аллигатора, я получаю около 200. Когда я прикрепил зажим аллигатора к апельсину при запуске (важно, чтобы все, что прикрепил к PIN -коду, был там на загрузке, поэтому справочное значение может принять его во внимание), прикоснувшись к апельсине, я получу значения около 19 с легким прикосновением и около 30 с более твердым прикосновением. Теоретически, должно быть возможно создать миди -фортепиано с апельсинами для ключей и переменной скорости в зависимости от того, насколько тяжело нажимает!

Похоже, он работает как в помещении, так и на открытом воздухе (хотя я проверял только с большими задержкоймикросекундами () на открытом воздухе; я сомневаюсь, что это имеет значение). Вероятно, есть немного больше, чтобы настроить оптимальное использование, и нужно действительно сделать это на булавке без резистора.

Вот мой набросок: int32_t measure(int pin, int samples) { uint32_t total = 0; for (int i=0; i

Арпрос
Солнце 15 октября 2017 г., 17:04
Я получил новый STM32F103C8 по почте. Пример кода, который я опубликовал, работает нормально, но я завернул его в библиотеку с примером:
https: // github.com/arpruss/adctouchsensor
Библиотека работает на STM32, AVR и, вероятно, любого MCU, внутренняя работа по АЦП, похожая работа по АЦП.

На STM32F103C он использует тот факт, что ADC -канал 15, по -видимому, всегда заземлен (он не подключается к PIN -кону), и поэтому он не требует дополнительного PIN -кода. На других устройствах вам необходимо указать жертвенный аналоговый штифт, который заземлен, и который не должен быть ни к чему.

Мой опыт показывает, что не требуется дебайть.

Вот как использовать: #include ... ADCTouch button0 = ADCTouchSensor(PA0); // add a sacrificial pin number if needed ADCTouch button1 = ADCTouchSensor(PA1); ... button0.begin(); // calibrate touch sensors at startup button1.begin(); ... if (button0.read() > 40) { ... button pressed ... } if (button1.read() > 40) { ... button pressed ... }

Арпрос
Вт 17 октября 2017 г. 2:31
Если вы хотите больше демо -кода, вот простая, но работающая емкостная клавиатура MIDI Piano (используйте это ядро ​​для MIDI USB: https: // github.com/arpruss/arduino_stm3 ... Адмидихид ):
https: // github.com/arpruss/емкостный-пианино

Степпер.час