Olá senhores, estou trabalhando a meses na construção de um drone que poderá ser um Bicoptero ou Tricoptero. De qualquer forma dar estabilidade a este tipo de aeromodelo é um pouco complicado e piora quando se quer criar um sistema do zero tanto no hardware como no Software.

Bem, solicito a atenção cuidadosa de todos os interessados, por que sei q no futuro ter o conhecimento de como programar algo assim é importante, pois pode-se a aplicar a qualquer projeto que necessite de estabilidade, como estabilidade para cameras, robôs bipedes etc..

 

Bem, estou tentando construir algo semelhante aqueles aeroplanos do filme avatar:

 

https://www.youtube.com/watch?v=iAyzPHYFTT8

 

No link acima, o criador em 0:25 a 1:20 usa um pendulo para verificar o equilibrio de todo o sistema.

Mas acredito que ele acrescentou alguma placa controladora ou IMU ja pronta, que não é meu caso.

 

Bem estou usando um Acelerometro e um Gyroscopio e a minha dúvida no momento  é:

É o caso! Usar os dois componentes juntos para obter um valor unico para obter a estabilidade de todo o sistema, ou não necessariamente?

Eu acredito que apenas um giro e a programação para ele eu consiga obter a estabilidade do bicoptero, então solicito opinião de vocês e experiência, pois caso acredite que apenas o gyro é necessário irei abandonar esse codigo e seguir por outro caminho.

 

Estou baseando meu projeto em robos do tipo Segway, pelo menos o código, no projeto do Otavio de SP que postou um tutorial no link:

http://www.instructables.com/id/Angle-measurement-using-gyro-accele...

Esse tipo de robo se baseia no equilibrio por isso tomei este projeto como modelo.

O robo dele possui apenas um eixo de rodas e é controlado pelo joystick do Nitendo wii Nunchuck Wii adapter for Arduino

 

Eu modifiquei o codigo dele para as minhas necessidades que é controlar a velocidade de dois motores brusheless no intuito de acelerar e desacelerar e manter o sistema estavel.

 

Segue o código:

//----------------------------------------------------------------------------------------

// Este código é uma miscelanea de diversos códigos
// que encontrei na internet. Mas agradeço principalmente
// ao Otávio - SP por disponibilizar um tutorial
// bastante elucidativo sobre o tema (Acelerometro + Gyroscópio)
// em seu robo do tipo Segway
// http://www.instructables.com/id/Angle-measurement-using-gyro-accele...
//---------------------------------------------------------------
// Este código tem a finalidade de controlar de maneira
// estavel o vôo de um Drone
//----------------------------------------------------------------

#include <ServoTimer2.h> 

// A Biblioteca ServoTimer permite
// Declarar variáveis para até oito Motores
ServoTimer2 Motor01;   
ServoTimer2 Motor02;
ServoTimer2 Motor03;

#define X  12
#define Y  11
#define Z  10


 int ligar =1;
   //---------------------
 int val, val1, val2;
  //---------------------
//----------------------------------------------------------------


//variaveis genericas
int ledPin = 13;
char c;
int i=0,inicio=0;
boolean first_exec=true;
//double T=0;

//variaveis de controle WI-FI
int zbut,cbut;

//variaveis do aceleroemtro
int offsetX=132,offsetY=134,offsetZ=190,offsetW=319;  //offset values are obtained holding the chuck on a fix zero position
//valores de deslocamento são obtidos segurando o mandril em uma posição zero correção
static double scaleX=-50,scaleY=50,scaleZ=50,scaleW=0.512;  //point axxis upward then downward, subtracting the values, and divide by 2
//Axxis ponto para cima, em seguida, para baixo, subtraindo os valores e dividir por 2
double accx,accy,accz;
byte countx,county,countz;
double pitch=0;

//variaveis do gyroscopio
double gyro=0,w=0,teta=0,filter_teta=0;

//variaveis do PID
double dt=1;
double error=0, last_error=0;
double last_time=0,time=0;
double output=0;


#define HPF 0.98
#define LPF (1-HPF)

/* No Setup, sao inicializados as portas, entrada ou saida,
 configurado a velocidade da porta serial e o protocolo de comunicacao
 com o controle do wii, nunchuck.
 */

