câmera instantânea

Pilaroid: Câmera Instantânea com Raspberry Pi 6

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.

Pilaroid Câmera Instantânea com Raspberry Pi

Material Utilizado

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.

Detalhes câmera

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.

raspi-config Interfacing Options

raspi-config Camera

raspi-config Camera Enable Yes

Para desabilitar o terminal serial vá em Interfacing Options -> Serial -> No -> Yes -> Ok

raspi-config Serial

raspi-config Login Shell No

raspi-config Hardware Serial Yes

raspi-config Serial No

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:

Pinagem Raspberry Impressora Térmica

O LED de indicação pode ser conectado nos pinos 29 e 25 como na tabela a seguir:

Pinagem Raspberry LED

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:

Pinagem Raspberry Botão

Veja a montagem do circuito completo na figura a seguir:

Circuito Completo da Câmera Instantânea

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:

Resultado da Impressão

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. 

Faça seu comentário

Acesse sua conta e participe

6 Comentários

  1. 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 ();
    }
    }

    }

    1. Vitor,

      Para programar no Raspbian, é necessário que seja em Python, justamente pela compatibilidade.

      Abraços!
      Diogo – Equipe MakerHero

  2. 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.

  3. Muito bom!!

  4. Opa, achei foda demais!
    Só recomendo mudar as cores dos blocos de código, por serem muito claras, fica difícil ler!
    té +

    1. Olá Lays,

      Que bom que gostou e obrigado pelo feedback! São sempre bem-vindos!