sabato 15 novembre 2014

RaspberryPi #1: setup completo per sperimentazioni

In questo articolo vado a riassumere tutti i passaggi necessari per utilizzare il RaspberryPi nei nostri progetti o esperimenti di elettronica.
Per chi non sapesse che cosa sia il RaspberryPi consiglio di iniziare a documentarsi sul sito ufficiale

I passi che andiamo ad eseguire sono riassumibili nei seguenti punti:
  1. Installazione del sistema operativo
  2. Configurazione del sistema operativo
  3. Installazione delle componenti aggiuntive utili allo scopo

Il materiale necessario è:
  1. RaspberryPi (nel mio caso il modello B rev 2)
  2. SD card dedicata da almeno 8 GB
  3. SD card reader
  4. WI-FI dongle usb (compatibile con il RaspberryPi)
  5. Monitor/TV (solo per i primi passaggi)

Installazione del sistema operativo

Per prima cosa scarichiamo l'immagine della distribuzione 'Raspbian Debian Wheezy' disponibile qui.
Nel mio caso ho scaricato l'ultima versione disponibile al momento della scrittura di questo post cioè quella con release date 2014-09-09.

Di seguito scarichiamo e installiamo sul PC il software gratuito Win32DiskImager.

Colleghiamo il card reader al PC e inseriamo la scheda SD: attenzione tutti i dati presenti sulla SD verranno eliminati in modo definitivo!
Scompattiamo l'immagine Raspbian e tramite il programma Win32DiskImager salviamola sulla SD.
Al termine chiudiamo il programma e smontiamo, in modo pulito, la SD da Windows prima di rimuoverla dal card reader.

Inseriamo la SD nel RaspberryPi ancora spento, colleghiamolo ad un monitor o alla TV, colleghiamoci una tastiera usb e accendiamolo.

Dopo alcuni istanti comparirà il menu del tool di configurazione 'raspi-config'.


Configurazione del sistema :: raspi-config

Il raspi-config è accessibile in qualsiasi momento lanciando il comando 'sudo raspi-config'.

Con il tasto TAB si può passare dalla lista a i pseudo-tasti (Select, Cancel, ecc.) in modo ciclico.
Con il tasto invio si entra direttamente nella voce di menu selezionata.

Procediamo quindi a:
  • espandere il file system in modo da sfruttare tutto lo spazio possibile della SD card
    • selezionare la voce 'Expand File System' e seguire le istruzioni a video
  • cambiare (se vogliamo) la password dell'utente 'pi' che di default è 'raspberry'
    • selezionare la voce 'Change User Password' e seguire le istruzioni a video
  • impostare il time-zone
    • selezionare la voce 'Internationalization Options'
    • selezionare poi 'Change Time Zone' e seguire le istruzioni a video
  • impostare il layout della tastiera connessa
    • selezionare la voce 'Internationalization Options'
    • selezionare poi 'Change Keyboard Layout' e seguire le istruzioni a video (il layout si imposta dopo aver confermato il modello di tastiera)
  • abilitare il servizio SSH per il controllo remoto (via putty.exe)
    • selezionare la voce 'Advanced Options'
    • selezionare poi 'SSH'  e seguire le istruzioni a video
  • abilitare il supporto SPI
    • selezionare la voce 'Advanced Options'
    • selezionare la voce 'SPI'
  • abilitare il supporto I2C
    • selezionare la voce 'Advanced Options'
    • selezionare la voce 'I2C'
Torniamo al menu principale e usciamo selezionando Finish.
Acconsentiamo al reboot del sistema se ce lo chiede...


Configurazione del sistema :: aggiornamento

Installiamo gli ultimi pacchetti aggiornati disponibili post rilascio della distribuzione:
  • eseguire il comando 'sudo apt-get update'
  • al termine eseguire il comando 'sudo apt-get upgrade' (confermare con Y e invio)
  • attendere che termini l'esecuzione dell'upgrade

Configurazione del sistema :: ip statico

Dato che vogliamo accedere al RaspberryPi comodamente dal nostro PC (tramite putty) e preferibile assegnargli un ip di rete statico (per default è attiva la configurazione in dhcp):

  • eseguire il comando 'sudo nano /etc/network/interfaces'
  • cambiare la riga 'iface eth0 inet dhcp' in 'iface eth0 inet static'
  • subito sotto alla riga cambiata aggiungere le seguenti linee (i valori sono solo di esempio):
    • address 192.168.1.10 
    • netmask 255.255.255.0
    • gateway 192.168.1.1
  • uscire salvando le modifiche al file ('CTRL+X' poi 'Y' poi invio)
  • eseguire il comando 'sudo reboot'
  • dopo il riavvio eseguire il comando 'ifconfig' verificando che l'ip della eth0 sia quello impostato
  • avviare putty.exe sul PC e verificare che non ci siano problemi a connettersi via SSH alla porta 22

Installazione componenti :: configuratore rete wi-fi

Un adattatore usb per la connessione WI-FI è sicuramente l'ideale per accedere da remoto al RaspberryPi senza lo scomodo cavo di rete:
  • eseguire il comando 'sudo apt-get install wicd-curses'
  • avviare con 'sudo wicd-curses'
  • configurare la rete WI-FI selezionandola dalla lista (e premento il tasto freccia destra)
    • settare ip statico, netmask e gateway
    • settare il DNS#1 a 8.8.8.8 e DNS#2 a 8.8.4.4 (o altro a piacere)
    • settare il DHCP Hostname a 'raspberrypi' (o altro a piacere)
    • settare 'Automatically connect... network'
    • settare 'Use Encryption' e impostare la password WPA della rete WI-FI
    • confermare con F10
  • selezionare la rete WI-FI e premere C (Connect) per verificare che si connetta
  • se tutto ok uscire premento Q
  • staccare il cavo di rete
  • avviare putty.exe sul PC e verificare che non ci siano problemi a connettersi via SSH alla porta 22
Da questo momento il RaspberryPi utilizzerà la rete WI-FI configurata in assenza di una connessione via cavo in automatico.
A questo punto possiamo liberare il Raspberry da tutte le connessioni a monitor/TV, tastiera e cavo di rete... e proseguire con i prossimi passi via putty dal PC.

Installazione componenti :: server ftp

Avere un server ftp a bordo del RaspberryPi ci permette di trasferirci dei file senza doverli copiare sulla SD.
Da PC posso connettermi utilizzando uno dei diversi client ftp gratuiti disponibili in rete.
Io, fra tutti, preferisco il FileZilla ftp client.

  • colleghiamoci via putty al RaspberryPi
  • eseguire il comando 'sudo apt-get install vsftpd' e completare l'installazione
  • eseguire il comando 'sudo nano /etc/vsftpd.conf'
    • decommentare e impostare 'anonymous_enable=NO'
    • decommentare e impostare 'local_enable=YES'
    • decommentare e impostare 'write_enable=YES'
    • aggiungere in fondo 'force_dot_files=YES'
  • salvare il file modificato ('CTRL+X' poi 'Y' poi invio)
  • eseguire il comando 'sudo service vsftpd restart'
A questo punto siamo in grado di connetterci, al RapsberryPi tramite il nostro client ftp, alla porta di default (21) e vedere la lista dei file presenti nella cartella dell'utente 'pi'.

Connessi con successo al server ftp del RaspberryPi

Installazione componenti :: i tool per i2c

Il RaspberryPI può anche essere un utile strumento di debug delle nostre applicazioni i2c grazie a questi tool: qui trovate la documentazione completa per l'utilizzo.

  • eseguire il comando 'sudo apt-get install i2c-tools'
  • eseguire il comando 'sudo nano /etc/modprobe.d/raspi-blacklist.conf'
    • commentare linea 'blacklist i2c-bcm2708'
    • salvare il file modificato
  • eseguire il comando 'sudo nano /etc/modules'
    • aggiungere la linea 'i2c-dev'
    • aggiungere la linea 'i2c-bcm2708'
    • salvare il file modificato
  • eseguire il comando 'sudo reboot'
Non appena il RaspberryPi ha terminato il riavvio ci possiamo riconnettere per provare a lanciare il comando 'sudo i2cdetect -y 1' che dovrebbe presentarci la mappa dei dispositivi connessi al bus i2c con successo.

Nessun dispositivo connesso al bus i2c al momento

Installazione componenti :: java (jdk8 + pi4j)

