====== Расширитель 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]]