Pololu DRV8835

Dikson
Offline
Зарегистрирован: 28.11.2014
Всем, здравствуйте! Я новичек в Ардуино. Давеча начал разбираться с драйвером двигателя Pololu DRV8835. У него своя библиотека. Написал скетч проверочный и не пойму, почему двигатели всегда крутятся, причем один быстрее другого? Вне зависимости от проверочной команды if.

#include "Servo.h"
#include "Ultrasonic.h"
Ultrasonic ultrasonic(11, 5);
#include <DRV8835MotorShield.h>
DRV8835MotorShield motors;
Servo serva;
int x=0;
int y=0;
int speed = 0;
void setup(){serva.attach(3);
serva.write(123);}
void loop()
{
if (ultrasonic.Ranging(CM)<=25)
{goto prog1;delay(2);}
else {int speed = 100; motors.setM1Speed(-speed);
motors.setM2Speed(-speed);delay(2);}

prog1:
   serva.write(143);
   delay (1000);
  if (ultrasonic.Ranging(CM)<=25)
{x=x+1;serva.write(163);delay(1000);}
  else
{serva.write(163);delay(1000);}
  if (ultrasonic.Ranging(CM)<=25)
{x=x+1;serva.write(183);delay(1000);}
  else
{serva.write(183);delay(1000);}
  if (ultrasonic.Ranging(CM)<=25)
{x=x+1;serva.write(203);delay(1000);}
  else
{serva.write(203);delay(1000);}
  if (ultrasonic.Ranging(CM)<=25)
{x=x+1;serva.write(43);delay(1000);}
  else
{serva.write(43);delay(1000);}
  if (ultrasonic.Ranging(CM)<=25)
{y=y+1;serva.write(63);delay(1000);}
  else
{serva.write(63);delay(1000);}
  if (ultrasonic.Ranging(CM)<=25)
{y=y+1;serva.write(83);delay(1000);}
  else
{serva.write(83);delay(1000);}
  if (ultrasonic.Ranging(CM)<=25)
{y=y+1;serva.write(103);delay(1000);}
  else
{serva.write(103);delay(1000);}
  if (ultrasonic.Ranging(CM)<=25)
{y=y+1;serva.write(123);delay(1000);}
  else
{serva.write(123);delay(1000);}

 
Подружить не получается сервопривод, два двигателя и ультразвуковой сенсор. В паре работают в любой комбинации. Только что делал двигатели и ультразвук - работают, платформа останавливается при приближении к препятствию и поворачивается в право. Сервопривод с ультразвуком тоже работает, все поворачивается. А вместе втроем не хотят работать(. 
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

оформи нормально. посмотри как вставлять код правильно. 1 сообщение не редактируется

Dikson
Offline
Зарегистрирован: 28.11.2014

Всем, здравствуйте! Я новичек в Ардуино. Давеча начал разбираться с драйвером двигателя Pololu DRV8835. У него своя библиотека. Написал скетч проверочный и не пойму, почему двигатели всегда крутятся, причем один быстрее другого? Вне зависимости от проверочной команды if. Подружить не получается сервопривод, два двигателя и ультразвуковой сенсор. В паре работают в любой комбинации. Только что делал двигатели и ультразвук - работают, платформа останавливается при приближении к препятствию и поворачивается в право. Сервопривод с ультразвуком тоже работает, все поворачивается. А вместе втроем не хотят работать(.

#include "Servo.h"
#include "Ultrasonic.h"
Ultrasonic ultrasonic(11, 5);
#include <DRV8835MotorShield.h>
DRV8835MotorShield motors;
Servo serva;
int x=0;
int y=0;
int speed = 0;
void setup(){serva.attach(3);
serva.write(123);}
void loop()
{
if (ultrasonic.Ranging(CM)<=25)
{goto prog1;delay(2);}
else {int speed = 100; motors.setM1Speed(-speed);
motors.setM2Speed(-speed);delay(2);}

prog1:
   serva.write(143);
   delay (1000);
  if (ultrasonic.Ranging(CM)<=25)
{x=x+1;serva.write(163);delay(1000);}
  else
{serva.write(163);delay(1000);}
  if (ultrasonic.Ranging(CM)<=25)
{x=x+1;serva.write(183);delay(1000);}
  else
{serva.write(183);delay(1000);}
  if (ultrasonic.Ranging(CM)<=25)
{x=x+1;serva.write(203);delay(1000);}
  else
{serva.write(203);delay(1000);}
  if (ultrasonic.Ranging(CM)<=25)
{x=x+1;serva.write(43);delay(1000);}
  else
{serva.write(43);delay(1000);}
  if (ultrasonic.Ranging(CM)<=25)
{y=y+1;serva.write(63);delay(1000);}
  else
{serva.write(63);delay(1000);}
  if (ultrasonic.Ranging(CM)<=25)
{y=y+1;serva.write(83);delay(1000);}
  else
{serva.write(83);delay(1000);}
  if (ultrasonic.Ranging(CM)<=25)
{y=y+1;serva.write(103);delay(1000);}
  else
{serva.write(103);delay(1000);}
  if (ultrasonic.Ranging(CM)<=25)
{y=y+1;serva.write(123);delay(1000);}
  else
{serva.write(123);delay(1000);}

}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

это что еще за goto))) зачем?

