Lua — скрипты на автопилоте

Lua-скрипты загружаются и выполняются непосредственно на плате автопилота. Это самый «низкоуровневый» способ программирования Пионера: прямой доступ к датчикам, полетным режимам, периферии (UART, SPI, GPIO), светодиодам и камере. Ниже — справочник по классам Lua API: AP (запуск/посадка/полетные режимы), Sensors (датчики), Camera, Ledbar, GPIO, UART, SPI, Timer, Mailbox.

Введение в Lua

Поддержка Lua квадрокоптерами Пионер

КвадрокоптерыПоддержка Lua
Мини 2
Мини
Базовый
FPV
Макс

Загрузка Lua скрипта в автопилот

Загрузка Lua скрипта происходит через конфигуратор Pioneer Station, выполните подключение квадрокоптера, перейдите во вкладку Редактор кода, выберите один из предзагруженных примеров, напишите свой или скопируйте скрипт из документации, после чего нажмите кнопку Загрузить.

Запуск Lua скрипта

В целях безопасности, при выполнении полётного задания, автопилот проверяет "наличие пилота" и при его отсутствии откажется выполнять полёт. Подключите пульт управления и переведите тумблер SWB в нижнее положение, при необходимости, проверку можно отключить отредактировав параметр Copter_flyWithoutRc = 1 в конфигураторе Pioneer Station.

  • Нажмите кнопку Старт на плате автопилота, раздастся звуковой сигнал, после чего у вас будет 5 секунд, чтобы покинуть зону выполнения полетного задания.
  • Возможно настроить автозапуск скрипта, для этого отредактируйте параметр Lua_scriptDelayMs в конфигураторе Pioneer Station, значение указывается в миллисекундах, например, 10000 = 10 секунд с начала подачи питания. Будьте осторожныЗабыв о наличии автозапуска - велик шанс быть застигнутым врасплох и получить травмы.

Примеры скриптов

Исполнение Lua через пульт

Важно понимать, что запуск скрипта происходит все также через кнопку Старт на плате автопилота или автозапуск, через параметр Lua_scriptDelayMs. Однако непосредственно исполнение программы можно контроллировать, для этого следует добавить условие на проверку желаемого канала пульта, в данном примере считывается канал SWA, при его изменении начинается исполнение программы.

