[gl-como] 3ddy
Davide De Prisco
deprisco.davide@gmail.com
Mer 7 Dic 2016 13:59:03 CET
Il primo programma per 3ddy, scritto da Fabrix alla fiera di Erba
Tanto per averne traccia
##
/*Code from http://www.schmalzhaus.com/EasyDriver/Examples/Ea... */
#define INPUT_BUFFER 30
// digitalInputToInterrupt per Arduino Mega 2560
int digitalInputToInterrupt(byte pin){
switch(pin) {
case 2: return 0; break;
case 3: return 1; break;
case 18: return 5; break;
case 19: return 4; break;
case 20: return 3; break;
case 21: return 2; break;
}
}
#define RITARDO 500
class Motore {
public:
Motore(byte steppin, byte dirpin, byte fc1pin, byte fc2pin) {
m_step = steppin;
m_dir = dirpin;
m_finecorsa1 = fc1pin;
m_finecorsa2 = fc2pin;
m_finecorsa1_triggered = false;
m_finecorsa2_triggered = false;
pinMode(dirpin, OUTPUT);
pinMode(steppin, OUTPUT);
digitalWrite(dirpin, LOW);
digitalWrite(steppin, LOW);
pinMode(fc1pin, INPUT_PULLUP);
pinMode(fc2pin, INPUT_PULLUP);
}
bool step() {
Serial.print("step() "); Serial.print(m_finecorsa1_triggered);
Serial.print(" - "); Serial.println(m_finecorsa2_triggered);
if (m_dir_corrente==0 && m_finecorsa1_triggered) {
Serial.println("stop by finecorsa1"); return true; }
if (m_dir_corrente==1 && m_finecorsa2_triggered) {
Serial.println("stop by finecorsa2"); return true; }
if (m_dir_corrente==1 && m_finecorsa1_triggered) {
if (digitalRead(m_finecorsa1)) m_finecorsa1_triggered = false;
}
if (m_dir_corrente==0 && m_finecorsa2_triggered) {
if (digitalRead(m_finecorsa2)) m_finecorsa2_triggered = false;
}
digitalWrite(m_step, HIGH);
delayMicroseconds(RITARDO);
digitalWrite(m_step, LOW);
delayMicroseconds(RITARDO);
return false;
}
void set_dir(byte thedir) {
m_dir_corrente = thedir;
digitalWrite(m_dir, thedir);
}
bool m_finecorsa1_triggered;
bool m_finecorsa2_triggered;
byte m_step;
byte m_dir;
byte m_finecorsa1;
byte m_finecorsa2;
byte m_dir_corrente;
};
int Distance = 0; // Record the number of steps we've taken
int dir = 0;
Motore mx = Motore(9, 8, 19 /* X des */, 18 /* X sin */);
Motore my = Motore(11, 10, 21 /* Y sin */, 20 /* Y des */);
void int_motore_x_stop1() { mx.m_finecorsa1_triggered = true; }
void int_motore_x_stop2() { mx.m_finecorsa2_triggered = true; }
void int_motore_y_stop1() { my.m_finecorsa1_triggered = true; }
void int_motore_y_stop2() { my.m_finecorsa2_triggered = true; }
void setup() {
Serial.begin(9600);
attachInterrupt(digitalInputToInterrupt(mx.m_finecorsa1),
int_motore_x_stop1, FALLING);
attachInterrupt(digitalInputToInterrupt(mx.m_finecorsa2),
int_motore_x_stop2, FALLING);
attachInterrupt(digitalInputToInterrupt(my.m_finecorsa1),
int_motore_y_stop1, FALLING);
attachInterrupt(digitalInputToInterrupt(my.m_finecorsa2),
int_motore_y_stop2, FALLING);
}
void loop() {
char input[INPUT_BUFFER + 1];
byte size = Serial.readBytes(input, INPUT_BUFFER);
input[size] = 0;
if (size>0) do_command(input);
}
void do_command(char *input) {
//x 1 100
//y 0 10
if (input[0]=='r') {
mx.m_finecorsa1_triggered = false;
mx.m_finecorsa2_triggered = false;
my.m_finecorsa1_triggered = false;
my.m_finecorsa2_triggered = false;
return;
}
// zero dove potrebbe servire
input[1] = 0;
input[3] = 0;
char asse = input[0];
int dir = atoi( &input[2] );
char *rest = &input[4];
int steps = atoi(rest);
Serial.print("asse "); Serial.println(asse);
Motore *motore;
if (asse == 'x') motore = &mx;
if (asse == 'y') motore = &my;
Serial.print("dir "); Serial.println(dir);
motore->set_dir(dir);
for(int k=0; k<steps; k++) {
if (motore->step()) break;
//Serial.print("step "); Serial.println(k);
}
}
##
--
Davide
Maggiori informazioni sulla lista
gl-como