на главную

Работа с USB для чайников
на примере AVR-USB-MEGA16

Пошагово описан простой способ создания несложных электронных устройств, управляемых при помощи шины USB. Для тех, кто слабо разбирается в микроконтроллерах, winapi и протоколах usb. Даны примеры для Delphi.

Поделиться:

Вместо введения

Итак... Вам нужно устройство, которое управляет реле по команде с компьютера? Устройство для управления шаговыми двигателями? Или устройство для сбора и анализа сигналов? В эпоху DOS-а и младших версий Windows все эти действия легко проделывались на базе порта принтера (LPT). Но как поступить сейчас?

Сейчас все компьютеры, ноутбуки, нетбуки, планшетники, наладонники и прочее вычислительное железо укомплектовано целым ворохом портов USB. Его-то нам и нужно использовать. Тем более, что в USB уже сразу предусмотрено питание, защиты от КЗ, перегрузок и т.п. приятные вкусности. Да и скорость не в пример выше LPT. Вот только не очень понятно как с ним общаться. Можно поступить так же, как мы это делали при изучении LPT или RS232 портов, т.е. изучать с самого начала, то есть их суть. Однако сразу скажу, что объём знаний там потребуется не в пример больший. Очень большой. Просто огромный. Забивать себе голову этими знаниями, наверное, не очень нужно, особенно с учётом того, что они потом не понадобятся. Мы же будем использовать уже готовые решения: схемы, драйвера, библиотеки и прочее. Наша задача: по команде из Дельфи устанавливать или считывать значения на входах (выходах) нашего устройства. То есть логические нули и единицы (0 или +5 вольт).

И как это сделать?

В принципе- не сложно. Мы будем собирать несложную схему, сердцем которой является микроконтроллер ATmega16, умеющий общаться по USB порту. Выходами (портами) этого микроконтроллера мы и будем управлять: записывать туда данные и считывать. На соответствующих выводах у нас будут появляться нолики или единички (0 или +5 вольт). Разумеется- мы сможем и читать что сейчас происходит с этими портами.

Мне было лень травить плату, и я купил уже готовую. Хотя есть много способов сэкономить.

Далее- устанавливаем драйвера libusb-win32, затем драйвер LEDControl. После этого подключаем макетку, запускаем программу и проверяем работоспособность. Собственно всё. Но теперь обо всём по порядку.

Железка

Мы будем собирать вот такую схему, сердцем которой является микроконтроллер ATmega16, умеющий общаться по USB порту.

Мне было лень травить плату, и я купил уже готовую тут. Получил по почте вот это. Можно сэкономить- и купить там только плату. Либо можно купить в магазине радиодеталей пустую макетную плату (пустая плата с дырочками) и собрать эту же схему, только используя микроконтроллер в dip корпусе.

Если вы всё же заказываете там плату целиком- сразу попросите прошить ваш микроконтроллер прошивкой от "Сергея Кухтецкого". Если собираете сами, или забыли попросить- ниже будет описано как залить прошивку туда самостоятельно.

Кстати говоря, на этом сайте можно выбрать схемы и выбрать платы с большими или меньшими возможностями. Они отличаются микропроцессором, скоростью общения по USB, количеством портов. Я выбрал AVR-USB-MEGA16 просто по количеству портов, несмотря на то, что она работает на скорости usb 1.1. Мне просто не нужны были космические скорости. В принципе- всё абсолютно аналогично для всех указанных на том сайте схем, разница только в том- какую прошивку туда заливать. Поддерживаются на процессорах ATMEGA16 и ATMEGA32.

Прошивка (firmware)

Прошивка (firmware) нужна микроконтроллеру для того, чтобы он смог адекватно общаться по порту USB и выполнять наши пожелания (выставлять единички и нолики в нужные нам места и считывать значения из портов). Если вы заказали платку с уже записанной в микроконтроллер нужной прошивкой, то этот пункт можно пропустить. Нужная нам прошивка существует десяти разных видов. Чтобы определить какая требуется необходимо посмотреть на микропроцессор. На нём будет надпись ATMEGA16 или ATMEGA32. Другие типы пока не поддерживаются. Рядом расположен кварц (серебристый), на нём тоже будет надпись, обозначающая частоту. Например: 16,0000 означает частоту 16 МГц. Соответственно- для нашего примера нужна прошивка ATMEGA16 на 16MHz:

