Редактор GeekTimes
812,2
рейтинг
11 февраля 2012 в 23:22

Arduino LCD Informer

Заинтересовавшись таким хобби, как Ардуино, я вскоре понял, что суть этого замечательного проекта — позволить таким, как я, ничего не смыслящим в схемотехнике, пайке и микросхемах, зато немного понимающим в программировании, заставить работать что-либо кроме персонального компьютера; прошить микроконтроллер, не имея программатора и каких-либо специальных знаний на эту тему.

Поэтому я хочу помочь пропаганде этого проекта — программисты, это прекрасное развлечение именно для вас!

Пока моторчики для моего следующего, мобильного проекта едут в кибитке, запряжённой тройкою самых быстрых брюхоногих скакунов Почты России, я задумал и, надо сказать, осуществил, другой (разминочный) проект под звонким названием “Arduino LCD Informer”. Суть проекта в том, чтобы Ардуино отображал на LCD данные, получаемые с компьютера. На компьютере их собирает и отправляет отдельная программа.

image

Ингредиенты



Для проекта нам потребуются:

Ардуино


image

Этот смышлёный и ловкий малыш, обладает не только мозгами (ATmega328 ), но и органами чувств и манипуляторами — входы и выходы делают возможным как получать информацию с различных датчиков, так и отправлять команды разным устройствам, в том числе моторам, светодиодам, и конечно lcd-экранам. Кроме того, usb-соединение с компьютером используется не только для заливки на него готовых программ, но и для двустороннего общения с программами, на компьютере запущенными.

Текстовый LCD экран


image

Нам нужна наиболее распространённая модель, MT–20S4A (МЭЛТ), HD44780 (Hitachi), KS0066 (Samsung) или их аналоги.
Я рекомендую МЭЛТ — у меня именно такой. Сердце согревает гордая надпись — “МЭЛТ. Сделано в России”. Поддержим отечественного производителя! Тем более, что сделан экран не только аккуратно и опрятно, но и с поддержкой кириллицы, о чём позже.

Доска для резки хлеба


image

Breadboard, как её окрестили наши заокеанские супостаты, а по-нашему — доска для прототипирования. Вкратце поясню суть. По доске идут параллельные линии проводящего материала. Если вы воткнёте проводок в дырку, то все дырки сверху и снизу от него (если расположить доску так, чтобы центральная полоса шла справа налево — как на фото) окажутся с ним соединены. Точнее, все до центральной полосы — по обеим сторонам от неё находятся две не связанные меж собой части доски.
Таким образом, без пайки, без скрутки, шума и пыли можно спокойно перетыкать проводки, планируя и сразу проверяя схему работы устройства. Один проводок в дырку, второй — в соседнюю, и контакт готов.
На средних и больших досках предусмотрены с краю две полосы проводников, одна для земли, вторая для питания — поскольку эти два контакта требуются чаще всего.

Лапшичка проводная


image

Предназначена для комфортного проведения тока. Обычно один конец втыкается во вход-выход Ардуины, а другой — в доску, или в датчик. Удобно будет применить также короткие проводки-перемычки.

Сырнички домашние с малиновым вареньем


image

Работать на пустой желудок — не только вредно, но и бесполезно. А по ходу работы приятно вознаградить себя сырничком-другим. Для сырников нам нужен творог (не изоморфный-гладкий, а с нормальной зернистостью) — 400 грамм творога, 2 яйца, 50 г сахара, пол-ложки (чайной) соды, щепотку соли. Перемешать, и потом помешивая, постепенно добавлять муку, всего около 200 грамм. Потом накрыть тесто и оставить часа на 2. Потом нагреть сковородку с небольшим количеством масла, скатывать колобки, плющить их и жарить.
Ну и по вкусу добавить потом сверху — кому вареньице малиновое, кому сгущёночку, кому как…

Приготовление



Сборка.


Чтобы LCD приветливо засветил нам своим мягким, тёплым, почти ламповым оранжевым светом, необходимо обеспечить его питанием (и землёй), а для вывода информации — подключить к выходам Ардуино.

