palestra teve quase 2 horas de duração, então provavelmente é melhor assistir direto no Youtube; há um índice na descrição do vídeo. O vídeo será seguido por uma transcrição de texto abreviada (especial para Habr).
Boa visualização ou leitura. :)
Descrição do problema e conceito da solução
Vamos começar com os dados iniciais. Temos um scanner comum (no meu caso, Canon CanoScan LiDE 120) que se conecta à porta USB do computador e pode digitalizar no computador. Mas aqui, por exemplo, um segundo computador aparece e, com a necessidade geral de digitalização, alternar o scanner entre computadores sempre é inconveniente. O que fazer? Sim, agora existem MFPs de rede, mas por algum motivo, essa não é uma opção para nós.
Para resolver o problema, precisamos essencialmente equipar um local separado para o scanner, organizar uma unidade de rede, conectar todos os computadores em nossa rede doméstica a ele e ensinar o scanner a digitalizar para esta mesma unidade de rede. O usuário no processo de digitalização estará próximo ao scanner, pressione os botões e altere as folhas digitalizadas; ele não precisa correr para o computador todas as vezes para dar um comando para fazer a varredura. E então, quando tudo que ele precisa for escaneado, ele irá para seu computador, copiará ou transferirá os arquivos escaneados da unidade de rede para si mesmo e continuará trabalhando com eles.
Então, escolhemos um local para colocar o scanner, trazemos um cabo do roteador da nossa rede local (WiFi também é possível, mas deixaremos opcional), colocamos uma tomada para alimentação de 220V - e depois?
Em teoria, o scanner precisa estar conectado a um computador. Mas comprar e instalar um computador separado para esses fins é caro e não se justifica. Bem, ele vai precisar de um teclado e um mouse com monitor, eles também precisam de espaço. Ao mesmo tempo, não temos nada de especial, digitalizamos principalmente um formato (A4). Portanto, vamos procurar algo mais portátil.
Em nosso projeto, usamos um computador de placa única Raspberry Pi 2 Modelo B. Embora não seja novo e não seja muito poderoso, sua potência é suficiente para a tarefa, ele realmente não consome energia, bem, o GPIO será útil.
Para aqueles que desejam repetir tudo imediatamente com base no scanner existente, recomendo que você vá primeiro ao site do projeto SANE, vá para a lista de dispositivos suportados e certifique-se de que o modelo de scanner específico seja adequadamente suportado pelo projeto. Caso contrário, esforços e, possivelmente, dinheiro podem voar para o cano. Além disso, pode valer a pena organizar uma máquina (virtual ou real) com Debian 10 (mais precisamente, a versão atual no momento de verificar a versão a partir da qual a Raspberry Pi Foundation fez o sistema operacional) e sã logo de cara e verificar o trabalho usando o utilitário scanimage; se tudo estiver normal, provavelmente funcionará com framboesas.
Auxiliar Necessário
Quanto à fonte de alimentação do raspberry e do scanner, no projeto de demonstração eu uso um carregador MicroUSB normal de dois ampères. Mas, se a framboesa supostamente funciona 24 horas por dia, então não aconselho o seu uso. Esta não é sua tarefa, e não é um fato que um determinado carregamento não falhará se não fornecer uma corrente tão pequena por um longo período no modo 24/7. É melhor não economizar dinheiro e pegar uma fonte de alimentação proprietária ou adaptar outra adequada para esse tipo de trabalho.
Além disso, não recomendo conectar o scanner com um cabo USB de longo comprimento ou de qualquer origem. Isso vem de mais de seis meses de experiência operacional; uma surpresa pode acontecer no momento mais inoportuno.
Quanto à memória "disco" - em framboesas, como você sabe, são usados cartões microSD. O décimo Raspberry Pi OS cabe em uma placa de 4 GB. Mas ainda teremos um software instalável decente lá, além de uma pasta de rede para varreduras. Portanto, nos concentramos em pelo menos 8; No projeto são utilizados 16. Além disso, para a gravação inicial da imagem do sistema operacional, será necessário um computador com leitor de cartão, ao qual o cartão pode ser conectado. Usei um adaptador para um leitor de cartão SD embutido no laptop.
Também precisamos de um corpo. Há muitas opções. Na variante mostrada, usei uma caixa não original de espessura aumentada; isso possibilitou a montagem de um circuito de dois botões e um LED fornecido pelo projeto na tampa superior (mais sobre isso depois), e a altura do case foi suficiente para botões e conectores framboesa e BLS para conexão aos pinos GPIO. Este corpo é feito de plexiglass. É assim que fica com o circuito montado, mas sem o framboesa:

