Skuterowy starter, drugie odpalanie

Przygotowanie

Obudowa

Obudowa została zaprojektowana w Autodesk Fusion i wydrukowana na EasyThreed Nano. Przewody zostały wyprowadzone przez otwory z przodu i wpięte w kostki dla łatwiejszego pod/odłączania. Całość została skręcona trytytkami opaskami zaciskowymi.

...dopiero po złożeniu wszystkiego stwierdziłem, że lepiej byłoby dać przyciski z jednej strony a przewody wyprowadzić z drugiej, no ale niech już tak zostanie.

Podłączenie

Żeby łatwo można było wszystko podłączać i odłączać, oraz żeby nic nie rozłączyło się w trakcie jazdy, postanowiłem użyć kostek elektrycznych. Plan zakładał przecięcie niektórych przewodów i połączenie ich kostkami. Ponieważ większość rzeczy w moim układzie podpięta jest równolegle, przewody idące do niego byłyby wpięte dodatkowo, obok fabrycznych. Z ciężkim sercem oraz pełen obaw, czy aby nie popełniam jakiegoś strasznego błędu, ruszyłem przecinać przewody w moim jedenastoletnim skuterku.

Na początek poszły przewody od stacyjki (oraz gaszenia silnika). Mogłem dzięki temu podłączyć na szybko układ i sprawdzić czy moje założenia są poprawne - na szczęście okazało się, że tak: wszystko działa, nic się nie zepsuło.

Po chwili było po bólu. Układ został podłączony, można więc było przystąpić do testów.

Testy

Testowe uruchomienie - ponownie - pokazało, że mechanizm wykrywania zapłonu nie jest idealny. Czasem zgaszony silnik pokazywał się jako odpalony, czasem odpalony nie był rozpoznawany.

Wykrywanie odpalenia opiera się o czujnik prądu wpięty w przewód idący od magneta - jeśli prąd tam jest, to znaczy, że silnik pracuje, akumulator jest ładowany i światła mijania mogą zostać włączone. Problem jednak jest taki, że ten układ od początku dziwnie się zachowywał. Czujnik oparty jest o efekt Halla, w trakcie prac nad prototypem układu mogłem go oszukać przykładając do niego śrubokręt z magnesem. Możliwe, że w okolicy jest za duże pole elektromagnetyczne i nie jest on w stanie jednoznacznie stwierdzić jakie jest natężenie prądu płynącego przez niego.

Zacząłem się zastanawiać czy mam jakieś inne, lepsze sposoby na wykrycie pracy silnika. Spojrzałem na zegary i zaciekawiło mnie jak działa obrotomierz. Prędkościomierz ma linkę, która idzie od przedniego koła i kręci małym magnesem. Obok tego magnesu jest coś, podłączone do wskazówki prędkościomierza oraz sprężyny spiralnej. Wygląda na to, że im szybciej jadę, tym szybciej kręci się magnes, który mocniej przekręca wskazówkę. Ale czy obrotomierz działa podobnie? Okazało się, że nie - jest elektryczny.

Do obrotomierza idzie jakiś przewód. Po odpaleniu silnika, im wyższe obroty tym wyższe napięcie na nim się pojawia. Z ciekawości dorwałem się do małego oscyloskopu i wpiąłem go w przewód.

Pojedyncze piki, im wyższe obroty tym było ich więcej. Możliwe, że pochodzą one z modułu zapłonowego - po jednym na każdą iskrę w silniku. Gdyby podbić ich napięcie, pewnie dałoby się je przekierować do mikrokontrolera i dostać dokładne wskazanie obrotów silnika.

Mimo wszystko, z braku komponentów, postanowiłem spróbować po raz ostatni użyć aktualnej metody sprawdzania prądu.

Zmiany w kodzie

Postanowiłem wprowadzić kilka zmian w kodzie:

  • Posprzątać kod Bluetoothowy,
  • Dodać do Bluetootha wysyłanie aktualnych wskazań czujnika prądu,
  • Pozwolić na modyfikację pewnych parametrów modułu spod aplikacji.

