Машинка радиоуправлении не едет назад. Что-то с кодом.
- Войдите на сайт для отправки комментариев
Вс, 24/05/2015 - 11:11
Всем привет, делаю код для машинки на пульту 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); }
схемку бы ещё, или фотку хотябы
схемку бы ещё, или фотку хотябы
1 серву я убрал и дописал кодя для драйвера двигателя l298n
Драйвер двигателя подключается вот так:
Увидел что драйвер на 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
}
Ну и проверить правильность подключения к драйверу.
Это я предпологаю что может оно так, проверять неначем )
подробнее о подключении драйвера смотрел тут
Проверил. Результат не изменился. когда нажимаю джойстик вверх стоит на месте двигатель. когда джойстик не трогаю - двигатель очень медленно вращается, когда джойстик в низ - двигатель начинает разгонятся (работает как нужно).
Подозреваю, что ошибка тут, но немогу найти ее:
а если в loop {} прописать только backward(255); двигатель будет крутиться назад?
а если в loop {} прописать только forward(255); Будет крутиться вперёд?
Если да, то проверяй, что у тебя в msg[0]. Выводи в сериал то что у тебя в msg[0] при разных положениях джойстика.
напиши сюда, что покажет при крайних положениях и по центру.
там два вида схемы для 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 макс. скорость)
а если в loop {} прописать только backward(255); двигатель будет крутиться назад?
а если в loop {} прописать только forward(255); Будет крутиться вперёд?
Если да, то проверяй, что у тебя в msg[0]. Выводи в сериал то что у тебя в msg[0] при разных положениях джойстика.
напиши сюда, что покажет при крайних положениях и по центру.
Написал так
крутится в одну сторону
затем так
не двигается
не двигается
может msg[0] никогда не бывает в интервале 129 - 189? а может драйвер не крутит?
сама о себе функция forward(255); работает? Если её без условий запустить.
Проверил, forward(255); - работает.
драйвер крутит. уже сколько вариантов перепробывал, что незнаю что делать дальше.
может msg[0] никогда не бывает в интервале 129 - 189? а может драйвер не крутит?
сама о себе функция forward(255); работает? Если её без условий запустить.
а еще таккая штука:
изначально было так:
когда пишу только
то крутиться когда джойтик вверх, в одном направлении
когда пишу только
то крутиться когда джойтик вниз, в другом направлении
получается, что работает как нужно, токль если по отдельности. Возможно есть какие-то мысли. Подскажите.
Отлично! :) Осталось посмотреть что-же в msg[0] в том положении джойстика, когда должен сработать forward() и решение будет найдено!
пропиши в setup:
ну и в loop
и в мониторе порта смотри что выводит
Там пусто( может быть такое?
Там пусто( может быть такое?
если моторчик крутится хоть куда нибудь, то недолжно быть пусто
получилось, что нули скачат
а, я моторчик не подключил. можно ли к ардуине подключить питание в разьем 5,5 мм и usb?
а моторчик крутится хоть при каком нибудь положении джойстика?
а, я моторчик не подключил. можно ли к ардуине подключить питание в разьем 5,5 мм и usb?
Всмысле одновременно? Можно
Двигатель крутиться, при этом
когда джойстик опускаю в низ он останавливаются, а когда джойтик вверх он крутиться.
а в мониторе, цифры быстро скачут)
сделай доупора вверх - высмотри цыфру, потом доупора вниз - снова высмотри и сюда напиши )
накрайняк поставь после
Serial
.println(msg[0]); delay(100);
низ 65 255
вверх 128 65
там по 2 цифры
тут msg[0] <255 исправь на msg[0] <= 255 или msg[0] < 256
чото я запутолся ))
пиши так:
получилось так: в нуле крутиться медленно, когда вверх, то быстрее, когда в низ то стоит и не крутится.
попробуй несколько вариантов. Ставь этот код:
если не заработает, то в map(data, 189, 128, 0, 255) и в map(data, 255, 201, 0, 255) меняй местами 0 и 255 в разных комбинациях, я запутался в какую сторону крутился а в какую нет )
Мне тоже едет драйвер и nrf, поэтому надо заставить работать )
хоршо, спасибо, уже завтра попрбую. спасть хочу. спокойной ночи.
о, как-то успокаивает что есть единомышленик)
В этот раз точно должно было заработать, я потестил этот код, подрубив джойстик к аналоговому пину вместо пульта :)
Останется разобраться, какое значение шим соответствует максимальным значениям вперёд и назад (зависит от схемы включения драйвера)
что-то не работает, блин, пока не разберусь не остановлюсь...
ны если без нрф подключить, то и у меня работает вот так делал http://www.bajdi.com/arduino-rc-car-part-2-controlling-the-servo/
Дай ещё раз весь код приёмника целиком :)
уже вообще по другому работает, подозреваю что-то я сломал( код заливаю тот же а работает не так как раньше.
а, понял, все нормально, просто сел аккумулятор.
Попробуй целиком этот код, посмотри как работает и что выводит в сериал
когда стоит пишет STOP
когда вверх FORWARD 255
в низ BACKWARD 0
двигатель при этом не вращается вообще
двигатель при этом не вращается вообще
ни вверх ни вниз не вращался? оО
блин, опять аккумулятор сел. Работает как нужно) Спасибо запомощь. Блин как мало нужно для щастя)
я подозреваю, что оно и раньше работало просто аккумулятор подсел.
Прямо вот все как надо? скорость нормально меняется в обоих направлениях?
ну, да как надо, возможно в одну сторону немножечко быстрее при максимальном отклоненни джойстика. завтра видео покажу)
ок
Кстати я делал кораблик на радиоуправлении, но не на пропорциональном. вот видео, если интересно https://youtu.be/Jxr3YEgvzmM
Видео работы https://www.youtube.com/watch?v=RlBixA8NEvo
Не забудь удалить или закоментировать в коде:
Если всё работает - никчему оно там :)
хорошо, позже проверю исходный код, думаю он тоже долже работать, тогда когда включал. аккумулятор был разряжен.
Сделал машинку. Обратите внимание на поворотную систему! :) https://youtu.be/3546JjTQB7g
Подскажите пожалуйста, как в этот скетч добавить еще один двигатель? Нужно несколько режимов работы двух двигателей. Два двигателя работают вперед; 1 двигатель вперед, 2 назад и наоборот; когда джостики не отклонены, двигатели отключены.