Pages: [1]   Go Down
Author Topic: Controlando ESC com arduino ** problema**  (Read 1681 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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:

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:
#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
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3292
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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!!!!!!!
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3292
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.   smiley-mad

Code:
  #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();
}
 
}
 

Logged

Pages: [1]   Go Up
Jump to: