UNO + Commotion motor shield. 2 движка из 4 крутят только в одну сторону

rinerk
Offline
Зарегистрирован: 05.09.2016

Есть проект ровера на колесах mecanum. Управление с пульта Spektrum DX 6i.

Собрана рама. К движкам припаяны провода.

Движки такие ( не реклама) https://www.terraelectronica.ru/catalog_info.php?CODE=1071480

Motor shield - Dagu Commotion (не реклама) https://www.terraelectronica.ru/catalog_info.php?CODE=1112650

Ну и Arduino UNO R3. 

Шилд сконфигурирован в данный момент не под колеса Mecanum, а под "обычный" ровер.

Проблема в том что при подключении моторов 2 мотора по диагонали крутят как положено назад и вперед, а другие 2 только в одну сторону. При переподключении "адекватных" моторов вместо "неадекватных" они ведут себя как "неадекватные". И индикаторы соответственно себя ведут также: 2 как положено горят зеленым вперед и красным назад, а 2 только красным при движении вперед и назад.

Подключал другие движки - все точно также.

Пытался найти схожую проблему на разных форумах, но тщетно. 

Подскажите в какую сторону копать начинающему.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, да что ж такое то? Второй раз за пять минут одно и тоже. Схема и скетч серектны или ДСП?

nevkon
Offline
Зарегистрирован: 20.01.2015

Одно из 2 - либо один чип горелый на плате шилда (и при чем тут было движки то тестить, менять местами?) либо не приходит сигнал дир на чип. Маркировку чипа, а лучше сразу ссылку на даташит его. Или сами прочитайте даташит и прозвоните.

Ну и как вариант вы не тот пин(ы) указали для сигнала дир.

rinerk
Offline
Зарегистрирован: 05.09.2016

Все что есть у меня - это манул к шилду. http://www.electronshik.ru/z/Datasheet/C/ComMotion-Manual.pdf

вечером скетч закину - может в нем косяк, а прозвонка для меня - за гранью возможного. 

rinerk
Offline
Зарегистрирован: 05.09.2016

Схему смысла рисовать нет. все просто. Прямо в Ардуино вставляется шилд. на 2 и 3 pin приходят сигналы с приемника. с шилда берется 5В для питания приемника. К соответствующим разъемам шилда подключены моторы. Питание от аккума 11,1В. Ардуино питается от шилда

Вот скетч 

#include <Wire.h>  //подключаем библиотеку для обмена по I2C
#include <ComMotion.h>


#define RC_NEUTRAL 1508  // Положение центра
#define RC_MAX 1900      // Максимум
#define RC_MIN 1100      // Минимум
#define RC_DEADBAND 40   // Мертвая зона по УПРАВЛЕНИЮ

int unSteeringMin = RC_MIN;
int unSteeringMax = RC_MAX;
int unSteeringCenter = RC_NEUTRAL;

int unThrottleMin = RC_MIN;
int unThrottleMax = RC_MAX;
int unThrottleCenter = RC_NEUTRAL;

#define PWM_MIN -255        // Минимальные обораты движков
#define PWM_MAX 255      // Максимальные обораты движков

#define GEAR_NONE 1
#define GEAR_IDLE 1
#define GEAR_FULL 2

#define PWM_SPEED_LEFT 10
#define PWM_SPEED_RIGHT 11

#define THROTTLE_IN_PIN 2 // Подключаем ГАЗ на пин 2
#define STEERING_IN_PIN 3 // Подключаем УПРАВЛЕНИЕ на пин 3

#define IDLE_MAX 80       // Мертвая зона по ГАЗУ

int unThrottleInShared;
int unSteeringInShared;

int ulThrottleStart;                //беззнаковое целое число 32 бита
int ulSteeringStart;

int gThrottle = 0;
int gGear = GEAR_NONE;
int gOldGear = GEAR_NONE;

int gAngle = 0;
int gRotation = 0;

#define DIRECTION_STOP 0                   //#define constantName value
#define DIRECTION_FORWARD 1
#define DIRECTION_REVERSE 2
#define DIRECTION_ROTATE_RIGHT 3
#define DIRECTION_ROTATE_LEFT 4

int gThrottleDirection = DIRECTION_STOP;
int gDirection = DIRECTION_STOP;
int gOldDirection = DIRECTION_STOP;


// AF_DCMotor motor3(3); //pin 5 подключаем мотор 3
// AF_DCMotor motor4(4); // pin 6 подключаем мотор 4
// pinы 8 и 12 отвечают за выбор направления движения

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

  attachInterrupt(0,calcThrottle,CHANGE); //подключаем прерывание на pin 2
  attachInterrupt(1,calcSteering,CHANGE); //подключаем прерывание на pin 3

 Wire.begin (30);    // Required to support I2C communication
 
 // Send Basic Configuration packet to controller
 // See ComMotion.h for arguement definitiion list 
   BasicConfig(0,19,1,250,250,250,250,0,1);   
 
}

