У меня две ардуино подключены через нрф24.

IKOR
Offline
Зарегистрирован: 26.04.2021

Привет. У меня две ардуино подключены через нрф24. На одной джойстик на другой л298н с двигателем. Проблема при наклоне джойстика мотор стоит, кода джойстик в обычном положении двигатель крутится. когда наклонён в другую сторону движок ускоряется. Нужно чтобы он крутился вперёд назад при наклоне , а в обычном положении стоял. Помогите разобраться пожалуйста.

IKOR
Offline
Зарегистрирован: 26.04.2021
//ПЕРЕДАТЧИК
#include<SPI.h>
#include "RF24.h"
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int massiv[2];
void setup(void){
radio.begin();
radio.openWritingPipe(pipe);
}
void loop() {

massiv[0] = map (analogRead(A1),0,1023,0,255);
massiv[1] = analogRead(A2);
radio.write(&massiv, sizeof(massiv));

}
//ПРИЕМНИК
#include <Servo.h>
#include<SPI.h>
#include "RF24.h"
#define JOY_DEADZONE 10
#define MOTOR1_IN 5
#define MOTOR1_PWM 6 
Servo servo1;
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int massiv[2];
int joyMiddle;
void setup(){
pinMode(MOTOR1_IN, OUTPUT);
pinMode(MOTOR1_PWM, OUTPUT);

joyMiddle = massiv[1];
servo1.attach(3);
delay(50);
radio.begin();
radio.openReadingPipe(1,pipe);
radio.startListening();
}
void loop(){
if (radio.available()){
  radio.read(&massiv,sizeof (massiv));}
servo1.write(map(massiv[0], 90, 180, 0,255));

motorControl(massiv[1],MOTOR1_IN,MOTOR1_PWM);}

void motorControl(int val, byte pinIN, byte pinPWM){
if (val > joyMiddle + JOY_DEADZONE){
  val = map (val,joyMiddle,1023,0,255);
  analogWrite (pinPWM, val);
  digitalWrite (pinIN, 0);}
  
  else if (val < joyMiddle - JOY_DEADZONE){
  val = map(val,joyMiddle,0,255,0);
  analogWrite (pinPWM, val);
  digitalWrite (pinIN,1);}
 
  else {
  digitalWrite (pinIN, 0);
  digitalWrite (pinPWM, 0);}
 
}

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

А где схема?

А Вы пробовали исключить передатчик, заменив его ком-портом?

Чего ноете? - работайте!

Вы ничего не сделали для отладки программно-аппаратного комплекса, а уже кричите - "НЕ РАБОТАЕТ!"

b707
Offline
Зарегистрирован: 26.05.2017

он второй или третий раз это размещает под разными никами... уже пора приравнивать ко спаму

