Программирование AVR: работа с USB V-USB: LCD2USB - подключение LCD индикатора к компьютеру через USB Thu, March 28 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

V-USB: LCD2USB - подключение LCD индикатора к компьютеру через USB Печать
Добавил(а) microsin   

В статье описан проект, который позволяет легко и недорого подключить к компьютеру LCD-индикатор. Материал взят с сайта harbaum.org.

LCD2USB - проект с открытым исходным кодом и описанием железа (open source/open hardware). Цель LCD2USB - подсоединить текстовые дисплеи на основе контроллера HD44780 к персональным компьютерам (PC) через USB. LCD2USB разрабатывался как дешевый проект, который можно просто изготовить из доступных запчастей. Поэтому он основан на недорогом микроконтроллере Atmel AVR ATmega8 (из памяти программ flash 8 кбайт используется ~3 кбайт), который легко достать. Общая стоимость (не считая цены индикатора и печатной платы) - от 5 до 10 Euro. LCD2USB поставляется с программой-демо, работающей на Linux, MacOS X и Windows.

В настоящий момент LCD2USB поддерживается lcd4linux (поддержка LCD2USB встроена), LCD Smartie (требуется отдельный драйвер) и LCDProc (поддержка LCD2USB встроена).

LCD2USB базируется на следующих проектах:

    * LCD4LINUX [1], отличный фреймворк для использования маленьких LCD вместе с Линукс
    * V-USB [2], полная программная реализация протокола USB для платформы AVR
    * USBtiny [3], другая программная реализация протокола USB для AVR
    * LCD library for HD44870 based LCD [9], подпрограммы LCD от Peter Fleurys для AVR

[Железо]

LCD2USB-prototyp.jpg

LCD2USB-4x20-front.jpg

LCD2USB-4x20-rear.jpg

Железо состоит из AVR Mega8 CPU, окруженного несколькими электронными компонентами и коннекторами к PC и LCD.

lcd2usb-front.jpg

Светодиод (LED) питания LED1 показывает, что система запитана от USB. Тактовая частота вырабатывается от кварца 12 МГц. Такая частота нужна для работы программной поддержки протокола USB.

Интерфейс USB

USB интерфейс LCD2USB основан на программной реализации протокола USB с использованием трех ножек AVR (PC0, PC1 и PD2). Эта программная реализация поддерживает только low speed USB, о которой PC информируется резистором R1. Текущая версия 1.1 LCD2USB работает с сигналами USB на 3.6V, и в этом отношении она больше соответствует стандарту USB, чем старая версия 1.0.

Соединение с USB может происходить через коннектор типа USB B. Это квадратный коннектор, обычно используемый для USB-устройств (в отличие от коннекторов типа flat A, используемый для USB хостов). USB коннектор монтируется на обратной стороне PCB. Другой способ подключения - прямая напайка кабеля к обратной стороне, как показано на рисунке.LCD2USB-cable.gif

LCD2USB-simple.jpg

Подключенное таким способом устройство называется bus powered device (устройство, запитанное от шины). Это означает, что устройство полностью, напрямую запитано от USB. Таким образом AVR и LCD запитаны от сигнала VBUS интерфейса USB. Этот сигнал может предоставить max 500 мА. Питание отфильтровано C3 и C6.

Интерфейс LCD

LCD2USB поддерживает несколько разных текстовых дисплеев на основе контроллера HD44780. Поддерживаются одноконтроллерные дисплеи (проверено на 16*2, 20*2 и 20*4) и двухконтроллерных дисплеях (проверено на 27*4 и 40*4). LCD2USB интерфейс использует шину 4 бита для связи с HD44780.

LCD2USB-connectors.gif

Два различных коннектора (JP1 и JP2) предоставляют интерфейс к наиболее распространенным дисплеям HD44780. Дополнительный коннектор JP6 расширяет JP2 для двухконтроллерных дисплеев, например 40*4. См. подробности на рисунках. Поскольку питание для соединения индикатора 40*4 отличается от 20*2, запайка мостиков SJ2 и SJ3 позволяет настроить полярность питания на JP2. По умолчанию установлено соединение для 20*2. На фотографии показано, как изменить установки с дисплеем 4x40:

LCD2USB-bridge-4x40.jpg

