Add arduino code to control stepper motors and implement Easycom2 protocol

v1
Agis Zisimatos 2014-11-11 20:48:41 +02:00
parent 4751d9ed4d
commit 03abf6fb09
6 changed files with 162 additions and 4 deletions

View File

@ -0,0 +1,60 @@
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define DIR_AZ 8
#define STEP_AZ 9
#define EN_AZ 7
#define DIR_EL 10
#define STEP_EL 11
#define EN_EL 12
#define SPD 200 //step per degree
#define T_DEALY 10000
#define T_STEPPER 1
int stepPosAz = 0;
int stepAz = 0;
int stepPosEl = 0;
int stepEl = 0;
long t1 = 0;
void setup()
{
pinMode(DIR_AZ, OUTPUT);
pinMode(STEP_AZ, OUTPUT);
pinMode(EN_AZ, OUTPUT);
digitalWrite(EN_AZ, LOW);
digitalWrite(DIR_AZ, LOW);
pinMode(DIR_EL, OUTPUT);
pinMode(STEP_EL, OUTPUT);
pinMode(EN_EL, OUTPUT);
digitalWrite(EN_EL, LOW);
digitalWrite(DIR_EL, LOW);
Serial.begin(19200);
}
void loop()
{
/*Time Check*/
if (t1 == 0)
t1 = millis();
if (stepAz == 0 && stepEl == 0 && millis()-t1 > T_DEALY)
{
digitalWrite(EN_AZ, HIGH);
digitalWrite(EN_EL, HIGH);
}
else
{
digitalWrite(EN_AZ, LOW);
digitalWrite(EN_EL, LOW);
}
cmd_proc();
stepper_move();
}

51
Arduino/Serial.ino 100644
View File

@ -0,0 +1,51 @@
void cmd_proc()
{
/*Serial*/
static char buffer[256];
char incomingByte;
static int counter=0;
char data[100];
/*Read from serial*/
while (Serial.available() > 0)
{
incomingByte = Serial.read();
/*new data*/
if (incomingByte == '\n' || incomingByte == ' ' || incomingByte == '\r')
{
buffer[counter]=0;
if (buffer[0] == 'A' && buffer[1] == 'Z')
{
strncpy(data, buffer+2, 100);
double cmdAz = atof(data);
stepAz = deg2step(cmdAz)-stepPosAz;
}
else if (buffer[0] == 'E' && buffer[1] == 'L')
{
strncpy(data, buffer+2, 10);
double cmdEl = atof(data);
stepEl = deg2step(cmdEl)-stepPosEl;
}
else if (buffer[0] == 'S' && buffer[1] == 'A')
{
stepAz = 0;
}
else if (buffer[0] == 'S' && buffer[1] == 'E')
{
stepEl = 0;
}
counter = 0;
//Reset time
t1 = 0;
}
/*Fill the buffer with incoming data*/
else {
buffer[counter] = incomingByte;
counter++;
}
}
}

View File

@ -0,0 +1,49 @@
/* Send pulses to stepper motor drivers */
void stepper_move()
{
if(stepAz>0)
{
digitalWrite(DIR_AZ, HIGH);
digitalWrite(STEP_AZ, HIGH);
stepPosAz++;
stepAz--;
}
else if(stepAz<0)
{
digitalWrite(DIR_AZ, LOW);
digitalWrite(STEP_AZ, HIGH);
stepPosAz--;
stepAz++;
}
if(stepEl>0)
{
digitalWrite(DIR_EL, LOW);
digitalWrite(STEP_EL, HIGH);
stepPosEl++;
stepEl--;
}
else if(stepEl<0)
{
digitalWrite(DIR_EL, HIGH);
digitalWrite(STEP_EL, HIGH);
stepPosEl--;
stepEl++;
}
delay(T_STEPPER);
digitalWrite(STEP_AZ, LOW);
digitalWrite(STEP_EL, LOW);
delay(T_STEPPER);
}
/* Convert degrees to steps */
int deg2step(double deg)
{
return(60*SPR*deg/360);
}
/* Convert steps to degrees */
float step2deg(int Step)
{
return(360*Step/(SPR*60));
}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@ -1,9 +1,7 @@
SatNOGS Arduino
===============
Repository of Arduino code and Arduino PCB for SatNOGS project.
Repository of Arduino code for SatNOGS project.
Refer to block diagram in the repository for wiring documentation.
The PCB is based in [Arduino Pro Micro](https://www.sparkfun.com/products/12640) and the [Pololu stepper motor driver](http://www.pololu.com/product/1182). In the picture below you can see the PCB.
![satnogs_PCB](https://raw.github.com/satnogs/satnogs-arduino/master/Pics/SatNOGS_Board_V1_1.png)
![satnogs_Diagram](https://raw.github.com/satnogs/satnogs-arduino/master/Pics/Block Diagram.png)