Не включаются одновременно два мотора на MotorShield v.3
- Войдите на сайт для отправки комментариев
Пт, 04/05/2012 - 22:54
Здравствуйте!
Пожалуйста, помогите разобраться: есть Freeduino Nano 5, MotorShield v.3, два ДПТ.
Нужно чтобы по нажатию определённых кнопок клавиатуры одновременно включались/выключались ДВА мотора. Команды посылаются с HyperTerminal (штатная winдузовая программа).
Написана простенькая программа, но работает она ТОЛЬКО когда управляешь одним двигателем. Перепробывал кучу вариантов - результат тот же... Идеи кончились :-(
Посоветуйте, что делать, где я что-то упустил?
Что характерно, если написать программу которая сама крутит туда-сюда два двигателя одновременно, то всё работает на ура...
Заранее спасибо.
/* w=119 a=97, s=115, d=100 x=120 */ #include <AFMotor.h> AF_DCMotor rMotor(3); AF_DCMotor lMotor(4); byte spd = 200; byte Val; byte LastVal; void setup() { Serial.begin(9600); } void loop() { while(Serial.available()) { Val = Serial.read(); if (Val == 119) // нажатие на клавишу w { lMotor.run(FORWARD); lMotor.setSpeed(spd); rMotor.run(FORWARD); // если, например, закоментировать эти две rMotor.setSpeed(spd); // строки, то всё работает нормально... } else if (Val == 115) // нажатие на клавишу s { lMotor.run(RELEASE); rMotor.run(RELEASE);// ...и эту строчку... } else if (Val == 120) // нажатие на клавишу x { lMotor.run(BACKWARD); lMotor.setSpeed(spd); rMotor.run(BACKWARD); // ...и эти две rMotor.setSpeed(spd); //строчки } } }
Т.е. они оба не запускаются? Или один запускается, а другой нет?
Да, именно ОБА. Если закомментировать строки одного (любого) из моторов, тогда другой исполняет команды как надо! Такое ощущение, что при включении первого по списку мотора (в полной программе) тут же появляется команда стоп. При нажатии клавиши 'w' кратковременно моргает LED13 и первый мотор издаёт еле слышимый звук, как при старте и мгновенной остановке. Чудеса...
А если вместо serial подавать команды кнопками, подключенными к ардуине?
Хорошая идея - буду попробовать. Может быть всплывёт какая-нибудь "железная" неисправность...
Но в дальнейшем этими моторами планируется управлять по BlueTooth каналу. Так что, проблема, скорее всего, останется.
А на других выводах шилда пробовали?
И попробуйте скачать с какого-нибудь другого ресурса библу AFMotor.
А на других выводах шилда пробовали?
И попробуйте скачать с какого-нибудь другого ресурса библу AFMotor.
Да, попробовал. Результат тот же. Библиотека норм.
Arduino IDE у вас какой версии? и откуда библу качали?
Arduino IDE у вас какой версии? и откуда библу качали?
Arduino-1.0
Библиотека скачана с www.arduino.cc
Вы думаете что софт битый? А почему тогда БЕЗ использования клавиатурных прерываний оба двигла работают одновременно? Вот фрагмент:
Думаю, моя ошибка где-то в области отлова клавиатурных прерываний и сохранении нужных значений среди потока данных по последовательному порту. А вот где именно? Посмотреть бы простенький примерчиг...
Так а вы через сериал-монитор пробовали?
Попробуйте через сериал-монитор
Попробуйте через сериал-монитор
BACKWARDíBACKWAþRELEASEWAþBACKWARD
RELEASE
RELEASE
RELEASE
BACKWARÄBACKWARDýBACKWARäFORWARD
ŠFORWARôRELEASE
RELEASE
RELEASE
RELEASE
RELEASE
RELEASE
А еще раз проверьте, как я вижу только RELEASE нормально работает?
А еще раз проверьте, как я вижу только RELEASE нормально работает?
Совершенно верно.
А питание вы берете с дуины? А дуина в свою очередь с USB?
А питание вы берете с дуины? А дуина в свою очередь с USB?
Да, сейчас брал с USB, но когда запитываюсь от батареек (6 вольт) через MotorShield то происходит всё то же...
Запитайте шилд от батареек, на шилде есть джемпер PWR Sel переставте джемпер в положение Ext и попробуйте еще раз. У вас скорее всего в момент одновременного старта двигателей из-за просадки напряжения перезапускается дуина.
Так я всё время так и делал. А когда пробовал в цикле гонять двигатели, то они от батареек крутились очень бодро, а если от юсб, то заметно медленнее. Но крутились же!
Так а джемпер переключали?
Так а джемпер переключали?
Первым делом :-) В плане энергетики у меня полный порядок. Собираюсь на такие наладочные работы приспособить блок питания от компа. Он очень хорошо выдаёт 5 и 12 вольт.
А в момент попытки запуска двигателей светодиод 13-го пина не мигает?
А в момент попытки запуска двигателей светодиод 13-го пина не мигает?
Мигает, и весьма ярко, уверенно.
Так это как раз и есть признак того, что дуина перезапускается.
А попробуйте подключить к шилду батарейки и вообще убрать джемпер PWR Sel.
Так это как раз и есть признак того, что дуина перезапускается.
Что заставляет её обресетиться - клавиатурное прерывание? Так оно после выполнения своих дел должно вернуться в программу там, где вышло из неё...
Решение уже близко?
А попробуйте подключить к шилду батарейки и вообще убрать джемпер PWR Sel.
В этом случае не подаётся напряжение на сам контроллер.
А кстати у вас ОС какая???
А попробуйте подключить к шилду батарейки и вообще убрать джемпер PWR Sel.
В этом случае не подаётся напряжение на сам контроллер.
Как это не подается? у вас дуина должна питается от USB и дело всетаки в просадке питания....
А попробуйте подключить к шилду батарейки и вообще убрать джемпер PWR Sel.
В этом случае не подаётся напряжение на сам контроллер.
Как это не подается? у вас дуина должна питается от USB и дело всетаки в просадке питания....
Пардон, попутался. Да, в этом случае всё питается нормально, но результат такой же. Я живу под Win XP.
А попробуйте так - этот же код (с двумя двигателями), но отключите один двигатель физически от шилда.
А попробуйте так - этот же код (с двумя двигателями), но отключите один двигатель физически от шилда.
Попробовал. Никакой разницы.
И вот такое выдаёт монитор:
0
0
0
0
þFORWARD
FORWARD
FORWARD
ÊFORWARD
FORWARäFORWARD
FORWARDFORWARD
FORWARD
ŠFORWARD
FORWARD
FORWARD FORWARDýFORWARD
FORWARD
RELEASE
RELEASE
RELEASE
BACKWARD
BACKWARDíBACKWARD
BACKWARDÍBACKWARD BACKWARÄBACKWARD
BACKWARüBACKWARÄ
А если тот который отключили подключить обратно и отключить другой двигатель? И если вообще отключить оба двигателя, тоже самое?
А если тот который отключили подключить обратно и отключить другой двигатель?
именно так я и делал :-(
Уверяю Вас, что двигатели исправны, шилд тоже, батарейки полны энергии, провода подключены правильно. Косяк находится где-то в программе, на этапе получение клавиатурного прерывания -> его обработка -> сравнение -> выдача команды. Скобки уже сто раз проверил... Жалко IDE не позволяет трассировать программу.
А вообще без двигателей что в сериал-монитор возвращает?
Косяк находится где-то в программе, на этапе получение клавиатурного прерывания -> его обработка -> сравнение -> выдача команды. Скобки уже сто раз проверил... Жалко IDE не позволяет трассировать программу.
Если бы косяк был в программе, то у вас бы тогда не работало и с одним двигателем, дуина бы не перезапускалась и в сериал-монитор ничего бы не возвращалось. Либо это какой-то глюк библиотеки.
Попробуйте вот эту www.freeduino.ru/arduino/files/AFMotor-08_12_2009.zip
У меня все замечательно работает с двумя двигателями Gekko MR12-100 и с выше упомянутой библой, как с вашим кодом так и с вот этим:
И вот что в сериал мониторе:
Уверяю Вас, что двигатели исправны, шилд тоже, батарейки полны энергии, провода подключены правильно.
И если вы так в этом уверены и уверены в своей библиотеке, я вам больше ничем помочь не могу.
Ура!!! Всё заработало!
Что было сделано:
1. Разобрал на ночь всю систему;
2. В очередной раз перезаписал библиотеку (хотя по размеру она такая же, как и была, но контрольными суммами не пользовался)
Запустил, и вдруг всё пошло...
Такое ощущение, что Фридуина, отстёгнутая на ночь от МоторШилда, как бы "обнулилась" полностью. Такое может быть? Или это мои фантазмы? А если честно, то я так и не понял, что произошло...
В любом случае, maksim, огромное спасибо за помощь и поддержку! Трудно в одиночку бодаться с неизвестным врагом.
Удачи Вам!