Pull to refresh

Интеллектуальный LCD шилд для Arduino

Reading time5 min
Views27K
Я знакома с мнением многих технических специалистов об Arduino и в некоторой степени разделяю их взгляд. Тем не менее, например, для быстрой автоматизации, эта платформа очень полезна: она подобно детскому конструктору позволяет собрать и запрограммировать устройство за пару часов, не тратя время на различные «undefined reference to __bss_start__» и «Device not detected».
Однажды для автоматизации очередной рутинной работы мне понадобился дисплей. Я листала Aliexpress и все не могла найти подходящий шилд для Arduno.


Кот для привлечения внимания

Лиха беда начало


Итак, мне нужен был диалоговый пользовательский интерфейс и притом быстро. (Кот был для привлечения внимания, замечено — работает.) Как будто нарочно все производители предлагали самостоятельно вручную рисовать поля ввода и прогресс-бары, программировать обработчики нажатий кнопок, и, словом, делать все то, что мне как раз не хотелось. Поразительно, почему бы не предоставить высокоуровневую библиотеку, которая взяла бы эти заботы на себя? Наверное в 80% случаев все задачи сводятся к простой последовательности:
  1. Отобразить форму с полями ввода.
  2. Подождать, пока пользователь отредактирует поле Foo.
  3. Получить новое значение поля Foo.
  4. Сделать что-то в ответ.

Но отсутствие библиотеки было не единственной препоной. Скудных запасов 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 ребенок возводит свой игрушечный замок, пользователь по кирпичикам должен собирать свое устройство, но без использования молотка и напильника. Мой шилд — небольшой шаг в этом направлении.
Буду рада услышать ценные советы и понять, кому же ещё кроме меня не достаёт такой полезной штуки.
Tags:
Hubs:
Total votes 32: ↑24 and ↓8+16
Comments41

Articles