Esercitazioni Arduino Sensori

Scarica in formato pdf o txt
Scarica in formato pdf o txt
Sei sulla pagina 1di 31

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag.

1
ESERCITAZIONI

1. IL RELE’
2. IL MOTORE IN CORRENTE CONTINUA (CC)
3. INVERSIONE VERSO DI ROTAZIONE MOTORE DC
4. IL SERVOMOTORE
5. INSEGUITORE SOLARE CON SERVO
6. IL FOTORESISTENZA
7. IL SENSORE DI FLESSIONE ANGOLARE (FLEX SENSOR)
8. IL SENSORE DI FORZA
9. IL SENSORE DI TEMPERATURA TMP36

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 2


IL RELE’
Il relè è un interruttore elettromeccanico composto da una bobina all’interno del quale si crea un campo magnetico.
Quando non passa corrente nella bobina il relè ha un contatto chiuso. Se viene attraversato da corrente il relè si
“eccita” e tramite una lamella viene aperto il contatto in precedenza chiuso, e chiuso il contatto in precedenza
aperto.
A riposo il contatto chiuso viene chiamato NC (normalmente chiuso), mentre il contatto aperto NA (normalmente
aperto). Vi è poi un terzo contatto denominato C (comune) .

Schema in Thinkercad

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 3


Progetto con Arduino
Si deve attivare un motore DC tramite un relè quando un pulsante di START viene premuto.

CODICE
int pinAvvio = 12;
int pinRele= 4;
int stato_bottone=LOW;

void setup()
{
pinMode(pinAvvio, INPUT);
pinMode(pinRele, OUTPUT);
}

void loop()
{
stato_bottone= digitalRead(pinAvvio);
if (stato_bottone ==HIGH)
{
digitalWrite(pinRele, HIGH);
}
else
{
digitalWrite(pinRele, LOW);
}
}

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 4


Progetto con Arduino
Si deve attivare un motore DC tramite un relè quando un pulsante di START viene premuto per almeno 3 secondi.

CODICE
int stato_bottone=LOW;
long tempo;
long counter=0;
long delta_t;

void setup()
{
pinMode(4, OUTPUT); // pin comando relè
pinMode(12, INPUT); // pin stato bottone
}

void loop()
{
stato_bottone= digitalRead(12);
if (stato_bottone ==HIGH){
counter++;
if (counter==1) {tempo = millis();}
delta_t = millis() - tempo;
if (delta_t>=3000){ digitalWrite(4, HIGH); }
}
else
{
tempo = millis();
digitalWrite(4, LOW);
counter=0;
}
}
Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 5
IL RELE’ ALLO STATO SOLIDO (SSR)

Gli SSR sono relè privi di contatti meccanici.


Un relè a stato solido è un dispositivo elettrico di commutazione che, attraverso l’utilizzo di un fotoaccoppiatore,
trasmette e fornisce elettricità all’uscita.
Quando è attivato, il segnale ottico di ingresso funge da “interruttore” che consente a un segnale ad alta tensione di
passare attraverso la parte di uscita del SSR.

Come per i relè elettromeccanici permettono di implementare:

 Separazione galvanica fra circuito di comando e circuito di potenza;


 Separazione dei circuiti in C.A. e in C.C.;
 Interfaccia fra circuiti elettronici e di potenza;
 Funzioni di commutazione.

Campi applicativi dei relè a stato solido

I vantaggi principali dei relè a stato solido hanno direttamente a che fare con le caratteristiche di produzione.

Un SSR è infatti un relè elettronico con:

 Capacità di commutazioni ad altissime frequenze. Contrariamente agli EMR (elettromeccanici) con


attivazione elettromeccanica che richiedono tempi di intervento di circa 15 millisecondi, gli SSR diminuiscono
queste tempistiche di oltre 10 millisecondi, con una durata che va da 1 a 5 millisecondi.
 Una lunga vita elettrica anche con ritmi di commutazione molto elevate. Questo vantaggio viene garantito
dalla componentistica elettronica all’interno dei relè.
 Un rumore elettrico azzerato (silenziosità elettrica con commutazione non udibile)
 Ingombri ridotti. Quest’ultima caratteristica è sicuramente apprezzata in tutti i campi ma diventa una qualità
fondamentale e discriminante nelle applicazioni su schede elettroniche.

La gestione con Arduino è del tutto analoga ai relè elettromeccanici.

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 6


MOTORE IN CORRENTE CONTINUA (CC)
Un motore in corrente continua (CC) è una macchina elettrica che converte l’energia elettrica (V, I) in energia
meccanica (Coppia motrice , n° giri).

Singole parti

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 7


Progetto con Arduino
Regolare la velocità di rotazione del motore mediante un potenziometro.