Если на вашей доске есть полоски для земли и питания, можно вывести их с Ардуино именно туда. Но не отчаивайтесь — если их нет, обойдёмся и так.

image

См. фото — контакты 1, 3 и 5 требуют подключения к земле. Протягиваем провод от контакта Ардуино с пометкой GND (синий) к ряду дырочек на доске, соответствующих первому контакту, а к 3-му и 5-му ряду (которые идут к 3-му и 5-му контактам) проводим от первого ряда перемычки (красная и жёлтая).

ВНИМАНИЕ!

1) Все работы по перетыканию проводов проводим, когда питание отключено от Ардуино — как usb, так и через разъём питания!
Кстати, поэтому рекомендую подключать Ардуино к usb через два кабеля — один обычный usb, второй — удлиннитель. Таким образом, вместо разбалтывания usb-порта на компьютере или на Ардуино нужно будет разнимать только место соединения удлиннителя с кабелем.

2) У разных LCD номера контактов могут отличаться. Ознакомьтесь с инструкцией своего экрана. Кроме того, нумерация контактов может идти как слева направо — 1, 2, 3,.., 16 — так и, например, 14, 13, 12,.., 2, 1, 15, 16. Контакты должны быть пронумерованы на самом экране.

Если вы начинающий ардуинист и не умеете паять, позаботьтесь о том, чтобы заказать экран с уже припаянными ногами-контактами. Все контакты имеют стандартный шаг, поэтому наш экран-шестнадцатиножка легко воткнётся в доску. Втыкаем ноги — ряд ног параллельно центральной полоске и ближе к ней так, чтобы оставшаяся часть доски с этой стороны полоски осталась в доступности для втыкания проводов.

Итак, протянув провод от контакта Ардуино с пометкой 5V до доски, подаём 5 вольт на 2-й (питание) и 15-й (подсветка) контакты. Земля — 1, 3, 5, 16.
При этом 3-й контакт — контрастность, чем больше напряжение, тем тусклее изображение. Земля = 0 = наибольшая контрастность.

После этого можно включить Ардуино (подключить к usb) и посмотреть, засветился ли LCD. Если да — поздравляю! Можно вознаградить себя сырничком. И снова отключить Ардуино от питания!

Далее подсоединяем контакты управления экраном. 4-й — к 4-му выходу Ардуино. (Все выходы, с которыми мы имеем дело в данном проекте, помечены на Ардуино как digital). Это адресный сигнал.
6-й контакт экрана — 5-й контакт Ардуино. Это разрешение доступа.

Далее каналы данных:
lcd — Arduino
11 — 10
12 — 11
13 — 12
14 — 13

Результат моего творчества виден на первом фото. Провода аккуратно собраны в узел, а для устойчивости экран снабжён элегантной подпоркой, взятой из детского металлического конструктора, согнутой в необходимую кривую. Соединена она с экраном болтом диаметром 3 мм в специально предусмотренное крепёжное отверстие.

Можно кодить!

Программное обеспечение



Arduino sketch


Для написания программ для Ардуино и отправки их в него требуется оболочка, которую можно скачать отсюда: arduino.cc/en/Main/Software

Вкратце об использовании. Подключаем Ардуино, выбираем его тип (в моём случае это Arduino Uno) в Tools/Board, затем номер порта в Tools/Serial port — обычно, это порт, отличный от COM1. У меня получился COM9.
Затем пишем программы. Кнопка с галочкой проверяет программу, стрелка вправо — компилирует и закачивает на Ардуино.

Программы, которые исполняет Ардуино, называются скетчами, и состоят из трёх частей. Вначале подключаются необходимые библиотеки. Потом наполняется содержимым функция setup, которая автоматически выполняется один раз. В ней происходит вся инициализация оборудования.
Затем — основная функция, loop, которая автоматически выполняется в бесконечном цикле.

Напишем первую программу-скетч:

// подключаем библиотеку для работы с LCD
#include <LiquidCrystal.h>
 
