Машинка радиоуправлении не едет назад. Что-то с кодом.

hubll
Offline
Зарегистрирован: 08.03.2015

Всем привет, делаю код для машинки на пульту arduino + nrf24l01 + l298n + джойстик. Сервопривод работает как нужно. А вот двигатель крутиться только в одну сторону. Подскажите, что в коду не правильно.

Передатчик

#include <SPI.h>
#include "RF24.h" 
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL; 
int msg[1]; 
int potpin_1 = A0; 
int val_1; 
int potpin_2 = A1; 
int val_2; 
void setup(void){
radio.begin();
radio.openWritingPipe(pipe); 
}
void loop() {
val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[0] = val_1,radio.write(msg, 1);
val_2 = analogRead(potpin_2),val_2 = map(val_2, 0, 1023, 128, 255),msg[0] = val_2,radio.write(msg, 1);
}

Приемник

#include <Servo.h>
#include <SPI.h>
#include "RF24.h"
Servo servo1;

RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL; 
int msg[1]; 
int data; 
int pos;
// int Y;                        // X axis = left/right
int fspeed;           // forward speed 
int bspeed;           // backward speed
const int in1 = 2;    // direction pin 1
const int in2 = 4;    // direction pin 2
const int ena = 5;    // PWM pin to change speed

void setup()
{
  pinMode(in1, OUTPUT);      // connection to L298n
  pinMode(in2, OUTPUT);      // connection to L298n
  pinMode(ena, OUTPUT);      // connection to L298n
servo1.attach(3); 
delay(50);
radio.begin();
radio.openReadingPipe(1,pipe); 
radio.startListening();
}

void loop()
{
  
if (radio.available())radio.read(msg, 1);
if (msg[0] <127 && msg[0] >-1)data = msg[0], pos = map(data, 0, 126, 7, 177),servo1.write(pos);


if (msg[0] >129 && msg[0] <189)data = msg[0], fspeed = map(data, 189, 129, 0, 255); forward(fspeed);
if (msg[0] >201 && msg[0] <255)data = msg[0], bspeed = map(data, 255, 201, 0, 255); backward(bspeed);
if (msg[0] >190 && msg[0] <200)data = msg[0], stop();



  }
  void stop()
{
  analogWrite(ena, 0);
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
}

void forward(int fspeed)
{
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(ena, fspeed);
}

void backward(int bspeed)
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(ena, bspeed);
}



 

Focus
Offline
Зарегистрирован: 05.04.2015

схемку бы ещё, или фотку хотябы

hubll
Offline
Зарегистрирован: 08.03.2015

Focus пишет:

схемку бы ещё, или фотку хотябы

Вот тут схемка подключения и код, который я использовал как исходный http://www.instructables.com/id/Arduino-wireless-laser-turret/

1 серву я убрал и дописал кодя для драйвера двигателя l298n

Драйвер двигателя подключается вот так:

const int in1 = 2;    // direction pin 1
const int in2 = 4;    // direction pin 2
const int ena = 5;    // PWM pin to change speed

 

Focus
Offline
Зарегистрирован: 05.04.2015

Увидел что драйвер на l298n. Для управления одним мотором помоему нужно 2 провода а не три. На один подавать ШИМ, на другой 0/1 в зависимости от направления.

тут:

18 void setup()
19 {
20   pinMode(in1, OUTPUT);      // connection to L298n direction
22   pinMode(ena, OUTPUT);      // connection to L298n PWM

...

и ещё тут:

44   void stop()
45 {
46   analogWrite(ena, 0);
47

digitalWrite(in1, LOW);

}

 
51 void forward(int fspeed)
52 {
53   digitalWrite(in1, HIGH);
55   analogWrite(ena, fspeed);
56 }
57  
58 void backward(int bspeed)
59 {
60   digitalWrite(in1, LOW);
62   analogWrite(ena, bspeed);
63 }

Ну и проверить правильность подключения к драйверу.

Это я предпологаю что может оно так, проверять неначем )

