6 применений в «умном доме» платы USBasp. Нестандартное использование USBasp

Устройство nRF24L01-USB
Иногда дешевле купить готовое устройство, чем собирать его самому. Да и самодельное устройство не всегда и не у всех будет выглядеть аккуратно- это зависит от наличия оборудования/материалов и прямоты рук.

Пользователи, знакомые с микроконтроллерами Atmel или хотя бы с Arduino скорее всего знают о дешевом программаторе USBasp, цена которого на Ebay около $ 3. Распространены две версии программатора:
USBasp 2.0 — с стабилизатором на 3.3 вольта.
USBasp 3.0 — плата поменьше, без стабилизатора. Так же у него не выведены на разъем порты PD0 и PD1(Аппаратный UART).В руках не держал и соответственно рассматривать его тут не будем.

Ниже мы рассмотрим как превратить программатор USBasp в I2C-USB переходник, научимся читать датчики влажности и температуры, получим простой набор портов ввода/вывода (PIO), RS232-USB, а так же попытаемся создать устройство nRF24L01-USB для чтения беспроводных датчиков и управления устройствами. Ну и для любителей Arduino — будем программировать в среде Arduino IDE используя USBasp как макетную плату.Проекты используют популярную библиотеку V-USB для работы с USB в программной реализации.

Архив с прошивками можно скачать в конце статьи. Я намеренно не публикую тут прямые ссылки на свои проекты -вы их найдете в архиве.

Устройство программатора USBasp


Программатор состоит из небольшого числа деталей. Мозгом программатора является микроконтроллер Atmega8, который имеет всего 8 кб флеш памяти и 1 кб ОЗУ(SRAM).Вроде и слабенький микроконтроллер по современным меркам, но столько всего можно на нем сделать.Из-за особенностей работы программного USB м/к работает на частоте 12мгц. Соответственно, при написании своей прошивки необходимо учитывать это.

USBasp имеет 10 контактный разъем, на который выведены 6 выводов микроконтроллера: PB5 (SCK), PB4 (MISO), PB3 (MOSI, PWM), PB2(PWM), PD0 (RXD), PD1 (TXD).Питание 5в или 3.3в, которое переключается перемычкой JP1.

Плата имеет два встроенных светодиода на выводах PC0 и PC1.Выводы м/к PB0,PB1 и PD2 используются для программного USB,PC2 выведен на перемычку JP3.Остальные выводы микроконтроллера не распаяны.
Со схемой устройства можно ознакомится в архиве в конце статьи.

Установка загрузчика на плату


Для быстрой смены прошивки, без сторонних программаторов можно установить загрузчик USBaspLoader.Официальная страница проекта USBaspLoader
К сожалению загрузчик отнимает 2 кб флеш памяти, но для большинства применений нам хватит оставшихся 6 кб.

Установка загрузчика:

Команда программирования используя Arduino как программатор:

avrdude -c avrisp -P COM1 -b 19200 -p m8 -U flash:w:boot_m8.hex -U hfuse:w:0xc0:m -U lfuse:w:0x9f:m -U lock:w:0x2f:m


Команда программирования через другую USBasp:

avrdude -c usbasp -p m8 -U flash:w:boot_m8.hex -U hfuse:w:0xc0:m -U lfuse:w:0x9f:m -U lock:w:0x2f:m


После этого уже можно заливать свою прошивку без программатора стандартной командой
avrdude -c usbasp -p m8 -U flash:w:имя_файла.hex


Для того, чтобы «залить» прошивку в устройство с установленным USBaspLoader необходимо установить перемычку JP3, которая переводит устройство в режим программирования и сбросить устройство, замкнув контакт ближний к перемычке выбора питания(JP1) на перемычке JP2 на землю.

Использование USBasp как макетную плату в Arduino IDE


Для прошивки в среде Arduino IDE (проверено на версиях 1.0.х) необходимо в файл board.txt вписать следущий текст:

 atmega8usb.name=ATmega8 USB 12 MHz
 atmega8usb.upload.protocol=arduino
 atmega8usb.upload.maximum_size=6144
 atmega8usb.upload.speed=19200
 atmega8usb.bootloader.low_fuses=0x9f
 atmega8usb.bootloader.high_fuses=0xc0
 atmega8usb.bootloader.path=atmega8
 atmega8usb.bootloader.file=boot_m8.hex
 atmega8usb.bootloader.unlock_bits=0x3F
 atmega8usb.bootloader.lock_bits=0x2F
 atmega8usb.build.mcu=atmega8
 atmega8usb.build.f_cpu=12000000L
 atmega8usb.build.core=arduino
 atmega8usb.build.variant=standard


