Badge
REV. 0
Hardware:
- ESP8266
- 4 botões (1 de Reset, outros 3 conectados às portas GPIO 0, 12 e 13)
- Display OLED (128x64)
- Buzzer ou LED IR conectado no GPIO 16
- Socket Micro SD card
- Socket FTDI para programação
É um projeto de hardware aberto e a PCB está disponível no GitHub em https://github.com/garoa/BadgeGaroa_r2
Idéias de Uso
- Crachá de evento
- Jogo da cobrinha
Cuidados na montagem
Uma trilha acabou saindo errado no PCB. É preciso interromper um curto e soldar um jumper ligando 2 trihas.
Após essa alteração a montagem demora por volta de 1 hora e 40 minutos para o restante dos componentes.
Alguns outros cuidados são:
- Desgastar as trilhas indicadas para soldar um jumper (eu usei o terminal restante dos compontes).
- Interromper a trilha que está cruzando no lugar indicado na imagem.
- Cortar os dois pinos de plastico embaixo da chave liga e desliga que fica na lateral.
Firmware
Para gravar coisas é preciso deixar o ESP8266 em modo programação segurando o botão prog (direita) e pressionar rapidamente o reset (cima).
Arduino
- Adicionar a placa no Arduino
- Biblioteca para controlar o display: ESP8266_and_ESP32_OLED_driver_for_SSD1306_displays [1]
MicroPython
É possível instalar o MicroPython no ESP8266 e controlar o display OLED utilizando a biblioteca https://github.com/robert-hh/SH1106
Instalando pelo terminal
- Baixe o firmware na página de downloads do MicroPython: https://micropython.org/download/ESP8266_GENERIC/
- Instale o esptool com o pip:
python -m venv venv source venv/bin/activate pip install esptool
- Faça o flash do firmware na placa usando o esptool:
sudo esptool --port /dev/ttyUSB0 --chip esp8266 --baud 115200 write_flash --flash_mode keep --flash_size keep --erase-all 0x0 ESP8266_GENERIC-20250911-v1.26.1.bin
Instalando pelo Thonny
Instale o thonny:
sudo apt install thonny
- Abrir o Thonny
- Clicar no canto inferior direito (Normalmente escrito Local Python3)
- Clicar em Configure interpreter
- Trocar "Local Python3" para "MicroPython (ESP8266)"
- Clicar em "Install or update MicroPython (esptool)" abrirá outra janela.
- Colocar a porta
- ESP8266
- Clicar em Install
- Clicar em OK
ATENÇÃO A Instalação pelo MicroPython pode algumas vezes dar problema onde o ESP8266 entra em reset em loop escrevendo na serial a um bound de 74880.
Caso isso aconteça siga esses passos:
- Baixe o firmware em https://micropython.org/download/ESP8266_GENERIC/
- Abra o Thonny e vá para a tela de instalação do MicroPython
- Clique em ≡ e Show install options e depois select local MicroPython image
- coloque as configurações da imagem
Um script cheio de gambiarras e péssimas práticas de programação para testar o display, os botões e o buzzer encontra-se abaixo. O script quando executado, exibe um texto na tela, aciona o buzzer e se apertado um botão muda o texto na tela.
TODO: melhorar o código para além de exibir na tela fazer um barulho diferente para cada botão para caso o display OLED não esteja funcionando mas o buzzer sim.
from machine import Pin, I2C
from time import sleep
import sh1106
## BOTÕES ##
btn_pins = [Pin(0, Pin.IN, Pin.PULL_UP),
Pin(12, Pin.IN, Pin.PULL_UP),
Pin(13, Pin.IN, Pin.PULL_UP)]
btn_last_state = [False] * len(btn_pins)
## Display ##
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000)
display = sh1106.SH1106_I2C(128, 64, i2c, Pin(16), 0x3c)
display.sleep(False)
display.fill(0)
display.flip()
display.text('Garoa', 40, 00, 1)
display.text('Hacker', 40,20, 1)
display.text('Clube', 40, 40, 1)
display.show()
display.fill(0)
display.text('B0',0,0,1)
display.text('B12',0,10,1)
display.text('B13',0,20,1) #Não exibe
## Buzzer ##
buz = Pin(16, Pin.OUT)
def buzzer(freq=1,time=1):
for i in range(time*freq):
buz.value(0)
sleep(1/(2*freq))
buz.value(1)
sleep(1/(2*freq))
def morse_read(morse, t = 0.05, freq = 400):
for i in morse:
if i ==' ':
sleep(3*t)
elif i =='.':
buzzer(freq, t)
sleep(t)
elif i == '-':
buzzer(freq, 3*t)
sleep(t)
morse = '--. .- .-. --- .-'
morse_read(morse)
## Teste dos botões ##
while True:
sleep(0.1)
for i, btn in enumerate(btn_pins):
state = btn.value()
# Lógica invertida (LOW = pressionado) se usar pull-up
if state == 0 and not btn_last_state[i]:
btn_last_state[i] = True
print("Botão PRESSIONADO -->", i)
display.fill_rect(30,i*10,30,10,0)
display.text('ON',30,i*10,1)
elif state == 1:
btn_last_state[i] = False
display.fill_rect(30,i*10,30,10,0)
display.text('OFF',30,i*10,1)
display.show()
Coisas a implementar na próxima revisão
- Às vezes a bateria acaba e não fica possível mais programar, mesmo com o cabo FTDI conectado. Seria possível alimentar pelo FTDI? -- User:Gabriel_Almeida
- Alinhar os furos dos pinos do FTDI para colocar uma barra de pinos. Ou tem um conector melhor para colocar ali? -- User:DaniloEFBento
- Se quiser deixar os pinos em zig-zag tudo bem. Mas acho que seria bom adicionar um footprint normal ao lado pra quem quiser soldar um conector normal. -- User:Juca
- Tentar usar GPIOs independentes para o infra-vermelho e o buzzer. Do jeito que está, se endendi bem, fica impossível ter infravermelho e buzzer funcionais simultaneamente. -- User:Juca
- Colocar um footprint de chip FTDI ligado nessa USB que hoje em dia é só pra carregar. Quem quiser soldar o chip opcional, ganha a facilidade de poder instalar firmware direto pelo mesmo USB que usa para carregar a bateria. -- User:Juca
Material de Estudos / Playground / Projetos Individuais
Tutorial da Juliana Karoline: https://github.com/julianaklulo/garoa-badge
