-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrobbie-firmware.ino
141 lines (123 loc) · 2.37 KB
/
robbie-firmware.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
* Pinout for L298 motor driver
*/
#define PIN_L298_IN1 8
#define PIN_L298_IN2 9
#define PIN_L298_IN3 10
#define PIN_L298_IN4 11
/*
* Serial control chars
*/
#define CHAR_STOP 'S'
#define CHAR_FORWARD 'F'
#define CHAR_BACKWARD 'B'
//#define CHAR_FORWARD_LEFT 'l'
//#define CHAR_FORWARD_RIGHT 'r'
#define CHAR_LEFT 'L'
#define CHAR_RIGHT 'R'
#define CHAR_ROTATE_LEFT '<'
#define CHAR_ROTATE_RIGHT '>'
/*
* State machine
*/
typedef enum
{
STATE_STOP,
STATE_FORWARD,
STATE_BACKWARD,
STATE_LEFT,
STATE_RIGHT,
STATE_ROTATE_LEFT,
STATE_ROTATE_RIGHT,
} state_t;
state_t state = STATE_STOP;
#include "motor.hpp"
Motor motorLeft(PIN_L298_IN1, PIN_L298_IN2);
Motor motorRight(PIN_L298_IN3, PIN_L298_IN4);
MotorPair motors(&motorLeft,&motorRight);
uint32_t command_timeout = 0;
void setup()
{
Serial.begin(9600);
motors.stop();
}
void loop()
{
delay(10);
if (state != STATE_STOP)
{
command_timeout++;
}
if (Serial.available() > 0)
{
uint8_t c = Serial.read();
switch (c)
{
case CHAR_STOP:
state = STATE_STOP;
break;
case CHAR_FORWARD:
state = STATE_FORWARD;
break;
case CHAR_BACKWARD:
state = STATE_BACKWARD;
break;
case CHAR_LEFT:
state = STATE_LEFT;
break;
case CHAR_RIGHT:
state = STATE_RIGHT;
break;
case CHAR_ROTATE_LEFT:
state = STATE_ROTATE_LEFT;
break;
case CHAR_ROTATE_RIGHT:
state = STATE_ROTATE_RIGHT;
break;
case '1':
motors.setSpeed(128);
break;
case '2':
motors.setSpeed(160);
break;
case '3':
motors.setSpeed(192);
break;
case '4':
motors.setSpeed(224);
break;
case '5':
motors.setSpeed(255);
break;
}
command_timeout = 0;
}
if (command_timeout > 200)
{
state = STATE_STOP;
}
switch (state)
{
case STATE_FORWARD:
motors.forward();
break;
case STATE_BACKWARD:
motors.backward();
break;
case STATE_LEFT:
motors.moveLeft();
break;
case STATE_RIGHT:
motors.moveRight();
break;
case STATE_ROTATE_LEFT:
motors.rotateLeft();
break;
case STATE_ROTATE_RIGHT:
motors.rotateRight();
break;
default:
motors.stop();
break;
}
}