Per chi come me intende sviluppare applicazioni in java per i RaspberryPi provare a lanciare in comando 'java -version'.
Se il comando non è riconosciuto eseguire 'sudo apt-get install oracle-java8-jdk'.

Procedere quindi all'installazione di pi4j: 
  • eseguire il comando 'curl -s get.pi4j.com | sudo bash'
  • eseguire il comando 'cd /opt/pi4j/examples'
  • eseguire il comando 'javac -classpath .:classes:/opt/pi4j/lib/'*' -d . ControlGpioExample.java'
A questo punto verificare che venga eseguito con successo la classe di esempio ControlGpioExample lanciando il comando: sudo java -classpath .:classes:/opt/pi4j/lib/'*' ControlGpioExample



Il nostro RaspberryPi è adesso pronto per i futuri post della serie...


Stay tuned!
ap

NB: l'autore non risponde di eventuali danni causati da omissioni, inesattezze o errori eventualmente presenti nell'articolo pubblicato.
Prego, segnalare suggerimenti e migliorie commentando questo post o inviando una email a padnest@gmail.com.

sabato 8 novembre 2014

Studio PIC 18F (18F4431) #7 :: "Comunicare con il PIC via seriale (RS-232)"


Vai al precedente POST della serie

Possiamo scambiare informazioni (dati) con un PIC? Certo che si!
I PIC 18F, in particolare, mettono a disposizione diverse soluzioni hardware per la comunicazione: UART-USART, I2C, SPI, e perfino USB (18F2550 e affini).
La scelta del protocollo dipende in primis dal tipo di dispositivo che deve interfacciarsi con il nostro PIC: un altro micro-controllore, un modulo GPS, un dispositivo MIDI, un PC, il Raspberry PI, il Lego Mindstorm, ecc... ecc...

Direi di procedere in ordine di complessità crescente e quindi di affrontare per prima, in questo articolo, la comunicazione seriale asincrona o UART.
Tale interfaccia:
  1. è di tipo asincrono (bit start/bit stop)
  2. permette colloquio FULL-DUPLEX tramite due linee distinte: una per l'invio (TX) e l'altra per la ricezione (RX)
  3. permette il colloquio tra due soli dispositivi: un master e uno slave (detto TERMINAL).
  4. la velocità di invio dei bit è detta BAUD-RATE e può essere scelta in un range da 300 a 115200 bit al secondo.