void loop()
{
static int unThrottleIn; 
static int unSteeringIn;
{
unThrottleIn = unThrottleInShared;      // Присваиваем вычисленные значение со входа переменной
}
{
unSteeringIn = unSteeringInShared;    // Присваиваем вычисленные значение со входа переменной
} 
//СЧИТАЕМ ГАЗ 
{
unThrottleIn = constrain(unThrottleIn,unThrottleMin,unThrottleMax); // проверяем находится ли значение unThrottleIn в заданных пределах и выравниваем его по ним
}     
      {
        gThrottle = map(unThrottleIn,unThrottleMin,unThrottleMax,PWM_MIN,PWM_MAX);  //Значение на входе устанавливаем пропорционально как значение оборотов 
                            //map(value, fromLow, fromHigh, toLow, toHigh)
      }
      
//СЧИТАЕМ УГОЛ     
      {
       unSteeringIn = constrain(unSteeringIn,unSteeringMin,unSteeringMax);     // проверяем находится ли значение unSteeringIn в заданных пределах и выравниваем его по ним
      }

      {
       gAngle = map(unSteeringIn,unSteeringMin,unSteeringMax,PWM_MAX,PWM_MIN); //Значение лев и прав ГАЗА преобразуем в PWM
        }
             
     {
    
    IndividualMotorControl(gThrottle,gThrottle,gThrottle,gThrottle); // Задаем движение
   
    }

Serial.println("THROTTLE");
Serial.println(unThrottleInShared); 
Serial.println(unThrottleIn);  
Serial.println(gThrottle);  
Serial.println("ANGLE");
Serial.println(unSteeringInShared);
Serial.println(unSteeringIn);  
Serial.println(gAngle);  
// Serial.println("ROTATION");
// Serial.println(unSteeringInShared);
// Serial.println(unSteeringIn);  
// Serial.println(gAngle); 


delay(1000);
}

void calcThrottle()                              // ОТДЕЛЬНАЯ ФУНКЦИЯ Считываем ГАЗ
{
  // if the pin is high, its a rising edge of the signal pulse, so lets record its value
  if(digitalRead(THROTTLE_IN_PIN) == HIGH)
  {
    ulThrottleStart = micros();
  }
  else
  {
    // else it must be a falling edge, so lets get the time and subtract the time of the rising edge
    // this gives use the time between the rising and falling edges i.e. the pulse duration.
    unThrottleInShared = (int)(micros() - ulThrottleStart);
    // use set the throttle flag to indicate that a new throttle signal has been received
//  bUpdateFlagsShared |= THROTTLE_FLAG;                                                                                ПОГАСИЛ ФЛАГ
  }
}

void calcSteering()                               // // ОТДЕЛЬНАЯ ФУНКЦИЯ Считываем УПРАВЛЕНИЕ
{
  if(digitalRead(STEERING_IN_PIN) == HIGH)
  {
    ulSteeringStart = micros();
  }
  else
  {
    unSteeringInShared = (int)(micros() - ulSteeringStart);
// bUpdateFlagsShared |= STEERING_FLAG;                                                                                        ПОГАСИЛ ФЛАГ
  }
}
  

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

rinerk пишет:

Схему смысла рисовать нет. все просто. 

Ну, на нет и суда нет. Если всё просто - сами разберётесь.

nevkon
Offline
Зарегистрирован: 20.01.2015

Кстати шилд немного странный. На нем стоит 2 МК atmega328 и на двигатели питание идет по Н мосту, на обратной стороне шилда по 4 транзистора видно. В принципе все это я вычитал из описания. Неплохо бы увидеть схему шилда, а то не очень понятно что как подключается с ардуины и на кой она вообще нужна при наличии 2 МК на борту.

rinerk
Offline
Зарегистрирован: 05.09.2016

Шилд может работать и самостоятельно судя по описанию с дополнительными модулями.

Вчера поковырял еще его. Нашел демку. Ей пытался исключить вероятность присутствия в моем скетче чего-то не того, но результат тотже - 2 как надо и 2 через ж...пу. Видимо все же с шилдом беда. И перепрошить он себя не дает согласно манула - выдает ошибку.

Вот скетч демки