void setup()
{
  // инициализируем LCD, указывая контакты данных
  LiquidCrystal lcd(4510111213);
 
  // указываем размерность экрана и начинаем работать
  lcd.begin(204);
 
  // пишем первую строку
  lcd.print("Hello, world!");
 
  // сдвигаем курсор на вторую строку, первый столбец (нумерация с 0)
  lcd.setCursor(01);
 
  // Пишем вторую строку
  lcd.print("I love Habr!");
}
 
void loop()
{
  // Делать особо нечего
}
 


Перейдём теперь к нашей задаче.
Нам нужен скетч, который будет выводить данные на LCD, а также нужна программа, которая будет работать на компьютере, собирать эти данные и отправлять их Ардуино.

Выбор языка, на котором можно писать программу для компьютера, остаётся за вами — любой язык, позволяющий работать с COM-портами, подойдёт. Конечно, лучше всего было написать такую программу на C++ — памяти занимает мало, висит себе в фоне и висит. К сожалению, я не обладаю достаточными знаниями для написания такой программы на C++, поэтому, буду писать на том, что знаю — perl.

Рабочий скетч для проекта может выглядеть следующим образом:

#include <LiquidCrystal.h>
 
// RS, E, DB5, DB6, DB7, DB8
LiquidCrystal lcd(4510111213);
 
int inb = 0;
int pos = 0;
int line = 0;
 
void setup() 
{
  Serial.begin(9600);
  lcd.begin(204);
}
 
void loop() 
{
  lcd.setCursor(pos, line);
  if (Serial.available() > 0) {
    inb = Serial.read();
 
    if (char(inb) == '|') {
      pos = 0;
      line++;
    }
    else if (char(inb) == '&') {
      pos = 0;
      line = 0;
    }
    else {
      lcd.print(char(inb));
      pos++;
    }  
    lcd.setCursor(pos, line);
  }
}
 


Ардуино ждёт начала поступления данных, и сразу выводит их на экран.
Символ | будет работать переводом строки, а & — концом текущего набора данных.

Программа для сбора данных и отправки их в порт.


В программе мы подключаем библиотеки, необходимые для сбора данных, затем проводим инициализацию всего, и потом в цикле формируем строчку, содержащую собранные данные и отправляем её в порт.

#!/usr/bin/perl
 
# Подключим нужные модули
use LWP::Simple;
use Encode qw(from_to _utf8_off);
use Win32::SerialPort;
use Win32::API::Prototype;
use Win32::SystemInfo;
use Win32::DriveInfo;
use constant {IDLE => 0, KERNEL => 1, USER => 2};
 
# Подключим функцию из Win32 API
InitWin32();
 
# Стартовое значение тиков
@lasttime = SystemTimes();
 
# Установим порт для коммуникаций с Arduino
$port = InitSerial();
 
# Цикл Мёбиуса
while (1) {
 
  # Формируем строку
  $data = sprintf("CPU: %3d%%  C: %03d Gb|MEM: %3d%%  D: %03d Gb|".
    "T: %02d'C      P: %03d|%02d %-8s    %02d:%02d|&",
    CPU(), Disk('C'), MEM(), Disk('D'), Weather('Moscow'), DateTime()
  );
 
  # Выводим в порт
  while ($data =~ s/(.)//s) {
    $port -> write($1);
    $port -> lookclear;
  }
 
  # Ожидание
  sleep(10);
}
 


Дабы не загромождать статью кодом, привожу описание использованных функций, а полностью программу можно скачать по ссылке в конце статьи.

InitSerial — производит необходимые настройки для работы с портом из perl (модуль Win32::SerialPort)

closePort — правильно прекращает работу с портом, чтобы её можно было возобновить без проблем при следующем запуске. Вешается на сигнал прерывания программы.

CPU — подсчитывает загрузку CPU. Использует уличную магию (функция SystemTimes), которую я где-то подсмотрел. Для подсчёта загрузки использует функцию из библиотеки kernel32 GetSystemTimes, которая присоединяется к программе в функции InitWin32 (модуль Win32::API::Prototype).

MEM — возвращает отношение доступной физической памяти к общему её количеству (модуль Win32::SystemInfo)

Weather — читает температуру и давление со страницы Яндекс.Погода. Делает это не чаще, чем раз в два часа.