void setup()
{
  //Inicializa a porta Serial
  Serial.begin(19200);
  analogReference(DEFAULT);
  Serial.flush();
  pinMode(ledPin,OUTPUT);
  // Anexando os motores ao código 
  Motor01.attach(X);    
  Motor02.attach(Y);
  Motor03.attach(Z);

}


/* O codigo dentro do loop eh executado continuamente, aqui onde serao feitas as leituras dos sensores
 o processamento deste sinal, e a execucao do controle. O tempo entre cada loop eh de aproximademente
 0.05 segundos, ou seja 200Hz de frequencia.
 */
void loop()
{

  /*Esse comando gera um delay de 2s na primeira execucao do programa para calibracao das variaveis*/
  if(first_exec==true && inicio>200)
  {
    zera();
    set_offset();
    zera();
    first_exec=false;
  }
  inicio++;
  /*Nesta parte do codigo, os valores das contantes podem ser alterados por software*/
  if(Serial.available()) c=Serial.read();
  switch(c)
  {  
  case 'k':
    zera();
    set_offset();
    break;
  }
  c='l';

  while( millis() - last_time < 4 )
  {
    dt=4;
  }
  last_time = millis();

  /* Executa a leitura do nunchuck (acelerometro e botoes) e a
   leitura do gyrscopio.   
   */
  countx  = analogRead(0);
  county  = analogRead(1);
  countz  = analogRead(2);
  gyro = analogRead(3);

  /* Transforma os valores lidos pelo controle em aceleracao (g)
   pitch eh o angulo em graus calculado pela aceleracao, ou seja, inclinacao
   do acelerometro.
   */
  accx = ((double)((countx-offsetX)/scaleX));
  accy = ((double)((county-offsetY)/scaleY));
  accz = ((double)((countz-offsetZ)/scaleZ+1));
  pitch = (double)(atan2(accy,sqrt(sq(accz)+sq(accx)))*180/3.14);

  /* Transforma os valores lidos pela porta ADC em velocidade angular */
  w    = ((double)(gyro-offsetW)/scaleW);

  teta = teta + w*dt/1000;

  /* Calculo do angulo teta estimado, aqui eh usado a tecnica descrita na secao de filtros,
   onde HPF eh a constante do filtro passa alta, LPF a cosntante do filtro passa baixa,
   w eh a velocidade angular, dt eh o tempo entre cada loop.
   */
  filter_teta = HPF*(filter_teta + w*dt/1000 ) + LPF*(pitch);
 
  //Aqui novos offsets sao setados, ou seja, a nova posicao zero do robo
  //set_offset();
 

  /* Os erros podem ser zeradas para evitar que o controlador se torne instavel  */
  // if(zbut==1) {
  //  zera();
 // }
 // else{
  //  digitalWrite(ledPin,LOW);
 // }
//--------------------------------------------------------
        if (ligar != 0)
            {
               for (val= 1500; val < 1598; val +=1)
               {
                  Motor01.write(val);//Motor Esquerdo
                  Motor02.write(val);//Motor Direito
                 // Serial.print(val);
                 // Serial.print("");
                 // Serial.println();
                  delay(100);
               }
          
            }
          ligar = 0;
//-------------------------------------------------------
 //--------------------------------
  // Execução Motor Esquerdo
  //---------------------------------
  // yRaw eixo Y do acelerômetro
  // -112, menor valor de descida da asa esquerda
  // 213, Maior subida da asa esquerda
  // 1997 Velocidade aumenta quando asa desce
  // 1993 Velocidade diminui quando asa sobe
  // É feita uma proporção dos valores
  //------------------------------------------------
  // val1 val2 - variavel que recebe valor de proporção resultante
  // entre os valores do acelerometro e velocidade do motor
  //-----------------------------------------------------
  // Melhor valor até agora
  //  val1 = map (yRaw, -20,100,1596,1592);//Esquerdo
  //   val2 = map (yRaw, 40,213,1594,1598);//Direito
  // Esquerdo
  
           val1 = map (filter_teta, -90,90,1597,1594);
  // A linha abaixo manda o pulso para o motor esquerdo
  if (val1 > 1601)
    {
      val1 = 1600;
    }
           Motor01.write(val1);
  //--------------------------------
  // Execução Motor Direito
  //--------------------------------
  // yRaw eixo Y do acelerômetro
  // 40, menor valor de descida da asa Direita
  // 213, Maior subida da asa Direita
  // 1996 Velocidade aumenta quando asa desce
  // 1993 Velocidade diminui quando asa sobe
  // É feita uma proporção dos valores
//-------------------------------------------------
          val2 = map (filter_teta, -90,90,1594,1600);
  // A linha abaixo manda o pulso para o motor direito
        if (val2 > 1601)
    {
      val2 = 1600;
    }
 
 
          Motor02.write(val2);
 //---------------------------------------------------------

   Serial.print(w); // Angulo Gyro
   Serial.print(",");
   Serial.print(pitch);// Angulo Acelerometro
   Serial.print(",");
   Serial.print(filter_teta);// Angulo com filtro
   Serial.print(",");
//----Informações de Dados - Motores -----------------------
   Serial.print (val1);//Velocidade Motor Esq
   Serial.print (",");
   Serial.print (val2);//Velocidade Motor Dir
   Serial.print (",");
   Serial.println();
 
 
}