Dikson
Offline
Зарегистрирован: 28.11.2014

Согласен, неазчем. Но я думал, что закливание происходит на строке двигателей, каким то образом. И решил принудительно отправить на нужную строку

Dikson
Offline
Зарегистрирован: 28.11.2014

Суть в том, чтобы платформа при обнаружении препятствия останавливалась и начинала крутить сервой по сторонам, делая замер дистанции на каждом повороте сервы с шагом 20 градусов. Чтобы потом решить в какую сторону поворачиваться от препятствия.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

оформи нижнюю часть как функцию, условие если растояние меньше ... то остановить двигатель и вызвать эту функцию

Dikson
Offline
Зарегистрирован: 28.11.2014

Сделал вот так, все равно работает неадекватно. Серва вообще молчит, хотя указано выставить в void setup на 123 градуса. Серву поменял на другую, такая же ситуация, как буд-то конфликтует оборудование друг с другом. Питание от 4х аккумов, 5.37В. Запитанно на драйвер двигателя, с него питается Ардуино.

#include "Servo.h"
#include "Ultrasonic.h"
Ultrasonic ultrasonic(11, 5);
#include <DRV8835MotorShield.h>
DRV8835MotorShield motors;
Servo serva;
int r = 0;
int (x)=0;
int (y)=0;
int speed = 100;
void setup(){
serva.attach(3);
serva.write(123);
}
void loop()
{ float dist_cm = ultrasonic.Ranging(CM);
  motors.setM1Speed(-speed);
  motors.setM2Speed(-speed);
  delay (100);
  while (dist_cm <= 8)
  {motors.setM1Speed(0);
  motors.setM2Speed(0);serva.write(143);
 delay (1000);
          if (ultrasonic.Ranging(CM)<=8)
{x=x+1;serva.write(163);delay(1000);}
          else 
{serva.write(163);delay(1000);}
          if (ultrasonic.Ranging(CM)<=8)
{x=x+1;serva.write(183);delay(1000);}
          else 
{serva.write(183);delay(1000);}
          if (ultrasonic.Ranging(CM)<=8)
{x=x+1;serva.write(203);delay(1000);}
          else 
{serva.write(203);delay(1000);}
          if (ultrasonic.Ranging(CM)<=8)
{x=x+1;serva.write(43);delay(1000);}
          else 
{serva.write(43);delay(1000);}
          if (ultrasonic.Ranging(CM)<=8)
{y=y+1;serva.write(63);delay(1000);}
          else 
{serva.write(63);delay(1000);}
          if (ultrasonic.Ranging(CM)<=8)
{y=y+1;serva.write(83);delay(1000);}
          else 
{serva.write(83);delay(1000);}
          if (ultrasonic.Ranging(CM)<=8)
{y=y+1;serva.write(103);delay(1000);}
          else 
{serva.write(103);delay(1000);}
          if (ultrasonic.Ranging(CM)<=8)
{y=y+1;serva.write(123);delay(1000);}
          else 
{serva.write(123);delay(1000);}

}
delay (100);
}

 

Radjah
Offline
Зарегистрирован: 06.08.2014

А для чего вот эта пачка if..else?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

чтобы интереснее было

Dikson
Offline
Зарегистрирован: 28.11.2014

Для того чтобы в конце получить некое суммарное значение измерений Х и Y, и сравнить их между собой. Просто пока не знаю, как по другому это реализовать. Может код и не совсем красивый, но я его еще не оптимизировал. Он просто не работает, а ошибки не вижу. Вот и попросил совета у знающих.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я честно сказать на тот кусок и не смотрел почти. оформление убивает и отбивает желание смотреть что там делается

Dikson
Offline
Зарегистрирован: 28.11.2014

