Raspberry Pi a simular um disco USB externo para uma moldura eletrónica de fotos

E se de repente decidirem usar o vosso Raspberry Pi (RPi) para simular um disco externo USB para utilizar na vossa moldura de fotos eletrónica? Isso é excesso de engenharia!

Aqui vamos jogar com 2 coisas diferentes e tentar juntar tudo numa só:

  • Moldura que mostra fotos que estejam num disco externo USB.
  • Um disco a que se pode ligar remotamente para colocar fotos.

A minha tese era que seria possível reutilizar uma moldura eletrónica já antiga, como a minha Rollei DF-80 memories, mas que não serve e recebe ficheiros ao mesmo tempo. Esta moldura eletrónica lê as fotos que coloco num disco externo USB, mas para isso tenho de ligar o disco fisicamente a um computador para onde previamente já tive de passar as fotos, copiar as fotos para o disco, retirar o disco do computador, colocar o disco na moldura… estão a perceber a coisa, não estão?

Hoje em dia já há até tem um produto à venda que faz isto com a ajuda de uma app, tudo muito cómodo e por cerca de 200€, mas eu já tinha a moldura e dois RPi ali à espera de um projeto. O que se pretende é passar a receber as fotos de qualquer equipamento sem tirar o disco da moldura, e depois ver as fotos na moldura eletrónica, tudo comodamente e sem sair do seu lugar.

Para atingir o objetivo, decidi usar o Raspberry Pi Zero W e:

  1. Instalar o Raspberry Pi OS Lite
  2. Instalar o Samba
  3. Configurar o Raspberry Pi como gadget de armazenamento em massa (g_mass_storage)

No final, também ainda insultei o RPi e tudo à sua volta umas quantas vezes, e tive de desejar com muita, mesmo muita força, que o sistema da moldura reconhecesse o disco que lhe disponibilizei.

Se estiverem interessados em repetir esta receita, basta seguir as instruções que escrevi nas parte 1, 2 e 3 deste artigo. No final, há uma parte Bonus que explica como colocar as fotos na moldura a partir da app do Home-assistant.

Parte 1 – Instalar o Raspbian OS Lite

Escolhi a distribuição Debian do Raspberry Pi por facilidade de utilização. Podem ir até ao site da distribuição Raspberry PI OS (Raspian OS) e seguir as instruções. Vão precisar de uma forma de escrever para o disco SSD que vão usar. Facilita utilizarem a aplicação que o Raspbian OS já oferece para o vosso sistema operativo.

  1. Selecionem a versão de sistema operativo.
  2. Selecionem o disco onde querem escrever o novo sistema operativo. Aconselho utilizar logo a opção de configurar a ligação WiFi e outras disponíveis nesta aplicação.
  3. Selecionem escrever (Write).

A aplicação faz a verificação do disco e quando terminar, é só colocarem o disco no Raspberry Pi e esperar uns momentos.

O vosso utilizador e password podem ser logo configurados se utilizarem a aplicação do Raspberry Pi OS, o que vos vai poupar algum trabalho na parte seguinte desta tarefa.

O novo sistema operativo deve ficar disponível via SSH (Secure Shell) na vossa rede WiFi através do nome que derem ao Raspberry Pi na configuração. Vai ser por aqui que vamos continuar.

Parte 2 – Instalar o Samba

Podem aceder ao vosso Raspberry Pi remotamente a partir da linha de comandos ligando-se ao nome que deram na configuração ou através do IP com que ficar na vossa rede.

ssh pi@raspberrypi.local

Uma vez remotamente a controlar o vosso Raspberry Pi, podem começar a executar o conjunto de comandos necessários ao nosso objetivo.

Primeiro, devem atualizar e limpar a instalação.

sudo apt update && sudo apt upgrade --show-upgraded
sudo apt clean
sudo apt autoremove -y

Podem verificar se há algum pacote que esteja instalado, para o remover por vossa conta e risco, listando todos os pacotes com sudo dpkg -l.

Como não dava para instalar uma solução NAS, como explico na ultima secção deste artigo, e já tenho o Home-Assistant, decidi-me por instalar o servidor de ficheiros Samba, que é compatível depois com vários sabores de computador e pode já hoje em dia ser montado remotamente no Home-assistant, facilitando a gestão de ficheiros pela app e por browser.

sudo apt install samba

Dependendo do vosso RPi, a instalação vai demorar mais ou menos tempo. Podem ignorar a mensagem de instalação a dizer que ele não se configurou como um Domain Controler. Não me parece que queiram controlar remotamente os vossos computadores lá de casa a partir da vossa moldura de fotografias.

Podem testar a instalação do servidor Samba localmente.

sudo systemctl status nmbd

Se tiver corrido tudo bem, vão ver uma mensagem verde a dizer que está ativo e a ser executado. O vosso Raspberry Pi vai aparecer-vos na rede doméstica como uma máquina Windows, para já sem pastas partilhadas.

Agora, criam uma pasta para simular um disco. Vão fazê-lo no diretório do utilizador para facilidade de teste e configurar logo os acessos. Não se preocupem muito para já com isto. Mais à frente vamos mudar.

mkdir /home/pi/datafolder
chmod 777 /home/pi/datafolder

Para configurar o acesso a um disco, vão ter de editar o ficheiro de configuração do serviço Sama. Se tivessemos um NAS seria aceder a um interface gráfico de utilizador, mas enfim… Venha lá mais instruções para a linha de comandos.

sudo nano /etc/samba/smb.conf

A configuração não tem de ser necessariamente esta, até porque aquele 0777 que vão escrever quer dizer que todos podem tudo (ler, escrever e executar). Depois de testarem que tudo funciona, convém reverem a configuração do vosso smb.conf.

[Photos]
comment = RPi Share for photo frame
path = /home/pi/datafolder
create mask = 0777
directory mask = 0777
writable = true
security = share
browseable = true
public = yes

Criada a configuração, tem de reiniciar o serviço para que leia a configuração (Sem comentários).

sudo service smbd restart

Tudo instalado e configurado, podem passar à Parte 3.

Parte 3 – Configurar o Raspberry Pi como gadget de armazenamento em massa (g_mass_storage)

O que querem é que ao mesmo tempo o Raspberry Pi receba os ficheiros e os disponibilize à moldura eletrónica, como se de um disco externo USB se tratasse.

A questão é que agora, o disco não vai vos aparecer na moldura porque o RPi está a funcionar como um computador e não como um gadget de armazenamento para os vossos dados.

Para configurar o Raspberry Pi como um gadget de armazenamento (mass storage) terão de editar o ficheiro de configuração do próprio RPi.

sudo nano /boot/config.txt

No final do ficheiro vão ter de acrescentar dtoverlay=dwc2. Para gravar e sair do nano, carreguem em na tecla ctrl + O e depois ctrl + X.

Vão ter de acrescentar também ao ficheiro de configuração dos módulos do sistema operativo o mesmo dwc2. Este dwc2 é o nome do driver de kernel linux que vai fazer o serviço, mas que, por omissão não vem configurado.

sudo nano /etc/modules

No final do ficheiro, acrescentem dwc2 e gravem com ctrl + O e ctrl + X.

Para tudo funcionar, ainda faltam maus umas voltas. Vamos ter de:

  1. Criar um contentor (container) para simular o disco que será disponibilizado como gadget.
  2. Montar o disco no filesystem.
  3. Atualizar o container de cada vez que lá sejam colocados ficheiros.

Para criar o container, executem o comando abaixo, tendo em conta que o valor que colocam em count é o espaço que estão a reservar para simular o disco. Neste caso, os 2048 equivalem a 2GB.

sudo dd bs=1M if=/dev/zero of=/piusb.bin count=2048

Depois de criado este contentor, têm de formatar e montar o disco automaticamente para que possa ser utilizado.

sudo mkdosfs /piusb.bin -F 32 -I
sudo mkdir /mnt/piusb
sudo nano /etc/fstab

No ficheiro /etc/fstab, vão ter de acrescentar uma linha que monte o disco automaticamente.

/piusb.bin /mnt/piusb vfat users,umask=000 0 2

Para montar todos os discos configurados em /etc/fstab, correm o comando sudo mount -a. O vosso sistema encarrega-se disto no futuro.

Para disponibilizar o disco piusb na rede através do Samba, já adivinharam. Vão ter de configurar o Samba, como já fizemos anteriormente, mas agora a apontar para o disco piusb.

sudo chmod 777 /mnt/piusb/
sudo nano /etc/samba/smb.conf

No ficheiro /etc/sambe/smb.conf, podem acrescentar o vosso novo disco a partilhar, alterando o caminho para a pasta para /mnt/piusb.

[Photos]
comment = RPi Share for photo frame
path = /mnt/piusb
create mask = 0777
directory mask = 0777
writable = true
security = share
browseable = true
public = yes
guest ok = yes
read only = no

Para ligar o RPi em modo gadget de armazenamento em massa, ainda vão ter lhe ligar o módulo que anteriormente configurámos e dizer-lhe onde está o ficheiro que simula o disco.

sudo modprobe g_mass_storage file=/piusb.bin stall=0 ro=1

Depois de testarem, escrevendo algo, lendo e sincronizando os dados com o comando sudo sync, podem desmontar o disco do interface USB via modprobe. O disco vai continuar disponível via Samba.

sudo modprobe -r g_mass_storage

Algo que o sistema não se encarrega é a sincronia disto tudo. De cada vez que copiam imagens para este /mnt/piusb, seja por que via for, teriam de fazer um conjunto de operações, e lá voltávamos ao que nos trouxe até aqui: demasiadas operações só para ver umas fotos novas na nossa moldura eletrónica. Aqui a revista MagPi deu uma ajudinha.

Terão ainda de criar algo que engane o equipamento que vai receber o disco externo para que fique no modo como se lhe tivessemos tirado e voltado a meter o disco USB externo, e assim recarregar a lista de ficheiros com as mudanças.

Vamos necessitar do Python, do Pip3 e de um script que vai fazer de cão de guarda (watchdog) e executar instruções de cada vez que detete uma alteração.

