#1 2016-03-06 00:54:49

baspav
Учасник
Зареєстрований: 2015-04-02
Повідомлень: 12

управление бт машинкой ПРО МИНИ + плата драйвера L298N + 2 DC мотора.

Собрал машинку с начинкой Ардуино ПРО МИНИ + плата блютуза HC-06 + плата драйвера L298N + 2 DC мотора
Как и положено в таких случаях - в интернете куча разного... с использованием двухколесных китов, есть так же варианты мотор+серво, но вариантов на 2 мотора я не нашел.
Переработал код с сайта RemoteXY - получилось вот такое:

///////////////////////////////////////////// 
//        RemoteXY include library         // 
///////////////////////////////////////////// 

/* RemoteXY select connection mode and include library */ 
#define REMOTEXY_MODE__SOFTWARESERIAL 
#include <SoftwareSerial.h> 
#include <RemoteXY.h> 

/* RemoteXY connection settings */
#define REMOTEXY_SERIAL_RX 2 
#define REMOTEXY_SERIAL_TX 3 
#define REMOTEXY_SERIAL_SPEED 9600 

/* RemoteXY configurate  */  
unsigned char RemoteXY_CONF[] = 
  { 3,0,23,0,1,5,5,15,41,11
  ,43,43,1,2,0,6,5,27,11,5
  ,79,78,0,79,70,70,0 }; 
   
/* this structure defines all the variables of your control interface */  
struct { 

    /* input variable */
  signed char joystick_1_x; /* =-100..100 x-coordinate joystick position */
  signed char joystick_1_y; /* =-100..100 y-coordinate joystick position */
  unsigned char switch_1; /* =1 if switch ON and =0 if OFF */

    /* other variable */
  unsigned char connect_flag;  /* =1 if wire connected, else =0 */

} RemoteXY; 

///////////////////////////////////////////// 
//           END RemoteXY include          // 
///////////////////////////////////////////// 
/* defined the right motor control pins */
#define PIN_MOTOR_STEERING_UP 5
#define PIN_MOTOR_STEERING_DN 4
#define PIN_MOTOR_STEERING_SPEED 10

/* defined the left motor control pins */
#define PIN_MOTOR_RUNNING_UP 7
#define PIN_MOTOR_RUNNING_DN 6
#define PIN_MOTOR_RUNNING_SPEED 9

/* defined the LED pin */
#define PIN_LED 13


/* defined two arrays with a list of pins for each motor */
unsigned char SteeringMotor[3] = 
  {PIN_MOTOR_STEERING_UP, PIN_MOTOR_STEERING_DN, PIN_MOTOR_STEERING_SPEED};
unsigned char RunningMotor[3] = 
  {PIN_MOTOR_RUNNING_UP, PIN_MOTOR_RUNNING_DN, PIN_MOTOR_RUNNING_SPEED};

/*
   speed control of the motor
   motor - pointer to an array of pins
   v - motor speed can be set from -100 to 100
*/



void setup() {
  /* initialization pins */
  pinMode (PIN_MOTOR_STEERING_UP, OUTPUT);
  pinMode (PIN_MOTOR_STEERING_DN, OUTPUT);
  pinMode (PIN_MOTOR_RUNNING_UP, OUTPUT);
  pinMode (PIN_MOTOR_RUNNING_DN, OUTPUT);
  pinMode (PIN_LED, OUTPUT);

  /* initialization module RemoteXY */
  RemoteXY_Init ();
}