void zera(){
  digitalWrite(ledPin,HIGH);
  error=0;
  filter_teta=0;
  output=0;
  last_error=0;
  teta=0;
  w=0;
  Serial.println("Variaveis zeradas");
  delay(500);
}

void set_offset(){
  delay(500);
  offsetX=countx;
  offsetY=county;
  offsetZ=countz;
  offsetW=analogRead(3);
  Serial.println("Novos offsets setados");
}

 

 

 

 

 

 

Exibições: 14153

Responder esta

Respostas a este tópico

Estou aberto a sugestões e a explicar o código, dentro das possibilidades.

O Objetivo é dar estabilidade e controle de voo para o aeromodelo sem a necessidade de radio controle.

ontreus@msn.com e ontreus@ig.com.br

 

Onteus já estudou teoria de controle?

Não, tem algum link?

Encontrei alguma coisa sobre isso e vi isso em alguns códigos, como é o caso do PID 

Bem, quando vi isso pensei que significa-se Identificador(ID) de Processos(P)

Mas ja vi que significa: Controle Proporcional Integral Derivativo PID que une as ações derivativa, integral e proporcional, fazendo assim com que o sinal de erro seja minimizado pela ação proporcional, zerado pela ação integral e obtido com uma velocidade antecipativa pela ação derivativa.

Bem me ajudou em alguma coisa, pelo menos nas subrotinas que o sistema deve ter, mas colocar isso na pratica em termos de programação fica complicado. A parte teorica que me ajudou foi de um artigo que li , segue:

Algumas definições de siglas e termos utilizados neste artigo:  
PV: Process Variable ou variável de processo. Variável que é controlada no processo, como
temperatura, pressão, umidade, etc.


SV ou SP: Setpoint. Valor desejado para a variável de processo.


MV: Variável Manipulada. Variável sobre a qual o controlador atua para controlar o processo,
como posição de uma válvula, tensão aplicada a uma resistência de aquecimento, etc.


Erro ou Desvio: Diferença entre SV e PV. SV-PV para ação reversa e PV-SV para ação direta.


Ação de controle: Pode ser reversa ou direta. Define genericamente a atuação aplicada à MV
na ocorrência de variações da PV.


Ação Reversa: Se PV aumenta, MV diminui. Tipicamente utilizada em controles de
aquecimento.

Ação Direta: Se PV aumenta, MV aumenta. Tipicamente utilizada em controles de
refrigeração.

A técnica de controle PID consiste em calcular um valor de atuação sobre o processo a partir
das informações do valor desejado e do valor atual da variável do processo. Este valor de
atuação sobre o processo é transformado em um sinal adequado ao atuador utilizado (válvula,
motor, relé), e deve garantir um controle estável e preciso

O meu caso seria a Ação Direta, ou seja, eu  a inclinação aumenta e o motor aumenta velocidade pra diminuir essa inclinação

Uma coisa q esta complicando é quanto o uso do gyroscópio, pois ele percebe a inclinação, mas ele volta ao seu valor inicial muito rapidamente e o motor não acompanha esse processo.

Ontreus, estou trabalhando em uma IMU para estabilização de veículos aéreos como você. Atualmente uso uma IMU de 9 DOF da Pololu e uma interface  em Python aquisitando direto da serial, só para testes. O resultado direto a partir dos sensores sem filtragem tem sido abaixo do mediocre, pois o sinal dos acelerometros e giros é muito ruidoso. Minha tarefa agora consiste na filtragem destes sinais usando o filtro de Kalman.