Arduino UNO  R3 стоит на гусеничной платформе с двумя электродвигателями. На платформе также стоит сервопривод SG90 к которому прикреплен датчик HC-SR04. Задача: ехать прямо, выровнять датчик сервоприводом в сторону движения serva.write(123) (методом тыка был обнаружен угол в 123 градуса, который соответствует направлению движения и направлению датчика), при срабатывании ultrasonic.Ranging(CM)<=8 остановиться и начать оглядываться сервой с шагом по 20 градусов со стрельбой датчика, при этом если при повороте на 20 градусов датчик обнаруживает препятствие ultrasonic.Ranging(CM)<=8, то к числу х(по умолчанию 0) приплюсовывается 1, если не обнаруживает, то 0. Сделав замеры в одной стороне, приступить к замерам с другой стороны. Там выступает число y. с такой же логикой приращения. После окончания замеров выполнить операцию z=x-y и определить, в какую сторону повернть, по логике if z>0 то влево(например), else if z<0 то вправо, else вообще назад поехать (тупик). Но до конца код не написан, т.к. тупо не работает первая часть его. Сервопривод не работает и двигатели не останавливаются.

Dikson
Offline
Зарегистрирован: 28.11.2014

jeka_tm пишет:

я честно сказать на тот кусок и не смотрел почти. оформление убивает и отбивает желание смотреть что там делается

Ну я писал, как думал. Оптимизацией еще не занимался. Начинающий. Не все еще понимаю.

Radjah
Offline
Зарегистрирован: 06.08.2014

В IDE есть сочетание Ctrl+T для автоматического форматирования текста.

В итге получаем:

#include "Servo.h"
#include "Ultrasonic.h"
#include <DRV8835MotorShield.h>
Ultrasonic ultrasonic(11, 5);
DRV8835MotorShield motors;
Servo serva;
int r = 0;
int (x) = 0;
int (y) = 0;
int speed = 100;
void setup() {
  serva.attach(3);
  serva.write(123);
}
void loop()
{ float dist_cm = ultrasonic.Ranging(CM);
  motors.setM1Speed(-speed);
  motors.setM2Speed(-speed);
  delay (100);
  while (dist_cm <= 8)
  { motors.setM1Speed(0);
    motors.setM2Speed(0); serva.write(143);
    delay (1000);
    if (ultrasonic.Ranging(CM) <= 8)
    {
      x = x + 1;
      serva.write(163);
      delay(1000);
    }
    else
    {
      serva.write(163);
      delay(1000);
    }
    if (ultrasonic.Ranging(CM) <= 8)
    {
      x = x + 1;
      serva.write(183);
      delay(1000);
    }
    else
    {
      serva.write(183);
      delay(1000);
    }
    if (ultrasonic.Ranging(CM) <= 8)
    {
      x = x + 1;
      serva.write(203);
      delay(1000);
    }
    else
    {
      serva.write(203);
      delay(1000);
    }
    if (ultrasonic.Ranging(CM) <= 8)
    {
      x = x + 1;
      serva.write(43);
      delay(1000);
    }
    else
    {
      serva.write(43);
      delay(1000);
    }
    if (ultrasonic.Ranging(CM) <= 8)
    {
      y = y + 1;
      serva.write(63);
      delay(1000);
    }
    else
    {
      serva.write(63);
      delay(1000);
    }
    if (ultrasonic.Ranging(CM) <= 8)
    {
      y = y + 1;
      serva.write(83);
      delay(1000);
    }
    else
    {
      serva.write(83);
      delay(1000);
    }
    if (ultrasonic.Ranging(CM) <= 8)
    {
      y = y + 1;
      serva.write(103);
      delay(1000);
    }
    else
    {
      serva.write(103);
      delay(1000);
    }
    if (ultrasonic.Ranging(CM) <= 8)
    {
      y = y + 1;
      serva.write(123);
      delay(1000);
    }
    else
    {
      serva.write(123);
      delay(1000);
    }
  }
  delay (100);
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а цикл организовать для сканирования все пространства перед платформой? значения записать в массив. затем в новом  цикле обрабатываешь значения в массиве. и исходя из этого уже будешь знать где препятствие и что делать дальше

я бы так наверно сделал

Dikson
Offline
Зарегистрирован: 28.11.2014

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

Dikson
Offline
Зарегистрирован: 28.11.2014

Ну либа официальная, скачана с сайта Pololu конкретно для этого шилда на микросхеме DRV8835. Может она просто с библиотекой Servo не дружит.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

то что официаольная ничего не значит. может по таймерам конфликт

Dikson
Offline
Зарегистрирован: 28.11.2014

А Вы можете посмотреть, я просто не шарю пока в библиотеках? https://github.com/pololu/drv8835-motor-shield/tree/master/DRV8835MotorShield отсюда скачивал.