DateTime — возвращает текущие день месяца, месяц, часы и минуты

Disk — возвращает объём свободного места на диске (модуль Win32::DriveInfo).

Русский язык


Мой экран, как уже упоминалось, произведён в России. В связи с этим они имеет две кодовые страницы — на первой (№ 0) отдельно содержатся кириллические буквы, аналогов которых в латинице нет. На второй (№ 1) имеется полный русский алфавит, по кодам символов совпадающий с cp-1251. Поэтому, при желании, мы можем выводить русские буквы на экран без особых затрат.
Маленький минус, с которым я столкнулся — значка градуса на странице №1 нет (в отличие от страницы №0). Заменил апострофом.
Для управления экраном используется библиотека LiquidCrystal, рассчитанная на распространённую модель экрана. Но конечно, никто не делал в ней возможности переключения кодовых страниц, так как буржуины горя поддержки двух языков не знают. Проведём простые модификации библиотеки.

Находится она в %arduino_install_path%\arduino-1.0\libraries\LiquidCrystal
Согласно документации на экран в разделе “Команды модуля” установка кодовой страницы проводится в команде Function set вторым битом.
Добавим в LiquidCrystal.h новую константу:

#define LCD_CODEPAGE 0x02

Затем в LiquidCrystal.cpp найдём функцию void LiquidCrystal::init() и в ней добавим эту константу к остальным установкам, вот так:
if (fourbitmode)
_displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS | LCD_CODEPAGE;
else
_displayfunction = LCD_8BITMODE | LCD_1LINE | LCD_5x8DOTS | LCD_CODEPAGE;


Таким образом, 2-й бит будет поднят, экран воспользуется кодовой страницей №1, и мы можем передавать ему данные на русском языке в кодировке cp-1251 (в моём случае — это название месяца).

Файлы



Скетч для Ардуино, программа на perl по сбору данных, подправленная библиотека LiquidCrystal для работы с кодовой страницей №1, документация на экран МЭЛТ

Применение



Применение LCD с Ардуино в качестве информера практически не ограничено.
Возможно, это не так удобно, как второй монитор, но пригодиться может. Время, погода, системная информация, дебаг… Кстати, ещё один пример, недавно пришедший мне в голову — отслеживание торрентов в uTorrent через его WebAPI…