O Arduino tem uma biblioteca de controle PID que vc pode usar para facilitar a programação, sem ter que se envolver na programação da integração e da derivação (o que tb não é um bicho de 7 cabeças e te daria um bom conhecimento). Sugiro começar com a montagem de um pendulo invertido para compreeder a implementação do PID e depois com a implementação do PID em um controle PWM de motor de avião elétrico, como normalmente se ve no Youtube. Feito isso já se tem um excelente começo.

Não começaria tentando ler os sinais de giros e acelerômetros e ao mesmo tempo tentar solucionar os problemas de controle. A unica saída para aproveitar com qualidade esse sinais parece ser aplicando técnicas de filtragem,  como o filtro de Kalman. Nem falei que uma das coisas principais na implementacao de um controlador PID 'e o ajuste de seus parametros (os coeficientes que aparecem antes dos termos proporcional, integral e derivativo), o que quase sempre requer uma modelagem do sistema, que 'e por onde se comeca.

A aceleração e desaceleração de um motor para manter o conjunto em equilíbrio não é lenta? Não seria o caso de modificar o controle por ação sobre os ângulos das pás e talvez mais um movimento de posicionamento de local dos eixos das pás em relação a superfície do objeto para se obter este equilíbrio de melhor forma ? Se for 4 conjuntos, vc. pode pensar em quadrantes e em cada quadrante um conjunto motriz. Para cada conjunto motriz existir a possibilidade de modificar o posicionamento do eixos das pás um pouco para os lados ou para cima fora do centro do quadrante. Complementando com o controle sobre os ângulos das pás e aí sim complementar com a aceleração ou desaceleração dos motores?

Bem eu não uso pás como helicoptero, deve ser isso, vc me fez ver algo que ainda não tinha visto e acredito que isso q esteja faltando. E vc esta certo, pois lembro-me de ver um video de um aeromodelo japonês em forma de globo e ele usava pás pra dar a estabilidade.Mas vai ser mais uma variavel para controlar

Obrigado pela informação

Ontreus,

Sou novato aqui no ldg, em arduino e eletronica.

Quero começar com isso e meu projeto também é um drone.

Sou programador AS3, Objective-c e java, também sou piloto virtual flight simulator e curto muito aeromodelismo.

Estou acompanhando todos seus posts, pq eu como você, quero construir um drone do zero.

Vi em um video seu que você está usando um arduino chamado black window que vem com wifi integrado, certo?

Vou começar a montar uma lista de material e queria tirar algumas dúvidas.

O arduino blackwindow ou o uno é o suficiente para montar um drone? Já que ele tem poucas portas?

Ou já é melhor comprar um arduino mega, já que vai muitos sensores, camêras e outros shields?

Outra questāo é, o que você está usando para controlar seus motores?

Espero conseguir alcançar sua evoluçāo e poder contribuir com a construçāo desse drone.

Bem, o mais importante é o desafio.

Pois há diversos produtos que ja vem pronto, inclusive para o arduino duemilanove ou uno que é o caso do aeroquad, que é um shield composto de 3 sensores (Geralmente Acelerometro + Giróscopio + Conversor Analogico Digital), mas ai perde a graça.

Eu estou me baseando no controle via WiFi no padrão 802.11g que é o que usamos para conectar nosso notebooks e outros equipamentos.

Bem, este tipo de aeromodelo, que são chamado de multimotres funcionam a base da força bruta, então se vc possuir motores suficientes fortes, ele sobe de qq maneira, mas o problema eh a estabilidade.]

Usar controle RC fica mais facil, mas ai descaracteriza o drone, pois a finalidade que ele vôe sozinho e necessite do minimo de intervenção humana.

Um arduino Nano é mais leve, mas tem pouca saida e entradas para sensores e uma versão de um shield wifi ja fica complicado um pouco de mais. Há um projeto de um português que esta tentando criar um bicoptero com o Bluethot. Inclusive desisiti de criar um tricopetro e passei para um bicotero por causa desse projeto.

Um Arduino Mega seria melhor so que vem akele caso do desafio, pois se vc for fazer uma pesquisa há placas ja prontas como o caso do ardupilot  e o ardumega, necessitando apenas a programação e por acaso ha bastante material na internet.

Estou baseando minha interface em AS3, Não sou muto bom nessa linguagem, inclusive estou trabalhando nisso agora. A minha interface de controle esta sendo baseada em um Cliente Chat em AS3, e estou tentando receber as informações vinda do arduino em telas separadas, ou TextFilds diferentes, mas não tive sucesso ainda.