прошивка atmega16 с частотой 12 Мгц
прошивка atmega16 с частотой 15 Мгц
прошивка atmega16 с частотой 16 Мгц
прошивка atmega16 с частотой 16,5 Мгц
прошивка atmega16 с частотой 20 Мгц
прошивка atmega32 с частотой 12 Мгц
прошивка atmega32 с частотой 15 Мгц
прошивка atmega32 с частотой 16 Мгц
прошивка atmega32 с частотой 16,5 Мгц
прошивка atmega32 с частотой 20 Мгц

Далее необходимо эту прошивку залить в микроконтроллер. Сам по себе он этого сделать не может. Можно воспользоваться программатором (если он у вас есть), либо самодельным переходником LPT- ISP. Указанный переходник нужно подключить к LPT порту вашего компьютера, а второй конец- к микроконтроллеру (к выводам ISP на макетной плате). Распайка переходника такая:

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

Основная сложность при этом- найти LPT порт, т.к. на современных компьютерах их просто нет. Поскольку он требуется только один раз- рекомендую попроситься к другу, или выпросить у кого- нибудь USB-LPT переходник или PCI-LPT плату в компьютер. Либо можно поискать старый компьютер или ноутбук с таким портом. Накрайняк- можно купить.

Далее- скачиваем любой ISP программатор, поддерживающий ATmega16 и программирование через наш (стандартный) переходник. Наш переходник называется "5 проводков" или "STK 200/300". Есть ещё похожий "Fun card", но там совершенно другая распайка и программаторы, рассчитанный на работу с ним работать у нас не будут. Например- я скачал PonyProg. Устанавливаем его. После установки запускаем Setup -> Calibration, а затем Setup ->Interface Setup. Там выбираем Parralel -> AVR ISP I/O LPT1 (или другой, если ваш LPT порт носит другой номер). Затем в двух окнах вверху посередине выбираем AVR micro и ATmega16. Теперь открываем скачанный нами файл прошивки (.hex). Подключаем переходник, подаём питание, и нажимаем в программаторе Command -> Write all. Если всё сделали правильно, то прошивка зальётся в микроконтроллер, программатор проверит что всё нормально и выдаст сообщение, что всё хорошо. Отключаем питание, отсоединяем переходник. Он нам больше не понадобится.

Подключение макетки к компьютеру и управление ею

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

Перво-наперво нужно установить библиотеку которая сильно облегчает программисту общение с USB. Называется она libusb-win32. Последнюю версию можно скачать отсюда. Я пользовался версией 1.2.5.0. Устанавливается она .exe файлом из архива. Сам архив содержит много полезных утилит, таких как автоматический создатель драйверов для вашего устройства (.inf и дополнения), а также примеры и заголовки на Си.

Теперь можно подключать наше устройство. При соединении вам будет выдано сообщение о новом устройстве и просьбу дать драйвера для него. Устройство называется LEDControl, драйвера лежат тут: LEDControl. В диалоге установки драйверов необходимо указать место, где лежат драйвера (папку с .inf файлом и двумя .cat).

Теперь вы можете проверить- Ваше устройство появилось в списке устройств и с ним можно работать. Макетка содержит светодиод, подключенный к одному из портов. Пример на дельфи для работы с AVR-USB-MEGA16. Указанный пример при запуске выводит всю доступную информацию о всех подключенных USB устройствах. Кнопка "Read" читает данные из порта, где находится светодиод. Кнопка "1" зажигает светодиод, кнопка "0" гасит его.

Немного доработав программу по своему усмотрению совершенно аналогично можно управлять другими портами, выведенными на выводы P1..P22 макетки, либо читать информацию с них. Наслаждайтесь! :)

Более продвинутая программа: UsePort

Следующая версия программы умеет не только зажигать и гасить светодиод, но также записывать в порты микропроцессора (устанавливается соответствующий сигнал на выводах), читать информацию записанную в порты, и самое главное: считывать состояние выводов микросхемы. Разница между информацией в порту и выводами микросхемы очевидна: в порт мы можем записать единицу, но соответствующую ножку притянуть к земле. В итоге при чтении из порта мы получим единичку (потому, что мы её туда писали), а при чтении состояния этого же вывода- получим нолик.

Чтение состояния выводов производится циклически. Период задаётся ползунком внизу. Если выводы микросхемы никуда не подключены, то можно увидеть, как микропроцессор воспринимает 3-е состояние то единицей, то нулём. Если на соответствующие ножки записать единицы в порт, то состояние стабилизируется: будет единица. Кстати- выводы реагируют на всё, даже на прикосновение пальцами :)

Программа UsePort

На главную
Рейтинг@Mail.ru