Dziennik budowy
Build log

Jak to powstaje.

How it's built.

Dokumentuję postępy bez filtra — hardware, firmware, decyzje, błędy i wnioski. Od rozmowy na łące do modułu centralnego z dwoma multiplekserami.

Documenting progress unfiltered — hardware, firmware, decisions, mistakes and takeaways. From a conversation on a meadow to a central module with two multiplexers.

Kiedy informatyk jedzie z ortopedą na rower

When a software guy rides with an orthopaedist

Paweł jest ambitnym ortopedą. Potrafi opowiedzieć o swojej pracy w taki sposób, że zaczynam widzieć ciało ludzkie jako system danych — sygnałów, wzorców, odchyleń. Rozmawialiśmy dużo o tym jak się stawia diagnozy, jak zbiera się dane o ciele, co lekarz tak naprawdę widzi a czego nie widzi. Ta rozmowa — gdzieś na szlaku, przy rowerach rzuconych na trawę i zaśnieżonych Karkonoszach w oddali — naprowadziła mnie na pomysł.

Wróciłem do domu z pomysłem. Wycieczka kosztowała nogi. Projekt zaczął kosztować weekendy.

Paweł is an ambitious orthopaedist. He can describe his work in a way that makes you start seeing the human body as a data system — signals, patterns, deviations. We talked a lot about how diagnoses are made, how data about the body is collected, what a doctor actually sees and what they don't. That conversation — somewhere on the trail, with bikes thrown on the grass and snow-capped Karkonosze mountains in the distance — led me to the idea.

I came home with an idea. The ride cost me my legs. The project started costing me weekends.

Wycieczka rowerowa w Karkonoszach — geneza projektu AIMotion

Karkonosze, zima 2024/2025. Paweł odpoczywa w tle.

Karkonosze mountains, winter 2024/2025. Paweł resting in the background.

Pierwszy czujnik, pierwsza dioda

First sensor, first LED

MPU-6050 na Dupont kablach, ESP32 na breadboardzie, ThinkPad z Arduino IDE. Upload error status 74 — to był pierwszy komunikat który zobaczyłem. Nie odpowiedź czujnika, tylko błąd sterownika. Dwa wieczory na rozgrzebanie tematu, zmiana sterownika USB, próba ponowna. Czerwona dioda zapaliła się. Dane poleciały do Serial Monitora. Pierwsza reakcja: zaskoczenie jak szybko to zadziałało.

MPU-6050 on Dupont cables, ESP32 on a breadboard, ThinkPad with Arduino IDE. Upload error status 74 — that was the first message I saw. Not sensor data, just a driver error. Two evenings digging into it, changing the USB driver, trying again. The red LED lit up. Data streamed into Serial Monitor. First reaction: surprise at how quickly it worked.

Pierwsza sesja — ESP32 z IMU na laptopie Pierwszy czujnik IMU z czerwoną diodą

Dzień zero: IMU na klawiaturze laptopa, błąd uploadu w IDE. Kilka dni później — pierwsza czerwona dioda i żywe dane.

Day zero: IMU on the laptop keyboard, upload error in the IDE. A few days later — first red LED and live data.

Pierwszy multiplekser i chaos na breadboardzie

First multiplexer and breadboard chaos

MPU-6050 ma stały adres I2C — 0x68 lub 0x69. Żeby podłączyć 10 czujników jednocześnie potrzeba multipleksera TCA9548A. Każdy kanał multipleksera otwiera osobną szynę I2C. Logika prosta, okablowanie — już mniej. Zdjęcie ze stołu mówi wszystko: kable w każdą stronę, szpula AWG obok, lutownica na standby.

The MPU-6050 has a fixed I2C address — 0x68 or 0x69. To connect 10 sensors simultaneously you need a TCA9548A multiplexer. Each multiplexer channel opens a separate I2C bus. Simple logic, less simple wiring. The photo from the workbench says it all: cables in every direction, AWG spool nearby, soldering iron on standby.

Breadboard z multiplekserami i kablami Zbliżenie na okablowanie breadboardu

Stół warsztatowy w trakcie budowy. ESP32 + TCA9548A + MPU-6050 — jeszcze bez ładu.

