Сенсорная панель

Lihtelf
Offline
Зарегистрирован: 24.12.2012

Уже несколько недель ищу способ, как сдеалть сенсорную панель с распознованием координаты касания.
Все делается при помощи библиотеки Capacitive sensor.

Эксперементирую с :
-Бумагой(как основа)
-Графит и чернила гелевой ручки( как проводящее покрытие имеющее большое сопротивление)

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

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

Итак,небоходима ваша помощь :
- с идеей подбора способа и материала покрытия
- в объяснении того, как будет работать сопротивление на панели(бумажке)
- в выборе способа подключения контактов к бумажке

Подобных идей не нашел нигде!!!!(что очень пугает)
Было одно видео похожее на ютюбе, но там парень привязал контакт земли к руке)))

Купить сенсор резистивный или емкостный не предлагать!!!
Во-первых, дорого
Во-вторых, хочу понять как это работет и сделать несколько таких сенсоров разных размеров

Lihtelf
Offline
Зарегистрирован: 24.12.2012
AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Лучше всего с графитом. Попробуйте лак 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 р всего :)

Lihtelf
Offline
Зарегистрирован: 24.12.2012

Лак вроде бы не плохой, только дороговат и не слишком ли маленькое у него сопротивление?

На лазерном принтере просил друга принести черный лист, так вот он вообще ничего не проводил!(есть предположение , что был использован струйный принтер, еще уточню)))

Резисторы это круто, только сколько проводов мне еще нужно будет, а тут их всего четыре)))))))

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Проводов столько же.

Лазерники не любят печатать поле - попробуйте лучше сеточку.

Вот еще вариант:

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

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Lihtelf пишет:

Лак вроде бы не плохой, только дороговат и не слишком ли маленькое у него сопротивление?

Неважно, сопротивление всегда преобразовать можно, главное, чтобы равномерно было.

Lihtelf
Offline
Зарегистрирован: 24.12.2012

Тогда почему бы не взять фольгу?

Lihtelf
Offline
Зарегистрирован: 24.12.2012

Резисторов нет вообще, может попробовать мутанта из того, что у меня на видео(ссылка выше фотки), и того что вы предлагали?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Да, с маленьким сопротивлением - это я хватил... Если наводки ловить, то нужно сопротивление стороны не менее 100кОм

Попробуйте графитом от карандаша натереть бумажку.

Lihtelf
Offline
Зарегистрирован: 24.12.2012

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

esisl
Offline
Зарегистрирован: 21.05.2015
#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);
Это пауза при обнаружении нажатия, напряжение на входе арджуны довольно долго устаканивается, и нужна пауза, иначе он вместо напряжения на делителе показывает напряжение накопленное на конденсаторе между подложкой и мембраной.

Logik
Offline
Зарегистрирован: 05.08.2014

Хмм... Два года натирания графитом от карандаша бумажки не прошли напрасно. Проступил код. Даже delay не забыли.

esisl
Offline
Зарегистрирован: 21.05.2015

Я не сразу сообразил, что это некропост :)

Сам графитом бумажку натирал дня три пока заработало.

Logik
Offline
Зарегистрирован: 05.08.2014

Работает?! 8D

Тогда подрорбной описание + фото + слайды нужны! Мало ли, может кто ещё захочет

esisl
Offline
Зарегистрирован: 21.05.2015

Я ссылку дал на робофорум.

http://roboforum.ru/forum10/topic15477.html

 

Щас уже сделал, чтобы после сброса, первые 5 нажатий - программирующие. Он запоминает координаты для 1,2,3,4,5 мелодии.

После чего переходит в режим работы и будет на каждое запомненное нажатие проигрывать соответствующую мелодию.

Logik
Offline
Зарегистрирован: 05.08.2014

Почитал. Забавно. А как стабильность? Не осыпается со временем графит?

 

esisl
Offline
Зарегистрирован: 21.05.2015

А хз :) Вот и проверим.

Второй вариант - взять нихромную фольгу. Но это только заказывать на заводе.

Logik
Offline
Зарегистрирован: 05.08.2014

В алгоритме у Вас ест //7.4. Если А0 < 512 то считаем, что произошло нажатие

На "казенном" таче такой подход дает редкие ложные срабатывания, порядка раз в пару часов. Спасает цикл, типа:

  for (byte b=3;b;b--)
  {

      delayMicroseconds(PauseMicrosec);

      A = analogRead(XM);  //определяем факт нажатия

      if (A<20) //если не нажато
      {
          RESIST_TS_OUT(XM);
          return false;  // нет нажатия
      }
  }
//ищем где нажато

 

esisl
Offline
Зарегистрирован: 21.05.2015

Проверять по таймеру длительность закорота?
Странно... Это видимо какая-то особенность "казёнки". Типа на шариках заряд набирается... Будем посмотреть. Фигня для детской игрушки, так что... Тестирование будет жёстким как в атомном реакторе :-D

Logik
Offline
Зарегистрирован: 05.08.2014

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

esisl
Offline
Зарегистрирован: 21.05.2015

Хмм... Дюже странно. Я если честно ни когда не разбирался с промышленными. Может они на низкие напряжения? Типа там перепад вольта полтора. Просто я с трудом не представляю, какую такую помеху можно навести на проводок длиной несколько сантиметров, подтянутый к +5В резистором :))) РЛС посветить? Сварочным аппаратом? :)

----------------------

Вот интересно, как 5-ти проводковым резистивным экраном МУЛЬТИТАЧ делают!?!!!

esisl
Offline
Зарегистрирован: 21.05.2015

Нашёл, как делается мультитач http://max-imsblog.blogspot.ru/2010/04/blog-post_22.html

Logik
Offline
Зарегистрирован: 05.08.2014

Статья по ссылке заканчивается "Вот такое вот лжепрограммное обеспечение" 8))).

Про помехи - они есть спорить с этим фактом безсмыслено. И радары, и сварка, и искры коллекторов двигателей, и электротранспорта, и импульсные БП,  и сосед-радиолюбитель и т.д.  Вы думаете задавить подтяжку в десяток кОм много надо?! Да еще и с такой "антеной" как у Вас. Помеха в десятую долю миливата и все. Если в этот момент проверять нажат тач или нет, то вполне можно принять за ложное нажатие. 

esisl
Offline
Зарегистрирован: 21.05.2015

Ну да. В принципе. Хотя на датчиках я даже в промышленных условиях никогда не сталкивался. Все пугали, а оно работает себе и работает. Хотя антидребезг да - нужен по любому.

Про "лжепрограммное обеспечение" - да :) Назвать эту хрень "мультитачем" - это большой маркетинговый оптимизм. Определённый смысл для улучшения повышаемости дешёвых смартфонов имеет. Но боюсь будет употреблено для ухудшения хорошего и удорожания плохого :)