работа с сенсором
| |
vladimers | Дата: Понедельник, 03.02.2014, 23:42 | Сообщение # 1 |
Сержант
Группа: Проверенные
Сообщений: 45
Статус: Offline
| здравствуйте ,прошу помощи. имеется STM32F4+SSD1963 перерыл кучу примеров но так и ненашол оптимального и простого. надо какможно простой практический пример реализацыии сенсорной кнопки . например имеются кординаты кнопки - ( 669,144,781,216,0xF800); драйвер тайчпада имеет команды - TouchReadXY -считывание кординат isTouch- наличие касания,и TPReadX ,TPReadY тоесть при совпадении менялся цвет кнопки ,при отпускании -вернулся. опыта маловато в програмировании ,и некак правельно неполучается написать - либо вообще нереагирует на нажатие-либо реагирует на любое нажатие по сенсору и меняет цвет кнопки. автокалибровки нет ,всёравно её некуда сохранять пока ещо. просто выводил кординаты в раёне нарисованной кнопки и в будущем планировал задавать кординаты с небольшой поправкой . правда незнаю прокатит такое или нет. зарание спасибо. (драйвер тача )
|
|
| |
ВитГо | Дата: Вторник, 04.02.2014, 04:05 | Сообщение # 2 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| калибровка для сенсора должна быть обязательно !!
контроллер тачпада какой ?
Виталий (аka ВитГо)
|
|
| |
vladimers | Дата: Вторник, 04.02.2014, 04:49 | Сообщение # 3 |
Сержант
Группа: Проверенные
Сообщений: 45
Статус: Offline
| контролер XPT2046 но вроде как и с другими драверами на 7846 совместим . в Ф4 вроде некуда пока записывать калебровочные данные . причем сенсор работает . ресует точки . и драйвера пробывал разные 2-3 вида . у меня просто опыта правельно нехватает написать .потому может и несрабатывает кнопка. Код SSD1963_FillRect ( 669,144,781,216,0xF800);
{ if (TouchReadXY(&x,&y,true)){ isTouch ( ); x=TPReadX ( ); y=TPReadY ( ); if (x>670 && x<215 && y>145 && y <215 ){ SSD1963_FillRect ( 669,144,781,216,0x07FF);
}else{SSD1963_FillRect ( 669,144,781,216,0xF800);} писал и типа так и чуть посложнее . но кпримеру если кнопка несовсем попадает ,должнож както сработать пусть рядом нажатие . так неразу ненаодном вареанте у меня несработало . почему и решил спросить что возможно есть простое решение написания кнопки в примере или куске исходника.
|
|
| |
ВитГо | Дата: Вторник, 04.02.2014, 18:02 | Сообщение # 4 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| вот мой код.. собрал из разных примеров
Виталий (аka ВитГо)
|
|
| |
vladimers | Дата: Вторник, 04.02.2014, 18:34 | Сообщение # 5 |
Сержант
Группа: Проверенные
Сообщений: 45
Статус: Offline
| спс. я видел его на форуме. и пробывал ранее для проверки своего тайча на работоспособность . впринцепи прорисовка точек идёт такаяж как и у меня , но именно вот как прописать работу кнопки правельно ?
Сообщение отредактировал vladimers - Вторник, 04.02.2014, 19:34 |
|
| |
ВитГо | Дата: Вторник, 04.02.2014, 21:18 | Сообщение # 6 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| я не совсем понимаю вопрос..
определяем по координатам от х0 до х1 и от у0 до у1... просто проверяем на вхождение координат...
Виталий (аka ВитГо)
|
|
| |
vladimers | Дата: Вторник, 04.02.2014, 22:03 | Сообщение # 7 |
Сержант
Группа: Проверенные
Сообщений: 45
Статус: Offline
| я использовал вывод и отображения пример кординат. нажимая на отведённое месть под кнопку-записал на черновик отображаемые кординаты от х0 до х1 и от у0 до у1 (тоесть получается реальные кординаты какие надо чтоб попало на кнопку ?) и вот тут какраз мне надо пример написания кода как их использовать .
|
|
| |
Sergi | Дата: Среда, 05.02.2014, 00:09 | Сообщение # 8 |
Подполковник
Группа: Проверенные
Сообщений: 540
Статус: Offline
| У меня экран разделен на прямоугольники. 8х8. Соответственно одна кнопка это Хмакс/8 , Умакс/8. Если Х разделить на ширину кнопки (Хмакс/8) получим номер кнопки в ряду, также и с У. В итоге получаем кнопки от 11 до 88. Дальше простой IF по совпадению. Если постараться и провести калибровку, то срабатывания получатся точные вплоть до пикселя у границы. Но у меня зазор 4 пикселя убирают ложные срабатывания.
Сообщение отредактировал Sergi - Среда, 05.02.2014, 00:14 |
|
| |
vladimers | Дата: Среда, 05.02.2014, 04:26 | Сообщение # 9 |
Сержант
Группа: Проверенные
Сообщений: 45
Статус: Offline
| вот например пишу так Код void buton(){
uint16_t x, y;
SSD1963_FillRect ( 669,144,781,216,0x07FF);// ресунок кнопки
{// ждать нажатия if ( isTouch ( ) ); TouchReadXY ( &x, &y, true ); x=TPReadX ( ); y=TPReadY ( ); if (x>670 && x<215 && y>145 && y <215 )
{SSD1963_FillRect ( 669,144,781,216,0xF800);} // закрасить в красный
else {SSD1963_FillRect ( 669,144,781,216,0x07FF);}// вернули цвет начальный
} } но на жатие вообще нереагирует ,ну если несовпала кпримеру кордината на кнопке ,но рядомто должно както среагировать? или ошибка в написании ?
|
|
| |
ВитГо | Дата: Среда, 05.02.2014, 05:43 | Сообщение # 10 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| c таким кодом как бы можно и не заметить изменения цвета... у тебя логика программы - если генерируется нажатие - рисуем красным, а как только не генерируется - рисуем другим цветом..
получается что сначала ты зарисовал, а буквально следующим циклом уже закрасил другим цветом..
сделай сначала без возврата к начальному цвету (убери else).. и посмотри что получилось...
Виталий (аka ВитГо)
|
|
| |
vladimers | Дата: Четверг, 13.02.2014, 21:49 | Сообщение # 11 |
Сержант
Группа: Проверенные
Сообщений: 45
Статус: Offline
| пробывал убрать,никакой реакцыии на нажатие . попробывал даже чтоб была прорисовка пикселей и за ним код кнопки . так точки ресует по всему экрану и поверх кнопок - но так и несработало ниразу ,ведь поидее долженже сменить цвет . такое ущущение что какойто нюанс я неучитую по неопытности.
может требуется конвертор какой ещо? ( почему и ищу примеры ,куски кода чтоб хоть посмотреть как правельно вообще прописуется всёэто)
почти заработало ,но при нажиме кнопки мигает она при таком коде Код #include <stdint.h> #include <stdbool.h> #include <string.h> #include <stdio.h> #include <math.h>
#include "stm32f4xx.h" #include "stm32f4xx_spi.h" #include "stm32f4xx_rcc.h" #include "stm32f4xx_gpio.h" #include "SSD1963.h" #include "touch_7846.h"
struct Box { uint16_t x_start; uint16_t y_start; uint16_t x_end; uint16_t y_end; };
void buton(){ struct Box button; //расположение кнопки в пикселях на экране button.x_start = 669; button.y_start = 144; button.x_end = 781; button.y_end = 216; {
uint16_t x, y, aX, aY;
float fTemp;
TouchInit ( ); TouchSetScreenSize ( 800, 480 );
SSD1963_FillRect ( 669,144,781,216,0x07FF);// ресунок кнопки
{// ждать нажатия if ( isTouch ( ) ); {
// X aX = TPReadY ( ); fTemp = aX * 800.0F / 4096.0F; x = fTemp; if ( x > 799 ) x = 799;
// Y aY = TPReadX ( ); fTemp = aY * 480.0F / 4096.0F; y = fTemp;
SSD1963_PutPixel ( x, y, 0xFFFF );
if ((x >= button.x_start) && (x <= button.x_end) && (y >= button.y_start) && (y <= button.y_end))
// { if (x>670 && x<215 && y>145 && y <215 )
{SSD1963_FillRect ( 669,144,781,216,0xF800);} // закрасить в красный
else {SSD1963_FillRect ( 669,144,781,216,0x07FF);}// вернули цвет начальный
} }
}
}
ну уже сдвиги есть ,причем всё реагирует именно на кнопке ,осталось убрать мигание и както правельно определить её на будущее .Добавлено (13.02.2014, 21:49) --------------------------------------------- впринцепи с кнопками немного разобрался (поверхностно правда) но добился что чётко срабатываю по нажатию. вкл/выкл шим и меняют его частоту.
но возникла проблемка другая- могут уживаться тойчпад и SST25F016 если оба висят на SPI ? как разделить их ? (возможно есть у кого решение как их подружить ). и как организовать прерывание в сенсорных кнопках ? зарание спасибо.
Сообщение отредактировал vladimers - Среда, 05.02.2014, 21:13 |
|
| |
ВитГо | Дата: Воскресенье, 16.02.2014, 10:36 | Сообщение # 12 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| для того чтобы было прерывание по нажатию на сенсор - смотрите выходные линии : иногда среди них есть сигнал на котором появляется низкий уровень при нажатии на сенсор (как раз для генерации прерывания) http://easyelectronics.ru/arm-uchebnyj-kurs-vneshnie-preryvaniya.html
по поводу разделения SPI - выбор того или иного устройства делайте линией CS
Виталий (аka ВитГо)
|
|
| |
Hrustik | Дата: Вторник, 11.03.2014, 20:46 | Сообщение # 13 |
Рядовой
Группа: Пользователи
Сообщений: 1
Статус: Offline
| Ну что, разобрался? Нужна еще помощь?
|
|
| |
vladimers | Дата: Вторник, 11.03.2014, 22:25 | Сообщение # 14 |
Сержант
Группа: Проверенные
Сообщений: 45
Статус: Offline
| спасибо. всё заработало. пришлось сменить правда драйвер тайчпада (конфликтовали в паре с драйвером флеш микросхемы ). вдобавок на сайте стм32 были приведены примеры использования sst25 . вот они и внесли в какойто степени дополнительно проблему . (почемуто если прописую перед командой чтения или записи - команду типа -вывести на экран размер флеши или её ID - то непроисходит потом записи/чтения невкакую. стёр лишнее .оставил чисто запись/чтение -и всё заработало). единственное осталось попозже убрать "дребезг" кнопок тайчпада . сам тайчпад китайский сомнительного качества (родной доблестная укрпочта разбила вдребезги ) вот и бывает сработка тайча на определённые точки .тоесть бывает сработка в 2 точки стабильные на дисплее иногда.
Сообщение отредактировал vladimers - Вторник, 11.03.2014, 22:26 |
|
| |
|