sudo apt install python python3-pip
sudo pip3 install watchdog

cd /usr/local/share
sudo wget http://rpf.io/usbzw -O usb_share.py
sudo chmod +x usb_share.py

Vão ter de adaptar o ficheiro usb_share.py para que esteja de guarda ao /mnt/piusb. Para isso, alterem o ficheiro com sudo nano /usr/local/share/usb_share.py e onde estiver WATCH_PATH = "/mnt/usb_share", tem de passar a estar WATCH_PATH = "/mnt/piusb".

Para isto tudo funcionar, temos ainda de colocar o script como um serviço, assim ele funciona logo ao arranque do RPi e continua a funcionar.

cd /etc/systemd/system
sudo nano usbshare.service

No ficheiro usbshare.service vamos colocar as configurações para o ficheiro python que instalámos funcionar como um serviço.

[Unit]
Description=Watchdog for piusb

[Service]
Type=simple
ExecStart=/usr/local/share/usb_share.py
Restart=always

[Install]
WantedBy=multi-user.target

Depois de gravarem, com ctrl + O e sairem com ctrl + X, tem de ativar e iniciar o vosso novo serviço.

sudo systemctl daemon-reload
sudo systemctl enable usbshare.service
sudo systemctl start usbshare.service

O serviço vai procurar por alterações no /mnt/piusb e esperar 30 segundos antes de cumprir a sua função, por isso, sejam pacientes.

Antes de desligar o RPi para o mudarem de sitio, não se esqueçam de fazer sudo halt para não danificar os discos.

Na parte seguinte deste artigo explico como usar o Home-assistant com isto tudo. Se não tiverem o Home-Assistant, também podem enviar a imagem a partir de qualquer computador para a vossa partilha de ficheiros Samba já instalada.

Bonus – Copiar ficheiros para o RPi USB Gadget a partir do Home-Assistant

A parte de receber ficheiros podia ser feita só com cópia de ficheiros, mas não tinha a mesma graça e era preciso andar às voltas com a linha de comandos. Se tiverem o Home-assistant, podem ir ao vosso menu de gestão de armazenamento em rede (Netowrk Storage), adicionar a vossa nova drive remota como Media, com o protocolo Samba ligado para o vosso novo servidor, e dar-lhe o nome Photos, ou outro à vossa escolha.

Só falta resolver a questão de “Então mas e agora como é que ponho lá as fotos com o Home-assistant?”.

Para além do interface gráfico de utilizador que é disponibilizado via browser, o Home-assistant oferece as Companinon App, o que facilita enviar as fotos do vosso smartphone.

Em qualquer interface gráfico de utilizador, podem seguir os mesmos passos: Media > My Media > Photos. Está feito.

Atenção ao tamanho das imagens que enviam para a vossa moldura. Isto como é uma coisita já antiga e com poucos recursos, é capaz de se engasgar com esses novos formatos de grande dimensão que são hoje em dia gravados no vosso smartphone por cada foto. No caso do iPhone, depois de selecionar as fotos que quero enviar, podem carregar e selecionar o tamanho mais pequeno (Small).

Raspberry Pi Zero W v1.1 de 2017 e Raspberry Pi 2B de 2015

Nas referências deste artigo vão encontrar uma série de voltas que dei a tentar colocar uma solução de gestão do sistema via browser. Estas soluções estão na categoria dos Network Attached Storage (NAS).

A maioria dos NAS open source mais comuns só podem ser instalados em arquiteturas de 64-bit, o que significa que o vosso Raspberry Pi antigo pode não servir. No meu caso, o que usei foi um Raspberry Pi Zero W v1.1 de 2017 e um Raspberry Pi 2 B de 2015, por isso tive de procurar uma solução 32-bit.

Por teimosia, acabei por instalar o Webmin no Raspberry Pi Zero W e no Raspberry Pi 2 B para ter um interface simplificado de configuração, até porque não sou muito fluente em smb.conf, mas isso fica para outro dia.

curl -o setup-repos.sh https://raw.githubusercontent.com/webmin/webmin/master/setup-repos.sh
sudo bash setup-repos.sh
sudo apt install --install-recommends webmin

O vosso acesso via browser ao Webmin vai ficar disponível em https://raspberrypi.local:10000. Vão ter de aceitar o certificado digital autoassinado que vem de origem e o port 10000 podem alterar depois. O username e password são o mesmo que usaram para se ligarem via SSH.

Para controlar os discos, instalei os Smartmontools que serve depois no Webmin para ter Self-Monitoring, Analysis, and Reporting Technology (SMART) dos discos compatíveis.

sudo apt install smartmontools

Todos os pacotes que instalei e testei eram identificáveis pelo posfixo da arquitetura armhf. Para confirmarem a arquitetura do vosso Raspberry Pi podem correr o comando dpkg --print-architecture.

Se não se lembrarem do nome que deram ao vosso RPi, façam cat /etc/hostname e podem ler o resultado.

Todos os Raspberry Pi foram tratados de maneira humana e sem sofrimento para efeitos deste artigo.

Referências:

Tags: ,

{ Comments are closed! }