Parcheggio automatico con Arduino: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
mNessun oggetto della modifica
Riga 14:
== Presentazione del progetto ==
[[File:Photodiode_spectral_responsivity.png|miniatura|268x268px|grafico dello spettro dei colori del TCS3200]]
Il progetto volge alla realizzazione di un prototipo di parcheggio intelligente. Esso presenta all'esterno un display LCD sul quale viene presentato il numero di posti auto liberi e un visualizzatore luminoso composto da 8 LED RGB, che mostra i posti disponibili e quelli occupati. Al suo interno invece i posteggi sono forniti di sensori a infrarossi che rilevano la presenza dell'auto e la comunicano con il visualizzatore esterno. Per l'ingresso e l'uscita dal parcheggio, vengono utilizzati dei sensori RFID reader, che permettono l'apertura della sbarra (tramite un servomotore), solo con l'apposita chiave elettronica.
 
{| class="wikitable"
Riga 30:
|8
|-
|Display LCD
|LCD 16X2
|1
|-
|Servomotore
|Motore
|Tower Pro SG90
|passo-passo
|2
|-
Riga 42:
|2
|-
|RIFDRFID tag
|ISO14443-A
|1
|}
 
== Codice ==
<syntaxhighlight lang="arduino" line="1">
=== Connessione dei pin ===
#include <Servo.h>
Come prima cosa definiamo i pin ai quali colleghiamo il sensore di colore TCS3200:
#include <SPI.h>
#include <MFRC522.h>
 
#define SS_PIN 10
S0 e S1 servono per impostare la frequenza di fondoscala, ossia per tarare il grafico dei colori. Abbiamo 4 possibilità di impostazione:
#define RST_PIN 9
{| class="wikitable"
|+
!S0
!S1
!Segnale in uscita
|-
|L
|L
|//
|-
|L
|H
|2%
|-
|H
|L
|20%
|-
|H
|H
|100%
|}
Con entrambi gli ingressi alti, non viene applicata la scalatura alle frequenze.
 
S2 e S3 servono per selezionare il tipo di fotodiodi da attivare
{| class="wikitable"
!S2
!S3
!fotodiodi attivati
|-
|L
|L
|Rosso
|-
|L
|H
|Blu
|-
|H
|L
|Non filtrati
|-
|H
|H
|Verde
|}
<syntaxhighlight lang="arduino" line="1">
#define LED 3
#define S0 5
#define S1 4
#define S2 7
#define S3 6
#define B 13
#define R 12
#define G 11
#define Y 10
#define W 9
#define sensorOut 8
 
MFRC522 mfrc522(SS_PIN, RST_PIN);
</syntaxhighlight>
Servo sbarra;
int posizioneSbarra = 180;
 
=== Void setup() ===
Dichiariamo gli OUTPUT e gli INPUT. Impostiamo nel setup sia S0 che S1 come "HIGH", per avere un segnale con frequenza non scalata e per avere una lettura al 100%.<syntaxhighlight lang="arduino" line="1" start="12">
void setup() {
Serial.begin(9600);
Serial.println("Accosta la chiave RFID");
pinMode(LED, OUTPUT);
sbarra.attach(7);
pinMode(S0, OUTPUT);
sbarra.write(posizioneSbarra);
pinMode(S1, OUTPUT);
SPI.begin();
pinMode(S2, OUTPUT);
mfrc522.PCD_Init();
pinMode(S3, OUTPUT);
pinMode(sensorOutLED_BUILTIN, INPUTOUTPUT);
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(S0, HIGH);
digitalWrite(S1, HIGH);
}
</syntaxhighlight>
 
