Spacecraft

Idea

When I was looking for project to print on my new 3D printer I found very interesting model on Thingiverse:

Project for 3D printer that I found on Thingiverse

Since I’m a big fan of all astro things, I thought that I had to print this. In after-printing pictures I also saw that I can add light to the base of Space Shuttle to simulate the operation of real engines. But static lamp is not what could do the job – it had to smoothly blink 😉 And why not to try automate this light to turn on after sunset?

But that was problems for the future – now was printing time.

Printing and soldering

I was prepared for quick printing, because I had calibrated printer. After 26 hours I’ve got effect that you can see below:

I only need to remove all unnecessary supports and I could start playing with my soldering station.

After support removal

To create effect of glowing exhausting gases I figured out that I can use cheap Chinese LED candle (example on picture below).

LED candle, Source: https://www.jiomart.com/p/groceries/ein-sof-10-pcs-flameless-led-tealights-smokeless-acrylic-decorative-candles-yellow-light-3×3-cms-pack-of-10/596256307

Originally candle was not prepared to be controlled in any way so I needed to add transistor that was managing candle power source. To achieve that effect I chose 2N2222 transistor (because I had whole bag of them) with 1kΩ resistor connected to the base.

During candle modifications

As a controller I wanted to use Raspberry Pi Zero W 2, because I’m using it in one of my previous projects (HubScreen).

Originally candle was powered by CR2032 battery (3V), so I decided to use 3.3V pin as a power source.

Programming

Hardware was prepared and tested – now was time to write some code.

Because I am using Home Assistant with zigbee2mqtt at my home so I wanted to control my Spacecraft via MQTT protocol. For this I created special library mqtt2exec that is checking broker topic and performs set actions after receiving command.

Source code of mqtt2exec library on GitHub

Library checks if received command was added to C++ dictionary (map object) and then execute function assigned to this command. Adding and removing commands is possible during work of library object – to avoid data races it use mutex object from Standard Template Library. To reach the best performance MQTT broker should has special topic (in my case mqtt2exec) for sending commands and commands length should’t be too big. Code used for the Spacecraft project can be found in example directory on GitHub – it’s receiving TurnOnSpacecraft and TurnOffSpacecraft commands and changes state of GPIO 20 pin.

To setup GPIO 20 pin (e.g. I need to set pin direction) and create background service (e.g. with automatic restart of application if any fail occured) I used systemctl service manager in Debian Linux.

Now was time to add new action after sunset in Home Assistant automations…

Configured action in Home Assistant

…and last debug checks in MQTT Explorer.

Command received by MQTT broker

Finally everything was ready to work on it’s own.

Conclusion

The end result can be seen in the video below:

New smart home gadget 😉

That was really fun and quick project. It’s really good add-on to my smart home IoT network. Now I also have library that I can use in future to control in very easy way different devices in my future projects via different networks (WiFi, Ethernet, etc.).

mearm-stm32f429i

Skąd pomysł na projekt?

Kolejny rok, kolejne święta – w związku z tym musiałem wziąć udział w kolejnej edycji wydarzenia Reddit Gifts, które polega na anonimowej wymianie prezentów przez użytkowników serwisu Reddit. Niestety w tym roku miałem wymianę z osobami z Wielkiej Brytanii, a połączenie tej lokalizacji z Brexitem nie wyszło mi najlepiej (problemy z dostawami przesyłek, Eurotunelem, itd. – ale nie o tym w tym wpisie). Z tej okazji otrzymałem z brytyjskiego Amazona w prezencie „manipulator z linijek”, czyli MeArm Robot Classic Maker Kits. Niestety w najbiedniejszej wersji, więc bez żadnego sterowania – goła konstrukcja z serwomechanizmami FS90MG. I tutaj trzeba było coś wymyślić 😉

O projekcie

Trochę czasu mi zajęło, żeby znaleźć sposób na oprogramowanie ramienia. Na początku musiałem to niestety złożyć, czyli dużo odklejania folii i skręcania konstrukcji. Za późno też znalazłem wideo z całym procesem składania i trochę czasu przez to zmarnowałem. Ale po jakimś czasie konstrukcja była gotowa. Teraz brakowało tylko sterowania.

Przed złożeniem…
…i po 🙂

W sprawie sterowania na początku próbowałem pójść najłatwiejszą drogą, czyli znaleźć coś gotowego. Po przeszukaniu GitHub’a i nie znalezieniu niczego co mógłbym zrobić bez dodatkowych wydatków zrozumiałem, że muszę wziąć sprawy w swoje ręce. Na początku planowałem napisać coś na Arduino czy Rapsberry, ale z jednej strony byłby problem z zakupem potrzebnych sterownikiem serw a z drugiej z wykonaniem jakiegoś przyjemnego interfejsu do sterowania.

