Go Down

Topic: Arduino Quadcopter Programação dos ESCs (Read 2733 times) previous topic - next topic

leandrohari

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(8);
 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!  ;)


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

leandrohari

#1
Jul 25, 2010, 07:15 pm Last Edit: Jul 25, 2010, 07:20 pm by leandrohari Reason: 1
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);
}

fabio_h

#2
Jul 26, 2010, 01:02 am Last Edit: Jul 26, 2010, 01:04 am by fabiohbm007 Reason: 1
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
http://www.youtube.com/watch?v=4JtnUTDNkMU

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


leandrohari

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!

leandrohari

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

Mechwagner

;) 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 http://vimeo.com/11061240
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

Mechwagner

#6
Aug 09, 2010, 07:26 am Last Edit: Aug 09, 2010, 05:24 pm by Mechwagner Reason: 1
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 +

Go Up