Treadle is an open-source printed circuit board by Robsic, from the Robsic/throttle-brake-interface-board repository on GitHub. It is a 2-layer board of 92 × 59 mm with 48 parts on 67 nets, routed with 301 tracks and 39 vias.
It is built around the LMV358, SN65HVD230D and SS14, with the SZNUP2105L among its other parts. Its parts include 23 resistors, 8 connectors, 6 ICs, 6 diodes and 5 capacitors. It belongs with the interfaces and adapters boards and the STM32 boards of this library.
Interface eletrônica microcontrolada para emulação e interceptação de sinais de acelerador e freio (Drive-by-Wire) em carrinhos de golfe elétricos equipados com inversor de tração Curtis AC. O módulo traduz comandos recebidos via barramento CAN em níveis analógicos de tensão contínua exigidos pela ECU do veículo (canais Throttle e Brake), além de monitorar os pedais físicos para transferências suaves de controle (bumpless transfer) e segurança.
O módulo atua como ponte intermediária entre o computador de controle central (TI C2000 / PC Autônomo) e o controlador de motor original (Inversor Curtis AC), emulando os dois canais analógicos de comando do veículo:
$+5\text{ V}$ DC na barra de potência (VSYS do Pico)
Proteções
Diodos Schottky SS14 nas saídas de 5V dos conectores · TVS NUP2105L no barramento CAN · Terminação de $120\ \Omega$ integrada
3. Mapeamento de Conectores (Bornes KRE 5,08 mm)
J1 — Alimentação / Auxiliar 5V (2 vias)
Pino
Identificação
Descrição Elétrica
1
+5V
Barra de 5V acessada através do diodo Schottky D1
2
GND
Referência comum de alimentação e sinal
ATENÇÃO: conforme desenhado no esquemático, D1 tem anodo na barra $+5\text{ V}$ e catodo em J1-1, conduzindo da placa para fora — ou seja, J1 funciona como saída auxiliar protegida de 5 V, e não como entrada de alimentação. A alimentação da placa deve ser feita pelo conector USB do Pico ou por injeção direta de $+5\text{ V}$ na barra (VSYS). Caso a intenção seja usar J1 como entrada principal com proteção reversa, invertar a orientação de D1 antes da montagem.
J2 — Barramento CAN (3 vias)
Pino
Identificação
Descrição Elétrica
1
CAN_H
Linha diferencial CAN High (terminação de $120\ \Omega$ integrada via R1)
2
CAN_L
Linha diferencial CAN Low
3
GND
Terra de referência da rede CAN
J3 — Pedal Físico do Acelerador (3 vias)
Pino
Identificação
Descrição Elétrica
1
+5V_PEDAL
Alimentação protegida (via D2) para o sensor Hall do pedal
2
HALL_IN_PEDAL
Sinal analógico do pedal ($0{,}60\text{ V}$ a $4{,}66\text{ V}$) → ADC0
3
GND
Terra de referência do pedal
J4 — Saída de Acelerador (2 vias)
Pino
Identificação
Descrição Elétrica
1
THROTTLE_OUT
Saída analógica condicionada injetada na entrada Throttle In da ECU Curtis
2
GND
Terra de retorno da ECU
J5 — Saída de Freio (2 vias)
Pino
Identificação
Descrição Elétrica
1
BREAK_OUT
Saída analógica condicionada injetada na entrada de frenagem da ECU Curtis
2
GND
Terra de retorno da ECU
J6 — Pedal Físico do Freio (3 vias)
Pino
Identificação
Descrição Elétrica
1
+5V_BREAK
Alimentação protegida (via D6) para o sensor Hall do pedal de freio
2
HALL_IN_BREAK
Sinal analógico do pedal ($0{,}60\text{ V}$ a $4{,}66\text{ V}$) → ADC1
3
GND
Terra de referência do pedal
4. Mapa de Pinos do Raspberry Pi Pico
Validado contra o netlist exportado do esquemático (kicad-cli sch export netlist):
Pino Físico
GPIO
Periférico RP2040
Sinal / Rede
Função
6
GP4
UART1 RX (default)
/CRX
Recepção CAN (R do transceptor)
7
GP5
UART1 TX (default)
/CTX
Transmissão CAN (D do transceptor)
9
GP6
I2C1 SDA
/GPIO_6
SDA — MCP4725 do canal de freio
10
GP7
I2C1 SCL
/GPIO_7
SCL — MCP4725 do canal de freio
11
GP8
I2C0 SDA
/GPIO_8
SDA — MCP4725 do canal de acelerador (pull-up R10, 4,7 kΩ)
12
GP9
I2C0 SCL
/GPIO_9
SCL — MCP4725 do canal de acelerador (pull-up R9, 4,7 kΩ)
21
GP16
GPIO / PWM
Net-(D4-A)
LED de status D4 (via R5, 1 kΩ)
31
GP26
ADC0
/HALL_IN_PEDAL_S
Leitura do pedal do acelerador
32
GP27
ADC1
/HALL_IN_BREAK_S
Leitura do pedal do freio
36
—
3V3(OUT)
+3.3V
Regulador interno alimenta CAN, DACs, pull-ups e LED D5
39
—
VSYS
+5V
Barra de potência de 5 V
Observações de projeto:
Os dois MCP4725 têm o pino A0 aterrado (endereço I²C 0x60). Para evitarem colisão, cada um foi alocado em um barramento I²C distinto: canal de acelerador em I2C0 e canal de freio em I2C1.
O barramento I2C1 (GP6/GP7) não possui resistores de pull-up externos — o firmware deve habilitar os pull-ups internos do RP2040 (~50 kΩ, suficiente para até 100 kHz) ou prever a adição de pull-ups de 4,7 kΩ em revisões futuras.
O RP2040 não possui controlador CAN nativo: a pilha CAN deve ser implementada em software/PIO nos pinos GP4/GP5.
O pino VBUS permanece desconectado, isolando a tensão USB do resto da placa.
5. Lista de Componentes (BOM — fiel ao treadle.csv)
Designador
Qtd
Componente
Encapsulamento
Descrição
A1
1
Raspberry Pi Pico
Módulo TH/SMD
Microcontrolador RP2040
U1
1
SN65HVD230
SOIC-8
Transceptor CAN 3,3 V (modo high-speed, RS=GND)
U2, U4
2
MCP4725
SOT-23-6
DAC I²C de 12 bits com EEPROM (addr 0x60)
U3
1
LMV358
SOIC-8
AmpOp duplo rail-to-rail (unidade A = throttle, B = brake)
D1, D2, D6
3
SS14
SMA (DO-214AC)
Diodos Schottky de proteção (1 A / 40 V)
D3
1
SZNUP2105L
SOT-23
TVS dual de proteção do barramento CAN
D4, D5
2
LED
0805 SMD
D4 = status (verde) · D5 = alimentação (vermelho)
C1 – C5
5
100 nF
0805 SMD
Desacoplamento (C1, C2, C4) e filtragem dos ADCs (C3, C5)
R1
1
$120\ \Omega$
0805 SMD
Terminação da linha CAN
R2, R8, R11, R15
4
$10\text{ k}\Omega$
0805 SMD
Resistores de ganho dos AmpOps (R2, R11) e divisores dos pedais (R8, R15)
R3, R12
2
$3{,}9\text{ k}\Omega$
0805 SMD
Resistores de realimentação dos AmpOps ($R_f$)
R4, R13
2
$100\ \Omega$
0805 SMD
Proteção em série das saídas analógicas
R5, R7
2
$1\text{ k}\Omega$
0805 SMD
Limitação de corrente dos LEDs D4 / D5
R6, R14
2
$18\text{ k}\Omega$
0805 SMD
Pernas de shunt dos divisores de tensão dos pedais
R9, R10
2
$4{,}7\text{ k}\Omega$
0805 SMD
Pull-ups das linhas I²C do canal de acelerador (SDA/SCL)
J1, J4, J5
3
Borne 2 vias
Passo 5,08 mm
Alimentação / Throttle Out / Break Out
J2, J3, J6
3
Borne 3 vias
Passo 5,08 mm
CAN / Pedal Acelerador / Pedal de Freio
6. Princípio de Operação e Equações
6.1 Estágio de ganho (LMV358, configuração não-inversora)
O MCP4725 opera com $V_{ref} = V_{DD} = 3{,}3\text{ V}$. Para atingir a excursão exigida pelo inversor Curtis (até $4{,}66\text{ V}$), cada canal usa um amplificador não-inversor com ganho definido pelos valores $R_f = 3{,}9\text{ k}\Omega$ (realimentação) e $R_g = 10\text{ k}\Omega$ (para GND):
Nota de dimensionamento: o fundo de escala prático fica $\approx 1{,}6%$ abaixo do alvo nominal de $4{,}66\text{ V}$. Para atingi-lo exatamente, $R_f$ poderia ser ajustado para $\approx 4{,}12\text{ k}\Omega$ (série E96). Na prática, a curva de calibração do Curtis tolera essa margem.
Resolução do DAC: $LSB_{DAC} = \dfrac{3{,}3\text{ V}}{4096} = 0{,}81\text{ mV}$, resultando em passos de $\approx 1{,}12\text{ mV}$ na saída do módulo.
6.2 Condicionamento dos pedais (entrada ADC)
Cada pedal Hall ($0{,}60\text{ V}$ a $4{,}66\text{ V}$) passa por um divisor redutor seguido de filtro passa-baixa de primeira ordem:
O divisor garante que o sinal fique sempre dentro da faixa do ADC (0–3,3 V), com resolução equivalente a $\approx 1{,}25\text{ mV}$ por LSB referido ao conector do pedal.
Os três diodos SS14 estão orientados com anodo na barra $+5\text{ V}$, funcionando como saídas protegidas para os conectores (evitam retroalimentação da rede externa para a placa). Ver ATENÇÃO na seção 3 quanto ao papel de J1.
A barra de 3,3 V é gerada pelo regulador do próprio Raspberry Pi Pico — nenhum regulador externo é necessário.
8. Interface CAN
Item
Implementação
Transceptor
SN65HVD230 (3,3 V), pinos D←CTX (GP5) e R→CRX (GP4)
Modo
High-speed (pino RS/8 aterrado), até 1 Mbps
Terminação
R1 = $120\ \Omega$ entre CAN_H e CAN_L, integrada à placa
Proteção
TVS dual NUP2105L (catodos em CAN_H/CAN_L, anodo comum em GND)
Notas:
Como a terminação é fixa, ao integrar a placa a uma rede com outros nós terminados, medir a impedância entre CAN_H e CAN_L ($\approx 60\ \Omega$ com duas terminações) e remover R1 se necessário.
O RP2040 não possui periférico CAN nativo — utilizar pilha CAN baseada em PIO/software nos pinos GP4/GP5.
9. Contrato de Firmware (comportamento esperado)
Item
Especificação
Leitura dos pedais
ADC0 e ADC1 amostrados a $100\text{ Hz}$ por canal
Se algum pedal físico subir $\Delta V \ge 0{,}30\text{ V}$ acima do repouso, detecta intervenção humana e desarma o modo autônomo
Slew Rate / Rampas
Transições interpoladas em rampas de $150$ a $250\text{ ms}$ para mitigar solavancos (inclusive frenagem regenerativa)
Fail-safe de comunicação
Ausência de heartbeat CAN → rampa progressiva até a tensão de repouso
Estado de partida seguro
Gravar a EEPROM do MCP4725 com o código de repouso: em caso de reset, o DAC religa já em $0{,}60\text{ V}$
Falha total de potência
Com o DAC sem alimentação a saída vai a $0\text{ V}$ — fora da janela válida da Curtis, que interpreta como falha de sensor e corta torque (estado intrinsecamente seguro)
10. Checklist de Montagem e Bring-up
Inspeção visual: orientação dos diodos SS14 (catodo = banda), polaridade dos LEDs, sentido do Pico e dos bornes.
Teste de potência: aplicar/alimentar 5 V e verificar a barra +3,3 V (pino 36 do Pico) e o LED D5 aceso.
Varredura I²C: confirmar dispositivo 0x60 em ambos os barramentos (I2C0 e I2C1).
Teste dos DACs: escrever meia-escala (código 2048) e conferir $\approx 1{,}65\text{ V} \times 1{,}39 \approx 2{,}29\text{ V}$ em THROTTLE_OUT e BREAK_OUT.
Teste dos pedais: varrer os pedais fisicamente e validar a leitura dos ADCs dentro da faixa $\approx 0{,}39$–$3{,}00\text{ V}$.
Rede CAN: conectar ao barramento do veículo, verificar terminação e monitorar tráfego.
Integração com a Curtis: com o veículo suspenso (rodas livres), validar tensões de repouso ($0{,}60\text{ V}$) antes de liberar qualquer comando de aceleração.
11. Bibliotecas Locais e Setup para Git
Este projeto não depende mais de bibliotecas instaladas globalmente (~/.config/kicad/...). Todas as libs não-padrão foram copiadas para dentro do repositório, permitindo git clone reprodutível em qualquer máquina com KiCad 7/8/9/10.
Footprints dos bornes J1–J6 (apelidados "Bourns/bornes" no pedido) — são Molex genéricos para os terminais de 2/3/4 vias usados como bornes KRE/Molex
Nota "Bourns / borners": não foi localizada lib Bourns separada no sistema. O termo "bornes" refere-se aos conectores J1–J6 (seção 3). A pasta Connector_Molex atende exatamente esse papel; se no futuro houver trimpots/pots Bourns, crie libs/Bourns/ seguindo o mesmo padrão.
Tamanho:STM32F103C8T6/3dmodels/ tem ~850 MB (STEP de alta resolução). Está versionado, mas se seu remoto tiver limite (GitHub 100 MB/arquivo), use Git LFS ou limpe variantes não usadas — veja §11.4.
Tabelas usam ${KIPRJMOD} (variável do KiCad que aponta para a pasta do .kicad_pro). Isso torna o caminho relativo ao projeto, funcionando em Windows/Linux/macOS sem edição.
Requisitos: KiCad 7+ (recomendado 10.0, que gerou o projeto treadle.kicad_pro:4 versão 3).
bash
git clone <URL_DO_SEU_REPO>.git
cd treadle
kicad treadle.kicad_pro # ou abra pelo KiCad → File → Open Project
O KiCad carrega automaticamente sym-lib-table e fp-lib-table locais — não precisa instalar nada globalmente. Verifique em Preferences → Manage Symbol/Footprint Libraries → Project Specific.
treadle.kicad_pcb e treadle.kicad_sch abrem sem "missing library".
PCB não foi alterado eletricamente nesta migração, apenas as tabelas. Se vir aviso de 3D model com D:/Users/admin/... ou /home/ryan/..., é resíduo legado do footprint Blue Pill que pode ser re-atribuído depois para ${KIPRJMOD}/libs/.../3dmodels/ — não afeta fabricação.
11.4 Adicionar nova biblioteca no futuro
bash
# Exemplo: adicionar lib Bourns de trimpots
cp -a "/caminho/para/Bourns""libs/Bourns"# edite sym-lib-table (símbolos) ou fp-lib-table (footprints):# (lib (name "Bourns") (type "KiCad") (uri "${KIPRJMOD}/libs/Bourns/Bourns.kicad_sym") ...)
Dê git add libs/Bourns sym-lib-table fp-lib-table e commit.
Para repo leve sem LFS, mantenha apenas os 2 modelos usados (LQFP-48_*.step + YAAJ_BluePill_PinHeaders_No_SWD_cp.*) e apague variantes *_H_SWD, *_V_SWD, *PinSockets* (~750 MB).
11.5 Primeiro git push (se ainda não é repo)
bash
cd treadle
git init
git add sym-lib-table fp-lib-table libs/ treadle.kicad_sch treadle.kicad_pcb treadle.kicad_pro README.md treadle.csv
git status # confirme que não há caminhos absolutos: grep -r "/home/ryan" -- . deve retornar vazio
git commit -m "feat: torna libs STM32 e Molex (bornes) locais e portáveis via \${KIPRJMOD}"
git branch -M main
git remote add origin <URL>
git push -u origin main
.gitignore já ignora *.lck, *~, treadle-backups/ e *.bak* — pastas de backup do KiCad não vão para o remoto.
11.6 Checklist de portabilidade
grep -r "D:/" treadle/ só retorna resíduos opcionais de 3D (não crítico)
grep -r "/home/ryan" treadle/ vazio para sym-lib-table/fp-lib-table
CAN to WiFi Converter PCB using ESP32! This step-by-step tutorial covers schematic creation, PCB layout, and best practices for signal integrity. Perfect for automotive and IoT applications!
A CAN-controlled relay driver for a car. 21 universal channels, each of which is simultaneously a low-side output and an input — so the same board builds as a relay controller or as a switch panel, decided in firmware…
Custom 2-channel digital oscilloscope DAQ with 20MHz bandwidth. Built with a custom KiCad analog front-end (AFE) PCB, Gowin FPGA (Tang Nano 9K) for high-speed signal buffering (VHDL), and an RPi Pico MCU for SCPI-like…
It measures 92 × 59 mm and has 2 copper layers, 1.6 mm thick.
What parts does the Treadle use?
48 parts, built around the LMV358, SN65HVD230D, SS14 and SZNUP2105L. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
Where can I download the Treadle KiCad files?
From the Robsic/throttle-brake-interface-board repository on GitHub, at the commit this page was made from: the board is treadle/treadle.kicad_pcb and its schematic treadle/Chave_de_Ignição.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the Treadle design in my own project?
Its repository states no licence, so its author keeps all rights: ask Robsic before reusing the design.