Workbench during the build. ESP32 + TCA9548A + MPU-6050 — no order yet.

Lupa, kleszcze i bus 20-kablowy

Magnifier, clamps, and a 20-cable bus

Kable zasilające wymagają lutowania — złącza goldpin przy ruchu się poluzują. Każde połączenie przechodzi przez lupę, kleszczykami pomocniczymi, osłona termokurczliwa na końcu. Na kabelku widać datę: 15/07/25.

Power lines need soldering — goldpin connectors loosen with movement. Each joint goes under the magnifier, helping clamps, heat shrink at the end. The cable is dated 15/07/25. Cables are colour-coded — one colour, one signal, no mistakes allowed.

Lutowanie pod lupą — kable zasilające Moduł MPU-6050 z bliska na drewnie

Lutowanie linii zasilających pod lupą. Obok — MPU-6050, 3×3mm czujnik który mierzy przyspieszenie i orientację w 6 osiach.

Soldering power lines under the magnifier. Beside it — the MPU-6050, a 3×3mm sensor measuring acceleration and orientation on 6 axes.

Moduł centralny — ESP32 + 2× TCA9548A

Central module — ESP32 + 2× TCA9548A

Moduł centralny jest gotowy: ESP32 na górze, dwa multipleksery TCA9548A poniżej, bus 20-kablowy wychodzący na dół. Dwa multipleksery dają 16 kanałów I2C — wystarczy na 10 czujników z zapasem. Teraz trwa finalizacja okablowania i weryfikacja schematu przed ostatecznym montażem. Kable biegną pod układami, więc każda zmiana po fakcie jest droga.

The central module is ready: ESP32 on top, two TCA9548A multiplexers below, a 20-cable bus exiting at the bottom. Two multiplexers provide 16 I2C channels — enough for 10 sensors with room to spare. Currently finalizing the wiring and verifying the schematic before final assembly. Cables run under the chips, so any post-assembly change is expensive.

Moduł centralny ESP32 + 2× TCA9548A — widok z góry Moduł centralny z kablami busu Czujnik IMU MPU-6050

Moduł centralny — ESP32 + 2× TCA9548A (HW-617). Po lewej: wersja bez kabli. Po prawej: z busem wychodzącym na zewnątrz.

Central module — ESP32 + 2× TCA9548A (HW-617). Left: without cables. Right: with the external bus.

Koniec ery breadboardu — PCB w produkcji

End of the breadboard era — PCB in production

Bus 20-kablowy przetestowany — każde połączenie przedzwonione i zweryfikowane względem schematu. To zamyka etap breadboardu. Razem z Pawłem G. przenieśliśmy układ na płytkę drukowaną: kilka iteracji schematu w KiCad, złącza goldpin 2,54 mm, okablowanie na 10-żyłowym kablu YTDY z pełnym mapowaniem kolorów na sygnały.

Po drodze analiza budżetu mocy: stabilizator LDO na płytce ma zapas w stanie ustalonym, ale przy jednoczesnych burstach WiFi TX i wszystkich 10 aktywnych czujnikach zbliża się do granicy termicznej. Wniosek zapisany do kolejnej rewizji. 10 płytek zamówionych w JLCPCB — czekamy na przesyłkę.

The 20-cable bus is tested — every connection continuity-checked and verified against the schematic. That closes the breadboard chapter. Together with Paweł G. we moved the design onto a printed circuit board: several schematic iterations in KiCad, 2.54 mm goldpin connectors, wiring on a 10-core YTDY cable with a full color-to-signal mapping.

Along the way, a power budget analysis: the onboard LDO regulator has headroom at steady state, but during WiFi TX bursts with all 10 sensors active it approaches its thermal limit. Noted for the next revision. 10 boards ordered from JLCPCB — waiting for the shipment.

Schemat AIMotion w KiCad — ESP32, 2× TCA9548A, złącza czujników Render 3D płytki PCB AIMotion

Schemat w KiCad (kliknij, żeby powiększyć) i render 3D płytki. Złącza Conn_Leg1, Conn_Leg2 i Conn_UpperBody prowadzą do trzech grup czujników; rządek I2C2_3–7 to kanały drugiego multipleksera.

