Go Down

Topic: Controlando ESC com arduino ** problema** (Read 2158 times) previous topic - next topic

junior001

Code: [Select]
Estou com duvidas em como controlar um ESC com Arduíno (mega2560). Já pesquisei em vários sites e vi que é pela saída PWM, cheguei a conseguir controlar e variar a
velocidade conforme eu queria. Em um belo dia, do nada, começou a funcionar um esc por vez (incrivelmente o 1° motor iniciava depois de algum tempo o 2° iniciava
com velocidade inferior, e depois de algum tempo o 2° motor ficava com a velocidade maior que a do 1°).
Agora não consigo ligar nenhum, troquei a programação (que antes a velocidade era controlada por um sensor IR + controle) para o teclado, mas mesmo assim não
funciona mais e quando funciona não inicia os dois ao mesmo tempo. Pensei que meu Arduíno tinha estragado mas tenho um uno também e ocorre o mesmo problema.
Já tentei trocar os motores, os esc, mas nada acontece, sei que eles estão funcionando porque consigo um programação que inclui a biblioteca Servo.h , consigo ligar
os 2 mas eles iniciaram "Defasados".




Agora e estou utilizar essa :
Code: [Select]


int motor1 = 4;
int motor2 = 7;
int velocidade = 140;
int dir;

void setup()
{
      Serial.begin(9600);
      pinMode ( motor1, OUTPUT);
      pinMode ( motor2, OUTPUT);
     
}

void liga()
{
      analogWrite (motor1, velocidade);
      analogWrite (motor2, velocidade); 
}
void desliga()
{
      analogWrite (motor1, 0);
      analogWrite (motor2, 0); 
}
void loop()
{
      dir=Serial.read();

  if( dir == 'p')
{
  liga();
}
  if( dir == 'n')
{
  desliga();
}
if( dir == '+')
{
velocidade +=5;
liga();

if(velocidade >= 250)
{
   velocidade=245;
}
Serial.println(velocidade);
}
 
if( dir == '-')
{
velocidade -=5;

if(velocidade <= 5)
{
   velocidade = 5;
}
  liga();
Serial.println(velocidade);
}     
}


Sei que não estão danificados pois essa programação funciona mas não os 2 ao mesmo tempo:
Code: [Select]
#include <Servo.h>

Servo myservo;
Servo myservo1;

void arm(){
 
  setSpeed(0);
  delay(1500);
}

void setSpeed(int speed){
    int angle = map(speed, 0, 100, 0, 180);
    delay(100);
 
myservo1.write(angle); delay(100);
myservo.write(angle); 
Serial.print(angle);
  }


void setup()
{
    myservo1.attach(8);
  myservo.attach(7);
  arm(); 
}


