Перейти к содержанию
USB GPIO Extender: инструкция и команды

USB GPIO Extender: инструкция и команды

Подключение USB GPIO Extender с пятью входами и пятью выходами, команды CDC, примеры для Windows, Linux и Android и электрические ограничения.

USB GPIO Extender имеет пять фиксированных выходов и пять входов. Он определяется как виртуальный COM-порт и принимает короткие текстовые команды, поэтому им можно управлять из терминала, BAT/Bash-скрипта или своей программы.

Перед подключением

GPIO рассчитаны на логические сигналы. Не подключайте двигатель, лампу, соленоид или катушку реле прямо к выходу: используйте транзисторный либо релейный модуль с защитой от выбросов напряжения. Если внешняя схема не развязана гальванически, объедините её GND с GND контроллера.

Первый запуск

  1. Подключите устройство к USB.
  2. Найдите появившийся порт: COMx в Windows или /dev/ttyACM0 в Linux.
  3. Откройте порт в терминале или программе.
  4. Отправьте ~I, чтобы проверить связь и получить версию прошивки.

В Windows 8/10/11, Linux и macOS отдельный драйвер обычно не нужен. Для Windows 7 используйте инструкцию по CDC-драйверу.

Входы и выходы

Выходы работают в двухтактном режиме без подтяжки. Входы подтянуты к +3,3 В: свободный вход читается как 1, а замкнутый на GND — как 0.

ВыводФункцияВыводФункция
1выход6вход
2выход7вход
3выход8вход
4выход9вход
5выход10вход

Распиновка USB GPIO Extender

Команды

КомандаНазначениеОтвет
~Sxустановить выход x в 1~Sx
~Rxустановить выход x в 0~Rx
~Aпрочитать все пять входовнапример, ~A11001
~Pxxxxxустановить все пять выходов одной строкой~Pxxxxx
~Bперезагрузить модульбез ответа
~Iполучить версию прошивкистрока версии

Примеры

Windows BAT, циклическая установка выходов:

@echo off
SET portname=COM12
:loop
set /p x="~P10101" <nul >\\.\%portname%
ping -n 2 127.0.0.1 > nul
goto loop

Linux, командная строка:

#!/bin/bash
PORT=/dev/ttyACM0
while true; do
  echo -n "~P10101" > "$PORT"
  sleep 1
done

Python. Нужна библиотека pyserial: python -m pip install pyserial. В скриптах укажите свой порт в PORT. Устройство отвечает без перевода строки, поэтому скрипты читают заданное число байт: 7 для ~A и 3 для ~Sx и ~Rx.

Наблюдение за входами. Скрипт печатает состояние входов 6–10 при каждом изменении; остановите его сочетанием Ctrl+C:

import time

import serial

PORT = "COM12"  # Linux: "/dev/ttyACM0", macOS: "/dev/tty.usbmodem..."

with serial.Serial(PORT, 115200, timeout=1) as ser:
    last = b""
    try:
        while True:
            ser.write(b"~A")
            reply = ser.read(7)  # например, b"~A11001"
            if reply.startswith(b"~A") and reply != last:
                print("Входы 6-10:", reply[2:].decode())
                last = reply
            time.sleep(0.1)
    except KeyboardInterrupt:
        pass

Включение выхода на заданное время. Скрипт включает выход 1 на две секунды и выключает его, даже если вы прервали ожидание сочетанием Ctrl+C:

import time

import serial

PORT = "COM12"  # Linux: "/dev/ttyACM0", macOS: "/dev/tty.usbmodem..."
OUTPUT = 1      # номер выхода, от 1 до 5
SECONDS = 2

with serial.Serial(PORT, 115200, timeout=1) as ser:
    ser.write(f"~S{OUTPUT}".encode())
    print(ser.read(3))      # b"~S1": устройство повторяет команду
    try:
        time.sleep(SECONDS)
    finally:
        ser.write(f"~R{OUTPUT}".encode())
        print(ser.read(3))  # b"~R1"

Демо-программа для компьютера

Чтобы проверить устройство без терминала, запустите программу с окном: пять кнопок выходов и пять индикаторов входов. Она работает в Windows, Linux и macOS. Как и приложение для Android, это демонстрационная программа для собственных доработок: исходный код открыт, и на его основе можно написать свою. Она написана на C с библиотеками SDL2 и Nuklear, а работа с портом вынесена в отдельные файлы для POSIX и Windows.

Запуск

В папке со сборками лежат архивы для трёх систем:

СистемаАрхивЧто внутри и что нужно
Windowsgpio_extender1_demo_win.zipgpio_extender.exe и SDL2.dll: держите оба файла в одной папке
Linux x86-64gpio_extender1_demo_linux.zipgpio_extender; нужна библиотека SDL2, например sudo apt install libsdl2-2.0-0 в Debian и Ubuntu
macOS, процессор Intelgpio_extender_macos.zipgpio_extender; нужна библиотека SDL2 из Homebrew: brew install sdl2. На Mac с Apple Silicon соберите программу из исходников
  1. Скачайте архив для своей системы, распакуйте его и при необходимости установите SDL2.
  2. Подключите устройство и запустите программу. Нажмите «Скан» и выберите порт в списке «Порт»: COMx в Windows, /dev/ttyACM* или /dev/ttyUSB* в Linux, /dev/cu.* в macOS. Нажмите «Подключить». Скорость порта — 115 200 бод, 8N1, программа задаёт её сама.
  3. Кнопки «Выход» 1–5 включают и выключают выходы: включённый выход подсвечен зелёным. Индикаторы «Вход» 6–10 показывают уровень на входах: зелёный — высокий, серый — низкий. Номера совпадают с номерами выводов в таблице выше.
