Здравствуйте, прошу помощи.
Собирал машинку, сначала из фанеры и пробок от бутылок.
Все отлично работало, моторчики слабенькие, ездила, крутилась. Выглядела так себе
захотелось перенести управление в старый и не рабочий джип, заменил моторы, поставил сервопривод.
В проекте использую:
1.ардуино нано;
2.Драйвер TB6612fng;
3. Понижайка xl4015;
4. Серва mg995;
5. Два мотора 370 на 12-24в.
Столкнулся с проблемой, если питать от 12в ( три банки 18650) машинку, возникает обратка от моторов. Первые запуски машинки были без платы защиты BMS, если резко сменить направление движения, машинка начинает дергаться и крайняя банка 18650 разряжалась в 0, но даже с убитой банкой она все равно едет, только уже примерно на 8,4в, банку в итоге не смог реанимировать.
Если питать от двух банок 18650 (8,4в) и резко менять направление(для быстрого разворота например), то рывки все равно появляются, но аккумулятор остается жив.
Один раз умирал сам драйвер для моторов.
Нашел информацию, что в библиотеке Гайвера есть команда deadtime, мне она не помогла. Нужно как-то в коде придумать паузу между движением вперед и назад.
Так как сам программированием занимаюсь пару месяцев, идей рабочих нет. Прошу помочь.
Представляю это так, если машинка едет вперед и жму назад, моторы останавливаются на пол секунды например и только потом происходило бы движение. При движении назад, аналогично.
Код джипа с библиотекой Гайвера
Код, указанный ниже, уже не использую .
Он был первым, понравилась библиотека Гайвера с плавным стартом и перешел на нее
Собирал машинку, сначала из фанеры и пробок от бутылок.
Все отлично работало, моторчики слабенькие, ездила, крутилась. Выглядела так себе
В проекте использую:
1.ардуино нано;
2.Драйвер TB6612fng;
3. Понижайка xl4015;
4. Серва mg995;
5. Два мотора 370 на 12-24в.
Столкнулся с проблемой, если питать от 12в ( три банки 18650) машинку, возникает обратка от моторов. Первые запуски машинки были без платы защиты BMS, если резко сменить направление движения, машинка начинает дергаться и крайняя банка 18650 разряжалась в 0, но даже с убитой банкой она все равно едет, только уже примерно на 8,4в, банку в итоге не смог реанимировать.
Если питать от двух банок 18650 (8,4в) и резко менять направление(для быстрого разворота например), то рывки все равно появляются, но аккумулятор остается жив.
Один раз умирал сам драйвер для моторов.
Нашел информацию, что в библиотеке Гайвера есть команда deadtime, мне она не помогла. Нужно как-то в коде придумать паузу между движением вперед и назад.
Так как сам программированием занимаюсь пару месяцев, идей рабочих нет. Прошу помочь.
Представляю это так, если машинка едет вперед и жму назад, моторы останавливаются на пол секунды например и только потом происходило бы движение. При движении назад, аналогично.
Код джипа с библиотекой Гайвера
Код с библиотекой Гайвера:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h>
#include "GyverMotor.h"
GMotor motorR(DRIVER3WIRE, 4, 2, 3); //мотор 1
GMotor motorL(DRIVER3WIRE, 7, 8, 6); //мотор 2
RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10
int recieved_data[2]; // массив принятых данных
int valX; // данные с джойстика по оси X
int valY; // данный с джойстика по оси Y
int valZ; // данные с джойстика
int sig = A1; // свет
Servo servo;
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
void setup() {
// Пины D5 и D6 - 7.8 кГц
TCCR0B = 0b00000010; // x8
TCCR0A = 0b00000011; // fast pwm
// Пины D3 и D11 - 62.5 кГц
TCCR2B = 0b00000001; // x1
TCCR2A = 0b00000011; // fast pwm
Serial.begin(9600); //открываем порт для связи с ПК
servo.attach(5);
pinMode(sig, OUTPUT); // настроить пин для света как выход
motorR.setDeadtime(5); // команда чтоб програмно была пауза между движением вперед и назад
motorL.setDeadtime(5);
motorR.setDirection(REVERSE); //реверс если машинка едет не в ту сторону изначально
motorL.setDirection(REVERSE);
motorR.setMode(AUTO); //режим движения
motorL.setMode(AUTO);
motorR.setSmoothSpeed(30); // шаг прибавления скорости
motorL.setSmoothSpeed(30);
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) ); // чиатем входящий сигнал
}
valX = recieved_data[0]; // назначить массив принятых данных 0 на данные с джойстика по оси Х
valY = recieved_data[1]; // назначить массив принятых данных 1 на данные с джойстика по оси Y
valZ = recieved_data[3]; // кнопка
// джойстик на А0 и А1
int dutyR = 255 - valX / 2; // 255 - 1023/2 (управление от минус 255 до плюс 255)
motorL.smoothTick(dutyR); //данные для движения
motorR.smoothTick(dutyR);
valY = map(valY, 950, 0, 40, 122); // управление сервой центр сервы и углы ограничения движения
servo.write(valY);
}
Для джойстика:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9, 10); // CE и CSN
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};
int valX = A3; // значения с джойстика по оси Х
int valY = A1; // значения с джойстика по оси Y
int valZ = 7; // кнопка
int transmit_data[3]; // массив, хранящий передаваемые данные ( 2 значения с джойстика )
void setup() {
Serial.begin(9600); //открываем порт
pinMode(valZ, INPUT);
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[0] = analogRead(valX); // присваиваем массиву 0 значение с джойстика по оси X
transmit_data[1] = analogRead(valY); // присваиваем массиву 1 значение с джойстика по оси Y
transmit_data[3] = digitalRead(valZ); // присваиваем массиву 1 значение с джойстика по оси Y
radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио
Serial.print(transmit_data[0]); Serial.println(transmit_data[1]);
}
Код, указанный ниже, уже не использую .
Он был первым, понравилась библиотека Гайвера с плавным стартом и перешел на нее
Код первый:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h>
RF24 radio(9, 10); // пины для нрф24
int recieved_data[2]; // массив принятых данных
int valX; // данные с джойстика по оси X
int valY; // данный с джойстика по оси Y
byte motor1 = 3; // скорость првого мотора
byte pered1 = 2; // движение мотора 1 вперёд
byte nazad1 = 4; // движение мотора 1 назад
byte motor2 = 6; // скорость второго мотора
byte pered2 = 8; // движение мотора 2 вперёд
byte nazad2 = 7; // движение мотора 2 назад
Servo servo1;
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
void setup() {
Serial.begin(9600); //открываем порт для связи с ПК
servo1.attach(5);
pinMode(motor1, OUTPUT); // назанчить пин выходом
pinMode(pered1, OUTPUT); // назанчить пин выходом
pinMode(nazad1, OUTPUT); // назанчить пин выходом
pinMode(motor2, OUTPUT); // назанчить пин выходом
pinMode(pered2, OUTPUT); // нахначить пин выходом
pinMode(nazad2, OUTPUT); // назначить пин выходом
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) ); // чиатем входящий сигнал
valX = recieved_data[0]; // назначить массив принятых данных 0 на данные с джойстика по оси Х
valY = recieved_data[1]; // назначить массив принятых данных 1 на данные с джойстика по оси Y
// ДВИЖЕНИЕ назад
if (valX >=0 && valX<=490){ // если данные с джойстика по оси Х в данном интервале то выполнить..
valX = map(valX, 490, 0, 0, 255); // приравниваем значения
valX = constrain(valX, 0, 255); // ограничиаем значения
analogWrite(motor1, valX); // подаём на мотор 1 указаную скорость
digitalWrite(pered1, LOW); // движения вперёд нет
digitalWrite(nazad1, HIGH); // движения назад
analogWrite(motor2, valX); // подаём на мотор 2 указаную скорость
digitalWrite(pered2, LOW); // движения вперёд нет
digitalWrite(nazad2, HIGH); // движения назад
// ДВИЖЕНИЕ вперед
} else if (valX >=510 && valX <=1023){
valX = map(valX, 510, 1023, 0, 255);
valX = constrain(valX, 0, 255);
analogWrite(motor1, valX);
digitalWrite(pered1, HIGH);
digitalWrite(nazad1, LOW);
analogWrite(motor2, valX);
digitalWrite(pered2, HIGH);
digitalWrite(nazad2, LOW);
// ДВИЖЕНИЕ СТОП
}else if (valX >=490 && valX <=510){
analogWrite(motor1, 0);
digitalWrite(pered1, LOW);
digitalWrite(nazad1, LOW);
analogWrite(motor2, 0);
digitalWrite(pered2, LOW);
digitalWrite(nazad2, LOW);
}
valY = map(valY, 1023, 0, 39, 108); // НАСТРОЙКА СЕРВЫ
servo1.write(valY);
}
}
Изменено: