First of all, here’s a video of this device in action.
So things are really starting to take shape with the plane (still unnamed…) and I’ve got a really solid framework for an auto-balancing system. Basically the program below maps the x value given from the ADXL335 to a value from 1-180 on the servo. A lot of this code is for debug, but that portion can be switched off.
</pre> #include <Servo.h> Servo myservo; int raw_val; int ref_val; int mid_val = 336; int left_tilt = 260; int rght_tilt = 405; int min_switch = 2; int max_switch = 3; int mid_switch = 5; int mode_switch = 4; int debug_switch = 6; int bounds_LED = 10; int mid_LED = 11; int debug_LED = 7; int normal_LED = 8; void setup(){ pinMode(min_switch, INPUT); pinMode(max_switch, INPUT); pinMode(mid_switch, INPUT); pinMode(debug_switch, INPUT); pinMode(mode_switch, INPUT); pinMode(bounds_LED, OUTPUT); pinMode(mid_LED, OUTPUT); pinMode(debug_LED, OUTPUT); pinMode(normal_LED, OUTPUT); Serial.begin(9600); myservo.attach(9); } void loop(){ if (digitalRead(debug_switch) == HIGH) { digitalWrite(debug_LED, HIGH); digitalWrite(normal_LED, LOW); raw_val = analogRead(0); if (digitalRead(mode_switch) == HIGH) { digitalWrite(bounds_LED, HIGH); digitalWrite(mid_LED, LOW); Serial.print("BOUNDS MODE: "); ref_val = map(raw_val, left_tilt, rght_tilt, 0, 180); myservo.write(ref_val); if (digitalRead(min_switch) == HIGH){ Serial.print("LEFT HGH"); left_tilt = raw_val; } if (digitalRead(min_switch) == LOW){ Serial.print("LEFT LOW"); } Serial.print(" , "); if (digitalRead(max_switch) == HIGH){ Serial.print("RGHT HGH"); rght_tilt = raw_val; } if (digitalRead(max_switch) == LOW){ Serial.print("RHGT LOW"); } Serial.print(" , "); Serial.print("Left Tilt: "); Serial.print(left_tilt); Serial.print("Rght Tilt: "); Serial.print(rght_tilt); } if (digitalRead(mode_switch) == LOW) { Serial.print("MID MODE:"); if (digitalRead(mid_switch) == HIGH){ mid_val = raw_val; } int MLeft_val = mid_val - 75; int MRght_val = mid_val + 75; ref_val = map(raw_val, MLeft_val, MRght_val, 0, 180); myservo.write(ref_val); digitalWrite(bounds_LED, LOW); digitalWrite(mid_LED, HIGH); Serial.print(" , "); Serial.print("Left Most Value: "); Serial.print(MLeft_val); Serial.print(" , "); Serial.print("Rght Most Value: "); Serial.print(MRght_val); Serial.print(" , "); Serial.print(mid_val); } Serial.print(" , "); Serial.print("Raw Value: "); Serial.print(raw_val); Serial.print(" , "); Serial.print("Current Servo Value: "); Serial.print(ref_val); Serial.println(""); } if (digitalRead(debug_switch) == LOW) { digitalWrite(debug_LED, LOW); digitalWrite(normal_LED, HIGH); raw_val = analogRead(0); if (digitalRead(mode_switch) == HIGH) { digitalWrite(bounds_LED, HIGH); digitalWrite(mid_LED, LOW); ref_val = map(raw_val, left_tilt, rght_tilt, 0, 180); myservo.write(ref_val); if (digitalRead(min_switch) == HIGH){ left_tilt = raw_val; } if (digitalRead(max_switch) == HIGH){ rght_tilt = raw_val; } } if (digitalRead(mode_switch) == LOW) { if (digitalRead(mid_switch) == HIGH){ mid_val = raw_val; }<a href="https://esologic.com/wp-content/uploads/2012/12/2012-12-27_14-20-51_644.jpg"> </a> int MLeft_val = mid_val - 75; int MRght_val = mid_val + 75; ref_val = map(raw_val, MLeft_val, MRght_val, 0, 180); myservo.write(ref_val); digitalWrite(bounds_LED, LOW); digitalWrite(mid_LED, HIGH); } } }
Sorry for the lack of comments in this code, it’s pretty intuitive though, at it’s core its all about the map command.
Here’s a picture of what my desk looks like:
Here’s a picture of the fritzing document, which can be found: here
Thanks for reading!