Сделал двухмоторный катер.Был робочий код,но решил добавить две сервы и два потенциометра.Натыкал всякого и не работает.Что не так?Помогите плз.
Изменено:
#include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24
#include <RF24.h> // библиотека для работы с nRF24L01+
#include <RF24_config.h>
#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI.
RF24 radio(9,10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN).
const uint64_t pipe = 0xE8E8F0F0E1LL;
int msg[1];
int msh[1];
int potpin_1 = A0;
int val_1;
int potpin_2 = A1;
int val_2;
int butPin = 8;
void setup(void){
radio.begin(); // Инициируем работу nRF24L01+.
radio.openWritingPipe( pipe); // Открываем трубу с идентификатором pipe
Serial.begin(9600);
radio.setChannel(0x60); // Указываем канал передачи данных (от 0 до 127)
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
//должна быть одинакова на приёмнике и передатчике!
//при самой низкой скорости имеем самую высокую чувствительность и дальность!!
}
void loop() {
if (digitalRead(butPin) == HIGH){msh[1] = 255;radio.write(msg, 1);}
Serial.println(msh[1]);
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, 254),msg[0] = val_2,radio.write(msg, 1);
}
#include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24
#include <RF24.h> // библиотека для работы с nRF24L01+
#include <RF24_config.h>
#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI.
#define led 8
RF24 radio(9,10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN).
const uint64_t pipe = 0xE8E8F0F0E1LL;
//int msg[1];
int msg[1];
int msh[1];
boolean ledOn = false;
boolean lastBut = HIGH;
long time = 0;
long debounce = 300;
int data;
int data1;
int pos;
int fspeed; // движение вперед
int bspeed; // движение назад
int steer;
const int in1 = 7; // direction pin 1
const int in2 = 6; // direction pin 2
const int in3 = 4; // direction pin 1
const int in4 = 2; // direction pin 2
const int ena = 5; // PWM pin to change speed
const int enb = 3;
byte IsConnect;
void setup()
{
pinMode(led, OUTPUT);
Serial.begin(9600);
pinMode(in1, OUTPUT); // connection to L298n
pinMode(in2, OUTPUT); // connection to L298n
pinMode(ena, OUTPUT); // connection to L298n
pinMode(in3, OUTPUT); // connection to L298n
pinMode(in4, OUTPUT); // connection to L298n
pinMode(enb, OUTPUT); // connection to L298n
//Настройка радиоканала
delay(50);//Задержка 50 миллисекунд.
radio.begin();//активировать модуль
radio.openReadingPipe(1,pipe); //открываем канал для передачи данных
radio.startListening(); //Слушаем радиоэфир, мы приёмник
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
//должна быть одинакова на приёмнике и передатчике!
//при самой низкой скорости имеем самую высокую чувствительность и дальность!!
}
int MotoL, MotoR;
int ValStickX, ValStickY;
void loop() {
if (radio.available()){
radio.read(msg, 1);
IsConnect = HIGH;
}
else{
IsConnect = LOW;
}
if (msh[1] == 255 && lastBut == HIGH && millis() - time > debounce)
{
ledOn = !ledOn;
lastBut = HIGH;
time = millis();
}
else // Иначе,
{
lastBut = digitalRead(lastBut);
}
Serial.println(msh[1]);
if (msg[0] <128 && msg[0] >-1){
data = msg[0];
ValStickX = map(data, 0, 127, -255, 254);
}
if (msg[0] < 254 && msg[0] > 127){
data = msg[0];
ValStickY = map(data, 128, 255, -255, 254);
}
if(abs(ValStickX) < 20){
ValStickX = 0;
}
if(abs(ValStickY) < 20){
ValStickY = 0;
}
MotoL = ValStickX - (ValStickY /1.2);
MotoR = ValStickX + (ValStickY /1.2);
if(IsConnect==LOW){
MotoL=0;
}
if(IsConnect==LOW){
MotoR=0;
}
// Serial.println("ML: "+String(MotoL)+", MR: "+String(MotoR));
if(MotoL > 255){
MotoL = 255;
}
if(MotoR > 255){
MotoR = 255;
}
if(MotoL < -255){
MotoL = -255;
}
if(MotoR < -255){
MotoR = -255;
}
Control4WD(MotoL, MotoR);
}
void Control4WD(int mLeft, int mRight){
// Serial.println("ML: "+String(mLeft)+", MR: "+String(mRight));
bool directionL, directionR; // направление вращение для L298N
byte valueL, valueR; // значение ШИМ M1, M2 (0-255)
if(mLeft > 0){
valueL = mLeft;
directionL = 0;
}
else if(mLeft < 0){
valueL = abs(mLeft);
directionL = 1;
}
else{
directionL = 0;
valueL = 0;
}
if(mRight > 0){
valueR = mRight;
directionR = 0;
}
else if(mRight < 0){
valueR = abs(mRight);
directionR = 1;
}
else {
directionR = 0;
valueR = 0;
}
digitalWrite(in1, directionL);
digitalWrite(in2, !directionL);
digitalWrite(in3, directionR);
digitalWrite(in4, !directionR);
analogWrite(ena, valueL);
analogWrite(enb, valueR);
}
А чем управлять сервами?Можно кнопкой поворачивать на 180 град.-не принципиально.Катер сделал пока с эхолотом,потому,что не разобрался с сервами сброс ещё не установил.Ну дык развивай идею то.. сервы нужны что бы опрокинуть контейнер с прикормкой. Из этого следует, что они должны стоять на катере и управляться с пульта. Для чего нужны потенциометры ?
И что поломалось то? если изначально все работало, то можно решить, что катер выполнял свои функции. Какие ?
Я в програмировании = -1.Код нашёл на просторах интернета.Прошил-работает.Принцип работы ты описал правильно.Нажал-открылось,отпустил-вернулось обратно.Но как написать код-НЕ ЗНАЮ.Я бы управлял именно кнопкой, нажал - опрокинул ВСЕ и вернулось в обратное положение. Потенциометр вижу только если надо не все выкинуть из контейнера, но на расстоянии в 50 оценить количество выкинутой прикормки я думаю будет проблематично.
Смотрю код, и мне он кажется странным... управлением занимается 3 байта, хотя переменная объявлена как int - 2 байта. Состояние кнопки отсылается только если она нажата. Далее отсылается состояние потенциометров. видимо это положение стика упраления.
Получается, что приходит на приемник то 2, то 3 байта.. Антидребезго повесили аж на приемник! Видимо 255 это признак нажатой кнопки, и если получено это число, то кнопка и все. Если число не 255...
О, понял как дальше все читается... Управление идет 1 байтом. если 255, то нажата кнопка , от 128 до 254, от 0 до 127 другой стик..
Но 1 байт.. экономия )
Вернемся к началу и твоим "неправильным " скетчам.
в 1-ых 2-х строках идет отправка байта , это штатные потенциометры, а в последних 2-х отправки данных НЕТ. Да и диапазона в байте под них нет.
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, 254),msg[0] = val_2,radio.write(msg, 1);
val_3 = analogRead(potent),val_3 = map(potent, 0, 1023, 0, 180);
val_4 = analogRead(potent_2),val_4 = map(potent_2, 0, 1023, 0, 180);
Приемник твой еще не смотрел. Для полноценной помощи нужно понять идею как ТЫ ХОТЕЛ это изобразить
#define BTN0_BIT 0
#define BTN0_PIN 8
#define BTN1_BIT 1
#define BTN1_PIN 9
#define BTN7_BIT 7
#define BTN7_PIN 11
byte msg[2];
byte Oldmsg[2];
void setup() {
pinMode(BTN0_PIN, INPUT_PULLUP);
pinMode(BTN1_PIN , INPUT_PULLUP);
pinMode(BTN7_PIN, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
msg[0] = !digitalRead(BTN0_PIN) + !(digitalRead(BTN1_PIN) << BTN1_BIT) + !(digitalRead(BTN7_PIN) << BTN7_BIT);
if (Oldmsg[0] != msg[0])
{
Serial.println(msg[0], BIN);
Oldmsg[0] = msg[0];
}
}
void loop() {
if (digitalRead(butPin) == HIGH){msh[1] = 255;radio.write(msg, 1);}
Serial.println(msh[1]);
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, 254),msg[0] = val_2,radio.write(msg, 1);
}
void loop() {
msg[0] = !digitalRead(BTN0_PIN) + !(digitalRead(BTN1_PIN) << BTN1_BIT) + !(digitalRead(BTN7_PIN) << BTN7_BIT);
val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[1] = val_1,radio.write(msg, 2);
val_2 = analogRead(potpin_2),val_2 = map(val_2, 0, 1023, 128, 254),msg[1] = val_2,radio.write(msg, 2);
}
msg[0] = !digitalRead(BTN0_PIN) + !(digitalRead(BTN1_PIN) << BTN1_BIT) + !(digitalRead(BTN7_PIN) << BTN7_BIT);
val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[1] = val_1,radio.write(msg, sizeof(msg));
val_2 = analogRead(potpin_2),val_2 = map(val_2, 0, 1023, 128, 254),msg[2] = val_2,radio.write(msg, sizeof(msg));
Принцип понял.Если придумаешь с приёмником,попробую на практике.Если понял принцип как добавлять кнопки и убирать - отпишись, продолжим с приемником
if (radio.available()){
radio.read(msg, 3);
IsConnect = HIGH;
}
else{
IsConnect = LOW;
}
if (msg[0] <128 && msg[0] >-1){
data = msg[0];
ValStickX = map(data, 0, 127, -255, 254);
}
if (msg[0] < 254 && msg[0] > 127){
data = msg[0];
ValStickY = map(data, 128, 255, -255, 254);
}
ValStickX = map(msg[1], 0, 127, -255, 254);
ValStickY = map(msg[2], 128, 255, -255, 254);
if (msh[1] == 255 && lastBut == HIGH && millis() - time > debounce)
{
ledOn = !ledOn;
lastBut = HIGH;
time = millis();
}
else // Иначе,
{
lastBut = digitalRead(lastBut);
}
if ((msg[0] && 1)>0) {нажата кнопка 0} else {не нажата кнопка 0};
if ((msg[0] && 1<< BTN1_BIT)>0) {нажата кнопка 1} else {не нажата кнопка 1};
if ((msg[0] && 1<< BTN7_BIT)>0) {нажата кнопка 1} else {не нажата кнопка 7};
Это вынос мозга для меня,но большое спасибо за потраченое на меня время.Буду пробовать слепить всё в кучу.По поводу кнопок. это в 1-ом байте массива. вот здесь опять этот msh, который почему то должен меняться. я не нашел где..
проверка на указанные кнопки будет такойC++:if (msh[1] == 255 && lastBut == HIGH && millis() - time > debounce) { ledOn = !ledOn; lastBut = HIGH; time = millis(); } else // Иначе, { lastBut = digitalRead(lastBut); }
собственно и все. кнопки будут работать как такотовые, т.е. надал - надалось, отпустил - отпустилось. если надо делать запоминание состояния, то код надо модифицировать.. можно в приемнике, можно в передатчикеC++:if ((msg[0] && 1)>0) {нажата кнопка 0} else {не нажата кнопка 0}; if ((msg[0] && 1<< BTN1_BIT)>0) {нажата кнопка 1} else {не нажата кнопка 1}; if ((msg[0] && 1<< BTN7_BIT)>0) {нажата кнопка 1} else {не нажата кнопка 7};
Блин,чёто не то.Я наверное сильно туплю.По поводу кнопок. это в 1-ом байте массива. вот здесь опять этот msh, который почему то должен меняться. я не нашел где..
проверка на указанные кнопки будет такойC++:if (msh[1] == 255 && lastBut == HIGH && millis() - time > debounce) { ledOn = !ledOn; lastBut = HIGH; time = millis(); } else // Иначе, { lastBut = digitalRead(lastBut); }
собственно и все. кнопки будут работать как такотовые, т.е. надал - надалось, отпустил - отпустилось. если надо делать запоминание состояния, то код надо модифицировать.. можно в приемнике, можно в передатчикеC++:if ((msg[0] && 1)>0) {нажата кнопка 0} else {не нажата кнопка 0}; if ((msg[0] && 1<< BTN1_BIT)>0) {нажата кнопка 1} else {не нажата кнопка 1}; if ((msg[0] && 1<< BTN7_BIT)>0) {нажата кнопка 1} else {не нажата кнопка 7};
#include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24
#include <RF24.h> // библиотека для работы с nRF24L01+
#include <RF24_config.h>
#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI.
#define led 8
RF24 radio(9,10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN).
const uint64_t pipe = 0xE8E8F0F0E1LL;
//int msg[1];
byte msg[3];
int msh[1];
boolean ledOn = false;
boolean lastBut = HIGH;
long time = 0;
long debounce = 300;
int data;
int data1;
int pos;
int fspeed; // движение вперед
int bspeed; // движение назад
int steer;
#define BTN0_BIT 0
#define BTN1_BIT 1
#define BTN7_BIT 7
const int in1 = 7; // direction pin 1
const int in2 = 6; // direction pin 2
const int in3 = 4; // direction pin 1
const int in4 = 2; // direction pin 2
const int ena = 5; // PWM pin to change speed
const int enb = 3;
byte IsConnect;
void setup()
{
pinMode(led, OUTPUT);
Serial.begin(9600);
pinMode(in1, OUTPUT); // connection to L298n
pinMode(in2, OUTPUT); // connection to L298n
pinMode(ena, OUTPUT); // connection to L298n
pinMode(in3, OUTPUT); // connection to L298n
pinMode(in4, OUTPUT); // connection to L298n
pinMode(enb, OUTPUT); // connection to L298n
//Настройка радиоканала
delay(50);//Задержка 50 миллисекунд.
radio.begin();//активировать модуль
radio.openReadingPipe(1,pipe); //открываем канал для передачи данных
radio.startListening(); //Слушаем радиоэфир, мы приёмник
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
//должна быть одинакова на приёмнике и передатчике!
//при самой низкой скорости имеем самую высокую чувствительность и дальность!!
}
int MotoL, MotoR;
int ValStickX, ValStickY;
void loop() {
if (radio.available()){
radio.read(msg, 3);
IsConnect = HIGH;
}
else{
IsConnect = LOW;
}
else // Иначе,
{
lastBut = digitalRead(lastBut);
}
ValStickX = map(msg[1], 0, 127, -255, 254);
ValStickY = map(msg[2], 128, 255, -255, 254);
}
if(abs(ValStickX) < 20){
ValStickX = 0;
}
if(abs(ValStickY) < 20){
ValStickY = 0;
}
MotoL = ValStickX - (ValStickY /1.2);
MotoR = ValStickX + (ValStickY /1.2);
if(IsConnect==LOW){
MotoL=0;
}
if(IsConnect==LOW){
MotoR=0;
}
// Serial.println("ML: "+String(MotoL)+", MR: "+String(MotoR));
if(MotoL > 255){
MotoL = 255;
}
if(MotoR > 255){
MotoR = 255;
}
if(MotoL < -255){
MotoL = -255;
}
if(MotoR < -255){
MotoR = -255;
}
Control4WD(MotoL, MotoR);
}
void Control4WD(int mLeft, int mRight){
// Serial.println("ML: "+String(mLeft)+", MR: "+String(mRight));
bool directionL, directionR; // направление вращение для L298N
byte valueL, valueR; // значение ШИМ M1, M2 (0-255)
if(mLeft > 0){
valueL = mLeft;
directionL = 0;
}
else if(mLeft < 0){
valueL = abs(mLeft);
directionL = 1;
}
else{
directionL = 0;
valueL = 0;
}
if(mRight > 0){
valueR = mRight;
directionR = 0;
}
else if(mRight < 0){
valueR = abs(mRight);
directionR = 1;
}
else {
directionR = 0;
valueR = 0;
}
if ((msg[0] && 1)>0) {нажата кнопка 0} else {не нажата кнопка 0};
if ((msg[0] && 1<< BTN1_BIT)>0) {нажата кнопка 1} else {не нажата кнопка 1};
if ((msg[0] && 1<< BTN7_BIT)>0) {нажата кнопка 1} else {не нажата кнопка 7};
}
digitalWrite(in1, directionL);
digitalWrite(in2, !directionL);
digitalWrite(in3, directionR);
digitalWrite(in4, !directionR);
analogWrite(ena, valueL);
analogWrite(enb, valueR);
}
#include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24
#include <RF24.h> // библиотека для работы с nRF24L01+
#include <RF24_config.h>
#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI.
#define led 8
RF24 radio(9, 10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN).
const uint64_t pipe = 0xE8E8F0F0E1LL;
byte msg[3];
boolean ledOn = false;
boolean lastBut = HIGH;
long time = 0;
long debounce = 300;
int data;
int data1;
int pos;
int fspeed; // движение вперед
int bspeed; // движение назад
int steer;
#define BTN0_BIT 0
#define BTN1_BIT 1
#define BTN7_BIT 7
const int in1 = 7; // direction pin 1
const int in2 = 6; // direction pin 2
const int in3 = 4; // direction pin 1
const int in4 = 2; // direction pin 2
const int ena = 5; // PWM pin to change speed
const int enb = 3;
byte IsConnect;
void setup()
{
pinMode(led, OUTPUT);
Serial.begin(9600);
pinMode(in1, OUTPUT); // connection to L298n
pinMode(in2, OUTPUT); // connection to L298n
pinMode(ena, OUTPUT); // connection to L298n
pinMode(in3, OUTPUT); // connection to L298n
pinMode(in4, OUTPUT); // connection to L298n
pinMode(enb, OUTPUT); // connection to L298n
//Настройка радиоканала
delay(50);//Задержка 50 миллисекунд.
radio.begin();//активировать модуль
radio.openReadingPipe(1, pipe); //открываем канал для передачи данных
radio.startListening(); //Слушаем радиоэфир, мы приёмник
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
//должна быть одинакова на приёмнике и передатчике!
//при самой низкой скорости имеем самую высокую чувствительность и дальность!!
}
int MotoL, MotoR;
int ValStickX, ValStickY;
void loop() {
if (radio.available()) {
radio.read(msg, 3);
IsConnect = HIGH;
}
else {
IsConnect = LOW;
}
ValStickX = map(msg[1], 0, 127, -255, 254);
ValStickY = map(msg[2], 128, 255, -255, 254);
if (abs(ValStickX) < 20) {
ValStickX = 0;
}
if (abs(ValStickY) < 20) {
ValStickY = 0;
}
MotoL = ValStickX - (ValStickY / 1.2);
MotoR = ValStickX + (ValStickY / 1.2);
if (IsConnect == LOW) {
MotoL = 0;
}
if (IsConnect == LOW) {
MotoR = 0;
}
// Serial.println("ML: "+String(MotoL)+", MR: "+String(MotoR));
if (MotoL > 255) {
MotoL = 255;
}
if (MotoR > 255) {
MotoR = 255;
}
if (MotoL < -255) {
MotoL = -255;
}
if (MotoR < -255) {
MotoR = -255;
}
Control4WD(MotoL, MotoR); // Это только для моторов, не надо сюда вставлять кнопки
// сюда вставляем обработку кнопок
if ((msg[0] && 1) > 0) {
// нажата кнопка 0
} else {
// не нажата кнопка 0
};
if ((msg[0] && 1 << BTN1_BIT) > 0) {
// нажата кнопка 1
} else {
// не нажата кнопка 1
};
if ((msg[0] && 1 << BTN7_BIT) > 0) {
// нажата кнопка 7
} else {
// не нажата кнопка 7
};
}
void Control4WD(int mLeft, int mRight) {
// Serial.println("ML: "+String(mLeft)+", MR: "+String(mRight));
bool directionL, directionR; // направление вращение для L298N
byte valueL, valueR; // значение ШИМ M1, M2 (0-255)
if (mLeft > 0) {
valueL = mLeft;
directionL = 0;
}
else if (mLeft < 0) {
valueL = abs(mLeft);
directionL = 1;
}
else {
directionL = 0;
valueL = 0;
}
if (mRight > 0) {
valueR = mRight;
directionR = 0;
}
else if (mRight < 0) {
valueR = abs(mRight);
directionR = 1;
}
else {
directionR = 0;
valueR = 0;
}
digitalWrite(in1, directionL);
digitalWrite(in2, !directionL);
digitalWrite(in3, directionR);
digitalWrite(in4, !directionR);
analogWrite(ena, valueL);
analogWrite(enb, valueR);
}
Посмотри плз этот.Всё правильно?вот лишнее убрал, что надо перенес и закоментировал. Обработчик кнопок холостой. моторы должны работать
C++:#include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24 #include <RF24.h> // библиотека для работы с nRF24L01+ #include <RF24_config.h> #include <SPI.h> // Подключаем библиотеку для работы с шиной SPI. #define led 8 RF24 radio(9, 10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN). const uint64_t pipe = 0xE8E8F0F0E1LL; byte msg[3]; boolean ledOn = false; boolean lastBut = HIGH; long time = 0; long debounce = 300; int data; int data1; int pos; int fspeed; // движение вперед int bspeed; // движение назад int steer; #define BTN0_BIT 0 #define BTN1_BIT 1 #define BTN7_BIT 7 const int in1 = 7; // direction pin 1 const int in2 = 6; // direction pin 2 const int in3 = 4; // direction pin 1 const int in4 = 2; // direction pin 2 const int ena = 5; // PWM pin to change speed const int enb = 3; byte IsConnect; void setup() { pinMode(led, OUTPUT); Serial.begin(9600); pinMode(in1, OUTPUT); // connection to L298n pinMode(in2, OUTPUT); // connection to L298n pinMode(ena, OUTPUT); // connection to L298n pinMode(in3, OUTPUT); // connection to L298n pinMode(in4, OUTPUT); // connection to L298n pinMode(enb, OUTPUT); // connection to L298n //Настройка радиоканала delay(50);//Задержка 50 миллисекунд. radio.begin();//активировать модуль radio.openReadingPipe(1, pipe); //открываем канал для передачи данных radio.startListening(); //Слушаем радиоэфир, мы приёмник 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 //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! } int MotoL, MotoR; int ValStickX, ValStickY; void loop() { if (radio.available()) { radio.read(msg, 3); IsConnect = HIGH; } else { IsConnect = LOW; } ValStickX = map(msg[1], 0, 127, -255, 254); ValStickY = map(msg[2], 128, 255, -255, 254); if (abs(ValStickX) < 20) { ValStickX = 0; } if (abs(ValStickY) < 20) { ValStickY = 0; } MotoL = ValStickX - (ValStickY / 1.2); MotoR = ValStickX + (ValStickY / 1.2); if (IsConnect == LOW) { MotoL = 0; } if (IsConnect == LOW) { MotoR = 0; } // Serial.println("ML: "+String(MotoL)+", MR: "+String(MotoR)); if (MotoL > 255) { MotoL = 255; } if (MotoR > 255) { MotoR = 255; } if (MotoL < -255) { MotoL = -255; } if (MotoR < -255) { MotoR = -255; } Control4WD(MotoL, MotoR); // Это только для моторов, не надо сюда вставлять кнопки // сюда вставляем обработку кнопок if ((msg[0] && 1) > 0) { // нажата кнопка 0 } else { // не нажата кнопка 0 }; if ((msg[0] && 1 << BTN1_BIT) > 0) { // нажата кнопка 1 } else { // не нажата кнопка 1 }; if ((msg[0] && 1 << BTN7_BIT) > 0) { // нажата кнопка 7 } else { // не нажата кнопка 7 }; } void Control4WD(int mLeft, int mRight) { // Serial.println("ML: "+String(mLeft)+", MR: "+String(mRight)); bool directionL, directionR; // направление вращение для L298N byte valueL, valueR; // значение ШИМ M1, M2 (0-255) if (mLeft > 0) { valueL = mLeft; directionL = 0; } else if (mLeft < 0) { valueL = abs(mLeft); directionL = 1; } else { directionL = 0; valueL = 0; } if (mRight > 0) { valueR = mRight; directionR = 0; } else if (mRight < 0) { valueR = abs(mRight); directionR = 1; } else { directionR = 0; valueR = 0; } digitalWrite(in1, directionL); digitalWrite(in2, !directionL); digitalWrite(in3, directionR); digitalWrite(in4, !directionR); analogWrite(ena, valueL); analogWrite(enb, valueR); }
#include <SPI.h>
#include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24
#include <RF24.h> // библиотека для работы с nRF24L01+
#include <RF24_config.h>
#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI.
RF24 radio(9,10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN).
const uint64_t pipe = 0xE8E8F0F0E1LL;
byte msg[3];
byte Oldmsg[2];
int msh[1];
int potpin_1 = A0;
int val_1;
int potpin_2 = A1;
int val_2;
int butPin = 8;
#define BTN0_PIN 8
#define BTN1_BIT 1
#define BTN1_PIN 9
#define BTN7_BIT 7
#define BTN7_PIN 11
void setup(void){
pinMode(BTN0_PIN, INPUT_PULLUP);
pinMode(BTN1_PIN , INPUT_PULLUP);
pinMode(BTN7_PIN, INPUT_PULLUP);
radio.begin(); // Инициируем работу nRF24L01+.
radio.openWritingPipe( pipe); // Открываем трубу с идентификатором pipe
Serial.begin(9600);
radio.setChannel(0x60); // Указываем канал передачи данных (от 0 до 127)
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
//должна быть одинакова на приёмнике и передатчике!
//при самой низкой скорости имеем самую высокую чувствительность и дальность!!
}
void loop() {
msg[0] = !digitalRead(BTN0_PIN) + !(digitalRead(BTN1_PIN) << BTN1_BIT) + !(digitalRead(BTN7_PIN) << BTN7_BIT);
if (Oldmsg[0] != msg[0])
{
Serial.println(msg[0], BIN);
Oldmsg[0] = msg[0];
if (digitalRead(butPin) == HIGH){msh[1] = 255;radio.write(msg, 1);}
Serial.println(msh[1]);
msg[0] = !digitalRead(BTN0_PIN) + !(digitalRead(BTN1_PIN) << BTN1_BIT) + !(digitalRead(BTN7_PIN) << BTN7_BIT);
val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[1] = val_1,radio.write(msg, sizeof(msg));
val_2 = analogRead(potpin_2),val_2 = map(val_2, 0, 1023, 128, 254),msg[2] = val_2,radio.write(msg, sizeof(msg));
}
}
Правильно?Вот эта строка вообще лишняя
if (digitalRead(butPin) == HIGH){msh[1] = 255;radio.write(msg, 1);}
во первых обработку кнопок мы уже сделали выше, а во вторых msh[1] никогда не передается в приемник. Почему - не знаю.
еще можно убрать в этой строке
val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[1] = val_1,radio.write(msg, sizeof(msg));
вот эту часть
,radio.write(msg, sizeof(msg))
Передача будет после чтения значения 2-го потенциометра, сразу всех данных, и нажатых кнопок и потенциометров
да, кнопка butPin она же BTN0_PIN
#include <SPI.h>
#include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24
#include <RF24.h> // библиотека для работы с nRF24L01+
#include <RF24_config.h>
#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI.
RF24 radio(9,10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN).
const uint64_t pipe = 0xE8E8F0F0E1LL;
byte msg[3];
byte Oldmsg[2];
int msh[1];
int potpin_1 = A0;
int val_1;
int potpin_2 = A1;
int val_2;
#define BTN0_BIT 0
#define BTN0_PIN 8
#define BTN1_BIT 1
#define BTN1_PIN 9
#define BTN7_BIT 7
#define BTN7_PIN 11
void setup(void){
pinMode(BTN0_PIN, INPUT_PULLUP);
pinMode(BTN1_PIN , INPUT_PULLUP);
pinMode(BTN7_PIN, INPUT_PULLUP);
radio.begin(); // Инициируем работу nRF24L01+.
radio.openWritingPipe( pipe); // Открываем трубу с идентификатором pipe
Serial.begin(9600);
radio.setChannel(0x60); // Указываем канал передачи данных (от 0 до 127)
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
//должна быть одинакова на приёмнике и передатчике!
//при самой низкой скорости имеем самую высокую чувствительность и дальность!!
}
void loop() {
msg[0] = !digitalRead(BTN0_PIN) + !(digitalRead(BTN1_PIN) << BTN1_BIT) + !(digitalRead(BTN7_PIN) << BTN7_BIT);
if (Oldmsg[0] != msg[0])
{
Serial.println(msg[0], BIN);
Oldmsg[0] = msg[0];
Serial.println(msh[1]);
msg[0] = !digitalRead(BTN0_PIN) + !(digitalRead(BTN1_PIN) << BTN1_BIT) + !(digitalRead(BTN7_PIN) << BTN7_BIT);
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, 128, 254),msg[2] = val_2,radio.write(msg, sizeof(msg));
}
}
void loop() {
msg[0] = !digitalRead(BTN0_PIN) + !(digitalRead(BTN1_PIN) << BTN1_BIT) + !(digitalRead(BTN7_PIN) << BTN7_BIT);
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, 128, 254),msg[2] = val_2,radio.write(msg, sizeof(msg));
}
Извини не понял,что эти строки лишние?вот эту часть я написал только для того, что бы в порт не выводить постоянно одно и то же, а только при изменении состояния кнопокC++:void loop() { msg[0] = !digitalRead(BTN0_PIN) + !(digitalRead(BTN1_PIN) << BTN1_BIT) + !(digitalRead(BTN7_PIN) << BTN7_BIT); 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, 128, 254),msg[2] = val_2,radio.write(msg, sizeof(msg)); }
Понял.Ещё вопрос,библиотеку сервы мы не используем?Кнопки подключаем на (-) и на нужный пин,а серву (+) (-) и пин?Это все что надо оставить в цикле loop