Schritt 5: Schritt 5: machen den Laser, desto näher sind wir Bremse.
Diese benötigen ein bisschen Datenverarbeitung plus ein bisschen Triangulation.Bikeduino, Version 1
Können Ihr Fahrrad einen Laser an der Stelle zeigen, wo es stehen wird, noch, wenn die Verzögerung konstant bleibt.
#include < Servo.h >
Servo Servo;
analogen pin
#define DYNAMO_PIN 5
digitalen PWM pin
#define SERVO_PIN 10
digitalen Stift
#define LASER_PIN 11
Zeitfenster Probe Mittelung
#define WINDOW_SIZE 32
Beschleunigung durchschnittlich Fenster
#define AWINDOW_SIZE 8
der Winkel der Servo zeigt horizontal
#define SERVO_STRAIGHT_ANGLE 140
die Höhe der Millimeter das Fahrrad bewegt sich in einem Puls vom Dynamo (gemessen)
#define Mm_per_pulse 16
die Höhe der Millimeter ist der Laser über dem Boden (am Fahrrad)
#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) {}
Wenn (++ Q_p > = WINDOW_SIZE)
Q_p = 0;
Q [Q_p] = X;
}
Int average_pulsetime() {}
Int i;
lange R = 0;
für (ich = 0; ich < WINDOW_SIZE; i ++) {}
R += Q [i];
}
Return (Int) (R/WINDOW_SIZE);
}
Int Aq [AWINDOW_SIZE];
Int Aq_p = 0;
void Aqueue(int x) {}
Wenn (++ Aq_p > = AWINDOW_SIZE)
Aq_p = 0;
AQ [Aq_p] = X;
}
Int average_acceleration() {}
Int i;
lange R = 0;
für (ich = 0; ich < AWINDOW_SIZE; i ++) {}
R += Aq [i];
}
Return (Int) (R/AWINDOW_SIZE);
}
void wait_for_pulse() {}
/*
während (digitalRead(DYNAMO_PIN)) {}
}
während (! digitalRead(DYNAMO_PIN)) {}
}
*/
während (analogRead(DYNAMO_PIN) < 300) {}
}
während (analogRead(DYNAMO_PIN) > 300) {}
}
}
void laser_off() {}
DigitalWrite (LASER_PIN, LOW);
}
void laser_on() {}
DigitalWrite (LASER_PIN, hohe);
}
Int V_prev;
unsigned long Prev_t;
void loop() {}
unsigned long 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); Beschleunigung in mm/s ^ 2
aqueue(a);
Serial.println();
Serial.Print ("a:");
Serial.println(a);
ein = average_acceleration();
Serial.Print ("t:");
Serial.println(t);
Serial.Print ("dt nun:");
Serial.println(q[q_p]);
Serial.Print ("dt Av:");
Serial.println(dt);
Serial.Print ("v:");
Serial.println(v);
Serial.Print ("a:");
Serial.println(a);
Wenn (ein == 0) {}
verändern Sie nichts
}
ElseIf (< 0) {}
Wir sind verlangsamt, den Laser
laser_on();
Int d = (Int) (-sq((long) V) / a/2); Abstand (mm) bis Stillstand vorausgesetzt Verlangsamung konstant bleibt
doppelte Winkel (180.0/3.1416) = * Atan ((Doppel-) Bike_height / d); Winkel zwischen Laser und vorwärts horizontal
Servo.Write(SERVO_STRAIGHT_ANGLE-Angle); ändern Sie das Minus in ein Plus, wenn Ihr Servo umgedreht
Serial.println();
Serial.Print ("d:");
Serial.println(d);
Serial.Print ("Winkel:");
Serial.println(Angle);
}
Else {}
nicht zu verlangsamen
laser_off();
Servo.Write(SERVO_STRAIGHT_ANGLE); Punkt nach vorne
}
}