void loop() {
  
  RemoteXY_Handler ();
//  analogRead RemoteXY.joystick_1_y;
//  analogRead RemoteXY.joystick_1_x;
 int vr = RemoteXY.joystick_1_x;
 int vs = RemoteXY.joystick_1_y;
if (vr>0)
{
    digitalWrite(RunningMotor[0], HIGH);
    digitalWrite(RunningMotor[1], LOW);
    analogWrite(RunningMotor[2], vr*2.55);
}
else if (vr<0)
  {
    digitalWrite(RunningMotor[0], LOW);
    digitalWrite(RunningMotor[1], HIGH);
    analogWrite(RunningMotor[2], (-vr)*2.55);
  }
  else 
  {
    digitalWrite(RunningMotor[0], LOW);
    digitalWrite(RunningMotor[1], LOW);
    analogWrite(RunningMotor[2], 0);
  }
  
  if (vs>0) {
    digitalWrite(SteeringMotor[0], HIGH);
    digitalWrite(SteeringMotor[1], LOW);
    analogWrite(SteeringMotor[2], vs*2.55);
  }
  else if (vs<0) {
    digitalWrite(SteeringMotor[0], LOW);
    digitalWrite(SteeringMotor[1], HIGH);
    analogWrite(SteeringMotor[2], (-vs)*2.55);
  }
  else {
    digitalWrite(SteeringMotor[0], LOW);
    digitalWrite(SteeringMotor[1], LOW);
    analogWrite(SteeringMotor[2], 0);
  }
  
  
}

Результат положительный - машинка едет как положено. Но есть трабл. Бесплатная версия RemoteXY работает только 30 сек., а с финансами проблема. Стал искать другие варианты.
Нашел такое  https://www.youtube.com/watch?v=46w362K6BDk
Показалось подходящим, но тут используется MotorShieldR3, а у меня его нет. Попробовал перелепить предложенный автором код под мою конфигурацию. Получилось такое:

/*
  Front Motor (Steering) => Channel A
 Back Motor => Channel B
 
 Since the motor shield hijacks 6 pins for the motors'
 control, they are declared in the MotorShieldR3 library.
 */
 #include <SoftwareSerial.h>  
 
 int bluetoothTx = 2;
 int bluetoothRx = 3;
 SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);
 
 /* defined the right motor control pins */
#define PIN_MOTOR_STEERING_UP 7
#define PIN_MOTOR_STEERING_DN 6
#define PIN_MOTOR_STEERING_SPEED 10

/* defined the left motor control pins */
#define PIN_MOTOR_RUNNING_UP 4
#define PIN_MOTOR_RUNNING_DN 5
#define PIN_MOTOR_RUNNING_SPEED 9

/* 
 #include <MotorShieldR3.h>
MotorShieldR3 yellowCar;*/
#define pinfrontLights    13    //Pin that activates the Front lights.
#define pinbackLights     12    //Pin that activates the Back lights.   
char command = 'S';
int v = 250;   
int timer0 = millis();
int timer1 = 0;


void setup() 
{       
  //Setup Bluetooth serial connection to android
  Serial.begin(115200);  //Set the baud rate to that of your Bluetooth module.
  pinMode(pinfrontLights , OUTPUT);
  pinMode(pinbackLights , OUTPUT);
  
  pinMode (PIN_MOTOR_STEERING_UP, OUTPUT);
  pinMode (PIN_MOTOR_STEERING_DN, OUTPUT);
  pinMode (PIN_MOTOR_RUNNING_UP, OUTPUT);
  pinMode (PIN_MOTOR_RUNNING_DN, OUTPUT);
  
 }

