Помогите запустить танк
- Войдите на сайт для отправки комментариев
Сб, 19/08/2017 - 20:48
Здравствуйте, уважаемые форумчане! Недавно закончил сборку модели танка, теперь стоит задача привести его в движение.
Собрал схему приём-передача:
Передатчик:
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);
}
}
Так вот, это всё не работает.Не могу понять в чём ошибка.Пожалуйста, помогите разобраться!!!
В строках 57-58 передатчика выход за границы массива (описан как [2] а цикл i<3), но это мелочи.
Сейчас внимательно подумайте и ответьте: Что передаёт Ваш передатчик приёмнику? Номера пинов сенсоров? Именно номера пинов? Если да, то в строках 49-50 они слишком большими получаются - аж до 1023. У приёмника есть столько пинов?
А если нет, то какого ж ... Вы полученные приёмником данные используете как номера пинов в строках 53 и 71 приёмника?
Скетч сами писали или скачали где-нибудь?
10-15% Скетча собственного производства остальное скачено.
Я понял в чём ошибка, но как это исправить? Функция map ?(В ардуино я неопытен, извини
Я понял в чём ошибка, ... Функция map ?
Вы себя слышите? Вы используете принятые данные в качестве номеров пинов! Какой map? Я вас просил ответить, что Вы передаёте - номера пинов или нет. Сами-то себе ответили?
но как это исправить?
Выбросить этот кусок бреда и написать нормальный скетч. Вы думаете, там других ошибок нет? Да они там в каждой строке, ну разве что может в строке 4 нет.
Ну, например, в строках 49-50 Вы читаете данные с analogRead. Результат может быть от 0 до 1023. А Вы пытаетесь его запихать в элементы байтового массива. Но в них же число, большее чем 255 не влезет! Куда пихаете-то?
И ещё там навалом всего - это реально кусок бреда.
В ардуино я неопытен
В программировании тоже. Учитесь.
Может быть так.
Передатчик
#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); } }Работет?
Не очень. Ранее я заливал тестовые скетчи и там молчание. Это может быть проблема с самими модулями?
Это может быть проблема с самими модулями?
Так, похоже, Вы не стого конца начали. начинать надо с того, что написать передатчик и приёмник по три строки кода каждый. Передатчик передатёт, скажем, слово "кака" или там "букву А", а приёмник печатает в сериал то. что принял. Сразу поймёте живы ли модули и убедитесь, что Вы умеете правильно передавать и принимать.
Вы правы. Сейчас попробую.
Итак,вот результаты.
#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); } }#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); }Получаю одни нули.
Откуда видно, что отправляете 999 и получаете нули? В коде передатчика нет 999 (в смысле в буффере отправки), а в коде приёмника нет печати того, что пришло.
Виноват ... отправку нашёл. Но печати по-прежнему не вижу. Встаьте печать data[0] после 30-ой строки
Всё равно в мониторе порта нули.
Значит, Вы неправильно читаете или передаёте. Упростите задачу.
Передавайте 1 байт и читайте 1 байт. Примерно так:
char a = 'A'; radio.write( &a, sizeof(a) ); ....................... char a = 'Z'; radio.read(&a,sizeof(a)); Serial.print("Result:"); Serial.println(a);Попробуйте
В мониторе порта приёмника только слово "Result: ".
Вы, букву A не руссукю туда вписали часом?
Давайте-ка скетч
#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); }Да и кстати, я не знаком с этой библиотекой, но меня очень смущают строки 27 в передатчике и 27 в приёмнике. По общим соображениям должно бы быть наоборот. Попробуйте взять простейший пример прямо из библиотеки и ту же букву передать/принять, ничего кроме этого в примере не меняя
А можно как-нибудь проверить модули по отдельности.Видит ли их ардуино и исправны ли они вообще?
А можно как-нибудь проверить модули по отдельности.Видит ли их ардуино и исправны ли они вообще?
Вам же советовали, используйте простейшие примеры из библиотеки, разберитесь с ними. Что у Вас в скетче приёмника делают openWritingPipe и StopListening? Стоит и схему подключения проверить, может там тоже ошибки...
Первое - конденсатор . Он есть ?
Второе - Именно приемник более капризен к питанию.
Третье - запитать приемник не от 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]); } }