Dlatego skończyłem z tym co już w zeszłym roku do takich zadań poznałem, czyli oprogramowaniem TouchGFX, które generuje interfejsy graficzne dla mikrokontrolerów ST – połączenie elastycznego interfejsu graficznego dla ekranu dotykowego i możliwości mikrokontrolera ARM. Do projektu postanowiłem wykorzystać posiadaną przeze mnie płytkę STM32F429I-DISC1. Jest wyposażona w mikrokontroler STM32F429ZIT6 i rezystancyjny ekran dotykowy, a więc wszystko czego potrzebowałem do projektu.

Potem było już z górki. Opracowałem interfejs w TouchGFX, wygenerowałem potrzebne kody źródłowe, dokonałem ich edycji w oprogramowaniu STM32CubeIDE (dodając kody z inicjalizacją i konfiguracją timer’ów, DMA, itd. działające w oparciu o bibliotekę HAL), skompilowałem wszystko i voilà – ramię robota ożyło 🙂 Potem tylko kalibracja serw i hardware był gotowy. Byłem zdziwiony, że do sterowania serwomechanizmami wystarczy napięcie 2.92 V, a nawet 2.80 V (nie wiem czy moja płytka nie jest przypadkiem uszkodzona).

Pierwsze testy gotowego układu
Ostateczna wersja interfejsu pozwalającego na kontrolę ramienia robota

Film z działaniem można zobaczyć poniżej:

Kody źródłowe i schematy

Kody źródłowe i schematy

Podsumowanie

Okazało się, że był to całkiem przyjemny projekt dla osoby, która nigdy wcześniej się takimi rzeczami nie zajmowała (czyli sterowaniem serwomechanizmami). W przyszłości przydałoby się zautomatyzować działanie ramienia, więc pewnie skończy się to na możliwości nagrania sekwencji kolejnych pozycji robota i jej powtarzania – ale to może jak będzie trochę więcej wolnego czasu 😉

Aktualizacja 14.04.2021 r.

Sequence recorder

Stało się to prędzej niż później – funkcja pozwalająca na nagrywanie sekwencji położeń ramienia gotowa! 🙂 Dzięki niej możliwe jest zapętlone powtarzanie zadanych pozycji. Poniżej przykład działania:

Ciężka praca robota 😉

Jak to działa?

W oprogramowaniu TouchGFX opracowałem nowy ekran pozwalający na tworzenie sekwencji (opis okna i przycisków można znaleźć na GitHub’ie):

Zasada działania polega wyznaczeniu w głównym oknie pozycji robota, którą chcemy dodać do sekwencji, a następnie na ekranie sequenceScreen przyciskiem nr 6 dodajemy pozycję do przewijanej listy (nr 4). Czynności powtarzamy do momentu opracowania całej listy. Następnie możemy odtworzyć opracowaną sekwencję przyciskiem nr 7 (uruchamiany wtedy jest asynchroniczny wątek w systemie FreeRTOS odpowiedzialny za przesuwanie ramienia do właściwych pozycji).

Niestety w przypadku zresetowania mikrokontrolera tracona jest cała utworzona lista z powodu przechowywania jej tylko w pamięci RAM. Aby usunąć ten problem postanowiłem dodać zapisywanie listy oraz prędkości odtwarzania sekwencji do nieulotnej pamięci Flash (tej samej w której przechowywany jest mój program). Po analizie rozkładu pamięci Flash w oprogramowaniu STM32CubeIDE wybrałem do tego celu ostatni sektor mikroprocesora (23; nawet w połowie go nie zapełniam). Dodatkowo zabezpieczyłem się przed nadpisywaniem sektora przez linker poprzez zmniejszenie ilości dostępnej pamięci na program o wielkość sektora (128 KB).

Największym problemem była dynamiczna lista, której długość miała być zależna od ilości dodanych pozycji. Niestety po długim czasie kręcenia się w kółko zostałem uświadomiony, że mikrokontrolery nie żyją w zgodzie z dynamiczną alokacją pamięci jak pod klasycznymi systemami operacyjnymi. Ostatecznie skończyłem ze statycznym buforem dla tekstu wszystkich pozycji w liście oraz odpowiadającym im kontenerami positionContainer (czyli bufory oraz kontenery istnieją w pamięci programu przez cały okres jego życia, a w razie potrzeby wykorzystania po prostu edytowane są ich parametry, a następne dodawane do przewijanej listy). I tak bym musiał taką sytuację rozważyć jako najbardziej krytyczny przypadek, gdybym chciał korzystać z dynamicznej alokacji pamięci, więc nie jest to taki problem.

