Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- lucasfontenla
- Date:
- 2018-05-08
- Revision:
- 16:3adab04d42a6
- Parent:
- 15:4604a7ee9c77
- Child:
- 17:55e6270adab5
File content as of revision 16:3adab04d42a6:
#include "mbed.h"
// MACHINE SETUP ---------------------------------------------------------------------------
// drivers output signal
DigitalOut enable(D2);
DigitalOut dirX(D3);
DigitalOut stepX(D4);
DigitalOut dirY(D5);
DigitalOut stepY(D6);
DigitalOut dirZ(D7);
DigitalOut stepZ(D8);
// hardware input signal
// end-of-stroke sensors
InterruptIn endX(A2);
InterruptIn endY(A3);
InterruptIn endZ(A4);
// IHM for development
AnalogIn joyX(A0);
AnalogIn joyY(A1);
DigitalIn zUp(D15);
DigitalIn zDwn(D14);
// variables definition
int modeStatus = 1;
float valX;
float valY;
int valZUp;
int valZDwn;
int activeX = 1;
int activeY = 1;
int activeZ = 1;
int x_dir;
int y_dir;
int z_dir;
int x_plus = 0;
int x_minus = 1;
int y_plus = 1;
int y_minus = 0;
int z_plus = 0;
int z_minus = 1;
int x_limit = 0;
int x_block_max = 0;
int x_block_min = 0;
int y_limit = 0;
int y_block_max = 0;
int y_block_min = 0;
int z_limit = 0;
int z_block_max = 0;
int z_block_min = 0;
float ppsMax = 600.0;
int totalX = 0;
int totalY = 0;
int totalZ = 0;
float X = 0;
float Y = 0;
float Z = 0;
int endX1Status;
int endX2Status;
// machine parameters
float xPitch = 3.0;
float yPitch = 3.0;
float zPitch = 3.0;
float motor_steps_by_rotation = 200.0;
float step_mode = 0.5;
float steps_by_rotation = motor_steps_by_rotation/step_mode;
// prototype functions
void setupPins();
void move(int pps, int x_dir, int y_dir, int z_dir, int x_step, int y_step, int z_step);
float distance(int steps, float pitch);
void endX_press(void);
void endX_release(void);
void endY_press(void);
void endY_release(void);
void endZ_press(void);
void endZ_release(void);
void zeroX(int pps);
void zeroY(int pps);
// MAIN PROGRAM ----------------------------------------------------------------
int contador = 0;
int main(){
printf("\nStarting...\r\n");
enable = 0;
endX.fall(&endX_press);
endX.rise(&endX_release);
endY.fall(&endY_press);
endY.rise(&endY_release);
endZ.fall(&endZ_press);
endZ.rise(&endZ_release);
if(modeStatus){
//Código de JOG
printf("JOG Selected\n\r");
while(1){
valX = joyX;
valY = joyY;
valZUp = zUp;
valZDwn = zDwn;
if(valX > 0.7){
if(x_dir != x_plus){
x_dir = x_plus;
}
activeX = 1;
totalX+=1;
}
else if(valX < 0.3){
if(x_dir != x_minus){
x_dir = x_minus;
}
activeX = 1;
totalX-=1;
}
else{
activeX = 0;
}
//----------------------------------------------------------------------
if(valY > 0.7){
if(y_dir != y_minus){
y_dir = y_minus;
}
activeY = 1;
totalY+=1;
}
else if(valY < 0.3){
if(y_dir != y_plus){
y_dir = y_plus;
}
activeY = 1;
totalY-=1;
}
else{
activeY = 0;
}
//----------------------------------------------------------------------
if(!valZUp && valZDwn){
if(z_dir != z_minus){
z_dir = z_minus;
}
activeZ = 1;
totalZ-=1;
}
else if(!valZDwn && valZUp){
if(z_dir != z_plus){
z_dir = z_plus;
}
activeZ = 1;
totalZ+=1;
}
else {
activeZ = 0;
}
//----------------------------------------------------------------------
move(ppsMax, x_dir, y_dir, z_dir, activeX, activeY, activeZ);
X = distance(totalX, xPitch);
Y = distance(totalY, yPitch);
Z = distance(totalZ, zPitch);
if(contador > 10000){
printf("X: %.2f Y: %.2f Z: %.2f\r\n", X, Y, Z);
contador = 0;
}
contador+=1;
}
}
else {
while(1){
move(ppsMax, x_plus, y_plus, z_plus, 0, 0, 400);
move(ppsMax, x_plus, y_plus, z_minus, 0, 0, 400);
}
}
}
// FUNCTIONS ----------------------------------------------------------------
void endX_press(void){
printf("X - press\n\r");
if(dirX == x_plus){
x_block_max = 1;
}
else {
x_block_min = 1;
}
}
void endX_release(void){
printf("X - release\n\r");
x_block_min = 0;
x_block_max = 0;
}
void endY_press(void){
printf("Y - press\n\r");
if(dirY == y_plus){
y_block_max = 1;
}
else {
y_block_min = 1;
}
}
void endY_release(void){
printf("Y - release\n\r");
y_block_min = 0;
y_block_max = 0;
}
void endZ_press(void){
printf("Z - press\n\r");
if(dirZ == z_plus){
z_block_max = 1;
}
else {
z_block_min = 1;
}
}
void endZ_release(void){
printf("Z - release\n\r");
z_block_min = 0;
z_block_max = 0;
}
void move(int pps, int x_dir, int y_dir, int z_dir, int x_step, int y_step, int z_step){
float time = 1.0/pps/2.0;
dirX = x_dir;
dirY = y_dir;
dirZ = z_dir;
// X
if((x_dir == x_plus) && x_block_max){
x_step = 0;
}
if((x_dir == x_minus) && x_block_min){
x_step = 0;
}
// Y
if((y_dir == y_plus) && y_block_max){
y_step = 0;
}
if((y_dir == y_minus) && y_block_min){
y_step = 0;
}
// Z
if((z_dir == z_plus) && z_block_max){
z_step = 0;
}
if((z_dir == z_minus) && z_block_min){
z_step = 0;
}
int max_val;
// maior número de passos -------
if(x_step > y_step){
if(x_step > z_step){
max_val = x_step;
}
else {
max_val = z_step;
}
} else if(y_step > z_step){
max_val = y_step;
}
else {
max_val = z_step;
}
for(int i = 0; i < max_val; i++){
if(i >= x_step){
stepX = 0;
}
else { stepX = 1; }
if(i >= y_step){
stepY = 0;
}
else {
stepY = 1;}
if(i >= z_step){
stepZ = 0;
}
else { stepZ = 1; }
wait(time);
stepX = 0;
stepY = 0;
stepZ = 0;
wait(time);
}
}
/*
void zeroX(int pps){
float time = 1.0/pps/2.0;
while(!x_limit_min){
if(dirX != x_minus){
dirX = x_minus;
}
stepX = 1;
wait(time);
stepX = 0;
wait(time);
}
printf("X zero\n\r");
totalX = 0.0;
}
void zeroY(int pps){
float time = 1.0/pps/2.0;
while(!y_limit_min){
if(dirY != y_minus){
dirY = y_minus;
}
stepY = 1;
wait(time);
stepY = 0;
wait(time);
}
printf("Y zero\n\r");
totalY = 0.0;
}*/
float distance(int steps, float pitch){
float delta_S = (((float)steps)/steps_by_rotation)*pitch;
return delta_S;
}