Неправильно работает управление моторчиком
- Войдите на сайт для отправки комментариев
Втр, 19/04/2016 - 14:15
Всем привет! Такая проблема. Собрал машинку на радиоуправлении на двух 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);
}
Ссылки на картинки:
Видимо в строке 37
надо заменить на
Ничего не изменилось(
Как должно быть:
http://prntscr.com/au8zni
Как сделано сейчас:
http://prntscr.com/au8zz9
Только что обратил внимание, почему в строках 34-39 операторы разделены запятыми вместо точки с запятой?
Наверное потому, что джойстик при движении вниз уменьшает напряжение. Команда map() переносит значение пропорцинально, не зависимо от параметров значение будет так же пропорцилнально уменьшаться.
И что, это никак не исправить?
Видимо только так:
Снова ничего не поменялось. Похоже дело не в коде, а в самом джойстике и с ним надо что-то делать. И ещё, почему то ни у кого не было такой проблемы как у меня, хотя многие делали такие проекты, странно.
Я бы порекомендовал переписать loop() полностью. Там голимое безобразие.
Это не мой скетч. Я делал по видео и сам переписать не смогу.
Вообщем пробовал поразному менять значения в скетче, но так ничего и не получилось. Помогите кто знает.
может все таки сначала понять, какие значения выдает джойстик.
всавьте 14 строкой: serial.begin(9600)
вместо 17,18 строк
val_1 =analogRead(potpin_1)// считываем значениеSerial.println(val_1);// выводим полученное значениеи посмотрите в мониторе, чем же у вас движение вперед отличается от движения назад.
Итак, при центральном положении джойстика значение: 508.
При положении вверх, тоесть машинка едет вперёд, значение: 1023.
При положении вниз, тоесть машинка едет назад, значение: 0.
кстати, а почему если у нас у джойстика две координаты (val_1 - я так понимаю за поворот отвечает и val_2 за скорость), то перед передачей они записываются в одну и ту же ячейку? (в строке 18 msg[0], хотя должно быть наверное msg[1]) и тогда в приемнике поменять в строках 37,38,39 все на msg[1]
не помогло
Все проблема решена!
Дело было в коде приёмника:
в данном коде разъясните пожалуйста принцип связи
передатчик
val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[0] = val_1,radio.write(msg, 1);
что-то у меня такая же проблема, можешь помочь?