Początkowo moduł zawsze próbował kręcić silnikiem przez 3 sekundy i próbował odpalić 3 razy zanim się poddał. Dodatkowo, jeśli natężenie prądu wskazywane przez czujnik wskoczyło powyżej 2000mA to moduł uznawał, że silnik pracuje. Chciałem dodać opcję np. skrócenia czasu kręcenia lub ustawienia innego natężenia traktowanego jako próg. Dodanie tej opcji łączyło się z porządkami w części Bluetoothowej. Okazało się też, że Zephyr ma możliwość zapisania czegoś na "dysku", więc ustawienia mogłyby zostać zapisane i wczytane po ponownym uruchomieniu kontrole---

Chwila, czemu kontroler przestał działać?

Awaria kontrolera

No więc okazało się, że można napisać program, który w formie dialogu wygląda następująco:

  • Hej Bluetooth, powiedz Kontrolerowi, że od teraz ma tylko dwie szanse na odpalenie.
  • Tak jest, szefie!

Bluetooth odwraca się do Kontrolera:

  • Nowe instrukcje, teraz masz próbować odpalić silnik 2 razy.
  • Tak szybko się poddajemy? Nie podoba mi się to, ale niech będzie.

Kontroler wymazuje jedną liczbę na swojej kartce i zapisuje w jej miejscu inną, a następnie podchodzi do Zephyra.

  • Hej, mam nowe wytyczne. Możesz mi je przechować w tamtej szufladzie?
  • W teorii tak, ale teraz są w niej wytyczne jak wszystko uruchomić. Może gdzieś indziej?
  • Ale ona podoba mi się najbardziej.
  • Ale to bootloader, bez niego--
  • Ona. Podoba. Mi. Się. Najbardziej.
  • Czy na pewno--
  • Tak.
  • Ok.
  • No. To teraz startujemy od zera, chcę sprawdzić czy na pewno moja kartka jest bezpieczna.
  • L̸͓̒̈́̒̅̈̉͂̈́̃̈́̆̈́͐̀̈́̽̎̚͝ơ̵̲͐́̾̿͋̑̾̚r̶̦͖͇͚̦̠̀́̆͛͛̉̓̓͋̀̈́͗̓̄̔̈́̒͘ȩ̷̙̣̫̙͉̟̺̭͙͔̤̄̒̿̿̓̃̽̌̈̋̄̄́̈́̿̐͝͝m̵̡͓̠̤̰̪͔̮͎̞͔̞͉̻̲͎̯͚̈́̃̆̃ ̸̘̦̭͈̝̠̞̤̜̓ị̶̑́͒̎͌̏̿͐͋̈́͘͘͠͠ṕ̵̨͚̬͓̭͓̣̙̯̰͈̖̓̏̋͊͗͋̂͂͠͝͝ͅs̷̛̟̭͔̥̰̱͈̪̦̒̎͊͐͒̚ų̶̱̬͓̼̭̭͋̏̃̀́̀̈̌̈̕͝ṃ̶̨͍̳͓͕̪͔̹̩̹̣̓̿̇̅̔̀̊̏̚͘͜ ̵̧̢̯̱͍͓̪͔̝͓̮̦̘͍̼̝̜̕ḑ̸̢̜̘̤̬͚͎̤̦̩͓̖̙̮̱̹͕̀̆͛͝͝͠ó̴̼̜̦͇̖͕̜̙͙̣̪͌̈̊̊͂́̀̈́̈̄̾͂͘͜͝ḷ̵̛̦̼͖͕͙͚̙̳͒̿̀͌̀͋̅͒̀̿̄̾̑͐̄̚̚͠ố̶̢̡͕̲̦͚̝̩̞̰̯͓̱̫̘͉͍̅̇̏̈́̕͘̕͜͝͝͠r̸̨̠̙̭̝̩͓̪̜͈̹͐͑̄͗̈́̕ͅͅ ̶̬͕̹̪̣̲̥̇̽́̊͆̕̕͜͜s̴̳͖͎̭̩̗̙̻͉̺͆̏͘i̸̡̧͉̯̪̯̳̱͔̼̝̲̖̫̿̍̀̔̐̾́̓͊̊̍̔̇͒̏́̆͝͠ͅţ̴̛͇̙͙̹͖̤̲̤͋̀̎̒̍̽͒̌̇̎̓͗̐̐̀͘̕͠͠ ̶̛͈̆͆̾͊̌̌̏͘̚à̵̩̫̳͕̖̯̰̹̑̓̓̔̈́̌̄̇́̇̇̕͘ͅm̸̛̱͆̈̕͝e̶̖͍͎͋̎̉t̷̢̡͉̮͉̘̫̣̹̪̮̩̗̾̀͐̀
  • oops.