void loop()
{
  int speed;

  for(speed = 0; speed <= 255; speed += 10) {

    setSpeed(speed);
   
    delay(2000);
  }
  setSpeed(0); 
  delay(5000);


**manual motor :http://www.hobbyking.com/hobbyking/store/uploads/764345172X380519X32.jpg
**manual ESC: http://www.hobbyking.com/hobbyking/store/uploads/8656078X637952X10.pdf

bubulindo

Eu não tenho muita experiência com servos, mas arriscaria dizer que o teu problema com o analog write é a frequência do sinal e não o pwm.
Também reparei que não usas os mesmo pinos nos dois exemplos. No de cima usas o pino 8 e 7 e no de baixo 4 e 7.

Nesta thread falam disso:

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1249178408

No exemplo de baixo... se olhares para o código, vais reparar no motivo para o desfasamento...

Code: [Select]
#include <Servo.h>

Servo myservo;
Servo myservo1;

void arm(){
 
  setSpeed(0);
  delay(1500); //
}

void setSpeed(int speed){
    int angle = map(speed, 0, 100, 0, 180);
//   delay(100);
 
myservo1.write(angle);
delay(100); // <-------------------------ISTO fá-los desfasar
myservo.write(angle); 
Serial.print(angle);
  }


void setup()
{
  myservo1.attach(8);
  myservo.attach(7);
  arm(); 
}


void loop()
{
  int speed;

  for(speed = 0; speed <= 255; speed += 10) {

    setSpeed(speed);
   
    delay(2000);
  }
  setSpeed(0); 
  delay(5000);
}


é possível de adaptar ambos os códigos usando a biblioteca do Servo.h. Experimenta isso e de preferência tira os delays do código!!!!!!!
This... is a hobby.

junior001

Tirei os delay´s, ja estava sem antes, eu achei que poderia "tirar" essa defasagem com os delay´s. O problema continua o mesmo, realmente acho que o problema esta na freqüência mesmo, obrigado vou ler com atenção esse link.

**s pinos foi porque eu testei tanto no MEGA como no UNO.

junior001

não sei se eu estou no meio do problema, mas ainda não coomprendi como posso arrumar essa "defasagem".

bubulindo

A melhor maneira é emulares tu próprio a biblioteca do Servo.

Ou seja, criares uma interrupcão temporizada que cria um PWM, mas que em vez de escrever para um pino de cada vez ,escreve para ambos os pinos dos motores em simultâneo, ou uma instrucão a seguir à outra.
Também podes tentar modificar a biblioteca para fazer o controlo de dois motores simultâneamente, mas deve ser mais complicado.
This... is a hobby.

junior001

verifiquei novamente a programação, acertei os pontos que faltava, enfim agora com a ajuda de um controle remoto está tudo ok,

oque não está funcionando é o seguinte:

Cada ESC liga em uma valor da pwm e eu não estou conseguindo resolver isso.   :0

Code: [Select]
  #include <IRremote.h>

    int motorPin = 7;
    int motor2Pin = 6;
    int motor3Pin = 5;
    int motor4Pin = 9;
 
   
 
    int RECV_PIN = A8;
    unsigned long int vlRec = 0;
   
    float gx=0;
    float gy=0;
    float gz=0;
    float ax=0;
    float ay=0;
    float az=0;
    float erroax=0;
    float erroay=0;
    float erroaz=0;
    float errogx=0;
    float errogy=0;
    float errogz=0;

    IRrecv irrecv(RECV_PIN);
    decode_results results;


 
    #define VELMIM 135
    #define VELDIR 255

    int VELMEDIA = 145;
   

  void setup() 
{
    Serial.begin(9600);
   
    irrecv.enableIRIn();

    pinMode(motorPin , OUTPUT);
    pinMode(motor4Pin , OUTPUT);
    pinMode(motor2Pin , OUTPUT);
    pinMode(motor3Pin , OUTPUT);
    arm();
}


  void arm()
{
    analogWrite(motorPin, VELMIM );
    analogWrite(motor4Pin, VELMIM );
    analogWrite(motor2Pin, VELMIM );
    analogWrite(motor3Pin, VELMIM );
   
}

  void liga()
{
    analogWrite(motorPin, VELMEDIA );
    analogWrite(motor3Pin, VELMEDIA );
   
     
    analogWrite(motor4Pin, VELMEDIA );
    analogWrite(motor2Pin, VELMEDIA );
 
   
}

  void desliga()
{
    analogWrite(motorPin, VELMIM );     
    analogWrite(motor4Pin, VELMIM );
    analogWrite(motor2Pin, VELMIM );
    analogWrite(motor3Pin, VELMIM );
}


  void loop() 
{
 

    if (irrecv.decode(&results)) {
    vlRec = results.value;
 
    if(vlRec == 16753245)   //(on)
    { 
    liga();
    Serial.println("ligado");
    }
   
    if(vlRec == 16748655 )  //(+)
    {     
      VELMEDIA += 1;
 
             
      liga();   
      Serial.print("Velocidade aumentando ");
      Serial.print(VELMEDIA);
       
      Serial.println(" ");
         
    if(VELMEDIA >= 245)
      {
      VELMEDIA = 245;
      Serial.println(VELMEDIA);
 
     
      }       
         
    }   
    if(vlRec == 16754775)  //(-)
      {   
       VELMEDIA -= 1;
 
       
       Serial.print("Velocidade diminuindo ");
       Serial.print(VELMEDIA);
     
       Serial.println(" ");
               
      if(VELMEDIA <= 140)
        {
        VELMEDIA = 140;
        Serial.println(VELMEDIA);
       
     
        }
        liga();
           
    }
   
    if(vlRec == 16736925  )    //(MODE)
    {
      desliga();
      VELMEDIA = 140;
      Serial.println("Desligado");
    }
       else {
      Serial.println(vlRec);
    }
    irrecv.resume();
}

}



Go Up