NB: ai capi di un motore va sempre messo un diodo di protezione del transistor di comando (anodo sul +) che è stato
omesso per semplificare lo schema.

Il motore DC non può essere alimentato direttamente da un PIN di Arduino poiché la corrente richiesta dal motore è
superiore a quella fornita da un PIN.

Quando si usa un alimentatore dedicato è necessario mettere la massa in comune con quella di Arduino per
garantire il corretto funzionamento (serve lo stesso riferimento per la massa).

La regolazione della velocità del motore DC si effettua in 2 modi:


- regolando la tensione a capi del motore (ad esempio con un potenziometro)
- regolando il tempo (PWM) in cui la tensione massima di alimentazione del motore viene applicata ai suoi capi

Il 2° metodo permette di regolare la velocità mantenendo anche la coppia motrice sempre elevata mentre nel 1°
modo la coppia cala proporzionalmente alla tensione applicata.

Per fornire una corrente sufficiente al motore è necessario utilizzare un amplificatore (transistor) comandato in
PWM da un PIIN di Arduino.

L’oscilloscopio permette di vedere il segnale di regolazione PWM (0-5V) generato da un PIN di Arduino.

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 8


CODICE
int motorPin = 9; // PWM
int potPin = A0; // POTENTIOMETER
int potValue = 0;

void setup()
{
pinMode(potPin, INPUT);
pinMode(motorPin, OUTPUT);
Serial.begin(9600);
}

void loop()
{
// read the value from the sensor
if (analogRead(potPin) != potValue)
{
potValue = analogRead(potPin);
analogWrite(motorPin, potValue/4);
Serial.println(potValue);
}
delay(20); // Wait for 20ms
}

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 9


Progetto con Arduino
Regolare la velocità di rotazione del motore con un comando inviato tramite il monitor seriale (0  100%).

NB: ai capi di un motore va sempre messo un diodo di protezione del transistor di comando (anodo sul +) che è stato
omesso per semplificare lo schema.

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 10


CODICE

int motorPin = 9; // PWM


int potPin = A0; // POTENTIOMETER
int potValue = 0;
int incomingByte; // variabile che contiene i dati ricevuti sulla seriale

void setup()
{
pinMode(potPin, INPUT);
pinMode(motorPin, OUTPUT);
Serial.begin(9600);
}

void loop()
{
//SERIALE: controllo se ci sono dati …
if (Serial.available() > 0)
{
incomingByte = Serial.parseInt(); // converte in un numero i caratteri ricevuto sulla porta seriale
Serial.println(incomingByte);

if (incomingByte>=0 && incomingByte<=100)


{
int speed = incomingByte *255 / 100;
Serial.println(speed);
analogWrite(motorPin, speed);
}
}

// read the value from the sensor


if (analogRead(potPin) != potValue)
{
potValue = analogRead(potPin);
analogWrite(motorPin, potValue/4);
Serial.println(potValue);
}

delay(20); // Wait for 20ms


}

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 11


INVERSIONE VERSO DI ROTAZIONE MOTORE DC
Progetto con Arduino
Impostare il verso di rotazione del motore DC attraverso due pulsanti.

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 12


CODICE

int incomingByte = 0; // for incoming serial data

void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);

pinMode(4, INPUT);
pinMode(5, INPUT);

Serial.begin(9600);
}

void loop() {

int statoP1= digitalRead(4);


if (statoP1== HIGH) {
Serial.println("M1 ORARIO");
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
}
else
{
Serial.println("M1 STOP");
digitalWrite(2, LOW);
}

int statoP2= digitalRead(5);


if (statoP2== HIGH) {
Serial.println("M1 ANTIORARIO");
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
}
else
{
Serial.println("M1 STOP");
digitalWrite(3, LOW);
}

delay(100);
}

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 13


Progetto con Arduino
Impostare il verso di rotazione del motore DC attraverso comandi inviati dal monitor seriale.
1  rotazione oraria
2  rotazione antioraria
3-4  stop

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 14


CODICE

int incomingByte = 0; // for incoming serial data

void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);

pinMode(4, INPUT);
pinMode(5, INPUT);

Serial.begin(9600);
}

void loop() {

//SERIALE leggo numeri da 0-9 (1 cifra)


if (Serial.available() > 0) {
incomingByte = Serial.parseInt();
Serial.println(incomingByte);

if (incomingByte==1) {
Serial.println("M1 ORARIO");
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
}
else if (incomingByte==2) {
Serial.println("M1 ANTIORARIO");
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
}
else if (incomingByte==3) {
Serial.println("STOP");
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
}
else if (incomingByte==4) {
Serial.println("STOP");
digitalWrite(2, LOW);
digitalWrite(3, LOW);
}
else
{
Serial.println("non valido");
}
}

delay(100);
}

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 15


SERVOMOTORE
Un servomotore elettrico rotativo è un motore che permette il controllo di precisione della posizione angolare.
Il servomotore classico è composto da due elementi principali: il sensore di posizione o feedback e il motore a cui si
può aggiungere un riduttore e un freno in caso di necessità.
Richiede inoltre un azionamento e/o un controllore più o meno sofisticato a seconda del livello di controllo che si
vuole raggiungere.

Hobby Industriale

Vista interna

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 16


Progetto con Arduino
Muovere l’albero del servo a destra e a sinistra (180°0° e viceversa) con passo di 1°.

CODICE
#include <Servo.h>
Servo servo_9;
int pos = 0;

void setup()
{
servo_9.attach(9, 500, 2500);
}

void loop()
{
// sweep the servo from 0 to 180 degrees in steps of 1 degrees
for (pos = 0; pos <= 180; pos += 1) {
servo_9.write(pos);
delay(15); // Wait for 15 millisecond(s)
}
for (pos = 180; pos >= 0; pos -= 1) {
servo_9.write(pos);
// wait 15 ms for servo to reach the position
delay(15); // Wait for 15 millisecond(s)
}
}

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 17


COMPITO

1. Modificare il circuito affinché il servomotore abbia una alimentazione dedicata con transistor NPN.

2. Modificare il circuito e il codice per gestire due servo motori.

3. Modificare il codice per gestire il servomotori tramite comandi inviati dal monitor seriale

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 18


INSEGUITORE SOLARE CON 2 SERVO
Un inseguitore solare è un sistema che consente di rilevare la posizione del sole per sfruttare il massimo
irraggiamento possibile con griglie di pannelli fotovoltaici orientabili.
Il sistema in figura è costituito da due servomotori che permettono di muovere la piccola cella solare nello spazio su
due piani.

0°;0° 60°;0° 60°;-45° 60°;45°

Progetto con Arduino


Si devono ruotare i due servo nello spazio in modo da individuare la direzione in cui si ha il massimo irraggiamento.
La cella solare fornisce una tensione da 0  5 volt proporzionale all’intensità dell’irraggiamento solare.

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 19


FOTORESISTENZA
La fotoresistenza è un componente elettronico la cui resistenza è inversamente proporzionale alla quantità di luce che
lo colpisce. Si comporta come un normale resistore, ma il suo valore in ohm diminuisce a mano a mano che aumenta
l'intensità della luce che la colpisce.

Le misure della resistenza del sensore vanno fatte scollegate dall’alimentazione!

Al buio Alla massima luminosità

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 20


Connessione ad Arduino

Resistenza da 4.7K in serie alla foto resistenza.

CODICE
int sensorValue = 0;

void setup()
{
pinMode(A0, INPUT);
Serial.begin(9600);
pinMode(9, OUTPUT);
}

void loop()
{
// read the value from the sensor
sensorValue = analogRead(A0);
// print the sensor reading so you know its range
Serial.println(sensorValue);
// map the sensor reading to a range for the LED
analogWrite(9, map(sensorValue, 0, 1023, 0, 255));
delay(100); // Wait for 100 millisecond(s)
}
Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 21
SENSORE DI FLESSIONE ANGOLARE (FLEX SENSOR)
Il sensore di flessione (resistivo) contiene un inchiostro polimerico a base di particelle conduttive.
Quando il sensore è piegato, le aree si allontanano, riducendo la conduttività e quindi aumentando la resistenza
elettrica.

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 22


Misura della variazione di tensione dovuta alla variazione di resistenza del sensore (potenziometro).

Il campo di variazione della tensione è di 0.96V.

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 23


Progetto con Arduino
Si vuole comandare un servo motore tramite un sensore di forza flessibile.
Una applicazione tipica è quella che consente di comandare un robot tramite il movimento delle dita di una mano
che indossa un guanto dotato di sensori flessibili su ogni dito.

Componenti: 1 servo SG90, 1 resistenza da 10K e 1 sensore di flessione da 30K a riposo

CODICE
#include <Servo.h>
Servo myServo;
# define flexPin A0

void setup()
{
myServo.attach(3);
Serial.begin(9600);
}

void loop()
{
int flexValue;
int servoPosition;
flexValue = analogRead(flexPin);
servoPosition = map(flexValue, 770, 950, 0, 180);
servoPosition = constrain(servoPosition, 0, 180);

myServo.write(servoPosition);

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 24


Serial.print("sensor =");
Serial.println(flexValue);
Serial.print("servo =");
Serial.println(servoPosition);

delay(20);
}