Fenicksnet
Offline
Зарегистрирован: 25.03.2019
void motorControl(int val, byte pinIN, byte pinPWM){
if (val > joyMiddle + JOY_DEADZONE){
  val = map (val,joyMiddle,1023,0,255);
 

так вы переменную val получаете только в функции if .... как же оно выполнится

b707
Offline
Зарегистрирован: 26.05.2017

Fenicksnet пишет:
так вы переменную val получаете только в функции if .... как же оно выполнится

почему? - насколько я вижу, он ее из массива. принятого по радио, берет -  строка 46

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

ок. тогда  он не получает joyMiddle  , ему надо первый пакет получить и сохранить среднюю (обычное положение) .

34 joyMiddle = massiv[1];

ну и тогда ещё  предположу, что нужен еще 1 пин для л298, там вреде enA - pwm, in1 - cv, in2 - ccv.

 

b707
Offline
Зарегистрирован: 26.05.2017

Fenicksnet пишет:

ок. тогда  он не получает joyMiddle  , ему надо первый пакет получить и сохранить среднюю (обычное положение) .

oyMiddle = massiv[1];

возможно да... не знаю. что там за джойстик, если среднее положение нулевое - то будет работать и с таким joyMiddle

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

b707 пишет:

Fenicksnet пишет:

ок. тогда  он не получает joyMiddle  , ему надо первый пакет получить и сохранить среднюю (обычное положение) .

oyMiddle = massiv[1];

возможно да... не знаю. что там за джойстик, если среднее положение нулевое - то будет работать и с таким joyMiddle

среднее та наврятли нулевое, иначе в analogRead в передатчике должен быть минус xxx

b707
Offline
Зарегистрирован: 26.05.2017

Fenicksnet пишет:

среднее та наврятли нулевое, иначе в analogRead в передатчике должен быть минус xxx

наверно да, судя по строчке

oyMiddle = massiv[1];

тут в коде явно что-то планировалось не нулевое :) а потом потерялось

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

возможно как то так можно ...

int joyMiddle = 0;
setup()....
loop().....
{ if (radio.available()) {
    radio.read(&massiv, sizeof (massiv));
  }
  servo1.write(map(massiv[0], 90, 180, 0, 255));
  if (  joyMiddle == 0 ) { //  полученаем среднее положение
    joyMiddle = massiv[1];
  }
  else{
    val = massiv[1]; 
    if (val > joyMiddle + JOY_DEADZONE)
    { val = map (val, joyMiddle, 1023, 0, 255);
      analogWrite (pinPWM, valA);
      digitalWrite (pinIN, 0);
      digitalWrite (pinIN2, 1);
    }
    else if .... // крутим в другую сторону
    else..... // не крутим
  }}

 

IKOR
Offline
Зарегистрирован: 26.04.2021

Fenicksnet, я попробовал сделать так как Вы показали. Двигатели крутятся как надо, но через некоторое время система впадает в ступр и двигатель начинает тупо крутиться без команд джойстика

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

IKOR пишет:

Fenicksnet, я попробовал сделать так как Вы показали. Двигатели крутятся как надо, но через некоторое время система впадает в ступр и двигатель начинает тупо крутиться без команд джойстика

 

неверное после крайнего какого-то положения джойстика. попробовать заменить на например 

int joyMiddle = 5000;

и

  if (  joyMiddle == 5000 ) { //  полученаем среднее положение
    joyMiddle = massiv[1];
  }

и код в студию..

IKOR
Offline
Зарегистрирован: 26.04.2021
//ПЕРЕДАТЧИК
#include<SPI.h>
#include "RF24.h"
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int massiv[2];
void setup(void){
radio.begin();
radio.openWritingPipe(pipe);
}
void loop() {

massiv[0] = map (analogRead(A1),0,1023,0,255);
massiv[1] = analogRead(A2);
radio.write(&massiv, sizeof(massiv));
}
//ПРИЕМНИК
#include <Servo.h>
#include<SPI.h>
#include "RF24.h"
#define JOY_DEADZONE 10
#define MOTOR1_IN 5
#define MOTOR1_PWM 6 
Servo servo1;
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int massiv[2];
int joyMiddle = 0;
void setup(){
pinMode(MOTOR1_IN, OUTPUT);
pinMode(MOTOR1_PWM, OUTPUT);


servo1.attach(3);
delay(50);
radio.begin();
radio.openReadingPipe(1,pipe);
radio.startListening();
}
void loop(){
if (radio.available()){
  radio.read(&massiv,sizeof (massiv));}
servo1.write(map(massiv[0], 90, 180, 0,255));

motorControl(massiv[1],MOTOR1_IN,MOTOR1_PWM);}

void motorControl(int val, byte pinIN, byte pinPWM){
if (joyMiddle == 0 )
   joyMiddle = massiv[1];
else {
     val = massiv[1];
     if (val > joyMiddle + JOY_DEADZONE){
       val = map (val,joyMiddle,1023,0,255);
       analogWrite (pinPWM, val);
       digitalWrite (pinIN, 0);}
       
     else if (val < joyMiddle - JOY_DEADZONE){
       val = map(val,joyMiddle,0,255,0);
        analogWrite (pinPWM, val);
        digitalWrite (pinIN,1);}
       
     else {
        digitalWrite (pinIN, 0);
        digitalWrite (pinPWM, 0);}
     
}}

 

IKOR
Offline
Зарегистрирован: 26.04.2021

я заменил 0 на 5000 стало как было в начале. тоесть когда joymiddle = 0 все работает как надо только в какойто момент система зависает

Fenicksnet
Offline
Зарегистрирован: 25.03.2019
//ПРИЕМНИК
#include <Servo.h>
#include<SPI.h>
#include "RF24.h"
#define JOY_DEADZONE 10
#define MOTOR1_IN 5
#define MOTOR1_PWM 6 
Servo servo1;
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int massiv[2];
int joyMiddle = 0;
void setup(){
pinMode(MOTOR1_IN, OUTPUT);
pinMode(MOTOR1_PWM, OUTPUT);


servo1.attach(3);
delay(50);
radio.begin();
radio.openReadingPipe(1,pipe);
radio.startListening();
}
void loop(){
if (radio.available()){
  radio.read(&massiv,sizeof (massiv));}
servo1.write(map(massiv[0], 90, 180, 0,255));

     val = massiv[1];

if (joyMiddle == 0 ){
   joyMiddle = massiv[1];}
else {

     if (val > joyMiddle + JOY_DEADZONE){
       val = map (val,joyMiddle,1023,0,255);
       analogWrite (pinPWM, val);
       digitalWrite (pinIN, 0);}
       
     else if (val < joyMiddle - JOY_DEADZONE){
       val = map(val,joyMiddle,0,255,0);
        analogWrite (pinPWM, val);
        digitalWrite (pinIN,1);}
       
     else {
        digitalWrite (pinIN, 0);
        digitalWrite (pinPWM, 0);}
     
}}

Пишу с телефона, проверяем исправляем

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

IKOR пишет:

я заменил 0 на 5000 стало как было в начале. тоесть когда joymiddle = 0 все работает как надо только в какойто момент система зависает

и мне не понятна ваша схема подключения 298

IKOR
Offline
Зарегистрирован: 26.04.2021

у меня аналог л298 mx1508 . он подключен точно также как и 298 in1 5 in2 6

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

IKOR пишет:

у меня аналог л298 mx1508 . он подключен точно также как и 298 in1 5 in2 6

тогда у вас

     if (val > joyMiddle + JOY_DEADZONE){
       val = map (val,joyMiddle,1023,0,255);
       analogWrite (pinPWM, val);
       digitalWrite (pinIN, 0);}
       
     else if (val < joyMiddle - JOY_DEADZONE){
       val = map(val,joyMiddle,0,255,0);
        analogWrite (pinPWM, val);
        digitalWrite (pinIN,1);}

должно наверное как то так быть

     if (val > joyMiddle + JOY_DEADZONE){
       val = map (val,joyMiddle,1023,0,255);
       analogWrite (pinPWM, val);
       digitalWrite (pinIN, 0);}
       
     else if (val < joyMiddle - JOY_DEADZONE){
       val = map(val,joyMiddle,0,255,0);
        analogWrite (pinPWM, 0l);
        digitalWrite (pinIN,val);}

а может и как то так

//ПРИЕМНИК
#include <Servo.h>
#include<SPI.h>
#include "RF24.h"
#define JOY_DEADZONE 10
#define MOTOR1_IN1 5
#define MOTOR1_IN2 6
Servo servo1;
RF24 radio(9, 10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int massiv[2];
int joyMiddle = 5000;
int Speed;
void setup() {
  pinMode(MOTOR1_IN1, OUTPUT);
  pinMode(MOTOR1_IN2, OUTPUT);
  servo1.attach(3);
  delay(50);
  radio.begin();
  radio.openReadingPipe(1, pipe);
  radio.startListening();
}
void loop() {
  if (radio.available()) {
    radio.read(&massiv, sizeof (massiv));
  }
  servo1.write(map(massiv[0], 90, 180, 0, 255));
  if (joyMiddle == 5000 ) {
    joyMiddle = massiv[1];
  }
  else {
    Speed = massiv[1];
    if (Speed > joyMiddle + JOY_DEADZONE) {
      Speed = map (Speed, joyMiddle, 1023, 0, 255);
      analogWrite (MOTOR1_IN1, Speed);
      digitalWrite (MOTOR1_IN2, 0);
    }
    else if (Speed < joyMiddle - JOY_DEADZONE) {
      Speed = map(Speed, joyMiddle, 0, 255, 0);
      digitalWrite (MOTOR1_IN1, 0);
      analogWrite (MOTOR1_IN2, Speed);
    }
    else {
      digitalWrite (MOTOR1_IN1, 0);
      digitalWrite (MOTOR1_IN2, 0);
    }
  }
}