Сенсорная панель
- Войдите на сайт для отправки комментариев
Уже несколько недель ищу способ, как сдеалть сенсорную панель с распознованием координаты касания.
Все делается при помощи библиотеки Capacitive sensor.
Эксперементирую с :
-Бумагой(как основа)
-Графит и чернила гелевой ручки( как проводящее покрытие имеющее большое сопротивление)
Графит и чернила это конечно круто, но есть минус(как минимум один), при нанесении на бумагу обычно получается неравномерно, соответственно выходят области с высокой и низкой проводимостью, а нужно , чтобы сопротивление было равным.
Однако, думаю это не единственная проблема , ибо если взять не панель(прямоугольной формы), а лишь полоску(ширина которой не больше двух сантиметров), то все работает почти идеально(можно посмотреть на видео, там качество не лучшее, да и снимать не оч удобно было, но на самом деле работает относительно не плохо, учитывая то, что для этого требуется лишь два порта ардуино)
Итак,небоходима ваша помощь :
- с идеей подбора способа и материала покрытия
- в объяснении того, как будет работать сопротивление на панели(бумажке)
- в выборе способа подключения контактов к бумажке
Подобных идей не нашел нигде!!!!(что очень пугает)
Было одно видео похожее на ютюбе, но там парень привязал контакт земли к руке)))
Купить сенсор резистивный или емкостный не предлагать!!!
Во-первых, дорого
Во-вторых, хочу понять как это работет и сделать несколько таких сенсоров разных размеров
http://yadi.sk/d/VWiQF_dE2Y7G3
Лучше всего с графитом. Попробуйте лак GRAPHIT33
Как вариант - лазерный принтер. Можно печатать сеточку с нужной плотностью для получения нужного сопротивления. Можно напечатать полоски и измерять сопротивление между соседними (в динамике) - номер замкнутых полосок даст одно координату, сопротивление между ними - вторую.
В общем - куча возможностей.
Во! еще мысля пришла! Выложить поле SMD-резисторов (скажем, 100х100 это будет 10000 резисторов - в наших магазинах обойдется в 10000х0,40=4000 рублей (ого!)? в китае это http://www.aliexpress.com/item/0805-SMD-resistor-1-10W-5-1ohm-20Mohm/636... - 2 шт 15х2=30$=900 р всего :)
Лак вроде бы не плохой, только дороговат и не слишком ли маленькое у него сопротивление?
На лазерном принтере просил друга принести черный лист, так вот он вообще ничего не проводил!(есть предположение , что был использован струйный принтер, еще уточню)))
Резисторы это круто, только сколько проводов мне еще нужно будет, а тут их всего четыре)))))))
Проводов столько же.
Лазерники не любят печатать поле - попробуйте лучше сеточку.
Вот еще вариант:
соединяете последовательно, скажем, 20 резисторов, от каждого проводите дорожку электропроводным клеем. При касании пальца на концах резистивной линейки будет наводка (сетевая) от пальца. Соотношение уровня наводки даст координату. Вторая координата - аналогичная конструкция, но "поперек".
Лак вроде бы не плохой, только дороговат и не слишком ли маленькое у него сопротивление?
Неважно, сопротивление всегда преобразовать можно, главное, чтобы равномерно было.
Тогда почему бы не взять фольгу?
Резисторов нет вообще, может попробовать мутанта из того, что у меня на видео(ссылка выше фотки), и того что вы предлагали?
Да, с маленьким сопротивлением - это я хватил... Если наводки ловить, то нужно сопротивление стороны не менее 100кОм
Попробуйте графитом от карандаша натереть бумажку.
Пробовал, при этом надо нажимать сильно, при сильном нажатии образуются углубления и т. д. , короче получается неравномерно, причем намного хуже, чем то что сделано чернилами гелевой ручки(на фото выше).
#include "pitches.h" int sensorPin = A0; // select the input pin for the potentiometer int sensorX = 0; int sensorY = 0; int maxX=0; int maxY=0; int sensorPress = 0; int i=0; int mode=0;//0 - запоминать координаты, 1 - играть песенки по координатам int currentSong=0; int X[5]; int Y[5]; int dXY=0; int old_dXY=0; // notes in the melody: int melody[][8]={{ NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4 }, { NOTE_B0, NOTE_C1, NOTE_B0, NOTE_C1, NOTE_D1, NOTE_CS1, NOTE_DS1, 0 }, { NOTE_D1, NOTE_CS1, NOTE_C1, NOTE_B0, NOTE_DS1, NOTE_DS1, NOTE_D1, NOTE_CS1 }, { NOTE_B0, NOTE_B0, NOTE_C1, NOTE_B0, NOTE_D1, NOTE_CS1, NOTE_B0, NOTE_B0 },{ NOTE_CS1, NOTE_C1, NOTE_B0, NOTE_CS1, NOTE_C1, NOTE_B0, NOTE_CS1, NOTE_C1 }}; // note durations: 4 = quarter note, 8 = eighth note, etc.: int noteDurations[] = { 4, 8, 8, 4, 4, 4, 4, 4 }; void setup() { // put your setup code here, to run once: pinMode(0, OUTPUT); pinMode(1, OUTPUT); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(sensorPin, INPUT); digitalWrite(sensorPin, HIGH); // включить подтягивающий резистор playMelody(1); Serial.begin(9600); } void loop() { //проверить нажатие digitalWrite(0, LOW); digitalWrite(1, LOW); digitalWrite(2, LOW); digitalWrite(3, LOW); sensorPress = analogRead(sensorPin); if(sensorPress<702){ //меряем по x digitalWrite(0, HIGH); digitalWrite(1, HIGH); digitalWrite(2, LOW); digitalWrite(3, LOW); delay(100); maxX = analogRead(sensorPin); //меряем по y digitalWrite(0, HIGH); digitalWrite(2, HIGH); digitalWrite(1, LOW); digitalWrite(3, LOW); delay(100); maxY = analogRead(sensorPin); //если mode==0 то запоминаем координату if(mode==0){ X[currentSong]=maxX; Y[currentSong]=maxY; Serial.print(currentSong); Serial.print(' '); Serial.print(X[currentSong]); Serial.print(' '); Serial.print(Y[currentSong]); Serial.print("\n"); playMelody(currentSong); currentSong++; if(currentSong>4){mode=1;} }else{ //определить самую ближнюю точку old_dXY=2048; currentSong=0; Serial.print(maxX); Serial.print(' '); Serial.print(maxY); Serial.print("\n"); for(i=0;i<5;i++){ dXY=abs(maxX-X[i])+abs(maxY-Y[i]); Serial.print(' '); Serial.print(X[i]); Serial.print(' '); Serial.print(Y[i]); Serial.print(' '); Serial.print(dXY); Serial.print("\n"); if(dXY<old_dXY){ old_dXY=dXY; currentSong=i; } } playMelody(currentSong); } // Serial.print(mode); // Serial.print(' '); // Serial.print(currentSong); // Serial.print(' '); // Serial.print(maxX); // Serial.print(' '); // Serial.print(maxY); Serial.print("\n"); } } void playMelody(int song){ //поём песенку Serial.print("----------\n"); // iterate over the notes of the melody: for (int thisNote = 0; thisNote < 8; thisNote++) { // to calculate the note duration, take one second // divided by the note type. //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc. int noteDuration = 1000 / noteDurations[thisNote]; tone(8, melody[song][thisNote], noteDuration); Serial.print(melody[song][thisNote]); Serial.print(' '); // to distinguish the notes, set a minimum time between them. // the note's duration + 30% seems to work well: int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); // stop the tone playing: noTone(8); } Serial.print("\n"); }http://roboforum.ru/forum10/topic15477.html
Обратитите внимание на delay(100);
Это пауза при обнаружении нажатия, напряжение на входе арджуны довольно долго устаканивается, и нужна пауза, иначе он вместо напряжения на делителе показывает напряжение накопленное на конденсаторе между подложкой и мембраной.
Хмм... Два года натирания графитом от карандаша бумажки не прошли напрасно. Проступил код. Даже delay не забыли.
Я не сразу сообразил, что это некропост :)
Сам графитом бумажку натирал дня три пока заработало.
Работает?! 8D
Тогда подрорбной описание + фото + слайды нужны! Мало ли, может кто ещё захочет
Я ссылку дал на робофорум.
http://roboforum.ru/forum10/topic15477.html
Щас уже сделал, чтобы после сброса, первые 5 нажатий - программирующие. Он запоминает координаты для 1,2,3,4,5 мелодии.
После чего переходит в режим работы и будет на каждое запомненное нажатие проигрывать соответствующую мелодию.
Почитал. Забавно. А как стабильность? Не осыпается со временем графит?
А хз :) Вот и проверим.
Второй вариант - взять нихромную фольгу. Но это только заказывать на заводе.
В алгоритме у Вас ест //7.4. Если А0 < 512 то считаем, что произошло нажатие
На "казенном" таче такой подход дает редкие ложные срабатывания, порядка раз в пару часов. Спасает цикл, типа:
for (byte b=3;b;b--) { delayMicroseconds(PauseMicrosec); A = analogRead(XM); //определяем факт нажатия if (A<20) //если не нажато { RESIST_TS_OUT(XM); return false; // нет нажатия } } //ищем где нажатоПроверять по таймеру длительность закорота?
Странно... Это видимо какая-то особенность "казёнки". Типа на шариках заряд набирается... Будем посмотреть. Фигня для детской игрушки, так что... Тестирование будет жёстким как в атомном реакторе :-D
Нет. Не заряд. Просто импульсные помехи иногда прилетают и ловятся вместо нажатия. неприятнол когда устройство начинает само взбрыкивать.
Хмм... Дюже странно. Я если честно ни когда не разбирался с промышленными. Может они на низкие напряжения? Типа там перепад вольта полтора. Просто я с трудом не представляю, какую такую помеху можно навести на проводок длиной несколько сантиметров, подтянутый к +5В резистором :))) РЛС посветить? Сварочным аппаратом? :)
----------------------
Вот интересно, как 5-ти проводковым резистивным экраном МУЛЬТИТАЧ делают!?!!!
Нашёл, как делается мультитач http://max-imsblog.blogspot.ru/2010/04/blog-post_22.html
Статья по ссылке заканчивается "Вот такое вот лжепрограммное обеспечение" 8))).
Про помехи - они есть спорить с этим фактом безсмыслено. И радары, и сварка, и искры коллекторов двигателей, и электротранспорта, и импульсные БП, и сосед-радиолюбитель и т.д. Вы думаете задавить подтяжку в десяток кОм много надо?! Да еще и с такой "антеной" как у Вас. Помеха в десятую долю миливата и все. Если в этот момент проверять нажат тач или нет, то вполне можно принять за ложное нажатие.
Ну да. В принципе. Хотя на датчиках я даже в промышленных условиях никогда не сталкивался. Все пугали, а оно работает себе и работает. Хотя антидребезг да - нужен по любому.
Про "лжепрограммное обеспечение" - да :) Назвать эту хрень "мультитачем" - это большой маркетинговый оптимизм. Определённый смысл для улучшения повышаемости дешёвых смартфонов имеет. Но боюсь будет употреблено для ухудшения хорошего и удорожания плохого :)