Полноприводная модель с управлением от NRF24L01
- Войдите на сайт для отправки комментариев
Всем Доброго времени суток!!!
Есть у меня полноприводная модель http://ru.aliexpress.com/item/Free-...is-Kits-with-Speed-Encoder-New/747770134.html вот такого типа, так же драйвер L298N.
Собрал я свою первую модель на управлении от блютуз (Нс-06 модуль, если кому интересно) все хорошо работало. Но мне стало интересно собрать эту же модель но на управлении от джойстика (ибо по тачскрину не удобно управлять) и на радиосвязи. Купил пару NRF24l01, полазил по всяким умным сайтам, нашел код, но он сделан под двигатель и серво, т.е двигатель приводит в движение колеса, а серва поворачивает. Мои попытки поменять его так что бы машина могла поворачивать на разности направления вращения колес потерпели неудачу. Поэтому решил попросить помощи у народа. Сам я можно сказать новичок в этом деле, немного знаю радиоэлектронику, немного программирование.
Вот код от машинки с серовой это приемник
// Необходимо установить библиотеку для радиомодуля 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; // вперед speed
int bspeed; // назад 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, 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();
}
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);
}
вод код передатчика (пульт)
#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 = 7; // direction pin 1 const int in2 = 6; const int in3 = 5; const int in4 = 4; // direction pin 2 const int ena = 3; // PWM pin to change speed void setup() { pinMode(in1, OUTPUT); // connection to L298n pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); // connection to L298n pinMode(in4, 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, 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(); } void stop() { analogWrite(ena, 0); digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); } void forward(int fspeed) { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); analogWrite(ena, fspeed); } void backward(int bspeed) { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); analogWrite(ena, bspeed); }Машина теперь едит вперед и назад, надо тепрь сделать повороты. Поможет кто?
дык у вас один мотор, как он будет поворачивать?
дык у вас один мотор, как он будет поворачивать?
а если смещать центр тяжести? гыыы ну типа как на скейте
2пары моторов
дык у вас один мотор, как он будет поворачивать?
2пары моторов
ну теперь ну-на 2 пары кодов как то слепить
дык у вас один мотор, как он будет поворачивать?
2пары моторов
ну теперь ну-на 2 пары кодов как то слепить
что-то как-то слепить, никакой конкретики.
Вообще напряг я программиста и написали мы код, вроде кое как работает. Будем оптимизировать, а пока что промежуточный вариант выложу сюда может кому пригодиться
#include <SPI.h> #include "RF24.h" RF24 radio(9,10); const uint64_t pipe = 0xE8E8F0F0E1LL; int msg[2]; 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[1] = val_1; val_2 = analogRead(potpin_2),val_2 = map(val_2, 0, 1023, 0, 127),msg[0] = val_2,radio.write(&msg, sizeof(msg)); }и приемник
// Необходимо установить библиотеку для радиомодуля nRF24 #include <Servo.h> #include <SPI.h> #include "RF24.h" Servo servo1; RF24 radio(9,10); const uint64_t pipe = 0xE8E8F0F0E1LL; int msg[2]; int data; int pos; int fspeed; // forward speed int bspeed; // backward speed const int in1 = 7; // direction pin 1 const int in2 = 6; const int in3 = 5; const int in4 = 4; // direction pin 2 const int ena = 3; // PWM pin to change speed int x = 0; int y = 0; bool direction = 1; void setup() { Serial.begin(9600); pinMode(in1, OUTPUT); // connection to L298n pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); // connection to L298n pinMode(in4, 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, sizeof(msg)); if (msg[0]<60||msg[0]>68||msg[1]<60||msg[1]>68) { Serial.print(msg[0]); Serial.print(" : "); Serial.println(msg[1]); } if (msg[0]<31)x=1; else if (msg[0]>97)x=-1; else x = 0; if (msg[1]<31)y=-1; else if (msg[1]>97)y=1; else y=0; drive(x,y); forward(fspeed); } void drive (int x,int y) { int L = 0; int R = 0; L = x+y*(x/abs(x)); R = x-y*(x/abs(x)); if (L<0) { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); } else if (L==0) { digitalWrite(in1, LOW); digitalWrite(in2, LOW); } else if (L>0) { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); } if (R<0) { digitalWrite(in3, HIGH); digitalWrite(in4, LOW); } else if (R==0) { digitalWrite(in3, LOW); digitalWrite(in4, LOW); } else if (R>0) { digitalWrite(in3, LOW); digitalWrite(in4, HIGH); } } void stop() { analogWrite(ena, 0); digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); } void forward(int fspeed) { digitalWrite(in1, HIGH); digitalWrite(in3, LOW); } void backward(int bspeed) { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); }Повтарю, все работает есть пару багов, нужна оптимизация
val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[1] = val_1;можно сократить до: msg[1]=analogRead(potpin_1)>>3;
киньте билу вставкой кода <Servo.h> только сверните код библы, нужно будет, откроем сами... (дополнительно -> свернуть (поставить галочку))
val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[1] = val_1;можно сократить до: msg[1]=analogRead(potpin_1)>>3;
спасибо учту
servo.h уже не надо, в моем проекты нет серво привода
странно что есть
ena но нет enb
Исправлена проблема с потерей связи. Модель продолжала ехать если терялась связь с пультам
#include <Servo.h> #include <SPI.h> #include "RF24.h" RF24 radio(9,10); const uint64_t pipe = 0xE8E8F0F0E1LL; int msg[2]; int data; int pos; int fspeed; // forward speed int bspeed; // backward speed const int in1 = 7; // direction pin 1 const int in2 = 6; const int in3 = 5; const int in4 = 4; // direction pin 2 const int ena = 3; // PWM pin to change speed int x = 0; int y = 0; bool direction = 1; void setup() { Serial.begin(9600); pinMode(in1, OUTPUT); // connection to L298n pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); // connection to L298n pinMode(in4, OUTPUT); // connection to L298n pinMode(ena, OUTPUT); // connection to L298n delay(50); radio.begin(); radio.openReadingPipe(1,pipe); radio.startListening(); } void loop() { if (radio.available())radio.read(&msg, sizeof(msg)); if (msg[0]<60||msg[0]>68||msg[1]<60||msg[1]>68) { Serial.print(msg[0]); Serial.print(" : "); Serial.println(msg[1]); } if (msg[0]<31)x=1; else if (msg[0]>97)x=-1; else x = 0; if (msg[1]<31)y=-1; else if (msg[1]>97)y=1; else y=0; drive(x,y); msg[0]=63; msg[1]=63; } void drive (int x,int y) { int L = 0; int R = 0; L = x+y*(x/abs(x)); R = x-y*(x/abs(x)); if (L<0) { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); } else if (L==0) { digitalWrite(in1, LOW); digitalWrite(in2, LOW); } else if (L>0) { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); } if (R<0) { digitalWrite(in3, HIGH); digitalWrite(in4, LOW); } else if (R==0) { digitalWrite(in3, LOW); digitalWrite(in4, LOW); } else if (R>0) { digitalWrite(in3, LOW); digitalWrite(in4, HIGH); } } void stop() { analogWrite(ena, 0); digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); } void forward(int fspeed) { digitalWrite(in1, HIGH); digitalWrite(in3, LOW); } void backward(int bspeed) { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); }мне кажется его (код) можно написать в 2 раза короче
еще один msg объявляет int))) где вы берете примеры не пойму
https://youtu.be/7NRhI3H-w0A
мне кажется его (код) можно написать в 2 раза короче
еще один msg объявляет int))) где вы берете примеры не пойму
все с головы, тупа методом научного подбора, ессетвено со временем будет оптимизация, сделаю корпус для пульта