💻
НЕБО В КАРМАНЕ
  • НЕБО В КАРМАНЕ
  • Комнатный минипланер
  • Планер "СТРИЖ"
  • Жужа NANO: первый старт
    • Ремонт деревянной рамы
    • Усиленная 3D-рама
    • Усиленная 3D-рама_2
  • Жужа Scratch
  • Scratch программирование для Жужа Nano
    • Описание программы
    • Установка программы ZuNano Scratch
    • Описание интерфейса
    • Примеры Scratch программ
  • ARENA дронов
    • Обзорная часть
    • HARD_SOFT
    • Установка ПО. Библиотеки Python.
    • Установка Visual Studio Code на Windows.
    • Python библиотека ZuzaNanoRC
    • Определение положения дрона в пространстве с помощью Web-камеры
    • Развёртывание системы машинного зрения
    • Автономный полёт дрона с помощью Web-камеры
    • Анализ логов полёта
    • Возможные проблемы и их устранение
  • CASE STUDY
    • Зависание в точке V-RAY
    • Полет по квадрату без рысканья V-RAY
    • Полёт по квадрату с рысканьем V-RAY
    • Подключение к Дистанционному полигону V-RAY
    • Дистанционное управление дроном на Scratch
Powered by GitBook
On this page
  • Вывод кодов клавиатуры.zuza
  • 1 Полёт по кнопкам.zuza

Was this helpful?

  1. Scratch программирование для Жужа Nano

Примеры Scratch программ

PreviousОписание интерфейсаNextОбзорная часть

Last updated 4 years ago

Was this helpful?

Вывод кодов клавиатуры.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)

Успешных Вам полётов!

Код программы на Scratch