Введение
По замыслу автора, LCD2USB должен быть дешевым и собранным из легкодоступных компонентов. Поэтому схема основана на микроконтроллере Atmel ATmega8, и в ней нет деталей, которые трудно найти. Общая стоимость устройства составляет от 5 до 10 евро. Для устройства разработано демонстрационное приложение, которое работает под Linux, MacOS X и Windows.

 

Аппаратная часть LCD2USB сделана на ATmega8, дешевом и легкодоступном микроконтроллере с 8 Кб флеш-памяти (из которой приблизительно 3 Кб заняты программой) и 2 Кб – ОЗУ. Остальные компоненты – преимущественно разъемы для подключения ЖК индикаторов и разъем интерфейса с ПК.Светодиод питания (LED1) показывает, что система питается от USB. Тактовая частота задается кварцевым резонатором 12 МГц. Использование кварцевого резонатора необходимо, поскольку для интерфейса USB требуется высокая точность временных параметров.
USB интерфейс устройства LCD2USB реализован чисто программно и использует три вывода AVR контроллера (PC0, PC1 и PD2). Эта программная реализация поддерживает только низкоскоростной USB, о чем ПК узнает благодаря резистору R1.<
В интерфейсе используется разъем типа USBB. Это квадратный разъем, который обычно применяется для USB устройств (в отличие от плоских разъемов типа USBA, используемых для USB хостов). Разъем USB, в отличие от всех остальных компонентов, монтируется на обратной стороне печатной платы. Кроме того, кабель можно подключить и без разъема, со стороны компонентов, как показано на рисунках ниже.

Устройство относится к категории «bus-powered», т.е. вся схема питается от USB. Таким образом, AVR контроллер и ЖК дисплей питаются от USB линии VBUS. Эта линия может отдавать максимальный ток 500 мА. Питающее напряжение фильтруется и буферизуется конденсаторами C3 и C6. 
Интерфейс LCD2USB совместим с несколькими различными текстовыми LCD дисплеями на основе контроллера HD44780. Он поддерживает дисплеи с одним контроллером (тестировался с 16×2, 20×2 и 20×4) и с двумя контроллерами (тестировался с 27×4 и 40×4). Для обмена с контроллером HD44780 LCD2USB использует 4-битный интерфейс.На плате установлены два разных разъема (JP1 и JP2), предназначенных для наиболее распространенных дисплеев на контроллере HD44780. Дополнительный разъем JP6 расширяет разъем JP2 для подключения дисплеев с двумя контроллерами, таких, например, как 40×4. Подробности показаны на рисунках ниже. Так как подключение питающего напряжения у дисплеев 40×4 отличается от дисплеев 20×2, на плате предусмотрены перемычки SJ2 и SJ3, которые позволяют подать напряжение заданной полярности на разъем JP2. По умолчанию они установлены для разъема дисплеев типа 20×2. На фотографии ниже показано, как изменить эту установку перемычек для дисплея типа 4×40:

     
Дисплеи: 2×16, 4×16, 4×20

