Skocz do zawartości

Pomocna odpowiedź

Napisano

Cześć, chciałem przedstawić mój pierwszy projekt na forum - czujnik parkowania do auta oparty o RP Pico. Inspiracją było moje aktualne odbywanie praktyk na studiach elektrotechnicznych jako elektryk samochodowy by zapoznać się lepiej z tematem zasilania w aucie i zmierzyć się problemami skoków napięcia w aucie. Wciąż się uczę zagadnień i teorii elektrycznych więc z góry przepraszam jeżeli coś źle nazwałem lub opisałem.
Projektując go wyznaczyłem sobie za cel użyć głównie tego co miałem już u siebie w inwentarzu warsztatowym i stosując wiedzę ze studiów i kursów Forbot. Wiem, że można było zrobić to lepiej choćby stosując elementy pracujące na napięciu bezpiecznym i zgodnym z RP Pico ale nie chciałem niczego dodatkowo zamawiać i chciałem zmierzyć się z rozwiązaniem problemów które wystąpią. W ramach projektu wykonałem swój pierwszy schemat i symulacje w KiCad. Projekt nie został zaimplementowany jeszcze docelowo w aucie i jest to tylko model teoretyczny.
Najważniejsze elementy użyte w projekcie:

  • Raspberry Pi Pico (RP2040)
  • HC-SR04 (czujnik odległości)
  • Stabilizator liniowy LM7805
  • Buzzer

 

zdjecie.thumb.jpg.18ba109ab1f71e9368d12e494d8aa07a.jpg

Zdjęcie prototypu na płytkach projektowych 

Zasada działania jest prosta - cały układ ma uruchamiać się i działać wyłącznie w momencie gdy zostanie wrzucony bieg wsteczny w aucie. Aby to osiągnąc w najprostszy sposób, układ jest podłączony i zasilany z żarówki cofania. Zależnie od pracy i naładowania akumulatora może to być 12-14V więc aby osiągnąc bezpieczne 5V, dostarczane zasilanie przechodzi przez stabilizator liniowy LM7805. Na stabilizator dodałem mały radiator aby odprowadzić ciepło i unikąc uszkodzenia.
W prototypie użyłem baterii 9V aby zasymulować wyższe napięcie wejściowe dla LM7805.
W momencie uruchomienia RP Pico (zasilanego napięciem 5V przez pin VSYS) od razu startuje program napisany w C który na podstawie pomiarów z HC-SR04 informuje użytkownika sygnałem dźwiękowym i diodami LED o odległości czujnika w zderzaku do przeszkody.

Fragment kodu przedstawiający warunki sygnałów ostrzegawczych dla kierowcy z buzzera i na panelu z diodami LED:

void buzzer_set_pattern(uint32_t on_us, uint32_t period_us) {
    buzzer.on_duration_us = on_us;
    buzzer.period_us = period_us;
}

void buzzer_update() {
    uint64_t now = time_us_64();

    if (buzzer.period_us == 0) {
        gpio_put(BUZZER_PIN, 0);
        buzzer.is_on = false;
        return;
    }

    uint64_t elapsed = now - buzzer.last_toggle_us;

    if (buzzer.is_on && elapsed >= buzzer.on_duration_us) {
        gpio_put(BUZZER_PIN, 0);
        buzzer.is_on = false;
        buzzer.last_toggle_us = now;
    } else if (!buzzer.is_on && elapsed >= buzzer.period_us) {
        gpio_put(BUZZER_PIN, 1);
        buzzer.is_on = true;
        buzzer.last_toggle_us = now;
    }
}

void update_leds_and_buzzer(float distance_cm) {
    all_leds_off();

    if (distance_cm < 0) {
        buzzer_set_pattern(0, 0);
        return;
    }

    if (distance_cm > 150.0f) {
        buzzer_set_pattern(0, 0);
    } else if (distance_cm > 100.0f) { // 100cm
        gpio_led_set(1, true);
        buzzer_set_pattern(50000, 1500000);
    } else if (distance_cm > 60.0f) { // 60cm
        gpio_led_set(1, true);
        gpio_led_set(2, true);
        buzzer_set_pattern(80000, 1000000);
    } else if (distance_cm > 40.0f) { // 40cm
        gpio_led_set(1, true);
        gpio_led_set(2, true);
        gpio_led_set(3, true);
        buzzer_set_pattern(100000, 600000);
    } else if (distance_cm > 30.0f) { // 30cm
        gpio_led_set(1, true);
        gpio_led_set(2, true);
        gpio_led_set(3, true);
        gpio_led_set(4, true);
        buzzer_set_pattern(150000, 300000);
    } else {
        gpio_led_set(1, true);
        gpio_led_set(2, true);
        gpio_led_set(3, true);
        gpio_led_set(4, true);
        gpio_led_set(5, true);
        gpio_led_set(6, true);
        buzzer_set_pattern(1, 1); // praktycznie ciagly ton
    }
}

Aby zachować nieprzerwane działanie i precyzje dla tak krytycznego systemu, napisałem kod dla Pico by prowadziło asynchronicznie pomiar odległości z danych z czujnika by uniknąć "przerwań" działania programu gdybym użył po prostu funkcji delay() na czas działania buzzera. Buzzer zaczyna  wydawać sygnał dźwiękowy wg patternu i w dalszym ciągu niezależnie wykonuje się reszta kodu z głównej pętli programu. 

 

schemat.thumb.png.9e026a70414a8fdd1ec18d1fcca68eb5.png

Schemat projektu (na zielono zaznaczone elementy których brakuje w modelu na płytkach prototypowych)

 

Jako, że GPIO Pico pracują z napięciem 3,3V to zasilanie dla buzzera i HC-SR04 dostarczane jest z linii zasilania LM7805. Buzzer może pracować na napięciu ze stanu HIGH z pinu GPIO ale będzie zbyt cichy jak na warunki samochodu z pracującym silnikiem i grającym radiem. Zasilany jest więc 5V, a sterowanie jest przez tranzystor NPN BC546 z pinu GPIO. 
HC-SR04 z kursu Arduino pracuje też na 5V. Pin Trig jest pinem odbierającym sygnał z Pico i działa poprawnie z niższym napięciem 3,3V. Pin Echo wysyła sygnał do Pico więc aby uniknąć uszkodzenia przez podanie 5V na GPIO zastosowałem dzielnik napięcia z dwóch rezystorów (220R i 330R) by otrzymać bezpieczne 3V. 
Diody oznaczone D1 i D2 zostały mi polecone do dodania przez kolegę aby uniknąć "przepięć oraz napięć i prądów cofanych" (dosłowny cytat) - w tej kwestii jestem zbyt zielony jeszcze by móc ocenić poprawność tego stwierdzenia i zasadności ich umieszczenia ale raczej też nie zaszkodzą.

schemat_symulacji.thumb.png.7e1c5da93f30c06fc3b227a45554d929.png

Schemat zastępczy dla symulacji SPICE

W ramach nauki przeprowadziłem też symulacje zachowania sekcji zasilania aby sprawdzić jak zachowa się LM7805 podłączony do żarówki świateł cofania. Symulacja wykonana w KiCad na silniku SPICE. Do obsługi KiCad i odwzorowania założenia działania pomogło mi AI - Claude Sonnet 5 i Gemini 3.1 Pro, głównie przy zrozumieniu jak działa symulacja SPICE i co jak ustawić. Pomimo, że jestem entuzjastą AI jako narzędzia do pomocy i nauki to w tym wypadku zawiodło i nie potrafiło się odnaleźć w środowisku KiCada często podając błędne lub nie trafione rozwiązania które generowały kolejne problemy. 

Założenia symulacji:

  • 0-1s — Układ całkowicie odcięty od zasilania (0V), Pico nie pracuje (0mA).
  • 1-1.5s — Wrzucenie biegu wstecznego (napięcie wejściowe skacze do 14V), L7805 podaje stabilne 5V, a Pico rozpoczyna fazę bootowania (wzrost poboru prądu).
  • 1.5-5s — Układ ma stabilne zasilanie, Pico pracuje i pobiera zmienny prąd (widoczne falowanie od ok. 38mA do 90mA).
  • t=5s — Wyrzucenie biegu wstecznego: natychmiastowy zanik zasilania głównego (do 0V) i nagłe wyłączenie układu Pico (spadek poboru prądu do 0mA).
  • 5-7s — Główny obwód pozostaje wyłączony, a napięcie za stabilizatorem (niebieska linia) łagodnie opada w wyniku powolnego rozładowywania się kondensatorów.

wykressymulacji.thumb.png.da58ca630307d2409e286ec7a99ca94d.png

Wykres wynikowy symulacji

 

Docelowo układ ma być wykonany przez lutowanie na płytce uniwersalnej gdy już będę pewny bezpieczeństwa całego projektu.

Chętnie przyjmę uwagi i krytykę oraz proszę o wskazówki na przyszłość na temat projektowania schematów i używania KiCada.

  • Lubię! 2

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...