Управление бесколлекторным двигателем
- Войдите на сайт для отправки комментариев
Сб, 06/01/2018 - 22:00
Здравствуйте!
Столкнулся со следующей проблемой. Собираю машину на дистанционном управлении и решил сначала испытать бесколлекторный двигатель (пока без модуля wi-fi) при управлении с помощью потенциометра. Собрал схему, написал прошивку, но программа выдает ошибку. Использую ардуино NANO. Скетч следующий:

Подскажите, пожалуйста, как доработать скетч.
Где Вы видели, чтобы слово void писалось с прописной буквы? Исправьте везде.
Впредь публикуйте код как положено, а не картинкой на которой ни хрена не видно.
Никогда не вставляйте таким образом свой код и сообщения об ошибках!
Здесь написано, как это нужно делать: Вставка программного кода в тему/комментарий
Исправьте в скетче Void на void. Язык регистрочувствительный.
Большое спасибо! Советы учту.
После исправления всё заработало.
После запуска двигателя через потенциометр написал код для управления через 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]); }При чем тут бесколлекторный двигатель, если программа работает с ним как с обыкновенным сервомотором?
При чем тут бесколлекторный двигатель, если программа работает с ним как с обыкновенным сервомотором?
Так то
вустричные лягушкибесколлекторная серва.В коде есть часть управления серводвигателем (по иси OX джойстика) и управление бесколлекторным мотором (по оси OY). Другой библиотеки для управления двигателем, кроме библиотеки Servo не нашел. Но если даже программа воспринимает мотор, как сервопривод, то почему она не изменяет диапазон в нужных приделах, прописанных в коде (от 800 до 2300)? И есть ли возможность это как-то исправить не изменяя сильно код?