Не включаются одновременно два мотора на MotorShield v.3

Tn201
Offline
Зарегистрирован: 04.05.2012

Здравствуйте!

Пожалуйста, помогите разобраться: есть 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); //строчки
         }
    }
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Т.е. они оба не запускаются? Или один запускается, а другой нет?

Tn201
Offline
Зарегистрирован: 04.05.2012

Да, именно ОБА. Если закомментировать строки одного (любого) из моторов, тогда другой исполняет команды как надо! Такое ощущение, что при включении первого по списку мотора (в полной программе) тут же появляется команда стоп. При нажатии клавиши 'w' кратковременно моргает LED13 и первый мотор издаёт еле слышимый звук, как при старте и мгновенной остановке. Чудеса...

Xoon
Offline
Зарегистрирован: 02.04.2012

 А если вместо serial подавать команды кнопками, подключенными к ардуине?

Tn201
Offline
Зарегистрирован: 04.05.2012

 Хорошая идея - буду попробовать. Может быть всплывёт какая-нибудь "железная" неисправность...

Но в дальнейшем этими моторами планируется управлять по BlueTooth каналу. Так что, проблема, скорее всего,  останется. 

maksim
Offline
Зарегистрирован: 12.02.2012

А на других выводах шилда пробовали?

AF_DCMotor rMotor(1);
AF_DCMotor lMotor(2);

И попробуйте скачать с какого-нибудь другого ресурса библу AFMotor.

Tn201
Offline
Зарегистрирован: 04.05.2012

maksim пишет:

А на других выводах шилда пробовали?

AF_DCMotor rMotor(1);
AF_DCMotor lMotor(2);

И попробуйте скачать с какого-нибудь другого ресурса библу AFMotor.

Да, попробовал. Результат тот же. Библиотека норм.

 

maksim
Offline
Зарегистрирован: 12.02.2012

Arduino IDE у вас какой версии? и откуда библу качали? 

Tn201
Offline
Зарегистрирован: 04.05.2012

maksim пишет:

Arduino IDE у вас какой версии? и откуда библу качали? 

Arduino-1.0

Библиотека скачана с www.arduino.cc

Вы думаете что софт битый? А почему тогда БЕЗ использования клавиатурных прерываний оба двигла работают одновременно? Вот фрагмент:

void loop() 
{
    lMotor.run(FORWARD);
    lMotor.setSpeed(200);
    rMotor.run(FORWARD);
    rMotor.setSpeed(200);
      delay(1000);

    lMotor.run(RELEASE);
    rMotor.run(RELEASE);
      delay(1000);

    lMotor.run(BACKWARD);
    lMotor.setSpeed(200);
    rMotor.run(BACKWARD);
    rMotor.setSpeed(200);
      delay(1000);
}

 Думаю, моя ошибка где-то в области отлова клавиатурных прерываний и сохранении нужных значений среди потока данных по последовательному порту. А вот где именно? Посмотреть бы простенький примерчиг...

maksim
Offline
Зарегистрирован: 12.02.2012

Так а вы через сериал-монитор пробовали? 

maksim
Offline
Зарегистрирован: 12.02.2012

Попробуйте через сериал-монитор