Do komunikacji między wątkami (interfejsu graficznego i sterowania pozycją ramienia) wykorzystuję zmienne bool’owskie klasy sequenceScreenView, które przekazują do funkcji handleTickEvent() polecenia odświeżenia listy pozycji lub obszaru tekstowego dotyczącego informowania użytkownika o stanie działania algorytmu.

Film przedstawiający ostateczną wersję projektu można obejrzeć poniżej:

Podsumowanie

Teraz opracowana aplikacja w końcu wydaje się kompletna 🙂 No i jak na Automatyka i Robotyka przystało w końcu mam własne skonstruowane przeze mnie ramię robota 🙂

W przyszłości może warto byłoby dodać jakieś przesyłanie komend z pozycjami ramienia przez UART/USB, podłączyć ramię do komputera/ESP32 i sterować nim poprzez sieć… Ale to może w jakiejś dalszej w przyszłości, bo pomysłów na projekty tylko przybywa, a trochę gorzej jest z ich realizacją 😉

Domowy serwer

Wstęp

Rok jeszcze się nie skończył to nie ma co zwalniać tempa 😉 A z racji, że przed świętami udało mi się zdobyć na Allegro (za 139 zł) dysk SSD 250 GB Samsunga to postanowiłem przywrócić do życia mój stary komputer stacjonarny HP Compaq Elite 8300, o poniższych parametrach:

ProcesorIntel Core i5-3470 3,20 GHz
Ilość rdzeni procesora4
Pamięć RAM12 GB DDR3
Rodzaj dysku twardegoSSD
  
Liczba punktów uzyskana podczas testu procesora w programie PerformanceTest 96128
Liczba punktów uzyskana podczas testu pamięci w programie PerformanceTest 91859

Jak widać powyżej nie jest to demon prędkości (chociaż z symulacjami czasu rzeczywistego paneli PV i turbin wiatrowych z częstotliwością 20 kHz w Matlabie potrzebnych do wykonania pracy magisterskiej sobie poradził), ale do zastosowania w roli domowego serwera powinien być wystarczający.

Po co serwer w domu?

Pierwsze moje pomysły wykorzystania domowego serwera przedstawiam poniżej:

  • Pi-hole – W domu wykorzystuję wiele urządzeń, które są podłączone do Internetu. Niestety nie na wszystkich mam możliwość zainstalowania jakiegoś adblock’a, więc dobrze by było realizować takie zadania na poziomie całe sieci. Dodatkowo dostęp do Internetu możliwy jest dzięki sieci mobilnej Play, a jak wiadomo wszystkie oferty „no limit” są tak naprawdę z limitami transferu, więc fajnie byłoby przyoszczędzić parę megabajtów na niepobieraniu niepotrzebnych reklam. Na początku myślałem o zainstalowaniu Pi-hole’a na routerze jednak obecnie przeze mnie używany nie spełnia minimalnych wymagań, a wymiana na nowy model nie daje jakiegoś znaczącego skoku technologicznego, więc na razie wstrzymuję się z zakupem. Dlatego jeśli jedynym zadaniem dla domowego serwera nie ma być blokowanie reklam to jest to idealne miejsce na instalację Pi-hole’a.
  • Napęd DVD – Niestety dzisiaj nowe komputery czy laptopy sprzedaje się bez napędów optycznych. Ma to swoje uzasadnienie, ale problem pojawia się, gdy trzeba uzyskać dostęp do danych sprzed wielu lat przechowywanych właśnie na płytach CD/DVD. Do tej pory zawsze szukałem jakiegoś starego laptopa z napędem DVD i zawartość płyt przenosiłem za pomocą pendrive’ów. Było to zadanie czasochłonne. W związku z tym taki serwer powinien udostępniać zawartości płyt w całej domowej sieci.
  • HubScreen – Wykonany przeze mnie w tym roku projekt działa na granicy swoich możliwości. Ewentualne próby rozbudowy (np. dodanie asystenta głosowego nad którym miałbym kontrolę) wymagałoby zmiany sprzętu co mogłoby wiązać się ze znaczącymi zmianami w projekcie. Aby tego uniknąć w takiej sytuacji dobrze byłoby przenieść zadania związane z renderowaniem strony WWW na domowy serwer, a wynik tego działania prezentować na ekranie z projektu HubScreen. Do uzyskania tego efektu powinna wystarczyć nawet najprostsza aplikacja pozwalająca na uzyskiwanie „zdalnego pulpitu” na domowym serwerze.

