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".