Popularny post Leoneq Napisano Lipiec 11, 2021 Popularny post Udostępnij Napisano Lipiec 11, 2021 Zachęcony dzięki koledze z shoutboxa i być może zainspirowany innymi worklogami, postanawiam otworzyć własny. No i chcę też uprzedzić, że nie jestem pewien jak losy tego projektu się potoczą, może zostać nawet porzucony, jako że raz mi się chce a raz mi się zwyczajnie nie chce go robić. No, ale do rzeczy: jakoś rok temu pomyślałem że wypadałoby w końcu zbudować jakiegoś porządnego robota. I to takiego w pełni definicji tego wyrazu, czyli nie zdalnie sterowaną zabawkę a autonomiczne urządzenie, potrafiące w pewnym stopniu samodzielnie sobie radzić z trudnościami życia (czyt. chodzeniem i przynoszeniem picia). Spróbowałem swoich sił w pojeździe balansującym o dwóch kołach; skończyło się bardziej na poznaniu regulatora PID. Wydrukowałem podwozie pod pojazd gąsienicowy, gdzie docelowo miała iść malina, znudził mi się temat dość szybko i później oddałem koledze (pozdrawiam kolegę zimena). No i to jakoś wtedy też była forbotowa akcja na kupony, to sobie je wymieniłem na 12 serw sg90, bo mi się zamarzył robot czworonożny. No i powtórka z rozrywki, wydrukowałem jakiś projekt z thingiverse, po tygodniu czy dwóch dostałem płytkę z D8088 i się zaczęła cała zabawa w cyfrówkę... ...która się skończyła dość nie dawno i w zasadzie odkopałem temat bo mam jej dosyć (no, po drodze były lampowce ale od nich już jednak cyfrówke wole). Także siedzę, mam takie coś: Uznałem że mogę to pociągnąć, to i pociągnąłem. Temat dalej ten sam: zrobić sensownego robota, po swojemu. Także poszedłem o krok do tyłu, i przemyślałem czy na pewno chcę z tych nieszczęsnych dwunastu serw (bo teraz to bym sobie kupił mg995s, mg90 chociaż i cześć) układ pająka, czy może humanoidalnego albo coś na styl Spota od boston dynamics. Humanoidalny be bo musi się balansować a ja w te klocki nie umiem. Spot był brany pod uwagę, ale bałem się że przypadkowo wpadnę przy konstruowaniu w dolinę niesamowitości; myślałem, że po dodaniu całej obudowy/skóry do szkieletu zwyczajnie nie będę chciał tego widzieć, o tak: (źródło: wikipedia) Tylko mam wrażenie że u mnie to jest dodatkowo spotęgowane, więc będę chciał robić coś mniej realistycznego/prawdopodobnego. No i pomysł trochę sam wpadł do głowy, mam przed sobą czarnego czworonożnego pająka, ma nie być dość realny, no jakbym gdzieś już takiego widział... W głowie mi utkwiło takie stworzenie, a jest to headcrab (dokładniej: poison headcrab, jadowity headcrab), po lewej zdjęcie z gry Half-Life 2, po prawej z nowej gry Half-Life: Alyx. W drugiej części gry były to dla mnie dość sympatyczne stworzenia, głównie dlatego że samodzielnie nie mogły zabić, wydawały dość zabawne odgłosy, i nie były tak odrażające jak pozostałe kraby (czego nie mogę powiedzieć o odświeżonej wersji w Alyx, tam one po prostu są ohydne). Także, ok, lubię mocno uniwersum gier studia Zawór®, to sobie zrobię headcraba. No i tutaj zacząłem myśleć, i zrobiłem badanie (przepraszam, dzisiaj research), w wyniku którego uznałem, że: wykorzystam praktycznie wszystko co mam ogarnę w końcu jak działa sztuczna inteligencja na malinie pokażę kolegom dlaczego program FUZJA 360 jest lepszy od inventora Dokładnie w tym celu opanowałem anatomię headcraba. Technicznie rzecz biorąc, jest to czapka z czterema odnóżami, i kłami (włosy pomijam bo są ble). Przechodzę do fuzji, modeluję pierwsze lepsze pudełko tak luźnie, ok. Robię dalej: przednie nogi są niżej umiejscowione od tylnych. Szczerze powiedziawszy, nie wiem po co taki zabieg, możliwe że czysto kosmetyczny więc go nie zaimplementowałem. Nogi w ogóle składają się z dwóch kości, jedna jest prosta (nazwijmy to udem), druga trochę zwinięta (piszczel), i przednie kończyny są zakończone kłami/pazurami. W międzyczasie natknąłem się na problem orientacji całości w przestrzeni: do tego wykorzystam swoją płytkę discovery z stm32f303: na pokładzie mam od razu akcelerometr, żyroskop i magnetometr, z ośmioma ledami w zestawie, chociaż teraz planuję wywalić stma i wszystko na malinie robić, o czym za chwilę. Sprawa ma się inaczej z pozycją zmierzoną i wyliczoną, a rzeczywistą. Chciałem, żeby robot miał swego rodzaju zmysł dotyku, i wiedział, czy dana noga dotknęła ziemi czy nie, i radzić sobie jak jest ślisko, podłoże jest nierówne itd. Początkowo chciałem dać najbardziej "cebulowe" rozwiązanie, tact switche na nóżkach. Potem szybko doszedłem do wniosku że potrzebuję czujnika siły, i tak dotarłem do tematu tensometrów. I jak dobrze, że tak się stało! Są to bardzo tanie folie, które zmieniają rezystancje od tego jak się wygną, w dużym skrócie. Każdy materiał minimalnie się odkształca w zależności od przyłożonej siły, zmienia się rezystancja folii dzięki zjawisku rezystywności, i przy odpowiednim połączeniu mogę zmierzyć tą rezystancję. W Polsce niestety nie można kupić tensometrów, co najwyżej belki tensometryczne, które się wykorzystuje w wagach. Sprowadziłem takowe z Chin razem z przetwornikami ADC, HX711. Plan był taki, żeby zbadać jak one działają, a potem zobaczyć, czy trzeba będzie część nogi frezować z metalu, wygiąć z blaszki, czy może wydrukować. Do pomiarów nieznanych rezystancji służy mostek Wheatstone'a, który w stanie równowagi wskazuje 0v. Połączyłem to u siebie podobnie, Rx to tensometr, pozostałe rezystory to potencjometry dokładne. Co prawda, mógłbym użyć pierwszych lepszych rezystorów a potem napięcie starować programowo, ale jakoś to nie po mojemu. Tak wyglądała platforma testowa: Przetwornik HX711 to bardzo prosty w obsłudze, dwukanałowy przetwornik ADC. Wymaga dwóch pinów do sterowania, są gotowe biblioteki, choć raczej ja napiszę swoją pod STM. Jest to przetwornik 24-bitowy, co oznacza że dla napięcia zasilania 5v dokładność powinna wynosić co do 0.3uV. Dość dokładnie. Po podłączeniu do Arduino i skojarzeniu jakoś z Processingiem, uzyskałem plik .csv i popełniłem taki wykres: Przedstawia on przyłożoną siłę w czasie. Są to kolejno: płynne naciśnięcie, gwałtowne naciśnięcie, potem podniesienie, przyłożenie lutownicy i to płaskie nad zerem to pamięć kształtu. Można zauważyć, że pojedynczy tensometr dość znacznie reaguje na zmianę temperatur, dlatego się dodaje prostopadle do niego drugi tensometr, aby ten efekt zniwelować (no, a przynajmniej to wyczytałem w licznych pracach naukowych). Jeden z potencjometrów wymieniłem na drugi tensometr, wykres prezentuje się tak: Tym razem jest to tylko płynny nacisk, ale wartości po przyłożeniu lutownicy wahają się nieznacznie (no, i liczymy pamięć kształtu). Także prawdopodobnie piszczel będzie z metalu. No i z czujników to jeszcze chcę dać kamerę do wykrywania gestów na malinie; jest założony klasycznie hc-sr04, chociaż mam czujniki od sharpa ale sharp nie ma do nich dokumentacji. Ostatecznie mogę jeszcze do ADC podłączyć potencjometry z serw aby odczytać aktualną pozycję, coś na rodzaj enkoderów - sprawa do przemyślenia. Także zrobiłem model w moim ulubionym programie do modelowania 3d: Model wygląda tak, kiedyś zrobię animację jak się to składa. Na każdej części przeprowadziłem prostą, statyczną symulację nacisku 10kg żeby zobaczyć czy wytrzymają, i jakby były z litego plastiku to by zdały. Trochę zabawy było z koszyczkami do serw w korpusie, wymyśliłem dość śmieszne mocowanie na wcisk i dokręcenie śrubką. Sprawuje się dobrze, a przede wszystkim, jest zoptymalizowane pod kątem wydruku. Akumulator to pakiet 2S zrobiony z starego akumulatora laptopowego. Z niego będą zasilane bezpośrednio serwa (patrzyłem, nic im się nie stanie, chociaż nie powinno się tak robić), do zasilania logiki chcę użyć jakiejś przetwornicy na 5v, jeszcze nie wiem jakiej. Po lewej stronie przykręcany jest sterownik serw (użyty z czystej leniwości), po prawej miejsca do przyklejenia HX711. I o ile na papierku wygląda to fajnie, w praktyce wygląda gorzej niż w moim komputerze: ,A. I znowu z leniwości gwintuję w plastiku, chociaż są modele pod inserty. No i serwa, żeby się zmieściły (ale tylko do korpusu) trochę zmieniłem: A podczas mocowania, uznałem że do "stawów" warto dodać podkładki dla lepszego poślizgu. A i nóżki zrealizowałem tak, że część przykręcana jest z PLA, a reszta z gumy, którą dodatkowo wygrzałem hotairem. Efekt wyśmienity. No i dzisiaj wszystko wydrukowałem i złożyłem w całość. Workloga teraz piszę przed napisaniem jakiegokolwiek oprogramowania, bo uznałem że może i warto FreeRTOSa wcisnąć jeszcze, ale samemu raczej nie podołam temu wyzwaniu. Na koniec dodam że znajduje się moduł DFPlayera (znowu leniwość) do odtwarzania dźwięków z gry, a całość, jak się uda, planuję ubrać w skórę i wypełnić pluszem, żeby był taki headcrab prosto z gry. Krawiectwo to zawsze jakaś odskocznia od elektroniki, chyba. Jak coś pominąłem to proszę pytać, projekt i tak zamierzam opublikować żeby każdy mógł zrobić swojego kraba. Obecnie udało mi się skojarzyć CubeMX z Platformio i VS Code, więc robię szybki powtórkowy kurs stmów (w ogóle dzięki za kolejny, świetny kurs!), najpierw chcę ogarnąć sterowanie serwami i hc żeby zrobić maszynę kroczącą, i potem stopniowo chcę dodawać czujniki i malinę. Także jak ktoś ma niuanse, propozycje, to proszę mówić i wytykać, w końcu po to jest ten worklog, żeby projekt wyszedł lepiej, a ja nie popełniał głupstw. Więc proszę o jakiekolwiek opinie/porady dot. oprogramowania. 5 Cytuj Link do komentarza Share on other sites More sharing options...
Leoneq Lipiec 13, 2021 Autor tematu Udostępnij Lipiec 13, 2021 Dzisiaj udało mi się napisać kod odpalający dźwięk z DFPlayera. Wysłałbym filmik ale jest późno i nie chce mi sie na yt wrzucać :x Malinę tym czasowo wymieniłem na jedyną dostępną przetwornicę na XL, z ograniczeniem prądowym. Wymiary niby takie samie ale paskudnie milimetra brakuje w rozstawie otworów i musiałem przykręcić na ukos. Tutaj chciałbym się zapytać, o ile ktoś to czyta, czy mogę bezpiecznie na stmach używać stringów, bo świra idzie dostać z char array i funkcjami typu strcat i itoa. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Lipiec 13, 2021 Udostępnij Lipiec 13, 2021 Zadaj sobie pytanie, czy możesz bezpiecznie używać malloc, realloc i free. Poza tym programujesz w C czy C++? Cytuj Link do komentarza Share on other sites More sharing options...
Leoneq Lipiec 13, 2021 Autor tematu Udostępnij Lipiec 13, 2021 tak nie no, c++, a tych funkcji to nie używałem, nie wiem co robią, innymi słowy, c++ umiem tyle co trzeba żeby napisać prosty program, nic zaawansowanego, i tutaj myślę leży problem. Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
ethanak Lipiec 13, 2021 Udostępnij Lipiec 13, 2021 To się jak najszybciej dowiedz, bo klasa string ich używa. A string możesz całkiem bezpiecznie używać nawet na małym Arduino - pod warunkiem, że znasz zasady owego bezpieczeństwa. Ergo: pytanie nie ma sensu bez zdefiniowania "bezpiecznie". Cytuj Link do komentarza Share on other sites More sharing options...
Leoneq Lipiec 13, 2021 Autor tematu Udostępnij Lipiec 13, 2021 (edytowany) dla mnie bezpiecznie to żeby nie zapychać pamięci, stosu/sterty. ogólnie nowy kurs stmów mi pokazuje jak małe pojęcie mam o c++. na przykład, jak odkomentuję linijkę, cały mikrokontroler się blokuje, i nie wiem czemu, choć podejrzewam że wkrada mi się gdzieś niewidzialne zero na końcu każdego łańcucha.. (funkcja serialwrite działa normalnie) char msg[] = "DFPlayer send: "; for(int x = 0; x < 10; x++) { char buffer[3] = ""; itoa(command[x], buffer, 16); strcat(buffer, " "); //strcat(msg, buffer); } debug_serialWrite(msg); HAL_UART_Transmit(&huart2, &command, 10, HAL_MAX_DELAY); na dzisiaj idę spać. edit: zostawiam taktycznego githuba https://github.com/Leoneq/headcrab Edytowano Lipiec 13, 2021 przez Leoneq Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Lipiec 14, 2021 Udostępnij Lipiec 14, 2021 9 godzin temu, Leoneq napisał: ogólnie nowy kurs stmów mi pokazuje jak małe pojęcie mam o c++ Nie wiem czy zauważyłeś, ale w kursie używany jest C a nie C++. Taka mała różnica (jak między kulturą a kulturą fizyczną). 9 godzin temu, Leoneq napisał: jak odkomentuję linijkę, cały mikrokontroler się blokuje To chwilę pomyśl. Rezerwujesz 16 bajtów w pamięci na msg. Potem chcesz od 15 bajtu zmieścić tam jakiś łańcuch (o raczej niezerowej długości). Procesor nie sprawdza czy to co mu każesz robić ma sens i grzecznie tę doklejkę tam dokleja, zamazując przy okacji jakieś (pewnie ważne) dane które tam siedziały. Jak chcesz to zrobić? Obrazowo: robisz koktajl o nazwie "dżin z tonikiem". Do tego celu kupujesz butelkę dżinu 0.25l i dolewasz do niej 0.75l toniku? Nie wyjdzie. No, ale gdybyś do litrowej butelki zawierającej 0.25l dżinu dolał 0.75l toniku - spokojnie się zmieści, prawda? Więc zamiast narzekać na te strasznie wredne tablice jakie to one brzydkie i jakieś itoa potrzebne, zacznij ich używać w normalny sposób (np. zapoznając się z jakimiś początkami C/C++). Czyli: char msg[128] = "DFPlayer send: "; for(int x = 0; x < 10; x++) { char buffer[3] = ""; itoa(command[x], buffer, 16); strcat(buffer, " "); strcat(msg, buffer); } debug_serialWrite(msg); Wielkość 128 wzięta z powietrza, ale na zasadzie że dżin z tonikiem możesz równie dobrze zrobić w dwulitrowej butelce. A tak przy okazji - w C zacząłem pisać jeszcze w zeszłym tysiącleciu (i to nie w ostatniej dekadzie), a nie przypominam sobie abym gdziekolwiek użył itoa 😉 Cytuj Link do komentarza Share on other sites More sharing options...
Leoneq Lipiec 14, 2021 Autor tematu Udostępnij Lipiec 14, 2021 (edytowany) a) nie zauważyłem b) nie chciałem definiować wielkości tablicy bo chciałem żeby była możliwie mała bo mikrokontrolery c) ok dzisiaj wieczorem dam znać czy coś więcej popełniłem. Edytowano Lipiec 14, 2021 przez Leoneq Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Lipiec 14, 2021 Udostępnij Lipiec 14, 2021 12 minut temu, Leoneq napisał: b) nie chciałem definiować wielkości tablicy bo chciałem żeby była możliwie mała bo mikrokontrolery I uważałeś że sama urośnie? "Możliwie mała" oznacza w tym przypadku "minimalna wielkość aby pomieścić najdłuższy możliwy napis plus kończący NUL". Najlepiej z jakimś niewielkim zapasem. Poza tym w tym przypadku tablica będzie siedziała grzecznie na stosie i zaraz po wykonaniu bloku zniknie. Aha, i zmienna "buffer" wcale nie jest tu potrzebna. Możesz przecież pisać bezpośrednio do msg we właściwe miejsce (czyli np. msg+strlen(msg)), poza tym taki np. sprintf zwraca ilość znaków które wypisał, czyli coś w stylu: char *c=msg+strlen(msg); for (int x=0; x<10; x++) c+=sprintf(c,"%02X ",command[x]); 14 minut temu, Leoneq napisał: dzisiaj wieczorem dam znać czy coś więcej popełniłem. Dawaj dawaj, ja co prawda za dżinem z tonikiem nie przepadam ale może coś smacznego wyjdzie 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
Leoneq Lipiec 14, 2021 Autor tematu Udostępnij Lipiec 14, 2021 a) tak b) zaczynam tęsknić za javą c) nie lubię składni c (to jest "printf" i "sprintf"), choć teraz jak sobie dopisałem kilka funkcji to idzie mi całkiem dobrze bez nich. Udało mi się zrobić dwustronną komunikację po uarcie z PC, i prostą obsługę komend. Dość topornie, ale przynajmniej (myślę) że mam nad tym kontrolę: char *ptr = strtok(huart1_buffer, "_"); if(strcmp(ptr, "dfplayer") == 0) { ptr = strtok(NULL, "_"); if(strcmp(ptr, "play") == 0) { ptr = strtok(NULL, "_"); wav_play(atoi(ptr)); } else if(strcmp(ptr, "setvolume") == 0) { ptr = strtok(NULL, "_"); wav_setvolume(atoi(ptr)); } //itd... Pełny kod oczywiście na githubie. Mogę sobie zapalać ledy i sterować odtwarzaniem dźwięków z gry, jutro chcę dopisać funkcje by w pełni wykorzystać DFplayera i być może dać to w osobny plik. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Lipiec 15, 2021 Udostępnij Lipiec 15, 2021 8 godzin temu, Leoneq napisał: b) zaczynam tęsknić za javą Czyli źle zacząłeś 😉 Zresztą to taki typowy syndrom javowca, Java jest najlepsza, wszystko inne jest be a w ogóle Java to cud natury i kto wymyślił te inne języki jak jest Java. Po pewnym czasie przechodzi samo bez konieczności zażywania środków farmakologicznych. 8 godzin temu, Leoneq napisał: nie lubię składni c (to jest "printf" i "sprintf") Składnia nie jest do lubienia tylko do nauczenia się. A formatowanie pochodzące z *printf możesz spotkać jeszcze w paru innych językach z Pythonem i PHP na czele. Przy okazji: zapoznaj się z funkcjami typu strtol czy strtod, bo jak patrzę na strtok ożeniony z atoi to muszę oczy zamknąć... Cytuj Link do komentarza Share on other sites More sharing options...
H1M4W4R1 Lipiec 15, 2021 Udostępnij Lipiec 15, 2021 30 minut temu, ethanak napisał: i PHP na czele Bałbym się tej abominacji nazywać językiem 😉 (AntiPHP Gang) A co do reszty wypowiedzi się zgadzam. Zwłaszcza z tym, że syndrom Javowca przechodzi (chociaż u mnie tak było z LUA). 1 Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Lipiec 15, 2021 Udostępnij Lipiec 15, 2021 12 minut temu, H1M4W4R1 napisał: Bałbym się tej abominacji nazywać językiem Niestety, niektórzy uparcie trwają w tym błędnym przekonaniu 😉 A poza tym pisząc w PHP można się wielu przydatnych rzeczy dowiedzieć, np. jak jest po hebrajsku dwukropek 🙂 1 Cytuj Link do komentarza Share on other sites More sharing options...
Leoneq Lipiec 15, 2021 Autor tematu Udostępnij Lipiec 15, 2021 ja narzekałem i narzekam dużo na jave, ale jak zaczynam mówić że java od czegoś lepsza to naprawdę mi coś nie idzie. bo java jednak jak dała nullpointerexception to dało się to jakoś obejść w try/catch, a w c mam wskaźnik do tablicy który mi się nie dodaje, bo zostaje "optimized out", i volatile nie pomógł jakoś. Im dłużej w tym siedze tym coraz bardziej chyba wchodzę w ten dołek, o tutaj: aaaaleeee jakoś tam coś idzie do przodu to zapoznam się z strotol. Dzisiaj jakoś spróbuję zoptymalizować kod (uart na przerwaniach) oraz, jak mówiłem, ogarnąć DFPlayera do końca. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Lipiec 15, 2021 Udostępnij Lipiec 15, 2021 7 minut temu, Leoneq napisał: java jednak jak dała nullpointerexception to dało się to jakoś obejść w try/catch Zawsze możesz stosować referencje... Poza tym mikrokontroler nie jest od tego żeby poprawiać błędy programisty. 9 minut temu, Leoneq napisał: spróbuję zoptymalizować kod (uart na przerwaniach) Nie zrozum mnie źle, ale chyba zanim zabierzesz się za optymalizację kodu powinieneś zapoznać się z językiem w którym to piszesz (a przypominam, że funkcje z bibliotek standardowych są częścią języka). 11 minut temu, Leoneq napisał: w c mam wskaźnik do tablicy który mi się nie dodaje Możesz coś bliżej na ten temat bo nie rozumiem... Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!