Devblog #1 – czym jest UBC?

Blog, UBC

2021-02-2

Czym w ogóle jest UBC i co kryje się pod tym akronimem? Nic prostszego, jest to oczywiście Universal Board Computer, co na nasze znaczy mniej…

Czym w ogóle jest UBC i co kryje się pod tym akronimem?
Nic prostszego, jest to oczywiście Universal Board Computer, co na nasze znaczy mniej więcej tyle, co komputer pokładowy ogólnego zastosowania.

Zdarzyło mi się powiedzieć to i owo na kilku grupkach motoryzacyjnych na Facebooku o projekcie, który od dawna chciałem zrealizować, ale jakoś nigdy nie było na to czasu. Kiedy jednak już usiadłem i pierwsze prototypy okazały się sukcesem, a także spłynął do mnie ogrom słów wsparcia od wielu osób, wiedziałem, że teraz jest to jednym z moich głównych projektów.

UBC, w dużym skrócie, jest to, zależnie od wersji, system rozwiązań, który pozwoli nam dodać nie tylko kilka bajerów, do naszego samochodu, ale także przekazać masę cennych danych, w postaci spalania chwilowego czy średniego.

Nie jest to nic przesadnie nowego, samochody mają to na wyposażeniu już od dekad, a dziś jest to standardem. Co jeśli jednak jeździmy Hondą Civic z 1994 albo BMW E36 z 1998 i największym dodatkiem jest podgrzewanie tylnej szyby? Wtedy przychodzę ja z pomocną ręką i oferuję każdemu zainteresowanemu UBC.

To, co tu dzisiaj przeczytacie, jest luźnym zbiorem moich przemyśleń o projekcie, możliwym ścieżkom rozwoju, problemach, na jakie natrafiłem i wszystkim, co nie bardzo jest jak skategoryzować. Dosłownie, taki blog.

Co jakiś czas będę starał się dodawać nowe wpisy, czasem dłuższe, czasem krótsze i informować na bieżąco o jakich dużych aktualizacjach kodu czy naprawie błędów.
Nawet pomimo tego, że soft wypuszczam na licencji AGPL, która zwalnia mnie z dawania na niego jakiejkolwiek gwarancji, nie chcę pozostawiać Was, użytkowników na lodzie, samych sobie. Zwłaszcza, że w planach mam wypuszczenie komercyjnych kitów DIY i zestawów już całkowicie złożonych. Byłoby to zwyczajnie nie fair wobec społeczności osób, które postanowiły mi zaufać.

Ale przejdźmy do rzeczy…

Zasada działania i wersje sprzedażowe

Może zacznijmy od początku, a mianowicie z czego składa się UBC, czy da się go zrobić samemu w domu i jakie są różnice pomiędzy poszczególnymi wersjami.

Na dzień dzisiejszy, czyli 02.02.2021, wyróżniam wersję Standard oraz Pro (oryginalnie, co nie?). Wszystko co przeczytacie w tym wpisie może się w przyszłości zmienić, ale na wersję 1.0 plany są takie:

W wersji Standard mózgiem całego układu jest ATMega 8A. Ja wiem, ja wiem. Mogłem wybrać PICa lub STM, albo chociaż ATMegę 88.
Kwestia jest jednak taka, że ATMega 8A jest aktualnie chyba najtańszym mikrokontrolerem na rynku, który jest w stanie poradzić sobie podstawowymi zadaniami, jakie przed nim stawiam (o tym niżej).

Jasne, mogłem próbować pójść w jakieś ATTiny czy wspomniane wyżej STM, ale niepodważalną zaletą ATMegi 8A jest to, że jest łatwo i szeroko dostępna, masa osób się nią bawiła w internecie, a większość wiedzy jest wymienna z 328P, a co z tym idzie fora dla Arduino również mogą się okazać pomocne.

Wiadomo, brak PCINT czy ledwo 8 KB pamięci flash to niesamowity ból, a poziom optymalizacji kodu pod względem rozmiaru, na jaki trzeba wskoczyć, jest czasem przytłaczający, ale plany są rozwijać ten projekt, więc z każdą kolejną aktualizacją powinno być tylko lepiej.

Co do oferowanych funkcji, są to:

Z rzeczy planowanych, ale nadal nie zaimplementowanych są:

Nie sądzę, że będę w stanie upchnąć cokolwiek więcej w 8 KB pamięci, już jest to trudne. Teoretycznie mógłbym dorzucić na płytkę PCB jakąś kość pamięci SRAM albo EEPROM, ale… Mija się to z celem. Nie dość, że koszta i poziom skomplikowania rosną niepotrzebnie, to przecież mogę zamiast tego podpiąć ATMegę 328P. Nie w tym rzecz.

