Однажды для автоматизации очередной рутинной работы мне понадобился дисплей. Я листала Aliexpress и все не могла найти подходящий шилд для Arduno.
Кот для привлечения внимания
Лиха беда начало
Итак, мне нужен был диалоговый пользовательский интерфейс и притом быстро. (Кот был для привлечения внимания, замечено — работает.) Как будто нарочно все производители предлагали самостоятельно вручную рисовать поля ввода и прогресс-бары, программировать обработчики нажатий кнопок, и, словом, делать все то, что мне как раз не хотелось. Поразительно, почему бы не предоставить высокоуровневую библиотеку, которая взяла бы эти заботы на себя? Наверное в 80% случаев все задачи сводятся к простой последовательности:
- Отобразить форму с полями ввода.
- Подождать, пока пользователь отредактирует поле Foo.
- Получить новое значение поля Foo.
- Сделать что-то в ответ.
Но отсутствие библиотеки было не единственной препоной. Скудных запасов ROM моей Arduino Uno (а такая же ситуация и у Leonardo, Ethernet, Pro) хватало в лучшем случае на хранение одного изображения при разрешении 128х128 точек. И на код места уже не оставалось.
Пройдясь широким фронтом по Aliexpress, DX и подобным магазинам, я в итоге нашла, выражаясь языком сетевых разработчиков, либо «тонкие тупые», либо «чересчур жирные» шилды. Первые не решают проблему, но стоят дёшево. Вторые походят на ракетно-зенитный комплекс, и за эту избыточность придется порядочно заплатить. Если бы губы Никанора Ивановича да приставить к носу Ивана Кузьмича… После некоторых колебаний я решилась заполнить этот досадный маркетинговый пробел.
Что нам стоит шилд построить
Развела плату, заказала несколько первых образцов для опытов, попробовала.
Идея постепенно оформилась. Итак, решение должно быть простым в использовании и обязательно дешёвым (о чем ниже):
- На борту шилда должен быть микроконтроллер с запасом памяти хотя бы на пару экранов.
- Чтобы с памятью точно не возникло проблем, можно добавить слот microSD.
- Также прямо на шилде нужно расположить несколько кнопок.
- Микроконтроллер должен заниматься «чёрной работой», отрисовывая поля формы и обрабатывая нажатия кнопок таким образом, чтобы, только подав питание на прошитый шилд, можно было листать формы, редактировать поля ввода, ставить птичку в поле для отметки и проч.
- Микроконтроллер на шилде будет связан с Arduino по одному из доступных последовательных интерфейсов: I2C, SPI или UART. По каналу будут передаваться команды от Arduino; (например, установка начального значения или получение текущего).
- Чтобы не заставлять Arduino циклически опрашивать шилд в ожидании действий пользователя можно предусмотреть линию GPIO, которая будет выполнять роль внешнего прерывания.
- В отношении метода программирования шилда можно, конечно, провозгласить известный принцип «только Vim, только хардкор!», но всё же, понимая потребности целевой аудитории этого продукта, весьма полезно разработать дизайнер форм наподобие GTK Glade и предоставить возможность новичкам одним нажатием кнопки этого дизайнера прошить формы в шилд.
Несколько слов о комплектующих
Самым основным комплектующим шилда является дисплейный модуль. От него в наибольшей степени зависит как цена, так и технические характеристики продукта. При поиске подходящего модуля хотелось и рыбку съесть, и на лошади покататься: с одной стороны я исходила из критерия доступности, с другой стороны стоимость модуля должна быть минимальной. В основном эти критерии противоречат друг другу: магазины вроде Терраэлектроники, имеющие отделения по всей стране, предлагали некоторый набор цветных дисплеев распространённых моделей, но цены на них были от 2000 руб и выше; с другой стороны на том же Aliexpress было много хороших вариантов, но все они обладали одним и тем же недостатком: между ними и нашими несчастными пользователями пролегала бездна, в которой погибла не одна тысяча картонных коробок, и поведение которой было столь же легко предсказуемо, как поведение нефтяных котировок или погоды. Все, конечно, поняли о чем речь. Так что моя идея по-прежнему оставалась лишь идеей.
Как это часто бывает, ночная кухонная болтовня за чашкой чая оказывается судьбоносной. Приятель мимоходом поделился, как менял сломанный дисплей на своем HTC. Оказалось, что дисплеи смартфонов, имея несомненно лучшие характеристики, чем товары в каталогах Терраэлектроники, стоят в два-три раза дешевле! Это было открытием. После этого достаточно быстро был найден дисплей, который в России можно купить практически на каждом шагу за копейки; он устанавливался на телефоны Nokia 2600/2650/3100/3200/5100/5140/6100/6220/6610/7210/7250. (Как впоследствии оказалось, я заново открыла Америку, так как именно этот дисплей используется во многих шилдах для Arduino.) Его разрешения — 128?128 точек — вполне хватает, чтобы отобразить форму с тремя-четырьмя полями ввода.
Гляженное лучше хваленного
Многим, наверное, до сих пор не вполне ясно, как пользоваться описываемым гаджетом. Пожалуй проще всего проиллюстрировать это на примере двух стандартных ситуаций:
- У нас есть цифровой термометр, необходимо отображать его показания на дисплее.
- Есть сервопривод, требуется задавать параметры его работы. Например, его положение.
Термометр
#include <intelcd.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Термометр подключается к линии 2 Arduino по протоколу 1-Wire
#define ONE_WIRE_BUS 2
/*************************************************************
* Эти макросы генерирует Дизайнер форм, *
* вам не придётся вписывать их вручную: *
*************************************************************/
// номер формы, отображающей значение температуры.
#define FORM_TERMO 0
// номер поля, отображающего значение температуры
#define FIELD_TERMO 0
// Создаем объект oneWire для коммуникации по интерфейсу oneWire
OneWire oneWire(ONE_WIRE_BUS);
// Создаем объект sensor для управления датчиком температуры
DallasTemperature sensor(&oneWire);
// создаем объект lcd для управления LCD шилдом
InteLCD lcd;
void setup(void)
{
lcd.init();
sensor.begin();
}
void loop(void)
{
// Запустить измерение температуры
sensor.requestTemperatures();
// обновить значение температуры на экране
lcd.update(FORM_TERMO, FIELD_TERMO, sensor.getTempCByIndex(0));
delay(1000);
}
Сервопривод
#include <InteLCD.h>
#include <Servo.h>
#define FORM_SERVO 0
#define FIELD_SERVO 0
InteLCD lcd; // создать объект lcd для управления LCD шилдом
Servo myservo; // создать объект servo для управления сервоприводом
void lcdEvent(void); // Обработчик событий от шилда
void setup(void)
{
myservo.attach(9); // указать, что сервопривод на 9 линии
lcd.init(); // инициализация lcd
}
void loop(void)
{
}
void lcdEvent(void)
{
switch (lcd.event.code) {
case InteLCD::FIELD_UPDATED:
// если обновлено поле 0 формы 1
if (lcd.event.formid == FORM_SERVO && lcd.event.fieldid == FIELD_SERVO)
{
// установить позицию сервопривода в соответствии
// с полученным от поля ввода значением
myservo.write(lcd.event.arg[0]);
// подождать пока сервопривод примет нужное положение
delay(15);
}
break;
}
}
Напоследок
По моим представлением DIY электроника должна развиваться в сторону наибольшей модульности, где каждый модуль предельно прост и закончен. Тогда, как из разнообразных деталей Lego ребенок возводит свой игрушечный замок, пользователь по кирпичикам должен собирать свое устройство, но без использования молотка и напильника. Мой шилд — небольшой шаг в этом направлении.
Буду рада услышать ценные советы и понять, кому же ещё кроме меня не достаёт такой полезной штуки.
Комментарии (40)
Alexeyslav
25.09.2015 15:41Несомненно полезно, только кнопки наверно надо было крестом расположить, и еще две добавить — «подтвердить» и «отмена».
Когда они в ряд расположены очень быстро забываешь какая за что отвечает.
А так — вверх-вниз изменение параметра, влево-вправо выбор параметра или наоборот в зависимости от формы организации настроек и т.д.
может конечно не помешает ещё две опциональные кнопки типа «сбросить по умолчанию», «скопировать с датчика»(при выборе порога уровня освещенности, например).
Не знаю как сейчас реализовано, но я бы передавал в контроллер для каждого поля положение на экране, возможность ввода в поле, «крыжик», заблокировано(недоступно для ввода в текущем режиме), может даже цвет символов/фона. что-то вроде такого.
Nizametdinov
25.09.2015 16:05+1www.itead.cc/display/nextion.html думаю вам будет интересен.
На счет модульности — очень согласен.
Konachan700
25.09.2015 17:13Лучше это сделать так.
Взять дисплей с али на ILI****-драйвере, он стоит доллар-полтора мелким оптом, взять stm32 самый простой, разъем микро-sd, все скомпоновать на очень тонкую платку по размеру дисплея, которая потом будет наглухо к этому дисплею припаяна\приклеена. На самой платке отверстия под 2.56 гребенку. Прошивка STM32 должна уметь рисовать вышеуказанный интерфейс, растровую графику и шрифты, которые заранее надо положить на карту памяти, плюс давать прямой доступ к рисованию. Этакая видеокарта для ардуино. Такой модуль будет интересен, очень интересен, и не только трем с половиной гиков, но и делающим мелкосерийные девайсы. Потому как шилдов-то на этом дисплее полно, но кодить под эти дисплеи на мелких контроллерах ад и проклятье из-за недостатка памяти.IronHead
25.09.2015 17:16-1А еще он должен быть совместим с малинкой, чтобы можно было с легкостью приделать этот дисплей к ней.
eKat
25.09.2015 17:35+1Мммм… может я плохо описала, но вы своими словами пересказали то, что я предложила.
Очень интересно понять, почему было не понятно. Можете описать то, как вы представили себе мою идею после прочтения статьи (если, конечно, вы дочитали её до конца)?Konachan700
25.09.2015 17:46+1Описан шилд для ардуино, даже картинка есть. А они, эти шилды, нужны трем с половиной гикам, и продать их будет крайне сложно. Я описал тоже самое, но в нормальном, промышленном исполнении, то есть можно подключать куда угодно, в том числе запихнуть в готовый прибор. Если штука будет простой, компактной и недорогой, она пойдет очень хорошо, потому что это реальная замена 1602-подобным дисплеям.
Идея устройства очень хорошая, мне понравилась.eKat
25.09.2015 17:56Ну… насчёт «трём с половиной гикам» вы глубоко заблуждаетесь, рынок DIY-электроники растёт очень быстрыми темпами. Во-вторых, никто не мешает сделать hardcore вариант. В третьих, не понимаю, чем этот вариант будет отличаться от шилда? Чуть меньше по размерам? Совсем не значительно.
Alexeyslav
26.09.2015 23:48У шилда контакты по двум сторонам, и большая часть по сути не используется. оставить лишь необходимые для использования дисплея, так чтобы его можно было расположить на передней панели прибора и шлейфом подключить к основной плате, которая не обязательно будет ардуиной.
Tomasina
25.09.2015 22:45Так уже есть такие штуки, в промышленном бескорпусном исполнении:
www.4dsystems.com.au/products
www.densitron.com/RipDraw_Smart_TFT_Product_Line.aspx
www.embeddedartists.com/products/displaymodules
Правда, цена сильно выше, чем хотелось бы.
Но, глядя, на начинку, сложно там сделать дешевле.
RaJa
14.10.2015 17:16Одна российская небезызвестная компания так и сделала: www.terraelectronica.ru/catalog_info.php?CODE=1088855
получилось совсем недешево.
Там не STM32 у дисплея, но это не столько важно.
jonic
25.09.2015 19:03+1Наверное кому то пригодится. Сделайте опросник тогда интересно/неинтересно, иначе я не совсем понимаю цели поста.
KivApple
25.09.2015 19:30+1Почта России последнее время приятно радует. Я заказал за последние пару-тройку лет не меньше пары сотен посылок, а может и больше, а потерялось всего парочка, причём они были без отслеживания и стоили по 50 рублей. Так что не вижу причин не заказывать товары в Китае, очень удивляет предложение переплачивать раза в два. В крайнем случае можно компенсировать риски заказывая с запасом и на разные адреса (чтобы уж наверняка), всё равно дешевле получится.
А сама идея шилда вполне неплохая.
pehat
25.09.2015 21:34Оффтоп: а существуют ли способы заказать товар на Aliexpress, чтобы после китайской границы доставку осуществляла какая-нибудь компания, которая дорожит своей репутацией?
atorero
26.09.2015 02:19+1Китайцы вам хоть DHL-ом отправят, хоть лично на дом привезут, главное платите за тот или иной вид доставки.
Syzd
26.09.2015 10:14Маленький экран, для чего сверху разъем оставлен? Для установки следующего шилда поверх экрана?
2,4 дймовый экран с Китая 400-700 рублей, да повозится с кодом, но это сильно дешевле вашего.
DmitrySpb79
26.09.2015 11:28+1Идея шилда интересная.
Но заморачиваться с дизайнером форм я бы не стал. Я бы ограничился текстовыми менюшками, как в старых мобилах, и скриптовым языком настройки, типа такого:
menu.AddString(«Пункт 1», ID=1, typeStringWithSubmenu, «Icon1.png»);
menu.AddString(«Подменю 1-1», ID=2, typeString, «Icon2.png»);
menu.AddString(«Подменю 1-2», ID=3, typeString, «Icon3.png»);
menu.AddString(«Пункт 2», ID=4, typeString, «Icon4.png»);
menu.AddString(«Пункт 3», ID=5, typeString, noIcon);
menu.AddString(«Пункт 4», ID=6, typeString, noIcon);
menu.Show();
Дальше при старте основного девайса меню динамически заливается в шилд и работает полностью автономно, ответом от шилда приходят ID выбранных пунктов (по i2c, serial или как-то еще).
Ну и кнопки заменить на джойстик, как уже было замечено, экран и кнопки разместить поэргономичнее. Дизайн честно говоря, никакой, сойдет только для прототипа.
По поводу цены: конкурировать с китайцами на этом рынке сложно. LCD 1602 Board Keypad Shield стоит на ебее 5$ (300р) с уже включенной в цену доставкой. Да, там нет проца и экран не графический, но часто графика с котиками и не нужна. Сделайте простой текстовый вариант без SD-карты.
Кстати насчет почты зря написано, лет 5 покупаю электронику на ебее (у нас цены негуманные), посылки не теряются.
Deranged
28.09.2015 18:16-1Вообще, если оценить идею глобально, получается довольно… странно. Что бы выводить картинку на матрицу, хоть какую, нужен микроконтроллер с приличным последовательным интерфейсом, DMA, и желательно приличным объемом памяти, что бы хватило на фреймбуфер, что бы картинка при выводе не мерцала.
Если брать дисплеи со встроенными драйверами, то драйвер дисплея с точки зрения программиста, это суть такой массив пикселей, в который можно писать по произвольным адресам, что записал, то и выводится на дисплей. Но это чистый растр.
Что бы выводить векторную графику, нужно сначала рассчитать кадр. Если рассчитанные пикселы выводить на дисплей сразу, то, во первых, будет видно процесс рисования, а во вторых, пока кадр не будет полностью рассчитан и, что самое долгое, отправлен, микроконтроллер не сможет заниматься никакими другими делами.
Поэтому обычно кадр рассчитывается в оперативке, а на дисплей его отправляет DMA, асинхронно.
В любом случае, производительности и объема памяти Arduino и близко не хватит для формирования картинки с приемлемой отзывчивостью. Потребуется дополнительный сопроцессор для расчета графики, причем заметно более производительный, чем Arduino.
Получается, что мы берем очень хиленький микроконтроллер, к нему прицепляем микроконтроллер посильнее, а к нему уже драйвер дисплея. Ровно такой вариант, который у вас назван «жирным».
А зачем в таком раскладе вообще нужен хиленький микроконтроллер? Тут ответ только — по тому, что кое кто не умеет писать для микроконтроллера посильнее :)
Так почему бы не сделать не шилд, а Arduino-совместимую плату с нормальным микроконтроллером и дисплеем на борту?
P.S. Проблема «жирного шилда» — это его совершенно конская цена. Камень STM32 с FSMC на борту стоит около $10, матрица — $5, драйвер $2, рассыпуха и печатная плата $5. Себестоимость на вскидку около 25 баксов.
Big_Lebowski
29.09.2015 10:41Алиэкспрессовские дисплеи с ILI* драйвером имеют слот для карточки и элементарно программируются, для ардуино есть готовые библиотеки, довольно, впрочем, прожорливые.
А про почту — ко мне пришло несколько десятков посылок с китая — ничего не потерялось.
Небольшой риск утери копеечного дисплея врядли стоит того дорогостоящего огорода который собрался городить автор.
IronHead
А где собственно схема? Если это «DIY», а не «Я пиарюсь».
iliasam
Ссылки на код использованной библиотеки тоже не видно.
eKat
Готовой библиотеки сейчас нет: я писала об идее создания такого шилда. Сейчас он только зарождается.
ALev
Видимо ссылки на библиотеку и схему можно будет получить несколько позже, когда проект взлетит.
IronHead
ИМХО не взлетит, слишком много денег на реализацию просит.
PS Не в тему, но девочка разработчик оказывается симпатичная
eKat
Деньги по сути на запуск партии. Чтоб получить рыночную цену в 1500 рублей, то нужно произвести партию хотя бы в 250 шилдов, а лучше все 500. Оттуда и арифметика.
IronHead
Я это все прекрасно понимаю, просто как уже говорил — тоже хотел запустить небольшую партию не сложных электронных устройств, поэтому проходил через все расчеты.
Вы посмотрите средний сбор по электронным безделушкам на том же бумстартере — он гораздо меньше вашей суммы.
Здесь палка о двух концах: с одной стороны нужны деньги и по подсчетам лучше всего подходит крупная сумма, с другой стороны надо чем то жертвовать, потому что не получится за месяц собрать столько денег.
Точнее сумму собрать можно, но для этого нужно приходить на бумстартер со своей командой покупателей, то есть предлагать уже где то пропаренную разработку.
Почему меня задел этот вопрос — да потому что сам занимаюсь разработкой и есть несколько проектов для бумстартера, но по расчетам не выхожу на сбор нужной суммы.
eKat
У меня сейчас есть плата-прототип, могу дать ее схему, но на ней сейчас нет микроконтроллера и слота microSD. Сейчас я делюсь лишь идеей проекта, чтобы понять нужен ли он людям и стоит ли овчинка выделки.
IronHead
Думаю для хоббистов дуинщиков выйдет слишком дорого (кстати, считали стоимость производства и подготовки к производству?). А для профессиональных разработчиков — не нужно такое, так как проще из отдельных элементов прототип состряпать, все равно дуинку в готовое изделие не встроишь.
eKat
По текущему плату розничная цена будет 1500 рублей. В России по моим данным трудно сильно дешевле купить. Если ошибаюсь, поправьте.
По поводу для профессиональных разработчиков. Из каких отдельных? Да и не нужно это. Я по себе сужу, сама embedded разработкой занимаюсь уже несколько лет. Но речь идёт только о каких-то сиюминутных задач, типа автоматизировать тестирование своих железок. Речь не идёт о том, чтобы на основе этого шилда и Ардуино делать какой-то продукт.
IronHead
Расскажите как вы считаете стоимость готового изделия?
Считаете ли вы свои временные затраты на разработку данного шилда? Стоимость сборки (пайки). Или посчитали только стоимость компонентов по текущему курсу. Просто я не так давно рассчитывал итоговую стоимость производства примерно такого же по сложности устройства, был сильно удивлен, когда понял, что окупаемость проекта начнется очень не скоро.
А для меня лично, если нужно что то для теста с экранчиком — проще взять те компоненты что есть в наличии и под них на каком нибудь STM8/32 накидать код.
ALev
С рассчётом всё сложно, т.к. на самом деле Катя этот проект не столько от своего имени выполняет, сколько от имени небольшой компании, занимающейся контрактной разработкой достаточно сложных, относительно этого шилда, устройств (отсюда и потребности в мелкой автоматизации). Так вот, если считать всё исходя из stand-alone разработки, то получилось бы дороже. А так, 1) что-то подобное всё равно нужно нам в наших делах, 2) с заказом комлектующих и производством плат проблем нет, многие комплектующие у нас и так есть в наличии, а платы заказываем почти каждый месяц, можно просто докидывать (хотя обычно заказываем 4х-слойки, но иногда и 2х-слойки приходится делать).
IronHead
Тогда не понятно за чем дело встало. Если вы все равно разрабатываете это для себя и + у вас есть возможность заказать платы ниже себестоимости (закинуть для более полного заполнения панели на производстве), то почему же вы до сих пор этого не делаете? Произведите пробную партию для себя, излишки продайте, заодно оцЕните спрос.
eKat
А почему вы считаете, что есть какой-то затык? Я просто хотела поделиться идеей и услышать комментарии.
IronHead
Тогда добавлю свои мысли. Экранчик нужно побольше, сейчас посмотрел на али. там полно экранов 320х240 за вполне вменяемые деньги. Кнопочки как уже писали лучше расположить крестом или поставить вместо кнопок 4х позиционный джойстик (с кнопкой в центре) или энкодер с кнопкой.
eKat
1. Насчёт экранчика по-больше. Может и правильно, но за вменяемые деньги вы найдёте в китае. А чтоб самой сделать и в итоге чтобы за дёшево можно было бы продавать — трудно. Меня и так за мои 1500 рублей ругают…
2. Да, как раз была мысль джойстик поставить. Просто под рукой не оказался и в итоге прототип с кнопками сделала. Спасибо!