Внимание: использование неправильной полярности может повредить индикатор LCD, интерфейс и даже порт PC USB. Пожалуйста убедитесь, что коннектор дисплея соответствует разводке сигналов платы LCD2USB. Вы можете для первых испытаний использовать хаб USB между LCD2USB и PC. Это снижает риск повреждения PC, если Вы не подали корректно питание на LCD. Но все равно в случае ошибки можно повредить LCD2USB, LCD и хаб.

LCD2USB-disp_con1.gif

LCD2USB-disp_con2.gif

LCD2USB-disp_con3.gif

Об источнике питания

Для дисплеев с подсветкой нужно предпринять специальные меры для их питания. LCD2USB разработан так, что потребляет в большинстве случаев 75 мА, что нормально для LCD с подсветкой на LED. Эта величина также сообщается PC при конфигурировании подключения USB. Интерфейс LCD2USB может предоставить до 100 мА с помощью программного управления подсветкой. Это ограничение транзистора T1. Если подсветка потребляет более 100 мА, необходимо заменить T1 (см. секцию "Примечания к списку деталей" далее). Также необходимо предотвратить перегрузку шины USB, которая не может предоставить ток более 500 мА для bus powered device. Увеличение потребления тока подсветкой необходимо отразить в конфигурации устройства USB путем настройки константы USB_CFG_MAX_BUS_POWER в файле usbconfig.h исходного кода прошивки (firmware), и перекомпилировать проект. Это изменение firmware может не потребоваться для всех PC, но некоторые могут отключать источник питания для устройства, которое потребляет ток больше, чем заказано в дескрипторах USB.

Интерфейс программирования (ISP)

Firmware LCD2USB загружается через стандартный 10-pin AVR ISP коннектор (SV1). Для загрузки нужен отдельный кабель. Может использоваться простейший программатор наподобие AVRisp или UniProF [11]. Программа PC Ponyprog site:lancos.com или UISP site:savannah.nongnu.org будут использовать этот кабель для загрузки firmware в AVR устройства LCD2USB. Кабель программирования понадобится только один раз, поскольку firmware сохраняется напрямую во внутреннюю энергонезависимую flash память AVR.

Последовательный интерфейс

Коннектор JP3 предоставляет последовательный интерфейс AVR. Этот коннектор предназначен для отладки. Чтобы подключить его к RS232 PC, необходим дополнительный преобразователь уровней (например MAX232).

[Схема и разводка печатной платы (PCB ver. 1.1)]

LCD2USB-schematic.gif

LCD2USB-pcb.gif

LCD2USB-pcb.jpg

В последней версии PCB добавлены два диода Зенера (стабилитроны) для увеличения совместимости с шиной USB. Как выяснилось, индуктивность по питанию стала ненужной и была удалена, что освободило место для двух диодов Зенера.

Список деталей

RefDes Кол. Описание
Q1 1 12 МГц кварц, корпус HC49U (12,0000-HC49U-S)
R1 1 2.2 kОм резистор (1/4W 2,2k)
R2, R3 2 68 Ом резистор (1/4W 68)
R4 1 47 Ом резистор (1/4W 47)
R5 1 220 Ом резистор (1/4W 220)
R6 1 4.7 kОм резистор (1/4W 4,7k)
C1, C2 2 22 pF керамический конденсатор, 2.54 мм (KERKO 22P)
C3, C5 2 100 nF конденсатор, 5.08 мм (X7R-5 100N)
C6, C7 2 10 uF электролитический конденсатор (RAD 10/35)
T1 1 BC547C транзистор
L1 1 10 uH индуктивность (SMCC 10u)
S1, S2 2 кнопка (TASTER 9305)
SV1 1 10 pin ISP коннектор (WSL 10G)
JP1 1 коннектор дисплея (BL 1X20G 2,54)
JP2, JP6 2 коннектор дисплея (BL 2X10G 2,54)
-- 2 коннектор на стороне дисплея для JP2/JP6 (SL 2X10G 2,54)
JP3 1 4 pin debug-коннектор, коннектор на стороне дисплея для JP1 (SL 1X36G 2,54)
LED1 1 LED 3 мм зеленый (LED 3MM GN)
-- 1 USB-B коннектор (USB BW)
IC1 1 Atmega8-16 DIP
-- 1 сокет для IC1 (GS 28P-S)
D1, D2 1 3.6V диод Зенера (ZF 3,6)

Дополнительно нужен LCD дисплей, кабель USB

Примечания к списку деталей

