19.04.2009

LCD для Arduino

Ранее я уже расписывал, как подключить семисегментный дисплей к Arduino.

Семисегментный LED-дисплей прежде всего хорош тем, что имеет достаточно простую и надежную конструкцию, а при опытно подобранном токе через сегменты, легко читаем и с нескольких метров, и в кромешной темноте ;)

Дальше начинаются минусы: высокий ток потребления, необходимость схемы мультиплексирования разрядов, ограниченный набор синтезируемых символов. Все эти недостатки можно обойти в той или иной степени, с использованием экзотических (читаем: дорогих) компонентов.

Но гораздо проще использовать знакосинтезирующие ЖКИ-дисплеи, которые благодаря китайскому трудолюбию можно приобрести теперь на каждом углу.

Для экспериментов возьмем WinStar WH1602B-YYH-CTK:







Как видите, на самом деле - это модуль, состоящий из совместимого с Hitachi HD44780U контроллера, ЖКИ-матрицы и светодиодной подсветки.

Дисплей имеет две строки по 16 знакомест в каждой, параллельный интерфейс доступа, память, русский шрифт и даже возможность загрузить свой собственный знакогенератор.

Главное - не забыть, что на него подается три питания: одним питается контроллер со всей логикой (обязательно), вторым - LED-подсветка (опционально), а третьим - сам LCD-дисплей, и последнее напряжение надо уметь регулировать.

Для начала, вооружимся datasheet-ом и соберем типовую схему:



Мне для этого потребовался фрагмент вилки PLS на 16 контактов, чтобы дисплей легко стыковался с беспаечной макетной платой:



Таким образом, взять в руки паяльник придется - по крайней мере, один раз:



Дальше надо выбрать ширину параллельного интерфейса: 8 или 4 бит. Дело, конечно, не в скорости обмена, а в количестве цифровых входов Arduino, которые будут потеряны после подключения дисплея. Если выбрать 8-битный режим, то потребуется 11 выходов: к 8-битной шине данных добавляются линии RS, R/W и E(nable).

4-битная шина, соответственно, займет 7 выходов (если цифровых выходов все-таки не хватает, можно использовать и аналоговые, после переключения их в соответствующий режим), передача байта происходит в два цикла по линиям DB7-DB4, сначала старший ниббл, потом младший.

Хорошая новость состоит в том, что все эти тонкости нам не особенно важны: в основном, благодаря библиотеке LiquidCrystal (входит в Arduino IDE). Вот простой способ соединить Arduino и LCD-дисплей без паяльника:



В качестве тестового скетча можно использовать HelloWorld.pde из LiquidCrystal:

#include <LiquidCrystal.h>

// LiquidCrystal display with:
// rs on pin 12
// rw on pin 11
// enable on pin 10
// d4, d5, d6, d7 on pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

void setup()
{
// Print a message to the LCD.
lcd.print("hello, world!");
}

void loop()
{
}

Самая главная строка - это конструктор объекта lcd. Параметрами надо указать, к каким цифровым выходам Adruino подключены соответствующие выводы дисплея. Основное тело loop() пустое, поскольку инициализация и вывод текста в дисплей целиком происходит в setup(). Для нас это означает, что sketch отработает один раз после нажатия на reset, сразу после включения питания или же сразу после загрузки sketch-а в Arduino.

Итак, все готово, можно включать. Если дисплей пуст, обратите внимание на VO (питание сегментов, пин 3). Я взял потенциометр 20К, включил его между GND и 5V, а среднюю точку подключил к VO. Немного повращав отверткой ползунок, я легко добился читаемости символов:



Светодиодная подсветка "сидит" на двух последних пинах дисплейной колодки: 15 и 16 (анод и катод). Подключать ее вовсе не обязательно, но, при желании можно также воспользоваться типовой схемой:



Я использовал R = 34 Ом, яркость была средняя...

Подводя итог: LCD к Arduino можно подключить довольно быстро: есть библиотека для работы, хоть и максимально упрощенная (читать из дисплея, а также загружать знакогенератор она не умеет). Если верить документации, ток потребления дисплея = 1,2 мА, а LED-подсветки @ 4,2 В = 130 мА.

Встречаются модификации с разным цветом и типом подсветки (или вообще без нее), другим количеством рядов (1,2,4), другим количеством знакомест в ряду (8,16). Если все равно не хватает, надо подумать о графическом дисплее, но про это - как-нибудь в другой раз ;)

