UNO + Commotion motor shield. 2 движка из 4 крутят только в одну сторону
- Войдите на сайт для отправки комментариев
Есть проект ровера на колесах 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 только красным при движении вперед и назад.
Подключал другие движки - все точно также.
Пытался найти схожую проблему на разных форумах, но тщетно.
Подскажите в какую сторону копать начинающему.
Блин, да что ж такое то? Второй раз за пять минут одно и тоже. Схема и скетч серектны или ДСП?
Одно из 2 - либо один чип горелый на плате шилда (и при чем тут было движки то тестить, менять местами?) либо не приходит сигнал дир на чип. Маркировку чипа, а лучше сразу ссылку на даташит его. Или сами прочитайте даташит и прозвоните.
Ну и как вариант вы не тот пин(ы) указали для сигнала дир.
Все что есть у меня - это манул к шилду. http://www.electronshik.ru/z/Datasheet/C/ComMotion-Manual.pdf
вечером скетч закину - может в нем косяк, а прозвонка для меня - за гранью возможного.
Схему смысла рисовать нет. все просто. Прямо в Ардуино вставляется шилд. на 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; ПОГАСИЛ ФЛАГ } }Схему смысла рисовать нет. все просто.
Ну, на нет и суда нет. Если всё просто - сами разберётесь.
Кстати шилд немного странный. На нем стоит 2 МК atmega328 и на двигатели питание идет по Н мосту, на обратной стороне шилда по 4 транзистора видно. В принципе все это я вычитал из описания. Неплохо бы увидеть схему шилда, а то не очень понятно что как подключается с ардуины и на кой она вообще нужна при наличии 2 МК на борту.
Шилд может работать и самостоятельно судя по описанию с дополнительными модулями.
Вчера поковырял еще его. Нашел демку. Ей пытался исключить вероятность присутствия в моем скетче чего-то не того, но результат тотже - 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); }Попробуйте сменить управляющий чип - он выбирается переключателем на плате.
Попробуйте сменить управляющий чип - он выбирается переключателем на плате.
попробую вечером, спасибо
Шилд может работать и самостоятельно судя по описанию с дополнительными модулями.
Вчера поковырял еще его. Нашел демку. Ей пытался исключить вероятность присутствия в моем скетче чего-то не того, но результат тотже - 2 как надо и 2 через ж...пу. Видимо все же с шилдом беда. И перепрошить он себя не дает согласно манула - выдает ошибку.
Вот скетч демки
/** ComMotion3.ino - Like ComMotion2 but support I2C functiona are kept in a separate include file,Всем доброго времени суток!
Я понимаю, что прошло много времени, но есть у кого правильный скетч на платформу на колесах MECANUM? Ну или ссылка на него)))