Бегущая строка на дисплее TFT 480х320 под управлением Ардуино
- Войдите на сайт для отправки комментариев
Сб, 13/10/2018 - 13:21
Здравствуйте !
Полскажите как создать бегущую строку на дисплее TFT 480 х 320 под управлением Ардуино Мега 2560 ?
За ранее благодарю.
1. Сформулировать задачу.
2. Нарисовать схему подключения.
3. Реализовать эту схему в "железе".
4. Составить и записать алгоритм.
5. Перевести этот алгоритм на Си.
6. Откомпилировать полученный текст и залить его в Ардуину.
Полскажите как создать бегущую строку на дисплее TFT 480 х 320 под управлением Ардуино Мега 2560 ?
Очень просто.
Выводите строку на экран. Через короткое время выводите строку еще раз, но уже начиная со второго символа. Еще через долю секунды - с третьего.
Каждый новый вывод делаете в одну и ту же строку дисплея. Задержки между выводом строчки будут определять скорость, с которой строка "пробегает" по экрану.
Ну, раз уж экран графический, имеет смысл сдвигать за один проход не на символ, а на пиксель. Будет выглядеть гораздо аккуратнее.
И не забывать стирать оставшееся на экране от предыдущего вывода. С этим могут быть разные неприятные сюрпризы.
Здравствуйте !
Дело в том, что вывод стандартными функциями текста не получается, так как у меня используется шрифт свой , большого размера. Поэтому сдвигать надо как и говорилось выше по пиксельно, но это у меня не получается.
Схема подключеничя стандартная. Обычный шририфт выводится без проблем.
Здравствуйте !
Дело в том, что вывод стандартными функциями текста не получается, так как у меня используется шрифт свой , большого размера. Поэтому сдвигать надо как и говорилось выше по пиксельно, но это у меня не получается.
Ну на такое заявление могу ответить только - "тренируйтесь".
Если выложите свой код, как вы пробовали и укажете, что именно не получилось - шансов на помощь станет больше.
Дело в том, что вывод стандартными функциями текста не получается, так как у меня используется шрифт свой , большого размера. Поэтому сдвигать надо как и говорилось выше по пиксельно, но это у меня не получается.
Это ОЧЕНЬ странное утверждение.
Если бы Вы не могли реализовать попиксельный сдвиг для стандартных функций вывода текста, в это тяжело, но все-таки можно поверить, а когда Вы пишете, что не можете адаптровать к попиксельному сдвигу те функции, которые сами написали... не верю!
Та не релизовывал он скорей всего никаких функций, он просто свой фонт докинул в либу, а там наверно вывод не с любого пикселя сделан, а типа по знакоместам. Так в половине либ есть. Вот и мается. Судя по ламерскому вопросу, ему до написания функций еще бесконечность осталась.
ему до написания функций еще бесконечность осталась.
О, годное высказывание, надо запомнить :)
1) Вы не правильно всё поняли. Стандартной функцией невозможно сделать бегущую строку справа на лево по экрану так, чтобы строка убегала за левый край экрана. Можно это сделать только для целых букв, при этом сдвиг строки происходит не плавно. А сделать так, чтобы исчезала плавно часть буквы не получается.
2) Свои функции я не писал предполагая, что кто-то может это уже делал и может подсказать как делать.
3) Встандартном шрифте буквы маленькие поэтому я сделал шрифт с буквами ицифрами большего размера и поэтому сдвиг происходит рывками.
1) Контроллер - вещь не слишком быстрая. Поэтому совсем универсальное решение (которое могло бы прозрачно для пользователя выводить часть буквы) оказывается очень медленным, а более или менее быстрое - неуниверсальным (не позволяющим обрезать часть буквы по краю экрана).
2) Естественно, кто-то делал. И, более того, Вам уже посказали, как делать. Даже несколько варианртов.
3) Сдвиг происходит так, как Вы его сделали. И иначе он происходить не может. Пока не сделаете по-другому.
Но вообще-то за те 2.5 дня, прошедшие с начала темы, можно было уже не только попробовать что-то написать, но и выбрать наиболее подходящий вариант.
Спасибо всем, решение принято - отказаться от этой затеи, с необходимой быстротой вывод сделать не возможно. Перемещение по экрану очень медленное.
еще не редко,попиксельный сдвиг строки можно осуществлять силами самого контроллера дисплея,посылая ему команду/конфигурируя на сдвиг и уже сам контроллер будет переносить информацию о пикселях в соседние ячейки(вправо,влево).реализация и возможности зависят от контроллера дисплея(ili9341,SSDxxx и т д)гуглиться по "имя контроллера дисплея" + Screen Scroll command/Screen shift.
Спасибо всем, решение принято - отказаться от этой затеи, с необходимой быстротой вывод сделать не возможно. Перемещение по экрану очень медленное.
"Очень медленное" - это сколько? (сколько fps при какой площади обновления экрана?)
приложили бы видео, иначе разговор не о чём.
что вам надо , давно уже сделано.
- пошукайте как сделано в либе mcufriend_kvb , там весь текст с картинкой пингвина смещается плавно и быстро. и часть картинки. и буквы уходят полностью за край.
видео на ютубе много . // https://youtu.be/cmZv8vEwR_8
Если надо еще как-то двигать - прочитайте даташит к ili9488 ili9486, там можно сдвигать обозначенную зону попиксельно средствами контроллера дисплея, это значит невероятно быстро.
Спасибо всем, решение принято - отказаться от этой затеи, с необходимой быстротой вывод сделать не возможно.
как-то очень категорично. Вместо "невозможно" напишите - "я не смог" - это будет ближе к правде :)
Ребята ! Вы добавили мне оптимизма, молодцы ! Я решил попробовать еще раз учитывая Ваши советы.
1) Я выводил пощадь знакоместа 24х48 пикселей, сдвигал на один пиксель влево. Весь экран 480 пикселей 1 знакоместо перемещалось за полторы минуты, при 2-х знакоместах время ещё увеличивалось, а строку в 20 символов я и пробовать не стал.
2) Очень понравился совет коннтроллере самого дисплея, но даташит вероятно на английском, а я в нем ни бум-бум. Если кто знает команды для контроллера дисплея, то пожалуйста подскажите. Его тип мне надо уточнить, напишу позже.
3) Согласен с редакцией - Я НЕ СМОГ . Я ни кого не хотел обидеть, понимаю, что молодые сейчас более головастые, а мне 65 и голова не так хорошо работает как в 25.
Ещё раз всем спасибо за помощь !
2) Очень понравился совет коннтроллере самого дисплея, но даташит вероятно на английском, а я в нем ни бум-бум. Если кто знает команды для контроллера дисплея, то пожалуйста подскажите. Его тип мне надо уточнить, напишу позже.
знать бы какой у вас модуль экрана , на каком контроллере сделан (ссылку на магазин где покупали,фотку самого модуля)
я уже раньше писал в сообщении http://arduino.ru/forum/programmirovanie/begushchaya-stroka-na-displee-tft-480kh320-pod-upravleniem-arduino#comment-398834
как искать.может найдете информацию и на русском ,но и по английский со словарем можно осилить .
1) Я выводил пощадь знакоместа 24х48 пикселей, сдвигал на один пиксель влево. Весь экран 480 пикселей 1 знакоместо перемещалось за полторы минуты, при 2-х знакоместах время ещё увеличивалось, а строку в 20 символов я и пробовать не стал.
Из этого описания непонятно, что именно выполняется полторы минуты:
1. Вывод прямоугольника 24х48.
2. Вывод прямоугольника 24х48 (480-24) раз.
3. Вывод прямоугольника 24х48 (480-48) раз.
4. Вывод прямоугольника 24х48 480 раз.
ANDRIANO
Я выводил знакоместо 24х48 состоящее из точек с помощью команды DrawPixel(x,y) начиная с координаты Х = 480 - 24, y = 50 в 3-х циклах - внешний цикл по Х с шагом -1 пиксель, средний по Х, внутренний по Y для того, чтобы последнюю вертикальную строку затирать. В дальнейшем предполагая выводить в это знакоместо любые символы и графику. Знакоместо перемещалось по экрану слева направо плавно (смещаясь на один пиксель) , но медленно.
Тип дисплея - цветной графический дисплей 3.5 Mega TFT 480x320 на контроллере HX8357C.
Согласен с редакцией - Я НЕ СМОГ .
Именно. Здесь такое редко пишут. Обычно считают что не смог == не возможно.
Ковыряя векторные шрифты нечаяно был сделал бегущую. Правда кривую;) Это ОЛЕД, в цикле вывода без пауз, т.е. максимальная скорость
https://youtu.be/hTTeT941JK0
Так что это, возможно, пробуйте получится.
Я выводил знакоместо 24х48 состоящее из точек с помощью команды DrawPixel(x,y)
Ну, собственно, одна из главных причин тормозов - использование DrawPixel. (впрочем, судя по дальнейшему, не исключено, что не основная).
Собственно, это не новость.
Поэтому разработчики контроллерров для дисплеев предпринимают специальные меры, чтобы устранить это "бутылочное горлышко".
Как правило, у контроллера дисплея есть функция задания окна вывода - т.е. все последующие операции записи в видеопамять будут последовательно (и построчно) выводить пиксели внутри этой прямоугольной области.
При этом нарисоватьь единственный пиксель есть только один способ:
- задать окно вывода размером 1х1, что требует отправки на дисплей от 9 до 16 байтов,
- переключить дисплей в режим доступа к видеопамяти - от 1 до 2 байтов,
- записать в видеопамять нужный пиксель - 2 байта.
Итого - от 12 до 20 байтов.
А вот если мы установим окно для всего символа, то две первые операции мы должны будем сделатьь не на каждый пиксель, а один раз на все знакоместо. Ну а запсь пикселя, как и в предыдущем случае - 2 байта. Т.е. в 6-10 раз быстрее.
начиная с координаты Х = 480 - 24, y = 50 в 3-х циклах - внешний цикл по Х с шагом -1 пиксель, средний по Х, внутренний по Y для того, чтобы последнюю вертикальную строку затирать.
Вообще-то цикла должно быть два. Может, в этом основная проблема.
Тип дисплея - цветной графический дисплей 3.5 Mega TFT 480x320 на контроллере HX8357C.
Я тоже сейчас работаю примерно с таким, только контроллеры другие ILI9481 и stm32f103.
Но тесты, о которых писал выше, проводил на Uno.
Сразу все знакоместо я выводить не могу потому, что недьзя будет вывести часть знакоместа, для того чтобы символ скрывался за краем экрана плавно, а не сразу весь. То есть - когда закоместо будет с координатой Х = 0. то следующая координата должна быть Х=-1 при этом часть знакоместа (символа переносится взад знакоместа). Это я проверял при выводе символов.
Andriano - есть скайп, давай свяжемся и поговорим, а то оченб долго переписка идет.
geb2010, естчественно, когда на экран помещается только часть символа, невидимую его часть выводить не нужно. Остальное в Вашем сообщении не понял. Ну и по скайпу связываться желания нет, т.к. это предполагает привязку к конкретному времени, а мне удобнее общаться тогда, когда у меня появилась свободная минутка.
Я Вас понял, согласен. Поясню - когда стандартной функцией выводится символ на экран, то выводится знакоместо в которое вписан этот символ (например 24х48). Вывести на экран часть символа (часть знакоместа, например начиная с позиции знакоместа по Х = 24 . 2 = 12) не получается, потому что выводится все знакоместо 24х48. Попробуйте вывести в любой месте экрана половину символа, например А. Только пользоваться стандартной функцией. Такой вовод я смого сделать только своей функцией выводя по пиксельно часть символа (знакоместа).
Не знаю понятно ли я поясеил.
Посмотрел исходники последней скачанной библиотеки (для 3"97 экрана 240х400, на котором и получил цифры для сообщения №19):
void setAddrWindow(int16_t x, int16_t y, int16_t x1, int16_t y1);
Собственно, именно эта функция нужна Вам для задания прямоугольника вывода. Параметры у нее - знаковые числа, т.е. могут быть заданы отрицательными - за пределами экрана. Т.е. формально ничто не мешает указать координаты за пределами экрана. Другое дело, что это может не поддерживаться библиотекой. Например, в упомянутой библиотеке отсутствуют проверки на границы экрана. Но их можно добавить самому без риска обрушить всю библиотеку (именно за счт того, что выделено выше).
Посмотрите, как обстоит дело в той библиотеке, которой Вы сейчас пользуетесь.
Проблема не в том чтобы задать границы вывода, а в том как задать границы вывода части знакоместа, в котором вписан символ.
Все равно проблемы не понимаю.
Если границы знакоместа выходят за пределы экрана - режем. Все!
Другое дело, что и о выводе символа нужно немного позаботиться: если срезали знакоместо слева, то символ выводить не с начала, а с середины, а если срезали справа, то выводить с начала, но не до конца. Это если символ выводим слева направо.
Вот именно я и не знаю как вывести символ начиная с середины ? Ведь он уже вписан в знакоместо и стандартной функцией выводится начиная с первого пикселя. Если Вы можете это сделать на краю экрана, то можно и в любом месте экрана, то как ? Напишите как вставить сюда в сообщение картинку, я бы показал что у меня получается ?
1. Что-то я не понимаю, чего Вы не понимаете. Если Вам нужно вывести экран с первого (по правилам Си с нулевого) элемента - Вы знаете, а если с 10-го не знаете? Так и пишете for(int i = 10; i < width; i++)... Соответственно отсекаем с другого края for(int i = 0; i < screenWidth-charPosition; i++)
2. Картинку вставлять: нажать на пиктограмму картинки, далее "выбор на сервере", далее в верхнем левом углу "загрузить", там надо нажать на последовательность кнопок - стандартно для передачи файла со своего компьютера на сервер, когда картинка будет загружена, именно она будет активной - подтвердить выбор.
Как я понимаю вывод символа:
Чтобы вывести на графический дисплей TFT например букву "А" с помощью функции print(str,x,y), нужно пдключить фонт, который сформирован заранее, или с помощью графической функции DrawBitmap(x1,y1,x2,y2,name) вывести картинку формата BMP с буквой "А".
При выводе картинки x1,y1 координаты экрана, а x2,y2 количество пикселей по горизонтали и вертикали картинки BMP. Вывод начинается всегда с верхнего левого угла картинки. Поэтому как сделать вывод части картинки я не знаю.
Вывод части символа с помощью функции print(str,x,y) тоже не получается.
Вот в чем проблема.
Вот именно я и не знаю как вывести символ начиная с середины ? Ведь он уже вписан в знакоместо и стандартной функцией выводится начиная с первого пикселя.
ну так нужно переписать стандартную функцию библиотеки, чтобы при вводе отрицательных коррдинат символ начинал выводится за пределами дисплеея
Ну, раз существующими средствами вывод не получается, значит, нужно делать свои.
Посмотрите, как сделан вывод в той библиотеке, которой Вы пользуетесь. Если координаты передаются знаковыми числами, думаю, можно будет точечно подкорректировать пару функций библиотеки, чтобы научить ее подрезать символы, которые выходят за предел экрана.
В той библиотеке, которой я пользовался последние дни (для 3.97" 240х400) функций вывода текста нет. А с экраном 320х480 я работаю с stm32 вообще без каких-либо библиотек. Поэтому задам вопрос: координаты для вывода символа задаются в пикселях либо в знакоместах?
Для того, чтобы подправить функции вывода символов, Вам придется разобраться, как символы хранятся в памяти. Возможно, с листочком бумаги в клеточку.
В общем, попытайтесь описать словами, как выводится на экран, скажем, буква D.
Здравствуйте Andriano! Ваша подсказка помогла - " Посмотрите, как сделан вывод в той библиотеке, которой Вы пользуетесь. Если координаты передаются знаковыми числами, думаю, можно будет точечно подкорректировать пару функций библиотеки, чтобы научить ее подрезать символы, которые выходят за предел экрана. "
В библиотеке " UTFT ", которая подходит для дисплея, я нашел функцию " printChar ", которая выводит символ на дисплей. Её корректирую так, чтобы не выводила часть символа, если координаты за пределами дисплея. Уже есть сдвиги, правда вывод все же идет медленно.
Ну тут зависит от того, чего Вы хотите добиться.
Если усовершенствовать библиотеку - возни много, т.к. нужно будет править для каждой из 4-х ориентаций.
Если же только для той ориентации, в которой Вы работаете, то по сути подкорректировать нужно 3 строчки:
Правая граница, если символ целиком не помещается, должна быть сокращена, т.е. вместо cfont.x_size в 1-й и 3-й строчках подставлена вычисленная величина (во второй строчке не трогаем). А в случае левой границы вместо x (отрицательного) нужно подставлять 0 в первой строке, добавить к смещению temp величину -x во второй строке и, опять же, подставить вместо cfont.x_size оставшуюся часть ширины символа.
При других ориентациях будет чуть по-другому, но идея та же.
Здравствуйте !
Большое спасибо за помощь ВСЕМ и особенно ANDRIANO. У меня получилось сделать бегущую строку, но при перемещении на пиксель бег получается, к сожалению, очень медленный. Похоже, что с этим дисплеем лучше не получится. По крайней мере я не знаю как это можно сделать. Если кому интересно я выложу, что изменил в библиотеке. Всего ВСЕМ хорошего.
geb2010, я уже писал, что вывод прямоугольника 24х48 занимает 3.8 мкс. Если выводить непрерывно, будет более 260 fps. Человек такую скорость не воспринимает. Правда, возможно, Вы выводите не одно знакоместо, а больше. Ну, примерно до 10 (т. е. площадь 24х480) еще должно быть плавно, но время перемещения по экрану соответственно увеличится.
В общем, сдвигать на 1 символ (24 пикселя? 48 пикселей?) это не плавно, а сдвигать на 1 пиксель - слишком медленно. Попробуйте сдвигать на 2-4 пикселя.
ANDRIANO, Вы абсолютно правы, я хотел выводить строку начиная от 10 символов до 20 и после модернизации функции убедился, что вывод медленный. Если сдвигать на 2 - 4 пикселя, выводится быстрей, но не намного и то уже при 4 заметны рывки. Поэтому я понял, что не смог получить, что хотел. Еще раз спасибо за помощь.
Вы бы цифры конкретные привели, тогда можно было бы прикинуть, есть ли шанс что-то улучшить.
А разобратся где тормозня сидит? Если 24*48 за 3,8мсек (andriano там выше видно ошибся с мкс) то 10 символов т.е. 24*480 это 38 мсек. Значить за секунду 1/0,038=26 выводов - 26 пикселей сдвига т.е. символ с мелочю в секунду, за 10сек выползет 10 символов. Вроде не плохо. Должно быть не плохо. А как получилось?
ANDRIANO - Какие цифры нужны ? Я не понимаю ? Я мог бы показать видео, что у меня получилось, но я не знаю как его здесь вставить, могу только файл послать на электронный адрес.
Я мог бы показать видео, что у меня получилось, но я не знаю как его здесь вставить....
Выкладываеш на ютубе или еще где, сюда ссылку, делофф.
Я ни где не зарегистрирован.
Если почта на яндексе есть, то есть и яндекс-диск. Закидываешь файл, делаешь share, получаешь ссылку и сюды мечешь аки рыба златоперая.
Ссылка есть, я не смог вставить в сообщение.
ANDRIANO - Какие цифры нужны ? Я не понимаю ? Я мог бы показать видео, что у меня получилось, но я не знаю как его здесь вставить, могу только файл послать на электронный адрес.
Ну, цифры, собственно, две:
- размер обновляемой площади в пикселях,
- время, за которое эта площадь однократно (или известное количество раз) обновляется.
Adriano - Мне контроллер " stm32 " по характеристикам понравился. Напишите есть ли для него библиотеки, модули расширения ? Есть ли у Вас ссылки на то, как согласовать подключение дисплея и других внешних элементов?
Хихи. Попал длинношеий с добрыми делами ;)
Adriano - Мне контроллер " stm32 " по характеристикам понравился. Напишите есть ли для него библиотеки, модули расширения ? Есть ли у Вас ссылки на то, как согласовать подключение дисплея и других внешних элементов?
1. Мне тоже.
2. Лично я обычно не пользуюсь готовыми библиотеками, а пишу сам, поэтому наверняка сказать не могу, а тем более не могу посоветовать что-то конкретное. Но я слышал, что такие библиотеки наличествуют.
3. С соглавованием ситуация двоякая: с одной стороны к stm32 можно подключать любые, как 5-вольтовые, так и 3.3-вольтовые дисплеи. С другой стороны, с 5-вольтовых как-то не очень желательно читать информацию, а зачастую именно по прочитанной информации библиотека определяет тип дисплея и подключает нужные свои фрагменты.
Если писать самому и знать тип дисплея, остаются только плюсы: возможность работать как с 3.3, так и с 5-вольтовыми дисплеями.
В качестве примера можете посмотреть две мои темы в "Проектах":
http://arduino.ru/forum/proekty/konstruktsiya-vykhodnogo-dnya-prostoi-sp...
http://arduino.ru/forum/proekty/video-na-stm32duino-ov7670-stm32f103c8t6...
Logik - Судя по лексике Ваша усмешка из-за молодости, мне Вас жаль, но надеюсь, что с возрастом это пройдет !
Andriano - большое спасибо за помощь и за примеры ! Я очень рад, что есть и среди молодых люди, которые готовы помочь безвозмездно ! По Вашим ссылкам приходит ответ - Страница не найдена. Но в основном я все понял, спасибо.