Add initial impl

This commit is contained in:
Jared Dunbar 2023-08-29 17:36:46 -04:00
commit 228886ff1c
1 changed files with 134 additions and 0 deletions

134
RadioRecieverController.ino Normal file
View File

@ -0,0 +1,134 @@
#define HORN 5
#define BELL 6
#define FL 7
#define RL 8
#define DLFL 9
#define DLFR 10
#define DLRL 11
#define DLRR 12
#include <ServoInput.h>
// Throttle Setup
const int ThrottleSignalPin = 2; // MUST be interrupt-capable!
const int ThrottlePulseMin = 1000; // microseconds (us)
const int ThrottlePulseMax = 2000; // Ideal values for your servo can be found with the "Calibration" example
// Steering Setup
const int SteeringSignalPin = 3; // MUST be interrupt-capable!
const int SteeringPulseMin = 1000; // microseconds (us)
const int SteeringPulseMax = 2000; // Ideal values for your servo can be found with the "Calibration" example
ServoInputPin<SteeringSignalPin> steering(SteeringPulseMin, SteeringPulseMax);
ServoInputPin<ThrottleSignalPin> throttle(ThrottlePulseMin, ThrottlePulseMax);
bool bell = false;
bool horn = false;
long bell_delay = 0;
void initTrack() {
Serial.println("<1 JOIN>");
}
void setDccState(bool horn, bool bell) {
if (bell) {Serial.println("<F 3333 1 1>");} else {Serial.println("<F 3333 1 0>");}
if (horn) {Serial.println("<F 3333 2 1>");} else {Serial.println("<F 3333 2 0>");}
while(Serial.available()) {Serial.read();}
}
void setup() {
pinMode(HORN, OUTPUT);
pinMode(BELL, OUTPUT);
pinMode(FL, OUTPUT);
pinMode(RL, OUTPUT);
pinMode(DLFL, OUTPUT);
pinMode(DLFR, OUTPUT);
pinMode(DLRL, OUTPUT);
pinMode(DLRR, OUTPUT);
Serial.begin(115200);
while (!ServoInput.available()) { // wait for all signals to be ready
delay(500);
}
initTrack();
}
void forward_lights() {
digitalWrite(FL, HIGH);
digitalWrite(RL, LOW);
}
void reverse_lights() {
digitalWrite(FL, LOW);
digitalWrite(RL, HIGH);
}
long ditch_light_delay = 0;
bool ditch_light_state = false;
int last_state = 1;
void runDitchLights(int state) {
if (ditch_light_delay + 1000 < millis()) {
ditch_light_state = !ditch_light_state;
ditch_light_delay = millis();
}
if(state != 0) {
last_state = state;
}
if (last_state == 1) {
digitalWrite(DLFL, ditch_light_state);
digitalWrite(DLFR, !ditch_light_state);
digitalWrite(DLRL, LOW);
digitalWrite(DLRR, LOW);
} else if (last_state == -1) {
digitalWrite(DLFL, LOW);
digitalWrite(DLFR, LOW);
digitalWrite(DLRL, ditch_light_state);
digitalWrite(DLRR, !ditch_light_state);
}
}
bool forward = true;
void loop() {
float steeringAngle = 90.0 - steering.getAngle(); // returns 0 - 180, subtracting from 90 to center at "0" and invert for "normal" steering
if (steeringAngle < -45 && bell_delay + 500 < millis()) {
bell = !bell;
bell_delay = millis();
}
horn = steeringAngle > 45;
if (bell) {
digitalWrite(BELL, HIGH);
} else {
digitalWrite(BELL, LOW);
}
if (horn) {
digitalWrite(HORN, HIGH);
} else {
digitalWrite(HORN, LOW);
}
int throttlePercent = throttle.map(-100, 100); // remap to a percentage both forward and reverse
if (throttlePercent >= 20) {
forward = true;
}
else if(throttlePercent <= -20) {
forward = false;
}
if (forward) {
forward_lights();
runDitchLights(1);
} else {
reverse_lights();
runDitchLights(-1);
}
setDccState(horn, bell);
delay(10);
}