У меня две ардуино подключены через нрф24.
- Войдите на сайт для отправки комментариев
Пнд, 26/04/2021 - 18:41
Привет. У меня две ардуино подключены через нрф24. На одной джойстик на другой л298н с двигателем. Проблема при наклоне джойстика мотор стоит, кода джойстик в обычном положении двигатель крутится. когда наклонён в другую сторону движок ускоряется. Нужно чтобы он крутился вперёд назад при наклоне , а в обычном положении стоял. Помогите разобраться пожалуйста.
//ПЕРЕДАТЧИК #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);} }А где схема?
А Вы пробовали исключить передатчик, заменив его ком-портом?
Чего ноете? - работайте!
Вы ничего не сделали для отладки программно-аппаратного комплекса, а уже кричите - "НЕ РАБОТАЕТ!"
он второй или третий раз это размещает под разными никами... уже пора приравнивать ко спаму
void motorControl(int val, byte pinIN, byte pinPWM){ if (val > joyMiddle + JOY_DEADZONE){ val = map (val,joyMiddle,1023,0,255);так вы переменную val получаете только в функции if .... как же оно выполнится
почему? - насколько я вижу, он ее из массива. принятого по радио, берет - строка 46
ок. тогда он не получает
joyMiddle, ему надо первый пакет получить и сохранить среднюю (обычное положение) .34 joyMiddle = massiv[1];ну и тогда ещё предположу, что нужен еще 1 пин для л298, там вреде enA - pwm, in1 - cv, in2 - ccv.
ок. тогда он не получает
joyMiddle, ему надо первый пакет получить и сохранить среднюю (обычное положение) .oyMiddle = massiv[1];
возможно да... не знаю. что там за джойстик, если среднее положение нулевое - то будет работать и с таким joyMiddle
ок. тогда он не получает
joyMiddle, ему надо первый пакет получить и сохранить среднюю (обычное положение) .oyMiddle = massiv[1];
возможно да... не знаю. что там за джойстик, если среднее положение нулевое - то будет работать и с таким joyMiddle
среднее та наврятли нулевое, иначе в analogRead в передатчике должен быть минус xxx
среднее та наврятли нулевое, иначе в analogRead в передатчике должен быть минус xxx
наверно да, судя по строчке
oyMiddle = massiv[1];
тут в коде явно что-то планировалось не нулевое :) а потом потерялось
возможно как то так можно ...
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..... // не крутим }}Fenicksnet, я попробовал сделать так как Вы показали. Двигатели крутятся как надо, но через некоторое время система впадает в ступр и двигатель начинает тупо крутиться без команд джойстика
Fenicksnet, я попробовал сделать так как Вы показали. Двигатели крутятся как надо, но через некоторое время система впадает в ступр и двигатель начинает тупо крутиться без команд джойстика
неверное после крайнего какого-то положения джойстика. попробовать заменить на например
и
if ( joyMiddle == 5000 ) { // полученаем среднее положение joyMiddle = massiv[1]; }и код в студию..
//ПЕРЕДАТЧИК #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);} }}я заменил 0 на 5000 стало как было в начале. тоесть когда joymiddle = 0 все работает как надо только в какойто момент система зависает
//ПРИЕМНИК #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);} }}Пишу с телефона, проверяем исправляем
я заменил 0 на 5000 стало как было в начале. тоесть когда joymiddle = 0 все работает как надо только в какойто момент система зависает
и мне не понятна ваша схема подключения 298
у меня аналог л298 mx1508 . он подключен точно также как и 298 in1 5 in2 6
у меня аналог л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); } } }