void loop(){
 
  
  digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
  digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
  analogWrite(PIN_MOTOR_STEERING_SPEED, v);
  digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
  digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
  analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
  
  if(Serial.available() > 0){ 
    command = Serial.read(); 
    //Change pin mode only if new command is different from previous.   
    //Serial.println(command);
    switch(command){
    case 'F':  
    //  yellowCar.Forward_4W(velocity);
  digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
  digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
  analogWrite(PIN_MOTOR_STEERING_SPEED, v);
  digitalWrite(PIN_MOTOR_RUNNING_UP, HIGH);
  digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
  analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
      break;
    case 'B':  
    //  yellowCar.Back_4W(velocity);
  digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
  digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
  analogWrite(PIN_MOTOR_STEERING_SPEED, v);
  digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
  digitalWrite(PIN_MOTOR_RUNNING_DN, HIGH);
  analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
      break;
    case 'L':  
    //  yellowCar.Left_4W();
  digitalWrite(PIN_MOTOR_STEERING_UP, HIGH);
  digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
  analogWrite(PIN_MOTOR_STEERING_SPEED, v);
  digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
  digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
  analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
      break;
    case 'R':
    //  yellowCar.Right_4W();  
  digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
  digitalWrite(PIN_MOTOR_STEERING_DN, HIGH);
  analogWrite(PIN_MOTOR_STEERING_SPEED, v);
  digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
  digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
  analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
      break;
    case 'S':  
    //  yellowCar.Stopped_4W();
  digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
  digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
  analogWrite(PIN_MOTOR_STEERING_SPEED, v);
  digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
  digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
  analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
      break; 
    case 'I':  //FR  
    //  yellowCar.ForwardRight_4W(velocity);
  digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
  digitalWrite(PIN_MOTOR_STEERING_DN, HIGH);
  analogWrite(PIN_MOTOR_STEERING_SPEED, v);
  digitalWrite(PIN_MOTOR_RUNNING_UP, HIGH);
  digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
  analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
      break; 
    case 'J':  //BR  
    //  yellowCar.BackRight_4W(velocity);
  digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
  digitalWrite(PIN_MOTOR_STEERING_DN, HIGH);
  analogWrite(PIN_MOTOR_STEERING_SPEED, v);
  digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
  digitalWrite(PIN_MOTOR_RUNNING_DN, HIGH);
  analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
      break;        
    case 'G':  //FL  
    //  yellowCar.ForwardLeft_4W(velocity);
  digitalWrite(PIN_MOTOR_STEERING_UP, HIGH);
  digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
  analogWrite(PIN_MOTOR_STEERING_SPEED, v);
  digitalWrite(PIN_MOTOR_RUNNING_UP, HIGH);
  digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
  analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
      break; 
    case 'H':  //BL
    //  yellowCar.BackLeft_4W(velocity);
  digitalWrite(PIN_MOTOR_STEERING_UP, HIGH);
  digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
  analogWrite(PIN_MOTOR_STEERING_SPEED, v);
  digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
  digitalWrite(PIN_MOTOR_RUNNING_DN, HIGH);
  analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
      break;
    case 'W':  //Font ON 
      digitalWrite(pinfrontLights, HIGH);
      break;
    case 'w':  //Font OFF
      digitalWrite(pinfrontLights, LOW);
      break;
    case 'U':  //Back ON 
      digitalWrite(pinbackLights, HIGH);
      break;
    case 'u':  //Back OFF 
      digitalWrite(pinbackLights, LOW);
      break; 
    case 'D':  //Everything OFF 
      digitalWrite(pinfrontLights, LOW);
      digitalWrite(pinbackLights, LOW);
    //  yellowCar.Stopped_4W();
  digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
  digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
  analogWrite(PIN_MOTOR_STEERING_SPEED, v);
  digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
  digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
  analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
      break;         
    default:  //Get velocity
      if(command=='q'){
        v = 255;  //Full velocity
     //   yellowCar.SetSpeed_4W(velocity);
     
      }
      else{ 
          //Chars '0' - '9' have an integer equivalence of 48 - 57, accordingly.
          if((command >= 48) && (command <= 57)){ 
            //Subtracting 48 changes the range from 48-57 to 0-9.
            //Multiplying by 25 changes the range from 0-9 to 0-225.
            v = (command - 48)*25;       
      //      yellowCar.SetSpeed_4W(velocity);
      
          }
        }
      }
    }
  
  else
  {
    timer0 = millis();  //Get the current time (millis since execution started).
    //Check if it has been 500ms since we received last command.
    if((timer0 - timer1)>500){  
      //More tan 500ms have passed since last command received, car is out of range.
      //Therefore stop the car and turn lights off.
      digitalWrite(pinfrontLights, LOW);
      digitalWrite(pinbackLights, LOW);
   //   yellowCar.Stopped_4W();
  digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
  digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
  analogWrite(PIN_MOTOR_STEERING_SPEED, v);
  digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
  digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
  analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
    }
  }  
}