1. Кварц должен быть в маленьком корпусе HC49U. Вы можете использовать кварц в корпусе HC18, но Вам для этого нужно его смонтировать на обратной стороне платы.
2. C1 и C2 имеют расстояние между ножками 2.54 мм (1/10 дюйма), C3 и C5 - 5.08 мм между ножками (2/10 дюйма).
3. T1, помеченный как BC547C, может быть заменен BC547A или BC547B.
4. Катод LED1 обращен к R5. Длинная ножка LED расположена ближе к JP1.

Резистор R4 ограничивает ток для подсветки. Величина 47 Ом в списке деталей хорошо подходит для LCD дисплеев с маломощной LED подсветкой. Некоторые дисплеи уже имеют токоограничивающий резистор и/или требуют более мощный ток. В этом случае подсветка будет очень слабой или едва видимой (сопротивление R4 47 Ом не дает ток больше). Для увеличения тока подсветки (и соответственно увеличения её яркости) можно уменьшить номинал R4. Сверьтесь с даташитом на Ваш индикатор, чтобы верно выбрать токоограничивающий резистор для подсветки. BC547 транзистор T1 может не обеспечить требуемый ток > 100 мА. Возможна замена T1 на BS170 MOSFET для управления током 240 мА.

[Загрузка firmware]

Если Вы знакомы с программированием микроконтроллеров Atmel, то наверняка знаете, что нужно делать. Файл Makefile в lcd2usb/firmware/Makefile предполагает, что Вы используете простой stk200-совместимый адаптер [11] программирования, подключаемый в принтерный порт LPT компьютера.

Подсоедините собранное устройство (подключение дисплея LCD пока не требуется) через USB к PC. Оно пока не определится, поскольку firmware еще не загружено (подключение к USB дало питание для устройства LCD2USB, что необходимо для программирования flash). Соедините LCD2USB через коннектор SV1 кабелем программирования с программатором. На Линукс с установленным uisp tool site:savannah.nongnu.org можно просто ввести "make fuse; make flash-nodep" для загрузки firmware.

Если Makefile не работает, Вы можете запрограммировать flash на устройстве вручную, используя программу avrdude и уже упомянутый stk200-совместимый адаптер программирования:

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

Для LCD2USB ver. 1.4 возможна загрузка через USB с помощью USBasp bootloader [12] который avrdude также поддерживает. В этом случае для загрузки firmware введите "make avrdude-nodep".

Для ручной загрузки через 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 (USB control messages). Более эффективны и скоростные передачи bulk, которые доступны только на высокоскоростных устройствах. Сообщение USB control message для низкой скорости всегда состоит из 8 байт. Первый байт индицирует control type и установлен в фиксированное значение для команд, специфичных для вендора. LCD2USB использует для себя не-вендор специфичные команды типа запрос имени устройства, ID и т. п. Оставшиеся 7 байт в управляющей передаче задают тип запроса (1 байт), величину (value 2 байта), и индекс (index 2 байта) и поле длины (2 байта) для передаваемых данных. Протокол LCD2USB не посылает дополнительных данных, поэтому последние 2 байта должны быть 0 для совместимости. Оставшиеся 4 байта (2 для value и 2 для index) освобождаются для передачи данных. Это позволяет передавать 4 байта за одну посылку, следовательно за одну транзакцию USB можно послать 4 байта команд HD44780 или 4 байта данных HD44780.

Байт запроса (request byte)

Bit   7 6 5 4 3 2 1 0
Name  C C C T T R L L

CCC = тип команды (command type)
0 (000) = echo
1 (001) = command
2 (010) = data
3 (011) = set
4 (100) = get
5 (101) = зарезервировано
6 (110) = зарезервировано
7 (111) = зарезервировано

TT = target id
R = зарезервировано, установлено в 0
LL = количество байт в передаче -1

Поле target id различается для различных запросов. Передачи типа command и типа data передают 2 бита данных, показывающих, какой из двух возможных контроллеров адресуется LCD2USB. Оба контроллера могут быть адресованы одновременно (например для настройки символов пользователя).

Для операций set и get target id содержит величину для установки и получения соответственно. Сейчас поддерживаются следующие значения:
set 0 - установка яркости
set 1 - установка контрастности
get 0 - получить версию firmware (старший байт MSB = major version, младший байт LSB = minor version)
get 1 - получить данные кнопок
get 2 - получить продетектированные контроллеры

См. исходный код программы testapp, поставляемый в архиве вместе с LCD2USB firmware.

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

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

Использование LCD2USB под Windows

