Новичок
Регистрация: 26.01.2024
Сообщений: 1
Репутация: 10
|
Всем привет. Помогите пожалуйста разобраться с кодом.
Джойстик один потенциометр, использую в качестве режима вперед, назад, с нулем по средине. Управление мотором через 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]); } } |
||
Оценка
|
Обратная связь РадиоЛоцман Вверх |