Мини-контроллеры 4х4
"4 входа-4 выхода"
Маленькие контроллеры с управлением по RS485 в трех исполнениях:
  • управление текстовыми командами по RS485
  • управлением по Modbus RTU
  • программируемая вами логика на uLua
Исполнения
Варианты изготовления контроллера
4 входа - 4 реле
  • Напряжение питания: DC 5-24B
  • Интерфейс: RS485
  • Вход 4 шт.: до 3.3В, подтянут к "1".
  • Выход 4 шт.: реле.
4 входа - 4 выхода
  • Напряжение питания: DC 5-24B
  • Интерфейс: RS485
  • Вход 4 шт.: до 3.3В, подтянут к "1".
  • Выход 4 шт.: 30В до 2А, открытый коллектор (сток).
Программные исполнения
Мы сделали 3 варианта встроенного программного обеспечения для разного подхода
Текстовый протокол
Самый простой вариант: текстовыми командами управляете устройством.
"set 1 1" - и первый выход устанавливается в 1. "get 1" - и получаете состояние первого входа
Modbus RTU
Более стандартизированный подход: используете команды чтения/записи в Holding Registers для управления устройством.
uLua
Самый творческий вариант: сами пишете логику работы устройства и реализуете свои сценарии.
Начало работы
По умолчанию устройство выполняет демонстрационный код (который можно увидеть ниже).

Подключите ваше устройство
  1. Подключите устройство к компьютеру к питанию и к вашей сети RS485.
  2. В зависимости от исполнения:

Исполнениe с текстовым протоколом:
Запустите любое приложение для работы с последовательным портом:
  • Windows: PuTTY, TeraTerm, Arduino Serial Monitor, pyserial-miniterm.
  • macOS: Screen, Serial, CoolTerm, pyserial-miniterm.
  • Linux: Screen, Minicom, PuTTY, pyserial-miniterm.

Подключитесь к последовательному порту
  • Windows: устройство вида COM3 и т.п.
  • macOS: устройство вида /dev/tty.usbmodem2073306558472 и т.п.
  • Linux: устройство вида /dev/ttyACM0 и т.п.

Вводите команды:
get N — читает уровень пина N (1..4)
set N M — выставляет уровень M на выходном пине N (N = 1..4)

Например:
set 1 1 (и нажать enter) — должен выставить вывод 1 в высокий уровень.


Исполнениe с Modbus RTU:
Чтение из Holding Register 0 показывает состояние входов, а запись управляет выходами.

Исполнение с UnitX Lua (uLua)

Весь дальнейший текст только для программируемой версии

Не смотря на то, что Lua и так очень маленький язык, в такой микроконтроллер его не поместить, а иметь возможность удобно управлять логикой работы очень хочется.

Поэтому мы сделали свою упрощенную реализацию. Получился хороший компромисс для встраиваемых систем, где критичны размер кода и скорость выполнения.

Поддерживается

  • local переменные (int32);
  • арифметика и битовые операции;
  • if, while, repeat, for, break;
  • функции;
  • строки;
  • готовые функции для работы с периферией: io, pwm, adc, cc, ws2812 и т.д.
Не поддерживается

  • таблицы
  • GC
  • замыкания
  • типы данных, кроме строк и int32
  • динамический runtime с `require` и общими Lua-механиками


Когда вы захотите расширить функционал, вам понадобится

Руководство программиста
  • Подключите контроллер к компьютеру по USB
  • Откройте онлайн IDE, нажмите "Подключиться" и выберите порт устройства.
  • Ваш контроллер уже с программой, поэтому нужно нажать "Остановить", потом "Скомпилировать".
  • Если ошибок нет, то далее можно "Загрузить", если хотите просто запустить код, либо "Сохранить", если хотите, чтобы он остался в устройстве.
Шпаргалка по языку
Подробное описание языка и доступные библиотеки доступны по ссылке.
Работа с GPIO
hw.gpio_init(pin, mode)
Устанавливает режим hw.inp, hw.out, hw.pwm, hw.adc, hw.capture и т.д.
hw.gpio_init(hw.p1, hw.out)

hw.gpio_set(pin, value)
Устанавливает логический уровень 0 или 1.
hw.gpio_set(hw.p1, 1)

hw.gpio_get(pin) -> int
Читает уровень 0 или 1.
local level = hw.gpio_get(hw.p1)
Работа с PWM
hw.pwm_init(pin, frequency_hz)
Инициализирует PWM на заданной частоте.

hw.pwm_set(pin, duty_percent)
Устанавливает duty cycle 0..100.

Пример:
hw.gpio_init(hw.p3, hw.pwm)
hw.pwm_init(hw.p3, 1000)
hw.pwm_set(hw.p3, 50)
Работа с захватом
hw.capture_freq(pin) -> int
Возвращает частоту входного сигнала в Гц.

hw.capture_duty(pin) -> int
Возвращает duty cycle в процентах.
Таймеры
hw.delay_ms(ms)
Задержка в миллисекундах.

hw.uptime() -> int
Секунды с момента старта устройства.

hw.now() -> int
Миллисекунды с момента старта устройства.

hw.timer_after(ms, func[, arg1[, arg2]]) -> int
Однократный запуск таймера через ms.

hw.timer_every(ms, func[, arg1[, arg2]]) -> int
Периодический запуск таймера через ms.

hw.timer_cancel(timer_id)
Отмена таймера.
Дополнительная информация
Полное описание возможностей находится по ссылке.
Надеемся, что данное руководство поможет вам в работе с мини-контроллером. Удачной разработки!