-
Notifications
You must be signed in to change notification settings - Fork 0
/
ACAZZOnew
235 lines (181 loc) · 6.01 KB
/
ACAZZOnew
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
/*
HC-SR04 Ping distance sensor]
VCC to arduino 5v GND to arduino GND
Echo to Arduino pin 13 Trig to Arduino pin 12
Red POS to Arduino pin 11
Green POS to Arduino pin 10
560 ohm resistor to both LED NEG and GRD power rail
More info at: http://goo.gl/kJ8Gl
Original code improvements to the Ping sketch sourced from Trollmaker.com
Some code and wiring inspired by http://en.wikiversity.org/wiki/User:Dstaub/robotcar
*/
//******************************* DICHIARAZIONI *******************************
#define trigPin 13
#define echoPin 12
#define R_led 2
#define G_led 3
// motor one
int enR = 10;
int in1 = 9;
int in2 = 8;
// motor two
int enL = 5;
int in3 = 7;
int in4 = 6;
char cestino;
char first_RX_byte, second_RX_byte, third_RX_byte;
long duration, distance;
int ON = 1;
//******************************* FUNZIONI *******************************
// Funzioni per gestire i MOTORI, impostare velocità, spegnerli, andare avanti o indietro
void left_motor_speed(int vel) {
// set speed to left motor
analogWrite(enL, vel);
}
void right_motor_speed(int vel) {
// set speed to right motor
analogWrite(enR, vel);
}
void motors_stop() {
// stop motors
analogWrite(enR, 0);
analogWrite(enL, 0);
}
void left_motor_forward() {
// allow left motor to go forward
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
}
void left_motor_backwards() {
// allow left motor to go backwards
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
}
void right_motor_forward() {
// allow left motor to go forward
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
}
void right_motor_backwards() {
// allow right motor to go backwards
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
}
// Funzioni per leggere o liberare il buffer della porta seriale, connessa al modulo Bluetooth HC06 (MAC Address: 98:D3:31:20:40:EB)
void clean_buffer() {
while (Serial.available() > 0) { // finché ci sono byte in attesa al buffer
cestino = Serial.read(); // sovrascrivo in continuazione la variabile 'cestino'
}
}
void read_buffer() {
// legge il buffer, per ora riceviamo solo tre byte (char, ASCII)
first_RX_byte = Serial.read(); // Read a character
delay(10); // piccolo delay per aspettare il byte in arrivo al buffer
second_RX_byte = Serial.read();
delay(10);
third_RX_byte = Serial.read();
}
// Funzione per accendere il sensore a ultrasuoni
void distance_sensor() {
// Rivedere e migliorare la parte di cacolo della distanza.
// Controllare lunghezza impulso e tempo risposta
// Funzione https://www.arduino.cc/en/Reference/PulseIn Arduino
digitalWrite(trigPin, LOW); // Added this line
delayMicroseconds(2); // Added this line
digitalWrite(trigPin, HIGH);
// delayMicroseconds(1000); - Removed this line
delayMicroseconds(10); // Added this line
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration / 2) / 29.1;
if (distance < 8) { // This is where the LED On/Off happens
digitalWrite(R_led, HIGH); // When the Red condition is met, the Green LED should turn off
digitalWrite(G_led, LOW);
motors_stop();
}
else {
digitalWrite(R_led, LOW);
digitalWrite(G_led, HIGH);
}
delay(500);
}
// Funzione per decidere l'azione da eseguire, sulla base di ciò che si è ricevuto al buffer
void next_action() {
int number1 = first_RX_byte; //converto i byte ricevuti in interi
int number2 = second_RX_byte;
int number3 = third_RX_byte;
if (number3 < 4) { // se è vero, ho ricevuto un valore di velocità dei motori
switch (number3) { //controllo i versi dei motori, se vanno avanti o indietro
case 0 : //entrambi i motori in avanti
left_motor_forward();
right_motor_forward();
break;
case 1 : //motore sinistro in avanti, destro in indietro
left_motor_forward();
right_motor_backwards();
break;
case 2 : //motore destro in avanti, sinistro in indietro
left_motor_backwards();
right_motor_forward();
break;
case 3 : //entrambi i motori in indietro
left_motor_backwards();
right_motor_backwards();
break;
}
if (ON == 1) { // se il robot è spento non imposto alcuna velocità sui motori
left_motor_speed(number1); //imposto le velocità dei motori
right_motor_speed(number2);
}
}
else { //altrimenti ho ricevuto un comando diverso
switch (number3) {
case 10:
ON = 1; //accendi il robot
break;
case 11 : //spegni il robot
ON = 0;
break;
}
}
}
//******************************* SETUP *******************************
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT); // sensore ultrasuoni
pinMode(echoPin, INPUT);
pinMode(R_led, OUTPUT); // led
pinMode(G_led, OUTPUT);
pinMode(enR, OUTPUT); // motori
pinMode(enL, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// turn on motors
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(100);
clean_buffer();
}
//******************************* LOOP *******************************
void loop() {
if (Serial.available() > 0) { // Messaggio in arrivo dalla seriale / Bluetooth
read_buffer(); // leggo il buffer, nel caso fosse arrivato qualcosa
next_action(); // decido cosa fare, sulla base di ciò che ho ricevuto
}
if (ON == 1) { // Robot ACCESO
distance_sensor();
}
else { // Robot SPENTO
motors_stop(); // fermo i motori
digitalWrite(R_led, HIGH); // lampeggiano i led
digitalWrite(G_led, HIGH);
delay(250);
digitalWrite(R_led, LOW);
digitalWrite(G_led, LOW);
delay(250);
}
}