Till Harbaum
Устройство позволяет быстро, легко и дешево присоединить к USB порту вашего ПК практически любую микросхему I2C клиента (термо датчики, АЦП, дисплеи, схемы управления реле, и т.д.). Доступны драйверы для Linux, Windows и MacOS.
Этот проект является проектом с открытой документацией. Цель проекта – разработать дешевый универсальный I2C интерфейс, подключаемый к USB. Устройство должно быть заменой простых и дешевых адаптеров LPT–I2C. Использование USB имеет несколько преимуществ, включая встроенное питание и более современный интерфейс. К тому же, не требуется нагружать процессор ПК битовыми операциями. Для этого устройства требуется даже меньше деталей, чем для некоторых вариантов на основе принтерного порта.
Несмотря на то, что устройство разрабатывалось для и под Linux, оно также работает под Windows и MacOS X. Демонстрационный драйвер и программа для Windows включены в проект, чтобы помочь вам начать использовать устройство как можно быстрее.
Этот проект основан на:
- Проекте Linux USB и реализации I2C в Linux
- Драйвере и тестовом приложении для Windows, основанных на библиотеке libusb-win32
- AVR-USB, чисто программной реализации интерфейса USB для платформы AVR
- USBtiny, другой программной реализации USB для AVR
Железо
![]() |
![]() |
Плата прототипа с датчиком температуры DS1621 | Готовое устройство в сборе. Добавлен тот же самый датчик |
Аппаратная часть устройства сделана на микроконтроллере Atmel AVR ATtiny45. Это дешевый и доступный микроконтроллер с 4 кБ флеш-памяти (из которой 2 кБ заняты программой этого устройства) и 256 байт памяти данных. Микроконтроллер окружен несколькими компонентами.
USB интерфейс
USB интерфейс реализован чисто программно и использует 2 контакта микроконтроллера (PB0 и PB2). Эта программная реализация поддерживает только низкоскоростной USB, о чем компьютеру сообщается с помощью резистора R1.
Интерфейс I2C, также программный, основан на побитовом вводе/выводе через обычный порт. Для аппаратного интерфейса TWI контроллера ATtiny45, на котором можно было бы сделать интерфейс I2C, пришлось бы использовать выводы, необходимые для работы с USB. Программный интерфейс может оказаться не полностью совместимым с I2C, и поэтому некоторые микросхемы – клиенты I2C могут не работать с такой шиной. Правда, до сих пор не было обнаружено ни одного несовместимого устройства. В устройстве реализована программно управляемая задержка такта I2C, позволяющая конфигурировать тактовую частоту I2C. Задержка по умолчанию – 10 мкс. Учитывая другие задержки в коде побитового ввода/вывода, результирующая тактовая частота I2C получается около 50 кГц.
Из соображений простоты, вся передача данных по USB выполняется через Control EP (EP0). Так как библиотека AVR-USB поддерживает только медленные USB устройства, она не может использоваться для передачи больших объемов данных, которая возможна только для высоко- и полноскоростых USB устройств. Низкоскоростные устройства поддерживают так называемую передачу по прерываниям, которая ограничена предустановленной шириной канала, в то время как контрольная передача может использовать любую доступную ширину канала.
Устройство, таким образом, использует передачу control для всех данных. Это требует некоторых дополнительных ограничений, чтобы избежать одновременного доступа к устройству множества драйверов (т.е. драйвера ядра и тестовой программы на основе библиотеки libusb). Под ОС Linux это достигается выбором соответствующих типов запросов. Этот вид контроля доступа может быть не возможен в других операционных системах.
Потребление энергии
Микроконтроллер и микросхемы клиентов I2C (одна или несколько) питаются от линии VBUS интерфейса USB.
Сам адаптер потребляет менее 10 мА и сообщает об этом компьютеру через USB дескрипторы. Устройство также может питать микросхемы – клиенты I2C. Но так как эти микросхемы имеют различное потребление тока, невозможно точно включить их потребление в дескрипторы устройства. Вы целиком ответственны за контроль над полным энергопотреблением, и в особенности за тем, чтобы оно не превышало допустимый лимит для USB в 500 мА.
В будущих версиях прошивок планируется сделать сообщаемое компьютеру значение энергопотребления программно конфигурируемым, таким образом, значение легко можно будет подогнать под реальные потребности устройства.
Драйвер ядра
Устройство изначально планировалось для использования с Linux. Оно поставляется с драйвером ядра для Linux, который связывает USB и I2C подсистемы в ядре Linux. Таким образом, вся установка прозрачна для пользовательских приложений, таких как lm_sensors framework. Специальных драйверов микросхем - клиентов не требуется, так как драйверы, изначально присутствующие в ядре, будут использованы с данным устройством. Т.е., в случае датчика температуры DS1621, установленного на плате прототипа, данные с датчика могут выглядеть так:
DS1621-i2c-2-48
Adapter: i2c-tiny-usb at bus 003 device 017
temp: +21.50°C (low = +15.0°C, high = +10.0°C) ALARM (HIGH)
Схема и печатная плата
Стабилитроны в схеме необязательны. Они могут потребоваться, если схема будет питаться непосредственно от USB линии VBUS. Линии данных USB (D+ и D-) могут работать только с напряжением 3.3 В. На некоторых компьютерах возникают проблемы при работе с напряжением 5 В. В этом случае может помочь ограничение напряжения до значения не более 3.6 В. В моем прототипе эти диоды отсутствуют, так как мой ПК прекрасно работает с напряжением 5 В на линиях данных USB.
Резистор R1, сопротивлением 2.2 кОм а не 1.5 кОм, по той же причине. Он использовался для подтягивания напряжения к 3.3 В. Нам же необходимо подтянуть выход к 5 В, и сопротивление требуется большее.
Ниже представлена печатная плата. Она состоит только из частей для USB и I2C и не содержит микросхемы – клиента I2C. Вместо него на плате имеется место для размещения такой микросхемы. Вы можете легко вытравить плату сами. Так как большинство проводников проходит на нижней стороне, подойдет даже односторонняя печатная плата. Понадобится просто сделать 4 недостающих соединения с помощью проводов.
![]() Кликните для увеличения |
![]() |
Расположение компонентов | Готовая печатная плата |
![]() Кликните для увеличения |
![]() Кликните для увеличения |
Верхний слой | Нижний слой |
В месте крепления USB разъема на печатной плате имеются два отверстия, позволяющие подсоединить USB кабель к устройству без разъема. Расположение контактов показано на рисунке ниже.
![]() |
![]() |
Схема прямого подключения кабеля | Фотография реального устройства (с I2C клиентом PCF8574) |
Список компонентов
Деталь |
Количество |
Наименование |
D1, D2 |
2 |
3.6 В стабилитрон |
Q1 |
1 |
12 МГц кварцевый резонатор, корпус HC49U |
R1 |
1 |
2.2 кОм резистор |
R2, R3 |
2 |
68 Ом резистор |
R4, R5 |
2 |
10 кОм резистор |
C1, C2 |
2 |
22 пФ керамический конденсатор, 2.54 мм |
C3 |
1 |
100 нФ конденсатор, 5.08 мм |
C6 |
1 |
10 мкФ электролитический конденсатор |
-- |
1 |
USB-B разъем для ПП |
JP1 |
1 |
4 контактный I2C разъем |
U$1 |
1 |
Attiny45 DIP корпус, 20 МГц |
-- |
1 |
Панелька для U$1 |
Окончание читайте здесь