Радиоуправление двигателями и серво...

BataniQ
Offline
Зарегистрирован: 05.02.2017

Доброго времени суток. Имеется проект по созданию управления автомобилем на ардуино. Плата собрана навесным монтажом, при этом имеется передатчик с джойстиком и потенциометр. К приемнику подключена серво, а так же драйвер l298n который должен регулировать скорость и направление вращения двигателя. Внимание проблема, скорость двигателя не регулируется, при подключении двигателя на 12 вольт вообще не проворачивает его, идут только рывки, серво работает отлично.

Где я ошибся в скетче или проблема будет в аппаратной части и подключении?

Скетч передатчика

#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 potent = 0; // потенциометр на 0 аналоговом
byte joist_x = 1; // джойстик на 1 аналоговом 

byte transmit_data[3]; // массив, хранящий передаваемые данные
byte latest_data[3]; // массив, хранящий последние переданные данные

boolean flag; // флажок отправки данных

void setup() {
  Serial.begin(9600); //открываем порт для связи с ПК

  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();  //не слушаем радиоэфир, мы передатчик
}

void loop() {

   transmit_data[1] = map(analogRead(potent), 0, 1023, 0, 180); // получить значение в диапазоне 0..1023, перевести в 0..180, и записать на 1 место в массиве
   transmit_data[2] = map(analogRead(joist_x), 0, 1023, 128, 255); // получаем значения из джойстика
    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(); // выключить передатчик
  }

}

Скетч приемника

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

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

int data; 
int pos;
byte fspeed;           // forward speed 
byte bspeed;           // backward speed
int in1 = 8;    // direction pin 1
int in2 = 7;    // direction pin 2
byte ena = 6;    // PWM pin to change speed

byte recieved_data[3]; // массив принятых данных
byte servo = 3; // сервопривод на 3 цифровом

Servo myservo;

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

void setup() {
  Serial.begin(9600); //открываем порт для связи с ПК

  myservo.attach(servo);

  pinMode(in1, OUTPUT);      // connection to L298n
  pinMode(in2, OUTPUT);      // connection to L298n
  pinMode(ena, OUTPUT);      // connection to L298n

  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) ); // чиатем входящий сигнал
  if (recieved_data[2] >=128 && recieved_data[2] <=189)data = recieved_data[2], bspeed = map(data, 255, 201, 0, 1023), backward(bspeed);
  if (recieved_data[2] >=201 && recieved_data[2] <=255)data = recieved_data[2], fspeed = map(data, 189, 128, 0, 1023), forward(fspeed);
  if (recieved_data[2] >190 && recieved_data[2] <200)data = recieved_data[2], stop();
    myservo.write(recieved_data[1]); // повернуть серво на угол 0..180
    // значение получено с 1 элемента массива

  }
}
void stop()
{
  
  analogWrite(ena, 0);
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
}

void forward(int fspeed)
{
  
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(ena, fspeed);
}

void backward(int bspeed)
{
  
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(ena, bspeed);
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

тут посмотрите, управляется как и серва длительностями от 1000 до 2000

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

ua6em пишет:

тут посмотрите, управляется как и серва длительностями от 1000 до 2000

Или тут:

http://arduino.ru/forum/proekty/radioupravlyaemyi-kater-iz-potolochki

BataniQ
Offline
Зарегистрирован: 05.02.2017

ua6em пишет:

тут посмотрите, управляется как и серва длительностями от 1000 до 2000


Вот в этом и суть я не понимаю почему скорость не регулируется, во всех проектах в интернете скорость регулируется, а у меня как будто не хватает мощности хотя l298n запитан от 12 в. Видимо у меня ошибка в скетче связанная с считыванием и изменением значений

rkit
Offline
Зарегистрирован: 23.11.2016

BataniQ пишет:
Вот в этом и суть я не понимаю почему скорость не регулируется, во всех проектах в интернете скорость регулируется, а у меня как будто не хватает мощности хотя l298n запитан от 12 в.

У электрических приборов, я слышал, есть еще и другие характеристики, кроме вольтов.

BataniQ
Offline
Зарегистрирован: 05.02.2017

rkit пишет:

BataniQ пишет:
Вот в этом и суть я не понимаю почему скорость не регулируется, во всех проектах в интернете скорость регулируется, а у меня как будто не хватает мощности хотя l298n запитан от 12 в.

У электрических приборов, я слышал, есть еще и другие характеристики, кроме вольтов.

Я тем самым исключил просадки по напряжению, а насчёт тока и мощности источника питания я не сомневаюсь. Суть в скетче, и так у меня не получается регулировать скорость я обратился на форум. Думаю для опытного ардуинщика ато вообще не проблема...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А осциллограф на клеммах двигателя что показывает?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

А осциллограф на клеммах двигателя что показывает?

ему хотя бы в мониторе порта глянуть, что там напринимал по радиоканалу

BataniQ
Offline
Зарегистрирован: 05.02.2017

ua6em пишет:

andriano пишет:

А осциллограф на клеммах двигателя что показывает?

ему хотя бы в мониторе порта глянуть, что там напринимал по радиоканалу


Завтра гляну отпишу