Управление бесколлекторным двигателем

mbreton
Offline
Зарегистрирован: 06.01.2018

Здравствуйте!

Столкнулся со следующей проблемой. Собираю машину на дистанционном управлении и решил сначала испытать бесколлекторный двигатель (пока без модуля wi-fi) при управлении с помощью потенциометра. Собрал схему, написал прошивку, но программа выдает ошибку. Использую ардуино NANO. Скетч следующий:

Подскажите, пожалуйста, как доработать скетч.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Где Вы видели, чтобы слово void писалось с прописной буквы? Исправьте везде.

Впредь публикуйте код как положено, а не картинкой на которой ни хрена не видно.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Никогда не вставляйте таким образом свой код и сообщения об ошибках! 

Здесь написано, как это нужно делать: Вставка программного кода в тему/комментарий

Исправьте в скетче Void на void​. Язык регистрочувствительный.

 

mbreton
Offline
Зарегистрирован: 06.01.2018

Большое спасибо! Советы учту.

После исправления всё заработало.

mbreton
Offline
Зарегистрирован: 06.01.2018

После запуска двигателя через потенциометр написал код для управления через Wi-Fi (с помощью модуля nRF24L01). В качестве источника сигнала ардуино уно с установленным Джойстик шилдом и модуль NRF24L01. В качестве применика ардуино нано с модулем nRF24L01 и бесколлекторным двигателем A2212/13T 1000KV. Двигатель запустился при использовании указанных прошивок. Но при изменении диапазона сигнала оси OY джойстика (которая отвечает за частоту вращения двигателя) в мониторе порта максимальное значение составляет всего 1173, хотя должно бы быть 2300. Но в мониторе порта источника сигнала сигнал отображается корректно и изменяется в диапозоне от 0 до 1023. Скетчи для пульта и для применика ниже.

Не могли бы подсказать в чем тут проблема?

И если кто знает, как сделать, чтобы с джойстика не только частота менялась, но и направление вращения двигателя.

// Пульт 


#include <SPI.h>          // библиотека для работы с шиной SPI
#include "nRF24L01.h"     // библиотека радиомодуля
#include "RF24.h"         // ещё библиотека радиомодуля

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

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
const byte PIN_ANALOG_X = 0;
const byte PIN_ANALOG_Y = 1;
const int X_THRESHOLD_LOW = 505; 
const int X_THRESHOLD_HIGH = 515; 
const int Y_THRESHOLD_LOW = 400; 
const int Y_THRESHOLD_HIGH = 510;
int x_position;
int y_position;
int x_direction;
int y_direction;
// Выбор кнопки, которая срабатывает при нажатии джойстика
const byte PIN_BUTTON_SELECT = 6;
const byte PIN_BUTTON_RIGHT = 3;
const byte PIN_BUTTON_UP = 2;
const byte PIN_BUTTON_DOWN = 4;
const byte PIN_BUTTON_LEFT = 5;
byte transmit_data[7]; // массив, хранящий передаваемые данные


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


pinMode(PIN_BUTTON_RIGHT, INPUT); 
digitalWrite(PIN_BUTTON_RIGHT, HIGH);
pinMode(PIN_BUTTON_LEFT, INPUT); 
digitalWrite(PIN_BUTTON_LEFT, HIGH);
pinMode(PIN_BUTTON_UP, INPUT); 
digitalWrite(PIN_BUTTON_UP, HIGH);
pinMode(PIN_BUTTON_DOWN, INPUT); 
digitalWrite(PIN_BUTTON_DOWN, HIGH);
pinMode(PIN_BUTTON_SELECT, INPUT); 
digitalWrite(PIN_BUTTON_SELECT, HIGH);


if (digitalRead(PIN_BUTTON_LEFT) == LOW) {
// Кнопка нажата
} else {
// Кнопка не нажата
}
if (digitalRead(PIN_BUTTON_DOWN) == LOW) {
// Кнопка нажата
} else {
// Кнопка не нажата
}
if (digitalRead(PIN_BUTTON_UP) == LOW) {
// Кнопка нажата
} else {
// Кнопка не нажата
}
if (digitalRead(PIN_BUTTON_RIGHT) == LOW) {
// Кнопка нажата
} else {
// Кнопка не нажата
}
if (digitalRead(PIN_BUTTON_SELECT) == LOW) {
// Кнопка нажата
} else {
// Кнопка не нажата
}


}

void loop() {
byte gotByte; 
Serial.print("l:");
Serial.print(digitalRead(PIN_BUTTON_LEFT));
Serial.print(" "); 
Serial.print("r:");
Serial.print(digitalRead(PIN_BUTTON_RIGHT));
Serial.print(" "); 
Serial.print("u:");
Serial.print(digitalRead(PIN_BUTTON_UP));
Serial.print(" "); 
Serial.print("d:");
Serial.print(digitalRead(PIN_BUTTON_DOWN));
Serial.print(" ");
Serial.print("x:");
Serial.print(analogRead(PIN_ANALOG_X));
Serial.print(" ");
Serial.print("y:");
Serial.print(analogRead(PIN_ANALOG_Y));
Serial.print(" "); 
Serial.print("s:");
Serial.print(digitalRead(PIN_BUTTON_SELECT));
Serial.print(" ");
Serial.println();


x_direction = 0;
y_direction = 0;
x_position = analogRead(PIN_ANALOG_X);
y_position = analogRead(PIN_ANALOG_Y);
if (x_position > X_THRESHOLD_HIGH) {
x_direction = 1;
} else if (x_position < X_THRESHOLD_LOW) {
x_direction = -1;
}
if (y_position > Y_THRESHOLD_HIGH) {
y_direction = 1;
} else if (y_position < Y_THRESHOLD_LOW) {
y_direction = -1;
}

if (x_direction == -1) {
if (y_direction == -1) {
Serial.println("left-down");
} else if (y_direction == 0) {
Serial.println("left");
} else {
// y_direction == 1
Serial.println("left-up"); 
} 
} else if (x_direction == 0) {
if (y_direction == -1) {
Serial.println("down");
} else if (y_direction == 0) {
Serial.println("centered");
} else {
// y_direction == 1
Serial.println("up"); 
}
} else {
// x_direction == 1
if (y_direction == -1) {
Serial.println("right-down");
} else if (y_direction == 0) {
Serial.println("right");
} else {
// y_direction == 1
Serial.println("right-up"); 
}
}

transmit_data[0] = digitalRead(PIN_BUTTON_SELECT); // записываем состояние кнопки SELECT на нулевое место массива
transmit_data[1] = digitalRead(PIN_BUTTON_RIGHT); // записываем состояние кнопки RIGHT на первое место массива
transmit_data[2] = digitalRead(PIN_BUTTON_UP); // записываем состояние кнопки UP на второе место массива
transmit_data[3] = digitalRead(PIN_BUTTON_DOWN); // записываем состояние кнопки DOWN на третье место массива
transmit_data[4] = digitalRead(PIN_BUTTON_LEFT); // записываем состояние кнопки LEFT на четвертое место массива
transmit_data[5] = map(analogRead(PIN_ANALOG_X), 0, 1023, 0, 180); // получить значение
// в диапазоне 0…1023, перевести в 0…180, и записать на пятое место в массиве
transmit_data[6] = (analogRead(PIN_ANALOG_Y)); // получить значение
// в диапазоне 0…1023, перевести в 0…255, и записать на  шестое место в массиве

       radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио

}


//  приемник

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h> // подключаем библиотеку для работы с сервоприводом
Servo servo1; // объявляем переменную servo типа "servo"
Servo motor; // создали переменную мотор типа серво


RF24 radio(9,10); // "создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги
byte received_data[7]; // массив принятых данных

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

void setup(){
  Serial.begin(9600); //открываем порт для связи с ПК
servo1.attach(5);
motor.attach(3); // к третьему цифровому пину подключен мотор
//далее идет колибровка
motor.writeMicroseconds(2300); 
delay(2000);
motor.writeMicroseconds(800);
delay(6000);

  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, gotByte;                          
    while( radio.available(&pipeNo)){    // слушаем эфир со всех труб
      radio.read( &received_data, sizeof(received_data) );         // читаем входящий сигнал

   
   }
   
   int val=map(received_data[6], 0, 1023, 800, 2300);
motor.writeMicroseconds(val); // подали на мотор управляющий сигнал
   
Serial.print("l:");
Serial.print(received_data[4]);
Serial.print(" "); 
Serial.print("r:");
Serial.print(received_data[1]);
Serial.print(" "); 
Serial.print("u:");
Serial.print(received_data[2]);
Serial.print(" "); 
Serial.print("d:");
Serial.print(received_data[3]);
Serial.print(" ");
Serial.print("x:");
Serial.print(received_data[5]);
Serial.print(" ");
Serial.print("y:");
Serial.print(val);
Serial.print(" "); 
Serial.print("s:");
Serial.print(received_data[0]);
Serial.print(" ");
Serial.println();


servo1.write(received_data[5]);

}

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

При чем тут бесколлекторный двигатель, если программа работает с ним как с обыкновенным сервомотором?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arhat109-2 пишет:

При чем тут бесколлекторный двигатель, если программа работает с ним как с обыкновенным сервомотором?

Так то вустричные лягушки бесколлекторная серва.

mbreton
Offline
Зарегистрирован: 06.01.2018

В коде есть часть управления серводвигателем (по иси OX джойстика) и управление бесколлекторным мотором (по оси OY). Другой библиотеки для управления двигателем, кроме библиотеки Servo не нашел. Но если даже программа воспринимает мотор, как сервопривод, то почему она не изменяет диапазон в нужных приделах, прописанных в коде (от 800 до 2300)? И есть ли возможность это как-то исправить не изменяя сильно код?