Неправильно работает управление моторчиком
- Войдите на сайт для отправки комментариев
Втр, 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);
что-то у меня такая же проблема, можешь помочь?