Índice:
- Etapa 1: Prova de conceito e prototipagem
- Etapa 2: Materiais e Ferramentas
- Etapa 3: Painel frontal - tela LCD
- Etapa 4: Painel frontal - LEDs de status
- Etapa 5: Painel frontal - botões
- Etapa 6: Conector de alimentação
- Etapa 7: juntando tudo
- Etapa 8: Configuração do Slack
- Etapa 9: Implementação de Software
- Etapa 10: Instrução de uso
- Etapa 11: Liberando
- Etapa 12: FAQ
2025 Autor: John Day | [email protected]. Última modificação: 2025-01-13 06:58
Na empresa onde trabalho existe uma mesa de kicker. A empresa ocupa muitos andares e para alguns dos funcionários demora até 3 minutos para chegar à mesa e… perceber que a mesa já está ocupada.
Portanto, surgiu a ideia de construir uma espécie de sistema simples de transmissão e reserva de status, que opera em tempo real.
A empresa usa a ferramenta de comunicação Slack onde cada funcionário tem uma conta. Temos até um canal #kicker apenas para discussões sobre … kicker. O canal pode ser utilizado como uma espécie de “ponto de entrada” para reservas e para ser informado sobre o estado da mesa atual.
Como de costume, existem muitos conceitos sobre como lidar com esse sistema. Mas, geralmente, uma regra básica apareceu em todos eles: tem que ser simples de usar, sem etapas excessivas a serem executadas ao lidar com o sistema.
O dispositivo e o serviço não são fixados na tabela de kicker e podem ser usados para qualquer "recurso comum" (como mesa de pingue-pongue, console, etc …) que precisa de algum tipo de solução de reserva e transmissão de status.
Então vamos começar…
Etapa 1: Prova de conceito e prototipagem
Raughly a ideia era construir um dispositivo que será colocado ao lado da mesa do kicker seguindo estes requisitos:
-
alguns indicadores sobre o estado atual da mesa - se você estiver ao lado dela, você deve saber se ela está livre ou reservada e alguém virá jogar em 3 minutos. Os semáforos se adaptam perfeitamente à ideia:
- luz verde - grátis para jogar,
- luz amarela - reservada,
- luz vermelha - ocupada.
-
botão (s) Você pode clicar antes e depois do jogo para que todos sejam informados sobre o status da mesa atual. Em vez de 1 botão de alternância, decidi usar 2 botões separados:
- botão vermelho - ocupar a mesa, iniciar um jogo (após reserva ou ad hoc).
- botão verde - mesa de liberação.
- alguns exibem informações mais detalhadas sobre "o que está acontecendo" - tempo limite de reserva, status de mesa repetida, tempo limite de jogo etc …
Por reserva, quero dizer apenas a reserva para os próximos 3 minutos. O sistema não foi projetado para que o usuário possa reservar a mesa no horário exato (por exemplo, 14h). Não funciona como reserva, por exemplo em restaurantes, mas apenas por alguns minutos.
Por causa da falta de conexão LAN, a única opção é usar WLAN - é a melhor opção de qualquer maneira. O cérebro do sistema deve usar a API Slack para enviar e receber comandos do canal Slack. Primeiro tentei usar o NodeMCU. Consegui obter e receber mensagens de e para o Slack, mas devido ao uso de HTTPS e também ao tamanho da "mensagem de boas-vindas" do Slack (~ 300kB), o NodeMCU estava perdendo a conexão e / ou teve alguma exceção estranha que não consegui resolver vasculhando na Internet.
Então decidi usar algo mais poderoso: Raspberry Pi 3 (Zero W com WiFi ainda não havia sido lançado naquela época). Com o RPi, pude mudar a linguagem de implementação de C para Java, pois é mais conveniente para mim - isso foi uma vantagem. Hoje você pode usar algo mais poderoso do que NodeMCU e menos poderoso do que RPi. Raspberry Zero, talvez?
Depois de construir o primeiro protótipo em uma placa de ensaio com alguns fios malucos, muitos esboços e protótipos, o sistema parecia que poderia funcionar.
Tendo todas essas idéias e PoC trabalhando, comecei a planejar diferentes configurações de posicionamento dos itens acima em um painel frontal para que sejam mais informativos e convenientes de usar. Você pode verificar algumas das outras propostas, talvez algumas se ajustem melhor a você. O último foi o escolhido por mim.
Etapa 2: Materiais e Ferramentas
Materiais que usei:
- Caixa
- Raspberry Pi, cartão microSD, fonte de alimentação micro USB
- Botões de arcade verde e vermelho
- Tela LCD 16x2
- LEDs - Usei RGB, mas você pode usar a cor adequada
- Cabos de jumper da placa de ensaio macho para fêmea e fêmea para fêmea
- Interface micro USB
- Mini breadboard apenas para conectar alguns fios
- Cabo micro USB curto funcionando como um jumper dentro da caixa para alimentar o RPi
Ferramentas que usei:
- Faca afiada (por exemplo, faca para cortar carpete)
- Ferramenta rotativa
- Pistola de cola quente
- Estação de solda
- Alicates, alicates diagonais / cortadores laterais
- Chave de fenda
- Arquivo
- Mim
Ferramentas de que você provavelmente precisa:
Todas as opções acima, mas em vez de "Eu", deveria ser: "Você":)
Etapa 3: Painel frontal - tela LCD
O furo para a tela LCD era simples. Apenas um retângulo que cabe na minha tela LCD. Depois de tentar cortá-lo com uma faca afiada, percebi que o plástico da caixa é bem duro. Usei uma ferramenta de perfuração para cortar a janela e polir as bordas.
Etapa 4: Painel frontal - LEDs de status
Os orifícios para LED também são simples. Peguei uma furadeira grande para fazer madeira e poli as bordas com uma ferramenta de perfuração. Os grandes LEDs se encaixaram perfeitamente. Ainda não soldei nenhum resistor aos LEDs - deixei para o processo de montagem.
Etapa 5: Painel frontal - botões
O maior problema com esses 2 botões grandes era colocá-los uniformemente com o espaçamento adequado. Eu cortei os furos usando apenas minha ferramenta de perfuração, pois poderia aumentar o diâmetro passo a passo para que os botões ficassem firmes.
Etapa 6: Conector de alimentação
Um pequeno orifício para alimentação do micro USB foi um trabalho muito delicado de se fazer. Queria que o furo fosse o mais adequado possível, por isso passei muito tempo aqui a polir. Mas fiquei satisfeito com o resultado final.
Então cortei um cabo mini USB curto que foi colocado dentro da caixa. De um lado, ele é conectado a RPi e, do outro, todos os cabos foram soldados à interface micro USB de acordo com a pinagem USB.
Em seguida, colei o pequeno PCB diretamente na caixa (pode ser visto em uma foto na etapa de montagem).
Etapa 7: juntando tudo
Primeiro, soldei resistores apropriados aos LEDs de acordo com sua cor (voltagem) para 3,3V volt. Usei 100Ω para vermelho, dois resistores 82 e 100 para amarelo (nó verde e vermelho) e 100Ω para verde. Você pode usar um do resistor online para calculadora LED. Mas, por favor, faça uma pesquisa por conta própria de acordo com o brilho e o tom de cor exato que deseja alcançar.
Pernas de LED amarelo foram soldadas juntas para que o próprio LED possa ser controlado apenas por um pino no RPi.
De acordo com este diagrama de pinagem:
Os nós de LED foram conectados:
- LED verde - GPIO1 em Rpi
- LED amarelo (ambas as pernas) para GPIO2 no RPi
- LED vermelho para GPIO0 no RPi
Eu conectei o LCD usando pinos I2C em pinos RPi
- LCD SDA para GPIO8 no RPi
- LCD SCL para GPIO9 em RPi
- LCD PWR para 5V no RPi
- LCD GND para GND em RPi
O LCD foi colado a quente na caixa como proteção adicional.
Liguei 3,3V e GND à pequena placa de ensaio para poder usá-los como botões.
O botão verde foi conectado ao 3.3V através do mini breadboard e ao GPIO5 no RPi.
O botão vermelho foi conectado ao 3.3V através do mini breadboard e ao GPIO4 no RPi.
Portanto, sempre que você pressiona o botão, há um estado alto no pino RPi.
O mini bradboard funciona bem, então pulei a soldagem de todos os fios no PCB. Em vez disso, apenas cobri a mini placa de ensaio com cola quente para que os cabos não caíssem.
Eu também colei a tampa de RPi com cola quente na caixa para que ela não balançasse por dentro.
Eu parafusei o painel frontal com todas as coisas dentro.
Em seguida, imprimi, cortei e colei etiquetas simples ao lado dos semáforos e botões.
Etapa 8: Configuração do Slack
Crie sua equipe no Slack.com ou use aquela que você tem e que tenha pelo menos direitos de administrador.
No Slack, crie um canal para integração do serviço com o Slack (ou pule a criação de um canal se quiser usar um que já tenha).
Adicione integração de Webhooks Incomming à sua equipe. Selecione o canal e copie o URL do webhook.
Adicione integração de Bots à sua equipe. Escolha algum nome para Seu bot e copie o token da API do bot.
A página de gerenciamento de integrações personalizadas deve ter a aparência da imagem.
Você tem que convidar o bot como membro do seu canal. Você já poderia fazer isso durante a criação de um canal.
Se você quiser personalizar o serviço mais tarde, verifique a API do Slack.
Etapa 9: Implementação de Software
Usei Raspbian como sistema operacional para meu RPi seguindo este tutorial. Por favor, me perdoe, vou pular a explicação, pois já está documentado em muitos lugares e o processo é simples. Espero que você seja qualificado e experiente o suficiente para gerenciar a configuração do RPi por conta própria. Não se esqueça de configurar o acesso Wi-Fi no seu Raspberry Pi;)
Conforme mencionado na seção de prototipagem, usei Java para implementar o cérebro de todo o sistema. O código está disponível no GitHub -
As bibliotecas Java que usei:
- pi4j - para usar Raspberry Pi de Java
- Springboot como uma plataforma de aplicativo
- allbegray / slack-api como integração do Slack
Você precisa editar o arquivo de configuração em src / resources / config.properties. Existem 3 entradas que você deve configurar para usar a API Slack:
- channelName - nome do canal. Você deseja postar mudanças de status e receber comandos.
- slackBotToken - token de um bot configurado nas integrações de sua equipe do Slack que será usado para postar mensagens no canal mencionado acima. Observe que você deve adicionar o Slack Bot como membro do canal.
- webhookUrl - o URL que você pode obter nas integrações personalizadas do Slack Team.
O projeto é Mavenizado, portanto, para compilá-lo, basta digitar (você precisa de pelo menos Java 8 e Maven instalados):
pacote limpo mvn
E na tiretória de destino, você pode encontrar o arquivo JAR do Springbooted. Para iniciar um serviço:
sudo java -jar kicker-reservation-service-0.3.0.jar
Eu defini esta linha como.sh script e o adicionei como um autostart. Portanto, sempre que a energia está ligada, o serviço é inicializado automaticamente.
É necessária uma explicação especial para o LCD.
Tentei diferentes abordagens / bibliotecas para controlar o LCD sobre I2C do RPi, mas não consegui. Para alguns, o LCD não estava funcionando corretamente, para alguns estava exibindo um pouco de lixo.
Mas uma coisa estava funcionando muito bem fora da caixa. É a ferramenta de linha de comando do utilitário que descobri que você pode usar para controlar o LCD. Então decidi usar essa ferramenta diretamente do Java. Funciona assim que um processo normal do Linux (lcdi2c) é chamado (com parâmetros preparados) toda vez que eu quero exibir algo na tela LCD.
Você precisa baixar a ferramenta e colocá-la ao lado do serviço JAR
Usar esta ferramenta é uma espécie de hack e solução estúpida, mas eu sigo a 1ª regra da engenharia:
Se é estúpido, mas funciona … não é estúpido
Etapa 10: Instrução de uso
Você pode verificar o status atual da tabela de kicker no canal Slack criado digitando o comando "status" (ou logo "st") ou verificar diretamente os semáforos no dispositivo.
Se você quiser apenas jogar - pressione o botão vermelho. A mensagem será enviada para o canal do Slack com informações de que a mesa de kicker está ocupada. Quando terminar de jogar - pressione o botão verde. A mensagem será enviada para o canal do Slack com informações de que a mesa de kicker está livre para jogar.
Os semáforos também mudarão e a tela LCD mostrará algumas informações detalhadas.
Caso você se esqueça de liberar a mesa depois de terminar de jogar, há um tempo limite definido para 20 minutos. Se você ainda estiver jogando e precisar de mais tempo, pressione o botão vermelho novamente e a partida será prolongada por 5 minutos (aplica-se apenas quando faltam menos de 5 minutos para o tempo limite). O tempo limite de reprodução será apresentado na tela LCD.
Para reservar a mesa de kicker, escreva uma mensagem „reserve” (ou apenas: „res”) para o canal Slack.
O semáforo amarelo acenderá informando aos outros próximos à mesa de kicker que ela está reservada e logo alguém virá jogar.
O tempo limite de reserva é definido para 3 minutos. Depois disso, a mesa de kicker muda seu estado para livre para jogar.
Se precisar, você pode cancelar a reserva escrevendo “cancel” no canal Slack.
O sistema também possui alguns outros recursos menores, como:
- Após a reserva, os botões ficam congelados por 5 segundos. Isto é para prevenir situações, que ao mesmo tempo alguém reserva e um milissegundo depois alguém aperta o botão vermelho pensando que é Ele / Ela quem está ocupando a mesa mas sem saber que alguém reservou a mesa apenas um milissegundo antes.
- Pressionar qualquer botão congela os dois por meio segundo. Isso evita cliques malucos de botões para que o canal do Slack não receba muito spam.
- A versão gratuita do Slack permite armazenar 10.000 mensagens de toda a equipe. Para preservar algumas das mensagens, exclua as mensagens antigas relacionadas ao sistema de reserva / status e mantenha apenas as 6 últimas. Por que 6? Porque na maioria das vezes há 2 cenários de status: "Reservado-Ocupado-Livre" e "Ocupado-Livre". Assim, o sistema pode armazenar pelo menos 2 sessões livres ocupadas completas. Para limpar todas as mensagens do sistema, digite o comando "clean" (ou "clear").
Etapa 11: Liberando
Até agora (o momento da publicação deste instrutível), o sistema está funcionando por mais de 2,5 meses e é usado por mais de 30 pessoas. Por causa da atualização do status da tabela de kicker, sempre sabemos quando ela está livre ou ocupada, então não perdemos mais tempo indo e voltando. A conexão e o serviço são muito estáveis, então podemos contar com isso.
Até agora tudo bem…
Etapa 12: FAQ
Por que o tempo limite da reserva está definido para 3 minutos?
3 minutos é o tempo máximo de reserva, adote-o como quiser no código. Geralmente isso raramente acontecerá, que 3 minutos completos passarão e a reserva será expirada. Na maioria dos casos, alguém virá eventualmente e ocupará a mesa.
Por que o tempo limite de reprodução está definido para 20 minutos?
Dependendo do jogador, o tempo médio de jogo é de aproximadamente 10 minutos. Se precisar jogar por mais tempo, pressione o botão vermelho novamente quando faltarem menos de 5 minutos e o tempo limite será estendido para 5 minutos. Este tempo limite é configurado para o caso de alguém se esquecer de liberar a mesa.
Por que não há PIN pad no dispositivo para confirmar a reserva; sem logins e senhas?
A ideia principal era manter as coisas simples e estúpidas. Caso contrário, se a reserva, o início e o término do jogo exigirem muito esforço, ninguém vai querer usá-lo.
Por que o dispositivo parece tão feio industrialmente?
Porque eu não tinha cortador a laser, CNC, impressora 3D, fabricante de etiquetas coloridas, etc. Você está mais do que satisfeito em melhorá-lo e torná-lo mais bonito.
Por que não implementar um aplicativo e colar um tablet barato na parede com a mesma funcionalidade?
Aplicativos, aplicativos em todos os lugares. As pessoas gostam de interagir fisicamente com as coisas e não apenas tocar em telas planas.