Stap 5: Stap 5: maken de laser dichter des te meer wij zijn rem.
Dit moet een beetje van de gegevensverwerking plus een beetje triangulating.Bikeduino versie 1
Laat uw fiets wijs een laser op de plek waar het zich nog als de vertraging constant blijft.
#include < Servo.h >
Servo de servo;
analoge pin
#define DYNAMO_PIN 5
PWM digitale pin
#define SERVO_PIN 10
digitale pin
#define LASER_PIN 11
gemiddeld monster het venster tijd
#define WINDOW_SIZE 32
versnelling gemiddeld venster
#define AWINDOW_SIZE 8
de hoek bij welke servo wijst horizontaal
#define SERVO_STRAIGHT_ANGLE 140
de hoeveelheid milimeters de fiets verplaatst in één puls van de dynamo (gemeten)
#define mm_per_pulse 16
de hoeveelheid milimeters de laser is boven het wegdek (op de fiets)
#define bike_height 1030
VOID Setup {}
Serial.begin(19200);
Serial.println ("Bikeduino versie 1.");
Servo.attach(SERVO_PIN);
Servo.write(SERVO_STRAIGHT_ANGLE);
pinMode (LASER_PIN, uitvoer);
}
int q [WINDOW_SIZE];
int q_p = 0;
VOID queue(int x) {}
Als (++ q_p > = WINDOW_SIZE)
q_p = 0;
q [q_p] = x;
}
int average_pulsetime() {}
int i;
lange r = 0;
voor (ik = 0; ik < WINDOW_SIZE; i ++) {}
r += q [i];
}
terugkeer (int) (r/WINDOW_SIZE);
}
int aq [AWINDOW_SIZE];
int aq_p = 0;
VOID aqueue(int x) {}
Als (++ aq_p > = AWINDOW_SIZE)
aq_p = 0;
aq [aq_p] = x;
}
int average_acceleration() {}
int i;
lange r = 0;
voor (ik = 0; ik < AWINDOW_SIZE; i ++) {}
r += aq [i];
}
terugkeer (int) (r/AWINDOW_SIZE);
}
ongeldig wait_for_pulse() {}
/*
terwijl (digitalRead(DYNAMO_PIN)) {}
}
terwijl (! digitalRead(DYNAMO_PIN)) {}
}
*/
terwijl (analogRead(DYNAMO_PIN) < 300) {}
}
terwijl (analogRead(DYNAMO_PIN) > 300) {}
}
}
ongeldig laser_off() {}
digitalWrite (LASER_PIN, laag);
}
ongeldig laser_on() {}
digitalWrite (LASER_PIN, hoge);
}
int v_prev;
unsigned long prev_t;
void loop {}
niet-ondertekende lange t;
int dt;
wait_for_pulse();
t = millis();
DT = t - prev_t;
Queue(DT);
prev_t = t;
DT = average_pulsetime();
int v = (1000 * mm_per_pulse) /dt; [v] = mm/s
int dv = v - v_prev;
v_prev = v;
a = (int) int ((1000*(long)dv) / dt); versnelling van de mm/s ^ 2
aqueue(a);
Serial.println();
Serial.Print ("a:");
Serial.println(a);
een = average_acceleration();
Serial.Print ("t:");
Serial.println(t);
Serial.Print ("dt nu:");
Serial.println(q[q_p]);
Serial.Print ("dt av:");
Serial.println(DT);
Serial.Print ("v");
Serial.println(v);
Serial.Print ("a:");
Serial.println(a);
Als (een == 0) {}
om het even wat niet wijzigen
}
anders als (een < 0) {}
Wij zijn vertragen, het punt van de laser
laser_on();
int d = (int) (-sq((long) v) / a/2); afstand (mm) tot stilstand uitgaande vertraging constant blijft
dubbele hoek = (180.0/3.1416) * atan ((dubbele) bike_height / d); hoek tussen laser en voorwaartse horizontaal
Servo.write(SERVO_STRAIGHT_ANGLE-Angle); het minteken omzetten in een plus als je servo is omgedraaid
Serial.println();
Serial.Print ("d:");
Serial.println(d);
Serial.Print ("hoek:");
Serial.println(Angle);
}
else {}
niet vertragen
laser_off();
Servo.write(SERVO_STRAIGHT_ANGLE); punt naar voren
}
}