local unpack = table.unpack
local rc = Sensors.rc -- считывание положения тумблеров
local points = {
        {0, 2, 1},
        {0, 1, 1},
        {
        {0, 1, 1}
}

-- Счетчик точек local curr_point = 1

-- Функция, изменяющая цвет светодиодов и выполняющая полет к следующей точке local function nextPoint()

-- Полет к текущей точке, если её номер не больше количества заданных точек if(curr_point <= #points) then Timer.callLater(1, function() ap.goToLocalPoint(unpack(points[curr_point])) curr_point = curr_point + 1 end)

-- Посадка, если номер текущей точки больше количества заданных точек else Timer.callLater(1, function() ap.push(Ev.MCE_LANDING) end) end end

-- Функция обработки событий, автоматически вызывается автопилотом function callback(event)

-- Когда коптер поднялся на высоту взлета Flight_com_takeoffAlt, переходим к полету по точкам if(event == Ev.TAKEOFF_COMPLETE) then Timer.callLater(5, nextPoint) end

-- Когда коптер достиг текущей точки, переходим к следующей if(event == Ev.POINT_REACHED) then Timer.callLater(5, nextPoint) end end

-- Предстартовая подготовка startTimer = Timer.new(1, function() rc_chans = table.pack(rc())

-- проверка положения тумблера SwA if rc_chans[8] > 0 then curr_point = 1 ap.push(Ev.MCE_PREFLIGHT) Timer.callLater(6, function() ap.push(Ev.MCE_TAKEOFF) end) end end)

-- Таймер, через 2 секунды вызывающий функцию взлета startTimer:start()

Случайная смена цвета светодиодов

local unpack = table.unpack        -- Упрощение вызова функции распаковки таблиц из модуля table
local ledNumber = 29               -- Количество светодиодов на базовой плате
local leds = Ledbar.new(ledNumber) -- Создание порта управления светодиодами

-- Функция, изменяющая цвет 4-х RGB светодиодов на базовой плате local function changeColor(col) for i=0, ledNumber - 1, 1 do leds:set(i, unpack(col)) end end

-- Функция, реализующая выключение таймера и изменение цвета светодиодов на красный local function emergency() timerRandomLED:stop() -- Остановка таймера Timer.callLater(1, function () changeColor({1, 0, 0}) end) -- Изменение цвета светодиодов end

-- Функция обработки событий, автоматически вызывается автопилотом function callback(event) if (event == Ev.LOW_VOLTAGE2) then -- Вызов функции emergency() при низком напряжении на аккумуляторе emergency() end end

-- Создание таймера, каждую секунду меняющего цвета каждого из 4-х светодиодов на случайные timerRandomLED = Timer.new(1, function () color = {math.random(), math.random(), math.random()} -- Установка случайных значений по каждой компоненте RGB changeColor(color) -- Вызов функции смены цвета светодиодов end)

-- Запуск созданного таймера timerRandomLED:start()

Вывод цифр на Led модуль

local led_count = 29					   -- Общее количество светодиодов (4 на плате + 25 на модуле)
local led_offset = 4					   -- Количество светодиодов на плате
local matrix_count = 25					   -- Количество светодиодов на матрице
local leds = Ledbar.new(led_count)		   -- Создание порта управления светодиодами
local unpack = table.unpack				   -- Ассоциируем функцию распаковки таблиц из модуля table для упрощения

local colors = { red = {1, 0, 0}, -- Таблица цветов в RGB. Яркость цвета задается диапазоном от 0 до 1 green = {0, 1, 0}, blue = {0, 0, 1}, purple = {1, 0, 1}, cyan = {0, 1, 1}, yellow = {1, 1, 0}, white = {1, 1, 1}, black = {0, 0, 0}}

local dig = { {3, 7, 8, 13, 18, 22, 23, 24}, -- 1 Таблица символов цифр {2, 3, 4, 9, 12, 13, 14, 17, 22, 23, 24}, -- 2 {2, 3, 4, 9, 12, 13, 14, 19, 22, 23, 24}, -- 3 {2, 4, 7, 9, 12, 13, 14, 19, 24}, -- 4 {2, 3, 4, 7, 12, 13, 14, 19, 22, 23, 24}, -- 5 {3, 4, 7, 12, 13, 14, 17, 19, 22, 23, 24}, -- 6 {2, 3, 4, 9, 13, 18, 23}, -- 7 {2, 3, 4, 7, 9, 13, 17, 19, 22, 23, 24}, -- 8 {2, 3, 4, 7, 9, 12, 13, 14, 19, 22, 23}, -- 9 {1, 3, 4, 5, 6, 8, 10, 11, 13, 15, 16, 18, 20, 21, 23, 24, 25}, -- 10 [0] = {2, 3, 4, 7, 9, 12, 14, 17, 19, 22, 23, 24} } -- Индексация Lua начинается с 1, поэтому 0 указан в явном виде

local ledMatrix = {} -- Массив для хранения выводимой информации на матрицу

for i = 1, matrix_count + 1, 1 do ledMatrix[i] = colors.black -- Инициализация массива end

-- Вывод массива на матрицу local function updateMatrix() for i = led_offset, led_count - 1, 1 do leds:set(i, unpack(ledMatrix[i-led_offset + 1])) end end

-- Установка цвета на заданный пиксель массива матрицы. x - столбец; y - строка; colors - цвет в RGB local function setPixelMatrix( x, y, colors ) i = (y - 1) * 5 + x if ledMatrix [i] then ledMatrix [i] = colors end end

-- Заполнение массива матрицы цветом. colors - цвет в RGB local function fillMatrix( colors ) for i = 1, matrix_count + 1, 1 do ledMatrix [i] = colors end end

-- Запись символа цифры в массив матрицы. x - цифра; colors - цвет в RGB local function setDig( x, colors ) for _, v in ipairs(dig[x]) do ledMatrix[v] = colors end end

-- Здесь заканчивается описание работы с матрицей

function callback( event ) end

-- Пример. Программа выводит цифры от 0 до 9, изменяя цвет от красного к фиолетовому function digitOutput() colors_any[1], colors_any[2], colors_any[3] = fromHSV(col, 100, 10) -- Генерация цвета setDig (i, colors_any) -- Запись цифры в массив заданного цвета updateMatrix() -- Вывод массива на матрицу if col < 360 then col = col + 1 -- Изменение значения цвета elseif i < #dig-1 then fillMatrix(colors.black) -- Очистка массива матрицы перед записью новой цифры col = 0 -- Обнуление значения цвета i = i + 1 -- Увеличение переменной цифры else fillMatrix(colors.black) col = 0 -- Обнуление значения цвета i = 0 -- Обнуление значения цифры end Timer.callLater(0.003, function () digitOutput() end) -- Период, через который обновляется цвет end

colors_any = {0,0,0} -- Переменная цвета в формате RGB i = 0 -- Переменная выводимой цифры col = 0 -- Переменная цвета в формате HSV digitOutput() -- Запуск программы

Управление магнитом через пульт для платы v.1.1

local magnet = Gpio.new(Gpio.A, 1, Gpio.OUTPUT) -- инициализируем управление модулем груза порт A1 на плате версии v.1.1
local led_number = 8                             -- задаем количество светодиодов (4 на базовой плате и еще 4 на модуле груза)
local leds = Ledbar.new(led_number)              -- инициализируем светодиоды
local rc = Sensors.rc
local blink = 0

function callback(event) -- глобальная функция, вызывается автопилотом end

local function changeColor(red, green, blue) -- локальная функция смены цвета светодиодов for i=0, led_number - 1, 1 do leds:set(i, red, green, blue) end end

cargoTimer = Timer.new(0.1, function () -- создаем таймер, который будет вызывать нашу функцию 10 раз в секунуду _, _, _, _, _, _, _, ch8 = rc() -- считываем сигнал с 8 канала на пульте, значение от -1 до 1 if(ch8 < 0) then -- если сигнал с пульта -1 (SWA вверх), включаем магнит и сигнализируем зеленым светом magnet:set() changeColor(0, 1, 0) else if(ch8 > 0) then -- если сигнал с пульта 1 (SWA вниз), выключаем магнит и сигнализируем красным светом magnet:reset() changeColor(1, 0, 0) else -- в противном случае мигаем синим (отсутсвие сигнала с 8 канала) if(blink < 5) then changeColor(0, 0, 1) blink = blink + 1 else changeColor(0, 0, 0) blink = 0 end end end end)

cargoTimer:start() -- запускаем таймер

Управление магнитом через пульт для платы v.1.2 - v.1.4

local magnet = Gpio.new(Gpio.C, 3, Gpio.OUTPUT) -- инициализируем управление модулем груза порт C3 на плате версии v.1.2 - v.1.4
local led_number = 8                            -- задаем количество светодиодов (4 на базовой плате и еще 4 на модуле груза)
local leds = Ledbar.new(led_number)             -- инициализируем светодиоды
local rc = Sensors.rc
local blink = 0

function callback(event) -- глобальная функция, вызывается автопилотом end

local function changeColor(red, green, blue) -- локальная функция смены цвета светодиодов for i=0, led_number - 1, 1 do leds:set(i, red, green, blue) end end

cargoTimer = Timer.new(0.1, function () -- создаем таймер, который будет вызывать нашу функцию 10 раз в секунуду _, _, _, _, _, _, _, ch8 = rc() -- считываем сигнал с 8 канала на пульте, значение от -1 до 1 if(ch8 < 0) then -- если сигнал с пульта -1 (SWA вверх), включаем магнит и сигнализируем зеленым светом magnet:set() changeColor(0, 1, 0) else if(ch8 > 0) then -- если сигнал с пульта 1 (SWA вниз), выключаем магнит и сигнализируем красным светом magnet:reset() changeColor(1, 0, 0) else -- в противном случае мигаем синим (отсутсвие сигнала с 8 канала) if(blink < 5) then changeColor(0, 0, 1) blink = blink + 1 else changeColor(0, 0, 0) blink = 0 end end end end)

cargoTimer:start() -- запускаем таймер

Управление магнитом через пульт для платы v.1.6.3 - v.1.7.2

local magnet = Gpio.new(Gpio.C, 15, Gpio.OUTPUT) -- инициализируем управление модулем груза порт C15 на плате версии v.1.6.3 - v.1.7.2
local led_number = 8                             -- задаем количество светодиодов (4 на базовой плате и еще 4 на модуле груза)
local leds = Ledbar.new(led_number)              -- инициализируем светодиоды
local rc = Sensors.rc
local blink = 0

function callback(event) -- глобальная функция, вызывается автопилотом end

local function changeColor(red, green, blue) -- локальная функция смены цвета светодиодов for i=0, led_number - 1, 1 do leds:set(i, red, green, blue) end end

cargoTimer = Timer.new(0.1, function () -- создаем таймер, который будет вызывать нашу функцию 10 раз в секунуду _, _, _, _, _, _, _, ch8 = rc() -- считываем сигнал с 8 канала на пульте, значение от -1 до 1 if(ch8 < 0) then -- если сигнал с пульта -1 (SWA вверх), включаем магнит и сигнализируем зеленым светом magnet:set() changeColor(0, 1, 0) else if(ch8 > 0) then -- если сигнал с пульта 1 (SWA вниз), выключаем магнит и сигнализируем красным светом magnet:reset() changeColor(1, 0, 0) else -- в противном случае мигаем синим (отсутсвие сигнала с 8 канала) if(blink < 5) then changeColor(0, 0, 1) blink = blink + 1 else changeColor(0, 0, 0) blink = 0 end end end end)

cargoTimer:start() -- запускаем таймер

Управление магнитом через Python для платы v.1.1

Cкрипт считывает значение 5 канала пульта (тумблер SWC), загрузите скрипт на плату автопилота и переходите к продолжению примера на Python.

local magnet = Gpio.new(Gpio.A, 1, Gpio.OUTPUT)
local rc = Sensors.rc

function callback(event) end

cargoTimer = Timer.new(0.1, function () _, _, _, _, ch5, _, _, _ = rc() if(ch5 == 0) then magnet:set() else if(ch5 == 1) then magnet:reset() end end end)

cargoTimer:start()

Управление магнитом через Python для платы v.1.2 - v.1.4

local magnet = Gpio.new(Gpio.C, 3, Gpio.OUTPUT)
local rc = Sensors.rc

function callback(event) end

cargoTimer = Timer.new(0.1, function () _, _, _, _, ch5, _, _, _ = rc() if(ch5 == 0) then magnet:set() else if(ch5 == 1) then magnet:reset() end end end)

cargoTimer:start()

Управление магнитом через Python для платы v.1.6.3 - v.1.7.2

local magnet = Gpio.new(Gpio.C, 15, Gpio.OUTPUT)
local rc = Sensors.rc

function callback(event) end

cargoTimer = Timer.new(0.1, function () _, _, _, _, ch5, _, _, _ = rc() if(ch5 == 0) then magnet:set() else if(ch5 == 1) then magnet:reset() end end end)

cargoTimer:start()

КвадрокоптерыПоддержка Lua
Мини 2
Мини
Базовый
FPV
Макс

Класс ap

Класс ap (управление полетом)

ap.push(Event) - отправляет событие автопилоту из доступного списка:

Включить и выключить двигатели

ap.push(Ev.MCE_PREFLIGHT) - включает двигатели.

ap.push(Ev.MCE_LANDING) - выполняет посадку и выключает двигатели.

Взлет и посадка

ap.push(Ev.MCE_TAKEOFF) - выполняет взлет до высоты указанной в параметре Copter_com_takeoffAlt.

ap.push(Ev.MCE_LANDING) - выполняет посадку и выключает двигатели.

Полет в координаты (локальные)

ap.goToLocalPoint(x, y, z, time) - полет в заданную координату, на основе локальной системы координат. Метод не является блокирующим, это значит, что после вызова метода, следует поставить паузу или использовать флаг достижения координаты point_reached, чтобы квадрокоптер успел выполнить команду.

Полет в координаты (GPS)

ap.goToPoint(latitude, longitude, altitude) - полет в заданную координату, на основе GPS координат. Метод не является блокирующим, это значит, что после вызова метода, следует поставить паузу или использовать флаг достижения координаты point_reached, чтобы квадрокоптер успел выполнить команду.

Задать курсовой угол

ap.updateYaw(angle) - задать курсовой угол (рысканье) в радианах.

ap.push(Event) - отправляет событие автопилоту из доступного списка:

ap.push(Ev.MCE_PREFLIGHT) - включает двигатели.

ap.push(Ev.MCE_LANDING) - выполняет посадку и выключает двигатели.

ap.push(Ev.MCE_TAKEOFF) - выполняет взлет до высоты указанной в параметре Copter_com_takeoffAlt.

ap.push(Ev.MCE_LANDING) - выполняет посадку и выключает двигатели.

ap.updateYaw(angle) - задать курсовой угол (рысканье) в радианах.

Класс Sensors

Класс Sensors (получение данных)

Узнать координаты (LPS)

Sensors.lpsPosition() - возвращает локальные координаты X, Y, Z.

x, y, z = Sensors.lpsPosition() -- создаем переменные x, y, z, присваиваем текущие координаты

Узнать скорость по осям

Sensors.lpsVelocity() - возвращает текущую скорость по осям X, Y, Z.

vx, vy, vz = Sensors.lpsVelocity() -- создаем переменные vx, vy, vz, присваиваем текущую скорость по осям

Узнать курсовой угол

Sensors.lpsYaw() - возвращает текущий курсовой угол.

yaw = Sensors.lpsYaw() -- создаем переменную yaw, присваиваем текущий курсовой угол

Узнать углы наклона по осям

Sensors.orientation() - возвращает ориентацию дрона по углам крена(roll), тангажа(pitch), рыскания(yaw).

roll, pitch, yaw = Sensors.orientation() -- создаем переменные roll, pitch, yaw, присваиваем текущую ориентацию по осям

Узнать высоту (барометр)

Sensors.altitude() - возвращает высоту с барометра.

barometer = Sensors.altitude() -- создаем переменную barometer, присваиваем текущую высоту

Узнать высоту (дальномер)

Sensors.range() - возвращает высоту с дальномера.

range = Sensors.range() -- создаем переменную range, присваиваем текущую высоту

Узнать ускорение

Sensors.accel() - возвращает ускорение квадрокоптера по осям X, Y, Z.

ax, ay, az = Sensors.accel() -- создаем переменные ax, ay, az, присваиваем текущее ускорение по осям

Узнать угловую скорость

Sensors.gyro() - возвращает скорость по углам крена(roll), тангажа(pitch), рыскания(yaw).

gRoll, gPitch, gYaw = Sensors.gyro() -- создаем переменные gRoll, gPitch, gYaw, присваиваем текущую скорость по осям

Узнать значение каналов пульта управления

Sensors.rc() - возвращает значения c каналов пульта радиоуправления.

ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8 = Sensors.rc() -- создаем переменные, присваиваем текущую значения с пульта

Sensors.lpsYaw() - возвращает текущий курсовой угол.

Sensors.orientation() - возвращает ориентацию дрона по углам крена(roll), тангажа(pitch), рыскания(yaw).

Sensors.altitude() - возвращает высоту с барометра.

Sensors.range() - возвращает высоту с дальномера.

Sensors.accel() - возвращает ускорение квадрокоптера по осям X, Y, Z.

Sensors.gyro() - возвращает скорость по углам крена(roll), тангажа(pitch), рыскания(yaw).

Sensors.rc() - возвращает значения c каналов пульта радиоуправления.

Sensors.lpsPosition() - возвращает локальные координаты X, Y, Z.

Sensors.lpsVelocity() - возвращает текущую скорость по осям X, Y, Z.

Sensors.lpsYaw() - возвращает текущий курсовой угол.

Sensors.orientation() - возвращает ориентацию дрона по углам крена(roll), тангажа(pitch), рыскания(yaw).

Sensors.altitude() - возвращает высоту с барометра.

Sensors.range() - возвращает высоту с дальномера.

Sensors.accel() - возвращает ускорение квадрокоптера по осям X, Y, Z.

Sensors.gyro() - возвращает скорость по углам крена(roll), тангажа(pitch), рыскания(yaw).

Sensors.rc() - возвращает значения c каналов пульта радиоуправления.

Класс camera

Класс Camera (запись фото и видео)

Запись фото и видео происходит на MicroSD карту памяти, убедитесь, что карта памяти установлена, максимальный объем памяти 16 гб в формате FAT32.

Сделать фотографию

camera.requestMakeShot() - отправляет запрос на фотографию.

camera.checkRequestShot() - возвращает ответ на запрос сделать фотографию.

Записать видео

camera.requestRecordStart() - отправляет запрос на старт видеозаписи.

camera.checkRequestRecord() - возвращает ответ на запрос видеозаписи.

camera.requestRecordStop() - отправляет запрос на остановку видеозаписи.

camera.requestMakeShot() - отправляет запрос на фотографию.

camera.checkRequestShot() - возвращает ответ на запрос сделать фотографию.

camera.requestRecordStart() - отправляет запрос на старт видеозаписи.

camera.checkRequestRecord() - возвращает ответ на запрос видеозаписи.

camera.requestRecordStop() - отправляет запрос на остановку видеозаписи.

Класс Ledbar

Класс Ledbar (управление светодиодами)

Ledbar.new(Count) - создает объект для работы со светодиодами, в качестве аргумента передается количество доступных светодиодов, в настоящее время это 29 штук.

Управление светодиодами

led:set(num, r, g, b) - метод задает указанному светодиоду цвет в палитре RGB.

local led = Ledbar.new(29) -- создаем объект "led", указываем 29 светодиодов

led:set(0, 1, 0, 0) -- включаем светодиод №0 (яркий красный) -- led_id(0) - номер светодиода, нумерация начинается с 0 -- r(1) - управление яркостью красного субпикселя, где 0 = 0%, а 1 = 100% -- g(0) - управление яркостью зеленого субпикселя, где 0 = 0%, а 1 = 100% -- b(0) - управление яркостью синего субпикселя, где 0 = 0%, а 1 = 100%

sleep(2) -- ставим паузу на 2 секунды led:set(1, 0, 0.5, 0) -- включаем светодиод №1 (средней яркости зеленый) sleep(2) led:set(2, 0, 0, 0.1) -- включаем светодиод №2 (тусклый синий) sleep(2) led:set(3, 1, 0.4, 0) -- включаем светодиод №3 (желтый) sleep(2) led:set(0, 0, 0, 0) -- выключаем светодиод №0 led:set(1, 0, 0, 0) -- выключаем светодиод №1 led:set(2, 0, 0, 0) -- выключаем светодиод №2 led:set(3, 0, 0, 0) -- выключаем светодиод №3

local function led_control(r, g, b) -- создаем функцию "led_control", позволит удобно сменить цвет всем светодиодам

for i = 0, 28 do -- создаем цикл for с переменной i = 0, цикл будет повторяться от 0 до 28 (29 раз) led:set(i, r, g, b) -- перебираем светодиоды и меняем цвет тот который укажем при вызове функции end -- завершаем блок кода с циклом end -- завершаем блок кода с функцией

led_control(1, 0, 0) -- меняем цвет светодиодов на красный sleep(2) -- ставим паузу на 2 секунды led_control(0, 1, 0) -- меняем цвет светодиодов на зеленый

Конвертировать HSV в RGB

fromHSV(hue, saturation, value) - конвертирует цветовую модель HSV в RGB.

local led = Ledbar.new(29) -- создаем объект "led", указываем 29 светодиодов

r, g, b = fromHSV(180, 100, 100) -- создаем переменные r, g, b, присваиваем значения палитры HSV

led:set(0, r, g, b) -- включаем светодиод №0 led:set(1, r, g, b) -- включаем светодиод №1 led:set(2, r, g, b) -- включаем светодиод №2 led:set(3, r, g, b) -- включаем светодиод №3

fromHSV(hue, saturation, value) - конвертирует цветовую модель HSV в RGB.

led:set(2, r, g, b) -- включаем светодиод №2led:set(3, r, g, b) -- включаем светодиод №3

led:set(num, r, g, b) - метод задает указанному светодиоду цвет в палитре RGB.

fromHSV(hue, saturation, value) - конвертирует цветовую модель HSV в RGB.

sleep(2) -- ставим паузу на 2 секундыled_control(0, 1, 0) -- меняем цвет светодиодов на зеленый, r, g, b) -- включаем светодиод №1

Класс Gpio

Класс GPIO (управление портом)

Gpio.new(Port, Pin, Mode) - создает объект управляющий указанным портом на плате автопилота.

Распиновка Базовый v.1.0 - v.1.1

Распиновка Базовый v.1.2

Узнать значение Gpio

Gpio.read() - считывает текущее значение Gpio.

Установить значение Gpio

Gpio.set() - устанавливает true на выбранный пин.

Gpio.reset() - устанавливает что? на выбранный пин.

Gpio.write(value) - устанавливает значение переданное в аргументе value на выбранный пин.

Альтернативная функция Gpio

Gpio.setFunction(num) - устанавливает номер альтернативной функции на выбранный пин.

Пример с магнитом

Gpio.setFunction(num) - устанавливает номер альтернативной функции на выбранный пин.

Gpio.new(Port, Pin, Mode) - создает объект управляющий указанным портом на плате автопилота.

Gpio.read() - считывает текущее значение Gpio.

Gpio.set() - устанавливает true на выбранный пин.

Gpio.reset() - устанавливает что? на выбранный пин.

Gpio.write(value) - устанавливает значение переданное в аргументе value на выбранный пин.

Gpio.setFunction(num) - устанавливает номер альтернативной функции на выбранный пин.

Gpio.setFunction(num) - устанавливает номер альтернативной функции на выбранный пин.

Класс Uart

Класс UART (управление портом)

С помощью UART интерфейса можно наладить обмен данными между двумя разными устройствами.

Uart.new(num, rate, parity, stopBits) - создает объект резервирующий выбранный UART-порт и позволяющий в дальнейшем использовать его в своих целях.

local myUart = Uart.new(4, 115200, parity, stopBits) -- создаем объект "myUart", содержит аргументы:
                                                     -- num(4) - номер uart порта которым будем управлять
                                                     -- 115200(rate) - скорость передачи данных
                                                     -- parity - необязательный аргумент, по умолчанию Uart.PARITY_NONE, но также принимает Uart.PARITY_EVEN и Uart.PARITY_ODD
                                                     -- stopBits - необязательный аргумент, по умолчанию Uart.ONE_STOP, но также принимает Uart.TWO_STOP

Прочитать байт

Uart.read(size) - возвращает указанное в аргументе size количество байт.

Записать данные

Uart.write(data, size) - записывает data длиной size.

Узнать доступные для чтения данные

Uart.bytesToRead() - возвращает количество байт доступных для чтения.

Задать скорость обмена данными

Uart.setBaudRate(rate) - устанавливает скорость обмена данными по шине UART.

Uart.read(size) - возвращает указанное в аргументе size количество байт.

Uart.write(data, size) - записывает data длиной size.

Uart.bytesToRead() - возвращает количество байт доступных для чтения.

Uart.setBaudRate(rate) - устанавливает скорость обмена данными по шине UART.

С помощью UART интерфейса можно наладить обмен данными между двумя разными устройствами.

Uart.read(size) - возвращает указанное в аргументе size количество байт.

Uart.write(data, size) - записывает data длиной size.

Uart.bytesToRead() - возвращает количество байт доступных для чтения.

Uart.setBaudRate(rate) - устанавливает скорость обмена данными по шине UART.

Класс Spi

Класс SPI (управление портом)

С помощью SPI интерфейса можно наладить обмен данными между двумя разными устройствами. Spi.new(num, rate, seq, mode) - создает объект резервирующий выбранный SPI-порт и позволяющий в дальнейшем использовать его в своих целях.

local mySpi = Spi.new(4, 115200, seq, mode) -- создаем объект "mySpi", содержит аргументы:
                                            -- num(4) - номер spi порта которым будем управлять
                                            -- 115200(rate) - скорость передачи данных
                                            -- seq - необязательный аргумент, по умолчанию Spi.MSB, но также принимает Spi.MSB, Spi.LSB, Spi.MSB_16, Spi.LSB_16
                                            -- mode - необязательный аргумент, по умолчанию Spi.MODE0, но также принимает Spi.MODE0, Spi.MODE1, Spi.MODE2, Spi.MODE3

Прочитать байт

Spi.read(size) - возвращает указанное в аргументе size количество байт.

Записать данные

Spi.write(data, size) - записывает data длиной size.

Узнать доступные для чтения данные

Spi.exchange(data, size) - записывает data длиной size и возвращает size.

local mySpi = Spi.new(4, 115200, seq, mode) -- создаем объект "myUart"
spi:exchange("hello", 5)                    -- записываем hello, длиной 5 и возвращаем количество байт

Spi.read(size) - возвращает указанное в аргументе size количество байт.

Spi.write(data, size) - записывает data длиной size.

Spi.exchange(data, size) - записывает data длиной size и возвращает size.

Spi.read(size) - возвращает указанное в аргументе size количество байт.

Spi.write(data, size) - записывает data длиной size.

Spi.exchange(data, size) - записывает data длиной size и возвращает size.

Класс Timer

Запуск и остановка таймера

Timer.start -

Timer.stop -

local led = Ledbar.new(29)

function callback(event) end

timerRandomLED = Timer.new(0.1, function () led:set(math.random(0, 3), math.random(), math.random(),math.random()) end)

timerRandomLED:start()

sleep(3) ap.push(Ev.MCE_PREFLIGHT) sleep(3) ap.push(Ev.MCE_LANDING)

Timer.start -

Timer.stop -

Класс mailbox

Класс mailbox ()

mailbox.connect(ip, port) - инициализация подключения к устройству с заданным адресом и портом.

hull, message = mailbox.connect("192.168.0.100", 8889) -- аргументы:
                                                       -- ip - адрес устройства назначения
                                                       -- port - порт устройства назначения

Проверить сообщения

mailbox.hasMessages() - возвращает true, если пришло сообщение, иначе false.

has_mes = mailbox.hasMessages()

Узнать бортовой номер устройства

mailbox.myHullNumber() - возвращает текущий бортовой номер устройства.

my_hull = mailbox.myHullNumber()

Считать байт сообщения

mailbox.receive(blocking) - ожидает получение нового сообщения и возвращает его, если blocking=true. Возвращает сообщение из буфера или -1 (при отсутствии сообщений), если blocking=false.

hull, message = mailbox.receive(true)

Отправить сообщение

mailbox.send(hull, message) - отправляет сообщение адресату. Если hull < 0, отправляет сообщение всем известным устройствам.

mailbox.send(42, "Hello Username") -- аргументы:
                                   -- 42(hull) - бортовой номер устройства которому будет отправлено сообщение
                                   -- Hello Username(message) - сообщение для отправки

mailbox.setHullNumber(hull) - устанавливает новый бортовой номер, перезаписывается параметр "Trik_hullNum".

mailbox.setHullNumber(12) -- 12(hull) - новый бортовой номер

mailbox.myHullNumber() - возвращает текущий бортовой номер устройства.

mailbox.send(hull, message) - отправляет сообщение адресату. Если hull < 0, отправляет сообщение всем известным устройствам.

mailbox.setHullNumber(hull) - устанавливает новый бортовой номер, перезаписывается параметр "Trik_hullNum".

mailbox.connect(ip, port) - инициализация подключения к устройству с заданным адресом и портом.

mailbox.hasMessages() - возвращает true, если пришло сообщение, иначе false.

mailbox.myHullNumber() - возвращает текущий бортовой номер устройства.

mailbox.send(hull, message) - отправляет сообщение адресату. Если hull < 0, отправляет сообщение всем известным устройствам.

mailbox.setHullNumber(hull) - устанавливает новый бортовой номер, перезаписывается параметр "Trik_hullNum".