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);
}
}
Muito bom, parabéns!
ResponderExcluir