13.04.2009

Sanguino

Название: Sanguino
Процессор: ATmega644P
Тактовая частота: 16MHz
Совместимость с Sheild-платами: нет
Совместимость с Arduino IDE: да (поставляется в виде заменяемых в ArduinoIDE 0013 файлов)

Веб-сайт проекта: sanguino.cc
Блог проекта: blog.reprap.org

Название происходит от sanguine, которое имеет два значения: 1) бодрый, надежный, уверенный 2) кроваво-красный. И правда, печатная плата, на которой он выполнен - красного цвета ;)



В своем роде, Sanguino являлся предшественником Arduino Mega. Взглянем на основные характеристики процессора:









Память программ64K
RAM4K
EEPROM2K
Аппаратные UART2
Цифровые пины32
Шим-выходы6
Аналоговые пины8


По идее, именно так и надо было бы удваивать память Arduino, но увы: скорее всего, корпус PDIP-40 помешал бы поместился в форм-факторе оригинального Arduino. Следовательно, с Shield-платами можно попрощаться.

Вот так выглядит Sanguino на собственной макетной Shield-плате с клеммниками:



Схема:



Продается в виде KIT-а:



Но можно собрать на беспаечной



... или обычной макетке:



Основные фичи:
  • Свтодиоды: два - питание, pin 13
  • Исполнение выходов: штекер PLS (удобно устанавливать в макетку)
  • Автосброс: есть, на RTS
  • Отключение автосброса: есть, джампером
  • Выбор источника питания: есть, переключатель USB/DC
  • Разъем ICSP: есть, 2x3
  • Разъем JTAG: есть, 2x5
  • Порт для программирования: TTL (требуется USB2TTL-кабель)
Полный список отличий от оригинального Arduino авторы указали здесь.

Основные преимущества:
  • относительная компактность;
  • увеличен размер ОЗУ;
  • возможность самостоятельной сборки на PCB или макетной плате;
  • JTAG
Основные недостатки:
  • нет полноценного USB/COM для заливания sketch-ей.
Мне особенно понравился переключатель питания (до этого везде ставили джампер):



Резюме: можно предложить тем, кто не хочет платить 49 EUR за Arduino mega: 25 USD за KIT - дешево и сердито, если не стоит проблема совместимости с Shield-платами.

11.04.2009

Итоги голосования по Arduino

Вот и подошло к концу голосование "Какие Arduino у вас есть?". На мой взгляд, очень интересные результаты.

Пользователи Arduino BT (Bluetooth), BoArduino, LilyPad в мой блог не заходили. У меня самого пока еще есть LilyPad, но для чистоты эксперимента я в голосовании участия не принимал. Всего проголосовало 34 человека.

Самая популярная модель на текущий момент - Duemilanove (26%), далее идут Freeduino и Diecimila (по 20%), потом самодельные Arduino Serial (14%). Наконец, у кого-то есть оригинальные Arduino Serial и Arduino Nano (по 2%).

Абсолютным победителем является ответ "нет никакого" (32%). Я могу только пожелать этим людям все-таки поскорее обзавестись этим великолепным инструментом, тем более, что его можно легко собрать самостоятельно, а также заказать в России или за рубежом.

И, конечно же, я должен признать, что набор вариантов в списке голосования был далеко не полным... Возможно, у кого-то есть аналоги Arduino, которые в него не попали. Приношу свои извенения и постараюсь частично исправить эту оплошность под тегом ArduinoCompatible.

09.04.2009

Arduino-совместимые

Иногда мне приходят письма с самыми разнообразными вопросами по поводу Arduino.

После очередного "у меня есть Freeduino, но я про него толком ничего не знаю, нет документации, только диск", я решил посвятить в моем блоге немного места аналогам Arduino под тегом ArduinoCompatible. Среди них попадаются и достойные решения, и не очень, но в целом - чем их больше, тем всем нам лучше.

В чем причина появления аналогов, и почему они не называются "Arduino"? Тут все относительно просто.

Схемы, чертежи печатной платы, а также софт доступны для Arduino под лицензией Creative Commons Attribution Share-Alike 2.5. Это, конечно, не BSD-лицензия, но все-таки довольно свободная.

