Конвертер USB-I2C на ATtiny. Часть 1
Устройство позволяет быстро, легко и дешево присоединить к USB порту вашего ПК практически любую микросхему I 2 C клиента (термо датчики, АЦП, дисплеи, схемы управления реле, и т.д.). Доступны драйверы для Linux, Windows и MacOS.
Этот проект является проектом с открытой документацией. Цель проекта – разработать дешевый универсальный I 2 C интерфейс, подключаемый к USB. Устройство должно быть заменой простых и дешевых адаптеров LPT–I 2 C. Использование USB имеет несколько преимуществ, включая встроенное питание и более современный интерфейс. К тому же, не требуется нагружать процессор ПК битовыми операциями. Для этого устройства требуется даже меньше деталей, чем для некоторых вариантов на основе принтерного порта.
Несмотря на то, что устройство разрабатывалось для и под Linux, оно также работает под Windows и MacOS X. Демонстрационный драйвер и программа для Windows включены в проект, чтобы помочь вам начать использовать устройство как можно быстрее.
- Проекте Linux USB и реализации I 2 C в 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.
Интерфейс I 2 C, также программный, основан на побитовом вводе/выводе через обычный порт. Для аппаратного интерфейса TWI контроллера ATtiny45, на котором можно было бы сделать интерфейс I 2 C, пришлось бы использовать выводы, необходимые для работы с USB. Программный интерфейс может оказаться не полностью совместимым с I 2 C, и поэтому некоторые микросхемы – клиенты I 2 C могут не работать с такой шиной. Правда, до сих пор не было обнаружено ни одного несовместимого устройства. В устройстве реализована программно управляемая задержка такта I 2 C, позволяющая конфигурировать тактовую частоту I 2 C. Задержка по умолчанию – 10 мкс. Учитывая другие задержки в коде побитового ввода/вывода, результирующая тактовая частота I 2 C получается около 50 кГц.
Из соображений простоты, вся передача данных по USB выполняется через Control EP (EP0). Так как библиотека AVR-USB поддерживает только медленные USB устройства, она не может использоваться для передачи больших объемов данных, которая возможна только для высоко- и полноскоростых USB устройств. Низкоскоростные устройства поддерживают так называемую передачу по прерываниям, которая ограничена предустановленной шириной канала, в то время как контрольная передача может использовать любую доступную ширину канала.
Устройство, таким образом, использует передачу control для всех данных. Это требует некоторых дополнительных ограничений, чтобы избежать одновременного доступа к устройству множества драйверов (т.е. драйвера ядра и тестовой программы на основе библиотеки libusb ). Под ОС Linux это достигается выбором соответствующих типов запросов. Этот вид контроля доступа может быть не возможен в других операционных системах.
Потребление энергии
Микроконтроллер и микросхемы клиентов I 2 C (одна или несколько) питаются от линии VBUS интерфейса USB.
Сам адаптер потребляет менее 10 мА и сообщает об этом компьютеру через USB дескрипторы. Устройство также может питать микросхемы – клиенты I 2 C. Но так как эти микросхемы имеют различное потребление тока, невозможно точно включить их потребление в дескрипторы устройства. Вы целиком ответственны за контроль над полным энергопотреблением, и в особенности за тем, чтобы оно не превышало допустимый лимит для USB в 500 мА.
В будущих версиях прошивок планируется сделать сообщаемое компьютеру значение энергопотребления программно конфигурируемым, таким образом, значение легко можно будет подогнать под реальные потребности устройства.
Драйвер ядра
Устройство изначально планировалось для использования с Linux. Оно поставляется с драйвером ядра для Linux, который связывает USB и I 2 C подсистемы в ядре 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 и I 2 C и не содержит микросхемы – клиента I 2 C. Вместо него на плате имеется место для размещения такой микросхемы. Вы можете легко вытравить плату сами. Так как большинство проводников проходит на нижней стороне, подойдет даже односторонняя печатная плата. Понадобится просто сделать 4 недостающих соединения с помощью проводов.
Кликните для увеличения | |
Расположение компонентов | Готовая печатная плата |
Кликните для увеличения | Кликните для увеличения |
Верхний слой | Нижний слой |
В месте крепления USB разъема на печатной плате имеются два отверстия, позволяющие подсоединить USB кабель к устройству без разъема. Расположение контактов показано на рисунке ниже.
Схема прямого подключения кабеля | Фотография реального устройства (с I 2 C клиентом PCF8574) |
Список компонентов
Наименование
I2c to usb linux
Вы здесь: Home Железо Прочее I2C-USB переходник
Превращаем программатор USBasp в I2C-USB переходник:
Если Вы уже знакомы с USBasp программатором,то вы знаете,что это очень простое и дешевое устройство для программирования м/к ATmega,но оказывается программатор , используя проект i2c tiny usb можно превратить в полноценный дешевый переходник I2C to USB.
В итоге мы получаем возможность подключать разные устройства I2C к компьютеру всего за 100 рублей (3$).Например мы можем подключить датчик давления BMP085 или микросхемы ввода/вывода MCP23017 для подключения кнопок или управления нагрузкой через реле.
USBasp прошивается стандартно как при обновлении прошивки и прошивается так же через arduino как программатор или используя другой USBasp программатор .Для программирования используются те же выводы SCK,MISO,MOSI ,RESET ,но прошивка идет через утилиту avrdude ,а не из среды Arduino IDE.
Порядок действий для прошивки через arduino:
1. Подключаем выводы SCK,MISO,MOSI ,RESET к Arduino согласно инструкции .
2. Установавливаем перемычку self programming (на фото обозначена как JP2),обычно место для перемычки не распаяно.
3. Качаем скомпилированную прошивку под USBasp тут и кидаем в папку путь_к_папке_ардуины_/hardware/tools/ .
4. Перейдем в консоль (cmd или bash) Вашей операционной системы в папку через команду cd путь_к_папке_ардуины_/hardware/tools/ и далее вводим команды для Windows,не забывем указать верный порт,на котором подключена Arduina:
avrdude -C avrdude.conf -c avrisp -P COM1 -b 19200 -p m8 -v
Программа выдаст сообщение ,где покажет состояние фьюзов и другую информацию.
Если Вы видите такие сообщения- значит подключено все правельно и можно прошивать командой:
avrdude -C avrdude.conf -c avrisp -P COM1 -b 19200 -p m8 -U flash:w:i2c_tiny_usb.hex -U lfuse:w:0x9f:m -U hfuse:w:0xc9:m
Для прошивки из Linux все аналогично, заменяется часть строки:
./avrdude -C avrdude.conf -c avrisp -P /dev/ttyUSB0 .
Порядок действий для прошивки через другую USBasp:
Подключаем выводы SCK,MISO,MOSI ,RESET один в один.Можно просто подключить через шлейф,идущий в комплекте с программатором.
Указываем опцию -c usbasp вместо -c avrisp
После успешной прошивки устройство опознается как i2c-tiny-usb и выводы программатора будут иметь другое назначение: SDA и SDL ,к которым мы можем уже подключать I2C устройства согласно справочной информации.
Работа переходника I2C-USB в Linux:
Драйвера в Linux не требуются ,но по умолчанию модуль i2c-dev не загружен и его необходимо установить в автозагрузку выполнив команду echo «i2c-dev» >>/etc/modules или/и загрузить модуль немедленно командой modprobe i2c-dev .В папке /dev/ Вы увидите возможно несколько устройств вида -i2c-X,наше скорее всего будет последним.Зная номер сейчас можно работать с устройствами подключенные на данной шине согласно примеров и инструкций к устройствам.Рекомдуется установить пакет программ i2c-tools (через управление ПО Вашей операционной системы) -поможет для поиска I2C устройств командой i2cdetect -y Х ,где Х — это номер i2c шины:
На скриншоте мы видим сообщение команды i2cdetect ,где выводит подключенные устройства ,а именно устройство 77 (шестнадцатиричное) — BMP085 ,а так же запуск демо программы датчика давления BMP085 ,которая вывела текущее давление и температуру.
Приложения с данным переходником i2c_tiny_usb могут работать как с USB устройством -в этом случае загрузка модуля i2c-dev не нужна.
Работа переходника I2C-USB в Windows:
Для работы переходника требуются драйвера i2c_tiny_usb .В windows приложения работают только как с USB устройством,а не с шиной I2C.
Материалы и ссылки:
Прошивка i2c_tiny_usb.hex.
Страничка проекта i2c_tiny_usb.
Home`s Smart © 2013-2016. г.Киров.
Цитирование материалов возможно только со ссылкой на сайт. Использование фотоматериалов только с разрешения авторов.
Using I²C Sensors With Any Linux Via USB And IIO
Hooking up I2C sensors is something which is generally associated with microcontrollers and SBCs, yet it’s very easy to use such I2C sensors from basically any system that runs Linux. After all, I2C (that is, SMBus) is one of the interfaces that is highly likely to be used on your PC’s mainboard as well as peripherals. This means that running our own devices like the well-known BME280 temperature, pressure and humidity sensor, or Si1145 light sensor should be a piece of cake.
In a blog post from a few years ago, [Peter Molnar] explains in detail how to wire up a physical adapter to add a USB-connected I2C interface to a system. At its core is the ATtiny85 AVR-based MCU, which provides a built-in USB interface, running the I2C-Tiny-USB firmware.
The essential part here is that the MCU shows up to the Linux kernel as an i2c device, requiring the i2c-dev driver to be loaded. After this the I2C device that is connected to the adapter MCU’s I2C bus can be used via the Linux module’s API calls, either directly or via existing drivers. [Peter] found that the BMP280 driver came with Debian Sid, for example.
Posted in ATtiny Hacks, Software Development Tagged i2c, linux
11 thoughts on “ Using I²C Sensors With Any Linux Via USB And IIO ”
On most non-Apple *Nix computers, you can also use the i2c lines in the VGA, DVI or HDMI plug, which normally are used by the system to either read a ROM chip in the monitor that contains compatible resolutions and refresh rates, or for bi-directional communication between monitor and computer.
Though a few gpu drivers were clunky at permitting that though, but that’s not so relevant nowadays.