Подергивание серво 9G
- Войдите на сайт для отправки комментариев
Вс, 12/02/2017 - 15:51
Вот такой код. Это управление маршовым мотором и однм серво приводом руля. Испольую в качестве пульта андроид смартфон использую приложение remotexy. Проблема в том что при включении схемы. Серва поворачивается на 90 градусов. Но после подключения смартфона через блютуз. серва реагирует на управление. Но пстоянно дергается. раскачивается на 1 или 2 градуса. В чем проблема.
/* -- Пульт для машинки -- /* ////////////////////////////////////////////// // RemoteXY include library // ////////////////////////////////////////////// // определение режима соединения и подключение библиотеки RemoteXY #define REMOTEXY_MODE__SOFTSERIAL #include <SoftwareSerial.h> #include <Servo.h> #include <RemoteXY.h> // настройки соединения #define REMOTEXY_SERIAL_RX 2 #define REMOTEXY_SERIAL_TX 3 #define REMOTEXY_SERIAL_SPEED 9600 // конфигурация интерфейса #pragma pack(push, 1) uint8_t RemoteXY_CONF[] = { 4,4,99,0,6,5,0,5,32,67 ,31,30,30,2,5,32,3,30,30,30 ,2,66,131,42,11,16,7,2,65,10 ,62,12,24,7,2,65,10,16,12,21 ,7,2,65,12,42,25,18,7,2,129 ,0,63,12,23,6,9,208,146,208,191 ,208,181,209,128,208,181,208,180,0,129 ,0,17,12,18,6,9,208,157,208,176 ,208,183,208,176,208,180,0,129,0,43 ,25,15,6,9,208,161,209,130,208,190 ,208,191,0 }; // структура определяет все переменные вашего интерфейса управления struct { // input variable int8_t joystick_1_x; // =-100..100 координата x положения джойстика int8_t joystick_1_y; // =-100..100 координата y положения джойстика int8_t joystick_2_x; // =-100..100 координата x положения джойстика int8_t joystick_2_y; // =-100..100 координата y положения джойстика // output variable int8_t level_speed; // =0..100 положение уровня uint8_t led_forward_g; // =0..255 яркость зеленого цвета индикатора uint8_t led_back_g; // =0..255 яркость зеленого цвета индикатора uint8_t led_stop_r; // =0..255 яркость красного цвета индикатора // other variable uint8_t connect_flag; // =1 if wire connected, else =0 } RemoteXY; Servo servoL1; // объект сервопривод №1 #pragma pack(pop) ///////////////////////////////////////////// // END RemoteXY include // ///////////////////////////////////////////// //Графика #include <robocraft.h> // // тестовый скетч с L293 // добавили пробные функции для работы с моторчиками через L293 // // // by noonv <http://www.robocraft.ru> // MOTOR MOTOR1 = { 6, 7, 9 }; MOTOR MOTOR2 = { 10, 11, 12 }; RoboCraft robot(&MOTOR1, &MOTOR2); // создаём экземпляр нашего класса void setup() { servoL1.attach(5); // Сервопривод подключен к цифровому выходу 9 //servo1.detach() для расслабления мотора сервопривода servoL1.write(90); RemoteXY_Init (); Serial.begin(9600); robot.hello(); // говорим "Hello" :) } void loop() { RemoteXY_Handler (); //Функция управления поворотом if (RemoteXY.joystick_2_x<0) { servoL1.write(RemoteXY.joystick_2_x+89);} if (RemoteXY.joystick_2_x>0) {servoL1.write(RemoteXY.joystick_2_x+89);} //Функция управления поворотом Serial.println(RemoteXY.joystick_2_x); if (RemoteXY.joystick_1_y > 40) //едем вперед { robot.motor_forward(1,(RemoteXY.joystick_1_y*2.55)); // если джостик вверх полный вперёд :) RemoteXY.level_speed = RemoteXY.joystick_1_y; RemoteXY.led_forward_g = 255; RemoteXY.led_stop_r = 0; // сброс всех значений датчиков } if (RemoteXY.joystick_1_y < -40) //едем назад { robot.motor_back(1,((RemoteXY.joystick_1_y*-1)*2.55)); RemoteXY.level_speed = (RemoteXY.joystick_1_y*-1); RemoteXY.led_back_g = 255; RemoteXY.led_stop_r = 0; // сброс всех значений датчиков } if (RemoteXY.joystick_1_y == 0)//стоим { robot.motor_forward(1,0); // джойстик отпущен стоп :) RemoteXY.led_stop_r = 255; RemoteXY.led_back_g = 0; // сброс всех значений датчиков RemoteXY.led_forward_g =0; // сброс всех значений датчиков RemoteXY.level_speed = 0; // сброс всех значений датчиков } }
Так же заметил следующее при добавлении кода управления сервой. Проподает шим управление маршавым мотором. Он включается только при максимальном положении джосика. При удалении кода управлени сервой, шим управлеия восстанавливается. и маршавый мотор адыкватно реагирует на положение джойстика.
Проблема в том что при включении схемы. Серва поворачивается на 90 градусов.
У вас в коде - это записано в строке 083
servoL1.write(90); - серва устанавливается в центральное положение
В робототехнике перед сборкой робота рекомендуют выставить сервоприводы в центральное положение - затем
одеть на сервопривод рычаг... в вашем случае - снимите рычаг с сервы - включите машинку она установит серво в 0 положение (90 градусов) -
колёса также установлены в 0 положение то-есть прямо, оденьте в этом положении рычаг и закрепите.Проблема не в том что она проворачивается на 90 градусов. А втом, что начинает дергаться после этого.
смотрите питание
попробуйте убрать первые два "
if
(RemoteXY....", оставьте только "
servoL1.write(RemoteXY"Есть одна особенность использования библиотеки "servo.h". Ее нельзя использовать совместно с библиотекой программного последовательного порта "SoftwareSerial.h". Эти библиотеки используют совместные ресурсы микроконтроллера. Сервоприводы будут подергиваться, так как поддержание постоянной ширины импульсов будет невозможно. Для решения этой проблемы для обмена данными со смартфоном настроим библиотеку RemoteXY на аппаратный последовательный порт.