Acho que um blackwindow seria suficiente ele é excelente, mas um pouco complicado para achar onde vender pois acredito que já seja um produto descontinuado, mas sempre ha outros modelos similares, a vantagem dele que você não precisa ter problemas de mau contatos entre cabos. Um shield Wifi para um arduino comum seria suficiente, mas ja aumenta o peso e sempre ha uma chance dele se desconectar em vôo. Ambos usam ja alguns pinos o que diominui a quantidade de pinos disponiveis para a entrada e saida de dados de sensores.

Para comprar esses modulos la fora, geralmente uso cartões internacionais pré-pagos, que são cartões que vc ja coloca uma certa quantia de doláres para possibilitar fazer compras nestas lojas, procure um banco que tenha esse serviço e verifique se a loja vende para o exterior sem problemas. O tempo de envio vai de 3 a 5 meses, por que demora tanto eu não sei O pré pago tem a segurança de nao te roubarem, pois ele terá a quantidade limite, ja tive dor de cabeça com isso, por isso vá por mim, melhor dessa maneira. .

Ha um serviço na embratel ou telefonica, que ha ligações com tradutores, mas tem q ser agendado e não é tão caro. Pois isso facilita a negociação, ai vai tb de confiar na loja.Não tem jeito. Tem que arriscar. Veja se na Sparkfum ha algum shield wifi pronto para o arduino, ai é mais seguro comprar pelo labdegaragem e um pouco mais rapido.

Links:

Shield Wifi Anaconda

LINK REMOVIDO POR VIOLAÇÕES AOS TERMOS DE SERVIÇO

BlackWindow

LINK REMOVIDO POR VIOLAÇÕES AOS TERMOS DE SERVIÇO

LINK REMOVIDO POR VIOLAÇÕES AOS TERMOS DE SERVIÇO

LINK REMOVIDO POR VIOLAÇÕES AOS TERMOS DE SERVIÇO

Meu msn:

ontreus@msn.com

Quando vc tiver com seu material me avisa q eu lhe ajudo.

A idéia é fazer do zero também, sem pegar placas prontas, e acho que por conexões o mega é melhor então.

O drone que pretendo fazer é algo grande, não como os ar.drones da vida, pra diversão compro um pronto :)

Quero fazer um drone autônomo, controlado por wifi e mais pra frente com células solares e bateria para ter uma boa autonomia, é uma curiosidade que tenho e não me vejo fazendo outro projeto, acho que vai demorar uns 10 anos pra ficar pronto, mas é um hobby.

Quero começar do zero, fazendo experiências com arduino, já que nunca mexi com um e com nada parecido e ir evoluindo para o drone.

Na parte de compra estou tranquilo, compro na dealextreme e jogos de ps3 a muito tempo lá de fora e por um tempo revendia produtos importados, posso dizer que praticamente não compro nada no Brasil, o pais dos impostos.

Como disse estou montando a lista de material ainda estou tentando reunir o maior número de informações possíveis para fazer uma boa lista.

Estou com problemas em achar um frame para montar isso, acho que vou ter que fazer um própiro, porque os que eu acho ou são pequenos ou são caros, hehehe

Você usa o que como base?

Para controlar os motores você está usando algum shield ou módulo?

Para controlar a velocidade de cada motor e ajudar em sua estabilidade você usa alguma coisa como isso:

LINK REMOVIDO POR VIOLAÇÕES AOS TERMOS DE SERVIÇO

Tem um pessoal discutindo sobre construir um aqui: http://www.rcgroups.com/forums/showthread.php?t=181247

Cara, se precisar de ajuda em AS3 pode falar comigo, programo AS á 10 anos.

Legal esse topico estou montando um quad, com giros, acelerometros, por enquanto nao vai ter controle ja que eu estou com pressa pra fazer.

ja estou começando a montar o sistema PID mas acredito que so um PI já é suficiente, no momento estou empacado no gyro ( SD 740) analogicamente quando ele se move um grau ( com a ajuda de um servo motor) ele da um pulso para cima e outro para baixo, assim fica foda compreender seu comportamento. agora estou tentando digitalmente (SPI) so que estou na mesma situação estava lendo sobre filtragemd e kalman e vou começar a trabalhar nisso, alguem ja esta nesse nivel?

Abcs!!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço