Pages: [1]   Go Down
Author Topic: Arduino Quadcopter Programação dos ESCs  (Read 2113 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Olá pessoal!

Sou novo no fórum, programo já há alguns anos e desde pequeno tive algum contato com robôs programando um daqueles robôs MONTY que vendiam em revistas.

De um mês para cá conheci o Arduino e comprei um com o atmega328, depois de alguns testes com displays de LCD, pushbuttons e sensores tipo o controle nunchuck do wii resolvi dar um passo maior e montar um "quadcopter" (tipo helicóptero mais com 4 motores).

Para resumir, comprei todos os ítens:
 - 2 arduinos com atmega328
 - inicialmente para testes um transmissor e um receptor de RF 433mhz (no futuro pretendo fazer a transmissão com os XBEE)
 - 1 sensorshield
 - 4 speed controls (ESC) 18A
 - 4 motores brushless EMAX 2812 (e os conectores banana)
 - Comprei também um controle de PS2 para controlar o aeromodelo e um wii nunchuck que já tinha para utilizar como o gyro (estabilizador) que fica no próprio aeromodelo.

Já consegui ler os controles de PS2 e WII mas no caso dos ESCs que controlam os motores eu não estou conseguindo fazer que todos funcionem juntos.

O único código que funcionou foi o de um post no fórum do arduino do exterior, que não consegui postar o link por que o fórum não permitiu (pois é meu primeiro post).

Eu até consigo ligar vários motores, mas eles não iniciam ao mesmo tempo e apenas um deles (geralmente o que eu seto a velocidade por último) continua funcionando "eternamente" de acordo com o while.

Segue o código testando 2 motores:

#include <Servo.h>
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
int angle=0;
int speed;
int pos;

void setSpeed1(int speed) {
  angle = map(speed, 0, 100, 0, 120);
  myservo1.write(angle);    
}

void setSpeed2(int speed) {
  angle = map(speed, 0, 100, 0, 120);
  myservo2.write(angle);    
}

void setSpeed3(int speed) {
  angle = map(speed, 0, 100, 0, 120);
  myservo3.write(angle);    
}

void setSpeed4(int speed) {
  angle = map(speed, 0, 100, 0, 120);
  myservo4.write(angle);    
}

void setup() {
  myservo1.attach(smiley-cool;
  myservo2.attach(9);
  myservo3.attach(10);
  myservo4.attach(11);

  setSpeed1(0);
  setSpeed2(0);
  setSpeed3(0);
  setSpeed4(0);

  delay(1000); //obrigatorio para iniciar os ESCs
}

void loop() {
  for (speed=0; speed<=100; speed+=5) {
    setSpeed2(speed);
    setSpeed4(speed);
    delay(1000);

    while(speed==100) {
      setSpeed2(speed);
      setSpeed4(speed);
      delay(1000);
    }
  }
}  

Com esse código atualmente todos os ESCs iniciam normalmente, em seguida o motor 4 começa a funcionar, alguns poucos segundos depois o motor 2 também inicia mas para logo após a aceleração. Com esse código eu imaginei que ambos iriam operar na velocidade máxima juntos, mas não ocorre. Apenas o motor 4 fica em velocidade máxima.

Será que alguém consegue me ajudar nesse problemão? Obrigado!  smiley-wink


Obs.: Como sou novo no fórum vou ver se consigo postar uma foto depois pra vocês olharem.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Olá novamente pessoal, fazendo mais alguns testes encontrei o código nesse site http://blog.mobileapes.com/2010/04/control-motor-from-arduino-board-with.html#comment-form , aonde o próprio autor informa que consegue êxito ligando os 4 motores de um quadcopter.

Fiz o teste e inicialmente todos os motores são iniciados, um por vez. Mas quando entra no loop, vou inserindo os sinais de "+" na serial e apenas o motor 4 (me parece geralmente o que tem sua velocidade definida por último, como no post acima) é controlado.

Se alguma boa alma puder me auxiliar nesse problema, ficaria grato! ;D


Segue o código que estou testando:

#include <Servo.h>

#define MAXANGLE 160

typedef struct {
  int pinpwm;
  int range[2];
} ESCRecord;

ESCRecord escconf[4];
Servo escservos[4];
int angle = 0;

void config() {
  escconf[0] = (ESCRecord) {3, {836, 2400}};
  escconf[1] = (ESCRecord) {9, {836, 2400}};
  escconf[2] = (ESCRecord) {10, {836, 2400}};
  escconf[3] = (ESCRecord) {11, {836, 2400}};
}

void arm() {
  for(int esc = 0; esc < 4; esc++) {
    escservos[esc].attach(escconf[esc].pinpwm, \
                          escconf[esc].range[0], \
                          escconf[esc].range[1]);
    escservos[esc].write(0);
    delay(15);
  }
}

void cycle() {
  Serial.print("Cycle ESC Number ");
  for(int esc = 0; esc < 4; esc++) {
    Serial.print(esc);
    for(int angle = 0; angle <= MAXANGLE; angle++) {
      escservos[esc].write(angle);
      delay(15);
    }
    for(int angle = MAXANGLE; angle >= 0; angle--) {
      escservos[esc].write(angle);
      delay(15);
    }
  }
  Serial.println("");
}

void setup() {
  delay(1000);
  Serial.begin(9600);

  Serial.println("Wait for your input! to init...");
  while(Serial.available() <= 0)
    delay(1000);
  int incomingByte = Serial.read();

  Serial.println("Start the system...");

  config();
  arm();
  delay(5000);

  if(incomingByte == 115) {
    Serial.println("Traverses all angles upward and downward.");  
    cycle();
    delay(1000);
  }
  Serial.println("Start loop...");
}

void setspeed(int angles[4]) {
  for(int esc = 0; esc < 4; esc++) {
    escservos[esc].write(angles[esc]);
    delay(120);
  }
}

void loop() {
  if(Serial.available() > 0) {
    int incomingByte = Serial.read();
    if(incomingByte == 43)      // sends the character '+'
      angle++;                  // increases the speed
    else if(incomingByte == 45) // sends the character '-'
      angle--;                  // decreases the speed
    else if(incomingByte == 48) // sends the character '0'
      angle = 0;                // set the speed to zero
    
    if(angle < 0)
      angle = 0;
    if(angle > MAXANGLE)
      angle = MAXANGLE;
      
    Serial.print("Set the angle to: ");
    Serial.println(angle);
  }
    
  int angles[4] = {angle, angle, angle, angle};
  setspeed(angles);
}
« Last Edit: July 25, 2010, 12:20:55 pm by leandrohari » Logged

0
Offline Offline
Full Member
***
Karma: 2
Posts: 124
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

olá leandro, ja passei pelo mesmo problema, olhe minhas mensagens anteriores para a historia... é o seguinte a biblioteca original é meio bugada mesmo, na epoca eu usei a biblioteca desse post, a servotimer2
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1230479947

com essa eu consegui fazer os 3 servos movimentarem perfeitamente, olha esse video no youtube desse cara e da uma seguida nos outros videos dele


e houve tambem um grupo no google groups que parece que se fundiu ao ardupilot
http://aeroquad.com/content.php
 
ha tb este link
http://www.rcgroups.com/forums/showthread.php?t=1066119&page=6

Boa sorte

« Last Edit: July 25, 2010, 06:04:26 pm by fabiohbm007 » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Olá Fábio!

Obrigado pela ajuda, baixei a biblioteca e estou fazendo uns testes.

Até agora não tive resultados muito melhores do que com a servo.h, mas notei que há sim alguma diferença.

Terminei a ligação dos 4 motores aos seus respectivos ESC´s até a placa sensorshield e agora vou poder testar tudo junto.

Depois informo os resultados que obtive!

Eu agradeço amigo, se alguém tiver mais alguma idéia por favor me ajude!
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Até agora nada!

Será que alguém tem uma luz de como controlar 4 motores simultâneos com seus respectivos esc´s ligados ao arduino? utilizando variação de velocidade?

Eu consigo ligar os 4 motores com meu código, mas não é possível variar a velocidade que o funcionamento se torna anormal e ao que me parece aleatório.

Será que alguém já passou por isso e conseguiu solucionar?

 ;D
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-wink po eu tambem quero montar um dessee para min bom nao comecei a montar nada to pesquisando peça, programa e designer e se tivese iniciado ia ter mesma dificudade de vc bom encontri um cara q ta fez um Tricopter o videos estao aki
aki tem mais video e informaçao http://www.diymaker.com/category/uav/helicopter/ e tem mais um link http://wyvernupenn.blogspot.com/
bom espero ter ajudado e se descubri mas iten sobre o helicoptero, qudcopter etc coloco aki. e agradeço a vc e todos que poder pas informaçoes sobre esse post   ;D ;D ;D
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 7
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

po ja ia esquecendo tem mas 2 http://lusorobotica.com/index.php?topic=1660.0
e
http://www.rcgroups.com/forums/showthread.php?t=1143569&page=101#post15212157

http://code.google.com/p/aeroquad/source/browse/#svn/trunk/AeroQuad  o site e aeroquad.info
A os dois ultimo tem uns codigo para quadcopter e outros nao sei se funciona  ;D ok ate +
« Last Edit: August 09, 2010, 10:24:32 am by Mechwagner » Logged

Pages: [1]   Go Up
Jump to: