Esercitazioni Arduino Sensori
Esercitazioni Arduino Sensori
Esercitazioni Arduino Sensori
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
Schema in Thinkercad
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);
}
}
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)
I vantaggi principali dei relè a stato solido hanno direttamente a che fare con le caratteristiche di produzione.
Singole parti
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).
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.
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
}
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.
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);
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
Serial.begin(9600);
}
void loop() {
delay(100);
}
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
Serial.begin(9600);
}
void loop() {
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);
}
Hobby Industriale
Vista interna
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)
}
}
1. Modificare il circuito affinché il servomotore abbia una alimentazione dedicata con transistor NPN.
3. Modificare il codice per gestire il servomotori tramite comandi inviati dal monitor seriale
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.
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);
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)
Misure di resistenza
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);
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.
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).
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);
}