Welcome to Hackster!
Hackster is a community dedicated to learning hardware, from beginner to pro. Join us, it's free!
Juhan Hong장광재seunghoon ohBohyun Lee호원재
Published © GPL3+

SSHS CS 7반 3조 StarPointer

A device that shows where stars are by pointing with lasers.

AdvancedFull instructions provided10 hours6,189
SSHS CS 7반 3조 StarPointer

Things used in this project

Hardware components

SparkFun Triple Axis Accelerometer and Gyro Breakout - MPU-6050
SparkFun Triple Axis Accelerometer and Gyro Breakout - MPU-6050
×1
Arduino UNO
Arduino UNO
×1
Breadboard (generic)
Breadboard (generic)
×1
Jumper wires (generic)
Jumper wires (generic)
×20

Software apps and online services

Arduino IDE
Arduino IDE
Fusion
Autodesk Fusion

Hand tools and fabrication machines

3D Printer (generic)
3D Printer (generic)
Laser cutter (generic)
Laser cutter (generic)
Hot glue gun (generic)
Hot glue gun (generic)

Story

Read more

Custom parts and enclosures

Holder for stepper motor(28BYJ-48)

Holder for 28BYJ-48 used as the azimuth axis.

Gear

Gear used to connect the stepper to the acrylic circular plane

Stepper holder for altitude

28BYJ-48 holder for altitude changes

MPU-6050 case(base)

The case for MPU-6050(base part)
You need to print this as 1000%

MPU-6050 case(Lid)

Case for MPU-6050(lid)
You need to print this as 1000%

Case for laser pointer

Holder for laser pointer which can connect with a 3mm axis

Schematics

Circuit Design

Arduino Uno R3 board + MPU 6050 (GY-521) gyro sensor+ GY-NEO6MV2 GPS sensor

Code

star coordinate conversion functions

Arduino
Function calc converts Equatorial Coordinate of star N to a Horizontal Coordinate, and prints it in the Serial Monitor. The Code uses star data saved in array stardata, latitude and longitude, localDay and localTime data. ( The program is executed on the (localDay)th day of the year, and the (localTime)th hour of the day.)
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}}; // right Ascention, and declination data of Sirius, Rigel, Polaris, Pollux, Procyon,  Betelgeuse, Aldebaran, Capella ( reference : http://www.stellar-database.com/ )
const float pi=3.141592;
float Azimuth, altitude,hourangle,latitude,longitude;
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;               ///longitude!!!!
    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],360,0);
  findAa(stardata[N-1][1]);
  printf("%f %f",Azimuth,altitude);
}

Code for controlling stepping motor 28BYJ-48

Arduino
Code for using the stepping motor. way 1 is clockwise and way 2 is counterclockwise
#define pin1 2
#define pin2 3
#define pin3 4
#define pin4 5
void setup() {
  Serial.begin(115200);
  pinMode(pin1, OUTPUT);
  pinMode(pin2, OUTPUT);
  pinMode(pin3, OUTPUT);
  pinMode(pin4, OUTPUT);
}
void turnStepper(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 loop() {
 turnStepper(60.0,1);
 delay(1000);
}

Total code

Arduino
This is the total code we used in the star pointer
#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);
  }
}

Total code

Arduino
This is the total code for the star pointer
#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, localDay, localTime;
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) //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]);
  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();
  Serial.println("What day, what time is it?");
  while(1)
  {
    if(Serial.available())
    {
      localDay = Serial.parseInt();
      if(localDay>=1&&localDay<=366)
        break;
      Serial.println("Invalid Input!!");
    }
  }
  while(1)
  {
    if(Serial.available())
    {
      localTime = Serial.parseInt();
      if(localTime>=1&&localTime<=24)
        break;
      Serial.println("Invalid Input!!");
    }
  }
}

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);
  }
}

Code for using MPU-6050

Arduino
The code gets the accelerating data and the angle data from MPU_6050.
#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;
 
void setup() {
  // put your setup code here, to run once:
  Wire.begin();
  Wire.beginTransmission(mpu_add);
  Wire.write(0x6B);
  Wire.write(0);//MPU6050     
  Wire.endTransmission(true);
    Serial.begin(9600);
}
 
void loop() {
  // put your main code here, to run repeatedly:
 
  getaccdata();
  getgyrdata();
  
  curang();

  Serial.println((unsigned long)millis());
  Serial.println();
  Serial.println(current_angle_x);
  Serial.println(current_angle_y);
}
 
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) ;
}
 

Credits

Juhan Hong
1 project • 2 followers
Contact
장광재
29 projects • 16 followers
Contact
seunghoon oh
1 project • 1 follower
Contact
Bohyun Lee
1 project • 1 follower
Contact
호원재
0 projects • 1 follower
Contact

Comments

Please log in or sign up to comment.