Реле Tianbo - ресурс 10 млн переключений

Код программы по радиоуправлению 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
Сообщений: 58
Репутация: 23
13 32
0 2
 
03.02.2024 09:50 #2
Цитата:
Сообщение от Timon(studnet)
byte potent = 1;
// потенциометр на 0 аналоговом
//byte slider = 0; // движковый потенциометр на 1 аналоговом пине
Тут точно не напутал?
Оценка
Ответ
Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

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

Быстрый переход
Электронные компоненты. Бесплатная доставка по России
Часовой пояс GMT +3, время: 23:51.
Обратная связь РадиоЛоцман Вверх