Интерфейс программирования (SPI
Программа загружается в контроллер через стандартный 10-контактный разъем AVR ISP (SV1). Для загрузки потребуется кабель программирования. Потребуются также совместимые с этим кабелем программы для ПК, такие как Ponyprog или UISP.Разъем JP3 подключен к последовательному интерфейсу микроконтроллера. Этот разъем предназначается только для целей отладки и не может быть напрямую подключен к интерфейсу RS-232 ПК. Для подключения понадобится согласователь уровней.

Загрузка прошивки в контроллер
Если вы знакомы с программированием для Atmel, вы, вероятно, знаете что делать. Makefile в папке lcd2usb/firmware/Makefile подразумевает, что вы используете простой адаптер для параллельного порта, совместимый с STK200. Подключите собранное устройство (без дисплея) к ПК через USB. Устройство не будет определено до тех пор, пока в нем не будет прошивки. Подключите устройство через кабель программирования к ПК с ОС Linux и установленным uisp tool, после чего напечатайте "make fuse; make flash-nodep", чтобы загрузить прошивку в контроллер.

Если Makefile не сработает, вы можете также прошить устройство вручную, используя avrdude и вышеупомянутый совместимый с STK200 адаптер принтерного порта со следующими параметрами:

avrdude -c stk200 -p atmega8 -U lfuse:w:0x9f:m -U hfuse:w:0xc9:m -U flash:w:firmware-avrusb.hex

Чтобы вручную загрузить прошивку, используя usbasp, просто используйте следующую команду:

avrdude -c usbasp -p atmega8 -U lfuse:w:0x9f:m -U hfuse:w:0xc9:m -U flash:w:firmware-avrusb.hex

Конечно, вы можете использовать другую систему программирования AVR, но вам вероятно придется сделать небольшие изменения в файле Makefile.
Описание протокола
Для простоты, LCD2USB использует только управляющие USB сообщения. Более эффективная и быстрая групповая пересылка доступна только для высокоскоростных устройств. Управляющее сообщение для низкоскоростных устройств состоит из 8 байт. Первый байт указывает тип управления, его значения фиксированы для команд заданных продавцом устройства (производителем). LCD2USB использует его для своих целей (не заданные производителем команды используются для запроса номера и ID устройства и т.д.). Оставшиеся семь байт представляют собой: тип запроса (1 байт), значение (2 байта), индекс (2 байта) и поле длинны (2 байта) для данных, передаваемых с контрольной передачей. Протокол LCD2USB не посылает дополнительных данных, поэтому, из соображений совместимости, последние два байта должны быть нулевыми. Оставшиеся четыре байта (2 байта значения и 2 байта индекса) оставлены для передачи данных. Таким образом, за одну транзакцию передаются четыре байта. Это могут быть четыре байта команд или четыре байта данных для HD44780.

Подробное описание байта запроса

Бит      7 6 5 4 3 2 1 0
Название C C C T T R L L
CCC = тип команды
0 (000) = эхо
1 (001) = команда
2 (010) = данные
3 (011) = установить
4 (100) = получить
5 (101) = зарезервирован для использования в будущем
6 (110) = зарезервирован для использования в будущем
7 (111) = зарезервирован для использования в будущем
TT = id назначения
R  = зарезервирован для использования в будущем, установлен в 0
LL = число байт в передаче – 1

 ID назначения имеет разный смысл для разных запросов. Для передачи команд и данных он представляет двухбитовую битовую карту, показывающую, к какому из двух возможных контроллеров, поддерживаемых интерфейсом LCD2USB, адресован запрос. Один и тот же запрос может быть адресован одновременно двум контроллерам (например для установки символов заданных пользователем).
Для операций set и get ID назначения определяет значение для установки или получения. В настоящий момент поддерживаются следующие значения: 

set 0 - установить яркость
set 1 - установить контраст
get 0 - получить версию прошивки (msb = основная версия, lsb = промежуточная версия)
get 1 - получить button bitmap
get 2 - получить обнаруженные контроллеры

Дополнительные подробности вы найдете в исходном коде тестовой программы, находящейся в архиве с прошивкой для LCD2USB.
Программа
Первоначально интерфейс LCD2USB был разработан для использования с lcd4linux. В то же время LCD Smartie и LCDProc также были усовершенствованы, и теперь поддерживают интерфейс LCD2USB. В архив с прошивкой для LCD2USB включено маленькое демо приложение, которое можно использовать для дальнейшего портирования LCD2USB на другие платформы. В настоящий момент эта программа поддерживается Linux, MacOS X и Windows.

Использование LCD2USB под Windows
Harald Körfgen написал плагин к LCD Smartie для LCD2USB, тем самым окончательно сделав возможным использование LCD2USB в Windows. Ниже представлено то, что он сам пишет о своем плагине:

LCD2USB-smartie.zip содержит все необходимые файлы с исходным кодом для компилирования драйвера с помощью Microsoft Windows Server 2003 R2 Platform SDK, Microsoft Visual C++ 2005 Express Edition и LibUsb-Win32. В результате компиляции получится файл LCD2USB.DLL

Для того чтобы использовать драйвер, в системе должна быть установлена libusb-win32 и LCD2USB.DLLдолжна быть помещена в папку «displays» программы LCD Smartie. В результате, устройство должно быть обнаружено автоматически. Драйвер тестировался только для дисплея 20x4.

Версия 1.08 (avrusb)/2.08 (usbtiny)

Архив с исходным кодом для драйвера LCD2USB-smartie.zip 

Оригинал статьи
Автор: Till Harbaum <>