проблема с touch screen
- Войдите на сайт для отправки комментариев
Сб, 21/09/2013 - 19:49
первый раз в жизни подключил touch screen схему и код здесь брал http://kalshagar.wikispaces.com/Arduino+and+a+Nintendo+DS+touch+screen, выводить собрался на max7219 по другому проверить нет возможности, ком порта нет( индикатор ерунду выводи и значения не меняются, как буд то вместо touch screen-а постоянные резисторы, что не так в коде?
#define xLow 12 #define xHigh 13 #define yLow 14 #define yHigh 15 //////// #include "LedControl.h" LedControl lc=LedControl(29,31,33,2); int h,j = 0; void setup(){ int devices=lc.getDeviceCount(); for(int address=0;address<devices;address++) { lc.shutdown(address,false); lc.setIntensity(address,5); lc.clearDisplay(address); } } void loop() { pinMode(xLow,OUTPUT); pinMode(xHigh,OUTPUT); digitalWrite(xLow,LOW); digitalWrite(xHigh,HIGH); digitalWrite(yLow,LOW); digitalWrite(yHigh,LOW); pinMode(yLow,INPUT); pinMode(yHigh,INPUT); delay(10); int x=analogRead(xLow -14); pinMode(yLow,OUTPUT); pinMode(yHigh,OUTPUT); digitalWrite(yLow,LOW); digitalWrite(yHigh,HIGH); digitalWrite(xLow,LOW); digitalWrite(xHigh,LOW); pinMode(xLow,INPUT); pinMode(xHigh,INPUT); delay(10); int y=analogRead(xLow -15); h = map(x, 0, 1023, 0, 15); j = map(y, 0, 1023, 0, 15); lc.setDigit(0,0,h,false); lc.setDigit(0,1,j,false); delay (200); }
вот нарыл некоторую информацию:
Аналоговые входы могут использоваться как цифровые, при обращении к ним по номерам:
14 — A0
15 — A1
16 — A2
17 — A3
18 — A4
19 — A5
это всё замечательно, но у меня мега! а как же А6 - А15? именно там и тач подключён...
подскажите литературку пожалуйста!
Гугл вам в помощь - первая же ссылка приводит к нужной табличке.
Возможно, она даже правильная.
я сейчас сделал на тех пинах которые на 100% работают во всех описаниях(A0,A1,A2,A3), пробовал другой код там где задействованы 4 аналоговых и 2 цифровых пина, всё равно не пошло, по схеме всё правильно подключено, тестером проверил сам тач -всё работает, пробовал библиотеку подключать, тоже не пошло((( индикатор выводит нулевой результат.
HELLP!!!!!
>100% работают во всех описаниях(A0,A1,A2,A3)
Так а почему же вы к ним не хотите подключить тач? Если в к ним и подключили, то... вы забыли об этом контроллеру сказать. Ему вы сообщили что подключение произведено на D0,D1,D2,D3
Кстати на D2 же висит и индикатор (что может быть череповато).
Так что вам, возможно, имеет смысл отключить индикаторы, отключить тач. Взять базовый туториал по кнопкам, перечитать digitalRead() и научится использовать пины A0,A1,A2,A3 в качестве цифровых.
После этого - не будет проблемм с описанием подключения. А то сейчас вы играете в "угадайку". Методом научного тыка ищите. На железе - так и попалить не долго.
>100% работают во всех описаниях(A0,A1,A2,A3)
всё делал так как описано здесь, вплоть до пинов!
http://kalshagar.wikispaces.com/Arduino+and+a+Nintendo+DS+touch+screen
http://mnicolato.altervista.org/arduino/ardtouch.htm
http://habrahabr.ru/post/108972/ здесь пробовал библиотеку
Так а почему же вы к ним не хотите подключить тач? Если в к ним и подключили, то... вы забыли об этом контроллеру сказать. Ему вы сообщили что подключение произведено на D0,D1,D2,D3
в первом коде я не был знако с применением аналоговых входов как цифровых, всё изменил на
и подкючил соответственно без ошибок, проверял не раз тестером. (конструкция сего устройсва насчитывает 47 микрух, от меги остаток 15 D пинов, но это не так важно, важно то что всё правльно подключено
Кстати на D2 же висит и индикатор (что может быть череповато).
это не пин, это количество микрух.
Так что вам, возможно, имеет смысл отключить индикаторы, отключить тач. Взять базовый туториал по кнопкам, перечитать digitalRead() и научится использовать пины A0,A1,A2,A3 в качестве цифровых.
у меня нет другова способа как проверить работоспособность устройства, есть только 2 x max7219 и 16 разрядов индикатора, или паять схему согласования с ком портом компа, на плате меги не работает FTDI(
После этого - не будет проблемм с описанием подключения. А то сейчас вы играете в "угадайку". Методом научного тыка ищите. На железе - так и попалить не долго.
у меня 20 летний стаж в электронике начиная от ламп, понимаете я очень удивляюсь в то что происходит, всё правильно и без ошибок, ничего лишнего только то что нужно! и всё же не хочет..... я сначало думал что то с самим точ скрином, но нет, подключил второй тоже самое, тестер показывает его работоспособность на 100% проверял непосредственно на пинах arduino, ну не понимаю где тут камни... как ещё можно проверить что бы не городить сом порт???
Я вижу код который вы дали последним. В сообщении #3.
На словах вы сказали что подключили к A0,A1,A2,A3, в коде я вижу подключение к D0,D1,D2,D3
Значит явно либо невнимательность, либо есть непонимание как описывать "аналоговые в качестве цифровых". Поэтому возмите подключите светодиод к A0 и попытайтесь его зажечь с помощью digitalWrite() (или хотя-бы тестером убедитесь что умеете туда подать 5v)
это пример библиотеки, я ничего не менял, только очерёдность чуть подправил под схему, вот код посмотрите:
В первом коде, кстати вы тоже, учитыая что у вас мега, работаете далеко не с A0,A1,A2,A3. Ссылку которую вам дал step962 вы не читали.
Что-бы подать HIGH на A0, что нужно вписать вместо ????, в таком коде?
В первом коде, кстати вы тоже, учитыая что у вас мега, работаете далеко не с A0,A1,A2,A3. Ссылку которую вам дал step962 вы не читали.
Что-бы подать HIGH на A0, что нужно вписать вместо ????, в таком коде?
разве не так?
это пример библиотеки, я ничего не менял, только очерёдность чуть подправил под схему, вот код посмотрите:
А менять нужно. Так что как и первый ваш пример. Это код не для меги.
Что-бы понять "на что менять". Нужно понять как работать с аналоговыми в качестве цифровых.
Поэтому, хотите или нет, но прийдется разбиратся с основами. Вначале нужно научится зажигать светик на A0 пине.
Если бы сразу это сделали (отложили индикаторы/тачскрины в сторону), то уже бы сами увидили что нужно подправить.
Ну, так на что нужно заметить знаки вопроса в digitalWrite(????,HIGH)?
pinMode(14,OUTPUT);
разве не так?
А что тестер/светодиод вам говорит? Неужели говорит "так"?
я так и не понял, туго до меня доходит... непосредственно пин?
Port Pin Function
PF 0 54 A0
PF 1 55 A1
PF 2 56 A2
PF 3 57 A3
PF 4 58 A4
PF 5 59 A5
PF 6 60 A6
PF 7 61 A7
PK 0 62 A8
PK 1 63 A9
PK 2 64 A10
PK 3 65 A11
PK 4 66 A12
PK 5 67 A13
PK 6 68 A14
PK 7 69 A15
Ссылку step962 почему упорно не хотите смотреть? Даже если не знаете английский. Он дал наводку "там есть табличка".
Вообщем у вас еще одна попытка :)
я так и не понял, туго до меня доходит... непосредственно пин?
Что тут непонятно? номер пина находится в колонке Pin. И в строке A0, там совсем не 14-ть.
вот только что изменил
не работает, почему?
Ссылку step962 почему упорно не хотите смотреть? Даже если не знаете английский. Он дал наводку "там есть табличка".
Вообщем у вас еще одна попытка :)
я кстати смотрел, но так нечего и не понял так как не дружу с английским( и решил сделать как в примерах, перепаял пины, и выходит зря(
Вообщем у меги, A0,A1,A2 и т.п. имеют нумерацию не с 14-ти, а с 54-рех.
Только не нужно верить мне на слово. Возмите и проверте это.
Когда проверите тогда будем разбиратся:
1. Как поправить и стартовый код и библиотеку
2. Сделать это так, что-бы он стал подходящим для любых плат (авторы библиотеки и стартового примера намного "слажевали", можно сразу было написать так что бы поправки не требовались).
сейчас светодиод припаяю непосредственно, что бы убедится, но сначала перекур а то голова уже кругом, 2 дня мучаюсь с этим скрином...
вот только что изменил
не работает, почему?
Потому что "побежали вперед". Сколько раз прозвучало "отложите тачскрин, возмите тестер/светик" и убедитесь что правильно работаете с пинами?
Я же сказал "нужно будет править библиотеку". Библиотека правилась? Нет. А прежде чем лезть править библиотеку - разберитесь почему стартовый пример не работет. Поэтом аналогичную траблу найдем в библиотеке и поправим.
Итак
digitalWrite(54,HIGH) дает напряжение на A0 пине?
сейчас светодиод припаяю непосредственно,
Ну не нужно так "на века". Это же тестовое на 5-ть минут. Пустите
Возмите тестер и замеряйте напряжение на между GND и A0 (у вас будет на это 10-ть секунд после перезагрузки платы, после этого он опять включится в режим входа).
ничего не происходит
ничего не происходит
Возьмите код еще раз. Я поправил. Случайно написал pinMode/pinMode вместо pinMode/digitalWrite, так и не выдал напряжение на пин :(
изменение порта на 55 так же
изменение порта на 55 так же
Вы именно digitalWrite-том делаете? Может не успеваете замерить? Сделайте побольше интервал в delay(). Я специально потом выключаю (что-бы случайно, если тачскрин подключите с этим скетчем не дать на него постоянное напряжение).
вышла "1" но не пропала
я копирую здесь и вставляю в IDE после CTRL+SHIFT+U, больше никаки операций
а так в коде 100 секунд)) пропало, как надо
вышла "1" но не пропала
Пропадет. через 100 секунд. Лишний нолик в delay закрался :)
Ну значит, работает :)
А теперь, если мы посмотрим в Arduino.h, то мы найдем там примерно такой код:
А это означит, что для цифровых пинов у нас уже есть заданные константы. Причем они сами "подстраиваются" под какую плату мы компилируем.
Поэтому мы можем не морочится с запоминанием "где 14, где 54". А прямо тупо писать.
И оно будет корректро работать на любых платах. И на Uno и на Mega
Попробуйте.
да, всё работает
Кстати все стандартные функции работы с пинами digitalRead/digitalWrite/pinMode/analogRead корректно работают если им кормить цифровой номер пина. Скажем analogRead(54) или analogRead(A0) - тоже корректно прочитает.
Поэтому то что делал автор стартового скетча в строках 32 и 46 - это ошибка (приводил номер пина к 0,1 путем вычитания 14,15). Но ошибка настолько типичная, что analogRead содержит "защиту от дурака" (если покопатся в ее исходниках). Если ей скормили малый номер пина - она сама добавляет к нему 14 (или 54 на меге).
Так что у автора скетча делается "лишняя работа". Вначале от отнимает 14-ть, а потом analogRead - "отыгрывает это назад".
Так что, что-бы запустить стартовый скетч вам нужно:
В #define пины прямо так и указать в виде A0,A1,A2,A3.... (какой к чему - сами смотрите).
В строках 32,46 - выкинуть нафиг отнимание вообще. Оно либо просто "делает лишню работу" (на UNO), либо "делает ошибку" (на Мега). там должно быть что-то типа analogRead(xLow), analogRead(yLow).
Кстати... обратите внимание, что в старотовом, с той нумерацией - вообще фигня. xLow - у вас 12, потом отнимаем от него 14 и 15. Получаем отрицательные номера пинов. Вы там делаете попытку analogRead(-2) и analogRead(-3), а потом удивляетесь "почему не работает".
Для вывода, работавшего ранее как цифровой порт вывода, команда analogRead будет работать некорректно. В этом случае рекомендуется сконфигурировать его как аналоговый вход. Аналогично, если вывод работал как цифровой порт вывода со значением HIGH, то обратная установка на ввод подключит подтягивающий резистор.
Руководство на микроконтроллер Atmega не рекомендует производить быстрое переключение между аналоговыми входами для их чтения. Это может вызвать наложение сигналов и внести искажения в аналоговую систему. Однако после работы аналогового входа в цифровом режиме может потребоваться настроить паузу между чтением функцией analogRead() других входов.
что то я совсем запутался, кажется всё просто с этим тач скрином, а тут головоломка оказалась, сейчас подправлю
к чему это "горячечное эссе о бромиде бора" (C) ? :)
Во первых в старотовом скетче - уже юимеются по этому поводу delay(10); Перед analogRead()
Во вторых в библиотеке решили на это "забить", так как зачастую digitalWrite/digitalRead настолько тормознутые (по сравнению с прямой записью в порты), что зачастую их задержки хватает самой по себе.
Но мы пока пытаемся получить что-то от стартового.
Показывайте что у вас получилось после поправок.
А еще было-бы неплохо вычистить его от "все лишнего". Вначале заставить работать, а потом уже "обвешивать цяцками". Так что можно выкинуть все эти ledControl и т.п., что-бы не "зашумлять проблему" и делать обчные Serial.print("x=");Serial.println(x);
И смотреть в Serial (а не гадать, не хомутнули ли мы чего еще и с индикатором). Плюс в том, что из сериал монитора можно еще и copy-past сделать на форум. Показать "что происходит". А с "индикатора" - уже облом.
всё заработало как надо! я исправил ещё ошибки в строке 32,46 одно и тоже... вот бы ручки поотрывать умельцам попантоваться кодом в сети, а после чайники как я ломают голову и время тратят... ето равносильно если я сделаю что то из электронники и при этом зарою ошибку -разберайтесь сами.... не хорошо как то
у меня Serial это 16 семисегментных разряда, а если бы их не было? я бы повесился уже....
всё заработало как надо! я исправил ещё ошибки в строке 32,46 одно и тоже...
Вообщем-то нет. Там таки есть разница. И на UNO скоре всего это работает.
вот бы ручки поотрывать умельцам попантоваться кодом в сети, а после чайники как я ломают голову и время тратят...
1. А никто ничего вам не обещал. Вы оплатили написание этой статьи? Какие претензии?
2. Даже в ошибном виде статья подсказывает направление "куда копать" (и кстати, попробуйте сами написать такую статью - удивидесь сколько времени это занимает).
3. "Тратить время" - это суть самодельчества. Если не хотите или заказывайте тому кто уже потратил и оплачивайте его усилия, либо покупайте готовое. А то так можно дойти и до.... "я трачу время, когда вы с третьего повторения делаете то что вам посоветовали".
4. Избавляйтесь от дурной привычки копировать код как "магия которая работает". Если берешь код к себе в проект - убедись что понимаешь что делает КАЖДАЯ строчка. В отличает от PC, тут скетчи маленькие - можно себе позволить такое.
5. Вы купили МЕГА. Хотелось "всего побольше". Привыкайте что отвественность за адаптацию примеров из сети под мегу - лежит на вас. Библиотеки/примеры работающие с SPI,I2C, прямой записью в порты и т.п. могут требовать "поправки на ветер".
6. Когда писалась статья - вообще могло не быть мег.
ето равносильно если я сделаю что то из электронники и при этом зарою ошибку -разберайтесь сами.... не хорошо как то
Можно подумать в сети мало подобных примеров когда в электронике лажа.
А если я по статье о починке магнитофона Маяк, начну чинить магнитофон производства Sharp мне тоже возмущатся что "статья вводит в заблуждение"?
Вообщем как-то не позитивно вы настроены. Вместо радости от решения трудно задачи (для новичка) и того что узнали новое об особенностях своей платы - какой-то негатив.
К автору библиотеки у вас наверное тоже будут претензии? (уже как-то и расходелось расказывать что в ней править нужно).
немного откалибровал) в принципе через map 7 битные данные пойдут на Serial, с параметром скорости 31250 Кбит/с, догадались для чего?
библиотеку я ещё не проверял, всё читал... и читал... в строках 32,46 указан один и тотже порт в итоге у меня были только оди показания... сейчас попробую библиотеку, всё позитивно это Вам так кажется, я просто выразил ещё раз, а смерился с этим уже давно) ну да ладно, сейчас попробую библиотеку.
немного откалибровал) в принципе через map 7 битные данные пойдут на Serial, с параметром скорости 31250 Кбит/с, догадались для чего?
откуда я могу знать "для чего". по midi много чего работать может. Может инструмент делаете, может DJ пульт, может подхватили вирус "светящиеся костюмы", может светомузыку, может пиротехнику делаете....
библиотеку я ещё не проверял, всё читал... и читал... в строках 32,46 указан один и тотже порт в итоге у меня были только оди показания...
Ну тогда вглядывайтесь в строки 32, 46 до просветления. Пока не увидите между ними разницы и что "один и то тже порт" - вам только чудится. Скопируйте куда-то в блокнот эти строки и сравнивайте побуквенно.
32
32
int
x=analogRead(xLow -14);
32
46
int
x=analogRead(xLow -14);
не ужели есть разница? я не цифры имею ввиду)
на счёт прорамирования, так уж вышло что мне проще сделать и разобраться с 300 чипами жесткой логики, чем с 300 строками кода, как говориться каждому своё, я лет десять назад учил в академии с++ не вышло, после была необходимость в php для себя, но тоже малость...
снова всё не так получилось.... вобщем в строке 46 вместо yLow указано xLow.
библиотека с A0,A1,A2,A3 не заработала
32
32
int
x=analogRead(xLow -14);
32
46
int
x=analogRead(xLow -14);
не ужели есть разница? я не цифры имею ввиду)
Нет. Действительно тут нет разницы. Но это не код из статьи. И даже не код из стартового поста. Это какая-то ваша самодеятельность.
А то что вы задаете вопросы по коду который никто кроме вас не видит - так кто же тут виноват?
снова всё не так получилось.... вобщем в строке 46 вместо yLow указано xLow.
Все правильно указанно. Вы же электронщик. Тестером проверяли. На какие пины подаем напряжение, с какого снимает замер? Я же так понимаю что он работает по принципу обыкновенного делителя напряжения.
С точки зрения программера? Какой смысл делать analogRead yLow если мы только что включили его на выход и поставили его в LOW. Я вам и без замеров скажу что вам в 46 вернуть analogRead(yLow) - ноль он вернет.
библиотека с A0,A1,A2,A3 не заработала
А чего ей работать если ДВА раза сказали что ее поправить нужно, но никто ее не правил. По приказу начальства ей перековатся под мегу или как?
Вы ее код посмотрели? Нашли в ней проблему подобную проблеме стартового скетча? На какие номера пинов будут сделаны pinMode/digitalWrite если на вход ей мы подадим A0,A1,A2,A3 (54,55,56,57)?
действительно, посмотрел на оригинал статьи и увидел) наверно я когда правил код допустил ошибку а после выложил сюда... ну бывает... виноват)
изменил библиотеку, вырезал:
и всё что связано, всё заработало как надо)
интересный факт, я сделал копию оригинала h и cpp, так и назывались "копия***.h&cpp" изменил код, и компилятор начал ругаться что мол в "копия***.h&cpp" ошибки... как понимать? почему к копии обращение а не к родному???
на счёт прорамирования, так уж вышло что мне проще сделать и разобраться с 300 чипами жесткой логики, чем с 300 строками кода, как говориться каждому своё, я лет десять назад учил в академии с++ не вышло, после была необходимость в php для себя, но тоже малость...
М.... даже не знаю. Это к чему? Пожалеть вас нужно? Чего вы ждете?
Любая область для новичка подразумевает усилия.
Все когда начинали тратили время и бились с очевидными вещами. И даже с опытом просто задачи усложняются, а "возявкание на ровном месте" - никуда не исчезает. Любом "примитив" может оказатся с сюрпризом.
Я вот когда начинал с ардуиной тоже, в качестве "чего-то простенького" энкодер взял. Дешовый. А, итоге победить его смог больше чем через год (правда большие перерывы были, несколько неудачных подходов делал с перерывом в месяца). Но суммарно недели три на него потратил чистого времени. И да.... в итоге свелось к тому что нужно поменять всего одно слово. Только что-бы выяснить это.... пришлось таки многому научится. Пока знания не позволили собрать логический анализатор и посмотреть "что же там происходит в действительности" (ну а тут уже стало очевидно решение). А по статьям - там все примитивно и скучно :)
И что, я какие-то претензии выставлял авторам? Да нет конечно. Зато, благодаря ему разобрался и с таймерами/прерываниями, прямой работой с портами и т.д. и т.п.
Вообщем "не нойте". Хотите учится/разбиратся - учитесь. Не хотите - ну так вас никто не заставляет.
У зауча моего лицея, была одна универсальная фраза на любые отмазки: "ваши подробности".
всё верно расказываете, я согласен, пока собаку не сьешь не поймёшь.