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

#1
Сделал двухмоторный катер.Был робочий код,но решил добавить две сервы и два потенциометра.Натыкал всякого и не работает.Что не так?Помогите плз.
 
Последнее редактирование:
09.06.2019
141
23
18
#2
А где тот, который "был рабочий"? Сравнивать-то с чем? Предлагаете выискивать то, что Вы "натыкали всякого"?
И ещё: в строке меню редактора поста, рядом со смайликами, есть такие 3 точки .. там есть возможность вставить код понятно для программистов, а не как для кого попало .. Вы же рассчитываете на помощь, верно?
 
#4
Простите,не знал.Сервы нужны для выгрузки с двух бортов.
передатчик:

C++:
#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);

}
приёмник:

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

Старик Похабыч

Проходящий мимо
13.08.2019
261
51
28
Москва
#5
Ну дык развивай идею то.. сервы нужны что бы опрокинуть контейнер с прикормкой. Из этого следует, что они должны стоять на катере и управляться с пульта. Для чего нужны потенциометры ?

И что поломалось то? если изначально все работало, то можно решить, что катер выполнял свои функции. Какие ?
 
#6
Ну дык развивай идею то.. сервы нужны что бы опрокинуть контейнер с прикормкой. Из этого следует, что они должны стоять на катере и управляться с пульта. Для чего нужны потенциометры ?

И что поломалось то? если изначально все работало, то можно решить, что катер выполнял свои функции. Какие ?
А чем управлять сервами?Можно кнопкой поворачивать на 180 град.-не принципиально.Катер сделал пока с эхолотом,потому,что не разобрался с сервами сброс ещё не установил.
 

Старик Похабыч

Проходящий мимо
13.08.2019
261
51
28
Москва
#7
Я бы управлял именно кнопкой, нажал - опрокинул ВСЕ и вернулось в обратное положение. Потенциометр вижу только если надо не все выкинуть из контейнера, но на расстоянии в 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);

Приемник твой еще не смотрел. Для полноценной помощи нужно понять идею как ТЫ ХОТЕЛ это изобразить
 
#8
Я бы управлял именно кнопкой, нажал - опрокинул ВСЕ и вернулось в обратное положение. Потенциометр вижу только если надо не все выкинуть из контейнера, но на расстоянии в 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);

Приемник твой еще не смотрел. Для полноценной помощи нужно понять идею как ТЫ ХОТЕЛ это изобразить
Я в програмировании = -1.Код нашёл на просторах интернета.Прошил-работает.Принцип работы ты описал правильно.Нажал-открылось,отпустил-вернулось обратно.Но как написать код-НЕ ЗНАЮ.
 

Старик Похабыч

Проходящий мимо
13.08.2019
261
51
28
Москва
#9
Ну тут тяжело будет тогда... я про программирование -1
Возьму таймаут, что бы подумать как это сделать с минимальными МОИМИ затратами и МАКСИМЛЬНО тебе понятно, что бы дальше мог что то сам отлаживать
в целом склоняюсь к мысли место передачи 1 байта задействовать хотя бы 2-3 ) да, будет вместо передачи в 0,03 секунды тратиться целых (дробных) 0.1 секунды... я думаю пережить это множно
 

Старик Похабыч

Проходящий мимо
13.08.2019
261
51
28
Москва
#10
Для начала.... и для общего сведения, что бы было понятно, прошу без обид, я не знаю что тебе известно, лучше повторю, может кому еще пригодиться. есть такой размер данных байт. 1 байт = 8 бит. Бит элементарная частица информации, либо 1 либо 0. двоичная система исчисления. Диапазон чисел, которых можно задать одним байтом будет от 0 до 255, если сделать 256, то это будет опять 0. если посмотреть на байт в двоичном виде. то это будет 00000000 , если 0 и 11111111 если это 255.
Теперь к кнопкам. кнопка тоже имеет 2 состояния - нажата и отпущена. 1 нажата 0 отпущена. тогда 1 байтом можно спокойно описать состояние 8 кнопок. Обозначим для каждой нужной кнопки такие определения:
#define BTN0_BIT 0
#define BTN0_PIN 8
#define BTN1_BIT 1
#define BTN1_PIN 9
...
#define BTN7_BIT 7
#define BTN7_PIN 11

