BIKEDUINO::: Stoppa punkt prediktor för ryttare cykel (3 / 6 steg)
Steg 3: Steg 2: bearbeta behandlingen från dynamon och få den hastighet, ACCELERATION och avstånd
Få data på Arduino och processen de pulser för att få den hastighet, Aceleration och avstånd beroende på pulserna.Du måste acurate mycket just i räknar pulser och sedan calbulate hastighet, ACCELERATION och avstånd.
Här får du koden.
Bikeduino version 1
Kan din cykel peka en laser på den plats där det kommer att stå stilla, om retardation förblir konstant.
#include < Servo.h >
Servo servo;
analoga pin
#define DYNAMO_PIN 5
PWM digital pin
#define SERVO_PIN 10
Digital pin
#define LASER_PIN 11
tidsfönster prov-snitt
#define WINDOW_SIZE 32
acceleration-snitt fönster
#define AWINDOW_SIZE 8
vinkeln vid vilken servo pekar horisontellt
#define SERVO_STRAIGHT_ANGLE 140
mängden milimeter cykeln flyttas i en puls från dynamo (uppmätt)
#define mm_per_pulse 16
mängden milimeter lasern är över marken (på cykeln)
#define bike_height 1030
void setup() {
Serial.BEGIN(19200);
Serial.println ("Bikeduino version 1.");
servo.attach(SERVO_PIN);
servo.write(SERVO_STRAIGHT_ANGLE);
pinMode (LASER_PIN, OUTPUT);
}
int q [WINDOW_SIZE];
int q_p = 0;
void queue(int x) {
om (++ q_p > = WINDOW_SIZE)
q_p = 0;
q [q_p] = x;
}
int average_pulsetime() {
int i;
långa r = 0;
för (jag = 0; jag < WINDOW_SIZE; i ++) {
r + = q [i];
}
avkastning (int) (r/WINDOW_SIZE);
}
int aq [AWINDOW_SIZE];
int aq_p = 0;
void aqueue(int x) {
om (++ aq_p > = AWINDOW_SIZE)
aq_p = 0;
AQ [aq_p] = x;
}
int average_acceleration() {
int i;
långa r = 0;
för (jag = 0; jag < AWINDOW_SIZE; i ++) {
r += aq [i];
}
avkastning (int) (r/AWINDOW_SIZE);
}
void wait_for_pulse() {
/*
samtidigt (digitalRead(DYNAMO_PIN)) {
}
medan (! digitalRead(DYNAMO_PIN)) {
}
*/
samtidigt (analogRead(DYNAMO_PIN) < 300) {
}
samtidigt (analogRead(DYNAMO_PIN) > 300) {
}
}
void laser_off() {
digitalWrite (LASER_PIN, låg);
}
void laser_on() {
digitalWrite (LASER_PIN, hög);
}
int v_prev;
osignerade långa prev_t;
void loop() {
osignerade långa 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;
int a = (int) ((1000*(long)dv) / dt); acceleration i mm/s ^ 2
aqueue(a);
Serial.println();
Serial.Print ("a:");
Serial.println(a);
en = 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);
om (en == 0) {
inte ändra någonting
}
annars om (en < 0) {
Vi bromsar, punkt laser
laser_on();
int d = (int) (-sq((long) v) / a/2); avstånd (mm) tills stillestånd under förutsättning att retardationen är konstant
dubbla vinkeln = (180.0/3.1416) * atan ((dubbel) bike_height / d); vinkeln mellan laser och framåt horisontellt
servo.write(SERVO_STRAIGHT_ANGLE-Angle); ändra minus till ett plus om din servo vänds omkring
Serial.println();
Serial.Print ("d:");
Serial.println(d);
Serial.Print ("vinkel:");
Serial.println(Angle);
}
annat {
inte sakta ner
laser_off();
servo.write(SERVO_STRAIGHT_ANGLE); punkten och framåt
}
}