arduino stuffs
Diffstat (limited to 'car_driver/arduino/infared.h')
-rw-r--r--car_driver/arduino/infared.h140
1 files changed, 0 insertions, 140 deletions
diff --git a/car_driver/arduino/infared.h b/car_driver/arduino/infared.h
deleted file mode 100644
index b445561..0000000
--- a/car_driver/arduino/infared.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
- * An IR detector/demodulator must be connected to the input RECV_PIN.
- * Version 0.1 July, 2009
- * Copyright 2009 Ken Shirriff
- * http://arcfn.com
- */
-
-#include <IRremote.h>
-#include <Streaming.h>
-
-namespace Infared {
-#define RECV_PIN 2
-struct {
-
-} ir_map;
-#define NO_INPUT 0x00
-
-#define ESTOP 0xFFF807
-#define STOP 0xFF32CD
-#define UP 0xFF0AF5
-#define LEFT 0xFF22DD
-#define RIGHT 0xFF1AE5
-#define DOWN 0xFFF00F
-
-#define UP_LEFT 0xFF12ED
-#define UP_RIGHT 0xFF2AD5
-#define DOWN_LEFT 0xFFE01F
-#define DOWN_RIGHT 0xFF9A65
-
-#pragma region math
-inline void lerp(float &from, const float to, const float weight) { from = from + (to - from) * weight; }
-inline float lerpr(const float from, const float to, const float weight) { return from + (to - from) * weight; }
-static int clamp(long value, long minv, long maxv) {
- if (value < minv)
- return minv;
- else if (value > maxv)
- return maxv;
- return value;
-}
-void kinda_round(float &n) {
- if (n > .9)
- n = 1;
- else if (n < -.9)
- n = -1;
- else if (n > -.1 and n < .1)
- n = 0;
-}
-inline int8_t mult(const float n) { return round(clamp(n * 100, -100, 100)); }
-#pragma endregion
-
-int8_t motors[2] = {0, 0};
-
-void map(const unsigned long cmd) {
- static float forces = 0, torque = 0;
-
- const float large_weight = .8, weight = .5, low_weight = .3, speed = 1;
-
- switch (cmd) {
- case ESTOP:
- torque = 0;
- forces = 0;
- case NO_INPUT:
- lerp(forces, 0, large_weight);
- lerp(torque, 0, large_weight);
- break;
- case UP:
- lerp(forces, +speed, weight);
- break;
- case LEFT:
- lerp(torque, +speed, weight);
- break;
- case RIGHT:
- lerp(torque, -speed, weight);
- break;
- case UP_LEFT:
- lerp(forces, +speed, low_weight);
- lerp(torque, -speed, low_weight);
- break;
- case UP_RIGHT:
- lerp(forces, +speed, low_weight);
- lerp(torque, +speed, low_weight);
- break;
- case DOWN:
- lerp(forces, -speed, weight);
- break;
- case DOWN_LEFT:
- lerp(forces, -speed, low_weight);
- lerp(torque, -speed / 2, low_weight);
- break;
- case DOWN_RIGHT:
- lerp(forces, -speed, low_weight);
- lerp(torque, +speed / 2, low_weight);
- break;
-
- default:
- break;
- }
- kinda_round(forces);
- kinda_round(torque);
- const float turn_amount = abs(torque) / 2.5;
- const int8_t a = mult(lerpr(forces, torque, turn_amount)), b = mult(lerpr(forces, -torque, turn_amount));
-
- if (forces > 0) {
- motors[0] = a;
- motors[1] = b;
- } else {
- motors[1] = a;
- motors[0] = b;
- }
-}
-
-IRrecv irrecv(RECV_PIN);
-
-decode_results results;
-unsigned long last_result_time = 0, last_real_result = 0;
-
-void begin() {
- Serial.begin(9600);
- irrecv.enableIRIn(); // Start the receiver
-}
-
-void loop() {
- if (irrecv.decode(&results)) {
- if (results.value == REPEAT)
- results.value = last_real_result;
- else
- last_real_result = results.value;
- map(results.value);
- last_result_time = millis();
- irrecv.resume();
- } else if (not(motors[0] == 0 and motors[1] == 0) and millis() - last_result_time > 200)
- // no results in a while (.2 seconds), lerpit down
- map(NO_INPUT);
-}
-
-inline int8_t motor_a() { return motors[0]; }
-inline int8_t motor_b() { return motors[1]; }
-
-} // namespace Infared \ No newline at end of file