-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTest_Giroscopio_Bussola_Temperatura_aliment.ino
329 lines (270 loc) · 10.1 KB
/
Test_Giroscopio_Bussola_Temperatura_aliment.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
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
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
//***************************************************************************
//Programma test per il robot Poor versione 2
//Setto le porte di uscita per le funzioni:
//Integrato trovato sulla macchinetta SM6135W oppure RX2-C
//Avanti PIN 10 ---- Integrato 11
//Indieto PIN 9 ---- Integrato 10
//Destra PIN 5 ---- Integrato 6
//Sinistra PIN 6 ---- Integrato 7
//Seriale TX PIN 0
//Seriale RX PIN 1
//Velocità standard 9600
//Bit di stop 1
//Bit di partità 0
//PIN standard 1234
//
//Realizzato da: Daniele loddo alias Ivotek
//Data: 23/04/2016
//Web: www.mignololab.org www.ivotek.it
//Email: [email protected] [email protected]
//
//
// Protocollo ricezione dati direzione e velocità
//
//Il protocollo inizia con un asterisco *
//Seguito da 12 numeri interi con valore da 0 a 9
//Esempio: *255000125000
//I numeri devono essere divisi in gruppi di tre quindi l'esempio superiore sarà:
//255 000 125 000
//La sequenza è avanti indietro destra sinistra, sempre seguendo l'esempio precedente i valori sono:
//avanti 255 indietro 000 destra 125 sinistra 000
//
//Il valore massimo che si può inserire è 255 il minimo è 000
//
//
//
//Inserita la bussola, modello HMC5883L
//Scale del sensore 0.88, 1.3, 1.9, 2.5, 4.0, 4.7, 5.6, 8.1 gauss
//Scala inpostata 1.3
//SCL PIN A5
//SDA PIN A4
//
//Il giroscopio utilizzato è il modello GY-521 (MPU-6050)
//Permette di misurare l'accellerazione, l'inclinazione e la temperatura.
//SCL PIN A5
//SDA PIN A4
//
//Il sensore DHT 11 misura temperatura e uminidà
//PIN 3 ATTENZIONE lo stesso del trigher degli ultrasuoni
//La porta A0 riceve la tensione di alimentazione
//***************************************************************************
//Includo le librerie per gestire il protocollo I2C
#include <Wire.h>
//Libreria per gestire la bussola
//ATTENZIONE: Queste librerie non sono standard e vanno aggiunte
//da Sketch-->Importa libreria-->Add library
#include <HMC5883L.h>
#include <dht11.h>
//Dichiaro le variabili per utilizzare i nomi al posto dei numeri
//Spreco memoria ma il codice risulta leggibile al principiante
int Destra = 5;
int Sinistra = 6;
int Avanti = 10;
int Indietro = 9;
//Variabile per contenere il carattere
char carattere = 0;
//Variabile per contenere tutta la stringa di informazione
unsigned int StringaComandi[11];
//Variabili di lavoro del ciclo
byte x;
//Variabili per i valori dei comandi
unsigned int ValoreAvanti, ValoreIndietro, ValoreDestra, ValoreSinistra;
//funzione per convertire i singoli numeri in intero
int ConvertiIntero(int, int, int);
//Creiamo l'instanza per la bussola
HMC5883L bussola;
//Variabile per i gradi della bussola
float gradi;
//Indirizzo dell'MPU-6050
const int MPU=0x68;
//Vatiabili per contenere i valori dell'accellerazione
//inclinazione e temperatura
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
//Definisco l'istanza e il piedino per il sensore di
//temperatura e umidità
dht11 DHT;
#define DHT11_PIN 3
//Variabile per contenere i dati
int Check, Umidita,Temperatura ;
//Variabili per i sensori
int UltrasDx = 13;
int UltrasSx = 11;
int UltrasCx = 12;
int UltrasTr = 3;
//Variabili per contenere i valori dei sensori
int vUltrasDx;
int vUltrasSx;
int vUltrasCx;
int vLineaCSx;
//Variabili per contenee il tempo dell'eco
long TempoechoDx;
long TempoechoSx;
long TempoechoCx;
//Variabili per la conversione in centimetri
long centimetriD;
long centimetriS;
long centimetriC;
//Variabili per la conversione dell'alimentazione
int alim_digit;
float alimentazione;
void setup() {
//Apro la seriale a 9600
Serial.begin(9600);
//Attivo il protocollo I2C per la trasmissione e ricezione
Wire.begin();
//Inizializzo la trasmissione con il giroscopio
Wire.beginTransmission(MPU);
//Registro di power, mi serve per attivare il giroscopio
Wire.write(0x6B);
//Attivo il giroscopio
Wire.write(0);
//Termino la trasmissione
Wire.endTransmission(true);
//Inizializzo la bussola
bussola = HMC5883L();
//Setto la scala della bussola 1.3Ga
//Le misure sono da -8.1 a +8.1Ga
int errore = bussola.SetScale(8.1);
//Controllo se il settaggio è andato a buon fine
if(errore != 0)
//Se genera un errore lo stampo sulla seriale
Serial.println(bussola.GetErrorText(errore));
//Setto la misurazione continua
errore = bussola.SetMeasurementMode(Measurement_Continuous);
//Controllo se il settaggio è andato a buon fine
if(errore != 0)
//Se genera un errore lo stampo sulla seriale
Serial.println(bussola.GetErrorText(errore));
//Setto i PIN come out per pilotare i motori del robot.
pinMode(Avanti,OUTPUT); //Setto la porta Avanti come uscita
pinMode(Indietro,OUTPUT); //Setto la porta Indietro come uscita
pinMode(Destra,OUTPUT); //Setto la porta Destra come uscita
pinMode(Sinistra,OUTPUT); //Setto la porta Sinistra come uscita
}
void loop() {
//Controllo se la seriale è connessa
while (!Serial) {;}
//Leggo gli assi X ed Y della bussola
MagnetometerRaw raw = bussola.ReadRawAxis();
float radianti = atan2(raw.YAxis, raw.XAxis);
//L'angolo ottenuto è in radianti e va covnerto in gradi
if(radianti < 0)
radianti += 2*PI;
float gradi = radianti * 180/M_PI;
//Inizio la trasmissione con il giroscopio
Wire.beginTransmission(MPU);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU,14,true);
AcX=Wire.read()<<8|Wire.read(); // Accellerazione asse X
AcY=Wire.read()<<8|Wire.read(); // Accellerazione asse Y
AcZ=Wire.read()<<8|Wire.read(); // Accellerazione asse Z
GyX=Wire.read()<<8|Wire.read(); // Giroscopio asse X
GyY=Wire.read()<<8|Wire.read(); // Giroscopio asse Y
GyZ=Wire.read()<<8|Wire.read(); // Giroscopio asse Z
//Leggo i dati dal sensore di umidità e temperatura
//E controllo se il sensore è pronto
Check = DHT.read(DHT11_PIN);
if (Check == DHTLIB_OK){
//Se il sensore è pronto prelevo i dati
Umidita = DHT.humidity;
Temperatura = DHT.temperature;
}
//Setto la porta UltrasT come uscita
pinMode(UltrasTr, OUTPUT);
//Genero un impulso di 10 micro secondi per il trigger
digitalWrite(UltrasTr, LOW ); //Azzero l'uscita
delayMicroseconds(3); //Attendo 3 microsecondis
digitalWrite(UltrasTr, HIGH ); //Alzo il livello a uno
delayMicroseconds( 10 ); //Attendo 10 microsecondi
digitalWrite(UltrasTr, LOW ); //Azzero l'uscita
//Prelevo il tempo dai sensori
TempoechoDx = pulseIn( UltrasDx, HIGH,38000 );
delay(10);
//Genero un impulso di 10 micro secondi per il trigger
digitalWrite(UltrasTr, HIGH ); //Alzo il livello a uno
delayMicroseconds( 10 ); //Attendo 10 microsecondi
digitalWrite(UltrasTr, LOW ); //Azzero l'uscita
TempoechoSx = pulseIn( UltrasSx, HIGH,38000 );
delay(10);
//Genero un impulso di 10 micro secondi per il trigger
digitalWrite(UltrasTr, HIGH ); //Alzo il livello a uno
delayMicroseconds( 10 ); //Attendo 10 microsecondi
digitalWrite(UltrasTr, LOW ); //Azzero l'uscita
TempoechoCx = pulseIn( UltrasCx, HIGH,38000 );
//Converto il tempo in centimetri
centimetriD = 0.034 * TempoechoDx / 2;
centimetriS = 0.034 * TempoechoSx / 2;
centimetriC = 0.034 * TempoechoCx / 2;
//Prelevo il dato dalla porta A0 per sapere il livello di alimentazione
alim_digit = analogRead(A0);
//Converto i dati binari in analogici
alimentazione= alim_digit * (5.0 / 1023.0);
//Moltiplico per due per avere la tensione del pacco batterie
alimentazione = alimentazione * 2;
//Invio i dati alla seriale, per rispettare il protocollo
//uso del testo al posto dei valori dei sensori a ultrasuoni
//voi potete inviare i valori dei sensori
Serial.print("[");
Serial.print(centimetriS);
Serial.print("|");
Serial.print(centimetriC);
Serial.print("|");
Serial.print(centimetriD);
Serial.print("|");
Serial.print(gradi);
Serial.print("|");
Serial.print(AcX);
Serial.print("|");
Serial.print(AcY);
Serial.print("|");
Serial.print(AcZ);
Serial.print("|");
Serial.print(GyX);
Serial.print("|");
Serial.print(GyY);
Serial.print("|");
Serial.print(GyZ);
Serial.print("|");
Serial.print(Umidita);
Serial.print("|");
Serial.print(Temperatura);
Serial.print("|");
Serial.print(alimentazione);
Serial.print("]");
//Torno a capo per una facile lettura sul terminale
Serial.println("");
//Controllo se sono presenti tutti i caratteri nel buffer
if (Serial.available() > 12) {
//Prelevo il primo carattere
carattere = Serial.read();
while (carattere == '*'){
//Il primo caratere è l'asterisco inizio la sequenza
for (x=0;x<12;x++){
while (!Serial.available()) {}
carattere = Serial.read(); //Prelevo il singolo carattere
StringaComandi[x] = carattere; // Lo inserisco all'interno dell'array
}
//Trasformo i numeri singoli presenti nell'array in un numero intero
ValoreAvanti = ConvertiIntero(StringaComandi[0],StringaComandi[1],StringaComandi[2]);
ValoreIndietro = ConvertiIntero(StringaComandi[3],StringaComandi[4],StringaComandi[5]);
ValoreDestra = ConvertiIntero(StringaComandi[6],StringaComandi[7],StringaComandi[8]);
ValoreSinistra = ConvertiIntero(StringaComandi[9],StringaComandi[10],StringaComandi[11]);
//Assegno i valori ai comandi
analogWrite(Avanti, ValoreAvanti);
analogWrite(Indietro, ValoreIndietro);
analogWrite(Destra, ValoreDestra);
analogWrite(Sinistra, ValoreSinistra);
}
}
}
//Funzioni
int ConvertiIntero(int uno,int due, int tre){
//Se i valori sono tutti zero ritorno zero
if (uno == '0' && due =='0' && tre == '0') return 0;
//Converto i valori
if (uno != '0') uno = uno * 100;
if (due != '0') due = due * 10;
//Sommo i valori e restituisco l'intero
return uno + due+ tre;
}