KiCad schematic (click to enlarge) and the 3D board render. Conn_Leg1, Conn_Leg2 and Conn_UpperBody feed the three sensor groups; the I2C2_3–7 row exposes the second multiplexer's channels.

Protokół pomiarowy i stacja operatorska

Measurement protocol and the operator station

Najważniejsza lekcja tego etapu: powtarzalność pomiaru zależy bardziej od standaryzacji zadań niż od samych czujników. Każde zadanie w protokole dostało jawne ograniczenia — wysokość krzesła, tempo, głębokość ruchu. Protokół jest zakotwiczony w walidowanych testach klinicznych (Timed Up and Go, 5× wstawanie z krzesła), a między zadaniami wstawiamy krótkie okna spoczynku do re-zerowania biasu żyroskopów.

Do prowadzenia badania powstała przeglądarkowa stacja operatorska: przyjęcie pacjenta z antropometrią → preflight wszystkich 10 czujników → protokół z fazami czasowymi i bramkowanymi, z pauzą, powtórzeniem i znacznikami strukturalnymi wysyłanymi do backendu. Uczciwie o ograniczeniu: MPU-6050 nie ma magnetometru, więc rotacje w płaszczyźnie poprzecznej dryfują — zadania rotacyjne traktujemy ostrożnie, a ścieżka rozwoju prowadzi do czujników klasy BNO085. Cel najbliższych tygodni: pierwsza demonstracja w gabinecie fizjoterapeutycznym we Wrocławiu.

The key lesson of this stage: measurement repeatability depends more on task standardization than on the sensors themselves. Every task in the protocol now has explicit constraints — chair height, tempo, movement depth. The protocol is anchored to validated clinical tests (Timed Up and Go, 5× Sit-to-Stand), with short rest windows between tasks to re-zero gyroscope bias.

To run the session, a browser-based operator station was built: patient intake with anthropometrics → preflight of all 10 sensors → the protocol with timed and gated phases, pause, redo, and structured markers sent to the backend. Honest about the limitation: the MPU-6050 has no magnetometer, so transverse-plane rotations drift — rotation-heavy tasks are treated with caution, and the upgrade path leads to BNO085-class sensors. Goal for the coming weeks: a first demonstration at a physiotherapy clinic in Wrocław.

Stacja operatorska AIMotion — pełna checklista protokołu z fazami TIMED, REST i GATED Stacja operatorska AIMotion — sesja w toku, aktywna faza przysiadu i strumień markerów

Po lewej: pełna checklista protokołu — fazy czasowe (TIMED), okna spoczynku ZUPT (REST) i zadania bramkowane (GATED) kończone decyzją operatora. Po prawej: sesja w toku — aktywny przysiad z licznikiem, a w panelu markerów każda granica fazy zapisana ze znacznikiem czasu, gotowa do wysyłki do backendu.

Left: the full protocol checklist — timed phases (TIMED), ZUPT rest windows (REST) and gated tasks (GATED) ended by operator decision. Right: a session in progress — active squat with a live timer, and in the marker panel every phase boundary logged with a timestamp, ready to be streamed to the backend.

Pirat i lutownica

Pirate and a soldering iron

Syn postanowił że do lutowania trzeba mieć kapelusz pirata. Trudno się nie zgodzić. Trzymał lutownicę, ja kierowałem — pierwsze połączenie wyszło lepiej niż niejedno moje. Projekty techniczne mają to do siebie, że naturalnie przyciągają ciekawość. Szczególnie gdy jest zapach cyny i coś naprawdę się dzieje.

My son decided that soldering requires a pirate hat. Hard to argue with that. He held the iron, I guided — the first joint came out better than some of mine. Technical projects have a way of naturally attracting curiosity. Especially when there's the smell of solder and something is actually happening.

Lutowanie z synem — kapelusz pirata i lutownica Syn przy lutownicy — pierwsze połączenie

Pierwsze lekcje lutowania. Kapelusz obowiązkowy.

First soldering lessons. Hat mandatory.