#define pin1 2
#define pin2 3
#define pin3 4
#define pin4 5
#define pin5 8
#define pin6 9
#define pin7 10
#define pin8 11
#include <Wire.h>
#define mpu_add 0x68
double current_angle_x;
double current_angle_y;
double ac_x;
double ac_y;
double ac_z;
double gy_x;
double gy_y;
double gy_z;
double deg_x;
double deg_y;
double dgy_x;
double dgy_y;
float stardata[8][2]={{101.28, -16.71},{78.64, -8.2},{37.95,89.26},{116.33,28.03},{114.83,5.23},{88.79,7.41},{68.98,16.51},{79.17,46}};
const float pi=3.141592;
float Azimuth, altitude,hourangle,latitude=35,longitude=136;
int starNo;
float DtoR(float degree) // Degree to Radian
{
return degree/360*2*pi;
}
float RtoD(float radian) // Radian to Degree
{
return radian/2/pi*360;
}
void findAa(double declination) // Finds Azimuth and altitude. NEED HOURANGLE RESULT -> findHourangle()
{
Azimuth=RtoD( atan( sin( DtoR(hourangle) ) / ( cos( DtoR(hourangle) )* sin( DtoR(latitude) ) - tan( DtoR(declination) ) * cos( DtoR(latitude) ) ) ) );//https://en.wikipedia.org/wiki/Celestial_coordinate_system
altitude=RtoD( asin( sin( DtoR(latitude) ) * sin( DtoR(declination) ) + cos( DtoR(latitude) ) * cos( DtoR(declination) ) * cos( DtoR(hourangle) ) ) );
}
void findHourangle(double rightAscention,int localDay, int localTime) //https://archive.org/stream/CalculationOfLocalSiderealTime/Calculation-of-Local-Sidereal-Time_djvu.txt
{
hourangle = (localDay*0.0657098)+(localTime*1.002737)+6.1265-(longitude-136)/15;
if(hourangle<0)
hourangle+=24;
else if(hourangle>=24)
hourangle-=24;
hourangle=hourangle/24*360;
hourangle-=rightAscention;
if(hourangle<0)
hourangle+=360;
}
void calc(int N)
{
findHourangle(stardata[N-1][0],340,20);
findAa(stardata[N-1][1]);
}
void inputstarNo()
{
Serial.println("Hello. What star should I point?");
Serial.println("1.Sirius 2.Rigel 3.Polaris 4.Pollux");
Serial.println("5.Procyon 6.Betelgeuse 7.Aldebaran 8.Capella");
while(1)
{
if(Serial.available())
{
starNo = Serial.parseInt();
if(starNo>=1&&starNo<=8)
break;
Serial.println("Invalid Input!!");
}
}
Serial.print("Finding ");
Serial.print(starNo);
Serial.println("...");
}
void turnStepper1(float angle,int way){
float steps=(angle/360)*(2048);
int countstep=0;
int delaytime=5000;
if(way==1){
while(countstep<steps){
digitalWrite(pin1,HIGH);
digitalWrite(pin2,LOW);
digitalWrite(pin3,LOW);
digitalWrite(pin4,HIGH);
countstep++;
delayMicroseconds(delaytime);
digitalWrite(pin1,LOW);
digitalWrite(pin2,LOW);
digitalWrite(pin3,HIGH);
digitalWrite(pin4,HIGH);
countstep++;
delayMicroseconds(delaytime);
digitalWrite(pin1,LOW);
digitalWrite(pin2,HIGH);
digitalWrite(pin3,HIGH);
digitalWrite(pin4,LOW);
countstep++;
delayMicroseconds(delaytime);
digitalWrite(pin1,HIGH);
digitalWrite(pin2,HIGH);
digitalWrite(pin3,LOW);
digitalWrite(pin4,LOW);
countstep++;
delayMicroseconds(delaytime);
}
}
else if(way==-1){
while(countstep<steps){
digitalWrite(pin1,HIGH);
digitalWrite(pin2,LOW);
digitalWrite(pin3,LOW);
digitalWrite(pin4,HIGH);
countstep++;
delayMicroseconds(delaytime);
digitalWrite(pin1,HIGH);
digitalWrite(pin2,HIGH);
digitalWrite(pin3,LOW);
digitalWrite(pin4,LOW);
countstep++;
delayMicroseconds(delaytime);
digitalWrite(pin1,LOW);
digitalWrite(pin2,HIGH);
digitalWrite(pin3,HIGH);
digitalWrite(pin4,LOW);
countstep++;
delayMicroseconds(delaytime);
digitalWrite(pin1,LOW);
digitalWrite(pin2,LOW);
digitalWrite(pin3,HIGH);
digitalWrite(pin4,HIGH);
countstep++;
delayMicroseconds(delaytime);
}
}
}
void turnStepper2(float angle,int way){
float steps=(angle/360)*(2048);
int countstep=0;
int delaytime=5000;
if(way==1){
while(countstep<steps){
digitalWrite(pin5,HIGH);
digitalWrite(pin6,LOW);
digitalWrite(pin7,LOW);
digitalWrite(pin8,HIGH);
countstep++;
delayMicroseconds(delaytime);
digitalWrite(pin5,LOW);
digitalWrite(pin6,LOW);
digitalWrite(pin7,HIGH);
digitalWrite(pin8,HIGH);
countstep++;
delayMicroseconds(delaytime);
digitalWrite(pin5,LOW);
digitalWrite(pin6,HIGH);
digitalWrite(pin7,HIGH);
digitalWrite(pin8,LOW);
countstep++;
delayMicroseconds(delaytime);
digitalWrite(pin5,HIGH);
digitalWrite(pin6,HIGH);
digitalWrite(pin7,LOW);
digitalWrite(pin8,LOW);
countstep++;
delayMicroseconds(delaytime);
}
}
else if(way==-1){
while(countstep<steps){
digitalWrite(pin5,HIGH);
digitalWrite(pin6,LOW);
digitalWrite(pin7,LOW);
digitalWrite(pin8,HIGH);
countstep++;
delayMicroseconds(delaytime);
digitalWrite(pin5,HIGH);
digitalWrite(pin6,HIGH);
digitalWrite(pin7,LOW);
digitalWrite(pin8,LOW);
countstep++;
delayMicroseconds(delaytime);
digitalWrite(pin5,LOW);
digitalWrite(pin6,HIGH);
digitalWrite(pin7,HIGH);
digitalWrite(pin8,LOW);
countstep++;
delayMicroseconds(delaytime);
digitalWrite(pin5,LOW);
digitalWrite(pin6,LOW);
digitalWrite(pin7,HIGH);
digitalWrite(pin8,HIGH);
countstep++;
delayMicroseconds(delaytime);
}
}
}
void getaccdata() {
Wire.beginTransmission(mpu_add) ; //get acc data
Wire.write(0x3B) ;
Wire.endTransmission(false) ;
Wire.requestFrom(mpu_add, 6, true) ;
ac_x = Wire.read() << 8 | Wire.read() ;
ac_y = Wire.read() << 8 | Wire.read() ;
ac_z = Wire.read() << 8 | Wire.read() ;
}
void getgyrdata() {
Wire.beginTransmission(mpu_add) ; //get gyro data
Wire.write(0x43) ;
Wire.endTransmission(false) ;
Wire.requestFrom(mpu_add, 6, true) ;
gy_x = Wire.read() << 8 | Wire.read() ;
gy_y = Wire.read() << 8 | Wire.read() ;
gy_z = Wire.read() << 8 | Wire.read() ;
}
void curang() {
deg_x = atan2(ac_x, ac_z) * 180 / PI ; //rad to deg
deg_y = atan2(ac_y, ac_z)*180/PI;
dgy_x = gy_x / 131. ;
dgy_y = gy_y / 131. ;
current_angle_x = (0.95 * (current_angle_x + (dgy_x * 0.001))) + (0.05 * deg_x) ;
current_angle_y = (0.95 * (current_angle_y + (dgy_y * 0.001))) + (0.05 * deg_y) ;
}
void MPUreceive(){
int a=0;
while(a++<160)
{
getaccdata();
getgyrdata();
curang();
Serial.println(current_angle_y);
}
}
void resetaltitude(){
MPUreceive();
if(current_angle_y>0)
turnStepper1(current_angle_y,1);
else if(current_angle_y<0)
turnStepper1(-current_angle_y,-1);
}
void setup()
{
Wire.begin();
Wire.beginTransmission(mpu_add);
Wire.write(0x6B);
Wire.write(0);//MPU6050
Wire.endTransmission(true);
Serial.begin(9600);
pinMode(pin1, OUTPUT);
pinMode(pin2, OUTPUT);
pinMode(pin3, OUTPUT);
pinMode(pin4, OUTPUT);
pinMode(pin5, OUTPUT);
pinMode(pin6, OUTPUT);
pinMode(pin7, OUTPUT);
pinMode(pin8, OUTPUT);
resetaltitude();
}
void loop()
{
inputstarNo();
calc(starNo);
Serial.println(altitude);
Serial.println(Azimuth);
if(Azimuth<0)
Azimuth+=360;
if(altitude<0)
{
Serial.println("The star isn't here now!");
}
else
{
turnStepper1(altitude,1);
turnStepper2(Azimuth,1);
delay(10000);
turnStepper1(altitude,-1);
turnStepper2(Azimuth,-1);
}
}
Comments
Please log in or sign up to comment.