Os precos dos porta-retratos digitais estao comecando a ficar interessantes, mas construir o proprio e mais divertido.Usei um Raspberry Pi A+ (256MB de RAM e um ARM11 de 700MHz) com a ultima versao do Raspbian Jessie. Eu queria mesmo era usar um Raspberry Pi Zero (que custa apenas US$5), mas sao muito procurados e ainda nao apareceram na minha loja preferida.Comecei muito otimista (como sempre) e tentei montar uma solucao com HTML, Javascript, jQuery, transicoes, etc. Ela resultou ser muito pesada. Entao, tentei em Tcl/Tk, mas manipular os tamanhos das imagens resultou ser muito trabalhoso (possivel, mas trabalhoso).Entao, so me restou usar Perl. Foi preciso instalar dois pacotes: Tk e Imager.sudo apt-get install perl-tksudo cpanm ImagerA interface e muito simples. Ha um quadro grande com uma foto qualquer e uma foto pequena com a foto seguinte. A foto grande e escolhida aleatoriamente, mas a pequena e sempre a que segue (para haver uma relacao entre elas). Alem disso, exibo as horas e a data.O script recebe um unico parametro que indica o diretorio onde as fotos sao armazenadas. Ctrl+C suavemente encerra o programa.Futuramente, espero exibir algo mais interessante no quadro das horas (a previsao do tempo ou as noticias).#!/usr/bin/perluse Tk;use Tk::JPEG;use Tk::Photo;use Imager;use File::Find;use MIME::Base64;use POSIX 'strftime';use strict;my @file_list;find(\&wanted, $ARGV[0]);sub wanted { return unless -f; return unless /\.jpe?g$/i; push @file_list, $File::Find::name;}my $main = MainWindow->new ( -title => 'PiFrame', -background => 'black');my $w=$main->screenwidth();my $h=$main->screenheight();$main->overrideredirect(1);$main->MoveToplevelWindow(0,0);$main->geometry(join('x',$w,$h));my $photo_width=int($w*3/4);my $photo_height=$h;my $thumb_width=$w-$photo_width;my $thumb_height=int($h/3);my $canvas=$main->Canvas( -width=>$photo_width, -height=>$h, -background=>'black', -highlightthickness => 0);$canvas->pack(-side=>'left');my $small_canvas=$main->Canvas( -width=>$thumb_width, -height=>$thumb_height, -background=>'black', -highlightthickness => 0);$small_canvas->pack(-side=>'bottom');my $time;my $clock=$main->Label( -textvariable=>\$time, -width=>100, -height=>100, -background=>'black', -foreground=>'white', -highlightthickness => 0, -font=>'courier 40 bold');$clock->pack(-side=>'top');my $photo=$canvas->Photo();$canvas->createImage(0,0,-image=>$photo,-anchor=>'nw');my $thumb=$small_canvas->Photo();$small_canvas->createImage(0,0,-image=>$thumb,-anchor=>'nw');sub scale { my ($width, $height, $image)=@_; my $scaled=$image->scale(xpixels=>$width,ypixels=>$height,type=>'min'); my $data; $scaled->write(data=>\$data, type=>'jpeg'); return encode_base64($data)}my $image=Imager->new();sub next_photo { my $index=int(rand($#file_list)); my $filename=$file_list[$index]; $image->open(file=>$filename); $photo->configure(-data=>scale($photo_width, $photo_height, $image)); $filename=$file_list[($index+1)%($#file_list+1)]; $image->open(file=>$filename); $thumb->configure(-data=>scale($thumb_width, $thumb_height, $image)); $main->update();}$canvas->repeat(60000, sub {eval {next_photo()}});$canvas->repeat(1000, sub {$time=strftime("%H:%M\n%A\n%d/%m", localtime)});next_photo();MainLoop;O sistema operacional que usei para este projeto e o Raspbian com Pixel. As fotos estao armazenadas na pasta /data01/fotos. Entao, adicionei a seguinte linha ao arquivo /home/pi/.config/lxsession/LXDE-pi/autostart para que o sistema inicie automaticamente:@perl /home/pi/piframe.pl /data01/fotos/O gasto de memoria oscila entre 25MB e 50MB, o que cabe confortavelmente no espaco que o A+ oferece. Um Pi 3 talvez possa executar isso ao mesmo tempo que ofereca o servico do Amazon Echo. Um amigo apresentou-me um desafio: recuperar um roteador cuja atualizacao do firmware dera errado. O roteador, um TP-Link WR1043ND, nao funcionava mais. Esse equipamento tem uma interface serial na placa. E uma interface de 3,3V que e compativel com a interface serial do Raspberry Pi.Infelizmente, nao basta abrir a caixa: a interface serial nao tem os pinos instalados. Comprei os pinos, um pouco de fio e conectores para construir um cabinho. Depois comecei a perceber que cabinhos com os conectores adequados estao por toda parte: os mouse Genius antigos os tem, assim como os cabos de som dos drives antigos de CD. Ate mesmo o cabo de um drive de disquetes ou de HD IDE serviria com algumas modificacoes. Tambem aprendi que montar um cabo sem um crimpador e dificil.No Raspberry Pi, os pinos 6, 8, e 10 servem