Schritt 3: Schritt 2: verarbeiten die Lesung vom Dynamo und bekommen die Geschwindigkeit, Beschleunigung und Entfernung
Erhalten Sie die Daten auf dem Arduino und Prozess de Impulse, um die Geschwindigkeit, Aceleration und Entfernung abhängig von der Impulse bekommen.Du musst Acurate sehr genau beim zählen der Impulse und dann Calbulate, Geschwindigkeit, Beschleunigung und Distanz.
Hier erhalten Sie den Code.
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
}
}