arduino - calcolatori.iet.unipi.itcalcolatori.iet.unipi.it/seminari/2012-03-05/arduino.pdf · 3...

54
ARDUINO Ing. Francesco Giurlanda [email protected]

Upload: ngohanh

Post on 16-Sep-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

ARDUINO

Ing. Francesco [email protected]

2

Cos'è ARDUINO?

Il progetto nasce ad Ivrea, nel 2005.

Obiettivo: realizzare un sistema di prototipizzazione economico.

Al Maggio del 2011 più di 300.000 unità vendute

Fondatori: Massimo Banzi e David Cuartielles

3

ARDUINO 1/3

Una piattaforma hardware Open Source di basso costo e grande versatilità

Ideale per interagire con l'ambiente attraverso sensori ed attuatori

4

ARDUINO 2/3

Una ambiente software per la programmazione del dispositivo, funzionante su tutti i sistemi operativi (Mac, Linux e Windows).

5

ARDUINO 3/3

Una vasta comunità di sviluppo

www.arduino.cc

6

ARDUINO UNO

7

ARDUINO Mega 2560

8

ARDUINO BT

9

ARDUINO Nano

10

ARDUINO Mini

11

ARDUINO LilyPad

12

DIY

13

Caratteristiche tecniche

● Microcontroller ATmega168, ATmega328 o ATmega2560

● Operating Voltage 5V

● Input Voltage (recommended) 7-12V

● Input Voltage (limits) 6-20V

● Digital I/O Pins 14 (of which 6 provide PWM output)

● Analog Input Pins 6

● DC Current per I/O Pin 40 mA

● DC Current for 3.3V Pin 50 mA

● Flash Memory 32 KB (ATmega328) of which 0.5 KB used by bootloader

● SRAM 2 KB (ATmega328)

● EEPROM 1 KB (ATmega328)

● Clock Speed 16 MHz

14

Elementi sulla scheda

15

Moduli d'espansione (SHIELD)

16

Arduino Software

● L'ambiente prende spunto dall'editor GUI di Processing(www.processing.org)

● Sketch: programma scritto per girare su Arduino.

● Disponibile perMac, Win e Linux

17

Collegamento e Arduino board

18

GUI

19

Test

● Carico uno sketch di esempio

● Compilalo (verifica da errori)

● Caricare il programmasu Arduino

● Esecuzione sketch

20

Status messages

● Upload corretto

● Errore sulla selezionedella porta USB

● Errore sulla selezione della piattaforma

Dipende dalla complessità dello sketch

21

Ciclo di sviluppo

22

Linguaggio di programmazione

● Linguaggio simile al C

#include …#define …

// vars declaration//...

void setup(){

}

void loop(){

}

23

Tipi di dato

● Tipi base: 1 byte: boolean, [unisigned] char, byte

2 byte: [unsigned] int, word

4 byte: [unsigned] long, float, double

● Tipi derivati: Array: char message[6]; int vals[] = {2, 3, 4};

Classi

24

Funzioni più utilizzate

● pinMode(): configura un pin come INPUT o OUTPUT

● digitalRead(): legge lo stato di un pin HIGH/LOW

● digitalWrite(): imposta lo stato di un pin HIGH/LOW

● analogRead(): legge da un pin analogico

● analogWrite(): imposta un valore ”analogico”

● delay(): attende un intervallo di tempo

● millis(): ritorna il valore corrente del timer

25

INPUT/OUTPUT digitali

● 13 pin INPUT/OUTPUT digitali

● Erogano una corrente max di 40mA

● Anche i 6 pin analogici possono essere utilizzati come pin digitali

26

Bread Board

Connessioni

27

Es. 1 – LED lampeggiante

28

Es. 1 – LED lampeggiante

int ledPin = 12; // LED connected to digital pin 13

void setup() {

pinMode(ledPin, OUTPUT); //pin 12 in modalità OUTPUT

}

void loop()

{

digitalWrite(ledPin, HIGH); // LED on

delay(1000); // attesa di un secondo

digitalWrite(ledPin, LOW); // LED off

delay(1000); // attesa di un secondo

}

29

Es. 2 – LED on/off con pulsante

pulldown

ArduinoPin 11

30

Es. 2 – LED on/off con pulsanteint ledPin = 12; // LEDint switchPin = 11; // SWITCH int ledState = LOW; // Stato del LED on/off

void setup() { pinMode(ledPin, OUTPUT); //pin 12 in modalità OUTPUT pinMode(switchPin, INPUT); //pin 11 in modalità INPUTdigitalWrite(ledPin, LOW);

}

void loop() {

if(digitalRead(switchPin)){

ledState = !ledState;digitalWrite(ledPin, ledState);

delay(500);}

}

31

Interrupts

● 2 pin su Arduino UNO (2, 3)● 6 pin su Arduino Mega (2, 3, 18, 19, 20, 21)● Funzioni:

attachInterrupt(interrupt, func, mode)

detachInterrupt(interrupt)

● Sezioni critiche:noInterrupts()

interrupts()

● Mode: LOW, CHANGE, RISING, FALLING

32

Es. 3 - LED on/off con pulsanteint ledPin = 12; // LEDint ledState = LOW; // Stato del LED on/off

void setup() { pinMode(ledPin, OUTPUT); //pin 12 in modalità OUTPUT attachInterrupt(0, change_state, RISING);

}

void loop() {

digitalWrite(ledPin, ledState);noInterrupts();//sezione criticainterrupts();

}

void change_state(){ledState = !ledState;

}

33

INPUT/OUTPUT analogico

● INPUT Atmega contiene un convertitore analogico-digitale

(A/D) a 6 canali Risoluzione 10bit (analogRead(...) 1024 valori)

● OUTPUT Pulse-Width Modulation (PWM) analogWrite(...) valori tra 0 e 255

Frequenza 490Hz

34

PWM

35

Es. 4 – Dissolvenza LED

36

Es. 4 – Dissolvenza LEDint ledPin = 11; // LED

void setup() { }

void loop() {

for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {

analogWrite(ledPin, fadeValue); delay(30);

} for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {

analogWrite(ledPin, fadeValue); delay(30);

} }

37

Es. 5 – Interruttore luminoso

ArduinoPin A0

pulldown

38

Es. 5 – Interruttore luminoso

int ledPin = 12; // LEDint sensorPin = 0; // Fotoresistenzaint val = 512; // Sogli accensione LED

void setup() {pinMode(ledPin, OUTPUT);

}

void loop() {

if(analogRead(sensorPin) > val){digitalWrite(ledPin, HIGH);

}else {digitalWrite(ledPin, LOW);

}}

39

Sensori resistivi

40

Comunicazione Seriale EIA RS-232

● Arduino può utilizzare la connessione USB per comunicare con il PC (lib. Serial) Serial.begin(): prepara all'utilizzo di Serial

Serial.print(): invio di dati

Serial.read(): ricezione dati

● Comunicare con altri dispositivi(sensori/attuatori che comunicano attraverso protocollo EIA RS-232 )

41

Comunicazione Seriale EIA RS-232

Arduino non è una vera periferica USB

42

Es. 6 – Lettura di intensità luminosa

pulldwon

Arduino Pin A0

USBPC

43

Es. 6 – Lettura di intensità luminosa

int photocellPin = 0;

int photocellReading;

void setup() {

Serial.begin(9600);

}

void loop() {

photocellReading = analogRead(photocellPin);

Serial.print("Analog reading = ");

Serial.println(photocellReading);

delay(100);

}

44

Es. 6 – Lettura di intensità luminosa

Serial Monitor

Analog reading = 940Analog reading = 938Analog reading = 932Analog reading = 882Analog reading = 882Analog reading = 878Analog reading = 840Analog reading = 623Analog reading = 502Analog reading = 421Analog reading = 409Analog reading = 412Analog reading = 412Analog reading = 415

45

Es. 7 – Controllo luci da PC

PCUSB

46

Es. 7 – Controllo luci da PCint val;

void setup() {

Serial.begin(9600);

for(int i = 2; i < = 11; i++)

pinMode(i, OUTPUT);

}

void loop() {

val = Serial.read();

if(val >= '0' && val <= '9'){

val = val – '0' + 2; // Conversione da codifica ASCII a num. Pin

ledsoff();

digitalWrite(val, HIGH);

}

}

void ledsoff() {

for(int i = 2; i < = 11; i++)

digitalWrite(i, LOW);

}

47

Comunicazione Seriale I2C

● Inter Integrated Circuit (I2C): un sistema di comunicazione seriale bifilare utilizzato tra circuiti integrati

● Un master, uno o più slave● Fino a 127 dispositivi, max data rate 1Mbps● Molti dispositivi integrano I2C

48

I2C & ARDUINO

● Funzione integrata nel chipATmegaXXX

● Lib. Wire● Pin A4 → SDA● Pin A5 → SCK

49

Dispositivi I2C

Touch sensor EEPROM

Trasmettitori RF

LCD display

Bussola

Sensore di Temperatura & Umidità

Molti altri.(giroscopio, accelerometro,

Motori...)

50

Es. 8 – Com. I2C tra due Arduino

I2C Master I2C Slave

51

Es. 8 – Com. I2C tra due Arduino//I2C MASTER

#include <Wire>

int ledPin = 13;

void setup()

{

pinMode(ledPin, OUTPUT);

Wire.begin(); // join i2c bus (address optional for master)

}

void loop()

{

digitalWrite(ledPin, HIGH);

Wire.beginTransmission(4); // trsmette al device #4

Wire.send(HIGH); // invia un byte

Wire.endTransmission(); // fine trasmissione

delay(1000);

digitalWrite(ledPin, LOW);

Wire.beginTransmission(4); // trsmette al device #4

Wire.send(LOW); // invia un byte

Wire.endTransmission(); // fine trasmissione

delay(1000);

}

52

Es. 8 – Com. I2C tra due Arduino//I2C SLAVE

#include <Wire>

int ledPin = 13;

void setup()

{

pinMode(ledPin, OUTPUT);

Wire.begin(4); // join i2c bus with address #4

Wire.onReceive(receiveEvent); // register event

}

void loop()

{

delay(100);

}

// funzione eseguita quando si ricevono dati dal master

// questa funzione è registrata come evento

void receiveEvent(int howMany)

{

digitalWrite(ledPin, Wire.receive());

}

53

Librerie

● EEPROM● Ethernet● Firmata (comunicazioni seriali con applicazioni sul PC)● LiquidCrystal (visualizzazione su LCD)● SD● Servo, Stepper (controllo di motori) ● SoftwareSerial● Wire (TWI/I2C)● ...

54