====== Расширитель GPIO-портов (Troyka-модуль) ====== {{ :продукты:troyka-gpio-expander:troyka-gpio-expander.4.jpg |}} [[amp>product/troyka-gpio-expander?utm_source=man&utm_campaign=i2c-io&utm_medium=wiki|GPIO Expander (Troyka-модуль)]] решает проблему внезапно кончившихся пинов ввода/вывода. Модуль получает команды от управляющей платы по протоколу [[Видеоуроки:7-i2c-и-processing|I²C/TWI]] и позволяет использовать любой из своих портов как цифровой или аналоговый вход или выход. ===== Видеообзор ====== {{youtube>Fz69X-2hGDw?large}} ===== Подключение и настройка ===== GPIO расширитель портов общается с управляющей платой по протоколу [[Видеоуроки:7-i2c-и-processing|I²C/TWI]]. При подключении к [[amp>collection/arduino?utm_source=man&utm_campaign=i2c-io&utm_medium=wiki|Arduino]] или [[amp>product/iskra-js?utm_source=man&utm_campaign=i2c-io&utm_medium=wiki|Iskra JS]] удобно использовать [[amp>/product/arduino-troyka-shield?utm_source=man&utm_campaign=i2c-io&utm_medium=wiki|Troyka Shield]]. {{ :продукты:troyka-gpio-expander:troyka-gpio-expander_troykashield.png |}} С [[amp>product/arduino-troyka-slot-shield?utm_source=man&utm_campaign=i2c-io&utm_medium=wiki|Troyka Slot Shield]] можно сэкономить два трёхпроводных шлейфа. {{ :продукты:troyka-gpio-expander:troyka-gpio-expander_troykaslotshield.png |}} Теперь к устройству можно подключить до девяти [[:troyka-modules|Troyka-модулей]]. ===== Примеры работы ===== Рассмотрим несколько примеров работы модуля с управляющими платами Arduino. Работа с Iskra JS описана на странице библиотеки [[js:gpio-expander|@gpio-expander]]. ==== Маячок ==== В силу светодиодной робототехники мигнём светодиодом через GPIO Expander (Troyka-модуль). Подключите GPIO расширитель к управляющей плате через [[amp>/product/arduino-troyka-shield?utm_source=man&utm_campaign=i2c-io&utm_medium=wiki|Troyka Shield]] или [[amp>/product/arduino-troyka-slot-shield?utm_source=man&utm_campaign=i2c-io&utm_medium=wiki|Troyka Slot Shield]]. Подключите [[amp>product/troyka-led-module?utm_source=man&utm_campaign=i2c-io&utm_medium=wiki | светодиод «Пиранья» (Troyka-модуль)]] через стандартный 3-проводной шлейф к ''8'' пину GPIO Expander. === Схема для Troyka Shield === {{ :продукты:troyka-gpio-expander:troyka-gpio-expander_troykashield_led.png |}} === Схема для Troyka Slot Shield === {{ :продукты:troyka-gpio-expander:troyka-gpio-expander_troykaslotshield_led.png |}} === Код для Arduino === Прошейте управляющую плату следующим скетчем. // библиотека для работы I²C #include // библиотека для работы с модулем GPIO Expander (I²C IO) #include // создаём объект adio класса GpioExpander по адресу 42 GpioExpander adio(42); void setup() { // включаем I²C. Для Arduino Due - Wire1.begin(); Wire.begin(); // Инициализируем объект adio. Для Arduino Due - adio.begin(&Wire1); adio.begin(); // настраиваем пин 8 на модуле GPIO Expander в режим выхода adio.pinMode(8, OUTPUT); } void loop() { // подаём на пин 8 модуля GPIO Expander «высокий сигнал» adio.digitalWrite(8, HIGH); // ждём 1 секунду delay(1000); // подаём на пин 8 модуля GPIO Expander «низкий сигнал» adio.digitalWrite(8, LOW); // ждём 1 секунду delay(1000); } Светодиод будет загораться и гаснуть раз в секунду. ==== Кнопочный выключатель ==== Добавим к предыдущему эксперименту [[amp>product/troyka-button?utm_source=man&utm_campaign=i2c-io&utm_medium=wiki | кнопку]] и подключим её к расширителю портов стандартным трёхпроводным шлейфом к ''1'' пину. === Схема для Troyka Shield === {{ :продукты:troyka-gpio-expander:troyka-gpio-expander_troykashield_led_button.png |}} === Схема для Troyka Slot Shield === {{ :продукты:troyka-gpio-expander:troyka-gpio-expander_troykaslotshield_led_button.png |}} === Код для Arduino === Прошейте Arduino следующим скетчем. // библиотека для работы I²C #include // библиотека для работы с модулем GPIO Expander (I²C IO) #include // создаём объект adio класса GpioExpander по адресу 42 GpioExpander adio(42); void setup() { // включаем I²C. Для Arduino Due - Wire1.begin(); Wire.begin(); // Инициализируем объект adio. Для Arduino Due - adio.begin(&Wire1); adio.begin(); // настраиваем пин 8 на модуле GPIO Expander в режим выхода adio.pinMode(8, OUTPUT); // настраиваем пин 8 на модуле GPIO Expander в режим входа adio.pinMode(1, INPUT); } void loop() { // считываем состояние кнопки с 1 пина на модуле GPIO Expander if (!adio.digitalRead(1)) { // подаём на пин 8 модуля GPIO Expander «высокий сигнал» adio.digitalWrite(8, HIGH); } else { // подаём на пин 8 модуля GPIO Expander «низкий сигнал» adio.digitalWrite(8, LOW); } } Светодиод будет загораться при нажатии на кнопку. ==== Светильник с регулируемой яркостью ==== GPIO расширитель умеет считывать [[сенсоры:аналоговые:|аналоговый сигнал]] с датчиков и выводить [[конспект-arduino:шим|ШИМ]]. Усложним наш проект, заменив [[amp>product/troyka-button?utm_source=man&utm_campaign=i2c-io&utm_medium=wiki | кнопку]] на [[amp>product/troyka-potentiometer?utm_source=man&utm_campaign=i2c-io&utm_medium=wiki | потенциометр]]. === Схема для Troyka Shield === {{ :продукты:troyka-gpio-expander:troyka-gpio-expander_troykashield_led_pot.png |}} === Схема для Troyka Slot Shield === {{ :продукты:troyka-gpio-expander:troyka-gpio-expander_troykaslotshield_led_pot.png |}} === Код для Arduino === Прошейте Arduino следующим скетчем. // библиотека для работы I²C #include // библиотека для работы с модулем GPIO Expander (I²C IO) #include // создаём объект adio класса GpioExpander по адресу 42 GpioExpander adio(42); void setup() { // включаем I²C. Для Arduino Due - Wire1.begin(); Wire.begin(); // Инициализируем объект adio. Для Arduino Due - adio.begin(&Wire1); adio.begin(); // настраиваем пин 8 на модуле GPIO Expander в режим выхода adio.pinMode(8, OUTPUT); // настраиваем пин 8 на модуле GPIO Expander в режим входа adio.pinMode(1, INPUT); } void loop() { // считываем аналоговое значение с 1 пина на модуле GPIO Expander int sensorValue = adio.analogRead(1); // преобразуем диапазон значений с потенциометра (0-4096) // в диапазон значений для ШИМ-сигнала (0-255) int brigtness = map(sensorValue, 0, 4096, 255, 0); // устанавливаем светодиоду яркость // в соответствии от положения ручки потенциометра adio.analogWrite(8, brigtness); // ждём 100 мс delay(100); } Светодиод будет изменять яркость в зависимости от положения потенциометра. ==== Управляем сервоприводом ==== GPIO расширитель умеет управлять сервоприводами. Заменим светодиод на сервопривод и будем управлять им с помощью потенциометра. ===Схема для Troyka Shield=== {{ :продукты:troyka-gpio-expander:i2c_io_servo_pot.png?direct |}} ===Код для Arduino=== // библиотека для работы I²C #include // библиотека для работы с модулем GPIO Expander (I²C IO) #include // создаём объект adio класса GpioExpander по адресу 42 GpioExpander adio(42); void setup() { // включаем I²C. Для Arduino Due - Wire1.begin(); Wire.begin(); // Инициализируем объект adio. Для Arduino Due - adio.begin(&Wire1); adio.begin(); // настраиваем пин 8 на модуле GPIO Expander в режим выхода adio.pinMode(8, OUTPUT); // настраиваем пин 8 на модуле GPIO Expander2 в режим выхода adio.pinMode(1, INPUT); // устанавливаем частоту ШИМ 50 Гц adio.pwmFreq(50); } void loop() { // сохраним в переменную показания с потенциометра int pot = adio.analogRead(1); // сделаем пересчет из показаний потенциометра в крайние значения работы сервоопривода int sweep = map(pot, 0, 4095, 1750, 7900); // подаём аналоговый 16-ти битный сигнал на пин сервопривода adio.analogWrite_16(8, sweep); // ждём 50 секунд delay(50); } ==== Двойной маячок ==== По умолчанию модуль имеет адрес ''42'', который можно изменить прямо в скетче вашей программы. Это позволяет подключить к плате до 126 устройств расширителей портов. ==== Смена адреса устройства ==== Для начала необходимо подключить только один GPIO Expander, адрес которого хотим изменить. === Схема для Troyka Shield === {{ :продукты:troyka-gpio-expander:troyka-gpio-expander_troykashield_led.png |}} === Схема для Troyka Slot Shield === {{ :продукты:troyka-gpio-expander:troyka-gpio-expander_troykaslotshield_led.png |}} === Код для Arduino === Прошейте управляющую плату следующим скетчем. // библиотека для работы I²C #include // библиотека для работы с модулем GPIO Expander (I²C IO) #include // создаём объект adio класса GpioExpander по адресу 42 GpioExpander adio(42); void setup() { // включаем I²C. Для Arduino Due - Wire1.begin(); Wire.begin(); // Инициализируем объект adio. Для Arduino Due - adio.begin(&Wire1); adio.begin(); // меняем адрес модуля на «43» adio.changeAddr(43); delay(100); // сохраняем адрес во Flash-памяти контроллера на модуле GPIO Expander adio.saveAddr(); } void loop() { } Адрес успешно изменён. Изменим пример с маячком, добавив второй модуль и подключим к нему второй [[amp>product/troyka-led-module?utm_source=man&utm_campaign=i2c-io&utm_medium=wiki | светодиод «Пиранья»]]. === Схема для Troyka Shield === {{ :продукты:troyka-gpio-expander:troyka-gpio-expander_troykashield_double_led.png |}} === Схема для Troyka Slot Shield === {{ :продукты:troyka-gpio-expander:troyka-gpio-expander_troykaslotshield_double_led.png |}} === Код для Arduino === Прошейте управляющую плату следующим скетчем. // библиотека для работы I²C #include // библиотека для работы с модулем GPIO Expander (I²C IO) #include // создаём объект adio класса GpioExpander по адресу 42 GpioExpander adio(42); // создаём объект adio класса GpioExpander по адресу 43 GpioExpander adio2(43); void setup() { // включаем I²C. Для Arduino Due - Wire1.begin(); Wire.begin(); // Инициализируем объект adio. Для Arduino Due - adio.begin(&Wire1); adio.begin(); // настраиваем пин 8 на модуле GPIO Expander в режим выхода adio.pinMode(8, OUTPUT); // настраиваем пин 8 на модуле GPIO Expander2 в режим выхода adio2.pinMode(8, OUTPUT); } void loop() { // подаём на пин 8 модуля GPIO Expander «высокий сигнал» adio.digitalWrite(8, HIGH); // ждём 1 секунду delay(1000); // подаём на пин 8 модуля GPIO Expander «низкий сигнал» adio.digitalWrite(8, LOW); // ждём 1 секунду delay(1000); // подаём на пин 8 модуля GPIO Expander2 «высокий сигнал» adio2.digitalWrite(8, HIGH); // ждём 1 секунду delay(1000); // подаём на пин 8 модуля GPIO Expander2 «низкий сигнал» adio2.digitalWrite(8, LOW); // ждём 1 секунду delay(1000); } Светодиоды подключенные к разным расширителям будут мигать по очереди. ==== Покдлючение к Raspberry Pi ==== {{ :продукты:troyka-gpio-expander:gpio_ext.png?nolink |}} === Настройка === * Запустите меню raspi-config через терминал: sudo raspi-config * Включите I2C: {{ :продукты:troyka-gpio-expander:interfacing_1.png?nolink |}} {{ :продукты:troyka-gpio-expander:i2c-02.png?nolink |}} {{ :продукты:troyka-gpio-expander:enable_3.png?nolink |}} * Установите необходимые пакеты sudo apt-get update sudo apt-get upgrade sudo apt-get install python-dev python-pip git i2c-tools * Просмотрите подключённые I2C-устройства sudo i2cdetect -y 1 0x2a — это 42, адрес расширителя портов по умолчанию. {{ :продукты:troyka-gpio-expander:i2cdetect_4.png?nolink |}} * Установите wiringpi для python sudo pip install wiringpi2 * Скачайте библиотеку и запустите пример: git clone https://github.com/amperka/Troyka_Gpio_Expander_python.git cd Troyka_Gpio_Expander_python/ python example.py ===== Элементы платы ===== {{ :продукты:troyka-gpio-expander:troyka-gpio-expander_annotation.png |}} ==== Микроконтроллер STM32F030F4P6 ==== Мозгом модуля является мощный 32-разрядный микроконтроллер фирмы [[http://www.st.com|STMicroelectronics]] — STM32F030F4P6 с вычислительном ядром ARM Cortex® M0. ==== Группа GPIO 0-8 ==== GPIO контакты модуля расчитаны на напряжение 3.3 В. Каждый GPIO может быть независимо настроен как цифровой вход или выход и имеет возможность подтяжки как к ''+'' так и к ''-''. Для работы с аналоговыми модулями любой порт GPIO может работать в режиме АЦП или генерировать PWM сигнал. ==== Troyka контакты ==== //Группа питания и перепрошивки// * Сигнальный пин (Q) — используется для перепрошивки контроллера STM32. При обычной работе с модулем не используется. * Питание (V) — соедините с питанием микроконтроллера * Земля (G) — соедините с землёй микроконтроллера //Шина I2C// * Сигнальный (D) — подключите к пину ''SDA''микроконтроллера. * Сигнальный (C) — подключите к пину ''SCL''микроконтроллера. Для подключения нескольких модулей предусмотрена возможность смены адресов каждого модуля с помощью функции adio.changeAddr(); параметром которой является новый адрес модуля. По умолчанию на адрес модуля имеет значение 42. ==== Светодиодная индикация ==== Во время работы светодиод индицирует обмен данными между модулем и управляющей платой. ==== Контакты перепрошивки контроллера ==== Используются для программирования контроллера STM32 через Serial wire debug (SWD). ===== Принципиальная и монтажная схемы ===== {{:продукты:troyka-gpio-expander:troyka-gpio-expander_schematic.png?direct&350 |}} {{ :продукты:troyka-gpio-expander:troyka-gpio-expander_layout.png?direct&300|}} ===== Характеристики ===== * Микроконтроллер: STM32F030F4P6 * Интерфейс: I²C (адрес по умолчанию: 0x2A) * Напряжение питания модуля: 3,3–5 В * Портов ввода-вывода общего назначения: 9 * Напряжение логических уровней: 3,3 В * Портов с поддержкой ШИМ: 9 * Портов с АЦП: 9 * Габариты: 25,4×25,4 мм ===== Ресурсы ===== * [[amp>product/troyka-gpio-expander?utm_source=man&utm_campaign=i2c-io&utm_medium=wiki|GPIO Expander (Troyka-модуль)]] в магазине * [[https://github.com/amperka/hardware-drawings/blob/master/troyka-gpio-expander.svg|Векторное изображение GPIO Expander]] * [[https://github.com/amperka/Troyka-GPIO-expander|Библиотека для Arduino]] * [[https://github.com/amperka/Troyka_Gpio_Expander_python|Библиотека для Python (RPi 3)]] * [[js:gpio-expander|Описание библиотеки для Iskra JS]]