Полноприводная модель с управлением от NRF24L01

BlackTurner
Offline
Зарегистрирован: 15.07.2015

Всем Доброго времени суток!!!



Есть у меня полноприводная модель 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);

}
 может кто поможет...
BlackTurner
Offline
Зарегистрирован: 15.07.2015

может кто поможет

BlackTurner
Offline
Зарегистрирован: 15.07.2015

вот что получилось 

// Необходимо установить библиотеку для радиомодуля 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);
}

Машина теперь едит вперед и назад, надо тепрь сделать повороты. Поможет кто?

vvadim
Offline
Зарегистрирован: 23.05.2012

дык у вас один мотор, как он будет поворачивать?
 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

vvadim пишет:

дык у вас один мотор, как он будет поворачивать?
 

а если смещать центр тяжести? гыыы ну типа как на скейте

BlackTurner
Offline
Зарегистрирован: 15.07.2015

2пары моторов  

Гриша
Offline
Зарегистрирован: 27.04.2014

vvadim пишет:

дык у вас один мотор, как он будет поворачивать?
 

BlackTurner пишет:

2пары моторов  

ну теперь ну-на 2 пары кодов как то слепить

BlackTurner
Offline
Зарегистрирован: 15.07.2015

Гриша пишет:

vvadim пишет:

дык у вас один мотор, как он будет поворачивать?
 

BlackTurner пишет:

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

}

Повтарю, все работает есть пару багов, нужна оптимизация 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

 

val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[1] = val_1;

можно сократить до:  msg[1]=analogRead(potpin_1)>>3;

Гриша
Offline
Зарегистрирован: 27.04.2014

киньте билу вставкой кода   <Servo.h> только сверните код библы, нужно будет, откроем сами... (дополнительно -> свернуть (поставить галочку))

BlackTurner
Offline
Зарегистрирован: 15.07.2015

dimax пишет:

 

val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[1] = val_1;

можно сократить до:  msg[1]=analogRead(potpin_1)>>3;

спасибо учту

BlackTurner
Offline
Зарегистрирован: 15.07.2015

servo.h уже не надо, в моем проекты нет серво привода 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

странно что есть

ena но нет enb

BlackTurner
Offline
Зарегистрирован: 15.07.2015

Исправлена проблема с потерей связи. Модель продолжала ехать если терялась связь с пультам

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

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

мне кажется его (код) можно написать в 2 раза короче

еще один msg объявляет int))) где вы берете примеры не пойму

BlackTurner
Offline
Зарегистрирован: 15.07.2015
BlackTurner
Offline
Зарегистрирован: 15.07.2015

jeka_tm пишет:

мне кажется его (код) можно написать в 2 раза короче

еще один msg объявляет int))) где вы берете примеры не пойму

все с головы, тупа методом научного подбора, ессетвено со временем будет оптимизация, сделаю корпус для пульта