Agora eu uso este caso para depuração e demonstrações, e na versão de combate o framboesa fica preso em um painel elétrico dedicado junto com a fonte de alimentação e é usado ao mesmo tempo para outra tarefa, e o circuito é montado em uma pequena caixa separada, que é conectada ao framboesa com um cabo telefônico plano de quatro núcleos.
Outro problema com as framboesas é o aquecimento do caroço. Se você planeja trabalhar 24 horas por dia, nós colamos um pequeno radiador com algo condutor de calor adequado.
Preparando um cartão de memória
Vamos começar a preparar o cartão de memória. Recentemente, a Raspberry Pi Foundation não apenas renomeou Raspbian para Raspberry Pi OS, mas também lançou um programa chamado Raspberry Pi Imager para Windows, macOS e Ubuntu. Baixe este programa, instale-o no seu computador e execute-o.
Em primeiro lugar, na janela do programa, vamos fazer Choose OS. Existem muitas opções. Por padrão, o Raspberry Pi OS (32 bits) é oferecido, mas é com um desktop e, para dois, o desktop é normal. Portanto, vamos ao Raspberry Pi OS (outro) e selecionamos a opção lite lá; dificilmente precisamos de nada além da linha de comando. Em seguida, colocamos e selecionamos um cartão de memória e gravamos uma imagem nele. Este processo é mostrado no vídeo às 00:12:15 .
Configuração inicial
Você pode colocar o cartão de memória no framboesa e ir para sua configuração. Para fazer isso, além de alimentação, uma rede com a Internet e um scanner, precisamos conectar um teclado USB e um monitor com um cabo HDMI (para a quarta geração de framboesas, existe MicroHDMI). Conectamos a fonte de alimentação por último. E lembre-se da segurança ao trabalhar com partes condutoras abertas, principalmente se a framboesa não estiver no case, e a alimentação for questionável em termos de contato elétrico com 220V.
Ligue, inicialize, faça login com o login pi padrão e a senha do raspberry. O processo de configuração do vídeo começa às 00:18:43 .
Em primeiro lugar, certifique-se de trabalhar com sudo apt update e sudo apt upgrade. Na hora de gravar o vídeo, o repositório se ofereceu para atualizar 30 pacotes, embora eu tenha gravado a imagem do cartão de memória pouco antes da configuração inicial. Aparentemente, ele não é coletado sempre que o repositório é atualizado.
Além disso, se desejarmos, resolvemos o problema dos quadrados no console em vez das letras russas. Chamamos sudo dpkg-reconfigure console-setup e percorremos os menus. Definimos (ou deixamos) os seguintes parâmetros:
- Codificação para usar no console - UTF-8
- Conjunto de caracteres para suporte - Adivinhe o conjunto de caracteres ideal
- Tamanho da fonte - 8x16
Primeira vez que reiniciamos. Fazemos isso de maneira regular, por meio de reinicialização do sudo. Faça login novamente, execute sudo raspi-config e prossiga para a configuração inicial dos parâmetros. Fazemos as seguintes tarefas nele:
- ( : System options — Password )
- SSH (Interface options — SSH)
- (Localisation options — Locale; en_GB.UTF-8 UTF-8, en_US.UTF-8 UTF-8 ru_RU.UTF-8 UTF-8, )
- (Localisation options — Timezone; , )
- (Advanced options — Expand filesystem).
Depois disso, selecione Concluir. O programa se oferecerá para reiniciar, o que nós fazemos.
Em seguida, logamos novamente (já com uma nova senha), vamos para sudo raspi-config, selecione Opções de localização e depois Teclado. O programa de configuração do teclado já escreverá em russo.
No modelo de teclado, como padrão, selecionamos “PC comum com 105 teclas (Int.)
No layout, primeiro selecione“ Outro ”, depois“ Russo ”e depois a opção (apenas“ Russo ”ou algum mais adequado para o teclado existente).
Em seguida, selecione o método de alternar layouts e outras teclas diferentes, se desejar. Tudo mudará com rapidez suficiente. Ele permanece no menu principal do raspi-config para ir para Concluir. Não retornaremos a este utilitário novamente.
Instalação e configuração de software adicional usado pelo projeto
Fazemos sudo para instalar wiringpi samba sane. Acrescentei o mc a essa lista (e à palestra) e mostro como trabalhar com ele, mas isso é uma questão de preferência puramente pessoal, não imponho a ninguém.
Em seguida (de preferência na maioria dos casos) defina o endereço IP permanente para o malinka. Acho que é melhor fazer isso em um roteador, mas se isso não for possível, você pode definir as configurações de rede estática editando /etc/dhcpcd.conf após o comentário Exemplo de configuração de IP estático. O pacote dhcpcd vem com o Raspberry Pi OS pronto para uso, você não precisa instalá-lo.
A próxima tarefa é criar um diretório para armazenar arquivos de digitalização. Eu escolhi este caso e criei o diretório / var / scanned. Este diretório precisa ter tais permissões para que o samba possa trabalhar com ele.
Agora, é claro, estamos configurando o samba. Vamos para /etc/samba/smb.conf e registramos as configurações globais e a seção com os dados do novo recurso de rede e o caminho para o diretório que criamos lá. O vídeo mostra às 00:41:51 . Mas, é claro, as especificações da rede podem fornecer certas diferenças em relação às configurações fornecidas ali.
Após a configuração, é altamente recomendável reiniciar o raspberry e verificar a unidade de rede do computador. A partir daí, na maioria dos casos, você precisará de acesso total aos arquivos no diretório.
Antes de prosseguirmos para o bordado e a programação, temos duas tarefas restantes - decidir sobre a peça de ferro e primeiro descobrir os parâmetros para o programa de digitalização.
Vamos começar com a parte do ferro. Para fazer isso, execute gpio readall. O Malinka exibirá a numeração dos pinos no conector GPIO nas colunas físicas e sua finalidade nas colunas de nomes. Para o circuito, precisamos de três portas GPIO e um fio comum (na coluna Nome, é chamado de 0v; há muitos deles no conector, mas não precisamos de tanto, basta escolher qualquer um deles). Anotamos seus nomes e números no conector. Para mim, eu escolhi GPIO.1 no pino número 12, GPIO.2 no pino 13 e GPIO.3 no pino 15. Vou conectar o fio comum ao pino número 9.

