Помогите со скетчем пожалуйста

igorek874
Offline
Зарегистрирован: 19.02.2017

Нужно написать скетч для управления корабликом и скетч для пульта ду. В кораблике будет 2 двигателя и один сервопривод. Нужно реализовать движение вперед, повороты за счет того, что один двигатель будет отключаться, а другой работать. В наличие имеются 2 arduino nano, 2 nrf24, 2 стика, l298n, 2 двигателя.

igorek874
Offline
Зарегистрирован: 19.02.2017

Есть скетч очень похожий на то что мне нужно.

#include <Servo.h>
#include <SPI.h>
#include "RF24.h"
Servo servo1;
Servo servo2;

RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL; 
int msg[1]; 
int data; 
int pos;
int fspeed;           // движение в перед 
int bspeed;           // движение назад
const int in1 = 2;    // управление двигателем 1
const int in2 = 4;    // управление двигателем 1
const int ena = 5;    // ШИМ для пропорциональной скорости машинки

void setup()
{
  
  pinMode(in1, OUTPUT);      // подключаем к L298n
  pinMode(in2, OUTPUT);      // подключаем к L298n
  pinMode(ena, OUTPUT);      // подключаем к L298n
  
servo1.attach(6); 
servo2.attach(3); 

delay(50);
radio.begin();
radio.openReadingPipe(1,pipe); 
radio.startListening();

}

void loop()
{
  if (radio.available())radio.read(msg, 1);
  if (msg[0] <63 && msg[0] >-1)data = msg[0], pos = map(data, 0, 62, 10, 50),servo1.write(pos);
  if (msg[0] <=127 && msg[0] >=64)data = msg[0], pos = map(data, 64, 127, 0, 80),servo2.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 <PS2X_lib.h>

// Необходимо установить библиотеку для радиомодуля 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 lspeed;
int fspeed;           // движение в перед 
int bspeed;           // движение назад
const int in1 = 2;    // управление двигателем 1
const int in2 = 4;    // управление двигателем 1
const int ena = 5;    // ШИМ для пропорциональной скорости машинки
const int in3=7;
const int in4=8;
const int enb=6;

void setup()
{
  
  pinMode(in1, OUTPUT);      // подключаем к L298n
  pinMode(in2, OUTPUT);      // подключаем к L298n
  pinMode(ena, OUTPUT);      // подключаем к L298n
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(enb, OUTPUT);
  
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] <63 && msg[0] >-1)data = msg[0], lspeed = map(data, 0, 62, 10, 50),povorot(lspeed);
  if (msg[0] <=127 && msg[0] >=64)data = msg[0], pos = map(data, 64, 127, 0, 80),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);
    analogWrite(enb, 0);
}

void forward(int fspeed)
{
  
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(ena, fspeed);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enb, fspeed);
}

void backward(int bspeed)
{
  
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  analogWrite(ena, 0);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enb, bspeed);
}
void povorot(int lspeed)
{
  
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(ena, lspeed);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(enb, 0);
}

Но к сожалению это не заработало

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Здесь никто не будет выполнять Ваши хотелки.

Возможно только два варианта:

1. Вы изучаете программирование и самы выполняете свои хотелки. Постепенно. И в этом Вам помогут.

2. Вы ничего не хотите изучать, обращаетесь в раздел "Ищу исполнителья", где Вам все делают за деньги.

Определитесь, чего именно Вы хотите.

igorek874
Offline
Зарегистрирован: 19.02.2017

Я вас понял. Можете хотя бы посмотреть мой скетч и сказать что на первый взгляд там не правильно.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

igorek874, Если у нас есть словесное описание алгоритма и скетч, то можно посмотреть их и сказать, чем одно отличается от другого. Но когда есть только скетч, то как прикажете выяснять, в чем разница между ним и тем, что Вам хочется?

Любая программа работает в точности так, как ее написал программист. Но не всегда так, как программист хотел ее написать. Мы можем узнать только первое, но ничего не можем сказать о втором.

ZIA
ZIA аватар
Offline
Зарегистрирован: 04.02.2017

Для начала строки с 55 по 92 перенести со строки 23 и не хватает одного пина, придётся использовать аналоговый в цифровом режиме

igorek874
Offline
Зарегистрирован: 19.02.2017

У меня возникли проблемы с передачей координат перемещения джойстика через модуль nrf24l01. Просто числа передаются без проблем.

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно

int address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

const int PIN_ANALOG_X = 0;
const int PIN_ANALOG_Y = 1;
int x,y;
int transmit_data[3]; // массив, хранящий передаваемые данные

void setup() {
  Serial.begin(9600); //открываем порт для связи с ПК
  radio.begin(); //активировать модуль
  radio.setPayloadSize(32);     //размер пакета, в байтах
  radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS

  radio.powerUp(); //начать работу
  radio.stopListening();  //не слушаем радиоэфир, мы передатчик
}

void loop() {

  x=analogRead(PIN_ANALOG_X);
  y=analogRead(PIN_ANALOG_Y);
   delay(30);
Serial.println(x);
Serial.println(y);
  transmit_data[0] = 0; 
  transmit_data[1] =  x; 
  transmit_data[2] = y;
  radio.write(&transmit_data, sizeof(transmit_data));
  delay(30);
}

Вот код передатчика. В переменные х и у значиения нормально записываются.

 

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h>

RF24 radio(9, 10); // 

byte x_position;
byte y_position;


byte recieved_data[3]; // массив принятых данных
byte servo = 3; // сервопривод на 3 цифровом
Servo myservo;

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

void setup() {
  Serial.begin(9600); //открываем порт для связи с ПК

  myservo.attach(servo);

  radio.begin(); //активировать модуль
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openReadingPipe(1, address[0]);     //хотим слушать трубу 0
  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
}

void loop() {
  
  byte pipeNo;
  while ( radio.available(&pipeNo)) {  // слушаем эфир со всех труб
   radio.read( &recieved_data, sizeof(recieved_data) );         // чиатем входящий сигнал
 
   x_position = recieved_data[1]; 
  Serial.println( recieved_data[1]);
   y_position = recieved_data[2]; 
  Serial.println( recieved_data[2]); 
 delay(30); }
}

Код приемника

Помогите пожалуйста, что не так?

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

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А чем по-вашему координаты отличаются от "просто чисел"?

 

PS. Да, посмотрел: в начале сообщения указаны "просто числа", а в концк "просто цифры". Вы уж определитесь, числа Вы передаете или цифры?

igorek874
Offline
Зарегистрирован: 19.02.2017

Ничем, я про то что изменяющиеся значения не передаются, но если я х присваю например 1, то все нормально передается

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Я из Вашего пояснения ничего не понял, но, навеное, Вам видней.