Você já deve ter ouvido falar da câmera instantânea Polaroid que teve seu auge no século 20. São câmeras que tiram uma foto e imprimem instantaneamente utilizando um tipo de revelação química.
Como toda moda fica esquecida por um tempo mas volta com tudo, a Polaroid hoje tem diversos modelos de câmeras instantâneas, com impressão colorida, tecnologia touch e muito mais.
Mas como nós da MakerHero temos o espírito maker e gostamos de projetos DIY, decidimos fazer a nossa versão de câmera instantânea utilizando uma Raspberry Pi e uma mini impressora térmica e a batizamos de Pilaroid. E o que é melhor, disponibilizamos todas as instruções neste post para você também desenvolver sua câmera instantânea.
Material Utilizado
- Raspberry Pi 3
- Fonte DC 5V 3A para Raspberry Pi 3
- Impressora Térmica Embarcada
- Fonte 5V 2A para Impressora Térmica
- Câmera Raspberry Pi v2 8MP
- Botão Arcade Fliperama 60mm
- Led alto brilho
O sistema Linux utilizado na Raspberry foi o Raspbian Jessie Lite. As instruções de instalação do sistema podem ser encontradas no site da Raspberry Pi ou siga os primeiros passos com Raspberry Pi.
A impressora térmica embarcada nos possibilita a impressão em rolo comum de papel térmico de 57mm de largura, facilmente encontrado em papelarias. É possível imprimir dados de log, textos, gráficos, fotos, código de barras e etc. Sua comunicação via Serial/TTL facilita a integração dessa impressora com diversas plataformas como Arduino ou Raspberry Pi.
Veja também como utilizar a impressora térmica com Arduino.
A câmera utilizada é da própria Raspberry Pi e pode ser facilmente conectada na entrada CSI usando um cabo flat. É uma câmera de 8MP que faz fotos e vídeos utilizando a aplicação raspistill já instalada no Raspbian. Veja o funcionamento da câmera em detalhes aqui.
Configuração do Sistema
Antes de montar e conectar os componentes na Raspberry Pi vamos fazer a configuração do sistema.
Para que a impressora funcione corretamente na UART é necessário desabilitar o Bluetooth da Raspberry Pi 3 que também utiliza a mesma porta. Para isso, adicione no final do arquivo:
/boot/config.txt
A seguinte linha:
dtoverlay=pi3-disable-bt
Use um editor de texto de sua preferência como vi ou nano.
Então, desabilite o serviço de bluetooth, para que não haja interferência na porta UART:
sudo systemctl disable hciuart
Usando a aplicação raspi-config, habilite a câmera e desabilite o terminal serial
sudo raspi-config
Vá em Interfacing Options -> Camera -> Yes para habilitar a câmera.
Para desabilitar o terminal serial vá em Interfacing Options -> Serial -> No -> Yes -> Ok
Instalação dos Programas Necessários
Primeiramente vamos instalar o CUPS (Common UNIX Printing System) e alguns pacotes de dependência.
sudo apt update sudo apt install git cups wiringpi build-essential libcups2-dev libcupsimage2-dev
Então instale o raster-filters para CUPS, um programa que processa formatos bitmap para o formato nativo de impressora térmica.
git clone https://github.com/adafruit/zj-58 cd zj-58 make sudo ./install
Para adicionar a impressora térmica ao programa CUPS e utilizá-la como impressora padrão execute os seguintes comandos:
sudo lpadmin -p ZJ-58 -E -v serial:/dev/ttyAMA0?baud=19200 -m zjiang/ZJ-58.ppd sudo lpoptions -d ZJ-58
Código Shell Script da Câmera Instantânea
O repositório clonado do github nos passos anteriores já acompanha um script que é responsável por fazer a leitura do botão, tirar a foto e enviar para a impressora térmica. Você encontra esse script em ‘zj-58/extras/camera.sh’.
Para nosso projeto, foram feitas algumas mudanças e o resultado foi o seguinte:
#!/bin/bash SHUTTER=16 LED=5 # Initialize GPIO states gpio -g mode $SHUTTER up gpio -g mode $LED out # Pisca o LED ao iniciar o sistema for i in `seq 1 10`; do gpio -g write $LED 1 sleep 0.1 gpio -g write $LED 0 sleep 0.1 done while : do # Verifica se o botão foi pressionado if [ $(gpio -g read $SHUTTER) -eq 0 ]; then sudo cancel -a ZJ-58 sudo cupsenable ZJ-58 gpio -g write $LED 1 /usr/bin/raspistill -n -br 65 -t 200 -w 512 -h 384 -o - | /usr/bin/lp /usr/bin/lp /home/pi/zj-58/extras/cartao.jpg sleep 1 # Espera o usuário liberar o botão antes de terminar while [ $(gpio -g read $SHUTTER) -eq 0 ]; do continue; done gpio -g write $LED 0 fi done
As linhas mais importantes do programa são:
/usr/bin/raspistill -n -br 65 -t 200 -w 512 -h 384 -o - | /usr/bin/lp /usr/bin/lp /home/pi/zj-58/extras/cartao.jpg
A primeira linha tira a foto em um formato 512×384 e joga via pipe para o programa lp.
A segunda imprime logo em seguida um pequeno cartão que fizemos especialmente para o evento TDC Florianópolis 2017.
Para que o programa inicie automaticamente edite com um editor de texto(vi ou nano) o arquivo ‘/etc/rc.local’, adicionando antes da linha “exit 0” o script camera.sh
sh /home/pi/zj-58/extras/camera.sh
Faça o reboot do sistema para que as mudanças tenham efeito.
Montagem do Circuito
Já que a impressora se comunica via UART, precisamos conectá-la nos pinos 6, 8 e 10 da Raspberry Pi da seguinte maneira:
O LED de indicação pode ser conectado nos pinos 29 e 25 como na tabela a seguir:
Lembre-se de usar um resistor com o LED. Pode ser de um valor pequeno como 220 ohms.
O botão é ligado em uma GPIO e Ground como na tabela a seguir:
Veja a montagem do circuito completo na figura a seguir:
Teste Final da Câmera Instantânea
Ligue o circuito nas fontes de energia. Quando o sistema iniciar você verá o LED piscar. Aperte o botão e veja sua foto sendo impressa:
Abaixo temos o vídeo da câmera em ação:
As instruções técnicas deste post e programa shell script são baseadas no projeto original de Phillip Burgess, engenheiro de criação da Adafruit. O post original em inglês pode ser encontrado aqui.
Gostou? Deixe seu comentário logo abaixo.
olá, giovanni eu estou tentando realizar um projeto, quase que igual ao projeto do arduino só que no raspberry, só estou estou tendo muitos problemas com a biblioteca wiring pi e algumas outras bibliotecas, como a da própria impressora, softwareserial.h e stdlib. e ainda estou pensando em colocar uma interface gráfica usando o qt port, vc poderia me dar uma dica segue a programação que está funcionando no compilador do arduino mas n funciona no raspbian
#include // para funcionar o sorteio
#include // para funcionar o sorteio
#include // para funcionar o sorteio
#include “Adafruit_Thermal.h” // biblioteca da impressora
#include “SoftwareSerial.h” // complemento para funcionar a impressora
int Tx_PIM=6; // fio amarelo no pino 6
int Rx_PIM=5;// fio verde no pino 5
char bebidas[3]; // variavel de bebidas pode ser auterado
int bebidaSorteada, i; // variavel do sorteio
int botao=4; // botão de funcionamento conectado no pino 4
SoftwareSerial mySerial(Rx_PIM, Tx_PIM);
Adafruit_Thermal printer(&mySerial);
void setup() {
// put your setup code here, to run once:
pinMode (botao,INPUT); // definição da funcionalidade do botao
Serial.begin (9600); // velocidade do microcontrolador
mySerial.begin (19200);// velocidade da impressora dependendo modelo precisa ser auterado
printer.begin ();// comando de funcionamento da impressora
printer.justify (‘C’);// negrito
printer.inverseOn();
printer.println(F(“Show Desing”));
printer.inverseOff();// fim do negrito
printer.feed(1);// avança uma linha
printer.doubleHeightOn();
printer.boldOn();
printer.println(F(“você ganhou o drink:”));
printer.boldOff();
printer.doubleHeightOff();
printer.justify(‘L’);
printer.feed(2);
}
void loop() {
// put your main code here, to run repeatedly:
if(botao==1){ // se o botão for apertado
char* bebidas [3];// sorteio será feito
bebidas[0]= “água”; // variaveis do sorteio
bebidas[1]= “coca-cola”;
bebidas[2]= “cerveja”;
srand(time(NULL));
for (i=0; i<11; i++){
bebidaSorteada = rand()% 3;
printer.justify ('C');// negrito
printer.inverseOn();
printer.println(F("Show Desing"));
printer.inverseOff();// fim do negrito
printer.feed(1);// avança uma linha
printer.doubleHeightOn();
printer.boldOn();
printer.println(F("você ganhou o drink:"));
printer.boldOff();
printer.doubleHeightOff();
printer.justify('L');
printer.feed(2);
printer.println(bebidas[bebidaSorteada]);
printer.println (F("retire no bar"));
printer.feed(1);
printer.sleep();
delay (300L);
printer.wake ();
}
}
}
Vitor,
Para programar no Raspbian, é necessário que seja em Python, justamente pela compatibilidade.
Abraços!
Diogo – Equipe MakerHero
Uowww….
Excelente idéia.
Gerou até uma outra aqui.
Seria possível realizar a mesma montagem porém com adaptadores/transformadores de tensão equivalentes e baterias ao invés da eletricidade pela rede física e instalar um shield wifi para comunicação com a impressora que ficaria em solo equivalentes e a camera e RasPi estariam em um drone.
O botão de disparo seria acionado em solo ou então implantado código para a altitude e longitude determinadas serem fotografadas criando um mapa em tempo real da localização.
ideal para mapeamento de áreas com custo baixíssimo (em vista de outras alternativas) em tempo real.
Muito bom!!
Opa, achei foda demais!
Só recomendo mudar as cores dos blocos de código, por serem muito claras, fica difícil ler!
té +
Olá Lays,
Que bom que gostou e obrigado pelo feedback! São sempre bem-vindos!