Однако, авторы "застолбили" за собой название "Arduino", сделав собственной торговой маркой. Стоит ли их порицать за это? Не думаю. Тем более, что они предлагают присоединиться к сообществу и внести свой вклад всех желающих.

Через некоторое время появился Freedino, который уже торговой маркой не являлся. Вообще, я убедился: редкий блоггер-электронщик не имеет собственного аналога Arduino, в той или иной степени совместимого с оригинальным :)

Совместимость бывает разной степени:
  • полная: пишем с помощью Arduino IDE, пристыковываем Shield-платы;
  • программная: пишем с помощью Arduino IDE, но Shield-платы не подойдут;
  • никакая: роднит с Arduino только сама идея.
(продолжение следует...)

05.04.2009

+1К свободной памяти для Arduino

Как известно, в Arduino используется bootloader - специальная подпрограмма, которая постоянно находится в самом конце памяти программ. После сброса она получает управление и через последовательный интерфейс (SPI, пины Rx и Tx) зашивает новую микропрограмму (sketch) в верхние адреса памяти, а затем и вовсе отдает ей управление.

Строго говоря, bootloader необязателен. В готовом изделии можно одним легким движением поставить FUSE-бит BOOTRST в 1, и управление после сброса будет передаваться непосредственно программе, по адресу 0x0000 (именно так я и сделал с ATmega в светодиодном индикаторе).

Испокон веков ;) размер bootloader-а Arduino был 2048. Конечно, реально-то он был чуть меньше, но размер bootloader-а кодируется двумя FUSE-битами BOOTSZ1 и BOOTSZ0. Таким образом, для ATmega168P есть четыре фиксированных размера: 256, 512, 1024 и 2048 байт. Для ATmega328P тоже четыре размера, но поскольку памяти программ у него в два раза больше, то разработчики чипа "сдвинули" размеры bootloader-а в сторону увеличения: 512, 1024, 2048, 4096.

Те, кто писал программы на ассемблере, обычно загадочно улыбаются в ответ на мою фразу "скетч занял пять килобайт в памяти программ". Оно и понятно - при программировании на C память программ съедается стремительно, зато и сама программа пишется значительно быстрее. Именно поэтому ATmega328P заменил на боевом посту ATmega168 - в некоторых случаях просто не хватало 16К памяти программ.

Стоп-стоп, не 16, а 14-ти ( минус 2К на бутлоадер ). После замены процессора становится свободно 30К:



Но что делать, если скетч занял 30936 байт? Переходить на ассемблер?

Старшие товарищи давно бились над задачей сокращения размера bootloader-а хотя бы до 1К. Совместными усилиями они этого достигли, о чем и написал в своем блоге уважаемый Spiff. Последовательность действий такая:
  1. Берется новый исходник bootloader-а, компиляется в .hex
  2. Результат зашивается в память ATmega, корректируются fuse-биты
  3. Чтобы ArduinoIDE поняла, что у нее стало больше памяти для результата компиляции, правится boards.txt.
Результаты компиляции можно взять у Spiff-а в блоге, но есть одна беда - он выложил неправильно скомпилированные результаты. Я неделю некоторое время помучился с его .hex-файлом, пока не принял решение "чисто на всякий случай" перекомпилять. Помогло!

Итак, вот мой результат компиляции: bootloader_1k_0015.zip. Его надо распаковать в каталог с Arduino IDE 0015, при этом изменятся две секции в списке плат, станет так: "Arduino Duemilanove w/ ATmega 328P 1k" и "Arduino Diecemila or Duemilanove w/ ATmega 168 1K". Выбирайте нужную, затем можно прошить новый bootloader через Arduino IDE, дальше - как обычно.

Сами понимаете, что если прошить 1К-bootloader, то даже немодифицированная Arduino IDE будет замечательно работать, но не наоборот :(

Более правильно было бы добавить секции, но тогда Arduino IDE не сможет корректно отобразить в своем окне информацию об ошибках, сославшись на длинную цепочку исключений java - согласитесь, это не очень удобно.

Я скомпилировал bootloader-ы для тех процессоров, для которых смог 100%-но убедиться в работоспособности - с трудом, но нашел таки ATmega168P :) Во всех моих Arduino сейчас работает ATmega328P - выписал целую упаковку из-за границы, и, как всегда, раздаю остатки через "молоток"...