GPIO Expander (Troyka-модуль) решает проблему внезапно кончившихся пинов ввода/вывода.
Модуль получает команды от управляющей платы по протоколу I²C/TWI и позволяет использовать любой из своих портов как цифровой или аналоговый вход или выход.
GPIO расширитель портов общается с управляющей платой по протоколу I²C/TWI. При подключении к Arduino или Iskra JS удобно использовать Troyka Shield.
С Troyka Slot Shield можно сэкономить два трёхпроводных шлейфа.
Теперь к устройству можно подключить до девяти Troyka-модулей.
Рассмотрим несколько примеров работы модуля с управляющими платами Arduino. Работа с Iskra JS описана на странице библиотеки @gpio-expander.
В силу светодиодной робототехники мигнём светодиодом через GPIO Expander (Troyka-модуль).
Подключите GPIO расширитель к управляющей плате через Troyka Shield или Troyka Slot Shield.
Подключите светодиод «Пиранья» (Troyka-модуль) через стандартный 3-проводной шлейф к 8
пину GPIO Expander.
Прошейте управляющую плату следующим скетчем.
// библиотека для работы I²C #include <Wire.h> // библиотека для работы с модулем GPIO Expander (I²C IO) #include <GpioExpander.h> // создаём объект 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); }
Светодиод будет загораться и гаснуть раз в секунду.
Добавим к предыдущему эксперименту кнопку и подключим её к расширителю портов стандартным трёхпроводным шлейфом к 1
пину.
Прошейте Arduino следующим скетчем.
// библиотека для работы I²C #include <Wire.h> // библиотека для работы с модулем GPIO Expander (I²C IO) #include <GpioExpander.h> // создаём объект 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 следующим скетчем.
// библиотека для работы I²C #include <Wire.h> // библиотека для работы с модулем GPIO Expander (I²C IO) #include <GpioExpander.h> // создаём объект 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 расширитель умеет управлять сервоприводами. Заменим светодиод на сервопривод и будем управлять им с помощью потенциометра.
// библиотека для работы I²C #include <Wire.h> // библиотека для работы с модулем GPIO Expander (I²C IO) #include <GpioExpander.h> // создаём объект 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, адрес которого хотим изменить.
Прошейте управляющую плату следующим скетчем.
// библиотека для работы I²C #include <Wire.h> // библиотека для работы с модулем GPIO Expander (I²C IO) #include <GpioExpander.h> // создаём объект 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() { }
Адрес успешно изменён. Изменим пример с маячком, добавив второй модуль и подключим к нему второй светодиод «Пиранья».
Прошейте управляющую плату следующим скетчем.
// библиотека для работы I²C #include <Wire.h> // библиотека для работы с модулем GPIO Expander (I²C IO) #include <GpioExpander.h> // создаём объект 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); }
Светодиоды подключенные к разным расширителям будут мигать по очереди.
sudo raspi-config
sudo apt-get update sudo apt-get upgrade sudo apt-get install python-dev python-pip git i2c-tools
sudo i2cdetect -y 1
0x2a — это 42, адрес расширителя портов по умолчанию.
sudo pip install wiringpi2
git clone https://github.com/amperka/Troyka_Gpio_Expander_python.git cd Troyka_Gpio_Expander_python/ python example.py
Мозгом модуля является мощный 32-разрядный микроконтроллер фирмы STMicroelectronics — STM32F030F4P6 с вычислительном ядром ARM Cortex® M0.
GPIO контакты модуля расчитаны на напряжение 3.3 В.
Каждый GPIO может быть независимо настроен как цифровой вход или выход и имеет возможность подтяжки как к +
так и к -
. Для работы с аналоговыми модулями любой порт GPIO может работать в режиме АЦП или генерировать PWM сигнал.
Группа питания и перепрошивки
Шина I2C
SDA
микроконтроллера.SCL
микроконтроллера.Для подключения нескольких модулей предусмотрена возможность смены адресов каждого модуля с помощью функции adio.changeAddr(); параметром которой является новый адрес модуля. По умолчанию на адрес модуля имеет значение 42.
Во время работы светодиод индицирует обмен данными между модулем и управляющей платой.
Используются для программирования контроллера STM32 через Serial wire debug (SWD).