Помогите запустить танк

Savoks
Offline
Зарегистрирован: 18.08.2017

Здравствуйте, уважаемые форумчане! Недавно закончил сборку модели танка, теперь стоит задача привести его в движение.

Собрал схему приём-передача:

Передатчик:

1.Arduino Nano

2.Джойстик 2шт.(по одному на каждую гусеницу)

3.Радиомодуль NRF24L01+ с антеной (с адаптером питания под стаб. +3.3в)

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

RF24 radio(9, 10); 

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; 
int xPin = A3;
int yPin = A4;
int xPosition = 0;
int yPosition = 0;

byte transmit_data[2]; 
byte latest_data[2];
boolean flag; 
void setup() {
  
  Serial.begin(9600); 
  pinMode(xPin, INPUT);
  pinMode(yPin, INPUT);

  pinMode(2, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(7, OUTPUT);
  digitalWrite(2,1);
  digitalWrite(5,0);
  digitalWrite(6,1);

 
  radio.begin(); 
  radio.setAutoAck(1);         
  radio.setRetries(0, 15);    
  radio.enableAckPayload();    
  radio.setPayloadSize(32);  

  radio.openWritingPipe(address[0]); 
  radio.setChannel(0x60); 

  radio.setPALevel (RF24_PA_MAX); 
  radio.setDataRate (RF24_250KBPS); 
  

  radio.powerUp();
  radio.stopListening(); 
}
void loop() {
 
  transmit_data[0] = analogRead(xPosition); 
  transmit_data[1] = analogRead(yPosition); 
  xPosition = analogRead(xPin);
  yPosition = analogRead(yPin);
  
  Serial.println(yPosition);
  delay(400);
  
  for (int i = 0; i < 3; i++) {
    if (transmit_data[i] != latest_data[i]) {
      flag = 1;
      latest_data[i] = transmit_data[i];
    }
  }

  if (flag == 1) {
    radio.powerUp(); 
    radio.write(&transmit_data, sizeof(transmit_data)); 
    flag = 0; 
    radio.powerDown(); 
  }
}

 

 

Приёмник:

1.Arduino Nano

2.Шилд на неё(чтобы увеличить кол-во пинов)

3.Драйвер двигателя BTS7960

4.Радиомодуль NRF24L01+ с антеной (с адаптером питания под стаб. +3.3в)

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

RF24 radio(9, 10);

byte recieved_data[2]; 
int RPWM_Output1 = 3;
int LPWM_Output1 = 2; 
int RPWM_Output2 = 1; 
int LPWM_Output2 = 0; 

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; 

void setup() {
  pinMode(8, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(RPWM_Output1, OUTPUT);
  pinMode(LPWM_Output1, OUTPUT);
  pinMode(RPWM_Output2, OUTPUT);
  pinMode(LPWM_Output2, OUTPUT);
  digitalWrite(8,0);
  digitalWrite(5,1);
  digitalWrite(6,0);
  digitalWrite(7,1);
  Serial.begin(9600); 

  radio.begin(); 
  radio.setAutoAck(1);        
  radio.setRetries(0, 15);    
  radio.enableAckPayload();    
  radio.setPayloadSize(32);     

  radio.openReadingPipe(1, address[0]);    
  radio.setChannel(0x60); 

  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_250KBPS); 
 
  radio.powerUp();
  radio.startListening(); 
}

void loop() {
  byte pipeNo;
  while ( radio.available(&pipeNo)) {  
    radio.read( &recieved_data, sizeof(recieved_data) );      


int sensorValue = analogRead(recieved_data[0]);
// средняя точка показаний потенциометра
// раздел направления вращения мотора
if (sensorValue < 512) {
// вращение в противоположную сторону
// 0-255
int reversePWM = (512-sensorValue ) / 2;
analogWrite(LPWM_Output1, 0);
analogWrite(RPWM_Output1, reversePWM);}
else {
// вращение одну сторону
// 0-255
int forwardPWM = (sensorValue - 512) / 2;
analogWrite(LPWM_Output1, forwardPWM);
analogWrite(RPWM_Output1, 0);
}
}

int sensorValue = analogRead(recieved_data[1]);
// средняя точка показаний потенциометра
// раздел направления вращения мотора
if (sensorValue < 512) {
// вращение в противоположную сторону
// 0-255
int reversePWM = (512-sensorValue ) / 2;
analogWrite(LPWM_Output2, 0);
analogWrite(RPWM_Output2, reversePWM);}
else {
// вращение одну сторону
// 0-255
int forwardPWM = (sensorValue - 512) / 2;
analogWrite(LPWM_Output2, forwardPWM);
analogWrite(RPWM_Output2, 0);
}
}

Так вот, это всё не работает.Не могу понять в чём ошибка.Пожалуйста, помогите разобраться!!!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В строках 57-58 передатчика выход за границы массива (описан как [2] а цикл i<3), но это мелочи.

Сейчас внимательно подумайте и ответьте: Что передаёт Ваш передатчик приёмнику? Номера пинов сенсоров? Именно номера пинов? Если да, то в строках 49-50 они слишком большими получаются - аж до 1023. У приёмника есть столько пинов?

А если нет, то какого ж ... Вы полученные приёмником данные используете как номера пинов в строках 53 и 71 приёмника?

Скетч сами писали или скачали где-нибудь?

Savoks
Offline
Зарегистрирован: 18.08.2017

10-15% Скетча собственного производства остальное скачено.

Я понял в чём ошибка, но как это исправить? Функция map ?(В ардуино я неопытен, извини

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Savoks пишет:

Я понял в чём ошибка, ... Функция map ?

Вы себя слышите? Вы используете принятые данные в качестве номеров пинов! Какой map? Я вас просил ответить, что Вы передаёте - номера пинов или нет. Сами-то себе ответили?

Savoks пишет:

но как это исправить? 

Выбросить этот кусок бреда и написать нормальный скетч. Вы думаете, там других ошибок нет? Да они там в каждой строке, ну разве что может в строке 4 нет.

Ну, например, в строках 49-50 Вы читаете данные с analogRead. Результат может быть от 0 до 1023. А Вы пытаетесь его запихать в элементы байтового массива. Но в них же число, большее чем 255 не влезет! Куда пихаете-то?

И ещё там навалом всего - это реально кусок бреда.

Savoks пишет:

В ардуино я неопытен

В программировании тоже. Учитесь.

Savoks
Offline
Зарегистрирован: 18.08.2017

Может быть так.

Передатчик


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

RF24 radio(9, 10); 

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; 
int xPin = A3;
int yPin = A4;


int data[2]; 
void setup() {
  
  Serial.begin(9600); 
  pinMode(xPin, INPUT);
  pinMode(yPin, INPUT);

  pinMode(2, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(7, OUTPUT);
  digitalWrite(2,1);
  digitalWrite(5,0);
  digitalWrite(6,1);

 
  radio.begin(); 
  radio.setAutoAck(1);         
  radio.setRetries(0, 15);    
  radio.enableAckPayload();    
  radio.setPayloadSize(32);  
  radio.openWritingPipe(0x123456789LL); 
  radio.setChannel(60); 
  radio.setPALevel (RF24_PA_MAX); 
  radio.setDataRate (RF24_250KBPS); 
  

  radio.powerUp();
  radio.stopListening(); 
}
void loop() {

  data[0] = analogRead(xPin); 
  data[1] = analogRead(yPin); 

  radio.write(data,sizeof(data));
 
}

 

 

Приёмник

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

RF24 radio(9, 10);

int data[2]; 
int RPWM_Output1 = A3;
int LPWM_Output1 = A2; 
int RPWM_Output2 = A0; 
int LPWM_Output2 = A1; 

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; 

void setup() {
  Serial.begin(9600);
  pinMode(8, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(RPWM_Output1, OUTPUT);
  pinMode(LPWM_Output1, OUTPUT);
  pinMode(RPWM_Output2, OUTPUT);
  pinMode(LPWM_Output2, OUTPUT);
  digitalWrite(3,1);
  digitalWrite(4,1);
  digitalWrite(2,1);
  digitalWrite(5,1);
  digitalWrite(8,1); 
  Serial.begin(9600); 

  radio.begin(); 
  radio.setAutoAck(1);        
  radio.setRetries(0, 15);    
  radio.enableAckPayload();    
  radio.setPayloadSize(32);     
  radio.openReadingPipe(1,0x123456789LL);    
  radio.setChannel(60); 
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_250KBPS);  
  radio.powerUp();
  radio.startListening(); 
}

void loop() { 
  if ( radio.available()) {  
    radio.read( &data, sizeof(data) );      

int sensorValue1 = data[0];
if (sensorValue1 < 512) {
int reversePWM = (512-sensorValue1 ) / 2;
analogWrite(LPWM_Output1, 0);
analogWrite(RPWM_Output1, reversePWM);}
else {
int forwardPWM = (sensorValue1 - 512) / 2;
analogWrite(LPWM_Output1, forwardPWM);
analogWrite(RPWM_Output1, 0);
}
}

int sensorValue2 = data[1];
if (sensorValue2 < 512) {
int reversePWM = (512-sensorValue2 ) / 2;
analogWrite(LPWM_Output2, 0);
analogWrite(RPWM_Output2, reversePWM);}
else {
int forwardPWM = (sensorValue2 - 512) / 2;
analogWrite(LPWM_Output2, forwardPWM);
analogWrite(RPWM_Output2, 0);
}
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Работет?

Savoks
Offline
Зарегистрирован: 18.08.2017

Не очень. Ранее я заливал тестовые скетчи и там молчание. Это может быть проблема с самими модулями?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Savoks пишет:

 Это может быть проблема с самими модулями?

Так, похоже, Вы не стого конца начали. начинать надо с того, что написать передатчик и приёмник по три строки кода каждый. Передатчик передатёт, скажем, слово "кака" или там "букву А", а приёмник печатает в сериал то. что принял. Сразу поймёте живы ли модули и убедитесь, что Вы умеете правильно передавать и принимать.

Savoks
Offline
Зарегистрирован: 18.08.2017

Вы правы. Сейчас попробую.

Savoks
Offline
Зарегистрирован: 18.08.2017

Итак,вот результаты.

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

RF24 radio(9, 10);

int data[2]; 
int RPWM_Output1;
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; 

void setup() {
  Serial.begin(9600);
  pinMode(8, OUTPUT);
  RPWM_Output1 = 999;
  data[0] = RPWM_Output1;
  digitalWrite(8,1); 
  radio.begin(); 
  radio.setAutoAck(1);        
  radio.setRetries(0, 15);    
  radio.enableAckPayload();    
  radio.setPayloadSize(32);     
  radio.openReadingPipe(1,0x123456789LL);    
  radio.setChannel(60); 
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_250KBPS);  
  radio.powerUp();
  radio.startListening(); 
}

void loop() { 
  Serial.println (data[0]);
  if ( radio.available()) {  
    radio.write( &data, sizeof(data) ); 
    delay(1000);     
  }
}
Отправляю 999.
 
 
 
 
 
 
 

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

RF24 radio(9, 10); 

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; 
int RPWM_Output1;
int data[2]; 
void setup() {
  
  Serial.begin(9600); 
  RPWM_Output1 = data[0];
  radio.begin(); 
  radio.setAutoAck(1);         
  radio.setRetries(0, 15);    
  radio.enableAckPayload();    
  radio.setPayloadSize(32);  
  radio.openWritingPipe(0x123456789LL); 
  radio.setChannel(60); 
  radio.setPALevel (RF24_PA_MAX); 
  radio.setDataRate (RF24_250KBPS); 
  

  radio.powerUp();
  radio.stopListening(); 
}
void loop() {
  Serial.println(RPWM_Output1);
  radio.read(data,sizeof(data));
   delay(1000);
 
}

Получаю одни нули.

 
 
 
 
 
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Откуда видно, что отправляете 999 и получаете нули? В коде передатчика нет 999 (в смысле в буффере отправки), а в коде приёмника нет печати того, что пришло.

Виноват ... отправку нашёл. Но печати по-прежнему не вижу. Встаьте печать data[0] после 30-ой строки

Savoks
Offline
Зарегистрирован: 18.08.2017

Всё равно в мониторе порта нули.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Значит, Вы неправильно читаете или передаёте. Упростите задачу.

Передавайте 1 байт и читайте 1 байт. Примерно так:

char a = 'A';
radio.write( &a, sizeof(a) );

.......................

char a = 'Z';
radio.read(&a,sizeof(a));
Serial.print("Result:");
Serial.println(a);

Попробуйте

Savoks
Offline
Зарегистрирован: 18.08.2017

В мониторе порта приёмника только слово "Result: ".

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы, букву A не руссукю туда вписали часом?

Давайте-ка скетч

Savoks
Offline
Зарегистрирован: 18.08.2017
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9, 10); 

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; 
int RPWM_Output1;
int data[2]; 
void setup() {
  
  Serial.begin(9600); 
  RPWM_Output1 = data[0];
  radio.begin(); 
  radio.setAutoAck(1);         
  radio.setRetries(0, 15);    
  radio.enableAckPayload();    
  radio.setPayloadSize(32);  
  radio.openWritingPipe(0x123456789LL); 
  radio.setChannel(60); 
  radio.setPALevel (RF24_PA_MAX); 
  radio.setDataRate (RF24_250KBPS); 
  

  radio.powerUp();
  radio.stopListening(); 
}
void loop() {
char a = 'A';
radio.write( &a, sizeof(a) );

   Serial.println(a);
   delay(1000);
 
}

 

 

 

 

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

RF24 radio(9, 10); 

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; 
int RPWM_Output1;
int data[2]; 
void setup() {
  
  Serial.begin(9600); 
  RPWM_Output1 = data[0];
  pinMode(8,OUTPUT);
  digitalWrite(8,1);
  radio.begin(); 
  radio.setAutoAck(1);         
  radio.setRetries(0, 15);    
  radio.enableAckPayload();    
  radio.setPayloadSize(32);  
  radio.openWritingPipe(0x123456789LL); 
  radio.setChannel(60); 
  radio.setPALevel (RF24_PA_MAX); 
  radio.setDataRate (RF24_250KBPS); 
  

  radio.powerUp();
  radio.stopListening(); 
}
void loop() {
 char a = 'Z';
radio.read(&a,sizeof(a));
Serial.print("Result:");
Serial.println(a);
   delay(1000);
 
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да и кстати, я не знаком с этой библиотекой, но меня очень смущают строки 27 в передатчике и 27 в приёмнике. По общим соображениям должно бы быть наоборот. Попробуйте взять простейший пример прямо из библиотеки и ту же букву передать/принять, ничего кроме этого в примере не меняя

Savoks
Offline
Зарегистрирован: 18.08.2017

А можно как-нибудь проверить модули по отдельности.Видит ли их ардуино и исправны ли они вообще?

kalapanga
Offline
Зарегистрирован: 23.10.2016

Savoks пишет:

А можно как-нибудь проверить модули по отдельности.Видит ли их ардуино и исправны ли они вообще?

Вам же советовали, используйте простейшие примеры из библиотеки, разберитесь с ними. Что у Вас в скетче приёмника делают openWritingPipe и StopListening? Стоит и схему подключения проверить, может там тоже ошибки...

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Первое - конденсатор . Он есть ?

Второе - Именно приемник более капризен к питанию.

Третье - запитать приемник не от USB а от стабилизированного источника 5 вольт , подключив 5 вольт к котакту 5V ! 

Четвертое - после этого запустите пример с пояснениями  приведеный ниже и расскажите что в serial

Передатчик 

#include <SPI.h>                                          // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h>                                     // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                         // Подключаем библиотеку для работы с nRF24L01+
RF24           radio(9, 10);                              // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
int            data[2] = {123, 321};                                   // Создаём массив для приёма данных
void setup(){
    radio.begin();                                        // Инициируем работу nRF24L01+
    radio.setChannel(5);                                  // Указываем канал передачи данных (от 0 до 127), 5 - значит передача данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setDataRate     (RF24_1MBPS);                   // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
    radio.setPALevel      (RF24_PA_HIGH);                 // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.openWritingPipe (0x1234567890LL);               // Открываем трубу с идентификатором 0x1234567890 для передачи данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
}
void loop(){
    
    radio.write(&data, sizeof(data));                     // отправляем данные из массива data указывая сколько байт массива мы хотим отправить
}

Приемник 

#include <SPI.h>                                          // Подключаем библиотеку  для работы с шиной SPI
#include <nRF24L01.h>                                     // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                         // Подключаем библиотеку  для работы с nRF24L01+
RF24           radio(9, 10);                              // Создаём объект radio   для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
int            data[2];                                   // Создаём массив для приёма данных
void setup() {
  delay(1000);
  Serial.begin(9600);
  radio.begin();                                        // Инициируем работу nRF24L01+
  radio.setChannel(5);                                  // Указываем канал приёма данных (от 0 до 127), 5 - значит приём данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
  radio.setDataRate     (RF24_1MBPS);                   // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
  radio.setPALevel      (RF24_PA_HIGH);                 // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
  radio.openReadingPipe (1, 0x1234567890LL);            // Открываем 1 трубу с идентификатором 0x1234567890 для приема данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
  radio.startListening  ();                             // Включаем приемник, начинаем прослушивать открытую трубу
  //  radio.stopListening   ();                             // Выключаем приёмник, если потребуется передать данные
}
void loop() {
  if (radio.available()) {                              // Если в буфере имеются принятые данные
    radio.read(&data, sizeof(data));                  // Читаем данные в массив data и указываем сколько байт читать
    Serial.print(data[0]);
    Serial.print(data[1]);


  }
}