Wszystkie realizacje
IOT · 2026 · Projekt prywatny

WETI PG Bezkontaktowy miernik odległości (ultradźwiękowy)

Ultradźwiękowy miernik odległości na ATtiny1616, mierzący dystans 10–50 cm z błędem RMSE ~2,4 mm. Metoda hybrydowa: pomiar czasu przelotu echa 40 kHz + docinanie fazą nośnej (filtr Goertzela) i kompensacja temperatury termistorem NTC. Firmware w czystym AVR-GCC, na rejestrach (bez Arduino), tryb uśpienia ~0,9 mW. Koszt elementów 43,73 zł.

Błąd RMSE
2,4 mm
Zakres
10–50 cm
Pobór mocy
0,9 mW
IOT

Przegląd

Celem było zbudowanie taniego, dokładnego dalmierza ultradźwiękowego na jednym 8-bitowym mikrokontrolerze — z dokładnością milimetrową i poborem mocy pozwalającym na pracę z baterii. Projekt na konkurs „Wygraj Indeks WETI 2026".

Metoda

Zastosowałem hybrydę Pulse-Phase Ranging: zgrubny pomiar czasu przelotu (ToF) z obwiedni echa, dociągany fazą nośnej 40 kHz liczoną filtrem Goertzela.

ATtiny1616 ──burst 40 kHz──▶ BC817 ──▶ nadajnik US ))) cel ((( odbiornik US ──▶ MCP6002 ──▶ ADC ──▶ ToF + faza ──▶ odległość

Jak działa pomiar

  1. MCU generuje paczkę 40 kHz (dokładny rezonans przetwornika), wzmacnianą BC817.
  2. Echo wzmacnia dwustopniowy tor na MCP6002 (filtr pasmowy ~40 kHz), bramkowany P-MOSFET-em dla oszczędności energii.
  3. ADC próbkuje obwiednię echa; początek echa (onset, próg 40 % szczytu z interpolacją) daje czas przelotu mierzony licznikiem TCB0 (100 ns/takt).
  4. Filtr Goertzela wyznacza fazę nośnej, dociągając wynik do siatki λ/2 ≈ 4,3 mm.
  5. Termistor NTC koryguje prędkość dźwięku: c(T) = 331,3 + 0,606·T.
Klucz do dokładności: onset liczony przy 40 % szczytu obwiedni (niezależny od amplitudy echa) + mediana z 9 strzałów z odrzucaniem outlierów (MAD). To ścięło błąd losowy z ~4 mm do ~1,5 mm.

Filtr Goertzela (faza)

// Goertzel @ 40 kHz na buforze próbek echa -> faza nośnej float cw = cosf(omega), coeff = 2.0f * cw, s1 = 0, s2 = 0; for (int k = 0; k < W; k++) { float x = echo[k] - baseline; float s0 = x + coeff * s1 - s2; s2 = s1; s1 = s0; } float phase = atan2f(s2 * sinf(omega), s1 - s2 * cw);

Energia

Między pomiarami mikrokontroler śpi w trybie Standby, budzony z RTC/PIT; tor analogowy zasilany jest tylko na czas pomiaru. Pobór spoczynkowy: 0,9 mW.

Efekt

Zmierzony błąd RMSE ≈ 2,4 mm w całym zakresie 10–50 cm, pobór 0,9 mW, koszt elementów 43,73 zł. Całość na jednym ATtiny1616, firmware na rejestrach (bez Arduino), z kalibracją 2-punktową zapisywaną w EEPROM.

Rezultaty

2,4 mm
Błąd RMSE
10–50 cm
Zakres
0,9 mW
Pobór mocy
43,73 zł
Koszt BOM

Masz podobny problem? Porozmawiajmy.

Umów rozmowę