Клеммные колодки Keen Side

Код программы по радиоуправлению nRF24L01, джойстик, драйвер ZK-5AD с одним мотором

Новичок
 
Регистрация: 26.01.2024
Сообщений: 1
Репутация: 10
 
26.01.2024 11:58 #1
Всем привет. Помогите пожалуйста разобраться с кодом.
Джойстик один потенциометр, использую в качестве режима вперед, назад, с нулем по средине. Управление мотором через nRF24l01, один мотор через драйвер, L298, в дальнейшем когда приедет ZK-5AD заменю на нее. Использовал код из видео уроков AlexGyver, за что ему огромнейшее спасибо! Суть проблемы в том что при движении джойстика вперед ШИМ работает и есть регулировка оборотов, а при движении джойстика назад направление вращения двигателя не меняется, и нет ШИМ сигнала, и мотор стартует на все 100% оборотов. в Ниже прикрепляю код. Сильно тапками не кидайтесь я только учусь. Использовать готовый код можно, но его все равно нужно будет перекроить под себя. Тогда уже лучше самому писать да набираться опыта.
передатчик ТХ:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

//byte button = 3; // кнопка на 3 цифровом
byte potent = 1;
// потенциометр на 0 аналоговом
//byte slider = 0; // движковый потенциометр на 1 аналоговом пине
#define MOTOR1_IN 2
#define MOTOR1_PWM 3
#define JOY_DEADZONE 10

int joyMiddle;

byte transmit_data[3]; // массив, хранящий передаваемые данные
byte latest_data[3]; // массив, хранящий последние переданные данные
boolean flag; // флажок отправки данных
byte pinIN;
byte pinPWM;

void setup() {
Serial.begin(9600); //открываем порт для связи с ПК
joyMiddle = analogRead(0);
//pinMode(button, INPUT_PULLUP); // настроить пин кнопки

radio.begin(); // активировать модуль
radio.setAutoAck(1); // режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15); // (время между попыткой достучаться, число попыток)
radio.enableAckPayload(); // разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); // размер пакета, в байтах

radio.openWritingPipe(address[0]); // мы - труба 0, открываем канал для передачи данных
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
//должна быть одинакова на приёмнике и передатчике!
//при самой низкой скорости имеем самую высокую чувствительность и дальность!!

radio.powerUp(); //начать работу
radio.stopListening(); //не слушаем радиоэфир, мы передатчик
}
int val;
void loop() {
// инвертированный (!) сигнал с кнопки
//transmit_data[0] = !digitalRead(button);
val = analogRead(0);

if (val > joyMiddle + JOY_DEADZONE) {
transmit_data[2] = map(val, joyMiddle, 1023, 0, 255);
transmit_data[0] = 0;
} else if (val < joyMiddle - JOY_DEADZONE) {
transmit_data[2] = map(val, joyMiddle, 0, -255, 0);
transmit_data[0] = 1;
}
else
{
transmit_data[0] = 0;
transmit_data[2] = 0;
}


transmit_data[1] = map(analogRead(potent), 0, 1023, 0, 180); // получить значение
// в диапазоне 0..1023, перевести в 0..180, и записать на 1 место в массиве
//transmit_data[2] = map(analogRead(slider), 0, 1023, 0, 255);
Serial.println (analogRead(0));

for (int i = 0; i < 3; i++) { // в цикле от 0 до числа каналов
if (transmit_data[i] != latest_data[i]) { // если есть изменения в transmit_data
flag = 1; // поднять флаг отправки по радио
latest_data[i] = transmit_data[i]; // запомнить последнее изменение
}
}

if (flag == 1) {
radio.powerUp(); // включить передатчик
radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио
flag = 0; //опустить флаг
radio.powerDown(); // выключить передатчик
}
}


приемник RX:

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h>

RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги

byte recieved_data[3]; // массив принятых данных
//byte relay = 2; // реле на 2 цифровом
byte servo = 5; // сервопривод на 3 цифровом
//byte mosfet = 5; // мосфет на 5 цифровом (ТУТ ЕСТЬ ШИМ!!!)
byte pinIN = 2;
byte pinPWM = 3;
//#define MOTOR1_IN 2
//#define MOTOR1_PWM 3
#define JOY_DEADZONE 10

int joyMiddle;

Servo myservo;

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

void setup() {
Serial.begin(9600); // открываем порт для связи с ПК
//pinMode(MOTOR1_IN, OUTPUT);
//pinMode(MOTOR1_PWM, OUTPUT);
pinMode(pinPWM, OUTPUT); // настроить пин реле как выход
pinMode(pinIN, OUTPUT); // настроить пин мосфета как выход

myservo.attach(servo);

radio.begin(); //активировать модуль
radio.setAutoAck(1); // режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15); // (время между попыткой достучаться, число попыток)
radio.enableAckPayload(); // разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); // размер пакета, в байтах

radio.openReadingPipe(1, address[0]); // хотим слушать трубу 0
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
//должна быть одинакова на приёмнике и передатчике!
//при самой низкой скорости имеем самую высокую чувствительность и дальность!!

radio.powerUp(); // начать работу
radio.startListening(); // начинаем слушать эфир, мы приёмный модуль
}

void loop() {
byte pipeNo;
while ( radio.available(&pipeNo)) { // есть входящие данные
// чиатем входящий сигнал
radio.read(&recieved_data, sizeof(recieved_data));

// подать на реле сигнал с 0 места массива
// digitalWrite(relay, recieved_data[0]);

// повернуть серво на угол 0..180
// значение получено с 1 элемента массива
myservo.write(recieved_data[1]);

// подать на мосфет ШИМ сигнал
// в соответствии с принятыми данными со 2 места массива, диапазон 0...255
analogWrite(pinIN, recieved_data[0]);
analogWrite(pinPWM, recieved_data[2]);
}
}
Оценка
Новичок
 
Регистрация: 07.11.2010
Сообщений: 60
Репутация: 23
13 33
0 2
 
03.02.2024 09:50 #2
Цитата:
Сообщение от Timon(studnet)
byte potent = 1;
// потенциометр на 0 аналоговом
//byte slider = 0; // движковый потенциометр на 1 аналоговом пине
Тут точно не напутал?
Оценка
Ответ
Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход
Электронные компоненты. Скидки 15%, кэшбэк 15% и бесплатная доставка от ТМ Электроникс
Часовой пояс GMT +3, время: 03:40.
Обратная связь РадиоЛоцман Вверх