/* 
      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); // строки, то всё работает нормально...
            Serial.println("FORWARD");
         }
         else if (Val == 115) // нажатие на клавишу s
         {
             lMotor.run(RELEASE); 
             rMotor.run(RELEASE);// ...и эту строчку...
             Serial.println("RELEASE");
         } 
         else if (Val == 120) // нажатие на клавишу x
         {
             lMotor.run(BACKWARD);
             lMotor.setSpeed(spd);
             rMotor.run(BACKWARD); // ...и эти две
             rMotor.setSpeed(spd); //строчки
             Serial.println("BACKWARD");
         }
    }
}

Tn201
Offline
Зарегистрирован: 04.05.2012

 

maksim пишет:

Попробуйте через сериал-монитор

Картинка получается вот такая... С каким-то мусором. И что характерно, не на каждое нажатие клавиши есть отклик монитора. RELEASE
BACKWARDíBACKWAþRELEASEWAþBACKWARD
RELEASE
RELEASE
RELEASE
BACKWARÄBACKWARDýBACKWARäFORWARD
ŠFORWARôRELEASE
RELEASE
RELEASE
RELEASE
RELEASE
RELEASE

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

А еще раз проверьте, как я вижу только RELEASE нормально работает?

Tn201
Offline
Зарегистрирован: 04.05.2012

maksim пишет:

А еще раз проверьте, как я вижу только RELEASE нормально работает?

Совершенно верно.

maksim
Offline
Зарегистрирован: 12.02.2012

А питание вы берете с дуины? А дуина в свою очередь с USB? 

Tn201
Offline
Зарегистрирован: 04.05.2012

maksim пишет:

А питание вы берете с дуины? А дуина в свою очередь с USB? 

Да, сейчас брал с USB, но когда запитываюсь от батареек (6 вольт) через MotorShield то происходит всё то же...

maksim
Offline
Зарегистрирован: 12.02.2012

Запитайте шилд от батареек, на шилде есть джемпер PWR Sel переставте джемпер в положение Ext и попробуйте еще раз. У вас скорее всего в момент одновременного старта двигателей из-за просадки напряжения перезапускается дуина.

Tn201
Offline
Зарегистрирован: 04.05.2012

Так я всё время так и делал. А когда пробовал в цикле гонять двигатели, то они от батареек крутились очень бодро, а если от юсб, то заметно медленнее. Но крутились же!

maksim
Offline
Зарегистрирован: 12.02.2012

Так а джемпер переключали?

Tn201
Offline
Зарегистрирован: 04.05.2012

maksim пишет:

Так а джемпер переключали?

Первым делом :-) В плане энергетики у меня полный порядок. Собираюсь на такие наладочные работы приспособить блок питания от компа. Он очень хорошо выдаёт 5 и 12 вольт.

maksim
Offline
Зарегистрирован: 12.02.2012

А в момент попытки запуска двигателей светодиод 13-го пина не мигает? 

Tn201
Offline
Зарегистрирован: 04.05.2012

maksim пишет:

А в момент попытки запуска двигателей светодиод 13-го пина не мигает? 

Мигает, и весьма ярко, уверенно.

maksim
Offline
Зарегистрирован: 12.02.2012

Так это как раз и есть признак того, что дуина перезапускается.

maksim
Offline
Зарегистрирован: 12.02.2012

А попробуйте подключить к шилду батарейки и вообще убрать джемпер PWR Sel.

Tn201
Offline
Зарегистрирован: 04.05.2012

maksim пишет:

Так это как раз и есть признак того, что дуина перезапускается.

Что заставляет её обресетиться - клавиатурное прерывание? Так оно после выполнения своих дел должно вернуться в программу там, где вышло из неё...

Решение уже близко?

Tn201
Offline
Зарегистрирован: 04.05.2012

maksim пишет:

А попробуйте подключить к шилду батарейки и вообще убрать джемпер PWR Sel.

В этом случае не подаётся напряжение на сам контроллер.

maksim
Offline
Зарегистрирован: 12.02.2012

А кстати у вас ОС какая??? 

maksim
Offline
Зарегистрирован: 12.02.2012

Tn201 пишет:

maksim пишет:

А попробуйте подключить к шилду батарейки и вообще убрать джемпер PWR Sel.

В этом случае не подаётся напряжение на сам контроллер.

Как это не подается? у вас дуина должна питается от USB и дело всетаки в просадке питания....

Tn201
Offline
Зарегистрирован: 04.05.2012

maksim пишет:

Tn201 пишет:

maksim пишет:

А попробуйте подключить к шилду батарейки и вообще убрать джемпер PWR Sel.

В этом случае не подаётся напряжение на сам контроллер.

Как это не подается? у вас дуина должна питается от USB и дело всетаки в просадке питания....

Пардон, попутался. Да, в этом случае всё питается нормально, но результат такой же. Я живу под Win XP.

maksim
Offline
Зарегистрирован: 12.02.2012

А попробуйте так - этот же код (с двумя двигателями), но отключите один двигатель физически от шилда.

Tn201
Offline
Зарегистрирован: 04.05.2012

maksim пишет:

А попробуйте так - этот же код (с двумя двигателями), но отключите один двигатель физически от шилда.

Попробовал. Никакой разницы.

И вот такое выдаёт монитор:

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Ä

 

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

А если тот который отключили подключить обратно и отключить другой двигатель? И если вообще отключить оба двигателя, тоже самое?

Tn201
Offline
Зарегистрирован: 04.05.2012

maksim пишет:

А если тот который отключили подключить обратно и отключить другой двигатель?

именно так я и делал :-(

Уверяю Вас, что двигатели исправны, шилд тоже, батарейки полны энергии, провода подключены правильно. Косяк находится где-то в программе, на этапе получение клавиатурного прерывания -> его обработка -> сравнение -> выдача команды. Скобки уже сто раз проверил... Жалко IDE не позволяет трассировать программу.

maksim
Offline
Зарегистрирован: 12.02.2012

А вообще без двигателей что в сериал-монитор возвращает?

maksim
Offline
Зарегистрирован: 12.02.2012

Tn201 пишет:

Косяк находится где-то в программе, на этапе получение клавиатурного прерывания -> его обработка -> сравнение -> выдача команды. Скобки уже сто раз проверил... Жалко IDE не позволяет трассировать программу.

Если бы косяк был в программе, то у вас бы тогда не работало и с одним двигателем, дуина бы не перезапускалась и в сериал-монитор ничего бы не возвращалось. Либо это какой-то глюк библиотеки.

Попробуйте вот эту www.freeduino.ru/arduino/files/AFMotor-08_12_2009.zip

maksim
Offline
Зарегистрирован: 12.02.2012

У меня все замечательно работает с двумя двигателями Gekko MR12-100 и с выше упомянутой библой, как с вашим кодом так и с вот этим:

/* 
 w=119
 a=97, s=115, d=100
 x=120
 */

