
Openridingcontroller rev2
Squalius-cephalus/OpenRidingController
D.I.Y horse riding controller for the PC.

Yêu cầu hiện tại: tám TCRT5000 trên một cung trong mặt phẳng PCB, các mặt đọc cùng hướng xuống sàn và cùng độ cao; tối ưu diện tích PCB. Người dùng đã chốt hai PCB tự thiết kế, rời vật lý: thân và đầu IR cong.
Ir array is an open-source printed circuit board by minh-vt, from the minh-vt/lfbot repository on GitHub. It is a 2-layer board of 85 × 24.5 mm with 42 parts on 22 nets, routed with 319 tracks and 49 vias.
It is built around the TCRT5000 and AO3400A. Its parts include 26 resistors, 8 ICs, 3 capacitors, 1 transistor and 1 connector.
IR-03 placement được người dùng duyệt G1 ngày 2026-10-19; chưa phát hành gia công. Hai vai bo tròn, không tai đầu/bậc giữa; header đực 1×12 gần mép trong; giữ8 TCRT5000 và mạch headroom IR-02. Schematic giữ nguyên. Outline option02 đã được khớp lại vào footprint native qua KiCad IPC; placement sensor/header không đổi. Board nguồn chưa route. Một recovery candidate bị đổi thành bản có218 cung tròn và35 lỗi DRC; đã tái tạo bản sạch rồi thử reroute riêng +3V3, tăng margin +3V3 từ0.592 lên0.9005mm. Nhưng bản thử thêm3 via-in-pad SMD và EMC analyzer báo GP-001 regression cho /IR1; dù native DRC0 lỗi/0 unconnected, bản này không được chọn làm candidate tốt hơn hoặc nhập vào nguồn. Track /IR7 vẫn0.700mm; còn26 board warnings/42 parity warnings. Xem review và log quyết định, lịch sử outline/routing. G2/fabrication chưa duyệt.
Yêu cầu hiện tại: tám TCRT5000 trên một cung trong mặt phẳng PCB, các mặt đọc cùng hướng xuống sàn và cùng độ cao; tối ưu diện tích PCB. Người dùng đã chốt hai PCB tự thiết kế, rời vật lý: thân và đầu IR cong. Không còn ưu tiên một PCB liền của M02. Cách gá theo spec và tickets, chưa freeze trong bản CAD này. Gá caster in 3D do người dùng thiết kế. BOM mua hàng vẫn là HARDWARE_BOM.csv.
J1=PinHeader_1x12_P2.54mm_Vertical (header đực thẳng, 1×12). Số chân dưới đây là số pad,
không phải thứ tự nhìn từ đầu dây. Header không có khóa; đánh dấu pad1 ở cả hai
đầu và continuity-test harness trước cấp nguồn, không đoán theo màu dây. Phân bổ DevKit theo guide chính hãng v1.1,
chưa chứng minh clone V1 có cùng header/nguồn. Carrier CAD/firmware chưa migrate
sang phân bổ này và vẫn tạm dừng; không coi bảng là dây robot đã được đấu thử.
| J1 IR | Net | GPIO / ADC1 | Header DevKit chuẩn |
|---|---|---|---|
| 1 | +5V | Nguồn LED từ buck; không nối ADC | J1.21 (rail5V; phải kiểm tra backfeed hệ thống) |
| 2 | +3V3 | Nguồn pull-up từ DevKit | J1.1 hoặc J1.2 |
| 3 | GND | Ground chung | J1.22 hoặc J3.1 |
| 4 | LED_EN | GPIO14, active high | J1.20 |
| 5 | IR0 | GPIO1 / CH0 | J3.4 |
| 6 | IR1 | GPIO2 / CH1 | J3.5 |
| 7 | IR2 | GPIO4 / CH3 | J1.4 |
| 8 | IR3 | GPIO5 / CH4 | J1.5 |
| 9 | IR4 | GPIO6 / CH5 | J1.6 |
| 10 | IR5 | GPIO7 / CH6 | J1.7 |
| 11 | IR6 | GPIO8 / CH7 | J1.12 |
| 12 | IR7 | GPIO9 / CH8 | J1.15 |
BAT_ADC dành GPIO10/ADC1_CH9, headerJ1.16, không đi qua cáp IR. Đưa nó vào cùng pattern continuous gồm9 kênh; không chạy oneshot trên ADC1 đang continuous. Không dùng ADC2 DMA hoặc GPIO3 cho IR/BAT. Giữ GPIO19/20 cho USB, 0/3/45/46 ngoài phân bổ này,35…37 cho ràng buộc bộ nhớ Octal và38/48 để tránh RGB LED khác nhau giữa các bản board. Dành11/12 cho I²C,13 cho một ToF XSHUT, 15…18 encoder;39…42 còn đủ cho bốn đầu điều khiển motor, nhưng sẽ không giữ JTAG ngoài đồng thời. Đây là phân bổ thiết kế, không sửa pin map firmware cũ.
R9…R16=10k/1% kéo lên3V3; R19…R26=33k/1% kéo từng IRi xuống GND.
Không dùng bộ chia chung cho tám mắt vì tải mỗi mắt sẽ làm lệch các mắt khác.
Ở dòng thu bằng0: V_IR = V3V3 × 33/(10+33); danh định2.533 V.
Với rail thiết kế không vượt3.6 V và cả hai R±1%, góc xấu nhất nhỏ hơn2.776 V,
so với biên2.9 V trong vùng ADC được Espressif đặc tả. Đây không phải bảo vệ
khi đấu nhầm5V hoặc chứng minh nhiễu motor đã được kiểm soát.
Trở Thevenin danh định7.674k thay vì10k: gain dòng–áp giảm khoảng23.3%. Giá trị này sửa headroom, không chứng minh gain tối ưu hoặc hết bão hòa phototransistor. Dòng thu mạnh vẫn có thể ép IR xuống sát0. Phải kiểm tra hai pha off/on không clipping; không lấy phép trừ để cứu mẫu đã bão hòa.
Không thêm100nF vào mỗi IR: RC với7.674k đã0.767 ms, không phù hợp ngân sách settling250µs dưới đây. C1/C2/C3 chỉ là tụ rail. Chưa chốt tụ/filter ADC hoặc buffer khi chưa có dữ liệu harness/SAR; nếu settling không đạt phải sửa thiết kế/timing, không tự coi nhiều mẫu liên tiếp là đã ổn định.
R1…R8=220Ω, Q1 vẫn AO3400A. Ước tính Vf1.25 V cho khoảng17mA/mắt và136mA cả tám; đây không phải dòng đo. Buck/harness phải cấp được dòng LED cùng logic trong khi giữ rail; tụ10µF không tự cấp toàn bộ xung LED. R18 kéo gate về GND lúc reset; bắt đầu capture với LED_EN thấp.
Mục tiêu thiết kế, chưa triển khai hoặc đo: ADC1 continuous72kSa/s tổng, 9 kênh theo bảng + BAT, ATTEN3/12bit và calibration từng chip. Một scan125µs; mỗi kênh8kSa/s. Hai pha trong chu kỳ2ms:
| Pha | Bỏ sau cạnh LED | Thu | Thời gian conversion |
|---|---|---|---|
| Off | 2 scan =250µs | 4 scan đầy đủ =500µs | 750µs |
| On | 2 scan =250µs | 4 scan đầy đủ =500µs | 750µs |
Còn500µs trong chu kỳ2ms cho lịch/biên DMA/thu thập/xử lý. Chuyển pha theo mốc thời gian, không giả định LED đổi đúng cạnh DMA. Bỏ mọi scan chạm cạnh, chỉ ghép off/on đủ8 mắt trong cùng chu kỳ và đúng channel ID. BAT đọc trong pattern, lọc riêng; không đổi pattern hoặc dừng ADC để đọc pin.
72k nằm trong giới hạn header IDFv5.5.1 tham chiếu; phải kiểm tra version và nhịp hiệu dụng thật khi triển khai.250µs là budget, không phải thời gian đáp ứng TCRT đã đo. Bảo toàn timestamp/age, clipping, overflow và deadline; nếu không đạt phải báo mẫu không hợp lệ/đi an toàn, không tái dùng frame cũ như mới. Không block hoặc xử lý điều khiển trong ISR. ESP32/HIL vẫn là công việc riêng.
Nguồn pin/ADC: DevKitC-1 v1.1, ADC continuous, ESP32-S3 Datasheet Table2-8/5-5/5-6; bản tải và phép tính ở recovery của review.
Một phương án có ý nghĩa hình học là cung có tâm tại trung điểm trục hai bánh. Đó là lựa chọn thiết kế để các vị trí danh định có cùng khoảng cách tới trục, không phải kết luận rằng phương án này tối ưu thời gian thi đấu.
Với trục x hướng trước, y hướng ngang, bán kính R và góc bố trí θᵢ:
xᵢ = R cos(θᵢ)
yᵢ = R sin(θᵢ)
θᵢ = (i − 3,5) Δθ, i = 0…7 [nếu chọn chia đều góc]Nếu p là khoảng cách dây cung giữa hai vị trí kề nhau:
Δθ = 2 asin(p / (2R))
W = 2R sin(3,5 Δθ)Nếu xác định trước bề rộng dây cung W và độ võng h tính từ đỉnh cung danh định đến dây nối hai vị trí ngoài cùng (cung trước không vượt nửa vòng: 0 < h ≤ W/2):
R = W² / (8h) + h/2
h = R − sqrt(R² − (W/2)²)Đây là hệ thức hình học, không phải công thức tối ưu điều khiển. Với tám mắt chia đối xứng sẽ không có mắt nằm đúng tại đỉnh cung; hai mắt giữa ở ±Δθ/2. Tâm bố trí footprint cũng không mặc nhiên là tâm vùng nhạy quang học thực tế. Pitch 12 mm của layout thẳng cũ chưa phải yêu cầu đã chứng minh cho array cong.
Không lấy bán kính đường đua làm bán kính array. Không suy R từ riêng bề rộng line 20 mm, kích thước tối đa robot hoặc một PCB mẫu trên mạng.
Dùng outline lưỡi liềm liền mạch theo vùng cảm biến và giao diện, không giữ nguyên tấm chữ nhật 100 × 30 mm rồi chỉ dời cảm biến. IR-03 giữ LED ở r74.5; pull-up/shunt chia hàng phía ngoài, Q1/gate gần mép trái; header đực gần mép trong. Không xung đột ngàm, vùng hàn, lỗ gá hoặc hy sinh đường hồi LED/GND để giảm diện tích.
So sánh cả diện tích vật liệu và bounding box; không giảm diện tích bằng cách bỏ khoảng hở chế tạo, độ bền vùng lỗ gá hoặc chỗ đi dây. Phải kiểm tra các thân linh kiện đã xoay và toàn bộ footprint/lỗ ngàm, không chỉ khoảng cách tâm. Đổi hướng thân TCRT5000 còn đổi hướng cặp phát/thu; không mặc định nó chỉ là một thao tác đóng gói cơ khí.
Ảnh người dùng là mẫu bố cục, không phải nguồn kích thước/pinout. M03-IR03 giữ đầu tách rời vật lý khỏi thân bằng hai liên kết G10 dogleg không đồng. Bản vẽ và tọa độ nguồn đã cập nhật outline lưỡi liềm, giữ tọa độ lỗ/slot, liên kết và giao diện header; không đổi carrier CAD.
Nhìn từ F.Cu/mặt trên, phía trước hướng lên: boardX=100−vehicleY,
boardY=137.5−vehicleX, góc TCRT B.Cu=90+θ. U1/IR0 ở phía phải robot
(y−28), U8/IR7 ở phía trái(y+28). IR-02 đã sửa phép đổi dấu Y trước đây;
không mirror kênh thêm lần nữa chỉ vì đang xem mặt B.Cu từ dưới.
OptoDevice:Vishay_TCRT5000; symbol local đánh số
1=C,2=E,3=K,4=A. Không đổi trực tiếp sang CNY70 có thứ tự chân khác.Biên native hiện gồm 226 đoạn thẳng lấy mẫu trong IR_Array:Outline_IR03, khớp contour SVG option02; điểm giữa mép sau là vehicle x64.75 mm. MP1 được refresh và lưu qua IPC khi board đang mở. DRC placement hiện có83 unconnected,26 cảnh báo board (8 library mismatch,16 silk-over-copper,2 silk-overlap) và42 parity warnings; chưa có invalid outline, copper-edge clearance, pad hoặc hole conflict mới. Board nguồn còn0 track/via/zone; chưa áp dụng routing.
Sau chốt placement: routing sau G1 → ERC/netlist/DRC → review pad/mask/drill/
cơ khí → bộ xuất.
Đọc LED-off/on không phục hồi dữ liệu đã bão hòa vì ánh sáng môi trường.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 8 | 10k | Resistor_SMD:R_0805_2012Metric | R9, R10, R11, R12, R13, R14, R15, R16 |
| 8 | 220R | Resistor_SMD:R_0805_2012Metric | R1, R2, R3, R4, R5, R6, R7, R8 |
| 8 | 33k | Resistor_SMD:R_0805_2012Metric | R19, R20, R21, R22, R23, R24, R25, R26 |
| 8 | TCRT5000 | OptoDevice:Vishay_TCRT5000 | U1, U2, U3, U4, U5, U6, U7, U8 |
| 2 | 100nF | Capacitor_SMD:C_0805_2012Metric | C1, C3 |
| 2 | MountingHole_2.2mm_M2 | MountingHole:MountingHole_2.2mm_M2 | H1, H2 |
| 1 | 100k | Resistor_SMD:R_0805_2012Metric | R18 |
| 1 | 10uF 16V X7R | Capacitor_SMD:C_1206_3216Metric | C2 |
| 1 | 1k | Resistor_SMD:R_0805_2012Metric | R17 |
| 1 | AO3400A | Package_TO_SOT_SMD:SOT-23 | Q1 |
| 1 | Outline_IR03 | IR_Array:Outline_IR03 | MP1 |
| 1 | PinHeader_1x12_P2.54mm | Connector_PinHeader_2.54mm:PinHeader_1x12_P2.54mm_Vertical | J1 |
It measures 85 × 24.5 mm and has 2 copper layers, 1.6 mm thick.
42 parts, built around the TCRT5000 and AO3400A. 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.
From the minh-vt/lfbot repository on GitHub, at the commit this page was made from: the board is hardware/ir-array/ir-array.kicad_pcb and its schematic hardware/ir-array/ir-array.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask minh-vt before reusing the design.

Squalius-cephalus/OpenRidingController
D.I.Y horse riding controller for the PC.


xtarke/automated_buggy
This shield connects microcontroller (MSP-EXP430FR2355) pins to the car's power board. Go to Power Board for more hardware information.

Amrlxyz/esp-lfr-buggy
2nd Year Embedded Systems Project (ESP) - Line Following Robot Buggy


ciiiutnfrc/eduromaa
Versión educativa del robot móvil RoMAA (EduRoMAA)

billtsol/Maze
This project demonstrates how to use an Arduino board, IR sensors, and a motor driver shield to create a maze-solving robot.

Potato-eater/Legacy2026
github repo for Robocup Junior Australia lightweight soccer team