Arduino проблема с сервой

bkmz
Offline
Зарегистрирован: 11.07.2015

Всем здравствуйте у меня возникла токая проблема:я делаю управление радиоуправляемой машиной перчаткой с гироскопом и у меня когда рулевая серва не может повернуться(застряла в грязи или что-то ещё) программа зависает и приходится перезагружать контроллер.Что делать???????????????????????????. Вот код

 

 

#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);    //Записываем положение и отправляем на регулятор правого мотора
  }
trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Заклиненная серва садит питание вашего контроллера.
1. Сделайте раздельное питание сервы, желательно с ограничением тока.
2. Или костыль поставьте- фьюзы BODEN поменяйте на самое низкое напряжение.
     Говорят работать будет, хотя это и не правильно.
3. поставьте повышающий преобразователь  с одного ЛИПО на 5 Вольт. Недавно обсуждалось.

bkmz
Offline
Зарегистрирован: 11.07.2015

Спасибо большое всё работоет и не виснет!!! :D