моторшилд от DK

DireSnake
DireSnake аватар
Offline
Зарегистрирован: 15.01.2013

помогите разобраться в чем проблема.

Арудиино уно подключен мотор шилд (dk electronics motor shield) с двумя коллекторными моторами. на каналы М1 и М2 соответственно.

 

AF_DCMotor motor_left(1);
AF_DCMotor motor_right(2);

далее, по двум параметрам их проверяю:

если нет активации кнопок:

 

motor_left.run(RELEASE);
motor_right.run(RELEASE);

если есть:

 

motor_left.run(FORWARD);
motor_left.setSpeed(0xFF);//100%
motor_right.run(FORWARD);
motor_right.setSpeed(0xFF);//100%



но по непонятной причине - запускается только один мотор. второй - молчит. пытался менять местами - тогда работает другой мотор, но первый - стоит. т..е проблема где-то в каналах, а моторы работающие. пытался сменить каналы на М3 и М4 - ситуация никак не изменилась. 



может ли быть где-нибудь конфликт с xBee шилдом? как можно проверить? просто данные для запуска моторов идут именно через XBee...

AS
Offline
Зарегистрирован: 12.03.2014

Мне кажется, что из приведенного кода совершенно не ясно, где у вас не работает. Давайте код целиком. Со своей стороны вопрос: а на описание вашего шилда ссылочку не дадите?

DireSnake
DireSnake аватар
Offline
Зарегистрирован: 15.01.2013
#include <AFMotor.h>
//----------------
byte zero;
byte my_hex;
byte buf[11];
//описания моторов
AF_DCMotor motor_left(1);
AF_DCMotor motor_right(2);
//------------------
void setup(void)
{
Serial.begin(9600);
}
void loop(void)
{
//--блок чтения данных с джойстика
if (Serial.available() >11) 
  { 
      buf[0] = Serial.read(); //#0B
      buf[1] = Serial.read(); //#0E
      buf[2] = Serial.read(); //x
      buf[3] = Serial.read(); //y
      buf[4] = Serial.read(); //z
      buf[5] = Serial.read(); //rz 
      buf[6] = Serial.read(); //button_a
      buf[7] = Serial.read(); //button_b
      buf[8] = Serial.read(); //button_c
      buf[9] = Serial.read(); //hat
      buf[10] = Serial.read(); //#OD
      buf[11] = Serial.read(); //#OA
  }
// -----------LEFT-STICK----------------------------------
  if (buf[2]==0x80 && buf[3]==0x80) //нет направления
    {
      motor_left.run(RELEASE);
      motor_right.run(RELEASE);
     }
  if (buf[3]==0xFF && buf[2]==0x80) //направление - вперед
    {
      motor_left.run(FORWARD);
      motor_left.setSpeed(0xFF);//100%
      motor_right.run(FORWARD);
      motor_right.setSpeed(0xFF);//100%
     }
  if (buf[3]==0x00 && buf[2]==0x80)//направление - назад
    {
      motor_left.run(BACKWARD);
      motor_left.setSpeed(0xFF);//100%
      motor_right.run(BACKWARD);
      motor_right.setSpeed(0xFF);//100%
    }
}

Соответсвенно, данные читаются с порта (туда передаются по xBee радиоканалу), раскладываются в буфер и оттуда уже командуют моторами.  но - на команду движения вперед/назад (buf[3]) работает только один мотор.

сам мотор шилд аналог http://arduino.shopium.ua/products/arduino-motor-and-servo-shield-001/

 

DireSnake
DireSnake аватар
Offline
Зарегистрирован: 15.01.2013

при этом тестовый блок:

#include <AFMotor.h>
//описания моторов
AF_DCMotor motor_left(1);
AF_DCMotor motor_right(2);
//------------------
void setup(void)
{
Serial.begin(9600);
}
void loop(void)
{
      motor_left.run(FORWARD);
      motor_left.setSpeed(0xFF);//100%
      motor_right.run(FORWARD);
      motor_right.setSpeed(0xFF);//100%
}

работает нормально. 

maksim
Offline
Зарегистрирован: 12.02.2012
byte buf[11];
      buf[0] = Serial.read(); //#0B
      buf[1] = Serial.read(); //#0E
      buf[2] = Serial.read(); //x
      buf[3] = Serial.read(); //y
      buf[4] = Serial.read(); //z
      buf[5] = Serial.read(); //rz 
      buf[6] = Serial.read(); //button_a
      buf[7] = Serial.read(); //button_b
      buf[8] = Serial.read(); //button_c
      buf[9] = Serial.read(); //hat
      buf[10] = Serial.read(); //#OD
      buf[11] = Serial.read(); //#OA

посчитайте

DireSnake
DireSnake аватар
Offline
Зарегистрирован: 15.01.2013

"посчитайте"

нет. тут все нормально. в смысле - не мешает. данные принимаются и вообще никак не мешают. проблема исключительно в обработке данных. т.е. приходит buf[2]=0xFF - два движка должны крутить вперед. Однако - крутит только один. и почему - непонятно. 

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

DireSnake пишет:

нет. тут все нормально. в смысле - не мешает. 

Ну нет, так нет. Значит и то что один двигатель крутится - это тоже нормально и не мешает.

DireSnake
DireSnake аватар
Offline
Зарегистрирован: 15.01.2013

исправил. работает. правильно работает. теперь вопрос "почему? оО"

AS
Offline
Зарегистрирован: 12.03.2014

тема уже не раз поднималась. инициализация массива и обращение к его элементам разработчиками с++ сделаны по-разному. 

Например, инициализация массива с двумя элементам int s[2], a обращение к элементам s[0], s[1]. Вот такая путаница, которую надо учтывать при работе с массивами. Хочу обратить ваше внимание на Библию:

http://arduino.ru/Reference/Array

Индексация массива начинается с 0. Это значит, что для массива с 10-тью элементами, индекс 9 будет последним:

int myArray[10]={9,3,2,4,3,2,7,8,9,11};
     // myArray[0]    первый элемент, содержит 9
     // myArray[9]    последний элемент, содержит 11
     // myArray[10]   это неверно возможно возвращение произвольного значения из области памяти не относящийся к массиву

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

А какая тут путаница ? В байте восемь бит причем первый бит имеет нулевой индекс. Так повелось изначально. Ноль является полноценным индексом и все массивы начинаются с него. Так проще делать циклы и адресовать данные. Естественно, что если нулевой индекс указывает на  элемент массива, то посчитав количество элементов увидим, что оно (количество) на единицу больше индекса последнего элемента. Так что не нужно ничего запоминать, нужно просто поминать. Еще как пример для понимания: у любого процессора существует ячейка памяти или порт с адресом 0, это когда на всех адресных шинах выставляются логические нули, что же ее теперь не использовать ?

DireSnake
DireSnake аватар
Offline
Зарегистрирован: 15.01.2013

адресация - это все понятно. массив - тоже. но - даже с учетом ошибки в этом - в буфер [0]...[11] данные поступали. да, в последнем постоянно наблюдал какую-то ошибку. тогда решил что это баг передачи данных. но у меня 0-1 и 11-12 - это контрольные маркеры. так что в буфер "полезных" данных все приходило правильно. проверялось быстро собранным lcd-логгером, дабы исключить поступление данных обратно в буфер обмена. 

НО, возвращаясь в проблеме: КАК ошибка в получении одного данного (причем никак не используемого) - МЕШАЛА работе одного из моторов? оО