Код компилируется, но моторы двигаться не хотят.
Пожалуйста, помогите найти и исправить ошибку. Или ссылку на рабочий код под мою конфигурацию, если находил кто. Только не отсылайте курить интернет - у меня за пол года от всего этого дыма голова раскалывается уже...

Остання редакція baspav (2016-03-06 10:35:36)

Неактивний

#2 2016-03-06 08:07:04

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 876

Re: управление бт машинкой ПРО МИНИ + плата драйвера L298N + 2 DC мотора.

на чёрном фоне не читаемо

Неактивний

#3 2016-03-06 09:32:25

baspav
Учасник
Зареєстрований: 2015-04-02
Повідомлень: 12

Re: управление бт машинкой ПРО МИНИ + плата драйвера L298N + 2 DC мотора.

Прошу прощения - исправил.

Неактивний

#4 2016-03-06 11:35:02

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 876

Re: управление бт машинкой ПРО МИНИ + плата драйвера L298N + 2 DC мотора.

а не пробовали убрать из loop() нафиг
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
  digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
  analogWrite(PIN_MOTOR_STEERING_SPEED, v);
  digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
  digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
  analogWrite(PIN_MOTOR_RUNNING_SPEED, v);

Неактивний

#5 2016-03-06 20:03:41

baspav
Учасник
Зареєстрований: 2015-04-02
Повідомлень: 12

Re: управление бт машинкой ПРО МИНИ + плата драйвера L298N + 2 DC мотора.

Убрал указанное нафиг... результат нулевой. сигнал на моторы не приходит. Хоть бы что "зашуршало, цокнуло"...
Насчет   
analogWrite(PIN_MOTOR_............._SPEED, v);  - не уверен, а 
digitalWrite(PIN_MOTOR_..............., LOW);   - по моему, точно не мешает.
Если Вы о случае:

case 'S': 

  digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
  digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
  analogWrite(PIN_MOTOR_STEERING_SPEED, v);
  digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
  digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
  analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
      break;

- то останавливать машину надо как-то...
если о самой верхней или нижней секции лупа - убрал - без результата.

Остання редакція baspav (2016-03-06 21:37:25)

Неактивний

#6 2016-03-27 22:27:50

Marat
Учасник
Зареєстрований: 2016-01-05
Повідомлень: 12

Re: управление бт машинкой ПРО МИНИ + плата драйвера L298N + 2 DC мотора.

Не понимаю я готовых решений типа: скопировал, залил - заработало. Программирование дарит человеку 2 радости: 1. Радость понимания того, что ты, и как ты это делаешь (радость самого процесса познания), и 2. Радость, когда всё заработало (т.е. радость победы, и над собой в т.ч.).

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

Неактивний

#7 2016-03-28 08:39:44

baspav
Учасник
Зареєстрований: 2015-04-02
Повідомлень: 12

Re: управление бт машинкой ПРО МИНИ + плата драйвера L298N + 2 DC мотора.

И все это я прекрасно понимаю, но  ((( сколько же вас грамотных и все, наверное самоучки, и учитель у всех - интернет... а я сижу, ничего не делаю, в интернет лезть не хочу...  Но с репликами, подобной Вашей, в интернете подсказок больше не становится. А я сажусь заливать в машинку свои куралесы, малый приходит "Дай!" Минут 20 я отговариваюсь, а потом тесты заканчиваются. А принимая во внимание детскую любознательность, в препарированную ребёнком при моём недосмотре машинку заливать что-то будет бессмысленно. )))
Потому и прошу подсказать, куда двигаться.
И еще: есть ли возможность и как, подключив дуину к компу увидеть, какие сигналы приходят (и приходят ли) на неё по зубу? Может не в скетче дело, а в андроиде? (хотя в это я почти не верю).