Agora vamos decidir sobre o scanner, que já conectamos ao USB. Fazendo sudo sane-find-scanner. Se o scanner não estiver visível com este utilitário, pode haver um problema com o scanner, framboesa, cabo ou fonte de alimentação; isso precisa ser tratado separadamente. Agora faça sudo scanimage –help | menos e veja as opções permitidas para o nosso dispositivo. Para mim, vou anotar as opções l, t, x, y, resolução e formato. Essas opções irão para a linha de comando do programa de digitalização.
Isso conclui a configuração inicial da framboesa. Antes de montar o circuito, o framboesa deve ser desligado. Isso, caso alguém não se lembre, é feito com o comando sudo shutdown –h now. Depois de um tempo, a imagem na tela irá desaparecer, e todos os LEDs do raspberry irão apagar, exceto o LED de energia. Isso significa que o sistema terminou de funcionar, você pode desligar a energia e iniciar o artesanato.
GPIO em framboesas é apenas digital (ou seja, dois níveis 0 e 1) e pode funcionar em três modos: apenas uma entrada (o modo é chamado), uma entrada com um resistor pull-up com uma resistência de 50-65 kilo ohms (chamado) e uma saída (chamado). Usaremos os dois últimos modos.
Como escrevi anteriormente, precisaremos conectar dois botões via GPIO (vamos chamá-los de "Iniciar" e "Parar") e um LED. Naturalmente, para limitar a corrente, você precisará conectar um resistor limitador em série com ele; Escolhi um resistor de saída com valor nominal de 2,2 kilohms e potência de dissipação de 0,25 W; isso geralmente é o suficiente. O diagrama de conexão é o seguinte:

Com base no uso do modo up, lembre-se que quando o botão é pressionado, o valor 0 será lido na entrada GPIO, e quando liberado - 1. Ambos os botões estão normalmente abertos, sem fixação.
Não vou me alongar sobre os detalhes da execução aqui, especialmente porque mostrei anteriormente uma foto da caixa pronta, onde já estava tudo. Por razões de segurança, eu recomendaria apenas escolher botões cujas partes externas sejam todas de plástico para não ficarem fora das partes condutoras expostas. Eu conectei aos pinos GPIO com conectores BLS de um pino, semelhantes aos usados em gabinetes de computador; para esta demonstração, eu simplesmente peguei um monte de fios de projetos do Arduino com conectores adequados, selecionei quatro multicoloridos, cortei pontas desnecessárias, limpei e soldou os detalhes. Outra opção é usar um conector de cabo plano de duas fileiras de 40 pinos ou mesmo um pedaço de um cabo IDE antigo de discos rígidos ou unidades de CD, se alguém tiver mais alguma coisa. Essa opção, aliás, também é adequada para caixas de altura padrão;eles têm um slot para tal loop para saída para o exterior.
Bem, e também, lembro-me, sofri com o facto de nas placas de framboesa (em todo o caso, 2 modelo B e 3 modelo B) não estar indicada a numeração dos pinos do conector GPIO. Vou consertar agora; esses dois modelos não têm diferenças a esse respeito.

Implementação da parte de software
A parte do software é implementada (tadam!) Na forma de dois scripts bash - um config e um script de trabalho propriamente dito. Uma explicação detalhada do diagrama de fluxo e da implementação está no vídeo às 01:08:30 . Não acho que faça sentido entrar em detalhes aqui; os códigos-fonte dos scripts podem ser baixados aqui e estudados à vontade.
O lançamento do script de trabalho principal é escrito para inicialização em /etc/rc.local. A única coisa - eu tive que primeiro registrar a mudança do diretório de trabalho para o diretório com scripts. Mas não há nada de terrível aqui, isso não atrapalha o trabalho futuro. E, claro, não se esqueça de adicionar o ícone & após o comando de inicialização, caso contrário, haverá problemas ao carregar o sistema.
Bem, então restou apenas mostrar o processo real de digitalização, bem como as conexões ssh e ajustes de parâmetros - do jeito que era comigo. Você pode assistir no vídeo às 01:41:04 .
De alguma forma isso aconteceu. Na versão de combate, das diferenças, apenas a digitalização vai para um NAS separado, respectivamente, os scripts são ligeiramente alterados. E então, eu acho, as varreduras podem até mesmo ser enviadas para o messenger com um bot em algum lugar, haveria apenas o desejo de entender a API correspondente e fazer algo assim no curl. Há muitas opções. Boa sorte com a implementação. :)