Stap 3: Stap 2: verwerken van de lezing van de Dynamo en krijgen de snelheid, versnelling en afstand
Haal de gegevens op de Arduino, en proces de pulsen om de snelheid, Aceleration en afstand afhankelijk van de pulsen.U wilt nauwkeurig precies in het tellen van de pulsen en vervolgens calbulate versnelling, de snelheid en afstand.
Hier krijg je de code.
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
}
}