sexta-feira, 25 de janeiro de 2019

Plataforma para automação de telescópio azimutal refletor

Olá pessoal. Este é mais um de nossos projetos. Desta vez estamos construindo uma plataforma motorizada que servirá para posicional com precisão um telescópio azimutal refletor. Os componentes estruturais foram feitos na impressora 3D. Estamos usando um arduino uno, um display de 16X2 com modulo I2C, um buser e dois motores de passo 28BYJ-48. A orientação aqui está sendo feita por meio do sensor MPU6050, que possui acelerômetro mas não bussola. O projeto final contará com um sensor mais adequado, o GY273. Ele não utiliza os pinos scl e sda do arduino, como o MPU6050. Vamos precisar destes pinos livres para conectar nosso modulo I2C do display, esta é mais uma vantagem do GY273.






Esta montagem  é apenas o protótipo para testes de programação. O telescópio real é bem maior. A baixo o sketch  que já funciona parcialmente. Este apresenta um menu no monitor serial do arduino que oferece algumas opções bem básicas. O programa final possibilitará as opções de controle via bluetoth por meio de um aparelho celular ou computador, por meio de uma interface gráfica que será escrita no processing. Estamos estudando também a viabilidade de agregar um modulo GPS ao telescópio, o que possibilitará uma maior precisão na localização.




Sketck provisório:

  // *********************** Bibliotecas Utilizadas *********************************
#include <MPU6050_tockn.h>
#include <Wire.h>
#include <Stepper.h>

MPU6050 mpu6050(Wire);

//******************* Relação de Variáveis do programa ****************************

int stepsPerRevolution1 = 500;  // change this to fit the number of steps per revolution
int stepsPerRevolution2 = 500;  // change this to fit the number of steps per revolution
int velocidadeX = 50;
int velocidadeZ = 50;
char comando = '0';
long eixoX = 0;
long eixoZ =0;

int dialogo = 0;

//********************** Instanciação de Objetos **********************************

Stepper myStepper1(stepsPerRevolution1, 4, 6, 5, 7);
Stepper myStepper2(stepsPerRevolution2, 8, 10, 9, 11);

//************************* Inicio do Setup ***************************************

void setup() {
  Serial.begin(9600);
  myStepper1.setSpeed(velocidadeX);
  myStepper2.setSpeed(velocidadeZ);
  Wire.begin();
  mpu6050.begin();
  mpu6050.calcGyroOffsets(true);
  tone(13,500,500);
  Serial.println(" Ok ");
  Serial.println(" ");
  Serial.println("**********************************************************************");
  Serial.println("******* Digite a letra 'm' sempre que quiser visualizar o Menu.*******");
  Serial.println("**********************************************************************");
}

//************************* Inicio do Loop ***************************************
void loop() {
  mpu6050.update();
  entradaSerial();
  if (comando == 'm') {
    Serial.println(comando);
    Serial.println("************************ Menu **************************");
    Serial.println(" Selecione uma das opções desejadas: ");
    Serial.println("'a' - Controlar ajuste automático dos eixos ");
    Serial.println("'b' - Controlar ajuste manual dos eixos ");
    Serial.println("'s' - Sair do menu. ");
  }
  while (comando == 'm') { // Entrada no primeiro nivel do menu;
    entradaSerial();
  }
  if (comando == 'a') {
    Serial.println("*******************************************************");
    Serial.println("'l' - Ligar ajuste automático dos eixos ");
    Serial.println("'d' - Desligar ajuste automático dos eixos ");
    Serial.println("'s' - Sair do menu. ");
  }
  while (comando == 'a') { // Entrada no primeiro nivel do menu;
    entradaSerial();
  }
  if (comando == 'l') {
    Serial.println("******************************************************");
    Serial.println("Ajuste automático dos eixos ATIVADO!!!");
    Serial.println("Aguarde o posicionamento dos eixos !!!!");
 
    Serial.println("'d' - Desliga ajuste automático dos eixos ");

    while (comando != 'd') { // Entrada no primeiro nivel do menu;
      AutoAjuste();
      //Serial.println("*");
      entradaSerial();
      if (mpu6050.getAngleX()> -1 && mpu6050.getAngleX()< 1 && mpu6050.getGyroZ() > -1 && mpu6050.getGyroZ() < 1){
        //tone(13,500,500);
     
     
      }
    }
  }
  if (comando == 'd') {
    Serial.println("******************************************************");
    Serial.println("Ajuste automático dos eixos DESATIVADO!!!");
    Serial.println("Telescópio apontando para o norte.");
    Serial.println("Paratelo com o orizonte.");
    Serial.println("eixo X = 0");
    Serial.println("eixo Z = 0");
    eixoX = 0;
    eixoZ = 0;

  }
  while (comando == 'd') { // Entrada no primeiro nivel do menu;
    entradaSerial();
  }
  if (comando == 's') {
    Serial.println("*****************************************************");
    Serial.println("Voce saiu do MENU");

  }
  while (comando == 's') { // Entrada no primeiro nivel do menu;
    entradaSerial();
  }
}
//************************** Inicio das Funções **********************************

void AutoAjuste() {

  mpu6050.update();
  /*
    Serial.print("angleX : ");
    Serial.print(mpu6050.getAngleX());
    Serial.print("\tangleY : ");
    Serial.print(mpu6050.getAngleY());
    Serial.print("\tangleZ : ");
    Serial.print(mpu6050.getAngleZ());
    Serial.print("Velocidade: ");
    Serial.println(velocidade);
  */
  if (mpu6050.getAngleX() > 1) {
    velocidadeX = map(mpu6050.getAngleX(), 10, 0, 50, 0); // faz variar a velocidade do eixo x para suavisar o movimento;
    myStepper1.setSpeed(velocidadeX);
    myStepper1.step(1);
  }
  if (mpu6050.getAngleX() < -1) {
    velocidadeX = map(mpu6050.getAngleX(), -10, 0, 50, 0); // faz variar a velocidade do eixo x para suavisar o movimento;
    myStepper1.setSpeed(velocidadeX);
    myStepper1.step(-1);
  }

  if (mpu6050.getGyroZ() > 2) {
    velocidadeZ = map(mpu6050.getGyroZ(), -10, 0, 50, 0); // faz variar a velocidade do eixo z para suavisar o movimento;
    myStepper1.setSpeed(velocidadeZ);
    myStepper2.step(1);
  }
  if (mpu6050.getGyroZ() < -2) {
    velocidadeZ = map(mpu6050.getGyroZ(), 10, 0, 200, 0); // faz variar a velocidade do eixo  z para suavisar o movimento;
    myStepper1.setSpeed(velocidadeZ);
    myStepper2.step(-1);
  }

}
void entradaSerial() {
  if (Serial.available()) // verifica se existe algo digitado no monitor serial;
  {
    comando = Serial.read(); // carrega o valor digitado no monitor serial na variavel "comando";
    tone(13,500,100);// porta,freq,duracao
    noTone(13);
    delay(50);
    tone(13,500,100);
  }
}

Um comentário: