Arduino проблема с сервой
- Войдите на сайт для отправки комментариев
Сб, 11/07/2015 - 12:51
Всем здравствуйте у меня возникла токая проблема:я делаю управление радиоуправляемой машиной перчаткой с гироскопом и у меня когда рулевая серва не может повернуться(застряла в грязи или что-то ещё) программа зависает и приходится перезагружать контроллер.Что делать???????????????????????????. Вот код
#include <SPI.h>
#include <Servo.h>
#include <nRF24L01.h>
#include <RF24.h>
Servo myservo;
int servoPin = A1;
Servo motor_teft;
Servo motor_right;
int mot_pin_right = 8; //Подключаем правый мотор к пину 8
int js_position = 1500; //Начальная позиция, всегда 1.5 мс для регуляторов бесколлекторных двигателей
int max_position = 2300; //Максимальное значение ШИМ 2.3 мс
int min_position = 800; //Минимальное значени ШИМ 0.8 мс
int start = 1; //Флаг задержки запуска
const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба"
RF24 radio(9, 10); // CE, CSN
void setup(){
motor_right.attach(mot_pin_right, js_position, max_position); //Инициальзация правого мотора (порт, начальная позиция, максимальная позиция) !!!
Serial.begin(9600);
myservo.attach(servoPin);
radio.begin();
radio.setChannel(9); // канал (0-127)
// скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
// RF24_250KBPS на nRF24L01 (без +) неработает.
// меньше скорость, выше чувствительность приемника.
radio.setDataRate(RF24_1MBPS);
// мощьность передатчика RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM,
radio.setPALevel(RF24_PA_HIGH);
radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe"
radio.startListening(); // включаем приемник, начинаем слушать трубу
}
// radio.stopListening(); // останавливает приём (нужно перед началом передачи)
void loop()
{
int data[2];
int posRul;
if (radio.available()){ // проверяем не пришло ли чего в буфер.
radio.read(&data, sizeof(data)); // читаем данные, указываем сколько байт читать
if(start == 1) {
motor_teft.write(js_position);
motor_right.write(js_position);
start = 0;
}
posRul = map(data[1], -10000, 5000, 70, 130); //Преобразование положения потенциометра в угол поворота
//Начальная установка регуляторов в нулевое положение
js_position = data[0];
js_position = map(js_position, -5000, 13000, 75, 140); //Преобразование положения потенциометра в угол поворота
// Serial.println(posRul);
if (posRul>50 && posRul<160)
{
myservo.write(posRul);
}
motor_right.write(js_position); //Записываем положение и отправляем на регулятор правого мотора
}
}
Заклиненная серва садит питание вашего контроллера.
1. Сделайте раздельное питание сервы, желательно с ограничением тока.
2. Или костыль поставьте- фьюзы BODEN поменяйте на самое низкое напряжение.
Говорят работать будет, хотя это и не правильно.
3. поставьте повышающий преобразователь с одного ЛИПО на 5 Вольт. Недавно обсуждалось.
Спасибо большое всё работоет и не виснет!!! :D