После этого в среде Arduino IDE можно выбрать появившуюся плату ATmega8 USB 12 MHz. Прошивка осуществляется через меню «загрузка с помощью программатора».

Доступные пины по нумерации Arduino: 13 (SCK),12 (MISO),11 (MOSI,PWM),10 PB2(PWM) ,1 (TXD),0 (RXD).Так же доступны цифровые выводы 14 и 15 для управления светодиодами на плате.

Можно задействовать и интерфейс USB, используя библиотеку для Arduino V-USB, но возможностей тут меньше, чем на Си.


nRF24L01-USB



Позволяет обмениваться данными между nRF24L01/nRF24LE1 и компьютером с устройством nRF24L01-USB. Теоретически поддерживается до 22 клиентов(при пакете передачи 32 байта) на базе nRF24L01/nRF24LE1, но пока на практике проверено до 3. Ограничение связано с тем, что для приема и отправки данных используется буфер в ОЗУ устройства, а его как известно у Atmega8 всего 1кб.Размер приемного пакета может быть до 32 байт, а отправки — 4 байта, это ограничение связано со способом реализации работы с библиотекой V-USB.
Работа nRF24L01-USB адаптера основана на временном разделении, когда клиенты отправляют/принимают данные в разное время. При большом количестве клиентов время опроса должно быть бОльшим. Для обмена данными в реальном времени количество клиентов должно быть наименьшим. Пока у устройства имеются некоторые недостатки, но думаю это решаемо.
Клиентская утилита управления, чтения и отправки данных работает как в Linux, так и Windows, но пока, к сожалению, требуется компиляция для настройки принятых данных. Для удобства настройки и отладки через утилиту можно менять канал, скорость и включать/выключать аппаратное подтверждение, работать напрямую с регистрами радио модуля.
Устройство можно применить для беспроводных датчиков или управления в системах умного дома.
Кстати, ранее был разработан и испытан вариант беспроводных датчиков влажности и температуры на базе attiny13 на частоте 315 или 433 мгц, но это уже другая тема.

RS232-USB


На основе программатора USBasp можно создать устройство-переходник RS232-USB на базе проекта cdc-232.
Подойдет для программирования плат Arduino, на которых нет микросхемы FT232RL или другого преобразователя usb-uart.

PIO-USB


6 выводов, которые выведены на разъеме программатора могут использоватся как обычные PIO выводы, для «дерганья» светодиодами и релюшками, а так же считывания логического состояния порта. В архиве в конце статьи имеется мой вариант PIO-USB, который так же позволяет считывать датчик влажности DHT11/DHT22, а так же транслировать код для управления розетками/люстрами, если подключить радио перадтчик на 433/315 мгц. Планируется новая версия, в которой увеличится количество подключаемых датчиков влажности и исправлены ошибки.

DS18B20-USB


Программатор можно «научить» работать с несколькими датчиками температуры DS18B20.Например использовать проект USBTemp.
Возможны и другие варианты реализации схемы и прошивки устройства, а так же интеграция с PIO-USB.
К сожалению из-за размера прошивки загрузка не возможна через USBaspLoader.

I2C-USB


Устройство позволяет подключить практически любые устройства i2c к компьютеру.Проверено как на Linux так и в Windows XP.Прошивка основана на известном проекте i2c tiny usb.
Мои примеры использования устройства:
Чтение датчика давления BMP085.
Управление микросхемой расширителем портов MCP23017, получив тем самым почти тот же PIO на компьютере.
Вариантов применения масса: программирование EEPROM памяти, чтение спецефичных разных датчиков, управление FM приемником.

Это конечно же далеко не все варианты использования программатора в нестандартном функционировании.

Все исходные коды сторонних проектов можно найти на их официальных сайтах. В архиве в конце статьи имеются прошивки, которые адаптированы под выводы платы USBasp.

Архив с прошивками: usbasp.zip

UPD: Ещё одно применение USBasp в статье «Программируем nRF24LE1 через Raspberry PI и USBasp».
Метки:
Поделиться публикацией
Похожие публикации
Комментарии 17
  • 0
    Замечательная статья, спасибо. Купил пучок этих программаторов за 2 с копейками доллара (дешевле, чем рассыпуха в розницу), долго думал что с ними сделать, теперь вот есть пару идей! Плюс, однозначно.
    • 0
      Где купили? Я тоже хочу пучок программаторов ;-)
      • 0
        Ибей же. Я брал то ли по 2.68, то ли по 2.86, не помню. Попадаются и дешевле, если искать и ловить.
        • 0
          Сей чудо удалось провернуть??? А то я заказал вчера, а потом смотрю — у них как-то с джамперами НИКАК…
          • 0
            Купил 4 штуки.
            1. Это не USBasp! Это USBISP v3.0, по крайней мене на данный момент!
            2. Как чип используется Атмега8L… Вроде там фьюзы слегка не те…
            3. Забудьте про COM — эти редиски развели только RST-CLS-MOSI-MISO и питание! Как следствие — можно юзать только частично, по сравнении со статьёй: тот-же nRF24 не подключить, т.к. ему нужно ПЯТЬ сигнальных, если не извращаться с некоторыми вещами…
          • 0
            Если без доставки, стоимостью овер 50$ то и я бы не отказался.
        • 0
          Попробуйте к датчику воды или к электросчетчику подключиться. Сам сейчас планирую такой проект.
          • +1
            Для нормальной работы таких счетчиков импульсов необходимо подключать датчик к выводу м/к с прерыванием.А тут в USBasp один такой вывод занят, а другой не распаян, если использовать USBasp напрямую. Наверно лучше делать беспроводные клиенты на базе nRF24L01 или nRF24LE1 для этого.
          • 0
            Кстати, ранее был разработан и испытан вариант беспроводных датчиков влажности и температуры на базе attiny13 на частоте 315 или 433 мгц, но это уже другая тема.

            Интересно было бы об этом почитать поподробнее. Как раз на днях пытался подобное сделать, но споткнулся о то, что на 433мгц слишком много шумов и приёмник просто «тонет» в шумах. Рядом стоящие приёмник и передатчик лишь в 10% случаев успешно передают 4 байта данных. На 315мгц должно быть чище, но с ним пока не пробовал.
            • 0
              Да 433 очень сейчас зашумлен, но я столкнулся потерей передачи только из-за НЕотключения прерываний на передающем м/к во время трансляции.Про алгоритм передачи и примеры можно тут глянуть.
              • 0
                Понятно, спасибо за ссылки. Я использовал RCswitch, надо попробую RemoteSwitch. Пока что экспериментирую с общением RaspberryPI с собой самой и заметил занятную вещь: если оставить GPIO ногу висеть в воздухе, то приём оказывается значительно качественнее (близко к 100%), чем если к нему подключить приёмник :)
            • 0
              А как соединить 1 UBSAsp с другой для прошивки?
              • 0
                Обычно с ними идет шлейф -просто напрямую через его.Ещё на программируемом USBasp необходимо поставить джампер 2.
                • 0
                  Рискую навлечь гнев сообщества, но всё же спрошу. С чего начать и где что читать, если хочу использовать USBAsp как микроконтроллер: какую среду лучше использовать, какие инструменты для заливки прошивки? Может где есть готовый пример с Hello worldморгающим светодиодом с инструкцией как компилировать и как заливать?
                  Во вложении к статье нашёл исходники прошивки только для usbtemp, но то так и не понял, чем её компилить.

                  Опыт в программировании микроконтроллеров минимальный есть, делал простенькие схемы на 51-м семействе контроллеров под Keil.
                  • 0
                    Программируется через winavr или avr-gcc (в linux). Примеров в интернете достаточно. Если использовать USBasp как м/к, то необходим ещё другой программатор, как минимум установить загрузчик, чтобы потом уже независимо заливать прошивку.
                    • 0
                      Большое спасибо, буду копать! Как раз два usbasp случайно доставшиеся есть.
                  • 0
                    Как примечание: даже не думайте юзать для этих целей программатор Turnigy от ХоббиКинг!
                    Они, по факту, «убили» все джамперы, которые на нем вообще должны быть и единственный — «внешнее питание»: выдавать на коннектор программатора 5 вольт или не стоит… И не факт, что он ещё работает, т.к. разницы «с ним и без него» я не заметил…

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