15.7 Пример разработки 5: стабилизированная механическая платформа
==1077
Последний пример - довольно занимательная штука. Это самодвижущаяся стабилизированная двухколёсная платформа, которую создатель назвал 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 .
==1078
Псевдокод 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
==1078