#include <AFMotor.h>

AF_DCMotor rMotor(3);
AF_DCMotor lMotor(4);

byte spd = 255;
byte Val;
byte LastVal;

void setup()
{
  Serial.begin(9600);
}

void loop() 
{
  while(Serial.available())
  {
    Val = Serial.read();
    switch (Val) {

    case 119: // нажатие на клавишу w
      lMotor.run(FORWARD);
      lMotor.setSpeed(spd);
      rMotor.run(FORWARD);  // если, например, закоментировать эти две
      rMotor.setSpeed(spd); // строки, то всё работает нормально...
      Serial.println("FORWARD");
      break;

    case 115: // нажатие на клавишу s
      lMotor.run(RELEASE); 
      rMotor.run(RELEASE);// ...и эту строчку...
      Serial.println("RELEASE");
      break;

    case 120: // нажатие на клавишу x
      lMotor.run(BACKWARD);
      lMotor.setSpeed(spd);
      rMotor.run(BACKWARD); // ...и эти две
      rMotor.setSpeed(spd); //строчки
      Serial.println("BACKWARD");
      break;

    case 97: // нажатие на клавишу a
      lMotor.run(BACKWARD);
      lMotor.setSpeed(spd);
      rMotor.run(FORWARD); // ...и эти две
      rMotor.setSpeed(spd); //строчки
      Serial.println("LEFT");
      break;

    case 100: // нажатие на клавишу d
      lMotor.run(FORWARD);
      lMotor.setSpeed(spd);
      rMotor.run(BACKWARD); // ...и эти две
      rMotor.setSpeed(spd); //строчки
      Serial.println("RIGHT");
      break;

    }
  }
}

И вот что в сериал мониторе:

FORWARD
RELEASE
BACKWARD
RELEASE
LEFT
RELEASE
RIGHT
RELEASE
FORWARD
LEFT
RIGHT
BACKWARD
RELEASE

Tn201 пишет:

Уверяю Вас, что двигатели исправны, шилд тоже, батарейки полны энергии, провода подключены правильно.

И если вы так в этом уверены и уверены в своей библиотеке, я вам больше ничем помочь не могу.

Tn201
Offline
Зарегистрирован: 04.05.2012

 Ура!!! Всё заработало!

Что было сделано:

1. Разобрал на ночь всю систему;

2. В очередной раз перезаписал библиотеку (хотя по размеру она такая же, как и была, но контрольными суммами не пользовался)

Запустил, и вдруг всё пошло...

Такое ощущение, что Фридуина, отстёгнутая на ночь от МоторШилда, как бы "обнулилась" полностью. Такое может быть? Или это мои фантазмы? А если честно, то я так и не понял, что произошло...

В любом случае, maksim, огромное спасибо за помощь и поддержку! Трудно в одиночку бодаться с неизвестным врагом.

Удачи Вам!