Примеры Scratch программ
Вывод кодов клавиатуры.zuza
Программа предназначена для демонстрации возможностей работы в терминале (отслеживание нажатий клавиш и вывод сообщений), без подключения пульта управления Жужа Nano к компьютеру:
Scratch - код для выполнения программы преобразуется в код Python:
В цикле программы приведены примеры отслеживания клавиш с помощью внутренних идентификаторов (клавиши вправо, влево) и кодов символов (клавиши плюс, минус). Программу можно использовать для получения кодов нажатия любых клавиш клавиатуры.
1 Полёт по кнопкам.zuza
Программа позволяет управлять дроном Жужа Nano с помощью клавиш клавиатуры:
клавиши вверх, вниз, вправо, влево, +, - - управление дроном по 3-м осям;
B - привязка (bind) дрона к пульту. Нужно выполнять в начале каждого полёта
С - чувствительность стиков;
F - Flip (кувырок);
H - Headless mode (безголовый режим);
L - взлёт / посадка
Scratch - код преобразуется в код Python:
gain = None
symbol_code = None
# Сгенерировано автоматически ZuzaNano copter.space
class force_terminate(Exception): pass
import ZuzaNanoRC
Controller = ZuzaNanoRC.ZuzaNanoRC('COM13')
try:
if not Controller.Connect():
print('Ошибка связи с портом '+Controller.PortName+'!')
raise force_terminate
gain = 127
while True:
symbol_code = getch()
if symbol_code == 0x01000000:
print('>exit')
break
elif symbol_code == ord("B"):
print('>bind')
Controller.Bind()
elif symbol_code == 0x01000013:
Controller.Pitch=(127 + gain)
print('>Pitch = ' + str(Controller.Pitch))
elif symbol_code == 0x01000015:
Controller.Pitch=(127 - gain)
print('>Pitch = ' + str(Controller.Pitch))
elif symbol_code == 0x01000012:
Controller.Roll=(127 - gain)
print('>Roll = ' + str(Controller.Roll))
elif symbol_code == 0x01000014:
Controller.Roll=(127 + gain)
print('>Roll = ' + str(Controller.Roll))
elif symbol_code == ord("-"):
Controller.Throttle=(127 + gain)
print('>Throttle = ' + str(Controller.Throttle))
elif symbol_code == ord("+"):
Controller.Throttle=(127 - gain)
print('>Throttle = ' + str(Controller.Throttle))
elif symbol_code == ord("C"):
Controller.PressButtonSensivity()
print('> Sencivity')
elif symbol_code == ord("F"):
Controller.PressButtonFlip()
print('> Flip')
elif symbol_code == ord("H"):
Controller.PressButtonHeadless()
print('> Headless')
elif symbol_code == ord("L"):
Controller.PressButtonLand()
print('> Land')
Controller.SendSticks()
time.sleep(0.3)
Controller.Pitch=127
Controller.Throttle=127
Controller.Roll=127
Controller.Yaw=127
Controller.Button=0
Controller.SendSticks()
if self.flag_terminate: raise force_terminate()
except force_terminate:
pass
В начале программы инициализируются переменные, создаётся пустой класс force_terminate
для возможности принудительного завершения программы, а также импортируется класс ZuzaNanoRC
для управления дроном:
gain = None
symbol_code = None
# Сгенерировано автоматически ZuzaNano copter.space
class force_terminate(Exception): pass
import ZuzaNanoRC
Controller = ZuzaNanoRC.ZuzaNanoRC('COM13')
Основной цикл программы реализован через цикл обработки исключений (try
). Первым делом проверяется связь с пультом дрона. Если связь не установлена - программа прерывается, с помощью генерации исключительной ситуации (raise force_terminate
):
try:
if not Controller.Connect():
print('Ошибка связи с портом '+Controller.PortName+'!')
raise force_terminate
Инициализируется переменная gain
- размер отклонения стиков контроллера от центрального положения (30 - это максимальное значение):
gain = 127
Запускается основной цикл программы: в зависимости от нажатой клавиши происходит нажатие кнопок или установка значений стиков:
while True:
symbol_code = getch()
if symbol_code == 0x01000000:
print('>exit')
break
elif symbol_code == ord("B"):
print('>bind')
Controller.Bind()
elif symbol_code == 0x01000013:
Controller.Pitch=(127 + gain)
print('>Pitch = ' + str(Controller.Pitch))
elif symbol_code == 0x01000015:
Controller.Pitch=(127 - gain)
print('>Pitch = ' + str(Controller.Pitch))
elif symbol_code == 0x01000012:
Controller.Roll=(127 - gain)
print('>Roll = ' + str(Controller.Roll))
elif symbol_code == 0x01000014:
Controller.Roll=(127 + gain)
print('>Roll = ' + str(Controller.Roll))
elif symbol_code == ord("-"):
Controller.Throttle=(127 + gain)
print('>Throttle = ' + str(Controller.Throttle))
elif symbol_code == ord("+"):
Controller.Throttle=(127 - gain)
print('>Throttle = ' + str(Controller.Throttle))
elif symbol_code == ord("C"):
Controller.PressButtonSensivity()
print('> Sencivity')
elif symbol_code == ord("F"):
Controller.PressButtonFlip()
print('> Flip')
elif symbol_code == ord("H"):
Controller.PressButtonHeadless()
print('> Headless')
elif symbol_code == ord("L"):
Controller.PressButtonLand()
print('> Land')
после того как стики установлены - их значения отправляются в контроллер дрона (Controller.SendSticks()
). Далее после паузы в 0.3 секунды - стики устанавливаются в исходное положение, и снова отправляются в контроллер дрона. С помощью размера отклонения стиков (переменная gain
) и времени паузы на отклонение (time.sleep(0.3)
) можно управлять плавностью реакции дрона.
Controller.SendSticks()
time.sleep(0.3)
Controller.Pitch=127
Controller.Throttle=127
Controller.Roll=127
Controller.Yaw=127
Controller.Button=0
Controller.SendSticks()
В конце каждого цикла при генерации python-кода автоматически добавляется проверка на принудительное завершение программы if self.flag_terminate: raise force_terminate()
Это позволяет прервать программу в терминале в любой момент с помощью зарезервированной комбинации клавиш Ctrl+C.
if self.flag_terminate: raise force_terminate()
except force_terminate:
pass
Порядок запуска программы следующий:
включить пульт (должен быть подключен к USB);
включить дрон;
запустить программу на выполнение (F5);
привязать дрон к пульту (B латинская);
можно взлетать и управлять дроном (взлёт - L)
Успешных Вам полётов!
Last updated
Was this helpful?