пины конечно можно менять

вместо описания int msg[1];
сделаем byte msg[2];
1-ый элемент будет кнопки, 2-ой стикики
msg[0]=digitalRead(BTN0_PIN)+(digitalRead(BTN1_PIN)<<BTN1_BIT)+(digitalRead(BTN7_PIN)<<BTN7_BIT);

в двоичном виде все отпущенные кнопки буду видны так 00000000 или просто 0
если нажата будет кнопка 0, то будет так 00000001, или 1 в десятичном виде
при нажатии второй кнопки будет 00000010 или 2 в десятичном виде
одновременное нажатие 0-ой и 1-ой кнопки будет 00000011 или 3

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

C++:
#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];
  }
}
 
Последнее редактирование:

Старик Похабыч

Проходящий мимо
13.08.2019
261
51
28
Москва
#11
В разделе передачи менять практически ничего не потребуется
было:
C++:
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);

}
будет (сериал убрал, но можно оставить)
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,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);
}
в результате приемнику отправится 2 байта, 1-ый кнопки, второй сначала 1 стик, потом другой.... хотя к черту, будем сразу передавать все. вот такимо образом, только надо массив описать так
byte msg[3];

C++:
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));
 

Старик Похабыч

Проходящий мимо
13.08.2019
261
51
28
Москва
#14
Да там и думать нечего. ща поменяем. обязательно в приемник добавляем теже определения битов кнопок
#define BTN0_BIT 0
#define BTN1_BIT 1
#define BTN7_BIT 7

пины нам не нужны
byte msg[3]; - тоже 3 байта (!)

C++:
if (radio.available()){
    radio.read(msg, 3);
    IsConnect = HIGH;
  }
  else{
    IsConnect = LOW;
  }
считываем по радио 3 байта и будем разбирать их на части, было
C++:
  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);
  }
считываем по радио 3 байта и будем разбирать их на части, стало
C++:
    ValStickX = map(msg[1], 0, 127, -255, 254);
    ValStickY = map(msg[2], 128, 255, -255, 254);
это перенесли по быстрому управление моторами, далее все так как и было.
осталось обработать нажатия кнопок, сейчас смотрю и не понимаю почем в исходных вариантах msh и msg , причем отправляют всегда msg а в случае с кнопкой проверяют msh, тут какой то косяк чтоли
 

Старик Похабыч

Проходящий мимо
13.08.2019
261
51
28
Москва
#15
По поводу кнопок. это в 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};
собственно и все. кнопки будут работать как такотовые, т.е. надал - надалось, отпустил - отпустилось. если надо делать запоминание состояния, то код надо модифицировать.. можно в приемнике, можно в передатчике
 
#16
По поводу кнопок. это в 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};
собственно и все. кнопки будут работать как такотовые, т.е. надал - надалось, отпустил - отпустилось. если надо делать запоминание состояния, то код надо модифицировать.. можно в приемнике, можно в передатчике
Это вынос мозга для меня,но большое спасибо за потраченое на меня время.Буду пробовать слепить всё в кучу.
 
#17
По поводу кнопок. это в 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};
собственно и все. кнопки будут работать как такотовые, т.е. надал - надалось, отпустил - отпустилось. если надо делать запоминание состояния, то код надо модифицировать.. можно в приемнике, можно в передатчике
Блин,чёто не то.Я наверное сильно туплю.

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

Старик Похабыч

Проходящий мимо
13.08.2019
261
51
28
Москва
#18
вот лишнее убрал, что надо перенес и закоментировал. Обработчик кнопок холостой. моторы должны работать

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);
}
 
#19
вот лишнее убрал, что надо перенес и закоментировал. Обработчик кнопок холостой. моторы должны работать

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);
}
Посмотри плз этот.Всё правильно?

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

Старик Похабыч

Проходящий мимо
13.08.2019
261
51
28
Москва
#20
Вот эта строка вообще лишняя
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