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…

    Но главное, конечно — это удовольствие от хобби, которого вам и желаю!
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

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

          • 0
            Да, но это не способ прототипирования. Этот способ находит место там, где печатную плату будет делать долго или дорого, а девайс нужен сейчас. Но способ, как вы правильно заметили, распространён и сейчас.
            • 0
              Нет. Соединение накруткой имеет некоторые механические показатели (виброустройчивость), которые превосходят пайку.
            • 0
              в телекомах используется все реже и реже, плинты наше все
              • 0
                Вы не поверите — используется и сейчас!!! Завтра сфотографирую в своем родном телекоме (работаю я там) «кросс» — убедитесь
                • 0
                  то, что используется и сейчас не исключает «все реже и реже». доказывать не надо, где-то на работе лежит «пистолет для навивки»
          • +3
            Как же доступно и понятно! Огромное спасибо! Столько времени сэкономил!
            • +2
              За сырники респект!
              • +1
                В интересном месте ваши сырники хранятся)
                • +1
                  Как то прикручивал LCD на корпус — так вот там достаточно было LPT порта (без обвязки) + драйвера были windows/linux — Хоть обвыводись чего хочешь. Дисплеи нужны такие же как у автора. Только Ардуино не нужно совсем :)
                  • 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
                                    Четырех битовая схема была выбрана, как я понимаю, с целью экономии разъемов и упрощения работы?
                                  • +1
                                    Сырники хороши, спору нет. А вместо Arduino можно было взять голый микроконтроллер Atmega328 и мало-мало деталек(даже не буду говорить про паяльник, его не все любят почему-то, а жаль) — даже без каких-либо знаний, по схемам из инета, можно собрать аналогичный девайс в разынесколько дешевле.
                                    Я считаю, что Arduino хороша для отладки и макетирования, но использовать ее в конечном изделии(пусть оно даже собрано на макетной плате — это кто как любит) — расточительство.
                                    • 0
                                      Ну, как инструкцию по подключению lcd к arduino тоже можно использовать.

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