Неправильно работает управление моторчиком

TheMrFeliX
Offline
Зарегистрирован: 19.04.2016

Всем привет! Такая проблема. Собрал машинку на радиоуправлении на двух arduino uno. Проблема в том, что когда управляешь джойстиком вперёд, то машинка медленно разгоняется(тоесть так как и должно быть), а вот если джойстик двигать в другую сторону, тоесть чтобы машинка ехала назад, то в самом начале наклона джойстика двигатель крутится на максимальной скорости и чем ниже опускаешь джойстик, тем медленнее крутится двигатель, хотя должно быть наоборот. Помогите пожалуйста!

Вот схема по которой собирал:

Скетчи:

Передатчик:

#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);

  
}
Приёмник:
// Необходимо установить библиотеку для радиомодуля nRF24
#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 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, 5, 100),servo1.write(pos);
  
  
  if (msg[0] >=128 && msg[0] <=189)data = msg[0], bspeed = map(data, 255, 201, 0, 255), backward(bspeed);
  if (msg[0] >=201 && msg[0] <=255)data = msg[0], fspeed = map(data, 189, 128, 0, 255), forward(fspeed);
  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);
}

 

 

TheMrFeliX
Offline
Зарегистрирован: 19.04.2016

Ссылки на картинки:

 
 
 
Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Видимо в строке 37

map(data, 255, 201, 0, 255)

 надо заменить на

map(data, 201, 255, 0, 255)
TheMrFeliX
Offline
Зарегистрирован: 19.04.2016

Ничего не изменилось(

TheMrFeliX
Offline
Зарегистрирован: 19.04.2016

Как должно быть:

http://prntscr.com/au8zni

Как сделано сейчас:

http://prntscr.com/au8zz9

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Только что обратил внимание, почему в строках 34-39 операторы разделены запятыми вместо точки с запятой?

faraddin
Offline
Зарегистрирован: 11.08.2013

Наверное потому, что джойстик при движении вниз уменьшает напряжение. Команда map() переносит значение пропорцинально, не зависимо от параметров значение будет так же пропорцилнально уменьшаться. 

TheMrFeliX
Offline
Зарегистрирован: 19.04.2016

И что, это никак не исправить?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Видимо только так:

map(255-data, 0, 54, 0, 255)
TheMrFeliX
Offline
Зарегистрирован: 19.04.2016

Снова ничего не поменялось. Похоже дело не в коде, а в самом джойстике и с ним надо что-то делать. И ещё, почему то ни у кого не было такой проблемы как у меня, хотя многие делали такие проекты, странно.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Я бы порекомендовал переписать loop() полностью. Там голимое безобразие.

TheMrFeliX
Offline
Зарегистрирован: 19.04.2016

Это не мой скетч. Я делал по видео и сам переписать не смогу.

TheMrFeliX
Offline
Зарегистрирован: 19.04.2016

Вообщем пробовал поразному менять значения в скетче, но так ничего и не получилось. Помогите кто знает.

kasper007
Offline
Зарегистрирован: 23.05.2016

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

всавьте 14 строкой: serial.begin(9600)

вместо 17,18 строк

val_1 = analogRead(potpin_1)   // считываем значение  

Serial.println(val_1);             // выводим полученное значение

и посмотрите в мониторе, чем же у вас движение вперед отличается от движения назад.

TheMrFeliX
Offline
Зарегистрирован: 19.04.2016

Итак, при центральном положении джойстика значение: 508.
При положении вверх, тоесть машинка едет вперёд, значение: 1023.
При положении вниз, тоесть машинка едет назад, значение: 0.

kasper007
Offline
Зарегистрирован: 23.05.2016

кстати, а почему если у нас у джойстика две координаты (val_1 - я так понимаю за поворот отвечает и val_2 за скорость), то перед передачей они записываются в одну и ту же ячейку? (в строке 18 msg[0], хотя должно быть наверное msg[1]) и тогда в приемнике поменять в строках 37,38,39 все на msg[1]

TheMrFeliX
Offline
Зарегистрирован: 19.04.2016

не помогло

TheMrFeliX
Offline
Зарегистрирован: 19.04.2016

Все проблема решена!
Дело было в коде приёмника:
 



// Необходимо установить библиотеку для радиомодуля nRF24
#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 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] >-1 && msg[0] <127)data = msg[0], pos = map(data, 0, 126, 5, 100),servo1.write(pos);
  
  
  if (msg[0] >=128 && msg[0] <=189)data = msg[0], bspeed = map(data, 189, 128, 0, 255), backward(bspeed);
  if (msg[0] >=201 && msg[0] <=255)data = msg[0], fspeed = map(data, 201, 255, 0, 255), forward(fspeed);
  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);
}
evgenii11
Offline
Зарегистрирован: 17.04.2016

в данном  коде разъясните пожалуйста принцип  связи 

передатчик 

 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);
 
приемник 
if (msg[0] <127 && msg[0] >-1)data = msg[0], pos = map(data, 0, 126, 7, 47),servo1.write(pos);
  
  
  if (msg[0] >=128 && msg[0] <=189)data = msg[0], bspeed = map(data, 255, 201, 0, 255), backward(bspeed);
  if (msg[0] >=201 && msg[0] <=255)data = msg[0], fspeed = map(data, 189, 128, 0, 255), forward(fspeed);
  if (msg[0] >190 && msg[0] <200)data = msg[0], stop();
 
особенно хотелось  бы знать что означают   знчения   (val_1, 0, 1023, 0, 127) и  (msg[0] >=128 && msg[0] <=189)data = msg[0], bspeed = map(data, 255, 201, 0, 255),

 

Edikxp
Offline
Зарегистрирован: 24.10.2017

что-то у меня такая же проблема, можешь помочь?