подробнее о подключении драйвера смотрел тут

hubll
Offline
Зарегистрирован: 08.03.2015

Проверил. Результат не изменился. когда нажимаю джойстик вверх стоит на месте двигатель. когда джойстик не трогаю - двигатель очень медленно вращается, когда джойстик в низ - двигатель начинает разгонятся (работает как нужно).

Подозреваю, что ошибка тут, но немогу найти ее:

if (radio.available())radio.read(msg, 1);
if (msg[0] <127 && msg[0] >-1)data = msg[0], pos = map(data, 0, 126, 7, 177),servo1.write(pos);


if (msg[0] >129 && msg[0] <189)data = msg[0], fspeed = map(data, 189, 129, 0, 255); forward(fspeed);
if (msg[0] >201 && msg[0] <255)data = msg[0], bspeed = map(data, 255, 201, 0, 255); backward(bspeed);
if (msg[0] >190 && msg[0] <200)data = msg[0], stop();

 

Focus
Offline
Зарегистрирован: 05.04.2015

а если в loop {} прописать только backward(255); двигатель будет крутиться назад?
а если в loop {} прописать только forward(255); Будет крутиться вперёд?

Если да, то проверяй, что у тебя в msg[0]. Выводи в сериал то что у тебя в msg[0] при разных положениях джойстика.

напиши сюда, что покажет при крайних положениях и по центру.

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

там два вида схемы для L298. 2 или 3 сигнала на канала

если 2 сигнала то in1 управляет направлением, а in2 скоростью. вот только в одном направлении регулировка будет от 0-255 (255 макс скорость), в другую 255-0 (0 макс скорость). кстати en всегда включен. пинами не управляется

если 3. 1 направление in1=1 in2=0 на EN подавать шим. 2 направление  in1=0 in2=1. шим и там и там 0-255 (255 макс. скорость)

hubll
Offline
Зарегистрирован: 08.03.2015

Focus пишет:

а если в loop {} прописать только backward(255); двигатель будет крутиться назад?
а если в loop {} прописать только forward(255); Будет крутиться вперёд?

Если да, то проверяй, что у тебя в msg[0]. Выводи в сериал то что у тебя в msg[0] при разных положениях джойстика.

напиши сюда, что покажет при крайних положениях и по центру.

Написал так

if (msg[0] >211 && msg[0] <255)data = msg[0],  backward(255);

крутится в одну сторону

затем так 

if (msg[0] >129 && msg[0] <189)data = msg[0], forward(255);

не двигается

 

Focus
Offline
Зарегистрирован: 05.04.2015

hubll пишет:

if (msg[0] >129 && msg[0] <189)data = msg[0], forward(255);

не двигается

может msg[0] никогда не бывает в интервале 129 - 189? а может драйвер не крутит? 

сама о себе функция forward(255); работает? Если её без условий запустить.

hubll
Offline
Зарегистрирован: 08.03.2015

Проверил, forward(255); - работает.

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

hubll
Offline
Зарегистрирован: 08.03.2015

Focus пишет:

может msg[0] никогда не бывает в интервале 129 - 189? а может драйвер не крутит? 

сама о себе функция forward(255); работает? Если её без условий запустить.

а еще таккая штука: 

изначально было так:

if (msg[0] >129 && msg[0] <188)data = msg[0], fspeed = map(data, 189, 129, 30, 250); forward(fspeed);
if (msg[0] >201 && msg[0] <255)data = msg[0], bspeed = map(data, 201, 255, 30, 250); backward(bspeed);
if (msg[0] >190 && msg[0] <200)data = msg[0], stop();

когда пишу только 

if (msg[0] >129 && msg[0] <188)data = msg[0], fspeed = map(data, 189, 129, 30, 250); forward(fspeed);

if (msg[0] >190 && msg[0] <200)data = msg[0], stop();

то крутиться когда джойтик вверх, в одном направлении

 

когда пишу только 

if (msg[0] >201 && msg[0] <255)data = msg[0], bspeed = map(data, 201, 255, 30, 250); backward(bspeed);
if (msg[0] >190 && msg[0] <200)data = msg[0], stop();

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

получается, что работает как нужно, токль если по отдельности. Возможно есть какие-то мысли. Подскажите.

 

Focus
Offline
Зарегистрирован: 05.04.2015

Отлично! :) Осталось посмотреть что-же в msg[0] в том положении джойстика, когда должен сработать forward() и решение будет найдено!

пропиши в setup:

...
Serial.begin(9600);
...

ну и в loop

...
Serial.println(msg[0]);
if (msg[0] >129 && msg[0] <189)data = msg[0], fspeed = map(data, 189, 129, 0, 255); forward(fspeed);
if (msg[0] >201 && msg[0] <255)data = msg[0], bspeed = map(data, 255, 201, 0, 255); backward(bspeed);
...

и в мониторе порта смотри что выводит

hubll
Offline
Зарегистрирован: 08.03.2015

Там пусто( может быть такое?

Focus
Offline
Зарегистрирован: 05.04.2015

hubll пишет:

Там пусто( может быть такое?

если моторчик крутится хоть куда нибудь, то недолжно быть пусто

hubll
Offline
Зарегистрирован: 08.03.2015

получилось, что нули скачат

hubll
Offline
Зарегистрирован: 08.03.2015

а, я моторчик не подключил. можно ли к ардуине подключить питание в разьем 5,5 мм  и usb?

Focus
Offline
Зарегистрирован: 05.04.2015

а моторчик крутится хоть при каком нибудь положении джойстика?

Focus
Offline
Зарегистрирован: 05.04.2015

hubll пишет:

а, я моторчик не подключил. можно ли к ардуине подключить питание в разьем 5,5 мм  и usb?

Всмысле одновременно? Можно

hubll
Offline
Зарегистрирован: 08.03.2015

Двигатель крутиться, при этом

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

а в мониторе, цифры быстро скачут)

Focus
Offline
Зарегистрирован: 05.04.2015

сделай доупора вверх - высмотри цыфру, потом доупора вниз - снова высмотри и сюда напиши )

Focus
Offline
Зарегистрирован: 05.04.2015

накрайняк поставь после Serial.println(msg[0]); delay(100);

hubll
Offline
Зарегистрирован: 08.03.2015

низ  65   255

вверх 128   65

там по 2 цифры

Focus
Offline
Зарегистрирован: 05.04.2015

тут msg[0] <255 исправь на msg[0] <= 255 или msg[0] < 256

Focus
Offline
Зарегистрирован: 05.04.2015

чото я запутолся ))

пиши так:

if (msg[0] >=128 && msg[0] <=189)data = msg[0], fspeed = map(data, 189, 128, 0, 255); forward(fspeed);
38
if (msg[0] >=201 && msg[0] <=255)data = msg[0], bspeed = map(data, 255, 201, 0, 255); backward(bspeed);

 

hubll
Offline
Зарегистрирован: 08.03.2015

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

Focus
Offline
Зарегистрирован: 05.04.2015

попробуй несколько вариантов. Ставь этот код:

if (msg[0] >=128 && msg[0] <=189)data = msg[0], fspeed = map(data, 189, 128, 0, 255), forward(fspeed);
if (msg[0] >=201 && msg[0] <=255)data = msg[0], bspeed = map(data, 255, 201, 0, 255), backward(bspeed);

если не заработает, то в map(data, 189, 128, 0, 255) и в map(data, 255, 201, 0, 255) меняй местами 0 и 255 в разных комбинациях, я запутался в какую сторону крутился а в какую нет )

Focus
Offline
Зарегистрирован: 05.04.2015

Мне тоже едет драйвер и nrf, поэтому надо заставить работать )

hubll
Offline
Зарегистрирован: 08.03.2015

хоршо, спасибо, уже завтра попрбую. спасть хочу. спокойной ночи.

hubll
Offline
Зарегистрирован: 08.03.2015

о, как-то успокаивает что есть единомышленик)

Focus
Offline
Зарегистрирован: 05.04.2015

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

int msg[1]; 
int data; 
int pos;
// int Y;                        // X axis = left/right
int fspeed;           // forward speed 
int bspeed;           // backward speed
const int in1 = 5;    // direction pin 1
const int in2 = 6;    // direction pin 2
const int ena = 7;    // PWM pin to change speed

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

}

void loop()
{
  msg[0] = map(analogRead(A0), 0, 1023, 128, 255);

  if (msg[0] >=128 && msg[0] <=189)data = msg[0], fspeed = map(data, 189, 128, 0, 255), forward(fspeed);
  if (msg[0] >=201 && msg[0] <=255)data = msg[0], bspeed = map(data, 255, 201, 0, 255), backward(bspeed);
  if (msg[0] >190 && msg[0] <200)data = msg[0], stop();
}

  void stop()
{
  Serial.println("STOP!");
  analogWrite(ena, 0);
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
}

void forward(int fspeed)
{
  Serial.print("FORWARD! ");
  Serial.println(fspeed);
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(ena, fspeed);
}

void backward(int bspeed)
{
  Serial.print("BACKWARD! ");
  Serial.println(bspeed);
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(ena, bspeed);
}

Останется разобраться, какое значение шим соответствует максимальным значениям вперёд и назад (зависит от схемы включения драйвера)

hubll
Offline
Зарегистрирован: 08.03.2015

что-то не работает, блин, пока не разберусь не остановлюсь...

hubll
Offline
Зарегистрирован: 08.03.2015

ны если без нрф подключить, то и у меня работает вот так делал http://www.bajdi.com/arduino-rc-car-part-2-controlling-the-servo/

Focus
Offline
Зарегистрирован: 05.04.2015

Дай ещё раз весь код приёмника целиком :)

hubll
Offline
Зарегистрирован: 08.03.2015
#include <Servo.h>
#include <SPI.h>
#include "RF24.h"
Servo servo1;

RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL; 
int msg[1]; 
int data; 
int pos;
// int Y;                        // X axis = left/right
int fspeed;           // forward speed 
int bspeed;           // backward speed
const int in1 = 2;    // direction pin 1
const int in2 = 4;    // direction pin 2
const int ena = 5;    // PWM pin to change speed

void setup()
{
  pinMode(in1, OUTPUT);      // connection to L298n
  pinMode(in2, OUTPUT);      // connection to L298n
  pinMode(ena, OUTPUT);      // connection to L298n
servo1.attach(3); 
delay(50);
radio.begin();
radio.openReadingPipe(1,pipe); 
radio.startListening();
}

void loop()
{
  
if (radio.available())radio.read(msg, 1);
if (msg[0] <127 && msg[0] >-1)data = msg[0], pos = map(data, 0, 126, 7, 177),servo1.write(pos);


if (msg[0] >129 && msg[0] <189)data = msg[0], fspeed = map(data, 189, 129, 0, 255); forward(fspeed);
if (msg[0] >201 && msg[0] <255)data = msg[0], bspeed = map(data, 255, 201, 0, 255); backward(bspeed);
if (msg[0] >190 && msg[0] <200)data = msg[0], stop();



  }
  void stop()
{
  analogWrite(ena, 0);
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
}

void forward(int fspeed)
{
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(ena, fspeed);
}

void backward(int bspeed)
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(ena, bspeed);
}



 

hubll
Offline
Зарегистрирован: 08.03.2015

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

hubll
Offline
Зарегистрирован: 08.03.2015

а, понял, все нормально, просто сел аккумулятор.

Focus
Offline
Зарегистрирован: 05.04.2015
#include <Servo.h>
#include <SPI.h>
#include "RF24.h"
Servo servo1;

RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL; 
int msg[1]; 
int data; 
int pos;
// int Y;                        // X axis = left/right
int fspeed;           // forward speed 
int bspeed;           // backward speed
const int in1 = 2;    // direction pin 1
const int in2 = 4;    // direction pin 2
const int ena = 5;    // PWM pin to change speed

void setup()
{
  Serial.begin(9600);
  pinMode(in1, OUTPUT);      // connection to L298n
  pinMode(in2, OUTPUT);      // connection to L298n
  pinMode(ena, OUTPUT);      // connection to L298n
servo1.attach(3); 
delay(50);
radio.begin();
radio.openReadingPipe(1,pipe); 
radio.startListening();
}

void loop()
{
  if (radio.available())radio.read(msg, 1);
  if (msg[0] <127 && msg[0] >-1)data = msg[0], pos = map(data, 0, 126, 7, 177),servo1.write(pos);
  
  
  if (msg[0] >=128 && msg[0] <=189)data = msg[0], fspeed = map(data, 189, 128, 0, 255), forward(fspeed);
  if (msg[0] >=201 && msg[0] <=255)data = msg[0], bspeed = map(data, 255, 201, 0, 255), backward(bspeed);
  if (msg[0] >190 && msg[0] <200)data = msg[0], stop();
}

void stop()
{
  Serial.println("STOP!");
  analogWrite(ena, 0);
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
}

void forward(int fspeed)
{
  Serial.print("FORWARD! ");
  Serial.println(fspeed);
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(ena, fspeed);
}

void backward(int bspeed)
{
  Serial.print("BACKWARD! ");
  Serial.println(bspeed);
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(ena, bspeed);
}

Попробуй целиком этот код, посмотри как работает и что выводит в сериал

hubll
Offline
Зарегистрирован: 08.03.2015

когда стоит пишет STOP

когда вверх FORWARD 255

в низ BACKWARD 0

hubll
Offline
Зарегистрирован: 08.03.2015

двигатель при этом не вращается вообще

Focus
Offline
Зарегистрирован: 05.04.2015

hubll пишет:

двигатель при этом не вращается вообще

ни вверх ни вниз не вращался? оО

 

hubll
Offline
Зарегистрирован: 08.03.2015

блин, опять аккумулятор сел. Работает как нужно) Спасибо запомощь. Блин как мало нужно для щастя)

hubll
Offline
Зарегистрирован: 08.03.2015

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

Focus
Offline
Зарегистрирован: 05.04.2015

Прямо вот все как надо? скорость нормально меняется в обоих направлениях?

hubll
Offline
Зарегистрирован: 08.03.2015

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

Focus
Offline
Зарегистрирован: 05.04.2015

ок

hubll
Offline
Зарегистрирован: 08.03.2015

Кстати я делал кораблик на радиоуправлении, но не на пропорциональном. вот видео, если интересно https://youtu.be/Jxr3YEgvzmM 

hubll
Offline
Зарегистрирован: 08.03.2015
Focus
Offline
Зарегистрирован: 05.04.2015

Не забудь удалить или закоментировать в коде:

Serial.begin(9600);
...
Serial.println("STOP!");
...
Serial.print("FORWARD! ");
Serial.println(fspeed);
...
Serial.print("BACKWARD! ");
Serial.println(bspeed);
...

Если всё работает - никчему оно там :)

hubll
Offline
Зарегистрирован: 08.03.2015

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

hubll
Offline
Зарегистрирован: 08.03.2015

Сделал машинку. Обратите внимание на поворотную систему!  :) https://youtu.be/3546JjTQB7g

igorek874
Offline
Зарегистрирован: 19.02.2017

Подскажите пожалуйста, как в этот скетч добавить еще один двигатель? Нужно несколько режимов работы двух двигателей. Два двигателя работают вперед; 1 двигатель вперед, 2 назад и наоборот; когда джостики не отклонены, двигатели отключены.