Harald Korfgen написал LCD Smartie плагин для LCD2USB, который позволяет использовать LCD2USB под Windows. Вот то, что он пишет о своем дополнении к программе: "LCD2USB-smartie.zip site:harbaum.org содержит все необходимые файлы исходного кода для компиляции драйвера под Microsoft® Windows Server® 2003 R2 Platform SDK, Microsoft Visual C++ 2005 Express Edition и LibUsb-Win32. В результате получаем файл LCD2USB.DLL [7]. Чтобы использовать драйвер, библиотека libusb-win32 должна также быть установлена, и LCD2USB.DLL должен быть помещен в каталог "displays" программы LCD Smartie, и это будет автоматически использоваться. Драйвер протестирован только на дисплее 20x4, и обратная связь с информацией о багах приветствуется."

[Проблемы и методы их решения]

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

Решение: убедитесь, что Вы запустили тестовое приложение как пользователь root, поскольку обычный пользователь может не иметь достаточно прав для доступа ко всем возможностям железа lcd2usb.

2. Проблема: устройство не может правильно определиться. Linux сообщает об ошибке "device not accepting address" (устройство не принимает адрес) в системном логе, но LCD отображает начальное сообщение (LCD2USB VXX.XX).

Решение: USB интерфейс не работает, как требуется. Возможно, что Ваш AVR работает на неправильной тактовой частоте. Проверьте правильность установки перемычек AVR (fuses, или фьюзы). Если это не помогло, то возможно диоды Зенера слишком медленные (см. описание следующей проблемы).

3. Проблема: устройство не может правильно определиться. Linux сообщает об ошибке "device descriptor read/all, error -71" в системном логе.

Решение: устройство частично работает, и передачи USB ненадежны. Причина может быть в медленных диодах Зенера (такие могут быть для больших токов стабилизации). Эти медленные диоды легко распознать по более толстым ножкам, чем у других электронных компонентов. Вы можете просто попробовать удалить эти диоды, и устройство заработает, если Ваш PC справляется с сигналами D+ и D- USB напряжением 5V (на многих PC это срабатывает, особенно на старых). Можно попробовать включить устройство через USB хаб, если PC не работает с 5-вольтовыми сигналами. В противном случае Вам нужны быстрые диоды Зенера (стабилитроны) для замены.

[Ссылки]

1. LCD4LINUX site:ssl.bulix.org, подключение LCD к Линукс.
2. V-USB site:obdev.at, программная реализация USB для AVR.
3. USBtiny site:dicks.home.xs4all.nl, другая программная реализация USB для AVR.
4. LibUSB site:sourceforge.net - библиотека libusb (работающая в Linux на уровне пользователя).
5. libusb-win32 site:sourceforge.net - порт libusb для Win32.
6. LCD Smartie site:sourceforge.net, клон lcd4linux для Windows.
7. LCD2USB.dll site:harbaum.org - драйвер для LCD Smartie.
8. LCDproc site:lcdproc.org - последняя версия LCDproc, включающая поддержку LCD2USB.
9. LCD library for HD44870 based LCD site:homepage.hispeed.ch.
10. LC Display am WRAP site:gallery.port23.de - фотогалерея сборок LCD2USB.
11. Программаторы для AVR.
12. AVR-USB-MEGA16: USB bootloader USBasp для микроконтроллера ATmega32.
13. LCD2USB Downloads site:harbaum.org - ссылки на закачку различных версий LCD2USB.

 

Комментарии  

 
0 #3 Андрей 07.06.2010 17:23
Так вот я к этому и веду. Как экран "будет знать", что именно конкретный сигнал я хочу увидеть, а не какоё-то случайный?

microsin: LCD-экран показывает не "конкретный сигнал", а текст, который выводит пользователь с помощью специального ПО. Если хотите продолжить обсуждение - пишите в почту, чтобы не засорять комментарии.
Цитировать
 
 
0 #2 Андрей 07.06.2010 12:59
Если собрать этот проект как есть, что я увижу на дисплее при включении?

microsin: я не знаю, но наверное ничего не увидите - будет пустой экран, либо просто сообщение о том, что экран готов к работе (см. исходники). Чтобы что-то появилось, нужно это что-то на экран вывести.
Цитировать
 
 
0 #1 Андрей 07.06.2010 04:02
Так какую информацию можно увидеть при такой конфигурации, т.е. откуда берутся сигналы для дисплея?

microsin: на дисплей может выводиться любая текстовая информация. Сигналы для дисплея вырабатывает микроконтроллер ATmega.
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page