Неактивний

#8 2016-03-28 16:27:37

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: управление бт машинкой ПРО МИНИ + плата драйвера L298N + 2 DC мотора.

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

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

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

пример Serial.println("Hello, world?");

Неактивний

#9 2016-03-29 00:16:46

Marat
Учасник
Зареєстрований: 2016-01-05
Повідомлень: 12

Re: управление бт машинкой ПРО МИНИ + плата драйвера L298N + 2 DC мотора.

baspav пише:

сколько же вас грамотных и все, наверное самоучки, и учитель у всех - интернет...  А я сажусь заливать в машинку свои куралесы, малый приходит "Дай!"... Потому и прошу подсказать, куда двигаться.
И еще: есть ли возможность и как, подключив дуину к компу увидеть, какие сигналы приходят (и приходят ли) на неё по зубу? Может не в скетче дело, а в андроиде? (хотя в это я почти не верю).

Я действительно самоучка. Только тогда интернетов было мало... Фидонет только начиналась. В своих куралесах Вы бы разобрались, а проблема в том, что Вам нужно заставить работать ЧУЖУЮ программу. Не понимая как она устроена, из каких операторов состоит - это как выслушивание китайской речи, ни разу не заглянув даже в разговорник.

Своему старшему сыну я тоже купил Ардуино в виде набора Матрёшки, чтобы оба сына приходили и говорили "Дай, покажи и расскажи!". Это очень удивительно интересное занятие вместе учиться новому! Даже младший, не умеющий читать пришёл и попросил научить его собирать, понимать и рисовать схемы, ибо школой ещё не отучен от знаний, ещё свежо стремление быть взрослым, т.е. уметь то, что делают взрослые.

Если Вы хотите научиться всему  тому, о чём спрашиваете (и даже большему), то лучший, известный мне, видеокурс по Ардуино у МФТИ "Строим роботов на Ардуино от светофора до 3Д принтера" https://ru.coursera.org/learn/roboty-arduino

С уважением. Марат.

Неактивний

#10 2016-03-30 14:08:21

baspav
Учасник
Зареєстрований: 2015-04-02
Повідомлень: 12

Re: управление бт машинкой ПРО МИНИ + плата драйвера L298N + 2 DC мотора.

Я рад за Ваших детей и Вам мое уважение за такой подход. Только моему сыну всего 3 года, он ещё не разговаривает толком и хочет он машинку, а не дуинку.  С операторами по ходу разбираюсь Чужие программы в слепую не копирую, - стараюсь понять принцип, а потом адаптировать для своей задачи.
Сейчас получил из поднебесной дисплей 16*2 постараюсь посмотреть, что приходит с андроида по зубу в дуинку, потом буду двигаться дальше.
За видео курс спасибо - полезный ресурс. Буду изучать.

Неактивний

#11 2016-03-30 14:43:27

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: управление бт машинкой ПРО МИНИ + плата драйвера L298N + 2 DC мотора.

ладно, как бы я сделал 
bt - для начала подключите к компьютеру  USB-UART
и смотрите что и как шлет ваша программа для управления
далее ноутом  pair вашу машинку и не спеша управляющие команды, 
по коду видно что с терминалки вполне может успешно управляться
если с данными все в порядке
то
if(Serial.available() > 0){
    command = Serial.read();
это меняйте на

//  if(Serial.available() > 0)
{
    command = 'F';
   dealy (1000);
и смотрите что происходит с вашей машинкой,
найдете ошибку, все вернете на свои места

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

[ вырезано цензурой ] RemoteXY Pro 92 грн ???????????
https://play.google.com/store/apps/deta … motexy.pro

Неактивний

#12 2016-03-30 14:45:35

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: управление бт машинкой ПРО МИНИ + плата драйвера L298N + 2 DC мотора.

поздравляю с ребятенком )
не жадничайте ) работайте с ребенком, даже если ему всего 3 годика ) это окупится, и не машинку он хочет а поработать с Вами )

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму