Commit fc72c654 authored by Luca Contessa's avatar Luca Contessa

Merge branch 'master' of gitlab.poul.org:corsi/slides-arduino2017

parents a8659e11 b6191bd3
# Corsi Arduino 2017
## Primi passi con arduino
![POuL logo](lib/img/logo-text-white.svg)
Contessa Luca
`{ ifdevurandom@gmail.com }`
---
# Ui
### Che in maori significa Domandate
#### Almeno secondo google translate
non abbiate paura di fare domande perchè:
1. Nessuno vi sta né valutando né giudicando (siamo stati tutti principianti)
2. Tengo anche il corso l'ultimo giorno per cui se spiego male vi conviene dirmelo, altrimenti rischiate di non capire niente!
---
### Canali utili
- [Il canale youtube del POuL!](https://www.youtube.com/user/POuLpolimi)
- [GreatScott!](https://www.youtube.com/user/greatscottlab)
Una volta create le basi vi consiglio caldamente di dare un'occhiata anche a loro:
- [Andreas Spiess](https://www.youtube.com/channel/UCu7_D0o48KbfhpEohoP7YSQ)
- [AdaFruit industries](https://www.youtube.com/user/adafruit)
- [SparkFun Electronics](https://www.youtube.com/user/sparkfun)
---
### cosa faremo oggi: Accendere e far lampeggiare un led
Oggi realizzeremo il classico programmino per iniziare con arduino
Insomma l'hello world di arduino!
----
## di che strumenti necessitiamo
- Un Arduino (duh)
- Una breadboard
- Un Led (doppio duh)
- Una resistenza
- Cavi da 0.5 mm
- Cavo per collegare arduino al PC
- Il PC (Possibilmente con una distro linux)
- (Opzionale) Fritzing o un software di disegno elettronico
---
## Andiamo ad analizzare i vari componenti
----
## Breadboard
- è una scheda che permette collegamenti elettrici
- Nella parte centrale i fori sono collegati tra loro seguendo il lato corto mentre due linee del positivo e negativo sono collegate seguendo il lato lungo
![Breadboard](lib/img/breadboard)
----
## Led
- Il led è un elemento elettronico che permette di creare luce
- Ha tantissimi altri utilizzi ed è molto molto utile
![Led](lib/img/led)
----
## Resistenza
- Ha molteplici utilizzi tra cui quello fondamentale di limitatore di corrente
- Sono integrate nei pin di uscita di arduino
----
## Cavi
- Comunissimi cavi elettronici per effettuare dei collegamenti
----
## Fritzing (Opzionale)
- Software di disegno per circuiti elettronici
- Estremamente utile se volete realizzare PCB
- Se il circuito è complesso ricordatevi che uno schema vi salva sempre (oltre alla filosofia KISS)
---
## Schema elettrico (Realizzato con il sopra citato fritzing)
// sono pigro lo faccio dopo //
---
## Ricordatevi ovviamente di scaricare l'IDE di Arduino (che useremo per programmare la scheda)
```Bash
sudo apt-get install arduino //Per Ubuntu/Debian
```
- Per gli altri user linux cambiate sintassi per adattarvi al vostro gestore di pacchetti
- [Per tutti gli altri utilizzate il sito ufficiale di arduino](https://www.arduino.cc)
---
# Ora Partiamo dal codice!
### E ricordate di stare attenti/e alle maiuscole quando chiamate le varie funzioni!
#### Ad esempio pinMode e non pinmode
----
## Prima di tutto
Dobbiamo associare un pin dell'arduino al led che gli è fisicamente collegato, ad esempio:
```C
int led = 8;
```
(Se utilizzate il PIN 13 accendete un led che è gia presente sulla board, per cui non vi servono componenti aggiuntivi)
----
## Cosa dobbiamo mettere nel Setup
dobbiamo dire al sistema cosa c'è in uscita e cosa in ingresso attraverso il comando
` pinMode(pin, modalità di lavoro) `
```C
void setup() {
pinMode(led, OUTPUT);
}
```
----
## Ora passiamo al loop!
Dobbiamo essenzialmente dire alla scheda di accendere il led, utlizzando il comando
`digitalWrite(pin, stato)`
```C
void loop() {
digitalWrite(led, HIGH);
}
```
----
## Ora possiamo caricare lo script!
0. Collegare l'arduino (duh)
1. Aprite strumenti
2. Tipo di arduino --> selezionate l'arduino che state utilizzando
3. Porta seriale --> selezionate la porta su cui c'è l'arduino (solitamente ne trovate solo una)
4. Premete Carica (La freccia a fianco della spunta in alto a sinistra nell'IDE)
----
### Funziona? Ottimo! benvenuti nel magico mondo di Arduino!
#### Nel caso non funzionasse potete sempre
```assembly
GOTO start
```
---
## Ora proviamo a farlo lampeggiare!
----
## Introduciamo il delay!
- Il delay essenzialmente dice alla scheda di aspettare un tot di millisecondi, in base alle nostre esigenze
- la sintassi è `delay(numero di millisecondi); `
----
## A cosa ci serve questo delay?
- Essenzialmente ci serve per aspettare un tot di tempo prima di far cambiare stato al led, in maniera che risulti visibile anche all'essere umano
----
Per cui il nostro codice verrà magicamente trasformato in:
```C
void loop() {
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}
```
---
# spørsmål?
### Che significa "domande" in Norvegese
---
# Thank you!
![POuL logo](lib/img/logo-text-white.svg)
![Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](lib/img/creativecommons-by-nc-sa.svg)
# Firmata
---
## Cosa
- Utilizzare Arduino come una periferica
- Scrivendo meno C possibile
- Tenere tutta la logica sul pc host
---
## Come
- Usando il protocollo Firmata
https://github.com/firmata/protocol
---
## Firmata: generalità
- Protocollo di comunicazione su seriale
- Permette di controllare l'hardware da un computer
- Può essere implementato su qualsiasi controllore
- Attualmente è supportato da Arduino e Spark.io
- Mentre lato computer esistono librerie per innumerevoli linguaggi
---
## Firmata: origine
- Basato sul protocollo MIDI
- Viene riconoscito da un interprede MIDI
- Ma i messaggi non sono necessariamente gli stessi
- Supporta seriali più veloci
---
## Firmata: messaggi
- I/O analogico o digitale
- Stato di un pin
- I2C
- Impostazione dell'intervallo di sampling
---
## Utilizzo
- Firmware per interepretare ed eseguire i comandi
- Inviati dal pc usando un qualsiasi linguaggio
---
## Firmware
Ci sono due primcipali modi per utilizzare Firmata:
- Includere `Firmata.h` e chiamare "manualmente" le varie funzioni, per esempio:
```
Firmata.sendAnalog(pin, analogRead(pin))
```
- Caricare lo sketch già pronto `StandardFirmata` e scrivere codice solo lato pc
---
# Preparazione
---
## Arduino
- Dall'Arduino IDE:
```
File -> Examples -> Standardfirmata
```
- `Verify` e `Upload` come un qualsiasi firmware
---
## Python
- Useremo `pyFirmata`:
```
https://github.com/tino/pyFirmata
```
- Per installarlo: `pip install pyfirmata`
---
# Codice
---
## Hello World
Accendere il LED:
```python
from pyfirmata import Arduino
board = Arduino('/dev/ttyUSB0')
board.digital[13].write(1)
```
---
## Make it blink
```python
from pyfirmata import Arduino
from time import sleep
board = Arduino('/dev/ttyACM3')
while True:
board.digital[13].write(1)
sleep(1)
board.digital[13].write(0)
sleep(0)
```
---
## Singoli pin
```python
pin13 = board.get_pin("d:13:o")
pin13.write(1)
```
`get_pin` prende una stringa contenente:
- `"d"` o `"a"` per il tipo di pin
- il numero del pin
- `"i"`, `"o"`, o `"p"` per Input, Output o PWM
- separati da `":"`
---
## Input analogico
```python
it = util.Iterator(board)
it.start()
board.analog[0].enable_reporting()
board.analog[0].read()
```
---
## Controller OSC
```python
from pyfirmata import Arduino, util
import liblo
board = Arduino('/dev/ttyUSB0')
address = liblo.Address("osc.udp://127.0.0.1:1234/")
board.digital[13].write(0)
it = util.Iterator(board)
it.start()
board.analog[0].enable_reporting()
while True:
value = board.analog[0].read()
print(value)
liblo.send(address, "/knob", value)
```
---
## Tank you!
Creative Commons Attribution-ShareAlike 3.0 Unported
# Servo davvero?
![POuL logo](slides/img/logo-text-white.svg)
Emilio Destratis `<emilio.destratis@mail.polimi.it>`
Martedì 13 giugno 2017
----
# Tra il dire ed il fare
...c'è di mezzo "ed il"...
Più un workshop che una lezione
---
# Menu del giorno
- Servomotori
----
# Menu del giorno
- Servomotori
- Bottoni
----
# Menu del giorno
- Servomotori
- Bottoni
- Fotoresistenze
----
# Menu del giorno
- Servomotori
- Bottoni
- Fotoresistenze
- Varie ed eventuali
---
# Servomotori
![Tipico servomotore](slides/img/servo.jpg)
----
# Come usarlo con Arduino?
Un po' di sano analogico sarebbe bello, ma...
----
# PWM
**P** ulse - **W** idth - **M** odulation
![](slides/gif/pwm.gif)
Sulla nostra scheda i pin con funzione PWM sono indicati con una ~
----
# Batterie incluse
Faremo uso della libreria omonima
```C
#include <Servo.h>
```
----
# La classe Servo: metodi
----
# La classe Servo: metodi
- ```attach()``` specifica il pin al quale connettere il servo
----
# La classe Servo: metodi
- ```read()``` legge la posizione angolare del servo, passandone l'ultimo valore scritto
----
# La classe Servo: metodi
- ```write()``` indica al servo l'angolo al quale posizionarsi
----
# La classe Servo: metodi
- ```attached()``` controlla che un oggetto di tipo Servo sia collegato ad un pin
----
# Un'altra funzione utile, anche se non di Servo
- ```map(var_da_studiare, val_input_min, val_input_max, val_out_min, val_out_max)```
Può risultare utile quando abbiamo un intervallo di valori da rimappare su un'angolatura da 0° a 180°, ad esempio.
----
# Come collegare il servo
![](slides/img/collegamento_servo.png)
----
# Testiamo il funzionamento dei servo
con l'esempio *Servo -> Sweep* già presente nell'IDE di Arduino
---
# Bottone
![](slides/img/bottone.png)
- A e C sono sempre connessi, B e D sono sempre connessi
----
# Bottone
![](slides/img/bottone.png)
- A e C sono sempre connessi, B e D sono sempre connessi
- Quando si schiaccia il bottone sono tutti connessi
----
# Resistenze pull-up e pull-down
![](/slides/img/pu_pd.png)
----
# Resistenze pull-up e pull-down
- Servono a dare sempre un valore definito all'uscita collegata al bottone
- Se lo switch è aperto:
+ nella resistenza non passa corrente
+ la differenza di potenziale ai capi della resistenza è 0
+ l'uscita è a 5V
- Se lo switch è chiuso:
+ è in corto con GND
+ l'uscita sarà a 5V
----
# Come collegare il bottone
![](slides/img/collegamento_bottone.jpg)
Il valore della resistenza non è importante
----
# Testiamo il funzionamento del bottone
con l'esempio *Digital -> Button* già presente nell'IDE di Arduino
---
# ...a proposito di resistenze
Per calcolare il valore della resistenza
- fare riferimento alla tabella:
- inserire i colori [qui](http://www.associazionemarconi.com/calcolo/codice_resistenze_elettriche_4.html)
"Melius abundare quam deficere"
----
# Tabella resistenze
![](slides/img/tabella_r.jpg)
---
# Fotoresistore
![](slides/img/fr.jpg)
----
# Fotoresistore
- Componente elettronico la cui resistenza è inversamente proporzionale alla quantità di luce che lo colpisce
----
# Fotoresistore
- Componente elettronico la cui resistenza è inversamente proporzionale alla quantità di luce che lo colpisce
+ Più c'è luce, meno vale la sua resistenza
----
# Fotoresistore
- Componente elettronico la cui resistenza è inversamente proporzionale alla quantità di luce che lo colpisce
+ Più c'è luce, meno vale la sua resistenza
+ In condizioni di buio totale, può comportarsi come un circuito aperto
----
# Fotoresistore
**Attenzione!**
----
# Fotoresistore
Abbiamo detto che la resistenza diminuisce, per cui la tensione rilevata aumenta!
----
# Fotoresistore
Arduino (per mezzo del suo ADC) si occuperà di convertire il valore analogico della tensione ricevuto dal sensore in un valore digitale su 10 bit, quindi da 0 a 1023.
----
# Fotoresistore
Quindi più luce riceverà, più il valore della tensione sarà alta!
----
# Fotoresistore
Teoricamente avremo:
- 1023 -> intensità luminosa massima
- 0 -> buio pesto
----
# Come collegare il fotoresistore
![](slides/img/collegamento_fr.png)
Abbiamo bisogno di una resistenza per realizzare un partitore di
tensione e leggere i valori di tensione dal fotoresistore
----
# Come collegare il fotoresistore
Solitamente si usa una resistenza pari al valore della massima del fotoresistore, tuttavia, non necessariamente
----
# Come collegare il fotoresistore
In base alla resistenza che andremo ad utilizzare, dovremo tarare
il valore massimo e minimo ricevuti dalla lettura *analogica* del
fotoresistore.
----
# Testiamo il funzionamento del fotoresistore
con l'esempio "Basics -> AnalogReadSerial" già presente nell'IDE di Arduino
---
# Mettiamo insieme i pezzi!
Costruiamo ciò che è alla base di:
----
# Mettiamo insieme i pezzi!
Costruiamo ciò che è alla base di:
- Uno scacciavampiri
----
# Mettiamo insieme i pezzi!
Costruiamo ciò che è alla base di:
- Uno scacciavampiri
- Un diffusore di deodorante per ambienti con rilevamento di presenza
----
# Mettiamo insieme i pezzi!
Costruiamo ciò che è alla base di:
- Uno scacciavampiri
- Un diffusore di deodorante per ambienti con rilevamento di luce
- Una mano robotica
----
# Mettiamo insieme i pezzi!
Costruiamo ciò che è alla base di:
- Uno scacciavampiri
- Un diffusore di deodorante per ambienti con rilevamento di luce
- Una mano robotica
- Un *servo*, con i servo, che ci accende e spegne la luce in base alla luce presente nella nostra stanza
----
# Mettiamo insieme i pezzi!
Alla base di tutto ciò c'è sempre, comunque, un semplice interruttore
crepuscolare...realizziamolo!
---
# Vi è piaciuto questo workshop?
Ditemelo con un like o dislike...ora!
----
# Vi è piaciuto questo workshop?
Ditemelo con un like o dislike...ora!
Sostituiamo il fotoresistore con un bottone
---
# Chi ha voglia d'estate?
Realizziamo il fiore dell'estate...artificiale!
----
# Chi ha voglia d'estate?
Realizziamo il fiore dell'estate...artificiale!
Il principio è quello di un inseguitore di luce, realizzato con fotoresistori e servomotori.
----
# Cos'altro possiamo fare?
![](slides/gif/hand.gif)
----
# Cos'altro possiamo fare?
![](slides/gif/cat.gif)
----
# Cos'altro possiamo fare?
![](slides/gif/capcha.gif)
----
# Cos'altro possiamo fare?
![](slides/gif/girl.gif)
----
# Cos'altro possiamo fare?
![](slides/gif/rubik.gif)
----
# Cos'altro possiamo fare?
![](slides/gif/the.gif)
----
# Cos'altro possiamo fare?
![](slides/gif/beer.gif)
---
# Siate creativi!
"La creatività non è altro che un'intelligenza che si diverte"