/**   ComMotion3.ino - Like ComMotion2 but support I2C functiona are kept 
      in a separate include file, 
   
   ComMotion Motor Controller Shield (Sparkfun ROB-13257) Testing.  
   
   The I2C protocol is used to support communication between the ComMotion shield 
   and the Arduino UNO microcontroller. 
   +------------------+              +----------------------+
   |                  |              | ComMotion Controller |                        
   | Arduino UNO      |              | Sparkfun  ROB-13257  |
   |                  |    Normal    | Note 1               |           
   |                  |    Shield    |                      |           +---------+
   |                  |<============>|                 M1 + |<-- Grn -->| Motor 1 |
   |                  |  Connections |                 M1 - |<-- Wht -->|         |
   |                  |              |                      |           +---------+
   |                  |              |                      |           +---------+           
   |                  |              |                 M2 + |<--     -->| Motor 2 |
   |                  |              |                 M2 - |<--     -->|         |
   +------------------+              |                      |           +---------+
                                     |                      |           +---------+                
                                     |                 M3 + |<--     -->| Motor 3 |
                                     |                 M3 - |<--     -->|         |                                 
                                     |                      |           +---------+
                 + 6-16 v -- Red --> | +                    |           +---------+
                     Gnd  ---------> | -               M4 + |<--     -->| Motor 4 |
                                     |                 M4 - |<--     -->|         |
                                     |                      |           +---------+
                                     +----------------------+     
                                   
    Note 1: With the Vin jumper OFF, the PC USB port powers the Arduino and
            the ComMotion controller is powered by the separate 12 V supply. 
            
            If you want to run the Arduino/ComMotion controller combination 
            WITHOUT a connection to the PC USB port, install the jumper on the 
            ComMotion controller card at Vin.  The Arduino will then get 5 volt 
            power from the ComMotion card
            
   Note 2: To use the I2C default address assignments, make sure the four address 
           selection DIP switches are all in the OFF position.
           
   Note 3: See the May 2015 comment exchange at the link below between OddBot, 
           the board developer and gadgetry, a knowledgeable user regarding what works
           on this controller and what doesn't. (Short summary: Motor control such as 
           start/stop/reverse/forward/speed work fine. gadgetry reports that the board 
           properly uses encoder feedback for motor speed control. But, returning battery 
           voltage, motor current and the like via the ComMotionStatus() function DOES 
           NOT WORK, and probably will never be fixed.  
           
           http://letsmakerobots.com/commotion-shield-omni-and-mecanum-wheel-robots...
           To view exchange, scroll down to the comment section at the bottom of the page.
    STATUS: Version 1.0          
             
*/

#include <Wire.h>
#include <ComMotion.h>

void setup() {


   Wire.begin (1);         // Required to support I2C communication
   Serial.begin(9600);
   
   // Send Basic Configuration packet to controller
   // See ComMotion.h for arguement definitiion list 
   BasicConfig(0,19,60,250,250,250,250,0,1);      
   
   Serial.println("Starting ComMotion3 ...");
   IndividualMotorControl(0,0,0,0); 
   delay(5000);         
}

void loop (){
      // Speed commands for the four motors. 
      // + = forward, - = reverse
      // Speed = 1..255 with 0 = stop   
      Serial.println("50% forward for 5 sec.");      
      IndividualMotorControl(128,128,128,128); 
      delay(5000);
     
      Serial.println("50% reverse for 5 sec.");      
      IndividualMotorControl(0,0,0,0); 
      delay(2000);      
      IndividualMotorControl(-128,-128,-128,-128); 
      delay(5000);        
      
      Serial.println("Ramp to full speed, 5 sec per step");                 
      for (int i=0; i<255; i+= 25){
         Serial.print("Speed command: "); Serial.println(i);
         IndividualMotorControl(i,i,i,i);
         delay(5000);
      }      
      Serial.println("Start over in 10 sec.\n");      
      IndividualMotorControl(0,0,0,0); 
      delay(10000);            
}

 

nevkon
Offline
Зарегистрирован: 20.01.2015

Попробуйте сменить управляющий чип - он выбирается переключателем на плате.

rinerk
Offline
Зарегистрирован: 05.09.2016

nevkon пишет:

Попробуйте сменить управляющий чип - он выбирается переключателем на плате.

попробую вечером, спасибо

Алексей С
Offline
Зарегистрирован: 08.05.2020

rinerk пишет:

Шилд может работать и самостоятельно судя по описанию с дополнительными модулями.

Вчера поковырял еще его. Нашел демку. Ей пытался исключить вероятность присутствия в моем скетче чего-то не того, но результат тотже - 2 как надо и 2 через ж...пу. Видимо все же с шилдом беда. И перепрошить он себя не дает согласно манула - выдает ошибку.

Вот скетч демки

/**   ComMotion3.ino - Like ComMotion2 but support I2C functiona are kept 
      in a separate include file, 

Всем доброго времени суток!

Я понимаю, что прошло много времени, но есть у кого правильный скетч на платформу на колесах MECANUM? Ну или ссылка на него)))