Но главное, конечно — это удовольствие от хобби, которого вам и желаю!
Вячеслав Голованов @SLY_G
карма
133,2
рейтинг 812,2
Редактор GeekTimes
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (29)

  • +9
    Про сырники порадовало :)
    Кстати для справки: почему бредборд так называется: раньше, радиолюбители для создания прототипов использовали следующий метод: рисовали как можно компактнее схему, клали её на разделочную доску. На место узлов и углов вбивали гвозди, вокруг которых вешали/напаивали детали. Очень удобно кстати :)
    • 0
      Гениально!
    • +1
      При этом, наибольшее распространиение получил так называемый метод «соединения накруткой», используемый до сих пор в телекоммуникациях и военной технике.

      • 0
        Да, но это не способ прототипирования. Этот способ находит место там, где печатную плату будет делать долго или дорого, а девайс нужен сейчас. Но способ, как вы правильно заметили, распространён и сейчас.
        • 0
          Нет. Соединение накруткой имеет некоторые механические показатели (виброустройчивость), которые превосходят пайку.
      • 0
        в телекомах используется все реже и реже, плинты наше все
        • 0
          Вы не поверите — используется и сейчас!!! Завтра сфотографирую в своем родном телекоме (работаю я там) «кросс» — убедитесь
          • 0
            то, что используется и сейчас не исключает «все реже и реже». доказывать не надо, где-то на работе лежит «пистолет для навивки»
  • +3
    Как же доступно и понятно! Огромное спасибо! Столько времени сэкономил!
  • +2
    За сырники респект!
  • +1
    В интересном месте ваши сырники хранятся)
  • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      Поясню: для компа — возможно, да и то сейчас нашим старым-добрым-моддеровским способом его уже и не подключишь-то: производители материнок всё чаще забивают на LPT и COM!

      Но второй плюс статьи — это использование LCD в автономных ардуиновских проектах! ;)
  • +5
    Пойду сырники делать :)
  • +3
    «… но и для двустороннего общения с программами, на компьютере запущенными.»

    Это не те дроиды, которых вы ищите :)
  • 0
    Познавательная статья — даже я все понял.
    Интересно было узнать про Breadboard, не использовал такую штуку раньше.
    Историческая справка artemonster про бредборд 11 февраля 2012, 23:56 тоже хороша.
  • 0
    Гуд.
    А то тут на днях понадобилось циферки вывести с ардуины…
    Естественно по закону подлости цифрового индикатора в доме нет…
    … Зато нашёл матрицу 8 на 8 — куплена лет сто назад подо что не помню…
    Пол-вечера паял её на макетку. В итоге выяснилось, что схема включения из примера скетча в АрдуиноИДЕ — не то, что-бы совсем верная…

    Сейчас думаю с одной стороны о вот таком экране, с другой «А нафига козе баян для вывода пары цифр???»
    • 0
      Ну я сначала думал об индикаторах, но потом оказалось что очень много деталей надо навешивать на них, либо shield специальный покупать. К тому же, они только цифры и выводят, а экран — вещь универсальная, если нужно цифры — выводит цифры, а вдруг что-то ещё понадобится…
  • 0
    <зануда>По моему величину sleep можно увеличить на порядок.</зануда>
  • 0
    А где в интернете можно купить полный комплект (контролёр, LCD, провода, доска и прочее)? Что бы не получилось, что купил по частям, а собрать в итоге не получиться (с радио электроникой дело никогда не имел)
    • +1
      Вообще, в магазинах, которые торгуют Ардуино, всё совместимо меж собой. При этом, доски — вообще все одинаковые, насколько я понимаю, провода — тоже. Модели экранов я указал.
      Думаю, проще обратиться к присутствующим на хабре продавцам amperka.ru, у них есть всё перечисленное в одном месте. Иногда отсутствует на складе, когда они ждут следующую поставку.
      А они, в свою очередь, покупают всё у DFRobot.com, за исключением экранов — экраны из России, как я упомянул.
      Можно LCD купить у амперки (они продают экраны уже с ногами), а остальное у DFRobot заказать — будет чуть дешевле, но дольше. В Москву недели две посылки идут из Гонконга.
      И почему-то провода, которые я в амперке покупал, чуть тоньше и болтаются в доске, а у dfrobot купил — там все ок. Хотя может просто не повезло, попались такие.
  • 0
    А почему в качестве символа перевода строки не использовался мм… символ перевода строки? :)
    • 0
      В windows это два байта, возиться не хотелось, время было позднее… В общем, это не так важно, можно и сделать.
  • 0
    Поясните один момент:
    выпишите «См. фото — контакты 1, 3 и 5 требуют подключения к земле. „
    Смотрим документацию по дисплею, в частности в таблицу по контактам, там написано “5 — R/W — Выбор режима записи или чтения»

    Почему на дисплее 5 контакт подключен к земле, что происходит и что будет если подключить к +5?
    Честно, не понимаю как это работает…
    • 0
      Правильно.
      Если контакт 5 подключен к земле, это значит режим «запись данных в lcd», что нам и надо.
      Если к 5В — «чтение данных с lcd». Читать с lcd по-моему можно положение курсора и таблицы символов, но нам это не надо.
  • 0
    Четырех битовая схема была выбрана, как я понимаю, с целью экономии разъемов и упрощения работы?
    • 0
      Ага.
  • +1
    Сырники хороши, спору нет. А вместо Arduino можно было взять голый микроконтроллер Atmega328 и мало-мало деталек(даже не буду говорить про паяльник, его не все любят почему-то, а жаль) — даже без каких-либо знаний, по схемам из инета, можно собрать аналогичный девайс в разынесколько дешевле.
    Я считаю, что Arduino хороша для отладки и макетирования, но использовать ее в конечном изделии(пусть оно даже собрано на макетной плате — это кто как любит) — расточительство.
    • 0
      Ну, как инструкцию по подключению lcd к arduino тоже можно использовать.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.