=== Voidvoid loop() ==={
if (!mfrc522.PICC_IsNewCardPresent()){
Impostiamo le tre variabili r, g, b, in cui andiamo a salvare i tempi di lettura. Per misurare l'onda quadra in uscita, invece di misurare la frequenza, teniamo conto del tempo e della lunghezza in cui il segnale di uscita è alto. Quindi imposto i pin S2 e S3, di volta in volta, per leggere un colore:
return;
}
if (!mfrc522.PICC_ReadCardSerial()){
return;
}
String uid = leggiRFID();
Serial.println(uid);
if(uid.substring(1) == "14 36 E6 E9") {
Serial.println("V");
mov();
}
delay(100);
}
 
String leggiRFID() {
* Rosso (r): S2 LOW, S3 LOW;
String content = "";
* Verde (g): S2 HIGH, S3 LOW;
byte letter;
* Blue (b): S2 LOW, S3 HIGH;
Serial.print("UID: ");
Sottoponiamo al sensore dei colori campioni (rosso, verde, blu...) e vediamo i valori delle variabili, che vengono registrati sul monitor seriale. Impostiamo quindi con delle "if{}" e delle "else {}" i valori delle variabili per riconoscere ogni variazione di colore.<syntaxhighlight lang="arduino" line="1" start="24">
for (byte i = 0; i < mfrc522.uid.size; i++){
unsigned long r, g, b;
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
void loop() {
content.concat(String(mfrc522.uid.uidByte[i], HEX));
digitalWrite(LED, HIGH);
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
r = pulseIn(sensorOut, LOW);
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
g = pulseIn(sensorOut, LOW);
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
b = pulseIn(sensorOut, LOW);
Serial.print("R=");
Serial.print(r);
Serial.print("\tGT=");
Serial.print(g);
Serial.print("\tGB=");
Serial.print(b);
delay(10);
if((r <= 6 && r >= 5)&&(g <= 22 && g >= 20)&&(b <= 18 && b >= 14)){
Serial.print("RED");
analogWrite(R, 255);
} else if((r <= 20 && r >= 18)&&(g <= 15 && g >= 13)&&(b <= 8 && b >= 6)){
Serial.print("BLUE");
analogWrite(B, 255);
} else if((r <= 7 && r >= 6)&&(g <= 5 && g >= 4)&&(b <= 8 && b >= 7)){
Serial.print("GREEN");
analogWrite(G, H);
} else if((r <= 14 && r >= 12)&&(g <= 17 && g >= 15)&&(b <= 8 && b >= 6)){
Serial.print("PURPLE");
analogWrite(B, H);
analogWrite(R, H);
} else if((r <= 4 && r >= 3)&&(g <= 7 && g >= 5)&&(b <= 10 && b >= 8)){
Serial.print("YELLOW");
analogWrite(Y, H);
} else if((r <= 4 && r >= 3)&&(g <= 4 && g >= 3)&&(b <= 4 && b >= 3)){
Serial.print("WHITE");
analogWrite(W, H);
} else if((r <= 9 && r >= 8)&&(g <= 21 && g >= 18)&&(b <= 21 && b >= 19)){
Serial.print("ORANGE");
analogWrite(Y, H);
analogWrite(R, H);
} else {
analogWrite(R, 0);
analogWrite(B, 0);
analogWrite(G, 0);
analogWrite(Y, 0);
analogWrite(W, 0);
}
content.toUpperCase();
return content;
}
 
void mov() {
delay(3000);
for (posizioneSbarra = 180; posizioneSbarra >= 90; posizioneSbarra -= 1) { // da 180 a 90 gradi
sbarra.write(posizioneSbarra); // Modifica la posizione del servo
delay(20); // Ritardo introdotto prima di cambiare posizione
}
delay(5000);
for (posizioneSbarra = 90; posizioneSbarra <= 180; posizioneSbarra += 1) { // da 90 a 180 gradi
sbarra.write(posizioneSbarra); // Modifica la posizione del servo
delay(20); // Ritardo introdotto prima di cambiare posizione
}
}
</syntaxhighlight>
 
== Espansioni suggerite ==
=== Espansioni suggerite ===
Aggiunta di: