Parcheggio automatico con Arduino: differenze tra le versioni

Da Wikiversità, l'apprendimento libero.
Contenuto cancellato Contenuto aggiunto
mNessun oggetto della modifica
Riga 14: Riga 14:
== Presentazione del progetto ==
== Presentazione del progetto ==
[[File:Photodiode_spectral_responsivity.png|miniatura|268x268px|grafico dello spettro dei colori del TCS3200]]
[[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.
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"
{| class="wikitable"
Riga 30: Riga 30:
|8
|8
|-
|-
|Display LCD
|Display
|LCD 16X2
|LCD 16X2
|1
|1
|-
|-
|Servomotore
|Motore
|Tower Pro SG90
|passo-passo
|2
|2
|-
|-
Riga 42: Riga 42:
|2
|2
|-
|-
|RIFD tag
|RFID tag
|ISO14443-A
|ISO14443-A
|1
|1
|}
|}

== Codice ==
== 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() {
void setup() {
Serial.begin(9600);
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(sensorOut, INPUT);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(S0, HIGH);
digitalWrite(S1, HIGH);
}
}
</syntaxhighlight>


=== Void loop() ===
void 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>
</syntaxhighlight>

== Espansioni suggerite ==
=== Espansioni suggerite ===
Aggiunta di:
Aggiunta di:



Versione delle 10:55, 8 feb 2022

Questa risorsa è stata scritta dagli studenti dell'Istituto ITIS "Enrico Mattei" di Urbino, della classe 4A/EN, Omiccioli Matteo, Marzi Filippo, Sasha Fasolo Massoli, Daniel Gostoli, Nicolas Mangani e Andrea Piergiovanni nell'a.s. 2021/2022, all'interno del corso di Sistemi automatici per le superiori 2.

Per favore, prima di apportare modifiche, attendi sino alla fine dell'anno scolastico (termina il 30 giugno 2022) oppure contatta il docente di riferimento Giacomo Alessandroni nel caso venissero rilevati contenuti non in linea con le linee guida della comunità.

Se leggi questo avviso ad anno scolastico concluso puoi rimuoverlo.

laboratorio
laboratorio
Parcheggio automatico con Arduino
Tipo di risorsa Tipo: laboratorio
Materia di appartenenza Materia: Sistemi automatici per le superiori 2
Avanzamento Avanzamento: laboratorio completa al 25%

Questa risorsa descrive come realizzare un Parcheggio Intelligente, sensorizzato che gestisce automaticamente l'organizzazione dei posti

Presentazione del progetto

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.

Componenti utilizzati
Descrizione Tipo Quantità
Sensori a infrarossi TCRT5000 8
LED RGB 8
Display LCD 16X2 1
Servomotore Tower Pro SG90 2
Lettore RFID RC522 2
RFID tag ISO14443-A 1

Codice

#include <Servo.h>
#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9


MFRC522 mfrc522(SS_PIN, RST_PIN);
Servo sbarra;
int posizioneSbarra = 180;

void setup() {
  Serial.begin(9600);
  Serial.println("Accosta la chiave RFID");
  sbarra.attach(7);
  sbarra.write(posizioneSbarra);
  SPI.begin();
  mfrc522.PCD_Init();
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}

void loop() {
  if (!mfrc522.PICC_IsNewCardPresent()){
    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() {
  String content = "";
  byte letter;
  Serial.print("UID: ");
  for (byte i = 0; i < mfrc522.uid.size; i++){
     content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  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
  }  
}

Espansioni suggerite

Aggiunta di:

  • contatore di oggetti in base al colore (con display a sette segmenti)
  • utilizzo di un nastro trasportatore che fa scorrere gli oggetti direttamente sotto al modulo.