Окно демо-программы USB GPIO Extender в Linux: порт /dev/ttyACM0, выходы 1, 3 и 5 включены, входы 6, 8 и 10 в высоком уровне
Демо-программа в Linux после подключения к порту /dev/ttyACM0: выходы 1, 3 и 5 включены, на входах 6, 8 и 10 высокий уровень.

Программа каждые 10 мс по очереди отправляет ~A (чтение входов) и ~P с состоянием пяти выходов. Поэтому выходы получают актуальное состояние постоянно, а не только при нажатии кнопки.

Сборка из исходников

Исходный код программы состоит из каталога src/ и библиотеки Nuklear в third_party/. Логика интерфейса и протокол находятся в src/main.c, а работа с портом — в src/serial.c (Linux и macOS) и src/serial_win32.c (Windows).

В Linux и macOS установите SDL2 (sudo apt install libsdl2-dev или brew install sdl2) и выполните в каталоге проекта:

make
./gpio_extender

Для Windows команда make windows собирает gpio_extender.exe кросс-компиляцией в Linux: нужны MinGW-w64 и пакет SDL2 для него. Положите SDL2.dll рядом с .exe.

Управление с Android

Тот же виртуальный COM-порт можно открыть на планшете или смартфоне с Android 7.0 и новее. Нужны поддержка USB Host и переходник USB OTG. Для этого есть пример приложения с открытым исходным кодом: он включает выходы, показывает уровни входов и отправляет команды из таблицы выше. Пример рассчитан на разработчиков: по исходникам видно, как подключиться к порту, отправить команду и разобрать ответ.

Приложение работает без root-прав через стандартный USB Host API и не запрашивает доступ к интернету. Его проверяли на планшете с Android 7.0.

Установка и подключение

  1. Скачайте gpio-extender.apk и установите его. APK подписан отладочным ключом, поэтому Android может попросить разрешить установку из неизвестных источников.
  2. Подключите USB GPIO Extender к планшету через переходник USB OTG.
  3. Запустите приложение и подтвердите запрос доступа к USB. В верхней карточке появится статус «Подключено» и строка версии из ответа на ~I.
  4. Откройте «Настройки» и проверьте тип устройства: для этой модели нужен «GPIO Extender 1», он выбран по умолчанию. Приложение не определяет версию по USB, поэтому тип выбирают вручную.

Экраны приложения

  • «Управление» — кнопки «Выкл.» и «Вкл.» для пяти выходов и индикаторы пяти входов. Пока вкладка открыта, состояние входов обновляется раз в секунду; кнопка «Обновить входы» запрашивает его сразу. Среди команд нет чтения выходов, поэтому до первой подтверждённой команды приложение показывает для выхода «Состояние неизвестно».
  • «Консоль» — поле для команды с ~ или без него. Журнал показывает отправленные команды и ответы устройства и вмещает 500 записей.
Вкладка «Управление» приложения для Android с USB GPIO Extender: пять выходов и пять входов
Вкладка «Управление»: выходы 1, 3 и 5 включены, входы 1, 3 и 5 в состоянии 1. Серийный номер скрыт.
Вкладка «Консоль» приложения для Android: команда ~I и ответ USB GPIO Extender
Вкладка «Консоль»: команда ~I и ответ с версией прошивки. Серийный номер скрыт.

Исходники

Исходный код приложения написан на Kotlin и Jetpack Compose. USB-драйвер usb-serial-for-android входит в APK, системный драйвер CDC не нужен.

  • protocol/Extender1Protocol.kt формирует команды и разбирает ответы USB GPIO Extender;
  • protocol/SerialCommandClient.kt отправляет команду и ждёт ответ;
  • usb/AndroidUsbSerialTransport.kt ищет устройство, запрашивает доступ к USB и работает с портом.

Приложение принимает устройства с VID 0483 и PID 5740 (USB GPIO Extender) или A26A (GPIO Extender-2). Фильтр задан в res/xml/device_filter.xml и в AndroidUsbSerialTransport.kt. Для сборки нужны Android SDK и JDK 17 или новее: выполните ./gradlew assembleDebug в каталоге android. Минимальная версия Android — 7.0 (API 24).

Характеристики

ПараметрЗначение
ПитаниеUSB 5 В ±10 %
Собственное потреблениеоколо 20 мА
Максимальный ток одного выхода20 мА
Максимальный ток всех выходов80 мА
Допустимое напряжение на входах0…3,3 В
Габариты54 × 15 × 10 мм
Рабочая температура−40…+85 °C