Шапка

15.7 Пример разработки 5: стабилизированная механическая платформа

Последний пример - довольно занимательная штука. Это самодвижущаяся стабилизированная двухколёсная платформа, которую создатель назвал Psegué ( рис. 15.17 ).

Рис. 15.17   Стабилизированная двухколёсная платформа, которую представляет её создатель - Джесси Колман-МакГилл (Jesse Colman-McGill)

Устройство представляет собой трицикл без переднего колеса и потому неустойчивый в отсутствие обратной связи. Прототипом послужил «Персональный Транспортёр Segway™» Дэна Кэймена (Dean Kamen), с триумфом представленный в 2001г. Уродливые и симпатичные самоделки, появившиеся вслед за этим событием, подпитывались энтузиазмом сообщества любителей. Один из таких ребят живёт неподалёку. Нуждаясь в практическом содействии при проверке некоторых идей для стабилизированной платформы, он обратился в лабораторию авторов. Парень не походил на человека, который доведёт дело до конца, но впечатление оказалось обманчивым.

На рис. 15.18 показан окончательный вариант устройства ( к которому автор пришёл после нескольких забавных происшествий ). Цифровая обратная связь ( ПИД-регулятор ) реализована на микроконтроллере с ядром ARM7 фирмы NXP. Процессор установлен на печатную плату, включающую регулятор напряжения, соединители для аналоговых, цифровых и коммуникационных портов и индикатора. Данный комплект называется MINI-MAX/ARM-C, выпускается BiPOM Electronics и стоит $100.

Рис. 15.18   Блок-схема стабилизированного скутера. Типовые модули для самодельщиков ( гироскоп, акселерометр, беспроводная связь, плата микроконтроллера и сервоприводы ) сильно упростили конструкцию и сборку. Каталожные номера даны в скобках

Для контроля наклона Джесси взял твердотельный двухосевой акселерометр, который развернул на 45° от вертикали и подал выходы на разностный усилитель. Выходное напряжение усилителя пропорционально синусу угла наклона устройства и проходит через ноль, когда платформа горизонтальна. С разностной схемы идёт аналоговый сигнал для пропорциональной и интегральной ветви ПИД-регулятора. Дифференциальная составляющая бралась с гироскопа, чей выход прямо пропорционален скорости изменения наклона. Управление тележкой осуществляется боковым наклоном вертикальной стойки, которая воздействует на резистивные датчики усилия в основании. Микроконтроллер снабжён каналом Bluetooth для подстройки параметров ПИД-регулятора на ходу. На фото 15.19 показано внутреннее устройство платформы.

Рис. 15.19   Датчики и электроника с близкого расстояния. Дифференциальный сигнал с пары акселерометров ( оба наклонены на 45° от вертикали ) сообщает угол наклона вперёд-назад относительно вертикали, гироскоп фиксирует производную наклона по времени [* скорость наклона ] . На раме за электроникой живут гелевые батареи

С помощью логических выходов ШИМ микроконтроллер управляет парой мостовых драйверов для двигателей постоянного тока. Величина воздействия задаётся ПИД-регулятором. Ходовые двигатели имеют очень приличную мощность и выдают порядка лошадиной силы.

ПИД-регулятор тактируется сигналом 100 Hz с одного из внутренних таймеров микроконтроллера. Исходная ПИД схема обросла разного рода подпорками и заплатками, появившимися в результате экспериментов. Например, участок, отвечающий за дополнительную мощность при трогании с места и некоторая коррекция коэффициентов ПИД-регулятора в зависимости от нагрузки. Декоративное название для всех этих кусочков кода в программе - эвристика , хотя название не имеет значения, главное - без них дело не обходится, и при некоторой удаче их получится заставить работать как надо. Псевдокод приведён в листинге 15.5 .

Псевдокод 15.5 Psegue main loop pseudocode

Main Loop
  reset timer for 10 ms timeout
  read sensors
    tilt-sensing accelerometers (2)
    rotation-sensing gyro
    steering force sensors (2)
  compute PID with speed-dependent parameters
  apply heuristic rules
    dead-zone correction
    threshold boost
    load-dependent PID gain multiplier
  send updated torque command to motors
  if (logging) increment log_loop_count
    if (log_loop_count=10) log data & clear log_loop_count
  TimerCheck:
    if (timer not expired)
      if (command byte from wireless input FIFO buffer)
        append to line buffer
          if (newline) parse & execute
    write logging byte to wireless output FIFO buffer
  repeat TimerCheck
  repeat Main Loop 

Previous part:

Next part: