View difference between Paste ID: 8NwpxL1F and 0KpX6kei
SHOW: | | - or go back to the newest paste.
1
#define MAX_SPEED 250
2
//Left Motor connection
3
int enL = 11;
4
int in1 = 10;
5
int in2 = 9;
6
//Right Motor connection
7
int enR = 6;
8
int in3 = 5;
9
int in4 = 3;
10
11
int i;
12
13
void setup()
14
{
15
  //Assign DDR
16
  pinMode(enL,OUTPUT);
17
  pinMode(in1,OUTPUT);
18
  pinMode(in2,OUTPUT);
19
  pinMode(enR,OUTPUT);
20
  pinMode(in3,OUTPUT);
21
  pinMode(in4,OUTPUT);
22
  //Set initial state as "off"
23
  digitalWrite(enL,LOW);
24
  digitalWrite(in1,LOW);
25
  digitalWrite(in2,LOW);
26
  digitalWrite(enR,LOW);
27
  digitalWrite(in3,LOW);
28
  digitalWrite(in4,LOW);
29
}
30
31
void loop()
32
{
33
  testMax();
34
  testGradual();
35
}
36
37
/**
38
 * Sets drive to forward movement
39
 */
40
void moveForward()
41
{
42
  setL(250);
43
  setR(250);
44
}
45
46
/**
47
 * Sets drive to forward movement with speed control
48
 */
49
void moveForward(int a)
50
{
51
  if(a > MAX_SPEED) {
52
    setL(MAX_SPEED);
53
    setR(MAX_SPEED);
54
  } else if (a <= 0) {
55
    stop();
56
  } else {
57
    setL(a);
58
    setR(a);
59
  }
60
}
61
62
/**
63
 * Sets drive to backward movement
64
 */
65
void moveBackward()
66
{
67
  setL(-250);
68
  setR(-250);
69
}
70
71
/**
72
 * Sets drive to backward movement with speed control
73
 */
74
void moveBackward(int a)
75
{
76
  if(a > MAX_SPEED) {
77
    setL(MAX_SPEED * (-1));
78
    setR(MAX_SPEED * (-1));
79
  } else if (a <= 0) {
80
    stop();
81
  } else {
82
    setL(a *(-1));
83
    setR(a *(-1));
84
  }
85
}
86
87
/**
88
 * Sets drive to move counterclockwise
89
 */
90
void moveLeft()
91
{
92
  setL(50);
93
  setR(250);
94
}
95
96
/**
97
 * Sets drive to move counterclockwise with speed control
98
 */
99
void moveLeft(int a)
100
{
101
  if(a > MAX_SPEED) {
102
  	setL(MAX_SPEED/2);
103
    setR(MAX_SPEED);
104
  } else if (a < MAX_SPEED * (-1)) {
105
    setL(MAX_SPEED/-2);
106
    setR(MAX_SPEED * (-1));
107
  } else {
108
    setL(a/2);
109
    setR(map(abs(a),0,MAX_SPEED,MAX_SPEED/5,MAX_SPEED)*getSign(a));
110
  }
111
}
112
113
/**
114
 * Sets drive to move clockwise
115
 */
116
void moveRight()
117
{
118
  setL(250);
119
  setR(50);
120
}
121
122
/**
123
 * Sets drive to move counterclockwise with speed control
124
 */
125
void moveRight(int a)
126
{
127
  if(a > MAX_SPEED) {
128
  	setR(MAX_SPEED/2);
129
    setL(MAX_SPEED);
130
  } else if (a < MAX_SPEED * (-1)) {
131
    setR(MAX_SPEED/-2);
132
    setL(MAX_SPEED * (-1));
133
  } else {
134
    setR(a/2);
135
    setL(map(abs(a),0,MAX_SPEED,MAX_SPEED/5,MAX_SPEED)*getSign(a));
136
  }
137
}
138
139
/**
140
 * Sets drive to stop fully
141
 */
142
void stop()
143
{
144
  setL(0);
145
  setR(0);
146
}
147
148
149
/**
150
 * Left Motor control
151
 */
152
void setL(int a)
153
{
154
  digitalWrite(in1,(a>0)?HIGH:LOW);
155
  digitalWrite(in2,(a<0)?HIGH:LOW);
156
  analogWrite(enL,abs(a));
157
}
158
159
160
/**
161
 * Right Motor control
162
 */
163
void setR(int a)
164
{
165
  digitalWrite(in3,(a>0)?HIGH:LOW);
166
  digitalWrite(in4,(a<0)?HIGH:LOW);
167
  analogWrite(enR,abs(a));
168
}
169
170
171
/**
172
 * Test sequence of parameter-free actions
173
 */
174
void testMax()
175
{
176
  //Move Forwards
177
  moveForward();
178
  delay(4000);
179
  stop();
180
  delay(4000);
181
  //Move Backwards
182
  moveBackward();
183
  delay(4000);
184
  stop();
185
  delay(4000);
186
  //Turn Left
187
  moveLeft();
188
  delay(4000);
189
  stop();
190
  delay(4000);
191
  //Turn Right
192
  moveRight();
193
  delay(4000);
194
  stop();
195
  delay(4000);
196
}
197
198
/**
199
 * Test sequence of parametered actions
200
 */
201
void testGradual()
202
{
203
  //Accelarate Forwards
204
  for(i=0;i<=MAX_SPEED;i++) {
205
    moveForward(i);
206
    delay(10);
207
  }
208
  delay(4000);
209
  stop();
210
  delay(4000);
211
  //Accelerate Backwards
212
  for(i=0;i<=MAX_SPEED;i++) {
213
    moveBackward(i);
214
    delay(10);
215
  }
216
  delay(4000);
217
  stop();
218
  delay(4000);
219
  //Turn Backwards-Left, then Forwards-Left
220
  for(i=0-MAX_SPEED;i<=MAX_SPEED;i++) {
221
    moveLeft(i);
222
    delay(10);
223
  }
224
  delay(4000);
225
  stop();
226
  delay(4000);
227
  //Turn Backwards-Right, then Forwards-Right
228
  for(i=0-MAX_SPEED;i<=MAX_SPEED;i++) {
229
    moveRight(i);
230
    delay(10);
231
  }
232
  delay(4000);
233
  stop();
234
  delay(4000);
235
}
236
237
/**
238
 * Return sign of number
239
 */
240
int getSign(int a){
241
  return a/abs(a);
242
}