Do całości będzie dodawany prosty ekran LCD. Pewnie jakiś PCD5110, ale ostateczna decyzja nie została tutaj jeszcze podjęta. Teoretycznie wszystko, co działa po SPI, powinno też dać radę się uruchomić tutaj.

Wersja Standard jest dla osób, które chcą mieć jak najmniej pracy z podpięciem tego (wystarczą ino 4 przewody, ale o tym niżej), a także nie czują potrzeby posiadać informacji o przepalonych żarówkach czy niezapiętych pasach.
No i oczywiście rzecz najważniejsza: ma to być produkt nieprzyzwoicie tani.

Sprawia to też, że nie przewiduję żadnego prostego sposobu aktualizowania softu w tej wersji. Jeśli ktoś nie posiada programatora usbasp, to nie będzie możliwości podpiąć się po USB, aby zrobić aktualizację.

Wyjścia na to są trzy:

Jakby na czas oficjalnego wydania wersji 1.0 i wypuszczenia przeze mnie kitów do sprzedaży nie przewiduję, że soft jakoś mocno się na tym procku zmieni. Podstawowa funkcjonalność, wymieniona wyżej, będzie w 100% działać. Jednak w razie jakichś bugfixów czy zmieszczenia dodatkowej funkcji, będziecie musieli sobie jakoś poradzić.

W wersji Pro na płytce PCB głównym procesorem jest ATMega 328P, którą wspiera… ATMega 8A.
Jest to spowodowane tym, że 8A jest tutaj tylko i wyłącznie w roli programatora, co pozwala wyprowadzić port USB na zewnątrz urządzenia, co pozwoli nie tylko Wam prosto i samodzielnie modyfikować soft, ale także przeprowadzać aktualizacje oprogramowania.

Wersja Pro zawiera w sobie całą funkcjonalność wymienioną wyżej, a także:

W planach mam tylko jedną rzecz, nie traktowałbym tego przesadnie poważnie, ale chcę to mieć :,)

Domyślnie mam zamiar wysyłać wersję Pro z ekranem OLED, ale w razie czego będzie możliwość sobie wybrać wedle uznania, co nam bardziej pasuje.

Jeśli ktoś decyduje się to złożyć we własnym domu, kod dostępny jest w linku na dole artykułu (nie ma jeszcze schematów elektronicznych ani projektu płytki PCB, to wymaga sporo dopracowania), to im taniej kupi lub znajdzie części, tym lepiej dla niego. Może się okazać, że koszt wyjdzie nawet w okolicy 0 PLN, jeśli wszystko mamy pod ręką.

Jeśli chodzi o mnie, mam zamiar oferować 3 sposoby dystrybucji dla osób, które albo nie czują się na siłach poskładać sobie to samemu, albo zwyczajnie im się nie chce lub jeszcze coś innego:

A jak wygląda sprawa podłączenia sobie tego do samochodu i późniejszej kalibracji?

Standard (ATMega 8A) – wymagane są przewody doprowadzające zasilanie – +5V do +12V myślę powinno być wystarczające. Do tego należy pociągnąć sygnał z impulsatora do miejsca na PCB oznaczonego jako VSS, a także sygnał z wtryskiwacza na oznaczenie INJ.

Takie podstawowe połączenie w zupełności wystarczy do poprawnego działania UBC. Co jednak jeszcze można zrobić dodatkowo, to wyprowadzić sobie przycisk do kontrolowania tego, co wyświetla ekran w jakieś wygodne miejsce. Wpina się on w oznaczenie BTN.

Jako, że ATMega 8A nie posiada portu USB, kalibracja musi być wykonana bezpośrednio na aucie.

Otóż, trzeba wejść w tryb kalibracji (na dzień pisania tego wpisu nie istnieje jeszcze jego implementacja), a następnie przejechać znany nam dystans, np. 10 kilometrów. Bo zakończeniu jazdy przejść do następnej zakładki i wprowadzić wydajność wtryskiwacza w cc/min. Następnie można zakończyć proces kalibracji, a dane zostaną zapisane w pamięci EEPROM.

Pro (ATMega 328P) – podstawowe podłączenie przewodów wygląda identycznie, jak w przypadku wersji Standard.

Największa różnica rodzi się w momencie, kiedy chcemy (lub nie chcemy) podpiąć pozostałych czujników. Domyślnie powinno być:

Do czasu wydania wersji 1.0 napiszę także aplikację, w której będziemy mogli kontrolować, czy stan wysoki na danym pinie aktywuje alarm, czy stan niski. Będzie tez możliwość całkowitego wyłączenia danej funkcji.

Jest to całkiem sporo pracy, nie ukrywam. Ale nie da się zrobić tego w sposób prosty, zwłaszcza, jak nasze auto nigdy takich bajerów nie posiadało.
Zasada jest prosta: im mniej posiadamy fabrycznie, tym więcej będziemy musieli sami dorobić.

