Skocz do zawartości

Tablica liderów


Popularna zawartość

Pokazuje zawartość z najwyższą reputacją od 19.07.2019 we wszystkich miejscach

  1. 9 punktów
    Interaktywna zabawka dla kotów gwarantująca zabawę w każdej chwili, żaden kot nie oprze się uciekającej czerwonej kropce. Jest to niewielkie pudełeczko z wbudowanym modułem wifi i banalnie prostą obsługą. Główne funkcje: sterowanie dowolnym urządzeniem z przeglądarką internetową. losowe ruchy lasera o zmiennej prędkości. ustawianie czasu jak długo ma działać. ustawianie harmonogramów automatycznego włączenia. regulacja jasności lasera. regulacja zakresu ruchu i prędkości lasera. możliwość sterowania z dowolnego miejsca na świecie przez internet. sterowanie za pomocą google asystenta. prosta konfiguracja. Zabawka może być zasilana dowolną ładowarką od telefonu, może to być również powerbank. Przy pierwszym uruchomieniu zabawki, zostanie uruchomiona nowa sieć wifi ..::LASERCAT::.. wystarczy połączyć się z nią i wskazać naszą sieć domową, a po zrestartowaniu urządzenie automatycznie podłączy się do niej i już możemy korzystać z zabawki. Z tyłu znajduje się wejście zasilania micro USB, jak w telefonie oraz przycisk. Krótkie wciśnięcie to włączenie/wyłączenie lasera, przytrzymanie przez 3 sek. powoduje rozłączenie obecnej sieci wifi i uruchomienie ponownej konfiguracji. Gdy urządzenie jest już podłączone do naszej sieci wifi to po wpisaniu adresu zabawki w przeglądarce internetowej zobaczymy panel sterujący: Zastosowany laser jest małej mocy, taki sam jak w innych tego typu zabawkach czy bazarkowych wskaźnikach. Dodatkowo dla bezpieczeństwa jest możliwość ustawienia mocy świecenia lasera od 0% do 100%. Pozostałe ustawienia pozwolą dostosować zakres ruchów do miejsca w którym znajduje się zabawka i określić czy kropka ma się poruszać tylko po podłodze, czy częściowo wchodzić na ścianę co może dostarczyć dodatkowej frajdy dla kota. Schemat jest bardzo prosty: Widok płytki PCB: Jak zwykle w garażowym zaciszu metodą "żelazkową" - elektronicy używają żelazka zdecydowanie częściej jak ich partnerki - powstaje mała płytka. Płytka została zabezpieczona przed utlenianiem lakierem PVB16. Całą robotę wykonuje tutaj tani i lubiany układ ESP8266, który posiada moduł WiFi. Dioda laserowa jest zasilana źródłem prądowym dodatkowo kluczowanym z PWM-a co pozwala płynnie regulować jasność od 0% do 100%. Skoro już bebechy mam, to teraz trzeba to wszystko złożyć w całość. Obudowę wykonałem ze sklejki wyciętej laserowo, składanej na wczepy palcowe. No to składamy: Dodanie serwomechanizmów do których przyczepiony jest laser. Oczywiście bez trytytki projekt by się nie udał No i sprzęt jest gotowy, ale co nam po sprzęcie jak on zupełnie nie wie co ma robić? Nie wie, że teraz trzeba machać tym laserkiem tak żeby kot ganiał w tę i we w tę Trzeba to wszystko zaprogramować. Uruchamiamy nasze ulubione IDE czyli Visual Studio Code z wtyczką PlatformIO i zaczynamy pisać program. Soft został napisany z wykorzystaniem Arduino Core, a na całość składa się kilka części: główny program sterujący silniczkami, wyznaczanie losowych ścieżek. serwer www, który udostępnia ładny panel sterowania. konfiguracja sieci WiFi z wykorzystaniem Captive Portal. multicast DNS. stworzenie strony www (html + css + javascript). obsługa komunikacji po websockecie. zdalne wgrywanie plików przez stronę www, np. zmiana wyglądu głównej strony. zdalna aktualizacja oprogramowania bez zbędnych kabli. W oczekiwaniu na gotowe oprogramowanie tester cierpliwie czeka. Panel sterujący dostępny z poziomu przeglądarki internetowej nie jest hostowany nigdzie na zewnątrz, całość znajduje się w zabawce, wykorzystałem bootstrapa plus kilka dodatkowych komponentów. Zastosowany mDNS pozwala połączyć się z urządzeniem wpisując w przeglądarce adres "lasercat.local" zamiast adresu IP. Niestety na chwilę obecną android nie wspiera tego typu rozwiązań, ale na iPhonach działa to bardzo dobrze. Na filmie mała prezentacja z trochę już wybawionym głównym testerem Elroyem a poniżej pokazano jak można włączyć zabawkę po prostu mówiąc do telefonu "Ok Google, włącz laser"
  2. 9 punktów
    Dawno, dawno temu, kiedy Internet jeszcze raczkował... Miałem niesamowite szczęście — zostaliśmy zaproszeni do zwiedzenia Studia Hensona. My — to znaczy cały zespół pewnego teatru. Łazilismy po tym studio, nasi artyści rozmawiali z ichniejszymi artystami... a ja się nudziłem jak mops. Na szczęście Cheryl Henson to zauważyła, i po mojej informacji że jestem technikiem a nie aktorem — zaprowadziła mnie do pracowni. Dużo mógłbym na tem temat mówić (nie wiem czy mi wolno, ale technologie chyba nie są już tajemnicą), w każdym razie szczękę z podłogi zbierałem jakiś tydzień. Kermit na selsynach (kto pamięta co to?), kostium misia (tego z reklamy Coli) nafaszerowany elektroniką chyba bardziej niż skafander Armstronga, tajemniczy proces tworzenia skóry Piggy czy czterdziestocalowy kineskopowy monitor w montażowni... Wtedy postanowiłem sobie, że też muszę zrobić lalkę. Może nie jestem mistrzem w konstrukcji lalek, ale coś na ten temat wiem... Problem był prosty: o ile lalki Hensona przeznaczone są do filmu (czyli trzy osoby animujące Kermita, akumulatory wystarczające na kilka minut i zasada "czego nie widzi kamera tego nie ma") — o tyle ja chciałem zrobić lalkę teatralną. Dla niezorientowanych mam proste porównanie. Lalka Hensona jest jak wyścigowy bolid, który zasuwa najszybciej jak może (ale co okrążenie trzeba mu wymienić opony razem z kołami, zatankować, najlepiej zrobić pełny przegląd a do jazdy potrzebna jest kilkuosobowa ekipa). Lalka teatralna przypomina bardziej terenówkę — wjedzie wszędzie, tankuje się raz na jakiś czas jeśli gdzieś w pobliżu jest stacja benzynowa, przegląd się robi raz przed wyjazdem, a do prowadzenia jest potrzebny kierowca sztuk jeden. A jednak postanowiłem, że coś tam podpatrzę z Hensona, coś z typowych teatralnych lalek, i może coś wyjdzie. Wybór padł na jawajkę z dwóch powodów: po pierwsze jest stosunkowo prosta w konstrukcji, po drugie osoba która miała ową lalkę animować specjalizuje się właśnie w jawajce. Od razu uprzedzam ewentualne pretensje i aluzje do worklogów: moim celem było zrobienie pełnej konstrukcji i sprawdzenie, czy animacja jest w ogóle możliwa. Ubranie i makijaż to inna sprawa, muszę wybrać czy będę płacić, czy nauczę się szyć (to drugie chyba bardziej mi odpowiada) czy w ogóle zostawię lalkę taką jaka jest na pamiątkę i wezmę się za następną; w każdym razie projekt jest z mojej strony skończony. Zacząłem od założeń. Przede wszystkim postanowiłem trochę zmienić zasady ruchu głowy. W najprostszej jawajce głowa jest nieruchoma. Dodatkowe możliwości to ruch obrotowy, ew. możliwość skłonu. O ile z ruchem obrotowym nie ma problemu, o tyle różne mechanizmy przenoszące napęd na głowę bywają chimeryczne i awaryjne (a to zerwie się gumka prostująca głowę, a to coś stanie się z linką). Dodatkowo aby zmusić lalkę do skłonu głowy potrzebna jest stosunkowo duża siła. Tak więc naturalne mi się wydało zastąpienie takiego mechanizmu elektronicznym. Chciałem również wyposażyć lalkę w możliwości w jawajkach rzadko spotykane: możliwość poruszania oczami oraz przynajmniej jedna chwytna ręka. Tu też z uwagi na samą konstrukcję jawajki i sposób animacji nie jest możliwe zrobienie tego poprzez czysto mechaniczne rozwiązania. I tak mam zaszczyt przedstawić: Maestro Zittaurus, mistrza obojga magii, dla znajomych Ziutek (dla dalszych znajomych pan Ziutek). "Kręgosłup" lalki (zastępujący tradycyjny kij) został wykonany z dwóch rurek: wewnętrzna grubościenna rurka wodociągowa PCW 17mm przenosi ruch obrotowy na głowę, a jej sztywność wystarczy aby się nie uginała w czasie poruszania lalką. Zewnętrzna to zwykła cienkościenna rurka instalacyjna, na której spoczywa ciężar głowy i do której mocowane są ramiona. Głowę zaprojektowałem w programie FaceGen 3d Print (bardzo dobrze działa pod Wine) jako solid model i OpenSCAD-em wyciąłem w niej miejsca na oczy oraz mechanizmy napędowe.Przewody do serw biegną wewnątrz rurki. Użyłem tu zwykłych serw micro TowerPro SG90 przede wszystkim ze względu na ich popularność (a poza tym kilka ich miałem). Niestety — z kilku przyczyn nie było to dobry wybór, ale o tym później. Trochę problemu sprawił mi mechanizm dłoni. Nawet najmniejsze dostępne serwa są za wielkie, aby umieścić je wewnątrz dłoni. Tym samym umieszczając serwo w przedramieniu musiałem zmienić tradycyjny sposób mocowania dłoni (sznurek) na jakiś sztywny. Myślałem na początku o czymś w rodzaju bowdena, ale w mońcu wpadłem na pomysł zastosowania podwójnego przegubu kulowego. Kule zostały wydrukowane, łączący je pręt to ucięty kawałek śruby M4 przewiercony wzdłuż wiertłem 1.8 mm. Przycisk wyzwalający zamknięcie dłoni został umieszczony w rękojeści czempuritu. Początkowo projektowałem sterowanie proporcjonalne — ale szybko zdałem sobie sprawę, że nie ma to żadnego sensu: układ dłoni animatora na rękojeściach nie pozwala na tego typu sterowanie, dużo lepszym rozwiązaniem jest po prostu przycisk, po którego naciśnięciu zmienia się stan dłoni (zamknięta/otwarta). W rękojeści została umieszczona cała elektronika: akumulator 18650 2600 mAh, ładowarka z zabezpieczeniem, przetwornica MT 3608 oraz Arduino Pro Mini. Do sterowania ruchami głowy i oczu służy płaski joystick oraz pierścień (żółty na zdjęciu) do obracania głową na boki. Joystick został umieszczony zgodnie z życzeniem animatorki — tak jest jej najwygodniej operować. Do kontroli stanu akumulatora słuzy dioda — jeśli zaczyna migać, warto rozejrzeć się za jakąś ładowarką. Nie zamieszczam schematu — w końcu to trywialne podłączenie joysticka, przycisku i trzech serw do małego Arduino. Kod jest bardzo prosty, od typowego różni się wyłącznie klasą MyServo automatycznie odłączającą serwomechanizm jeśli nie jest używany przez co najmniej sekundę: #include <Servo.h> class MyServo: public Servo { public: MyServo(int pin); void writePos(int pos); void heartbeat(void); private: bool rlyAttached; int lastPosition; int servoPin; uint32_t lastMillis; }; MyServo::MyServo(int pin) { servoPin = pin; rlyAttached = 0; lastPosition = -1; } void MyServo:: writePos(int pos) { pos = constrain(pos, 0, 180); if (pos != lastPosition) { if (!rlyAttached) { rlyAttached = true; attach(servoPin); } write(pos); lastPosition = pos; lastMillis = millis(); return; } heartbeat(); } void MyServo:: heartbeat(void) { if (rlyAttached && millis() - lastMillis > 1000UL) { detach(); rlyAttached = 0; } } #define OCZY_PIN A1 #define GLOWA_PIN A0 #define REKA_PIN A2 #define VOLT_PIN A3 #define OCZY_SRV 11 #define GLOWA_SRV 10 #define REKA_SRV 12 #define LED_PIN 13 MyServo reka(REKA_SRV), glowa(GLOWA_SRV), oczy(OCZY_SRV); #define MINVOLT 675 #define MAXVOLT 775 void setup() { reka.writePos(90); oczy.writePos(90); glowa.writePos(180); pinMode(LED_PIN, OUTPUT); pinMode(REKA_PIN, INPUT_PULLUP); } uint32_t handStateChanged; bool handState; int handLevel = 180; int headLevel = 180; int eyesLevel = 90; #define OKO_BL 500 #define OKO_BU 550 #define OKO_LL 250 #define OKO_LU 810 void getInput(void) { int v_oko = analogRead(OCZY_PIN); int v_glowa = analogRead(GLOWA_PIN); int v_volt = analogRead(VOLT_PIN); bool v_reka = digitalRead(REKA_PIN); v_volt = constrain(v_volt, MINVOLT, MAXVOLT); v_volt = map(v_volt, MINVOLT, MAXVOLT, 100, 1000); digitalWrite(LED_PIN, (millis() % 1000) < v_volt); v_glowa = constrain(v_glowa, 220,490); v_glowa = map(v_glowa, 490,220,180,0); if (v_glowa == 180 || v_glowa == 0 || abs(v_glowa - headLevel) >10) { headLevel=v_glowa; } v_oko = constrain(v_oko, OKO_LL, OKO_LU); if (v_oko < OKO_BL) v_oko = map(v_oko,OKO_LL, OKO_BL,0,90); else if (v_oko > OKO_BU) v_oko = map(v_oko,OKO_BU, OKO_LU,90,180); else v_oko = 90; if (v_oko == 0 || v_oko == 180 || v_oko == 90 || abs(v_oko - eyesLevel) >= 6) { eyesLevel = v_oko; } if (v_reka == handState) return; if (millis() - handStateChanged < 200UL) return; handState = v_reka; handStateChanged = millis(); if (!handState) { handLevel=handLevel?0:180; } } void loop() { getInput(); reka.writePos(map(handLevel,0,180,0,90)); glowa.writePos(headLevel); oczy.writePos(180-eyesLevel); } Ziutek wyszedł mi całkiem nieźle (tzn. realizuje wszystko co założyłem), a teraz kolej na możliwe poprawki: W rękojeści powinien się znaleźć wyłącznie stosunkowo ciężki akumulator wraz z ładowarką. Arduino i przetwornicę należałoby podwiesić do rurki na wysokości tułowia lalki. W tym przypadku nie wchodzi już w grę przeprowadzenie przewodów wewnątrz rurki, ale rozwiązanie tego nie powinno być problemem. Dodatkowo należałoby wyprowadzić na jakimś gnieździe interfejs UART. Przycisk sterujący otwarciem/zamknięciem dłoni powinien być zdublowany na rękojeści. Sterowanie ruchami głowy powinno być możliwe za pomocą jednego palca. W ten sposób uzyskam pewniejszy chwyt rękojeści i możliwość łatwiejszego operowania manipulatorami oczu i dłoni. Sama rękojeść powinna być dopasowana do dłoni konkretnego animatora. No i oczywiście należy zastosować inne serwa; jakie — o to już będę pytał we właściwym dziale. W razie pytań jestem do dyspozycji.
  3. 7 punktów
    Po zbudowaniu robota czworonożnego w układzie ssaka (robot "Garfield") chciałem spróbować zbudować coś w układzie gada. Zdecydowałem wykorzystać jako bazę wyjściową robota MiniKame, którego pliki STL i instrukcja złożenia dostępne są na Thingiverse. Jak łatwo zauważyć wyżej wymienione układy cechuje różnica w płaszczyźnie obrotu drugiego stopnia swobody względem pierwszego - dla ssaka jest to jedna, dwuwymiarowa płaszczyzna XY, dla gada ułożenie tych płaszczyzn jest prostopadłe - aby lepiej je zilustrować, zacznę od zdjęć: Mechanika Jak wspomniałem, wyszedłem z gotowego projektu, ale nie chciałem bezmyślnie wydrukować części, zmontować, wgrać wsadu i cieszyć się gotowym robotem. Zacząłem od zmodyfikowania głównego korpusu, ponieważ oryginał jako zasilania używa dwóch akumulatorów litowo-jonowych 18650 oraz gotowej płytki - kontrolera serwomechanizmów, a całość zamykana jest w dwuczęściowej obudowie. Zachowałem pierwotne wymiary (rozstaw otworów), dodałem szczelinę, do której wsuwany jest akumulator LiPol 2S 800mAh i otwory mocujące tradycyjnie już płytkę uniwersalną 5x7cm. Elementów nóg nie zmieniałem, dodam tylko, że są nieco trudne w drukowaniu, potrzebne są liczne podpory. Drukowane 3D są również pomarańczowe dystanse mocujące płytkę rozpoznającą głos, ale o niej za chwilę. Jeśli chodzi o napędy, ku zaskoczeniu wszystkich są to serwomechanizmy SG-90 Elektronika Jeśli ktoś czytał mój poprzedni wpis, również nie będzie zaskoczony - wykonałem własny sterownik serw, klasycznie Arduino Nano + stabilizator LM7805 - wiem, że nie jest to idealne i najlepsze rozwiązanie, ale działa Akumulator z płytką łączy JST-BEC - z przodu płytki wyprowadziłem złącze UART do płytki-modułu rozpoznającego dźwięk (jeżeli ktoś jest zainteresowany szczegółami, wiele informacji znajdzie pod hasłem "Arduino voice recognition", a sam moduł funkcjonalnością podobny jest do produktu SparkFun'a - identycznego należy szukać na chińskich portalach aukcyjnych ). Podstawową zaletą płytki jest jej prostota obsługi i działanie off-line, wadą zaś konieczność powtórzenia polecenia niekiedy kilkukrotnie. Moduł działa na zasadzie "nagrania" wzorców (maksymalnie 7, wystarczy zrobić to raz) w trybie nauki, a następnie, w trybie czuwania, po wykryciu dźwięku (moduł porównuje to, co otrzymuje mikrofon, z tym, co zapisał w pamięci, zatem rozpoznaje jedynie głos właściciela) przesyła przez UART informację typu "wykryto komunikat 1". Robot obsługuje komendy: naprzód, do tyłu, w lewo, w prawo, skacz, tańcz, pompki. Aha, jeszcze jedna sprawa - skuteczność rozpoznawania spada drastycznie przy nawet minimalnym szumie, stąd konieczność uciszenia widowni i wyłączenia wentylatora czy klimatyzacji. Niemniej moduł, który był głównym elementem mojej modyfikacji, okazał się bardzo udanym i efektownym pomysłem jak na swoją cenę (około 200PLN). Zastosowałem jeszcze jedną sztuczkę - kiedy robot chodzi, niemożliwe jest rozpoznanie komunikatu typu "stop", dlatego z przodu zamontowałem czujnik Sharp'a 4-30cm - kiedy przyłożę rękę, robot zatrzymuje się i mogę wydać kolejne polecenie Oprogramowanie W kwestii oprogramowania ponownie nie ma nic odkrywczego, moja praca polegała głównie na skomunikowaniu Arduino-moduł Voice Recognition przez UART (software'owy), autorzy udostępnili gotowe schematy i bibliotekę, która zawiera gotowe sekwencje chodu i innych ruchów (wspomniane skoki, pompki i taniec) - poniżej film Pozdrawiam, wn2001
  4. 6 punktów
    Podczas ostatniej akcji kuponowo-rabatowej stałem się posiadaczem RaspberryPi 3B+. Od początku w planach miałem wykorzystanie tego mini komputerka jako serce konsoli retro. W pierwszej chwili chciałem stworzyć duży, stacjonarny automat Arcade. W porę doszedłem jednak do wniosku, iż nie mam za bardzo miejsca na taki "mebel". Dlatego też wizja się zmieniła. Postanowiłem zbudować przenośne urządzenie, podpinane do dowolnego Tv za pomocą kabla HDMI o długości 5m. Tak oto zrodziły się pierwsze plany. Zrobiłem jak zwykle przegląd rynku, sprawdziłem ceny poszczególnych elementów, analizowałem swoje możliwości wykonania obudowy. Ten etap trwał dość długo, ponieważ nie ukrywam, iż mam mało czasu na takie zabawy. Jednak w maju w końcu zabrałem się do budowy. Na początek musiała powstać przemyślana obudowa. Zdecydowałem się na zestaw przycisków i joystików z Aliexpress (nie spieszyło mi się, a za zaoszczędzone pieniądze można kupić coś dodatkowo). I tak oto w czerwcu stałem się posiadaczem zestawu jak poniżej: Oczywiście na tym etapie wybrałem już sposób rozmieszczenia przycisków i dokupiłem dodatkowo przyciski COIN oraz 1GRACZ i 2GRACZY (dolny rząd): Obudowa została wykonana ze starych paneli, narożniki wzmocnione kantówką 2x3cm i 2x2cm (wszystko z posiadanych ścinków). Rozplanowałem też umieszczenie wentylatora nawiewowego oraz kratki wentylacyjnej, co by zapewnić naszej konsoli dobre warunki pracy (wentylator z PC na 12V). Panele są różne, więc po wykonaniu pudła całość została przeciągnięta szpachlą samochodową z włóknami wzmacniającymi oraz przeszlifowana. Tak wykonana obudowa została oklejona folią carbon zakupioną na allegro. Skoro przyjąłem, że konsola będzie przenośna to trzeba było wzmocnić narożniki. Zrobiłem to z wykorzystaniem kątowników aluminiowych oraz narożników. Pozostało wykonanie połączeń elektrycznych. Przyciski są podświetlane, więc szkoda było tego nie wykorzystać. Stąd mamy po 4 przewody do każdego przycisku. Wykorzystałem posiadany zasilacz 5V 4A i zasiliłem z niego całość: poprzez przejściówki adapter gniazda 5.5/2.1-microUSB RaspPi, podświetlenie przycisków, wentylator. Na potrzeby wentylatora od PC dołożyłem małą przetwornicę StepUp ustawioną na 12V. Trzeba było rozplanować wyprowadzenie HDMI, USB i gniazdo zasilania z obudowy. W tym celu wyfrezowałem sobie płytkę z aluminium i umieściłem w niej takie oto przedłużki: Oczywiście serce naszej konsoli również znalazło się w środku wraz z oprogramowaniem RetroPie 4.5 i kartą SD 64GB zapełniona grami. Przy pierwszej konfiguracji korzystałem ze standardowej klawiatury PC ale w późniejszym etapie dla wygody wykorzystuję klawiaturę MT08 oraz dorywczo pad Tracer Recon PC. Nie opisuję procesu instalacji i konfiguracji RetroPie, ponieważ najlepiej w tym celu korzystać z internetu i strony projektu; https://retropie.org.uk/ Całość działa od kilku dni. Miałem sporo problemów z konfiguracją joysticków. Początkowo dobrze działały tylko w menu RetroPie a w grach osie i przyciski były pozamieniane. Poradziłem sobie z tym ręcznie edytując pliki konfiguracyjne i w nich dokonałem odpowiednich zmian. Dłuższe testy pokażą co należy zmienić. Już na wstępie planuję dodanie przycisku do zał/wył malinki: Do dopełnienia całości - od spodu znajduje się 6 gumowych nóżek, by nie rysować stołu/ławy itp. Wszystkie zdjęcia pochodzą z różnych etapów budowy i nie koniecznie odzwierciedlają w pełni gotowe urządzenie. Jednak już w takiej formie przechodziło wstępne testy. RaspPi jest podczepione do dolnej płyty. Wszystko w środku zamocowane by nic nie latało. Wentylator wraz z przeciwległą kratką zapewniają bardzo dobre chłodzenie wszystkich urządzeń. Na razie z niedogodności to w razie problemów z kartą sd trzeba rozkręcić dół (8 śrubek w narożnikach). Przydałaby się jakaś mała klapka rewizyjna, ale na razie nie mam pomysłu na jej wykonanie. Ostatecznie dodam chyba również oznaczenia na przyciskach.
  5. 6 punktów
    Cześć wszystkim! Po dość długiej nieobecności na forum powracam z nowym projektem. Jest to robot kroczący, którego planowałem zrobić już od dwóch lat, ale nie miałem do tej pory czasu przez łączenie studiów z pracą. Do tego nie umiałem za bardzo zaprojektować mechaniki i dopiero niedawno mnie olśniło, że można kupić gotową Mechanika Robot ma cztery nogi, każda ma 3 stopnie swobody. Rozważam późniejsze dołożenie czwartego, bo jeszcze mi zostało serw, ale na razie zostawię go w tej konfiguracji. Do sklecenia konstrukcji użyłem platikowej obudowy jako korpusu i gotowych uchwytów na serwa przykręconych do siebie. Troszkę pójście na łatwiznę, ale ja wolę zajmować się częścią programistyczną Muszę jeszcze pomyśleć nad jakimiś końcówkami do nóg, bo na razie nie będą stabilne w każdej orientacji. Serwa to PDI-6221MG kupione na Banggood, ze względu na atrakcyjną cenę i jak na razie nie wydają się być złe. Staty: 0.16s/60°, 20kg*cm. Elektronika Układ zasilam przerobionym zasilaczem komputerowym. Na jego wyjściu mam 12V, żebym potem mógł to bezproblemowo zastąpić baterią LiPo. Napięcie jest potem obniżane na 5V do zasilania RPi i sterownika serw, oraz na 6V do zasilania serw. Układ jest zrobiony przez mojego brata i szczerze mówiąc nie wiem, co tam jest Rzekomo ma wydajność do 3A, przez co będę go w niedługim czasie zmieniał, mam już na oku przetwornicę na 15A, choć może jakąś mniejszą dam. W dodatku dzisiaj się przekonałem, że słabe kable potrafią naprawdę przeszkadzać: do zasilania RPi używałem zwykłych kabli do płytki stykowej, dopóki nie zauważyłem problemów z wyświetlaczem. Zmierzyłem napięcie na układzie zasilającym: 4.9V, zmierzyłem na RPi: 4.2V, zmierzyłem na kablach: 0.4V. Ich rezystancja była na tyle duża, że odkładały się tam niemałe napięcia, do tej pory myślałem, że to tylko teoretyczny problem, a tu proszę. Z tego powodu zasilam RPi w tym momencie z ładowarki do telefonu. Sterownik na 24 serwa też kupiłem na Banggood czy Aliexpress, tu jest opis. Komunikuje się po UART. Jeszcze nie robiłem mu testów wydajnościowych, ale nie wydaje się zły. Kupiłem specjalnie na większą liczbę serw, jakbym jeszcze chciał dołożyć nogom dodatkowe stopnie swobody albo dać jakiś manipulator na wierzchu. Mózgiem jest Raspberry Pi 3b, system to Ubuntu Core 64bit z Xubuntu. Do tego jest wyświetlacz dotykowy LCD 5" z obudową. Oprogramowanie Cały system planuję uruchomić na ROS2. Od razu ponarzekam, że ten system jest jeszcze w fazie dużego rozwoju i nie wszystkie funkcjonalności pierwszego ROSa są jeszcze zaimplementowane, m.in. odpalenie w pliku launch programów na kilku maszynach, z czego akurat chciałem skorzystać Mimo wszystko zdecydowałem się na ROS2, ponieważ ROS wspiera tylko Pythona 2, który traci wsparcie 1 stycznia 2020 (pythonclock.org/). Opiszę później w komentarzach kilka problemów w ROS2 i jak je rozwiązałem, bo dokumentacja praktycznie nie istnieje i może oszczędzi to komuś parę(naście) godzin w przyszłości. Ponadto, mimo iż na stronie jest napisane, że na RPi trzeba budować ROS2, bo paczki z repozytorium nie działają, mi się udało je zainstalować bez żadnego problemu. Jest tak może dlatego, że Ubuntu zainstalowałem w wersji ARM64 i to jakoś działa na ARMv7? Szkielet systemu mam mniej więcej zrobiony, bo w poprzednim semestrze na studiach miałem programowanie manipulatora w ROSie, będę musiał to jeszcze przeportować na ROS2 i trochę doszlifować. Udało mi się też już skomunikować z sterownikiem serw, choć nie jest to jeszcze idealne. Miałem też przy tym kilka problemów, wrzucę w komentarzu co i jak. Większość programów planuję uruchamiać na swoim laptopie i tylko sterowanie hardwarem na malince, żeby jej zbytnio nie obciążać. Może w przyszłości będę chciał bardziej usamodzielnić bota, wtedy mu dam może lepszy komputer i lżejszy system. Na wyświetlaczu planuję wyświetlać jakieś wizualizacje, aczkolwiek jeszcze nie wiem, czego Po napisaniu jakiegoś chodu chcę go sterować padem do gier. Plany na najbliższy czas Zmienić układ stabilizujący napięcie i kable Ustalić kąt 0 dla wszystkich serw Zrobić model robota w ROS Uruchomić kinematykę odwrotną (obliczaną geometrycznie) Zaimplementować prosty chód Końcówki do nóg Zacząć używać gita w tym projekcie i wrzucić kod na githuba Dalsze plany Kto to wie Ale chciałbym dać mu więcej samodzielności, mam sporo czujników w domu i wykrywanie przeszkód, czy gruntu pod nogami byłoby fajne. Chciałbym też zrobić własne zdalne sterowanie, na początku będę używał pada, ale mam też nakupione sporo joysticków i przełączników, jakbym chciał dołożyć różne bajery. Nawet mam lasery, więc włączanie ich też chcę zrobić Chciałbym też na nim pobawić się jakimiś sieciami neuronowymi i reinforcement learningiem, może jakaś nauka chodzenia, ale to już bardzo na przyszłość. Jak na razie to tyle, postaram się w miarę aktualizować tutaj postępy w pracach. Fajnie jest znowu robić robotykę Pozdro!
  6. 6 punktów
    Testowo uruchomiona została opcja ignorowania poszczególnych użytkowników W prawym górnym rogu klikamy na swój nick i z menu wybieramy "Ignorowani użytkownicy": Następnie konfigurujemy kogo chcemy blokować i w jaki sposób. Dla przykładu zablokowałem sobie @ethanak (bez urazy, to tylko test ). Od tej pory w widoku tematach posty @ethanak wyglądają dla mnie tak: Dzięki temu nie widzę treści posta, ale wiem, że tam jest. W każdej chwili za pomocą linku Opcje mogę podejrzeć konkretną wiadomość od zignorowanego użytkownika lub go odblokować. Zachęcam do testów. Nie obiecuję, że funkcja ta zostanie na forum na zawsze, ale teraz działa, więc można korzystać PS Jest jednak pewien wyjątek - nie można zablokować moderatorów, mnie oraz treści publikowanych automatycznie.
  7. 5 punktów
    Witam, jestem początkujący oraz jest to mój pierwszy projekt. Dałem sobie za zadanie zrobienie przez wakacje maszyny, która policzy mi ile jest w moim zbiorze groszy, ale chciałem zrobić to trochę inaczej niż projekty, które widziałem. Wpadłem na pomysł że skoro grosze (1, 2, 5) są różnych średnic to jeżeli ułoży się monetę miedzy fotorezystorem a diodą led to będzie można przypisać jej daną wartość. Tak też zrobiłem i po chwili powstał mały cylinder na bazie Arduino Uno potrafiący rozpoznać monetę. Następnie zacząłem pracę nad tym aby moja maszyna brała monety z podajnika i liczyła je automatycznie. Wyszło że cylinder z ustawionym centralnie serwomechanizmem to najlepsza opcja. Projektowałem na programie Design Spark Mechanical, drukowałem Anet A8. Po wielu nieudanych wydrukach, wkońcu wyszedł ten właściwy i mogłem wszystko odczepić od Arduino Uno... zaczeło się lutowanie do Arduino nano, jak mozna się spodziewać po początkującym długie i mało umiejętne. Po wydrukowaniu całego mechanizmu zaprojektowałem obudowę, a następnie zrobiłem adaptacje do warunków oświetleniowych panujących w jej wnętrzu. Z uwagi na małą precyzję mojego czujnika maszynka czasem się myli, o jakiś grosz/dwa na złotówkę, jednakże jestem zadowolony z mojego pierwszego projektu :)) A oto krótki i prosty kod : #include <Servo.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); Servo servo; int odczytanaWartosc = 0; int tlo = 0; float wartosc = 0; float kwota = 0; void setup() { lcd.begin(16,2); lcd.backlight(); lcd.setCursor(0,0); pinMode(6, OUTPUT); Serial.begin(9600); digitalWrite(6,HIGH); servo.attach(9); } void loop() { kwota = wartosc / 100; lcd.setCursor(0,0); lcd.print("KWOTA"); lcd.setCursor(7,0); lcd.print(kwota); servo.write(180); delay(400); servo.write(80); delay(300); odczytanaWartosc = analogRead(A1); if(odczytanaWartosc > 30 && odczytanaWartosc < 50){wartosc = wartosc + 1;} if(odczytanaWartosc > 22 && odczytanaWartosc < 30){wartosc = wartosc + 2;} if(odczytanaWartosc < 22 && odczytanaWartosc > 3){wartosc = wartosc + 5;} servo.write(0); delay(400);}
  8. 5 punktów
    Do budowy (już z kilka ładnych lat temu) czworonożnego robota w układzie ssaka zainspirowały mnie projekty Kolegi @deshipu, któremu w tym miejscu chciałbym podziękować za pomoc między innymi przy opracowaniu ramki chodu. Robot nazywa się "Garfield", powstał przy okazji "eksperymentów" z robotami kroczącymi. Muszę przyznać, że świetnie spełnia swoją podstawową funkcję, jaką jest przyciąganie uwagi mniej wtajemniczonej publiczności przy okazji różnych pokazów, szkolnych eventów itd. BTW - Aktualnie pracuję nad znacznie większym projektem, i zauważyłem, że zainteresowanie danym projektem osób niewgłębiających się w tajniki techniczne nie zawsze jest proporcjonalne do stopnia jego skomplikowania Przechodząc jednak do konkretów, na początek kilka zdjęć: Mechanika Mechanika robota jest wręcz banalna - jest to 8 serw SG-90, po 2 na każdą nogę. Cztery serwa, będące pierwszymi stopniami swobody u nóg, są przymocowane do płytki uniwersalnej za pomocą ciepłego kleju. Następnie do orczyków przykręcone są kształtki drukowane 3D, a na do drugiego końca przekręcone są serwa pełniące funkcję "kolan". Następnie do tych serw przyklejone są (znowu hot glue ) końcówki-stopy. Aby zwiększyć przyczepność, warto założyć tam jakieś odcinki gumowej rurki, ja akurat miałem modelarską, dostarczającą paliwo do silnika, bardzo dobrze sprawdziła się w tej roli. Korpus, jak wspomniałem wcześniej, tworzy płytka uniwersalna z całością elektroniki (o której za chwilę) 7x9cm; akumulator LiPol 2S 800mAh zamocowany jest pod spodem za pomocą 2 gumek-recepturek. Rozwiązanie to w tym konkretnym robocie sprawdziło się bardzo dobrze dzięki prostocie, pewności zamocowania i możliwości szybkiej wymiany źródła zasilania Elektronika Elektronika tego typu robota również nie należy do najtrudniejszych, bo jej głównym zadaniem jest kontrola 8 serw. Na początek zasilanie - dostarczeniem 5V potrzebnego do zasilania Arduino Nano i serwomechanizmów zajmuje się stabilizator LM7805 z radiatorem TO220 i dwoma kondensatorami. Wiem, że nie jest to idealne rozwiązanie, gdyż pobierając około 1A (w trakcie normalnej pracy) tracone jest (8V (gdy akumulator jest prawie naładowany) - 5V) * 1A = 3W mocy, a stabilizator ten przestaje działać przy napięciu wejściowym około 7V. Pierwsza wada powoduje, że stabilizator potrafi być gorący, a druga jest w pewien sposób plusem - nie jest możliwe rozładowanie ogniw poniżej słynnych 3V/celę Niemniej, przetwornica impulsowa byłaby pozbawiona tych wad, ale mój układ też działa. Dobrze, następnie napięcie wyjściowe trafia do Nano i serw, które są bezpośrednio z niego wysterowane. Ponadto, na płytce znajduje się też TSOP4838 wraz z elementami pomocniczymi, które pozwalają sterować robotem za pomocą podczerwieni - wykorzystałem do tego celu pilot od aparatu SONY, który zawiera kilkanaście przycisków, a ponadto jest mały i podręczny. Ponieważ na płytce zostało nieco wolnego miejsca, przylutowałem dwie diody 10mm, czerwoną i żółtą, coś w stylu oczu. Ostatnia sprawa - do połączenia akumulatora z płytką wykorzystałem złącze T-DEAN. Zdecydowałem się na takie rozwiązanie, ponieważ tego typu złącze mimo, że nieco przestarzałe, jest pewne i niezawodne - w każdym bądź razie, gdyby ktokolwiek chciałby kiedyś wymienić złącze w swoim akumulatorze LiPo, musi pamiętać o najwyższych środkach ostrożności. Oprogramowanie Program został napisany rzecz jasna w Arduino IDE, do sterowania serwomechanizmami wykorzystałem bibliotekę Servo, a do czujnika TSOP - IRremote. Linia danych z tegoż czujnika podłączona jest do pinu 2 w Nano, który potrafi obsłużyć przerwanie. Wówczas, za pomocą polecenia attachInterrupt() Arduino, gdy odbierze sygnał, modyfikuje wartość zmiennej przechowującej informację, jaki przycisk właśnie naciśnięto. Następnie na początku pętli loop() sprawdzane jest, jaką funkcję wybrał użytkownik, może być to ruch - w programie zapisane zostały ramki chodu naprzód, do tyłu, w lewo i prawo, a jeżeli jest to jakaś pozycja (typu złożony/rozłożony, korpus wysoko/nisko itd.), to prostu są to punkty, do których ustawić się mają końcówki nóg. Rzecz jasna nie podaję kątów, a punkty w układzie XY (kinematyka odwrotna) - brzmi to skomplikowanie i groźnie, a wcale tak nie jest - dla dwuwymiarowej płaszczyzny wystarczy znać tw. Pitagorasa i tw. cosinusów - nie różni to się zbytnio od znalezienia kątów w trójkącie o znanych długościach boku, a znacząco ułatwia programowanie ruchów w tego typu konstrukcjach. Obowiązkowy film To opis w dużym skrócie, gdyby ktoś miał jakiekolwiek pytania - proszę śmiało pisać Pozdrawiam, wn2001
  9. 5 punktów
    LiPol Charger v1.0 / v2.0 Szanowni czytelnicy forum w tym krótkim artykule przedstawię Wam projekt ładowarki do akumulatorów litowo-polimerowych 2 celowych (7,4V). Prace nad projektem rozpoczęły się bardzo dawno temu, co można było śledzić w tym wątku. Dużą rolę w trakcie projektowania samego układu odegrał kolega @marek1707. Tak naprawdę ostateczna forma pierwszej wersji ładowarki została bardzo mocno zasugerowana przez niego dzięki temu działa ona niezawodnie. Układy zostały zaprojektowane wedle następujących założeń: możliwość ładowania akumulatorów 2 celowych przy pomocy źródła zasilania o napięciu 5V i natężeniu prądu nie większym niż 1A (na tyle pozwalały zastosowane elementy elektroniczne) oraz ładowanie z wykorzystaniem 2 paneli słonecznych 6V/300mA, które aktualnie miałem pod ręką - stąd zastosowano układ przetwornicy typu boost, zastosowanie przewodowej lub bezprzewodowej komunikacji z komputerem PC, wykorzystanie diod LED do sygnalizacji stanów pracy ładowarki, (v2.0) wyświetlanie informacji na wyświetlaczu alfanumerycznym 2x16, (v2.0) dodanie przycisków do ręcznej interakcji użytkownika z urządzeniem, (v2.0) wbudowanie prototypu prostego balansera ogniw, (v2.0) wyprowadzenie padów do programowej kalibracji przetwornika ADC. LiPol charger v1.0 Wersja pierwsza ładowarki jest wersją niekombinowaną oraz dość niezawodną. Pełny cykl ładowania akumulatora obejmuje zarówno fazę CC (stałoprądową) oraz CV (stałonapięciową). Cykl ten świetnie obrazuje WYKRES, który podrzucił mi kolega @marek1707 i który zapamiętam do końca swojego życia Zasadę działania przetwornicy boost wydaje mi się, że każdy elektronik powinien znać. Jeśli jednak czytelniku nie miałeś okazji zapoznać się z tym rodzajem przetwornic podsyłam ciekawe artykuły na ten temat: LINK, LINK. W skrócie - na wejściu przetwornica otrzymuje napięcie maksymalne 6V oraz prąd maksymalny 1A. Sygnał PWM generowany przez mikrokontroler ze stałą częstotliwością, a zmiennym wypełnieniem otwiera lub zamyka tranzystor kluczujący przetwornicę, który dzięki temu reguluje napięcie lub prąd wyjściowy przetwornicy w zależności od fazy algorytmu ładowania CC/CV. Zastosowano w tym celu najzwyklejszy regulator proporcjonalny. Mikrokontroler ma możliwość pomiaru potrzebnych parametrów tj. napięcia i prądy wejściowe/wyjściowe oraz napięcie międzyogniwowe. Napięcia są mierzone poprzez dzielniki napięciowe natomiast pomiar prądów odbywa się z wykorzystaniem układów bocznikowych. Komunikacja z komputerem odbywa się poprzez moduł Bluetooth (BTM222 lub HC-05) lub z wykorzystaniem przejściówki USB-UART. Dodatkowo domowymi metodami wykonałem shield umożliwiający podłączenie wyświetlacza alfanumerycznego 2x16. Ostatecznie wykorzystując źródło napięcia stałego 5V/1A udało się uzyskać przetwornicę o sprawności ok. 65%. Całkiem niezły wynik jak na prototyp. Straty mocy są związane ze stratami na diodzie, indukcyjności oraz NIE zastosowaniu kondensatorów typu Low ESR. Wszystkie te parametry można jeszcze trochę poprawić przez co możliwe jest zwiększenie sprawności samej przetwornicy. Wykorzystanie do ładowania paneli słonecznych zmusiło do zastosowania najprostszego algorytmu MPPT - śledzenia punktu maksymalnej mocy. Panele słoneczne połączone są równolegle przez co uzyskano większy prąd wejściowy na przetwornicę. W tym połączeniu maksymalny prąd wejściowy wynosi 600 mA dla posiadanych przeze mnie paneli 6V/300mA. Biorąc pod uwagę to, że w polskich warunkach z tych paneli jestem w stanie wyciągnąć maksymalnie 70-80% całkowitej sprawności przy bezchmurnej pogodzie prąd ładowania akumulatorów jest niewielki. Dlatego ten tryb ładowania sprawdza się raczej przy niewielkich akumulatorach. Ale najważniejsze, że się sprawdza LiPol charger v2.0 Druga wersja ładowarki nie została jeszcze przetestowana!!! Natomiast wzbogaciłem ją o kilka praktycznych dodatków, których brakowało mi w poprzedniej wersji. Wersja v2.0 została wzbogacona o prototyp balansera złożonego z dwóch oporników dużej mocy oraz tranzystorów sterowanych z poziomu mikrokontrolera, który na podstawie pomiaru napięcia międzyogniwowego decyduje o tym, który obwód „strat mocy” załączyć. Jeśli któryś z tranzystorów zostaje otwarty, przez rezystor przepływa prąd, natomiast ładowanie danego ogniwa akumulatora jest pomijane. Dzięki temu możliwe jest wyrównanie poziomów napięć na obu ogniwach. Dodatkowo wyprowadzone zostały pady pomiarowe, które znacznie ułatwiają kalibrację odczytów z przetwornika ADC. Wbudowano również konwerter USB-UART na podstawie chipu FT230XQ, wyprowadzono również piny Rx i Tx w celu podłączenia np. modułu Bluetooth. W tym projekcie udało się znacząco zmniejszyć wymiary ładowarki. Kompletne schematy obu wersji ładowarki udostępniam w pdf’ach poniżej. LiPolCharger_v1_0.pdf LiPolCharger_v2_0.pdf Wykaz ważniejszych elementów wykorzystanych w układach ładowarek: mikrokontroler ATmega32 tranzystor kluczujący MOSFET-N STS12NF30L driver MOSFET MCP1402T cewka 220 uH wzmacniacze operacyjne LM358 wyświetlacz alfanumeryczny 2x16 konwerter USB-UART FT230XQ, tranzystory bipolarne NPN i PNP dowolne, pod warunkiem, że maksymalny prąd kolektor-emiter będzie większy niż 1A. Jeśli ktoś z czytelników będzie zainteresowany tematem owych ładowarek serdecznie zapraszam do zadawania pytań w komentarzach, a także ewentualnego krytykowania (oczywiście konstruktywnego) mojego projektu.
  10. 5 punktów
    Witam wszystkich! Dzisiaj przedstawię mój kolejny projekt robota z "recyklingu", ponieważ znalazłem spisany na straty, kompletnie zniszczony samochód RC w skali 1:16. Z tej zabawki udało mi się odzyskać przedni, tylny układ napędowy i kilka mniejszych części mechanicznych. Proto ma napęd 4x4 i skrętną przednią oś. Z tego wszystkiego wyszedł całkiem szybki i zwinny robot, więc chce się nim pochwalić. Mechanika Proto: Plastikowa płytka trzymająca cały samochód w kupie była dość mocno pęknięta, a usztywnienia nie znalazłem. Postanowiłem więc samodzielnie zaprojektować i wydrukować w 3D wszystkie potrzebne części za pomocą mojej Anet A6. Dodatkowo płyta, którą wydrukowałem, okazała się trochę za długa i musiałem zaprojektować przedłużenie wała napędowego, aby zachować napęd na cztery koła. Silnik który pasował do konstrukcji to silnik typu 500 zasiany napięciem 12V, a serwo to zwykłe serwo typu standard. Uznałem, że najlepsza metoda montażu pcb z elektroniką i pakietu zasilającego to rzepy, żeby dało się szybko wymieniać te elementy. Elektronika i zasilanie: Płytkę PCB zaprojektowałem i wytrawiłem samemu, znajduje się na niej już używane przeze mnie czyli połączenie czyli H-bridge VNS2sp30, Arduino NANO i moduł bluetooth XM-15B. Ten zestaw wydaje się najwydajniejszy nawet jeśli weźmie się pod uwagę to że używam tylko jednego z dwóch sterowników na czerwonej płytce. Dodatkowo na PCB znalazł się buzzer (klakson i alarm), przycisk i dodatkowe wyprowadzenia (nie wyprowadzałem wszystkich pinów, ale teraz wiem że to lepiej było wyprowadzać wszystkie dostępne, poprawię to kiedyś). Płyta główna jest osadzona na kolejnym wydrukowanym stelażu z rzepem. Zasilanie robota to trzy ogniwa 18650 o pojemności 1000mAh każde. Projekt koszyka na ogniwa ukradłem z Thingiverse. Baterie dają napięcie ~12V i wystarczają w zupełności do prawidłowego funkcjonowania robota. Dodatkowo z tyłu zamontowany jest woltomierz do monitorowania napięcia. Aplikacja do sterowania przed Bluetooth to keuwl, moim zdaniem to jedna z najlepszych aplikacji tego typu. Na koniec pokarze jeszcze kilka fotek całego projektu i film na YouTube: Mam nadzieję że robot Proto spodoba się wszystkim użytkownikom. Pozdrawiam, Technowsky
  11. 5 punktów
    Pojawiła się potrzeba wykonania prostego sterownika do bramy garażowej, który miałby powiadamiać mieszkańców czy aktualnie garaż jest zamknięty czy otwarty oraz w dowolnej chwili sprawdzić status. Tak powstało niewielkie urządzenie montowane na szynę DIN. Jest zasilane z dowolnej ładowarki od telefonu, posiada zabezpieczenie przed odwrotną polaryzacja zasilania. Sterownik ma kilka wejść/wyjść; IN1 - dolna krańcówka od zamknięcia garażu. IN2 - górna krańcówka od pełnego otwarcia garażu. wyjście przekaźnikowe NO do zdalnego otwierania/zamykania bramy. RS485 - pozwala podłączyć czujnik odległości wykrywający czy auto jest w garażu. czujnik temperatury DS18B20. przycisk do resetowania ustawień WiFi i uruchomienia ponownej konfiguracji. W sterowniku zastosowałem popularny układ ESP8266 w wersji WemosD1 mini. Jak widać za wiele rzeczy tu nie ma, oprócz ESP znajduje się przekaźnik, DS18B20 oraz transceiver RS485. Projekt miał być prosty, szybki i jednostkowy dlatego nie zastosowałem dodatkowych stopni ochrony wejść w postaci np. optoizolacji. Tradycyjnie płytka powstała na żelazku i wytrawiona w kwasie. Polutowana i zabezpieczona lakierem do PCB. Schemat ideowy: Wspomniany wcześniej czujnik odległości jest zbudowany z wykorzystaniem ultradźwiękowego czujnika HC-SR04 i Arduino Nano, które cyklicznie wysyła informacje do głównego sterownika. Schemat czujnika: Sterownik ma zaimplementowany serwer WWW co pozwala na sterowanie praktycznie dowolnym urządzeniem z przeglądarką. A panel sterowania prezentuje się tak: Dodałem obsługę powiadomień push na telefon z wykorzystaniem mechanizmu IFTTT (if this then that). Wystarczy zainstalować tą aplikacje na telefonie, a w sterowniku wprowadzić unikalny klucz aplikacji powiązany z konkretnym telefonem. Aktualizacja oprogramowanie wykorzystuje mechanizm OTA i sprowadza się do wgrania pliku przez panel www. Dodatkowo wystawione jest proste API, które pozwala na integracje z większością systemów smart home typu Domoticz, Home Assistant itp.
  12. 4 punkty
    Dzięki za ten przykład, bo zwykle staram się szerokim łukiem omijać tablice wielowymiarowe, zawsze jest z nimi "jakiś kłopot" Niemniej jednak zadanie wyzwoliło pokłady badawcze. Musiałem przypomnieć sobie teorię i zrobić kilka przykładów, ponieważ nie jestem zbyt biegły w C oczywiście skorzystałem z debuggera, ale nie było mowy o tym, że nie można skorzystać W odpowiedzi na pytanie wartość będzie równa 0. Dlaczego? Najciekawszy jest sposób inicjalizacji, zapis w nawiasami kwadratowymi pierwszy raz widzę (brak doświadczenia), ale z tego co zdążyłem ustalić, to podmienia wartości w konkretnych polach pamięci (wiersza), zgodnie względnym wskaźnikiem w wierszu. Zatem po inicjalizacji zmienna tab będzie miała takie wartości w pamięci: tab[][4] = { { 23, 2, 7, 1 }, { 4, 1, 0, 0 }, { 0, 0, 2, 11 }, { 0, 27, 0, 7 }, { 9, 2, 1, 0 } }; Wartości 2 oraz 27 z wiersza 2 i 3 zajmą miejsca zgodnie z podanym wskaźnikami odpowiednio 2 oraz 1, "rozpychając" na inne pozycje resztę wartości w wierszach. Zatem patrząc na wyrażenie *(*(tab+2)+1) mamy wskazanie na wartość 2 wiersza i pierwszej kolumny (licząc od zera). Nie bez powodu "mówi" się, że tablica 2 wymiarowa to "wskaźnik na wskaźnik", a trójwymiarowa to "wskaźnik na wskaźnik na wskaźnik" itd. z innymi wymiarami.
  13. 4 punkty
    Pomysł budowy prostego robota dwunożnego wzorowanego na znanym i lubianym przez użytkowników Thingiverse projekcie Bob/Otto zrodził się kilka lat temu, również za sprawą projektu uBob Kolegi @deshipu, widzę też, że kilka dni temu swojego robota tego typu opisał Kolega @Leoneq . Swoją wersję nazwałem "Soto", ponieważ starałem się dodać coś od siebie, nie jest w moim stylu z automatu wydrukować pliki STL, złożyć, połączyć i gotowe Ale do rzeczy - na początek kilka zdjęć: Mechanika Wzorowałem się na tym projekcie - elementy nóg wydrukowałem oryginalne, natomiast główny korpus zaprojektowałem sam - jest powiększony (aby wszystkie elementy mogły się w nim zmieścić) oraz znacznie cieńszy (ścianka 2mm zamiast oryginalnych 5mm), a co za tym idzie - lżejszy. Oryginalny korpus był do tego stopnia za ciężki, że przy przechylaniu towarzyszącego chodzeniu przeważał całość, w wyniku czego robot dość mało efektownie przewracał się Serwa to oczywiście SG-90, każda noga ma dwa stopnie swobody, co razem daje 4 takie. Robot ślizgał się po pewnych powierzchniach, konieczne było podklejenie stóp drobnoziarnistym papierem ściernym. Za materiał do druku posłużył biały filament PLA, a za mocowanie serw i orczyków odpowiadają ciepły klej i/lub śrubki/wkręty M2. Ponadto w obudowie znalazło się miejsce na czujnik HC-SR-04, ale imituje on jedynie oczy. Co ważne jeszcze z mechaniki, całość elementów wewnątrz starałem ułożyć możliwie jak najniżej, gdyż gwarancją stabilności chodu w tego typu bipedach jest położony nisko i symetrycznie środek ciężkości. Elektronika Za zasilanie robota odpowiada LiPol 1S 3,7V - serwa, Arduino Pro Mini i moduł BlueTooth HC-05 zasilane są bezpośrednio tym napięciem, oczywiście serwa są wówczas nieco słabsze, ale w niczym to nie przeszkadza. Za ładowanie akumulatora odpowiada gotowy moduł służący do ładowania tego typu ogniw. Jak wspomniałem, sercem robota jest Pro Mini, steruje czterema serwomechanizmami oraz komunikuje się z modułem BlueTooth. Nie ma nic skompilowanego w schemacie połączeń, dodam może tylko, że z tyłu robota znajduje się przełącznik, a ładowanie odbywa się za pomocą gniazda USB umieszczonego u dołu, w związku z czym nie ma konieczności zdejmowania obudowy, aby dostać się do akumulatora Oprogramowanie Główny fragment kodu oparty jest na funkcji sinus - podczas chodu nogi niejako "wiosłują". Program to klasycznie odbieranie danych z softwarowe'go portu szeregowego i wykonywanie komend robot może podskakiwać, piszczeć brzęczykiem piezo, przyjmować różne pozycje nóg, a także napisałem choreografię do pewnego utworu muzycznego, który jest równolegle odtwarzany z tabletu. Właśnie, aplikację na Android wykonałem przy pomocy App Inventor'a i jednego z wielu tutoriali na ten temat dostępnych na YouTube. Film - z góry przepraszam za pionową pozycję telefonu (dla ścisłości - początkowa muzyka to podkład, późniejsza (0:38) natomiast odtwarzana jest przez tablet) To na tyle jeśli chodzi o zwięzły opis - jeżeli ktoś chciałby wiedzieć coś więcej, proszę pisać Pozdrawiam, wn2001
  14. 4 punkty
    To popatrz na ten kawałek kodu, porównaj z pierwszym zdaniem i przepisz go tak, aby przypominał drugie. Czy Ty przypadkiem nie przeceniasz swoich sił? Co Ci pomoże książka dla średnio zaawansowanych jeśli nie rozumiesz podstaw? Akurat wszelkie podstawy są wyjaśnione zarówno w Forbotowych kursach jak i wszelkich podręcznikach C/C++ dla początkujących - i od tego radziłbym zacząć, a nie próbować swoich sił z kodem, którego nie rozumiesz. To nie podnoszenie ciężarów, tu jak się czegoś nie rozumie to siła nie pomoże.
  15. 4 punkty
    if (y_pos < 300) { if (initial_position1 < 10) { } else { initial_position1 = initial_position1 - 10; servo2.write(initial_position1); delay(100); To jest Twój kawałek kodu. Jaka instrukcja się wykonuje, jeśli initial_position1 < 10? Które zdanie w języku polskim jest prawidłowe: Jeśli masz mniej niż dziesięć złotych, inaczej możesz kupić loda za dychę. Jeśli masz co najmniej dziesięć złotych możesz kupić loda za dychę. Już prościej nie mogę...
  16. 4 punkty
    Manipulator "Copernicus" to mój najnowszy projekt, model 4-osiowego robota przemysłowego z ssawką podciśnieniową jako efektorem. Bezpośrednim przyczyną rozpoczęcia budowy był zachwyt nad tego typu profesjonalnymi konstrukcjami, typu Kuka, ABB, Fanuc itd., a które można podziwiać między innymi na różnych targach przemysłowych Robot powstawał w ekspresowym jak dla mnie tempie, około 2 miesięcy, a jego budowa nie byłaby możliwa bez wsparcia sponsorów, którym chciałbym w tym miejscu serdecznie podziękować: Agencji Pracy MONDI Polska, która w ramach programu stypendialnego Mondi Wspiera Talenty sfinansowała większość niezbędnych elementów i części; Firmie IGUS Polska, która jako próbkę udostępniła mi przekładnię ślimakową RL-D-30; Firmie STMicroelectronics, dzięki której otrzymałem płytkę Nucleo; Zespołowi Szkół Łączności im. M. Kopernika w Poznaniu, również za pomoc finansowo-merytoryczną. Dobrze, na początek kilka zdjęć ogólnie przedstawiających robota - przepraszam za nienajlepsze tło, zdecydowanie lepiej ideę pracy robota wyjaśniają filmy Konstrukcja jest trójmodułowa, pierwsze cztery zdjęcia ilustrują właściwego robota, piąte przedstawia stację generującą podciśnienie, dwa ostatnie to sterownik robota Mechanika Podstawę robota stanowi prostokąt plexiglass'u 10mm. Pierwsza oś swobody jest pryzmatyczna, składa się z dwóch prowadnic liniowych ø10 i listwy zębatej. Następnie, na wózku z łożyskami liniowymi DryLin, również firmy Igus, znajduje się pierwsza oś obrotowa z wspomnianą już przekładnią ślimakową. Następnie, trzecią oś swobody, a drugą obrotową stanowi silnik z przekładnią planetarną oraz paskiem zębatym HTD. Ostatnią, czwartą oś, służąca ustawieniu ssawki prostopadle do powierzchni, stanowi ssawka podciśnieniowa Festo, bezpośrednio obracana przez silnik krokowy NEMA17. Taki sam silnik napędza przekładnię ślimakową, natomiast w pierwszej i trzeciej osi wykorzystałem, jak wspomniałem, silniki z wbudowaną przekładnią planetarną. Elektronika Sterownik robota jest trójpoziomowy - na pierwszym z nich znajduje się gniazdo trapezowe, sygnalizatory napięć i 2 zasilacze - 24V/8,5A oraz 12V/5A. Ten pierwszy zasila tylko silniki, natomiast drugi - pompkę podciśnieniową, elektrozawór i wszystkie pozostałe elementy, wykorzystując w tym celu przetwornicę step-down (dającą na wyjściu 5V DC - Nucleo wykorzystuje własny, znajdujący się na płytce stabilizator 3,3V). Na drugim poziomie znajdziemy wspomniane Nucleo F103 i przetwornicę, 2 przekaźniki do sterowania pompką i elektrozaworem, płytkę dystrybuującą zasilanie oraz 4 sterowniki silników krokowych TB6560. Na trzecim poziomie - przycisk bezpieczeństwa i 2 wentylatory. Płyty w sterowniku wykonane są również z plexi 5mm. Do połączeń sterownik-robot-stacja generująca podciśnienie używam w większości złącz wielopinowych dedykowanych automatyce. Robot posiada czujniki krańcowe, potrafi się zerować. Oprogramowanie Napisałem program w Arduino IDE, który zawiera kinetykę odwrotną liczoną z zależności geometrycznych oraz korzystając z biblioteki AccelStepper() steruje "na sztywno" wszystkimi czterema silnikami krokowymi. Następnie wpisałem kilkanaście punktów, i tak robot układa krążki i rozkłada, i tak w pętli... Osiągnięcia, dalsze plany i film Aktualnie, robot może pochwalić się wzięciem udziału w RoboDay 2019 (pokazy na Politechnice Poznańskiej) i II miejscem na µBot (zawody organizowane przez V LO Kraków). Projekt jest aktualnie zamknięty, ale myślę nad rozwojem konstrukcji, na przykład dodaniem kamery PixyCam2. Opis jest dość zwięzły - gdybyście mieli jakiekolwiek pytania, chętnie dopowiem szczegóły Pozdrawiam, wn2001
  17. 4 punkty
    Dzisiaj skończyłem pisać węzeł do komunikacji z sterownikiem serw. Węzeł odbiera, jakie kąty powinien ustawić w serwach i wylicza dla nich długość impulsu potrzebną sterownikowi. Bierze przy tym pod uwagę, dla jakiego impulsu serwo jest ustawione na 0°, co musiałem sam sprawdzić i wpisać w plik csv. Poniżej krótki filmik, na którym robot już rusza nogami. Przy okazji pierwsza część "hejtu" na ROS2. W ROS1 (formalnie tam nie ma 1, ale dla widoczności) konfigurację paczki ustawiało się w pliku CMakeLists.txt i package.txt, niezależnie, czy kod mieliśmy w Pythonie czy C++. W ROS2 natomiast paczki w C++ dalej mają package.xml i CMakeLists.txt, ale paczki w Pythonie zamiast CMakeLists.txt mają plik setup.py. I to by było spoko, gdyby tylko istniała tego dokumentacja . Na podstawie tutoriali da się napisać własną paczkę, którą da się odpalić z terminala, ale jak chcemy napisać własny plik launch do odpalenia kilku węzłów naraz lub własną wiadomość czy serwis, to zaczynają się schody. Wszystkie tutoriale, przykłady i dokumentacja opisują tylko, jak dodać te pliki w CMakeLists. Dobry dzień mi zajęło, jak to zrobić w setup.py, ale w końcu się udało. Bo swoją drogą pliki launch nie są w xmlu, jak w ROS1, ale są to skrypty w Pythonie, co jest moim zdaniem na plus. Ale zdziwiło mnie, że wszystkie przykłady pokazują, jak to dodać w projekcie C++ . Ale, tu jeszcze zabawa się nie kończy, bo są też własne typy wiadomości i serwisów. Tutaj oczywiście też nie ma dokumentacji do setup.py, ale tym razem nie marnowałem całego dnia, tylko stworzyłem nową paczkę w C++ o nazwie custom, wrzuciłem tam tylko definicje wiadomości. Działa i to jest chyba najprostszy sposób na to. Można też tworzyć paczki z mieszanym kodem (i C++ i Python), ale dla mnie to nie jest zbyt "czyste" rozwiązanie. No, to teraz biorę się za model.
  18. 4 punkty
    Panie @InspektorGadzet lub raczej "es2". Chyba z Forbotem nie jest tak źle skoro zaszczycił nas Pan swoim powrotem - widocznie było warto rejestrować drugie konto i udawać kogoś innego. Już wiele razy prosiłem o niewprowadzanie nerwowej atmosfery na forum. Ponawiam również prośbę o darowanie sobie wtrąceń na temat polityki. Nie interesuje nas tutaj, którą partię Pan popiera. Dla formalności dodam, że nie przypominam sobie, abym odmawiał publikacji, któregoś z tych projektów @InspektorGadzet otrzymał 3 punkty ostrzeżenia. Powód: Wprowadzanie nerwowej atmosfery na forum. Niekulturalne zachowanie. Powrót pod inną nazwą użytkownika.
  19. 4 punkty
    Opisywana płytka stanowi projekt siostrzany dla innego modułu, opisanego na forum. Powstawały one niemalże równolegle, stąd pewna liczba podobieństw między nimi. O ile 32-bitowe mikrokontrolery Microchipa są dość rzadko wykorzystywane w amatorskich projektach, to 16-bitowych PIC24 nie spotyka się w nich prawie wcale. Ja jednak zainteresowałem się nimi z konkretnego powodu - w oparciu o nie powstała rodzina dsPIC, przeznaczona do zastosowań związanych z cyfrowym przetwarzaniem sygnałów. PIC24 potraktowałem jako wstęp, który pozwoli mi kiedyś zapoznać się z tą rodziną. Zamiast kupować płytkę prototypową, postanowiłem zbudować własną. Wykorzystałem przy tym układ PIC24FJ256DA210. Nie miałem ku temu jakiegoś konkretnego powodu, po prostu kiedyś nabyłem kilka sztuk przy okazji zakupów w jakimś sklepie internetowym. Od tego momentu leżały w szufladzie, czekając na lepsze czasy. Z karty katalogowej wynika, że układ ten posiada peryferia wspomagające tworzenie interfejsów graficznych, ta funkcjonalność szczególnie mnie jednak nie interesowała. Skupiłem się więc na tym, z czego korzystam najczęściej. Na płytce znajdziemy sterownik Ethernetu (ENC28J60), 2MB pamieci SPI-flash (SST25), złącze karty microSD oraz gniazdo USB do podłączenia pendrive'a. Znalazło się także miejsce dla kilku LED-ów SMD, a na złączach wyprowadziłem większość pinów. Podobnie jak w moich poprzednich płytkach czerwone piny służą do podłączenia programatora, a na zielonych znajdziemy UART. Do czego służy w takim razie złącze niebieskie? Już tłumaczę. Płytka powstała nie tylko w celach dydaktycznych - gdy już spełni tę rolę, otrzyma nowe zadanie. Zostanie wykorzystana do stworzenia radia Internetowego/odtwarzacza plików multimedialnych. Do niebieskiego złącza zostanie podłączony popularny dekoder MP3/DAC na układzie VS10xx. Tak samo jak w przypadku większości moich projektów, płytka jest dwustronna. Wykonałem ją za pomocą metody termotransferu i trawienia w B327. Cynowanie stopem Lichtenberga. Pojedyncze elementy musiały zostać wlutowane za pomocą hot aira - chodzi tutaj głównie o rezonatory kwarcowe SMD.
  20. 3 punkty
    Od października w Gdańsku ruszamy z meetupem dotyczącym systemów embedded. O co chodzi w meetupach? To okazja aby osoby pracujące w branży, studenci i pasjonaci z danej okolicy mogli się spotkać na żywo, wymienić doświadczeniami i podnieść umiejętności. Odbywają się zwykle w godzinach popołudniowych i składają się z prezentacji i luźnych dyskusji. Grupy użytkowników Javy, czy .NETa od lat prężnie funkcjonują w większych polskich miastach. Pora więc na grupę embedded. Tematyka W ramach spotkań będziemy prowadzić prelekcje na tematy takie jak: Programowanie w C, C++, Rust, Ada, Asembler Mikrokontrolery AVR, ARM, PIC i inne RTOS - Real Time Operating Systems Embedded Linux Projektów na Arduino, Raspberry Pi i inne platformy IoT - Internet of Things Systemy safety-critical Dobre praktyki programowania i prowadzenia projektów Testowanie, automatyzacja i podnoszenie jakości Wszystkie inne pokrewne tematy oczywiście również mile widziane. Pierwsze spotkanie Pierwsze spotkanie gdańskiego meetupu planuję na październik. Już niedługo zamieszczę informację o dokładnej dacie i miejscu, a także o tematach prezentacji i ich autorach. Zapisy Można już zapisywać się do grupy na meetup.com: https://www.meetup.com/pl-PL/Gdańsk-Embedded-Meetup/ Tam też będzie rejestracja na konkretne spotkania (spotkania będą darmowe, ale potrzebujemy liczby uczestników żeby wybrać odpowiednią salę). Jeżeli macie jakieś pytania, pomysły, uwagi - piszcie w komentarzach, chętnie odpowiem.
  21. 3 punkty
    Cześć Zrobiłem kalkulator kodu paskowego rezystora, dla rezystorów 3, 4 i 5 paskowych: https://resistor-calc.surge.sh Całość działa wyłącznie w oparciu o javascript, zmiana dowolnego parametru jest natychmiast odzwierciedlana w interfejsie całej aplikacji. Dodatkowo jest tryb PWA, tj. można ją zainstalować z interfejsu przeglądarki i korzystać z niej offline jak z natywnej aplikacji. Chciałbym poznać waszą opinię i dowiedzieć się czy dałoby się coś zrobić lepiej.
  22. 3 punkty
    Cześć, każdy z nas musi od czasu do czasu odświeżać sobie znane już wiadomości z używanego języka programowania (szczególnie, że "na co dzień" nie używamy wszystkich z zaawansowanych konstrukcji języka) lub uczyć się nowych rzeczy dla szybko zmieniających się standardów. Ja "na co dzień" używam języka C (nieobiektowego ponieważ w programowaniu mikro-kontrolerów nadal rzadko korzysta się z C++). Pomyślałem sobie, że fajnie byłoby na forum, gdybyśmy co jakiś czas zadawali sobie pytania dotyczące programowania w Językach C/C++ dotyczące jakichś trudniejszych do zrozumienia konstrukcji języka. Oto moje pierwsze pytanie: Załóżmy, że mamy definicję tablicy tab: int tab[5][4] = { {23, 2, 7, 1}, {4, 1}, {[2]=2, 11}, {[1]=27, 0, 7}, {9, 2, 1} }; Kto wie jaka będzie wartość wyrażenia: *(*(tab+2)+1) Zakładamy, że używamy kompilatora C zgodnego przynajmniej ze standardem C99 np. popularnego gcc (Linux, można go też uzywać pod Windows instalując pakiet "mingw"). Proszę, o krótkie uzasadnienie teoretyczne odpowiedzi (ponieważ można napisać prosty program i sprawdzić wartość). Czekam też na ciekawe pytania dotyczące programowania w C/C++ od Was Pozdrawiam
  23. 3 punkty
    A ja dodam od siebie to, co już wielokrotnie pisałem na temat ledów. Od dość dawna produkowane ledy świecą na tyle jasno, że naprawdę nie warto pchać w nie 20mA ponieważ różnica w jasności świecenia przy 10mA i 20mA jest praktycznie niezauważalna dla ludzkiego oka. Do tego każda zwykła dioda przy 20mA będzie się grzała co na pewno skróci jej żywotność. Nie wiem tak naprawdę skąd przyjęło się te 20mA, z tego co ja kojarzę był to maksymalny prąd dla zwykłej diody 3, 5, czy 10-cio milimetrowej, ale nie jest to wcale prąd nominalny. Bezpiecznie jest przyjmować te 10mA dla najzwyklejszych diod, dla których ani nie mamy dokumentacji, ani nawet nie znamy oznaczenia producenta. Gwarantuję Wam, że nawet przy 10mA będzie świeciła wystarczająco jasno. Ja w moich robotach zasilałem ledy smd prądem 1mA i świeciły na tyle jasno, że widać je było z kilku metrów na line followerze. Tak więc nie ma co przesadzać bo nie żyjemy w latach 80-tych ubiegłego wieku i jasność ledów jest dużo wyższa niż gdy wchodziły one do sprzedaży.
  24. 3 punkty
    Moim zdaniem silnik praktycznie nie widzi prostokątnego napięcia podawanego z mostka, bo przecież karmi się prądem a ten - jak to w indukcyjności jest bardzo "płaski". Typowy silniczek DC, mimo strat na rezystancji uzwojeń ma raczej charakter obciążenia indukcyjnego a wahania prądu (przy PWM idącym w kHz) są rzędu 5-20% wartości średniej prądu. Dlatego dywagacje o tym czy dostaje w impulsie więcej czy mniej napięcia niż jego znamionowe są pozbawione sensu. Dopóki nie przekraczamy możliwości izolacji silnika i jego uzwojeń, zupełnie nie ma znaczenia czy impulsy mają 6V czy 20V. Ważny jest średni prąd. Jeżeli w czasie impulsu nie rośnie on ani nie maleje do zera w czasie przerwy tylko waha się niewiele wokół wartości ustalonej, to sterowanie działa poprawnie. Oczywiście można się zastanawiać nad problemami w przypadku, gdy częstotliwością zjeżdżamy do setek Hz lub nawet poniżej, ale to już jest zupełnie inne zagadanienie. Zmieniają się wtedy ch-ki samego napędu, bo silnik rzeczywiście wtedy dostaje potężne kopy prądu w każdym impulsie, moment drga bardzo i zachowanie szczególnie przy starcie i małych prędkościach jest zupełnie inne. Dopóki jednak prąd jest uśredniany przez indukcyjność możemy spokojnie założyć, że mostek udaje regulowane źródło napięcia stałego - ze wszystkim zaletami i wadami takiego rozwiązania. PS: Jestem w głębokim lesie i moje odpowiedzi mogą być mocno spóźnione albo od czapy. Internet tu chyba jest dostarczany wiadrarmi..
  25. 3 punkty
    Widząc tytuł wątku wchodziłem tutaj z przeświadczeniem, że zaraz będę banował jakiegoś spamera, który chce nam sprzedać maszynkę do gotowania pierogów... Nie sądziłem, że to będzie prawdziwe pytanie. @ethanak zaskoczyłeś mnie
  26. 3 punkty
    Witam! Na samym wstępie się może przedstawię, jako że jestem nowy na tym forum. Mam na imię Mikołaj, 17 lat, uczę się jako technik mechatronik i elektroniką samą w sobie zajmuję się dopiero niespełna rok. ============================================================================================ Chciałbym przedstawić swoje pierwszą własną konstrukcje - Miarę ultradźwiękową "Gacek". Podobne urządzenie było przedstawiane w kursach arduino i na bazie jego działania oparłem swoje. Całość chciałem wykonać na podstawie tego co do tej pory się nauczyłem oraz nie mam jeszcze za dużo doświadczenia w robieniu tego typu projektów, dlatego niektóre rozwiązania mogą się wydawać amatorskie. Gabarytowo wyszło mi trochę za wielkie przez to, że kupiłem za dużą obudowę. Wymiary(cm): 11 x 15 x 7 Lista komponentów: Arduino UNO Wyświetlacz lcd 16x2 Czujnik ultradźwiękowy US-015 2x Potencjometry 3x Przyciski Przełącznik Żółty 3mm led Rezystor 1000Ω Obudowa uniwersalna Płytka uniwersalna Wtyk DC do arduino Koszyk na baterię 9V Trochę kabli Większość potrzebnych rzeczy już miałem, musiałem tylko dokupić parę drobiazgów oraz obudowę, w sumie wydałem +/- 70 zł. Całość mieści się w granicach 150-200 zł. Schemat połączeniowy: Kod programu: /////////////////////////////////////////// // Miara ultradźwękowa - "Gacek" // /////////////////////////////////////////// #include <LiquidCrystal.h> // Dodanie biblioteki LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // Piny wyświetlacza #define przycisk1 13 #define przycisk2 12 #define przycisk3 11 #define trig 8 #define echo 9 #define led 10 //////////////////////////////////////////////////////// byte prostokat[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111 }; // Wypełniony prostokąt byte strzalkaP[8] = { B01000, B01100, B01110, B01111, B01110, B01100, B01000, B00000 }; // Strzałka w prawo byte strzalkaL[8] = { B00010, B00110, B01110, B11110, B01110, B00110, B00010, B00000 }; // Strzałka w lewo //////////////////////////////////////////////////////// Dodanie tablic specjalnych znaków boolean kolejnosc1 = false; boolean kolejnosc2 = false; boolean start = false; int tryb = 1; int opcja = 0; int jednostka = 0; int odcinek = 0; //////////////////////////////////////////////////////// Zmienne globalne void setup() { //////////////////////////////////////////////////////// lcd.begin(16, 2); // rozmiar ekranu lcd lcd.createChar(0, prostokat); lcd.createChar(1, strzalkaP); lcd.createChar(2, strzalkaL); // Stworzenie specjalnych znaków na bazie powyższych tablic lcd.clear(); ///////////////////////////////// pinMode(przycisk1, INPUT_PULLUP); pinMode(przycisk2, INPUT_PULLUP); pinMode(przycisk3, INPUT_PULLUP); pinMode(trig, OUTPUT); pinMode(echo, INPUT); pinMode(led, OUTPUT); digitalWrite(led, LOW); //////////////////////////////////////////////////////// Ustawienie pinów lcd.setCursor(0, 0); lcd.write(byte(0)); // wyświetlenie specjalnego znaku (prostokąta) lcd.setCursor(3, 0); lcd.print("GACEK v1.0"); lcd.setCursor(15, 0); lcd.write(byte(0)); ///////////////////////////////////// Ekran powitalny } void loop() { //////////////////////////////////////////////////////// float wynik; int pomiar1, pomiar2, pole, odczyt; pole = 0; odczyt = 0; pomiar1 = 0; pomiar2 = 0; //////////////////////////////////////////////////////// Zmienne lokalne if (start == false) { // Warunek odpowiadający za jednorazowe wyświetlenie delay(3000); // ekranu startowego przy włączeniu urządzenia start = true; } if (tryb < 1) { // Warunki zmniejszące przedział zmiennej do 1-3 tryb = 1; } if (tryb > 3) { tryb = 3; } lcd.clear(); // Czyszczenie ekranu przy powrocie do menu //////////////////////////////////////////////////////// switch (tryb) { case 1: lcd.setCursor(2, 0); lcd.print("Tryb"); lcd.setCursor(2, 1); lcd.print("Miary"); lcd.setCursor(15, 0); lcd.write(byte(1)); lcd.setCursor(15, 1); lcd.print("B"); break; case 2: lcd.setCursor(0, 0); lcd.write(byte(2)); lcd.setCursor(0, 1); lcd.print("A"); lcd.setCursor(2, 0); lcd.print("Tryb"); lcd.setCursor(2, 1); lcd.print("Pomiaru Pola"); lcd.setCursor(15, 0); lcd.write(byte(1)); lcd.setCursor(15, 1); lcd.print("B"); break; case 3: lcd.setCursor(0, 0); lcd.write(byte(2)); lcd.setCursor(0, 1); lcd.print("A"); lcd.setCursor(2, 0); lcd.print("Tryb"); lcd.setCursor(2, 1); lcd.print("Nastawny"); break; } //////////////////////////////////////////////////////// Wybór trybu while (digitalRead(przycisk1) == HIGH && digitalRead(przycisk2) == HIGH && digitalRead(przycisk3) == HIGH) {} // Czekania na wybór operatora //////////////////////////////////////////////////////// if (digitalRead(przycisk1) == LOW) { // Przesuń w lewo tryb = tryb - 1; while (digitalRead(przycisk1) == LOW) {} } if (digitalRead(przycisk2) == LOW) { // Przesuń w prawo tryb = tryb + 1; while (digitalRead(przycisk2) == LOW) {} } if (digitalRead(przycisk3) == LOW) { // Wybierz ten tryb opcja = tryb; while (digitalRead(przycisk3) == LOW) {} } ////////////////////////////////////////////////////////// Sterowanie w menu if (opcja > 0) { // Jeśli wybrano tryb... lcd.clear(); //////////////////////////////////////////////////////// while (opcja == 1) { // Tryb miary //////////////////////////////////////////////////////// pomiar(); if (wynik == pomiar()) { }else{ if (wynik == pomiar() * 0.39) { }else{ if (wynik == pomiar() / 100.0) { }else{ lcd.clear(); } } } //////////////////////////////////////////////////////// Filtr przełączania liczb na ekranie lcd.setCursor(0, 0); lcd.write(byte(0)); lcd.setCursor(1, 0); lcd.print("Pomiar"); lcd.setCursor(7, 0); lcd.write(byte(0)); lcd.setCursor(9, 0); lcd.print("="); //////////////////////////////////////////////////////// switch (jednostka) { case 0: lcd.setCursor(0, 1); lcd.write(byte(0)); lcd.setCursor(1, 1); lcd.print("cm"); lcd.setCursor(3, 1); lcd.write(byte(0)); wynik = pomiar(); lcd.setCursor(11, 0); lcd.print(wynik, 0); break; case 2: lcd.setCursor(0, 1); lcd.write(byte(0)); lcd.setCursor(1, 1); lcd.print("cal"); lcd.setCursor(4, 1); lcd.write(byte(0)); wynik = pomiar(); wynik = wynik * 0.39; lcd.setCursor(12, 0); lcd.print(wynik, 2); break; case 1: lcd.setCursor(0, 1); lcd.write(byte(0)); lcd.setCursor(1, 1); lcd.print("m"); lcd.setCursor(2, 1); lcd.write(byte(0)); wynik = pomiar(); wynik = wynik / 100.0; lcd.setCursor(11, 0); lcd.print(wynik, 2); break; } //////////////////////////////////////////////////////// Wybór jednostki delay(50); if (digitalRead(przycisk3) == LOW) { jednostka = jednostka + 1; lcd.clear(); if (jednostka > 2) { jednostka = 0; } while (digitalRead(przycisk3) == LOW) {} } if (digitalRead(przycisk1) == LOW) { // wyjście do menu opcja = 0; while (digitalRead(przycisk1) == LOW) {} } } //////////////////////////////////////////////////////// Sterowanie wyborem jednostki oraz przycisk wyjścia do menu //////////////////////////////////////////////////////// while (opcja == 2) { // Tryb pomiaru pola //////////////////////////////////////////////////////// lcd.setCursor(0, 0); lcd.write(byte(0)); lcd.setCursor(1, 0); lcd.print("Pomiar1"); lcd.setCursor(8, 0); lcd.write(byte(0)); lcd.setCursor(10, 0); lcd.print("="); lcd.setCursor(0, 1); lcd.write(byte(0)); lcd.setCursor(1, 1); lcd.print("Pomiar2"); lcd.setCursor(8, 1); lcd.write(byte(0)); lcd.setCursor(10, 1); lcd.print("="); //////////////////////////////////////////////////////// if (digitalRead(przycisk1) == LOW) { opcja = 0; pomiar1 = 0; pomiar2 = 0; kolejnosc1 = false; kolejnosc2 = false; pole = 0; while (digitalRead(przycisk1) == LOW) {} } //////////////////////////////////////////////////////// Wyjście do menu if (digitalRead(przycisk2) == LOW) { lcd.clear(); pomiar1 = 0; pomiar2 = 0; kolejnosc1 = false; kolejnosc2 = false; while (digitalRead(przycisk2) == LOW) {} } //////////////////////////////////////////////////////// Reset if (digitalRead(przycisk3) == LOW) { pomiar(); if(pomiar() == 0){ pomiar(); } if(pole > 0){ pole = 0; } while (kolejnosc1 == true && kolejnosc2 == true) { lcd.clear(); pole = pomiar1 * pomiar2; lcd.setCursor(0, 0); lcd.write(byte(0)); lcd.setCursor(1, 0); lcd.print("Pole"); lcd.setCursor(5, 0); lcd.write(byte(0)); lcd.setCursor(7, 0); lcd.print("="); lcd.setCursor(9, 0); lcd.print(pole); lcd.setCursor(0, 1); lcd.print("B"); lcd.setCursor(2, 1); lcd.print("-"); lcd.setCursor(4, 1); lcd.print("RESET"); while (digitalRead(przycisk2) == HIGH && digitalRead(przycisk1) == HIGH) {} if (digitalRead(przycisk1) == LOW) { opcja = 0; pomiar1 = 0; pomiar2 = 0; kolejnosc1 = false; kolejnosc2 = false; pole = 0; lcd.clear(); break; } if (digitalRead(przycisk2) == LOW) { kolejnosc1 = false; kolejnosc2 = false; pomiar1 = 0; pomiar2 = 0; lcd.clear(); break; } } if (kolejnosc1 == true && kolejnosc2 == false && pole == 0) { pomiar2 = pomiar(); lcd.setCursor(12, 1); lcd.print(pomiar2); kolejnosc2 = true; } if (kolejnosc1 == false && pole == 0) { pomiar1 = pomiar(); lcd.setCursor(12, 0); lcd.print(pomiar1); kolejnosc1 = true; } while(digitalRead(przycisk3) == LOW){} while (digitalRead(przycisk1) == HIGH && digitalRead(przycisk2) == HIGH && digitalRead(przycisk3) == HIGH && pole == 0) {} } } ////////////////////////////////////////////////////////// // Opcja nr.2 - Pomiar pola ////////////////////////////////////////////////////////////////// while (opcja == 3) { lcd.setCursor(0, 0); lcd.write(byte(0)); lcd.setCursor(1, 0); lcd.print("Odcinek"); lcd.setCursor(8, 0); lcd.write(byte(0)); lcd.setCursor(10, 0); lcd.print("="); lcd.setCursor(12, 0); lcd.print(odcinek); ///////////////////////////////////////////////// while (digitalRead(przycisk2) == LOW) { odcinek = odcinek + 1; delay(100); lcd.setCursor(12, 0); lcd.print(odcinek); } if (digitalRead(przycisk1) == LOW) { opcja = 0; odcinek = 0; while (digitalRead(przycisk1) == LOW) {} } while (digitalRead(przycisk3) == LOW) { odcinek = odcinek - 1; if(odcinek < 0){ odcinek = 0; } delay(100); lcd.setCursor(12, 0); lcd.print(odcinek); if(odcinek - 1 == 8 || odcinek - 1 == 98 || odcinek - 1 == 998){ // Łatka naprawaiająca mieszanie się liczb na wyświetlaczu lcd.clear(); lcd.setCursor(0, 0); lcd.write(byte(0)); lcd.setCursor(1, 0); lcd.print("Odcinek"); lcd.setCursor(8, 0); lcd.write(byte(0)); lcd.setCursor(10, 0); lcd.print("="); } } if (odcinek > 0) { pomiar(); if (odczyt >= 10 && pomiar() < odczyt || odczyt >= 100 && pomiar() < odczyt){ lcd.clear(); } lcd.setCursor(0, 1); lcd.write(byte(0)); lcd.setCursor(1, 1); lcd.print("Obecnie"); lcd.setCursor(8, 1); lcd.write(byte(0)); lcd.setCursor(10, 1); lcd.print("="); if(pomiar() < 1000){ odczyt = pomiar(); lcd.setCursor(12, 1); lcd.print(odczyt); } if(odcinek == odczyt) { digitalWrite(led, HIGH); }else{ digitalWrite(led, LOW); } if (digitalRead(przycisk1) == LOW) { digitalWrite(led, LOW); lcd.clear(); odcinek = 0; opcja = 0; odczyt = 0; while (digitalRead(przycisk1) == LOW) {} } delay(25); } } ////////////////////////////////////////////////////////////////// // Tryb nr. 3 - Pomiar wymiarowy } } //////////////////////////////////////////////////////// int pomiar() { long czas, dystans; digitalWrite(trig, LOW); delayMicroseconds(2); digitalWrite(trig, HIGH); delayMicroseconds(10); digitalWrite(trig, LOW); czas = pulseIn(echo, HIGH); dystans = czas / 58; dystans = dystans + 11; delay(100); Serial.println(dystans); return dystans; //////////////////////////////////////////////////////// // Program wykonujący pomiary czujnikiem } Po uruchomieniu urządzenia wyświetla się menu wyboru trybu, którym steruje się przyciskami A oraz B, natomiast guzik C zatwierdza wybór. Potencjometry regulują jasność oraz kontrast wyświetlacza lcd. Miara ma trzy tryby pomiarów: Pierwszy z nich to mierzenie ciągłe z dodatkową opcją przeskalowania jednostki na metry oraz cale (w planie miałem także zamiar dodać milimetry, ale pomiary wychodziły bardzo niedokładnie, dlatego zrezygnowałem z tego pomysłu). Jak widać na nagraniu pomiar czasami może się różnić o 1 cm niż w rzeczywistości, może to być wina arduino, które przeskalowuje wynik z czujnika na centymetry przy czym przybliża go do pełnych liczb. Punkt zero znajduje się z tyłu obudowy, a co za tym idzie pomiar nie może być mniejszy niż 14 cm. Aby wrócić do menu wyboru wystarczy przytrzymać przycisk A. Następna opcja to pomiar pola, polega ona na zebraniu dwóch pomiarów, aby następnie na ich podstawie wyliczyć pole. Przy tworzeniu tego trybu napotkałem kilka błędów typu jakieś wyskakujące znikąd zera czy też liczby, ale ostatecznie doszedłem to tego, że problem leży w odświeżaniu wyświetlacza i załatałem ten problem. Ostatnim, trzecim trybem jest miara nastawna, działa ona w ten sposób, że najpierw ustala się na jakiej odległości ma znajdować się mierzony obiekt, po czym manewrujemy tym przedmiotem aż do momentu gdy pomiar czujnika będzie się zgadzał z wcześniej ustaloną wartością o czym poinformuje dioda. W planach mam jeszcze wprowadzenie nowych trybów oraz oczywiście zminiaturyzowania całego urządzenia. Pozdrawiam!
  27. 3 punkty
    OK, to teraz najważniejsze: takie cudo to de facto miernik prądu czyli mili(mikro)amperomierz z rezystorem szeregowym. Samego miernika i jego czułości nie zmienisz, tj. on zawsze będzie miał ileśtam mili(mikro)amperów przy pełnej skali bo to wynika z samej konstrukcji "hardware'u". Jedyną możliwościa zmiany zakresu na większy jest dodanie własnego opornika szeregowego i to jest łatwe. Natomiast jeśli chcesz zmniejszyć zakres, musisz bardzo ostrożnie dobrać się do środka i wypatroszyć istniejący tam rezystor. Potem, po kilku pomiarach i obliczeniach (musisz mieć multimetr żeby zmierzyć prąd pełnego zakresu) wstawisz jakiś inny i będzie OK. Może się jednak okazać, że to nie wyjdzie i minimalnym zakresem gołego ustroju wynikającym z samej jego rezystancji wewnętrznej, nawet bez żadnego opornika są np. 2V. Jeśli nie masz wprawy w precyzyjnych pracach mechanicznych lub nie widzisz prostej metody rozmontowania tego ustroju pomiarowego, to rozszerzenia zakresu możesz dokonać metodami elektronicznymi (wzmacniacz), ale wtedy musielibyśmy więcej wiedzieć o tym co chcesz zrobić.
  28. 3 punkty
    Może to ci pomoże: https://tote.readthedocs.io/en/latest/ik.html Generalnie, kąt w kolanie daje ci długość nogi (i liczysz go tak jak napisałeś, z wzoru cosinusów), a kąt w udzie pozycje jej końca i liczysz go z atan2.
  29. 3 punkty
    Witam! Dzisiaj chciałbym zaprezentować Wam mój projekt wykonany w celu obrony inżynierskiej. Jest to mój pierwszy tak rozbudowany projekt, jak i za razem pierwszy wpis na Forbocie, więc od razu przepraszam wszystkich za wszelakie poważne błędy, które mogłem popełnić. Pomysł na niego zrodził się na 3 roku studiów na kierunku Inżynierii Biomedycznej za sprawą mojego promotora dr inż. Jarosława Zubrzyckiego, któremu chciałbym bardzo serdecznie podziękować za poświęcony czas oraz użyczenie drukarek 3D. Całość składa się ze zrobotyzowanego ramienia o sześciu stopniach swobody wraz z osobnym, prostym kontrolerem. Na ramię robota składa się: konstrukcja mechaniczna wykonana z materiału ABS na drukarce 3D Zortrax M200, uPrint SE Plus oraz taniej Creality 10S, małe łożyska kulkowe o średnicy zewnętrznej ∅13 mm i wewnętrznej ∅5 mm, śrubki oraz nakrętki o wielkości metrycznej od M2,5 do M5, część napędowa, na którą składają się serwomechanizmy: TowerPro MG-946R, TowerPro SG-5010, PowerHD HD-1501MG, TowerPro SG92R. Na kontroler składają się: obudowa wykonana z materiału ABS na drukarkach 3D wymienionych wyżej, płytka Arduino UNO Rev3 (klon zakupiony na Allegro), nakładkaprototypowa do Arduino Uno z przylutowanymi komponentami, takimi jak, przewody wyprowadzające potencjometry, LED'y, rezystory, kondensatory oraz stabilizator napięcia L7805CV, oraz sterownik serwomechanizmów Pololu Mini Maestro 12-kanałowy. Serwomechanizmy dobrałem biorąc pod uwagę ich specyfikację (napięcie zasilania) oraz opinię użytkowników wykorzystujących je w swoich projektach. Z racji wykorzystania platformy jaką jest Arduino, jak i tego, że na pracę magisterską planuje ulepszyć projekt , postanowiłem ograniczyć efektor ramienia do postaci prostego chwytaka. Następna wersja projektu zostanie wyposażona w płytkę Raspberry Pi 4B wykorzystującą efektor w postaci teleskopu z podstawową kamerą i diodą doświetlającą. Sterownik serwomechanizmów Pololu Mini Maestro wybrałem ze względu na bardzo prostą obsługę napędów i świetną współpracę układu z Arduino za sprawą dedykowanej biblioteki udostępnionej przez producenta. Sterowanie ramieniem postanowiłem zrealizować dzięki zastosowaniu kontrolera w fizycznej obudowie z zastosowaniem potencjometrów obrotowych, liniowych o wartości 20 kΩ. Dzięki takiemu rozwiązaniu można w prosty sposób zasymulować pracę podstawowego trenażera. Do sygnalizowania trybu pracy ramienia użyłem 2 LED'ów (zielonego i czerwonego) sygnalizujące podłączenie do zasilania (czerwona) oraz możliwość zmiany położenia wałów serwomechanizmów, czy też brak takiej możliwości (zielona). Sterowanie trybem pracy umożliwia przełącznik z zastosowaniem prostego filtru RC eliminującego drgania styków. Wszystkie komponenty zostały przylutowane do nakładki prototypowej, z zastosowaniem przewodów połączeniowych do płytek stykowych (wiem, nie najlepsze rozwiązanie, ale poganiający czas zrobił swoje ). Cały projekt zasilany jest za pomocą zasilacza impulsowego 12 V/ 2,5A CZĘŚĆ MECHANICZNA Po dobraniu wszystkich komponentów i upewnieniu się, że będę miał dostęp do drukarki, niezwłocznie przystąpiłem do projektowania części konstrukcyjnych w oprogramowaniu Autodesk Inventor 2018. Zamierzony projekt prezentował się następująco: Podczas projektowania efektora (chwytaka) zastanawiałem się nad zastosowaniem gotowego rozwiązania, lecz z uwagi na to, że większość znalezionych przeze mnie rozwiązań składało się z wielu komponentów, lub po prostu wizualnie mi nie odpowiadały zaprojektowałem swoje własne (trochę ułomnie, po mechanizm zębaty został zaprojektowany bez użycia modułu wbudowanego w program, ani bez przeprowadzenia potrzebnych obliczeń, ale jak na pierwszy raz nie jestem zawiedziony ). Podstawa ramienia składa się z dwóch części: statycznej oraz ruchomej. Pierwsza jest przymocowana do podstawy przy użyciu 4 wkrętów do drewna M4 i osadziłem w niej jeden z serwomechanizmów. Początkowo planowałem zastosowanie łożyska kulkowego wzdłużnego do wsparcia konstrukcji, ale po "dogłębnej" analizie konstrukcji (czyt. oszczędzanie pieniążków) osadziłem część ruchomą bezpośrednio na wale serwomechanizmu (przy użyciu aluminiowego orczyka). W części ruchomej umieściłem kolejne, dwa, serwomechanizmy odpowiedzialne za sterowanie odpowiednio ramieniem i przedramieniem manipulatora. Ruch z podstawy na przedramię przekazywany został dzięki zastosowaniu ogniwa łączącego "bark" z "łokciem". W "łokciu" osadziłem kolejny serwomechanizm odpowiedzialny za ruch obrotowy przedramienia wokół własnej osi. Na końcu przedramienia, w nadgarstku umieściłem mały serwomechanizm odpowiedzialny za ruch nadgarstka oraz takie same serwo sterujące efektorem (chwytakiem). Przed przystąpieniem do druku 3D elementów ramienia przeprowadziłem analizę MES konstrukcji manipulatora. Manipulator obciążyłem siłą działającą pionowo w dół o wartości 1,5 N, przymocowaną do ramion chwytnych efektora, co symbolizowało obciążenie o wadze około 150g. W efekcie uzyskałem wynik dający wskaźnik bezpieczeństwa konstrukcji w wysokości powyżej 11 (0 fatalnie, 15 max), co świadczy o tym że zaprojektowana konstrukcja jest sztywna i wytrzymała na trwałe odkształcenia. Największe naprężenia wystąpiły na ramionach chwytnych efektora i wynosiły 1,55 MPa. Obudowę kontrolera podzieliłem na 3 części, aby było łatwiej ją wydrukować na drukarce 3D. W panelu górnym umieściłem sześć otworów montażowych na potencjometry liniowe oraz dwa na kolorowe LED'y i jeden większy na przycisk. Dolna część obudowy podzielono na 2 elementy. W jednym z nich umieszczono otwory umożliwiające dostęp do złącz płytki Arduino oraz podłączenie serwomechanizmów do sterownika. UKŁAD STEROWANIA Realizację układu sterowania rozpocząłem od zaprojektowania schematu działania konstrukcji oraz schematu podłączenia wszystkich elementów: Mając gotowy schemat przystąpiłem do realizacji fizycznego układu. Całość prezentuje się następująco: Kod sterujący projektem został napisany w środowisku Arduino IDE, z wykorzystaniem dedykowanej biblioteki do sterownika serwomechanizmów Pololu Mini Maestro: #include <PololuMaestro.h> #include <SoftwareSerial.h> #define pot1 0 //podstawa #define pot2 1 //bark #define pot3 2 //staw łokciowy #define pot4 3 //przedramie #define pot5 4 //ndagarstek #define pot6 5 //chwytak #define sw1 9 //przycisk #define led_g 8 //zielona dioda SoftwareSerial sterownikSerial(10,11); //obiekt treansmisji szeregowej (pin 10 RX, pin 11 TX) MiniMaestro sterownik(sterownikSerial); //obiekt umozliwiający komunikacje ze sterownikiem int val1 = 0; int angle1 = 0; int w1 = 0; int val2 = 0; int angle2 = 0; int w2 = 0; int val3 = 0; int angle3 = 0; int w3 = 0; int val4 = 0; int angle4 = 0; int w4 = 0; int val5 = 0; int angle5 = 0; int w5 = 0; int val6 = 0; int angle6 = 0; int w6 = 0; //===================================PĘTLA KONFIGURACYJNA=================================================== void setup() { //Serial.begin(9600); //urochomienie transmisjii szeregowej w razie potrzeby komunikacji z komputerem sterownikSerial.begin(9600); //uruchomienie transmisjii szeregowej w celu komunikacji ze sterownikiem pinMode(led_g,OUTPUT); pinMode(sw1,INPUT); //brak konieczności zastosowania trybu INPUT_PULLUP ze względu na zastosowanie w układzie rezystora podciągającego digitalWrite(led_g,LOW); //dioda zielona domyślnie jest zgaszona } //========================================PĘTLA GŁÓWNA======================================================= void loop() { val1 = analogRead(pot1); //odczyt danych z potencjoetrów oraz mapowanie otrzymanych wartości angle1 = map(val1,0,1023,2000,10000); //na zakres ruchu poszczególnych serwomechanizmów (jednostka: 0,25us) val2 = analogRead(pot2); angle2 = map(val2,0,1023,2000,10000); val3 = analogRead(pot3); angle3 = map(val3,0,1023,2000,10000); val4 = analogRead(pot4); angle4 = map(val3,0,1023,2000,10000); val5 = analogRead(pot5); angle5 = map(val3,0,1023,2000,10000); val6 = analogRead(pot6); angle6 = map(val3,0,1023,2000,10000); if(digitalRead(sw1) == 0){ //Jeżeli przycisk jest wciśnięty, zielona dioda się świeci oraz digitalWrite(led_g,HIGH); //możliwe jest sterowanie serwonapędami. if(abs(angle1 - w1) < 15) //Jeżeli różnica pomiędzy dwoma kolejnymi wartościami jest mniejsza o 15 jednostek sterownik.setTarget(0,0); //to sygnał nie jest wysyłany do sterownika. else{ sterownik.setTarget(0,angle1); w1 = angle1;} if(abs(angle2 - w2) < 15) sterownik.setTarget(1,0); else{ sterownik.setTarget(1,angle2); w2 = angle2;} if(abs(angle3 - w3) < 15); //sterownik.setTarget(2,0); else{ sterownik.setTarget(2,angle3); w3 = angle3;} if(abs(angle4 - w4) < 15) sterownik.setTarget(3,0); else{ sterownik.setTarget(3,angle4); w4 = angle4;} if(abs(angle5 - w5) < 15) sterownik.setTarget(4,0); else{ sterownik.setTarget(4,angle5); w5 = angle5;} if(abs(angle6 - w6) < 15) sterownik.setTarget(5,0); else{ sterownik.setTarget(5,angle6); w6 = angle6;} } else{ //Jeżeli przycisk nie jest wciśnięty, następuje zgaszenie zielonej diody, a sterowanie digitalWrite(led_g,LOW); //serwomechanizmami jest niemożliwe. } } PREZENTACJA DZIAŁANIA Poniżej zamieszczam krótkie wideo przedstawiające działanie całej konstrukcji. PODSUMOWANIE Tak prezentuje się wykonany przeze mnie projekt. W przyszłości planuje wymienić płytkę Arduino UNO na Raspberry Pi 4, serwomechanizmy na silniki krokowe, efektor w postaci chwytaka na wysuwany teleskop z kamerą na jego końcu oraz drastyczną przebudowę konstrukcji mechanicznej . Jestem świadomy wszystkich uproszczeń jakie popełniłem i na pewno niektóre kwestie mogłem wykonać lepiej (lub po prostu inaczej), lecz z powodu małego zasobu czasowego lub pod wpływem bliżej nieokreślonych emocji postawiłem na rozwiązania zaprezentowane wyżej. Z góry dziękuję za konstruktywną krytykę i cenne uwagi i wskazówki na przyszłość. Pozdrawiam mocno!
  30. 3 punkty
    Chodziło mi o akcent na słowo "prawdziwym", czyli korzystającym z napięć +/-12V. Na rynku są moduły prezentujące się na USB jako port COM, ale po stronie UART posługujące się sygnalizacją 0..+5V lub 0..+3V i takie coś nie zadziała a wręcz zostanie zniszczone https://botland.com.pl/pl/konwertery-usb-uart-rs232-rs485/4501-konwerter-usb-uart-pl2303-wtyk-usb.html ale jeśli przejściówka ma złącze DB9 a w nazwie mamy symbol RS232 to jest szansa, że pójdzie: https://botland.com.pl/pl/konwertery-usb-uart-rs232-rs485/3857-konwerter-usb-rs232-adapter-db25.html Niestety mam złe doświadczenia z chińskimi przejściówkami tego typu. Zwykle ich układy sa uproszczone do granic możliwości i działają kiepsko: napięcia nadajnika ledwo-ledwo starczają do wysterowania odbiornika po naszej stronie i są niestabilne a całość przestaje działać sporo poniżej deklarowanych prędkości maksymalnych z powodu biedy układowej i zniekształcania impulsów. Standard +/-12V został wymyślony i jest przeznaczony do niezawodnej pracy na długich kablach w środowiskach pełnych zakłóceń. Oczywiście o tym trzeba zapomnieć w przypadku przejściówki za 10zł, ale też do eksperymentów na biurku przy prędkości 1200 czy nawet 19200 powinno zadziałać. Swoją drogą samodzielne zrobienie dobrego układziku tego typu może być fajnym przypomnieniem jak kiedyś wyglądały interfejsy komunikacyjne.
  31. 3 punkty
    @Matthew11 wg tej strony, program jest totalnie za free
  32. 3 punkty
    RoDAP – Robot Dzielnie Atakujący Przeciwników Jest to robot minisumo zrobiony przez Pojemnika i mnie na kółku robotycznym KRÓL, które prowadzimy od zeszłego roku szkolnego. Założenia projektu nie były zbyt wygórowane: chcieliśmy tylko wygrać z innymi robotami z naszego kółka. Robotowi daleko do sprawnego działania, ale i tak zwyciężył ze wszystkimi konstrukcjami na zawodach wewnątrzszkolnych. Konstrukcja mechaniczna: Głównym elementem robota jest odpowiednio wycięta blacha (2mm). Za napęd odpowiedzialne są dwa silniczki N20-BT24. Są dużo za słabe do wypychania silniejszych przeciwników, ale były najtańsze. Felgi toczone z aluminium ”po znajomości”, oponki odlewane z silikonu w domu. (Zostały nam po linefollowerze RoChN3 gdzie się nie sprawdziły.) Przed mocowaniami silników znajduje się akumulator Li-Po 800mAh przyciśnięty płytką z elektroniką (wchodzi ”na wcisk”, nigdy się nie wysunął). Delikatne elementy osłania pług zrobiony z laminatu przylutowanego do miedzianych drutów trzymających całą konstrukcję w jednym kawałku. Docisk opon zapewniają dwa kawałki stali przyczepione trytkami (nie mieliśmy innego pomysłu), które zamontowaliśmy dopiero po pierwszych zawodach. Elektronika: Mikrokontroler: Atmega328p Sterowniki silników: 2x TB6612 (jeden układ na silnik) Optyczne czujniki przeciwnika: 4x TSSP77038 60cm (widziały podłogę więc musieliśmy je trochę zakryć, teraz zasięg wynosi około 25cm) Czujniki linii: 2x KTIR0711S Starter na attiny13 działający na piloty od TV Stabilizator LDO na 5V, kilka guzików, LEDów i goldpinów. Płytka jednowarstwowa trawiona w domu. Program: Robot początkowo kręci się spodziewając się działającego przeciwnika. Jeżeli takowego nie ma w ringu to zaczyna go szukać jeżdżąc od krawędzi do krawędzi. 4 czujniki bardzo dobrze sprawdzają się w szukaniu martwych robotów. Sukcesy: Nieprzegranie wszystkich walk „do zera” na zawodach uBot 2019 w Krakowie. Wygranie z każdym z robotów z naszego kółka na wewnętrznych minizawodach na koniec roku szkolnego. Wnioski: Jak na pierwszego naszego robota w tej kategorii (w dodatku zrobionego w dwa tygodnie) niczego więcej się nie spodziewaliśmy. Jedyne zakupione elementy to czujniki IR, silniczki, i ich sterowniki. Całą resztę znaleźliśmy w szufladach i piwnicach. Gdybyśmy chcieli robić kolejnego minisumo, to na pewno użylibyśmy lepszych silników, opon i pługu, ale aktualnie zajmujemy się linefollowerami i nanosumo oraz prowadzeniem kółka. Chętnie odpowiemy na wszystkie pytania w komentarzach.
  33. 3 punkty
    Dobra, jest postęp. Niestety znów wkradły się głupie błędy. Spróbuj być bardziej uważny, rysując jakiś nowy fragment zastanawiaj się jak to zadziała. Po kolei: Sam dzielnik do pomiaru napięcia akumulatora jest OK - to dwa oporniki i trudno tu coś skopać, ale już kondensator C22 zamiast być wprost do masy idzie sobie do wejścia ADC skutecznie separując je od sygnału mierzonego. Dodanie gniazdka programatora powoduje, że teraz dwa urządzenia korzystają z SPI i oba chcą być master'ami tej szyny. Programator ma na szczęście priorytet bo zarządza sygnałem RESET procesora, ale moduł radiowy - jako głupi slave - będzie odzywał się zawsze gdy pojawi się zegar a sygnał CSN będzie w stanie niskim. W czasie programowania przez SPI porty procesora są odwieszone w stan HiZ więc nie masz gwarancji, że moduł radiowy będzie niewybrany a w zasadzie jest spora szansa, że będzie bruździł. Koniecznie zatem podciągnij linię CSN przez 10k do Vcc. Rezystancja wejściowa ADC jest wielka, więc oporniki dzielnika pomiarowego możesz zrobić duże, rzędu dziesiątek kΩ. Przykładowo R14=22k i R13=10k zapewnią zakres do 16V i przelicznik 15,63 do konwersji ADC -> [mV], co sprowadza się do pomnożenia odczytu przez 250 i podzielenia przez 16, wszystko na szybkich liczbach całkowitych. Ogólnie: oszczędzałbym piny analogowe i raczej zostawił je wolne na przyszłość a wyjścia cyfrowe typu LEDy wyciągałbym z pinów typowo cyfrowych. Wyjścia ne serwomechnizmy zrobiłbym dwa bliźniacze, bo nigdy nie wiadomo co tam za chwilę będziesz miał na pokładzie. Dobudujesz jakiś luk ładunkowy czy wciąganą na maszt flagę i kicha, zabraknie sygnału i gniazdka. Opakowany radiator daje coś tylko do czasu gdy sam się nie nagrzeje. W długim okresie czasu nie liczy się zawartość obudowy tylko możliwości wysyłania ciepła poza nią. Wszystko co wyprodukujesz w środku (oba stabilizatory - a ten od serwa to może dać do pieca, procesor, driver, tranzystor, dioda) będzie musiało gdzieś wyleźć na zewnątrz. Gdy nie będzie mogło, temperatura będzie rosła aż wnętrze się uszkodzi lub bilans produkcji i odpływu ciepła się zrównoważy. Dlatego kluczowym jest zaprojektowanie dobrej gospodarki ciepłem. Jeżeli obudowa musi być naprawdę wodoodporna, żadnych otworów, wiatraczków itp, to masz dwie opcje: zrobić ją metalową: z blachy lub wykorzystać gotowe, szczelne pudełko z alu i skorzystać z niej jak z radiatora: tranzystor (izolowany!) i stabilizatory przykręcić od środka zrobić wymuszony transfer ciepła przez rurki cieplne (tzw. heatpipes) lub zwykłą wodę zasysaną z zewnątrz. Wszystkie kable przechodzą wtedy przez przepusty, ew. LEDy w wodoszczelnych oprawkach i tyle. Są nawet głośniczki/bipery wodoodporne. W zasadzie od znalezienia dobrej obudowy i przemyślenia spraw uszczelniania, przepustów, kabli, złącz itp zacząłbym następny etap. Płytka będzie musiała być do tego dopasowana więc nie ma co jej zaczynać bez gotowego obrysu, wymiarów pasujących do konkretnej obudowy, mocowań itp. To tylko przykład, ale obudowy IP66 (i wyżej) tanie nie będą: https://www.tme.eu/pl/details/klip-k3/obudowy-uniwersalne/weidmuller/klippon-k3/
  34. 3 punkty
    pewnie mówisz masz import processing.serial.*; int literyH = 50; int myInt; float myFloat; float theta; int start = 0; Serial myPort; // The serial port void setup() { size(300,300); myPort = new Serial(this, Serial.list()[1], 9600); myPort.clear(); } void draw() { textSize(literyH); if (myPort.available() > 0) { myInt = myPort.read(); myFloat = map(float(myInt), 33, 255, 10, 180); background(0); //println(myInt); fill(myFloat,myFloat*2,myFloat*3); // fiolet text("val: " + myInt,width/10, height/5); } if (start==1) { translate(width/2,height/2); // Translate to the center rotate(theta); // Rotate by theta rect(-26, -26, 52, 52); if (myInt >49) theta += myFloat/1000; } else if (start==0) { translate(width/2,height/2); // Translate to the center rotate(theta); // Rotate by theta rect(-26, -26, 52, 52); } } void mousePressed() { if ((start==0) && (mouseX > width/2-26) && (mouseX < width/2+26) && (mouseY > width/2-26) && (mouseY < width/2+26)) { start = 1; myPort.write(50); } else { start = 0; myPort.write(49); } } Jedyna " trudność" jaka może być przy podłączeniu arduino to wybór poprawnego portu COM czyli : myPort = new Serial(this, Serial.list()[1], 9600); Serial.list()[1] nie oznacza , że to jest COM1 w moim wypadku to jest COM4 dla poprawnego określenia pod jakim portem jest arduino najlepiej użyć funkcji printArray(Serial.list()); ewentualnie jeżeli pod usb mamy podpięte tylko arduino i żadnych innych urządzeń to będzie to Serial.list()[0]. Jeżeli ktoś będzie tym bardziej zainteresowany to wieczorem mogę pokazać jak to będzie wyglądało.
  35. 3 punkty
    https://en.wikipedia.org/wiki/ArduSat
  36. 3 punkty
    Projekt został poprawnie opisany, widać, że działa, a jego autor żyje. Pochwaliłem więc wykonaną konstrukcję i zaakceptowałem opis. Nie znam osobiście autora i nie czuje się kompetentny do wykonywania zdalnego audytu zasad BHP panujących w jego warsztacie. Nie mam też pewności, że jeśli pilnowałby go dorosły sąsiad to prace nad urządzeniem przebiegłyby bezpieczniej. Idąc tym tropem, należałoby oceniać autorów wszystkich DIY, bo mogli używać Dremela bez okularów ochronnych lub budować swoje urządzenia w warsztacie z uszkodzoną instalacją elektryczną. Podzielam troskę o zdrowie młodych majsterkowiczów i właśnie dlatego nie publikuję na blogu poradników budowy urządzeń zasilanych z 230V. Nie mam jednak wpływu na to co dzieje się w warsztatach każdego z czytelników. Nie mam też pewności co do tego, że wiek jest tutaj kluczowym wyznacznikiem. Można spotkać odpowiedzialnego 14-latka, jak i nieodpowiedzialnego 50-latka. Opis omawianej konstrukcja pozwala wysnuć wniosek, że autor jednak zdaje sobie sprawę z niebezpieczeństw związanych z budową takich konstrukcji. Co więcej, opublikowany wpis nie jest dokładną instrukcją budowy tego urządzenia. Początkujący elektroniki nie da rady otworzyć tego projektu tylko na podstawie tego "artykułu". Osoby zainteresowane odtworzeniem takiego układu będą musiały posiłkować się jeszcze innymi źródłami, a tutaj przynajmniej będą mogły zapoznać się z ostrzeżeniami mówiącymi o tym, że to nie jest zabawka. Dopisałem dodatkowe ostrzeżenie na samej górze tego tematu - mam nadzieję, że teraz każdy zachowa szczególną ostrożność
  37. 3 punkty
    Może nie przesadzajmy. Ja w tym wieku co @Leoneq miałem już za sobą parę konstrukcji opartych na lampach - a zasilacz anodowy może być bardziej niebezpieczny niż taka przetwornica. Bardzo dobrze, że ostrzega o niebezpieczeństwach, że pisze o zachowaniu zasad.
  38. 3 punkty
    Jeśli chcesz oglądać układy pozbawione mikrokontrolerów, to musisz zacząć się przyzwyczajać. To doskonały sposób by zobaczyć jak pętle for czy while wymieniają się na wzmacniacze operacyjne Niestety to już kolejny Twój post w którym kompletnie nie odnosisz się do problemu autora wątku. Nic go nie obchodzi DCC a nas tym bardziej to, że coś o nich wiesz. Mamy ten schemat, ten działający układ i konkretne objawy. Przyznaj, że każdy głupi potrafi napisać "Ee, to słabe. Lepiej zróbcie układ od nowa wg jakiegoś tam schematu, ludzie tak robią, wierzcie mi." Więc jeśli nie masz nic merytorycznego w sprawie o którą dość precyzyjnie pyta Marekk, to po zwyczajnie odpuść. Już wiemy, że coś tam robiłeś i zapewne dużo wiesz, nie musisz wciąż tego udowadniać. Gdybyś jeszcze umiał pisać na temat to byłby ideał, spróbuj. A wracając do tematu, widzę jedno główne źródło problemu: moim zdaniem układ jest za prosty. Wg mnie choruje on na nieidealne (w sensie słabo trafiające w czasie) sterowanie kluczami analogowymi. Jeżeli próbkowanie rozmija się choć trochę z załączaniem głównego tranzystora, to na kondensatorze pamiętającym zaczynasz dostawać ślady napięcia zasilania. To może być spory procent tego co widzi dalsza część układu i ten błąd rośnie wraz ze spadkiem obrotów, bo zasilanie jest zawsze duże a back-EMF małe. Tak więc przyjrzałbym się sygnałowi na C11 - czy nie ma tam jakichś gwałtownych wzrostów na początku lub na końcu czasu próbkowania.Problem może brać się choćby z tego, że (pomijając używanie wolnych wzmacniaczy operacyjnych do sterowania układami cyfrowymi) np. wyjście IC1-C jest obciążone układem różniczkującym C10/R15 który na pewno wpływa (niesymetrycznie) na kształt sygnału wyjściowego tego wzmacniacza. Poza tym wzmacniacz w otwartej pętli ma bardzo małe pasmo a tutaj używamy go jako komparatora ze wzmocnieniem ile fabryka dała - to słabe. Przy wolnym zboczu sygnału z IC1-C (i to samo z IC1-B, też robi za komparator) nie masz gwarancji, że poziom przy jakim zadziałają bramki 4011 będzie taki sam przy jakim przełączą klucze analogowe a wtedy czasy się rozjeżdżają i kondensator łapie zasilanie z (jeszcze lub już) włączonego tranzystora. Dziwnie słabe wydaje mi się sterowanie stopnia wyjściowego. T3 napędzany jest przez 100k i wcale nie jestem pewien, czy wchodzi w nasycenie w sytuacji, gdy ma szybko wyłączyć bazę T2 i tym samym bramkę MOSFETa. Akurat w tym miejscu nie oszczędzałbym słabiutkich 4011 pracujących równolegle. Nie potrzebujemy poprawnych poziomów logicznych tylko mocniejsze sterowanie tranzystora. Kluczowym jest obejrzenie jak wygląda sygnał sterowania kluczy 4053 względem sygnału na bramce MOSFETa. Jeżeli zachodzą na siebie, to trzeba to przerobić bo pomiar back-EMF wtedy zwyczajnie kłamie.
  39. 3 punkty
    Mikrokontrolery z rodziny PIC32 należą do moich ulubionych układów. Większość konstruktorów już jakiś czas temu zdążyła się przerzucić na ARM-y (zwłaszcza rodzinę STM32), ja jednak z jakiegoś powodu ciągle lubię korzystać z produktów firmy Microchip. Niestety, o ile tanie płytki z STM-ami można bez problemu kupić za grosze, o tyle sytuacja w przypadku PIC-ów wygląda gorzej. Czasem pojawiają się zestawy deweloperskie, jednak ich cena jest dość wysoka. Dlatego właśnie preferuję samodzielne wykonywanie takich "pomocy dydaktycznych". Jakiś czas temu prezentowałem na forum projekt mojej płytki prototypowej z układem PIC32MX270F256B. To całkiem fajny, mały mikrokontroler, w sam raz nadający się do pierwszych eksperymentów albo pierwszych projektów. Ma jednak pewną wadę - relatywne małą liczbę wyprowadzeń. Z tego powodu po podłączeniu paru peryferiów na płytce zostało mi tylko kilka wolnych pinów, które mogłem wyprowadzić na złączę. Znalazł się wśród nich interfejs I2C oraz jedno przerwanie zewnętrze, więc teoretycznie istniała możliwość rozbudowy, jednak było to pewnym ograniczeniem. Jakiś czas temu pomyślałem więc o skonstruowaniu nowszej płytki, wyposażonej w nieco bardziej zaawansowany układ. Na warsztat wziąłem PIC32MX44F512H. Posiada on znacznie więcej pinów i pieryferiów, a także dwa razy więcej pamięci flash. Dzięki temu na płytce bez większego problemu mogłem zamontować więcej "dodatków". Posiada ona interfejs Ethernet, zbudowany w oparciu o popularny układ ENC28J60. Na tej samej magistrali SPI znajduje się także 2MB pamięć flash (SST25) oraz złącze karty microSD. Dostępne jest także złącze USB, umożliwiające podpięcie pendrive'a. Płytka posiada także trzy diody LED, cztery przyciski oraz sygnalizator akustyczny. Na dwóch złączach udało mi się wyprowadzić łącznie 24 piny GPIO, mam więc swobodny dostęp do właściwie wszystkich funkcji MCU. Czerwona złącze widoczne na zdjęciach to interfejs programatora, na zielonym jest natomiast wyprowadzony UART. Dwustronna płytka została wykonana metodą termotransferu, na tzw. "kopertę". Po raz kolejny mogę więc stwierdzić, że kompletną bzdurą jest stwierdzenie, że metoda ta nie nadaje się do wykonywania bardziej skomplikowanych obwodów drukowanych, z dużą liczną cienkich ścieżek, biegnących z niewielkich odstępach od siebie. Na płytce znajduje się sporo miniaturowych elementów SMD, w rozmiarze 0402. Cynowanie wykonane za pomocą stopu Lichtenberga.
  40. 3 punkty
    Dostałeś boot loop, który pojawia się generalnie w jednej z poniższych sytuacji: nie wykasowałeś flasha przed flashowaniem i zostały tam jakieś opcje konfiguracji niekompatybilne z tym, co wgrałeś, przy flashowaniu wybrałeś niewłaściwy rozmiar pamięci flash (albo autodetekcja się nie powiodła), przy flashowaniu wybrałeś niewłaściwy sposób połączenia pomięci flash do płytki (są 4 do wyboru, po prostu spróbuj każdy po kolei), niewystarczające zasilanie, ale w przypadku tej płytki powinno być ok. Patrząc na płytkę, jest jeszcze jedna możliwość: MicroPython normalnie nie obsługuje 16MB flasha — musi być specjalny build, żeby to działało. Spróbuj wymusić 4MB.
  41. 2 punkty
    Przy RPi podpinasz serwo również bezpośrednio (servoblaster), ale lepiej jakimś shieldem, nie kombinujesz wtedy z gryzieniem się PWM, serw i dźwięku. Oprogramowanie czujnika ultradźwiękowego wcale nie jest takie trywialne - precyzyjny pomiar czasu to nie jest specjalność RPi. Ja bym na Twoim miejscu nie bawił się w ultradźwięki tylko od razu podpiął czujkę TOF (np. taką - sprawdzałem na RPi, działa bardzo dobrze, VL53L1X leży na razie nierozpakowany).
  42. 2 punkty
    Podpinasz bezpośrednio, możesz oczywiście podpiąć zasilanie do czegoś mocniejszego. Nie wiem jak chcesz rozwiązać zasilanie - ja zasilam albo całość z porządnego 5V, albo serwa (w prxypadku większej ilości) z oddzielnej przetwornicy 6V. Czujniki muszą działać naprzemiennie. W przypadku przekładni owszem, będzie to ruch wahadłowy. Z tym czasem rzeczywistym to sobie dokładnie przemyśl... ile czasu trzeba, aby czujnik zwrócił dane o otoczeniu? Ile ma być odczytów na obrót czujnika? Jaki dystans przejedzie robot w tym czasie? Mój eksperyment: czujnik na wprost, po otrzymaniu informacji o przeszkodzie robot się zatrzymywał, skanował otoczenie i wybierał następny fragment trasy. Tyle, że była to dość wolna gąsienicówka... Z czujnikiem TOF wcale nie było weselej, przy 50 msec na odczyt (poniżej tej wartości dokładność pomiaru była za mała) i 9 odczytach odległości czas skanowania wynosił ok. sekundy. Pamiętaj, że serwo też potrzebuje vzasu aby się obrócić, a w czasie pomiaru musi być zatrzymane
  43. 2 punkty
    Z całym szacunkiem... wyjaśnij mi (bo może czegoś nie wiem) jak może być nierówny przepływ prądu w połączeniu szeregowym.
  44. 2 punkty
    Bardzo dobrze - o to chodziło. Od razu dwie uwagi: Przede wszystkim - trochę bez sensu jest konstrukcja z pustym ifem. Czyli zamiast: if (a > b) { } else { coś_robimy(); } powinno być if (a <= b) { coś robimy(); } Kompilator co prawda powinien dać sobie z tym radę, ale człowiek odniesie wrażenie że gdzieś tu się czai błąd. Jeśli dodajesz/odejmujesz pozycję i x zadbaj o to, aby pozycja nie wyskoczyła poza zadany zakres. Ty odejmujesz 20 od pozycji jeśli jest >= 10... czyli ile wyjdzie? Poza tym dalej nie napisałeś na czym polega niedziałanie tego czegoś... a nikomu się nie chce bawiś we wróżkę Co do programowania - co Ci się nie podoba w kursach na Forbocie? Prosto, po polsku... Możesz się wspomóc dowolną książką o C++. Poza tym na arduino.cc masz referencje i tutoriale, korzystając z takich źródeł nie potrzebujesz żadnych jutubów.
  45. 2 punkty
    Nie zabardzo wiem po co na tym etapie potrzebny ci VPN. Może zacznij od mniejszych wyzwań np. napisz program który będzie sterował wirtualnymi napędami, sam zestaw funkcji które np wypisują do logu informacje w stylu jedź prosto//do tyłu... napisz komunikację - nie interesuje cię czy będzie to ethernet, wifi czy może gsm. Wybierz za to protokół komunikacji, np UDP jest dobry do wysyła czegoś często i możesz napisać prostą aplikację desktopową/mobilną klienet-serwer. (coś podobnego jak w grach online, gdzie sterujesz sobie postacią wysyłając pakiety do serwera). jak uda ci się wysterować, to zastanów się jak sterować napędami. kamera, to możesz skorzystać z gotowców np motion, tam masz wykorzystany protokół RTSP, który załatwia komunikację za ciebie. jak masz już to wszystko to teraz można myśleć jak wyjść poza sieć lokalną
  46. 2 punkty
  47. 2 punkty
    W kwestii formalnej: funkcja abs nic nie zmienia, po prostu jej argument jest typu int i kompilator generuje kod zmiany typu (rzutowania) przed przekazaniem wartości do funkcji. Niby mała różnica... ale jednak.
  48. 2 punkty
    Co prawda czasu brak, ale oto mój w 95% skończony projekt. Pozostało dopieszczenie głównie software, poza tym wszystko działa.
  49. 2 punkty
  50. 2 punkty
    Świetnie, że się nauczyłeś, ale chłopie zrozum - jeszcze raz tłumaczę jak głupiemu na miedzy: w kontekście tego wątku nikogo to nie obchodzi. Albo pomagasz merytorycznie pisząc o możliwych miejscach wystąpienia problemu i sposobach usunięcia wad albo siedzisz cicho. Tak, milczenie też jest sztuką, spróbuj, za nienapisany post nie ma minusów. I nie jest ważne czy ugryziesz się w język z powodu niezrozumienia działania układu czy innego zdania na temat jedynie słusznego (wg Ciebie) rozwiązania - dopóki nic nie piszesz, nikt się nie domyśli a tak to zaczynam mieć podejrzenia graniczące z pewnością, że gdy nie masz pojęcia co napisać, piszesz pseudomądrości byle zaistnieć. Aż tak bardzo potrzebujesz uznania? Spamujesz swoimi wynurzeniami o wyższości tego czy tamtego już któryś wątek a przecież masz tu tylko jeden schemat i jedno proste pytanie: dlaczego to tak działa i co poprawić? Twoje "sygnalizacje" naprawdę są nie na miejscu. Jeśli chcesz się popisywać epistolografią, może załóż coś w rodzaju "Moje poglądy na temat dzisiejszej elektroniki hobbystycznej" i każdy kto będzie tym zainteresowany tam zajrzy. Po co się ludziom tak nachalnie narzucać? Bądź dorosły i odpisz na temat albo wcale, zamiast odgryzać się za każde zdanie.Podyskutuj z tym co napisałem, masz jakiś lepszy pomysł? Coś o dynamice silnika? Może o problemie zbyt wolnego wzmacniacza błędu? To jest tutaj pożądane, dawaj do pieca, potrzebujemy tu elektronika..
Tablica liderów jest ustawiona na Warszawa/GMT+02:00
×
×
  • Utwórz nowe...