Pierwsze podejście – Debian 10

Przy pierwszym podejściu postanowiłem podejść do tematu „po bożemu”, czyli zainstalować system operacyjny, który najczęściej występuje na serwerach. Dodatkowo Pi-hole jest oprogramowaniem, które zostało opracowane pod Raspberry Pi, czyli linux’a (a nawet Raspberry Pi OS, który jest Debianem), więc problemów z działaniem raczej nie powinno być. I tak było w rzeczywistości. Instalacja blocker’a reklam sprowadziła się do jednego polecenia wydanego w terminalu:

curl -sSL https://install.pi-hole.net | bash

Po zakończeniu procesu instalacji i konfiguracji oprogramowania, a następnie zmianie adresu serwera DNS w routerze jeden z celów został osiągnięty.

Został jeszcze napęd DVD. Do jego udostępnienia postanowiłem wykorzystać serwer protokołu iSCSI. Mogłem go uruchomić dzięki jednej z dwóch aplikacji:

  • iscsitarget – Niestety aplikacja nie była zgodna z najnowszą wersją kernela w systemie Debian 10 (była kompatybilna maksymalnie z wersją Debian 8).
  • targetcliPo skonfigurowaniu serwera wszystko działało idealnie. Na domowym komputerze z systemem Windows 10 dodanie napędu było wyjątkowo intuicyjne dzięki domyślnie zainstalowanej aplikacji „Inicjator iSCSI”. Potem mogłem posługiwać się urządzeniem tak jakby było podłączone bezpośrednio do płyty głównej w moim komputerze. Było to to czego szukałem. Niestety nie ma róży bez kolców i po wymianie płyty na inną serwer iSCSI powodował kernel panic, który prowadził do „wysypania się” systemu operacyjnego serwera. Niestety nie znalazłem rozwiązania tego problemu, więc po raz setny poddałem się z próbą wykorzystania linux’a w codziennym zastosowaniu i wróciłem do tego co jest sprawdzone – czyli Windowsa.

Drugie podejście – Windows Server 2019

Na drugie podejście wpadłem zaraz po tym jak odkryłem, że Pi-hole jest dostępny w postaci kontenera Docker. Z początku myślałem o wykorzystaniu WSL’a skoro Microsoft tak go reklamuje, ale przypomniałem sobie o problemach w wersji pierwszej (chociażby brak możliwości używania systemd w Debianie), a wersja druga dostępna na serwery jest na razie tylko w kompilacji Preview. Natomiast chwilę wcześniej walczyłem z Dockerem przy próbie uruchomienia serwera gry „Plemiona” i nawet spodobało mi się to rozwiązanie. Dodatkowo w domu podstawowym systemem operacyjnym jest Windows, więc Windows Server zapewniłby największą kompatybilność.

I tak po kilku dniach walki z Dockerem i kolejnych kilku z routerem udało się uruchomić Pi-hole’a.

Pi-hole działający na domowym serwerze w ramach kontenera Docker

Na razie dowiedziałem się, że aktualizacja może nie być taka prosta jak w zwykłym linux’ie, ale obecnie jest to problem przyszłości 😉

Napęd DVD został udostępniony w sieci domowej tym razem dzięki usłudze udostępniania folderów dostępnej domyślnie w systemie Windows. Proste i na dzień dzisiejszy wystarczające rozwiązanie. Windows Server również posiada serwer iSCSI, ale do tej pory nie rozgryzłem jak udostępniać z jego wykorzystaniem napędy optyczne (z dyskami nie ma żadnych problemów). No ale jeszcze żadnych płyt nie musiałem nagrywać, więc o to będę martwił się później 😉

Podsumowanie

Na dzień dzisiejszy serwer spełnia swoją rolę.

Średnie dzienne zużycie energii to 0,52 kWh, co daje dzienny koszt działania serwera w wysokości 29 groszy (miesięcznie 8,70 zł). Koszt raczej do przełknięcia. Oby zwrócił się w postaci zaoszczędzonego transferu za Internet.

A co w przyszłości? Aktualnie w domu buduję sobie sieć Casambi z czujnikami (m. in. wilgotności, PM 2.5, PM 10, temperatury). Chciałbym jeszcze dokupić czujnik temperatury na ZigBee, który znajdzie się gdzieś na balkonie (w tym celu zakupiłem już na Aliexpress układ CC2530, który wymaga jeszcze zmiany firmware). Wszystkie dane z czujników planuję gromadzić w bazie danych na serwerze i w jakiś fajny sposób je wizualizować. Zobaczymy co tam do tego czasu jeszcze mi do głowy przyjdzie 🙂