Tramite la UART possiamo interagire ad esempio con un PC (se dispone ancora dell'interfaccia RS-232) o con il RaspberryPI.
I fili necessari vanno da un minimo di 3 a un massimo di 5 a seconda che implementiamo o meno i l controllo hardware di flusso: GND, TX, RX di base, CTS, RTS per il controllo di flusso hardware.

Dato che voglio controllare il PIC dal PC avrò bisogno di un dispositivo intermedio per adeguare il livello dei segnali TTL del PIC con quello richiesto dalla RS-232 del PC: ad esempio un Max232 o un Max233

A tale scopo ho realizzato questo semplice modulo:



Ecco il suo schema elettrico:


La linea RX del modulo sarà connessa al pin TX del PIC, mentre la linea TX del modulo al pin RX del PIC: in questo modo i bit trasmessi dal PIC saranno ricevuti dal PC e viceversa.

Implementazione UART del PIC

Il modulo hardware per la gestione UART (o USART) è chiamato EUSART e permette di implementare sia l'interfacciamento asincrono che sincrono, l'autodetect del BAUD-RATE, l'auto wakeup in ricezione dati, ecc...: insomma è un modulo veramente flessibile e potente.

Per i nostri scopi dobbiamo concentrarci sulle specifiche relative alla sola modalità asincrona a 8 bit dati in full-duplex (non trattando al momento il wakeup e l'auto baud rate); i registri da utilizzare sono:

RegistroDescrizioneBit utilizzati
TXSTAConfigurazione e status del modulo TXTX9=0, TXEN=1, SYNC=0, SENDB=0, BRGH=X,
RCSTAConfigurazione e status del modulo RX, attivazione modulo serialeSPEN=1, RX9=0, CREN=1,
BAUDCTLConfigurazione e status del baud rate e del wakeupBRG16=X, WUE=0, ABDEN=0
SPBRGH:SPBRGConfigurazione generatore del baud ratetutti
TXREGScrittura byte da inviaretutti
RCREGLettura byte ricevutotutti
(X=vedere paragrafo sulla configurazione del baud rate)

Per attivare e gestire gli interrupt associati al modulo i registri sono:

RegistroBit utilizzati
INTCONGIE/GIEH, PEIE/GIEL
PIE1TXIE, RCIE
IPR1TXIP, RCIP
PIR1TXIF, RCIF

Configurazione del baud rate

La scelta della velocità di trasmissione/ricezione dei singoli bit può essere libera o vincolata dal dispositivo con il quale ci dobbiamo collegare.
Una volta determinato il BAUD rate dobbiamo far riferimento alle tabelle sul datasheet del PIC per capire quale è la configurazione ideale dei bit BRG16 e BRGH in relazione alla FOSC e all'errore riportato.
Ad esempio: volendo un BAUD rate di 9600 con un FOSC di 8 MHZ riscontro sempre un errore dello 0,16% a prescindere dalla configurazione a 16 o a 8 bit e alla modalità High/Low speed.
Pertanto imposterò BRG16=0 e BRGH=0 calcolando il valore di SPBRG con la formula:

SPBRG = ((FOSC/BAUD)/64) - 1

Quindi: SPBRG = ((8000000/9600)/64) -1 = 12,02083 (arrotondato a 12).
Visto che il valore è inferiore a 256 posso impostare il solo registro SPBRG.


Trasmissione

La trasmissione di uno o più byte avviene tramite la loro scrittura sequenziale del registro TXREG avendo ovviamente l'accortezza di attendere che il byte precedente sia stato preso in carico dal modulo EUSART prima di scrivere quello successivo.
Per fare ciò possiamo utilizzare gli interrupt oppure leggere lo stato del bit TXIF del registo PIR1 tenendo presente che TXIF :

  1. viene settato a 1 quando il TXREG può essere scritto (e quindi non appena abilitiamo la trasmissione settando il bit TXEN del registro TXSTA
  2. non può essere resettato via software: vuol dire che viene settato a 0 direttamente, dopo la scrittura del registro TXREG, dal modulo stesso quando il valore è stato trasferito in un altro registro interno per lo shift dei singoli bit e la  loro trasmissione .
  3. può essere testato solo dopo aver atteso almeno un ulteriore ciclo di clock (nop) dalla scrittura di TXREG


Ricezione 

Quando il modulo ESUART ha ricevuto un byte (gestendo internamente tutta la logica di ricezione) ne trasferisce il valore dal registro interno al registro RCREG settando l'interrupt flag RCIF a 1.
A questo punto, prima che arrivi un altro byte dalla seriale, dobbiamo leggere il registro RCREG in modo da evitare un OVERRUN (bit OERR settato nel registro RCSTA).


Mano al codice

Unendo due precedenti post (il #5 e il #6) realizziamo quindi un PWM controller che sia però comandabile da remoto via RS-232 in modo da poter variare il colore prodotto da un led RGB semplicemente inviando il valore dei singoli colori.
Inoltre aggiungiamo un display LCD dove indicare lo stato dei valori correnti.

Il progetto è scaricabile qui.


Circuito elettrico



Realizzazione pratica




Utilizzo

Nel mio caso, non disponendo della presa seriale sul PC, ho acquistato una comoda interfaccia USB-RS232.
Per inviare i comandi al Pic in esadecimale in modo facile e intuitivo consiglio l'ottimo software gratuito 'Ultra serial port monitor'.
Le immagini che seguono sono invece tratte da un altro programma non gratuito che ho potuto provare prima che scadesse il periodo di valutazione.


1: invio i tre byte alla prima linea: 00 FF 00 (colore verde)
2: vengono ricevuti dal Pic aggiornando il display lcd e lo stato del led rgb

3: invio ora i tre byte alla seconda linea per produrre il colore giallo
4: ricevuti e processati

5: infine invio l'ultima sequenza per ottenere il colore rosso
6: ricevuti e processati anche questi



Stay tuned!
ap

Vai al successivo POST della serie

NB: l'autore non risponde di eventuali danni causati da omissioni, inesattezze o errori eventualmente presenti nell'articolo pubblicato.
Prego, segnalare suggerimenti e migliorie commentando questo post o inviando una email a padnest@gmail.com.