COMPITO
1- Estendere il progetto in modo da gestire due servo motori con due sensori di flessione
2- Utilizzare il sensore di flessione per comandare il numero di giri di un motore DC 5V.
3- Valutare un valore di resistenza che permetta una maggiore variazione di tensione in ingresso ad Arduino
(maggiore precisione)

Il campo di variazione della tensione è di 1.72 Volt rispetto ai 0.96V di prima.


Modificare il programma di conseguenza.

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 25


SENSORE DI FORZA (ESTENSIMETRO)
L'estensimetro è uno strumento di misura (resistivo) utilizzato per rilevare piccole deformazioni dimensionali di un
corpo sottoposto a sollecitazioni meccaniche o termiche (es. applicazione di carichi o variazioni di temperatura).
Conoscendo a priori le caratteristiche meccanico/fisiche del materiale, misurando le deformazioni si possono
facilmente ricavare i carichi a cui il materiale è sottoposto. Inoltre, utilizzando estensimetri di giusta tipologia e
applicandoli in modo oculato, si possono rilevare la direzione e il verso di queste deformazioni, e di conseguenza il
vettore delle forze applicato al materiale sotto esame.

Misure di resistenza

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 26


Progetto con Arduino
Accendere una striscia di led in modo proporzionale alle forza rilevata dal sensore.

CODICE

#define fsrpin A0
#define led1 2
#define led2 3
#define led3 4
#define led4 5
#define led5 6
#define led6 7

int fsrreading;

void setup() {
Serial.begin(9600);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 27
}

void loop() {

fsrreading = analogRead(fsrpin);

Serial.println(fsrreading);

if (fsrreading > 200) {


digitalWrite(led1, HIGH);
}
else digitalWrite(led1, LOW);
if (fsrreading > 450) {
digitalWrite(led2, HIGH);
}
else digitalWrite(led2, LOW);
if (fsrreading > 550) {
digitalWrite(led3, HIGH);
}
else digitalWrite(led3, LOW);
if (fsrreading > 650) {
digitalWrite(led4, HIGH);
}
else digitalWrite(led4, LOW);
if (fsrreading > 800) {
digitalWrite(led5, HIGH);
}
else digitalWrite(led5, LOW);
if (fsrreading > 900) {
digitalWrite(led6, HIGH);
}
else digitalWrite(led6, LOW);
}

COMPITO

1- Utilizzare il sensore di forza per avviare un motore DC 5V quando la forza applicata supera i 5N.

2- Utilizzare due sensori di forza per verificare se un oggetto è posizionato al centro di un appoggio (la forza
rilevata dai sensori sarà uguale) e usare due led di colore diverso per indicare se è sbilanciato a destra o
sinistra.

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 28


SENSORE DI TEMPERATURA TMP36
Il componente elettronico TMP36 è un dispositivo integrato ad alta precisione utilizzato per misurare la temperatura
ambientale.
Dato il basso costo e l’ampia scala di valori ammissibili (ovvero da -40°C fino a 125°C) questi dispositivi sono
particolarmente diffusi. Non è necessaria nessuna operazione calibrazione per ottenere valori di accuratezza pari a
±1°C ad una temperatura di circa +25°C e ±2°C nel range di temperature −40°C to +125°C.

Nel caso specifico, osservando il grafico che riporta la caratteristica tensione/temperatura (per il TMP36 la linea è
evidenziata in rosso) per una tensione di uscita di 0.5V il sensore rileva la temperatura di 0°C.

Valori di tensione inferiori a 0.5V indicano una temperatura sotto lo zero, mentre valori di tensione superiori a 0.5V
indicano una temperatura positiva.
Inoltre è importante considerare che “una variazione 1 grado corrisponde ad una variazione di tensione di 10mV”.

Quindi, se sul pin di input analogico sono presenti 550mV significa che il sensore sta rilevando una temperatura di
5°C (550mV – 500mV = 50 mV  variazione di 5°C).

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 29


Progetto con Arduino
Accendere una striscia di 3 led in modo proporzionale alla temperatura rilevata dal sensore.

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 30


CODICE
int celsius = 0;

void setup()
{
pinMode(A0, INPUT);
Serial.begin(9600);

pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
}

void loop()
{
celsius = map(((analogRead(A0) - 20) * 3.04), 0, 1023, -40, 125);
Serial.print(celsius);
Serial.println(" C");

if (celsius < 0) {
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
Serial.println("SOTTO ZERO");
}
if (celsius >= 0 && celsius < 10) {
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
Serial.println("BASSA");
}
if (celsius >= 10 && celsius < 20) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
Serial.println("MEDIA");
}
if (celsius >= 20) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
Serial.println("ALTA");
}
delay(1000);
}

Arduino & Thinkercad v.1.051022 – prof. Delbarba Luca - Pag. 31

Potrebbero piacerti anche