Ciekawostki w kodzie

O ile sam jestem programistą, tak mój obszar działania to stack MERN, a więc JavaScript i React.

Jest to o tyle trudne, że przepaść, jaka dzieli język JS, a język C, jest ogromna!
O ile posiadam doświadczenie w C++, w którym kilka komercyjnych projektów zrobiłem i coś tam mi jest prościej, tak absolutnie nie można powiedzieć, że znam C. Nowoczesny standard w postaci C++11 i wyżej, w niczym nie przypomina tego, czym tym język był na początku swojej drogi. Nie dajcie się zmylić Zelentowi, którego szczerze nienawidzę za to, jak miesza ludziom w głowach ucząc starego standardu.

W każdym razie, jak możecie się domyślić, prowadzi to podczas projektowania do wielu sytuacji, które na pierwszy rzut oka nie są w żaden sposób intuicyjne.

Pierwszy lepszy przykład z brzegu, jaki dostrzeżecie po wejściu do repo:

Uwierzcie mi, jakbym mógł, to bym nie stosował wartości hex do opisywania sobie portów i rejestrów w AVRce. Ale okazuje się, że avr-gcc, z którego korzystam przy kompilacji kodu, nie sprowadza mi wartości (1<<PD7) do czegoś prostszego i hex zajmuje po prostu mniej bajtów.

Teraz, po wywaleniu sobie wielu śmieci z kodu, nie ma to AŻ takiego znaczenia, ale trzymam ten hex. Bajt do bajta i tak dalej… 😉

Inną ciekawostką, o której nie miałem pojęcia jest to, że jeśli korzystamy w kodzie ze switch() {}, to bez zastosowania w nim warunku default… Zajmuje on więcej miejsca.
Czyli pisząc mniej kodu potrzebujemy więcej bajtów, niż pisząc więcej kodu. Hmm.

Obstawiam, że to przez to, że po zrzucie tego do assembly switch musi zrobić kilak kroków więcej przez niepełny hash table, ale w sumie nie wiem, nie znam się na tyle na C. Na pewno było to mocne zaskoczenie dla mnie.

Albo pochwalę się moją największą… Porażką. Do błędów też trzeba się przyznawać.
Oj, głupi ja myślałem, że mogę sobie tak wrzucić średnią arytmetyczną i wsio, średnia prędkość i spalanie wyjdą tip top.
Ta XD

Zaraz po pierwszym teście drogowym i wyciąganiu wniosków mój dobry znajomy przyszedł i opierdzielił mnie z góry na dół, żem chyba chory na głowę.

I takim oto sposobem, dzięki jego chęci pomocy mam teraz liczoną średnią harmoniczną w kodzie, która duuuużo lepiej oddaje rzeczywistość.
Nie jest to co prawda koniec prac w tym miejscu, bo mamy jeszcze kilka pomysłów, jak to odpowiednio usprawnić, ale na chwilę obecną można śmiało tak jeździć i sprawdzać wyniki.

Podsumowanie

Na dziś chciałem głównie przedstawić koncepcję, ale zachęcam do śledzenia tego mikrobloga czy grup FB, na których się udzielam (kmwtw, Audi 80, Audi/VAG Polska, ***** ***, itd.). Na pewno pojawią się też tutaj wstawki opisujące sam proces tworzenia kodu, napotkane po drodze problemy, testy drogowe itd.

Co do chętnych osób na testy: zgłosiło się Was do mnie cała masa, co niesamowicie doceniam. Musicie jednak dać mi trochę czasu na przejrzenie tego wszystkiego i dopracowanie wersji beta, abym mógł Wam wysłać zestawy 😉

Jeśli chodzi o ceny zestawów kupowanych ode mnie… Pfff, gruby temat. Na chwilę obecną nie chcę nic obiecywać, ale myślę, że w niedalekiej przyszłości przekażę Wam konkretne informacje i będę otwarty na dyskusje i negocjacje.

Zaś jeśli sami sobie to składać i/lub modyfikujecie, to pamiętajcie, że działacie w ramach licencji AGPL, więc musicie potem wszystkie te źródła udostępnić 😉
Samo repozytorium znajduje się tutaj: https://github.com/Regeneric/universal-board-computer

I posiada w sobie kod dla ATMegi 8A, nadal w trakcie tworzenia.

Jeśli o czymś zapomniałem (a na pewno zapomniałem). to postaram się nadrobić i odpowiedzieć na ew. pytania w komentarzach, a także poruszyć te kwestie w następnym poście.

A na dziś chyba mogę podziękować za uwagę i uznać tym postem, że witam się ze światem.
Cheers!