-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
248 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
class Button | ||
{ | ||
int prev; | ||
int pin; | ||
public: | ||
Button(int pin) : prev(HIGH), pin(pin) {} | ||
void init() | ||
{ | ||
pinMode(pin, INPUT_PULLUP); | ||
} | ||
boolean changed() | ||
{ | ||
int cur = digitalRead(pin); | ||
if (cur != prev) { | ||
prev = cur; | ||
return true; | ||
} | ||
return false; | ||
} | ||
boolean down() | ||
{ | ||
return !digitalRead(pin); | ||
} | ||
}; | ||
|
||
Button ButtonA(7); | ||
Button ButtonB(8); | ||
Button ButtonC(9); | ||
Button ButtonD(10); | ||
|
||
void setup() | ||
{ | ||
pinMode(RED_LED, OUTPUT); | ||
pinMode(GREEN_LED, OUTPUT); | ||
pinMode(BLUE_LED, OUTPUT); | ||
digitalWrite(RED_LED, LOW); | ||
digitalWrite(GREEN_LED, LOW); | ||
digitalWrite(BLUE_LED, LOW); | ||
Serial1.begin(9600); | ||
Serial2.begin(9600); | ||
ButtonA.init(); | ||
ButtonB.init(); | ||
ButtonC.init(); | ||
ButtonD.init(); | ||
} | ||
|
||
void controller() | ||
{ | ||
if (ButtonA.changed()) | ||
{ | ||
if (ButtonA.down()) | ||
{ | ||
Serial1.write('A'); | ||
digitalWrite(RED_LED, HIGH); | ||
} | ||
else | ||
Serial1.write('a'); | ||
} | ||
if (ButtonB.changed()) | ||
{ | ||
if (ButtonB.down()) | ||
{ | ||
Serial1.write('B'); | ||
digitalWrite(RED_LED, LOW); | ||
digitalWrite(GREEN_LED, HIGH); | ||
} | ||
else | ||
Serial1.write('b'); | ||
} | ||
if (ButtonC.changed()) | ||
{ | ||
if (ButtonC.down()) | ||
{ | ||
Serial1.write('C'); | ||
digitalWrite(BLUE_LED, HIGH); | ||
} | ||
else | ||
Serial1.write('c'); | ||
} | ||
if (ButtonD.changed()) | ||
{ | ||
if (ButtonD.down()) | ||
{ | ||
Serial1.write('D'); | ||
digitalWrite(GREEN_LED, LOW); | ||
digitalWrite(BLUE_LED, LOW); | ||
} | ||
else | ||
Serial1.write('d'); | ||
} | ||
} | ||
|
||
void bot() | ||
{ | ||
if (Serial2.available() > 0) | ||
{ | ||
switch (Serial2.read()) | ||
{ | ||
case 'A': | ||
digitalWrite(GREEN_LED, HIGH); | ||
break; | ||
case 'a': | ||
digitalWrite(GREEN_LED, LOW); | ||
break; | ||
case 'B': | ||
digitalWrite(BLUE_LED, HIGH); | ||
break; | ||
case 'b': | ||
digitalWrite(BLUE_LED, LOW); | ||
break; | ||
} | ||
} | ||
} | ||
|
||
void loop() | ||
{ | ||
controller(); | ||
bot(); | ||
delay(50); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
// QWOP Bot | ||
// Just like in the game QWOP, the bot doesn't walk very well | ||
|
||
|
||
#include <Servo.h> | ||
|
||
// Wheg states | ||
#define UP 1 | ||
#define DOWN 0 | ||
|
||
class Wheg | ||
{ | ||
int pin; | ||
int speed; | ||
int min_us; | ||
int max_us; | ||
int cur_us; | ||
Servo servo; | ||
int state; | ||
boolean reverse; | ||
|
||
public: | ||
Wheg(int pin, int min, int max, int speed, boolean reverse) | ||
: pin(pin), min_us(min), max_us(max), speed(speed), reverse(reverse) | ||
{} | ||
|
||
void init() | ||
{ | ||
servo.attach(pin); | ||
state = reverse? UP : DOWN; | ||
cur_us = reverse? max_us : min_us; | ||
step(); | ||
} | ||
|
||
void down() | ||
{ | ||
state = reverse? UP : DOWN; | ||
} | ||
|
||
void up() | ||
{ | ||
state = reverse? DOWN : UP; | ||
} | ||
|
||
void step() | ||
{ | ||
if (state == UP) | ||
{ | ||
cur_us += speed; | ||
if (cur_us > max_us) | ||
cur_us = max_us; | ||
} | ||
else | ||
{ | ||
cur_us -= speed; | ||
if (cur_us < min_us) | ||
cur_us = min_us; | ||
} | ||
servo.writeMicroseconds(cur_us); | ||
} | ||
|
||
void set_min(int new_min) | ||
{ | ||
min_us = new_min; | ||
} | ||
|
||
void set_max(int new_max) | ||
{ | ||
max_us = new_max; | ||
} | ||
}; | ||
|
||
Wheg whegs[6] = { | ||
Wheg( 3, 1200, 2200, 10, true), // back right | ||
Wheg( 5, 800, 1800, 10, false), // middle left | ||
Wheg( 6, 800, 1800, 10, false), // front left | ||
Wheg( 9, 800, 1800, 10, false), // front right | ||
Wheg(10, 1200, 2200, 10, true), // back left | ||
Wheg(11, 800, 1800, 10, false) // middle right | ||
}; | ||
|
||
void setup() | ||
{ | ||
int i; | ||
for (i = 0; i < 6; i++) | ||
whegs[i].init(); | ||
Serial.begin(9600); | ||
} | ||
|
||
void loop() | ||
{ | ||
int i; | ||
while (Serial.available() > 0) | ||
{ | ||
char cmd = Serial.read(); | ||
switch (cmd) | ||
{ | ||
case 'A': | ||
whegs[0].up(); | ||
break; | ||
case 'a': | ||
whegs[0].down(); | ||
break; | ||
case 'B': | ||
whegs[3].up(); | ||
break; | ||
case 'b': | ||
whegs[3].down(); | ||
break; | ||
case 'C': | ||
whegs[4].up(); | ||
break; | ||
case 'c': | ||
whegs[4].down(); | ||
break; | ||
case 'D': | ||
whegs[2].up(); | ||
break; | ||
case 'd': | ||
whegs[2].down(); | ||
break; | ||
} | ||
} | ||
for (i = 0; i < 6; i++) | ||
whegs[i].step(); | ||
delay(10); | ||
} | ||
|