octobot

Public

@deivid-negoita

Download board files

Files for version 1. Pick what you came for.

Share octobot

Check access before sharing the link.

Who can open this board

Anyone can open this board. No sign-in is required.

This link opens the latest version. Copying it does not grant additional access.

Loading 3D model… large boards can take a moment.

README

Octobot

An eight-legged walking robot with 24 servos, built end to end. The chassis and legs are CAD. A custom ATmega32U4 board drives every servo. A browser workbench rigs the CAD model and solves its inverse kinematics.

The workbench runs live in the browser: https://deivid-negoita.github.io/octobot/. It needs no install and no build step.

The robot carries environmental-monitoring, 3D-scanning and speleological payloads. Those payloads need the legs to place feet accurately on uneven ground, which a fixed gait cannot do. The kinematics workbench in this repository exists to solve that.


What is here

FolderContents
kinematics/Browser workbench and locomotion sandbox. Three.js, no build step.
hardware/KiCad 7 project for the 24-channel servo control board.
mechanical/STEP exports of the chassis and a single leg.
docs/Hardware notes, kinematics notes and the bill of materials.

The embedded firmware lives in a separate repository and is not included here.


Run the kinematics workbench

The workbench runs in the browser with nothing to install: https://deivid-negoita.github.io/octobot/. It is a static site, published from kinematics/ by .github/workflows/pages.yml on every push to main. A fork gets its own copy after enabling Settings → Pages → Source → GitHub Actions once.

To run it locally instead: the pages load ES modules, so they need an HTTP server. Opening index.html from the filesystem gives you a blank screen and a CORS error in the console.

cd kinematics/tools
python serve.py          # or double-click start.bat on Windows

Open http://localhost:8123. The chassis mesh is about 12 MB, so the first load takes a few seconds. A progress bar reports the download.

Two pages share the model:

index.html, the IK workbench. The CAD model rigs itself on startup. The loader finds the feet from the mesh geometry, then builds a hip-yaw → shoulder-pitch → knee-pitch chain per leg on the real servo shaft axes. It binds every servo, bracket and casing to the link it is screwed to. You get eight chains named LEG-1 to LEG-8. Drag the cyan target and that leg solves toward it in real time while the servo angles update. Press Space to run a gait.

playground.html, the locomotion sandbox. Drive the robot with W A S D over terrain blocks you spawn and drag. The feet land on the block surface or the ground by analytic sampling, and the body rides at the average support height. Live servo angles for all 24 joints stream into the telemetry panel.

KeyAction
1 / 2JOINTS / SOLVE mode (workbench)
Spacestart or stop walking (workbench)
Hopen the help card (workbench)
Pshow or hide the panels (both pages)
W A S Dwalk (playground)
Q / Elower or raise the body (playground)
Ytoggle the onboard camera view (playground)

Read docs/kinematics.md for the solver, the collision guard and the gait model.


The control board

One board drives all 24 servos. An ATmega32U4 talks over I²C to two PCA9685 16-channel PWM drivers, which gives 32 channels for the 24 servos and leaves headroom for sensors. An SY8303 synchronous buck regulator supplies the servo rail from the battery, and a P-channel MOSFET on the input protects against reverse polarity.

The 24 servo headers sit on two separate power rails of 12, so the inrush of one group of legs cannot brown out the other. An HC-12 radio module plugs into a 4-pin header on D8 and D9. Running the link on a software UART keeps the hardware USART free and lets the antenna sit away from the servo wiring. The board is a 4-layer design with 120 placements, an AVR-ISP header, a DIP switch and two tactile buttons.

Building 24 servo channels from discrete drivers would have cost more and taken more board area than the two PCA9685s do.

hardware/fabrication/ holds the package the board house was sent. It carries gerbers for all four copper layers, both drill files, the IPC netlist, the placement file and the BOM. Read docs/hardware.md for the rail split, the power path and the pin assignment of every header.

Bill of materials

120 placements over 33 lines: 87 SMT and 33 through-hole. The table is read out of the layout by hardware/tools/gen_bom.py rather than typed. --check re-groups the fabrication BOM the same way and compares it designator by designator, so this list cannot quietly go stale:

python hardware/tools/gen_bom.py --check
120 placements match octobot-controller-bom.csv exactly.
QtyValueManufacturer partPackageRefFunction
2PCA9685PW/Q900_118NXPSOP65P640X110-28NU1–U216-channel 12-bit PWM generator. 12 channels used each, at 0x40 and 0x41.
1ATmega32U4-MMicrochipQFN-44-1EP_7x7mm_P0.5mm_EP5.2x5.2mmU3Host MCU. Native USB, 16 MHz crystal, I2C master.
1AVR-ISP—AVR-ISPU4ISP header on D14/D15/D16 and RESET.
1SY8303AICSilergySOT65P280X110-8NIC1Synchronous buck. VIN down to the 5.0 V logic rail set by R11/R12.
3LED—LED_0201_0603MetricD1, D3–D4Power, RX and TX indicators.
14,7 uHWurth Elektronik 74477130477447714220L1Buck output inductor.
1Crystal_GND24—CRYSTAL-SMD-5X3.2-4PADY1MCU clock, loaded by C1/C3.
1HPZR-C10XNexperiaHPZRC10XD510 V regulator diode. Clamps the pass FET gate.
1RQ3E075ATTBROHM SemiconductorRQ3E075ATTBQ1P-channel MOSFET. Reverse-polarity pass element on the input.
28Conn_01x03_Pin—PinHeader_1x03_P2.54mm_VerticalJ2–J8, J10–J14, J17–J30, J32–J3324 servo headers (GND / rail / signal), 2 rail feeds (J29/J30), 2 analog headers (J32/J33).
41x2—PinHeader_1x02_P2.54mm_VerticalJ9, J16, J31, J34Input power (J9), 5 V taps (J16/J34), I2C breakout (J31).
147346-0001MolexMOLEX_47346-0001J1USB micro-B receptacle. Programming and 5 V input.
1Conn_01x04_Pin—PinHeader_1x04_P2.54mm_VerticalJ15HC-12 radio header: 5 V, GND, D8, D9.
2TL3365AF180QGE-SwitchSW_TL3365AF180QGS1–S2Reset (S1) and user button on D12 (S2).
1DS04-254-2-03BK-SMTCUI DevicesDS04254203BKSMTS33-position DIP switch on D14/D15/D16.
24220 Ohm—R_0603_1608MetricR31–R54Series resistor on each servo signal line.
2010K—R_0603_1608MetricR1, R5, R8, R10, R14, R16–R30PWM address and OE straps, I2C pull-ups, buck enable.
21K—R_0402_1005MetricR7, R9LED series resistors.
222 Ohm—R_0603_1608MetricR2–R3USB D+/D- series termination.
1100K—R_1206_3216MetricR15Pass FET gate pull-down.
1100K Ohm—R_0805_2012MetricR13Buck switching-frequency set resistor.
110KOhm—R_0603_1608MetricR4RESET pull-up.
1110K Ohm—R_0805_2012MetricR11Buck feedback divider, upper leg.
115K Ohm—R_0805_2012MetricR12Buck feedback divider, lower leg.
11KOhm—R_0603_1608MetricR6LED series resistor.
610uF—C_0805_2012MetricC4–C5, C18–C19, C22–C23Rail decoupling.
20,1uF—C_0603_1608MetricC17, C21Decoupling.
218pF—C_0603_1608MetricC1, C3Crystal load capacitors.
21uF—C_0805_2012MetricC2, C8USB UCAP and buck input decoupling.
2875075161013Wurth ElektronikCAPAE1030X1240NC6, C9Aluminium electrolytic. Bulk storage, one per servo rail.
10.1uF—C_0805_2012MetricC7AREF decoupling.
110nF—C_1206_3216MetricC20Buck bootstrap.
112 pF—C_1206_3216MetricC16Buck feedback feed-forward.

120 placements over 33 lines: 87 SMT and 33 through-hole.

Distributor part numbers are not tracked in the KiCad project, so an assembly house needs those added at order time.


Mechanical

mechanical/ holds STEP exports of the assembled chassis and of a single leg. Every part is 3D printed. The chassis was modelled in Autodesk Fusion 360, and kinematics/models/octobot.glb is the mesh export the web app loads.

STEP files are text and compress to roughly 15% of their size, so the repository carries the zips and ignores the loose exports. The chassis is 52 MB unpacked and 7.7 MB zipped. Unzip before opening in CAD:

cd mechanical
unzip octobot-chassis.step.zip

Tooling

kinematics/tools/ holds the development scripts:

python serve.py          # static server with caching disabled
python verify.py         # drive both pages in Chromium, fail on any console error
python shots.py          # regenerate the README screenshots

verify.py and shots.py need Playwright:

pip install playwright && playwright install chromium

verify.py boots each page and asserts that the rig produced eight legs. It then exercises the help modal, toggles the panels, runs the gait, spawns a terrain block and walks the robot. It exits non-zero if the browser logged an error.


Built with

Three.js 0.160 loaded from a CDN, plain ES modules, no bundler and no dependencies to install. KiCad 7 for the board. Autodesk Fusion 360 for the mechanics.

License

MIT. See LICENSE.

Comments

No comments yet. Be the first to ask about this board.

Ask about this board

Sign in to BoardRepo

New here? Signing in creates your account; there is no separate sign-up.