Setup do Raspberry Pi

Nesta página vamos descrever o processo de configuração do cartão microSD a usar no Raspberry Pi (RPi). Todo esse processo já foi porém executado previamente nas placas que terá ao seu dispor, sendo contudo conveniente realizar a mudança da palavra passe de acesso. Para isso comece por aceder à placa por SSH (tal como foi aqui descrito) com o utilizador pi e a palavra passe a ser facultada na aula, e em seguida proceda à alteração da palavra passe usando o comando:

passwd

Segue-se a expansão do espaço ocupado pelo sistema de ficheiros de forma a aproveitar toda a capacidade do cartão microSD:

sudo raspi-config --expand-rootfs

E por fim, a alteração do hostname no formato rpi-bXX em função da bancada XX:

sudo raspi-config

Após o que se deverá fazer um reboot.


Configuração do cartão microSD

Vamos descrever de seguida o processo de configuração do cartão microSD a usar no Raspberry Pi, procedimento que é constituído pelos seguintes passos:

  • Gravação da imagem no cartão
  • Acesso SSH
  • Primeiras configurações
  • Atualização inicial
  • Autocomplete pelo historial de comandos
  • Instalação da biblioteca para acesso ao GPIO (pigpio)
  • Instalação da biblioteca para uso de mensagens MQTT (paho-mqtt)
  • Mosquitto (MQTT broker)
  • Node-RED

Gravação da imagem no cartão

Descarregar a imagem do Raspbian (por exemplo 2017-03-02-raspbian-jessie-lite.imgdaqui. De notar que se trata duma imagem lite, ou seja apenas com o indispensável à sua utilização.

No caso da gravação da imagem do cartão microSD ser realizada em Windows, podemos recorrer ao programa Win32DiskImager.

Para que se possa efetuar um acesso ao RPi por SSH é preciso criar um ficheiro vazio com o nome ssh.

NOTA: Para evitar todos os passos seguintes é possível utilizar uma imagem criada especificamente para esta unidade curricular. Esta imagem (edm2k16.img) pode ser obtida descompactando o ficheiro edm2k16.zip existente numa pasta partilhada juntamente com muitos outros ficheiros descritos nestas páginas.

Acesso SSH

Após o primeiro arranque da imagem oficial o RPi liga-se à rede por DHCP, pelo que basta descobrir no router o seu IP (o hostname é raspberrypi) e ligar a ele via SSH, por exemplo com o PuTTY. O utilizador (user) é pi a palavra-passe (password) raspberry. Este processo está aqui descrito.

A um eventual aviso “PuTTY Security Alert” deveremos carregar no botão “Sim”.

Nota: Caso use a imagem edm2k16.img o hostname que vem por omissão é o rpi-b00 e a palavra-passe a que foi indicada nas aulas.

Primeiras configurações

Executar o primeiro comando: sudo raspi-config

  • Alterar a Password (1 Change User Password)
  • Alterar o Hostname (2 Hostname), neste caso usaremos o nome rpi-bXX em que o XX é o número da bancada (de 01 a 12)
  • Mudar fuso horário (4 Localicalisations Optons + I2 Change Timezone): Europe + Lisbon
  • Expandir (7 Advanced Options + A1 Expand Filesystem) a área de ficheiros para aproveitar todo o espaço do cartão microSD

Após carregar no botão Finish é conveniente efetuar um reboot com o comando:

sudo reboot

Atualização inicial

Convém realizar uma atualização inicial do sistema, fazendo:

sudo apt-get update
sudo apt-get -y upgrade

Autocomplete pelo historial de comandos

Quando se escreve na linha de comando é muito útil o uso da tecla TAB para auto completar esse comando.

O uso das teclas do cursor UP e DOWN dão-nos também a possibilidade de percorrer o histórico de comandos. Seria igualmente útil poder escrever o início dum comando e depois poder usar essas mesmas teclas para procurar um comando no historial que comece dessa forma. Para isso, e porque o RPi possui uma shell bash, temos que fazer como está aqui sugerido:

Editar o ficheiro .inputrc:

nano ~/.inputrc

Colocando as seguintes linhas:

"\e0A": history-search-backward
"\e[A": history-search-backward
"\e0B": history-search-forward
"\e[B": history-search-forward
"\e0C": forward-char
"\e[C": forward-char
"\e0D": backward-char
"\e[D": backward-char

Não esquecer de fechar o terminal e abrir novamente para que a funcionalidade seja ativada.

Instalação da biblioteca para acesso ao GPIO (pigpio)

Para aceder às funcionalidades do interface GPIO será usada a biblioteca pigpio.

Para instalar o pigpio, fazer:

mkdir Downloads
cd Downloads
wget abyz.co.uk/rpi/pigpio/pigpio.zip
unzip pigpio.zip
cd PIGPIO
make
sudo make install

Para correr o deamon fazer:

sudo pigpiod

Contudo para que este deamon arranque durante o processo de boot, fazer:

cd /etc/init.d
sudo nano pigpiod

Colocando nesse ficheiro (/etc/init.d/pigpiod) o seguinte:

#!/bin/sh
 
### BEGIN INIT INFO
# Provides:          pigpiod
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: PI GPIO service with pwm 
# Description:       PI GPIO service with pwm 
### END INIT INFO
 
# Change the next 4 lines to suit where you install your script and what you want to call it
DIR=/usr/local/bin
DAEMON=$DIR/pigpiod
DAEMON_NAME=pigpiod
DAEMON_LOCK=pigpio
 
# This next line determines what user the script runs as.
# Root generally not recommended but necessary if you are using the Raspberry Pi GPIO from Python.
DAEMON_USER=root
 
# The process ID of the script when it runs is stored here:
PIDFILE=/var/run/$DAEMON_LOCK.pid
 
. /lib/lsb/init-functions
 
do_start () {
    log_daemon_msg "Starting system $DAEMON_NAME daemon"
    start-stop-daemon --start --background --pidfile $PIDFILE --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON
    log_end_msg $?
}
do_stop () {
    log_daemon_msg "Stopping system $DAEMON_NAME daemon"
    start-stop-daemon --stop --pidfile $PIDFILE --retry 10
    log_end_msg $?
}
 
case "$1" in
 
    start|stop)
        do_${1}
        ;;
 
    restart|reload|force-reload)
        do_stop
        do_start
        ;;
 
    status)
        status_of_proc "$DAEMON_NAME" "$DAEMON" && exit 0 || exit $?
        ;;
    *)
        echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|restart|status}"
        exit 1
        ;;
 
esac
exit 0

Depois fazer:

sudo chmod 755 pigpiod
sudo update-rc.d pigpiod defaults 99

Para arrancar de imediato:

sudo service pigpiod start

O pigpiod ocupa cerca de 8% do CPU como se pode ver com o comando:

top

Instalação da biblioteca para uso de mensagens MQTT (paho-mqtt)

Executar os comandos:

sudo apt-get install python-setuptools
sudo easy_install pip
sudo pip install paho-mqtt

Ativação do barramentos SPI e I2C

Para se poder usar os barramentos SPI e I2C é preciso ativá-los no raspi-config:

sudo raspi-config

Nas opções de Interface (5 Interfacing Options, ativar o SPI (P4 SPI), e o I2C (P5 I2C), após o que já é possível aceder aos dispositivos, como se pode constatar pelo comando:

ls /dev/spi*; ls /dev/i2c*

Cuja resposta é:

/dev/spidev0.0  /dev/spidev0.1
/dev/i2c-1

Mosquitto

Para instalar o broker MQTT chamado Mosquitto, executar os seguintes comandos:

sudo apt-get update
sudo apt-get upgrade
 
sudo wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
sudo rm mosquitto-repo.gpg.key
 
cd /etc/apt/sources.list.d/
sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list
 
sudo apt-get update
sudo apt-get install mosquitto mosquitto-clients

Node.js

A instalação do Node RED faz-se com a ferramenta npm que por sua vez é instalada com o node.js. A versão Raspian Lite não traz o node.js, pelo que para instalar a versão 4.8.1, fazer:

mkdir Downloads
cd Downloads
wget https://nodejs.org/dist/v4.8.1/node-v4.8.1-linux-armv6l.tar.gz
tar -xvf node-v4.8.1-linux-armv6l.tar.gz
cd node-v4.8.1-linux-armv6l
sudo cp -R * /usr/local/
cd ..
rm -r node-v4.8.1-linux-armv6l

node -v
v4.8.1
npm -v
2.15.11

Node RED

Como a versão Raspian Lite não traz qualquer node-red, é preciso instalá-lo de raiz. Uma vez instalado o node.js, a instalação do node-red faz-se executando o seguinte comando:

sudo npm install -g --unsafe-perm node-red

A versão que ficou instalada foi a 0.16.2!

Para que o node-red arranque com o Raspberry Pi, fazer isto:

sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/nodered.service -O /lib/systemd/system/nodered.service
sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-start -O /usr/bin/node-red-start
sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-stop -O /usr/bin/node-red-stop
sudo chmod +x /usr/bin/node-red-st*
sudo systemctl daemon-reload

sudo systemctl enable nodered.service

O acesso é feito no link: http://10.0.0.1XX:1880 (mudando para o IP adequado).

Dashboard

Para construir interfaces gráficos vou instalar o node-red-dashboard. Para isso fazer:

cd ~/.node-red
npm install node-red-dashboard

Não esquecer de rearrancar o Node-RED:

node-red-stop
node-red-start

Isto faz surgir um novo conjunto de nodes: dashboard

O interface pode ser acedido no link: http://10.0.0.1XX:1880/ui

Segurança

Para que o acesso seja condicionado, seguir as instruções aqui descritas.

Editar o ficheiro /home/pi/.node-red/settings.js descomentando/editando certas linhas:

    adminAuth: {
       type: "credentials",
       users: [{
           username: "admin",
           password: "$2a$08$DQGYwBOFfgqM2ByZFIyoouOGKoyrks/Yv/t2xfbZ28jqU/UGDWtJy",
           permissions: "*"
       }]
    },

O anterior código ativa a autenticação do editor. Para ativar a autenticação também no acesso às páginas descomentar/editar as linhas:

    //httpStaticAuth: {user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN."},
    httpNodeAuth: {user:"admin",pass:"$2a$08$DQGYwBOFfgqM2ByZFIyoouOGKoyrks/Yv/t2xfbZ28jqU/UGDWtJy"},

Para obter a hash da password, começar por instalar as ferramentas do node-red:

sudo npm install -g node-red-admin

E depois executar o comando:

node-red-admin hash-pw

Que pede a password dando depois a respetiva hash.