Zapamiętać: Partycja z bootloaderem nie sprawdza jako miejsce do przechowywania danych.

Po krótkim poszukiwaniu okazało się, że bootloadera da się w miarę łatwo wgrać od nowa, ale potrzebny jest programator. Dobra, ale skąd ja wezmę programator? Wygląda na to, że Raspberry Pi Pico może go zastąpić, a mam u siebie cały krzak malin. Soft wgrany, kabelki wpięte, wgrywa-- Nie działa?

No i to by było na tyle, Xiao wysiadł na dobre, nie da się wgrać nowego bootloadera, koniec zabawy, dziękuję, dobranoc.

...albo i nie. Okazało się, że wersja debugprobe, którą już kiedyś wgrałem na Pipico, miała błąd. Nowa wersja działała dobrze i Xiao odżył. Porzuciłem jednak dalsze próby zapisania ustawień na "dysku", niech będą ulotne.

Pół-finalna wersja

Kod Bluetoothowy został posprzątany, aplikacja Androidowa została zaktualizowana, pozostało wszystko ponownie podłączyć i sprawdzić jak będzie się zachowywało teraz.

Wpięcie wszystkiego dzięki kostkom było bardzo łatwe i szybkie. Upewniłem się, że wszystko jest podpięte poprawnie i zacząłem sprawdzać czy wykrywanie pracy silnika działa. Spoiler: nie działa.

W tym momencie stwierdziłem, że chyba jedyną opcją będzie przerobienie modułu na odczyt dokładnej liczby obrotów silnika. Pojawił się też drugi problem - podczas próby zgaszenia silnika moduł się zawieszał. Poszedłem więc po laptopa i zacząłem terenowe modyfikacje kodu.

Pod nóż poszedł cały kod odpowiedzialny za sprawdzenie czy silnik pracuje. Od teraz zakładam w ciemno, że po X sekundach kręcenia silnik odpalił.

Odnośnie zwisów, okazało się, że nie tyle zawieszał się cały układ, co sam wątek Bluetoothowy - dokładniejszy opis mojego kodu pojawi się niedługo. Wygląda na to, że problemem była funkcja bt_gatt_notify, która odpowiada za wysłanie wartości do aplikacji. Część rzeczy, między innymi aktualne wskazanie natężenia prądu, była wysyłana z wątku Bluetoothowego, ale informacja o aktualnym stanie startera leciała z innego, przez co ten pierwszy najwyraźniej czasem się zawieszał. Przerobiłem kod tak, że aktualny stan wysyłany jest z wątku BT co X ms, przez co aplikacja może pokazywać informację o nim z opóźnieniem, ale na plus jest to, że przynajmniej moduł się nie będzie zawieszał.

Demonstracja

Szybkie zmiany wgrane, można się bawić:

Dalsze plany

  • Automatyczne włączanie zasilania po zbliżeniu się do skutera (bezkluczykowy dostęp w chińskim skuterze),
  • Zmiana obudowy i zamknięcie jej w schowku,
  • Dodanie przycisku do gaszenia silnika (awaryjnie),
  • Kiedyś: naprawienie informowania o stanie startera,
  • Kiedyś: dorzucenie obrotomierza do kontrolera,
  • Jeszcze później: mruganie kierunkowskazami jako informacja o włączeniu/wyłączeniu zapłonu,
  • Jeszcze później: tempomat.

Komentarze