Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'hexapod'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - roboty
    • Projekty - DIY
    • Projekty - DIY (początkujący)
    • Projekty - w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie
    • Kosz

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Znaleziono 3 wyniki

  1. Hexapod w V-REP. Import i konfiguracja modelu. W niniejszym artykule opisany został proces importu i konfiguracji własnego modelu robota kroczącego do programu symulacyjnego V-REP. Virtual Robot Evaluation Platform (V-REP) jest środowiskiem programistycznym służącym do symulacji robotów. Jeśli dysponujesz modelami swojego robota, dobrałeś napędy i czujniki, ale masz wątpliwości czy wszystko zadziała jak należy to V-REP może znacznie ułatwić Ci pracę. Ten wpis brał udział konkursie na najlepszy artykuł o elektronice lub programowaniu. Sprawdź wyniki oraz listę wszystkich prac » Partnerem tej edycji konkursu (marzec 2020) był popularny producent obwodów drukowanych, firma PCBWay. Ze względu na mnogość rozwiązań i przykładów z zakresu robotów stacjonarnych, chciałbym skupić się na opisie przygotowania modelu robota kroczącego do symulacji. V-REP dostarcza środowisko edytorskie, w którym użytkownik może tworzyć własne modele robotów. Niestety dostarczany interfejs jest bardzo nieefektywny. Prostszym i mniej czasochłonnym rozwiązaniem jest import gotowego modelu z innego programu edytorskiego. Możemy dodawać obiekty zapisane w plikach *.dxf, *.obj, *.stl oraz *.3ds. Interfejs graficzny programu V-REP Import modelu z innego edytora 3D Modele, które posłużyły w tym przykładzie utworzono w programie AutodeskInventor 2020. Program ten umożliwia łatwy eksport części czy całego złożenia do dowolnego formatu obsługiwanego przez V-REP za wyjątkiem formatu *.3ds. W celu importu modelu (najlepiej importować złożenie) korzystamy z paska menu -> File -> Import -> Mesh… Model robota w programie Inventor (po lewej) oraz V-REP (po prawej) Po imporcie złożenia do symulatora łatwo zauważyć, że model stanowi jedną bryłę zamiast oddzielnych elementów robota. Należy taką bryłę odpowiednio pogrupować (klikamy pasek menu -> Edit -> Grouping/Merging -> Divide selected shapes), pamiętając o wcześniejszym zaznaczeniu naszego modelu. W wyniku takiej operacji pojawia się znacznie więcej elementów niż jest to pożądane. Dlatego też należy połączyć z powrotem części, które mają stanowić zespoły nieprzemieszczające się względem siebie (Edit -> Grouping/Merging -> Merge selected shapes). Przed przystąpieniem do grupowania, warto usunąć części, które powtarzają się wielokrotnie, w tym przypadku są to nogi robota. Do konfiguracji działania modelu w symulatorze wystarczy nam tylko jedna lub dwie nogi (w moim przypadku zostawiłem dwie nogi ponieważ miałem wykonane dwa typy nóg, jeśli się przyjrzycie, dostrzeżecie różnicę ). Model podzielony na poszczególne elementy oraz usunięty nadmiar części Tak przygotowany model gotowy jest do powielenia. Kopiujemy model do nowej sceny w celu uproszczenia go i nadania jego elementom właściwości obiektów dynamicznych. W celu uproszczenia części w tym przykładzie wykorzystano konwersję zaimportowanego modelu do postaci prostych kształtów (Edit -> Morph selection into convex shapes). Kształty takie (bryły) reprezentowane są przez trójkąty opisujące ich powierzchnię (MES). Liczba elementów skończonych rzutuje na złożoność obliczeń, dlatego należy starać się uzyskać jak najmniejszą ich liczbę przy zachowaniu zarysu kształtów oryginalnych części. Warstwa modeli dynamicznych konstrukcji jest niewidoczna podczas symulacji. Model dynamiczny części (po prawej) – przełączanie pomiędzy warstwami Przeguby Aby umożliwić ruch odpowiednim częściom robota, wprowadzamy do układu przeguby. W tym celu należy wybieramy z paska menu -> Add -> Joint -> Revolute. Następnie, po zaznaczeniu przegubu, korzystając z narzędzi Position oraz Orientation ustawiamy przegub w pożądanym miejscu (rysunek powyżej, na modelu po lewej widoczne są pomarańczowe przeguby). Operację tą wykonujemy dla kolejnych przegubów nogi. Dzięki usunięciu „nadmiarowych” nóg oszczędzamy mnóstwo czasu w tym momencie – tworzymy jedynie 3 lub 6 przegubów zamiast wszystkich 18. Elementy te symulują działanie napędów robota, dlatego istotne jest ustawienie odpowiedniego momentu obrotowego. Można to uzyskać korzystając z obliczeń lub doświadczalnie – wszystko zależy od przeznaczenia naszego modelu symulacyjnego. Każdemu z przegubów można zaimplementować regulator: Parametr proporcjonalny dostarcza część sygnału sterującego proporcjonalną do błędu pozycji. Im większy jest błąd, tym większy jest sygnał sterujący, wymuszający korekcję położenia. Człon całkujący rośnie z czasem i jest proporcjonalny do sumy błędów. Człon ten minimalizuje (tłumi) błąd jaki powstaje w wyniku stałego obciążenia i powoduje dojście do pozycji zadanej. Ostatni parametr – różniczkujący jest tym większy im większa jest różnica błędu w kolejnych próbkach. Jest więc odpowiedzialny za tłumienie zmian błędu (tłumi oscylacje). Parametry dynamiczne przegubu - napędu Łańcuch kinematyczny Po odpowiednim pogrupowaniu części, stworzeniu ich reprezentacji dynamicznej oraz dodaniu przegubów, musimy utworzyć łańcuch kinematyczny. Dodajemy dwa obiekty typu Dummy – jeden nazwany foot_Tip, drugi foot_Target. Tip jest swego rodzaju TCP (ang. Tool Central Point) nogi podczas Target będzie odpowiadać za docelowe położenia TCP podczas ruchu robota. Stworzono zatem połączenie pomiędzy tymi dwoma obiektami oraz zbudowano drzewo dziedziczenia pomiędzy obiektami reprezentującymi elementy robota. Model ze zdefiniowanym TCP oraz punktem docelowym Następnie dodano nową grupę kinematyczną w celu powiązania punktów ze sobą. Korzystając z okna parametrów kinematyki, dodano element TIP jako końcówkę łańcucha. Od tego momentu w chwili przesunięcia elementu TARGET, element TIP będzie za nim podążać. Na tym etapie konfiguracji modelu można sprawdzić jej poprawność, wyłączając dynamikę w oknie właściwości modułu obliczeniowego. Następnie należy włączyć symulację oraz wybrać i przesunąć obiekt TARGET. Jeśli wszystkie kroki zostały wykonane poprawnie, noga powinna podążać za celem. Definiowanie łańcucha kinematycznego Po wykonaniu powyższych instrukcji powielono przygotowany model nogi. Skopiowane nogi umieszczono w odpowiednich miejscach. Tak przygotowany model jest gotowy do wprawienia w ruch za pomocą skryptów napisanych w języku LUA. Model gotowy do implementacji kodu sterującego Skrypty W systemie V-REP każdy skrypt jest identyfikowany z obiektem np. robotem. Wyjątkiem jest skrypt odpowiadający za symulację otoczenia. Takie zastosowanie umożliwia użytkownikowi pełną elastyczność w tworzeniu modeli, korzystania z odczytów sensorów, sterowania przegubami. W efekcie daje to możliwość budowania systemów sterowania i testowania różnych algorytmów sterowania. Przebieg sterowania pomiędzy skryptami w V-REP Skrypt główny (MainScript) uruchamia kolejne skrypty potomne utożsamione z naszymi modelami (ChildScript), które są wykonywane w trybie wątkowym lub bezwątkowym. W trybie wątkowym skrypty te pracują przez cały czas w tle, natomiast bezwątkowe są wywoływane w każdym kroku symulacji, podejmują pewne akcje i kończą swoje działanie. Najszybszym sposobem, na sprawdzenie poprawności wykonania modelu w V-REP jest wykorzystanie skryptów z przykładów dostępnych w programie, np. „hexapod” . Należy jednak zaznaczyć, że skrypty te będą działały jedynie dla hexapodów posiadające trzy stopnie swobody na każdą nogę (skrypty dodałem również w załączniku). Dostępne skrypty obsługują ruch nóg robota względem środka ciężkości oraz ruch modelu w przestrzeni symulatora. Napisane są w języku Lua, który jest opisany między innymi na stronie producenta programu V-REP. Obydwa skrypty wykorzystywane w symulatorze przypisane są do konkretnego elementu (części) robota. W przypadku sterowania nogami jest on przypisany do wizualnej części odpowiadającej za korpus robota. Takie rozwiązanie pozwala na zapewnienie sterowania nogami bez konieczności tworzenia oddzielnych skryptów na każdą nogę z osobna. Należy zaznaczyć również, że sterowanie nogami robota polega na wyznaczeniu kolejnych położeń celu, do którego dana noga ma podążać (hexa_footTarget..i). Konfiguracja modelu w edytorze graficznym pozwala na rozwiązanie odwrotnego zadania kinematyki przez symulator. Układem odniesienia dla trajektorii opisanych w skrypcie jest układ współrzędnych części, do którego ten skrypt jest przypisany. Podczas inicjacji programu/symulacji skrypt odwołuje się do obiektów footTarget, a następnie tworzy listy celów oraz końcówek nóg robota. robotBase=sim.getObjectHandle('hexa_legBase') legTips[i]=sim.getObjectHandle('hexa_footTip'..i-1) legTargets[i]=sim.getObjectHandle('hexa_footTarget'..i-1) Na inicjację składa się również wyzerowanie pozycji bazowej oraz pobranie współrzędnych końcówek nóg. W celu zapewnienia odpowiedniej kolejności przenoszenia nóg podczas danego typu chodu zadeklarowano tablicę indeksów kolejnych nóg robota. Indeks ten jest wykorzystywany w funkcji określającej przesunięcie nóg względem początku układu odniesienia. W funkcji inicjacyjnej ustawiane są też domyślne wartości parametrów chodu takie jak prędkość kroku, wysokość kroku, kierunek ruchu itp.. legMovementIndex={1,4,2,6,3,5} stepProgression=0 stepVelocity=0.5 stepAmplitude=0.16 stepHeight=0.04 movementStrength=1 realMovementStrength=0 movementDirection=0*math.pi/180 rotation=0 Funkcja sysCall_init wykonywana jest tylko raz (podczas pierwszego wywołania skryptu) i odpowiada za przygotowanie symulacji. W tym przypadku wykorzystana jest do nadania parametrów bazowych modelom. Funkcja functionsysCall_actuation() jest wykonywana w każdym momencie działania symulacji podczas fazy sterowania, z częstotliwością ustawioną w programie. Kod zawarty w tej funkcji odpowiada za obsługę wszystkich funkcji sterujących, które zapewnia symulator (kinematyka odwrotna, dynamika itp.). Tutaj znajdują się odwołania do wartości parametrów chodu w czasie rzeczywistym. Zawarta w funkcji functionsysCall_actuation() pętla for odpowiada za ustawienie działania nóg robota w zależności od jej indeksu. Nadając odpowiednie indeksy nogom, zrealizowano ruch trójpodporowy. Ponadto w pętli tej zawarte są obliczenia wyznaczające położenie kolejnych końcówek nóg robota w każdym momencie jego ruchu. Trajektorie wyznaczane są na płaszczyźnie i realizowane są poprzez skręcenie kolejnych przegubów nogi. Zmienna md (ang. movement direction) zawiera informację o aktualnym kierunku ruchu robota, a za pomocą tablicy p przekazywana jest informacja o położeniu punktu docelowego w kolejnych chwilach symulacji. for leg=1,6,1 do sp=(stepProgression+(legMovementIndex[leg]-1)/6) % 1 offset={0,0,0} if (sp<(1/3)) then offset[1]=sp*3*stepAmplitude/2 else if (sp<(1/3+1/6)) then s=sp-1/3 offset[1]=stepAmplitude/2-stepAmplitude*s*6/2 offset[3]=s*6*stepHeight else if (sp<(2/3)) then s=sp-1/3-1/6 offset[1]=-stepAmplitude*s*6/2 offset[3]=(1-s*6)*stepHeight else s=sp-2/3 offset[1]=-stepAmplitude*(1-s*3)/2 end end end md=movementDirection+math.abs(rotation)*math.atan2(initialPos[leg][1]*rotation,-initialPos[leg][2]*rotation) offset2={offset[1]*math.cos(md)*realMovementStrength,offset[1]*math.sin(md)*realMovementStrength,offset[3]*realMovementStrength} p={initialPos[leg][1]+offset2[1],initialPos[leg][2]+offset2[2],initialPos[leg][3]+offset2[3]} sim.setObjectPosition(legTargets[leg],antBase,p) end Skrypt sterujący całym robotem zawiera funkcję odpowiadającą za przekazywanie wartości parametrów takich jak: prędkość chodu, wysokość kroku czy kierunek ruchu. Dodatkowo wykorzystano funkcję moveBody, w której zdefiniowano sekwencje ruchów. W funkcji głównej wywoływana jest ona z odpowiednim indeksem aby uruchomić sekwencję o tym samym indeksie. Do wywoływania danych funkcji służy funkcja sysCall_threadmain(). Część kodu w niej zawarta wykonywana jest w momencie rozpoczęcia danego wątku, aż do jego zakończenia. Wątek może rozpocząć się wraz ze startem symulacji, ale także w trakcie jej działania. Tutaj też pobierane są informacje z interfejsu graficznego o położeniu elementów bazowych układu, określana jest pozycja startowa robota oraz nadane zostają wartości zmiennych. Podsumowanie Powyższy tekst stanowi ogólny opis czynności, które należy wykonać w celu wykonania prostej symulacji w programie V-REP. Na proces ten składa się: Import modelu z edytora 3D oraz przygotowanie poszczególnych członów robota Wykonanie modelu dynamicznego robota wraz z dodaniem przegubów Zdefiniowanie łańcucha kinematyki Implementacja skryptów w celu weryfikacji modelu Tekst ten powstał ze względu na małą popularność opisywanego symulatora oraz jeszcze mniejszą dostępność kompletnych opracowań dotyczących robotów kroczących. Pisząc ten tekst miałem nadzieję na w miarę przystępne nakreślenie procesu modelowania robota w symulatorze, jednak w przypadku chęci praktycznego wykorzystania tych informacji należałoby się zaznajomić z podstawami obsługi V-REP. Dlatego też bardzo docenię każdą sugestię co przydałoby się opisać dokładniej lub gdzie przydałoby się zaprezentować różne podejścia (np. dobór nastaw regulatorów). Dla inspiracji dodam, że na podstawie testów w V-REP udało mi się opracować konstrukcję hexapoda (mam nadzieję że jest choć trochę podobny do tego z artykułu): skrypty.rar
  2. Jakiś czas temu zacząłem się zastanawiać, czy da się zrobić kroczącego robota na dwóch serwach. Pooglądałem sobie parę filmików, i wyszło na to że owszem można - ale skręcanie będzie niemożliwe. Ponieważ zawsze uważałem, że niemożliwe to jest włożenie hełmu na lewą stronę (chociaż podobno jeden żołnierz udowodnił że jest to możliwe kiedy wrócił nażłopany z lewizny) - postanowiłem przeanalizować, co w istniejących konstrukcjach mi się nie podoba. No i nie spodobało mi się to, że robot mimo że przestawia sobie wszystkie nogi i tak się ślizga (nawet na trzech serwach nie da się chyba zrobic prawdziwego, precyzyjnego chodu). Postanowiłem więc, że ten "prawdziwy" chód będzie taki trochę z przymrużeniem oka, a ważniejsze jest wrażenie chodu (ech, lata pracy w teatrze lalek) i umiejętność manewrowania. Pierwszy robot powstał w ciągu praktycznie jednej nocy - niestety, trwałość konstrukcji ze spienionego PCW poklejonego czym się dało była znikoma. Co prawda Ciapek stoi mi na biurku i powoli wymieniam wszystkie elementy tak, aby doprowadzić go do stanu pełnej używalności, ale zawsze mam coś ważniejszego do zrobienia... Ostatnio ponieważ kupiłem kilka drobiazgów postanowiłem "pożyczyć" je do mniejszej wersji robota. Serwa były przeznaczone do kolejnej lalki, Arduino Pro Mini zawsze jakieś mi się w szufladzie pałęta, akumulatorek ma zasilać RPi Zero W, odżałowałem tylko parę drobnych elementów elektronicznych, parę śrubek i kilka metrów filamentu. Tak że mam przyjemność przedstawić Pseudopoda - czyli robota który co prawda tak naprawdę nie chodzi, ale skrzętnie ten fakt ukrywa Napęd robota stanowią dwa serwa Feetecha FS0307 - w stosunku do rozmiarów (najmniejsze jakie mi się udało znaleźć) mają całkiem niezły moment i prędkość. Jak widać, ruchoma jest tylko jedna (środkowa) para nóg, przednie i tylne służą jako podpory. Teoretycznie można stworzyć konstrukcję, w której będzie się ślizgać wyłącznie tylna noga podporowa, ale nie bardzo mi się chciało bawić w jakieś skomplikowane mechanizmy - szczególnie, że robot i tak pójdzie do demontażu. Mózg to Arduino Pro Mini, zasilanie - akumulatorek LiPo 980mAh plus przetwornica MT3608. Zmysłem robota jest pojedynczy czujnik TCRT5000L, który całkiem nieźle reaguje z całkiem sporej odległości (rzędu kilku-kilkunastu cm). Algorytm działania jest bardzo prosty: robot ma się szwendać po pokoju, co jakiś czas zmieniając sobie kierunek owego szwendania się a w przypadku napotkania na przeszkodę ma od niej odejść. Kod jest na tyle prosty, że zamieszczam go tu w całości. #include <Servo.h> #define VERT_PIN 10 #define HORIZ_PIN 11 #define INFRA_PIN 6 #define PHOTO_PIN A3 #define VS_ZERO 100 #define VS_MINI 85 #define VS_MAXI 125 #define HS_ZERO 80 #define HS_MINI 40 #define HS_MAXI 120 #define INFRA_STEP 40 Servo vservo, hservo; void setup(void) { pinMode(13, OUTPUT); pinMode(INFRA_PIN, OUTPUT); vservo.attach(VERT_PIN); hservo.attach(HORIZ_PIN); vservo.write(VS_ZERO); hservo.write(HS_ZERO); } enum { STEP_NO=0, STEP_FWD, STEP_BAK, STEP_LEFT, STEP_RIGHT}; uint8_t steptable[2][10]={ {VS_ZERO, VS_ZERO, VS_MINI, VS_MAXI, VS_MAXI, VS_MINI, VS_MAXI, VS_MINI, VS_MINI, VS_MAXI}, {VS_ZERO, VS_ZERO, VS_MAXI, VS_MINI, VS_MINI, VS_MAXI, VS_MAXI, VS_MINI, VS_MINI, VS_MAXI}}; void _step(int8_t lr, int8_t fwbr) { int i; hservo.write(HS_ZERO); delay(100); vservo.write(steptable[lr][2*fwbr]); delay(100); hservo.write(lr?HS_MAXI:HS_MINI); delay(100); #define SPP 7 for (i=1; i<=SPP; i++) { vservo.write(steptable[lr][2*fwbr]+ ((steptable[lr][2*fwbr+1] - steptable[lr][2*fwbr]) * i) / SPP); delay(40); } hservo.write(HS_ZERO); } void step(int8_t fwbr) { static int8_t s=0; _step(s,fwbr); s = !s; } int getPhoto(void) { int a; digitalWrite(INFRA_PIN,1); delay(5); a=analogRead(PHOTO_PIN); digitalWrite(INFRA_PIN,0); delay(5); a -= analogRead(PHOTO_PIN); a = a > INFRA_STEP; digitalWrite(13, a); return a; } bool rdz=0; void loop() { int i,n,m; n=random(8,12); for (i=0;i<n;i++) { if (getPhoto()) { if (!rdz) randomSeed(micros()); rdz=1; break; } step(STEP_FWD); } n=random(4,6); for (i=0;i<n;i++) { getPhoto(); step(STEP_BAK); } n=random(4,8); m=random(2) ? STEP_LEFT:STEP_RIGHT; for (i=0;i<n;i++) { getPhoto(); step(m); } } Tak swoją drogą ciekawe, czy da się zrobić pseudopoda z jednym serwem...
  3. Witajcie. Mam do zaprezentowania mój nowy projekt. Zdalnie sterowany robot kroczący z odbiornikiem podczerwieni. Jednostką centralną jest mikrokontroler ATmega8A-PU. Robot porusza się dzięki trzem serwomechanizmom TowerPro SG90. Inspiracją do sposobu chodzenia był robot kroczący Pololu. Robot posiada 6 niebieskich diod. Ich katody są połączone z odpowiednimi pinami mikrokontrolera, dzięki czemu steruję nimi w zależności od wykonywanego ruchu robota. Anody są połączone przez rezystor z nogami robota, te natomiast są połączone z potencjałem dodatnim zasilania. Jako pilota używam telefonu z androidem wraz z aplikacją RCoid. Korzystam ze standardu RC5. Kierunkami poruszania się robota są przód, tył, obracanie w lewo i prawo. Do zatrzymania robota służy dowolna inna komenda. Sterowanie serwomechanizmów odbywa się dzięki programowo stworzonemu PWM na 8 bitowym timerze mikrokontrolera. Tak wygląda kod przerwania od przepełnienia timera: ISR(TIMER0_OVF_vect) { static uint16_t cnt; if(cnt>=r) PORTC &= ~(1<<PC3); else PORTC |= (1<<PC3); if(cnt>=m) PORTC &= ~(1<<PC4); else PORTC |= (1<<PC4); if(cnt>=l) PORTC &= ~(1<<PC5); else PORTC |= (1<<PC5); cnt++; if(cnt>625) cnt = 0; } Zmienne r m i l odpowiadają za położenie poszczególnych nóg zmieniane w pętli głównej programu. Ich zakres mieści się od 17-76 (0.5ms-2.5ms) (0°-180°). Oczywiście zakres pracy jest mniejszy. Dla przykładu dobranymi wartościami dla nogi środkowej są 42 przy oparciu na lewej części, 44 pozycja środkowa, 46 oparcie na prawej części nogi. Zmienna licznika cnt jest porównywana z wartością 625, dzięki czemu uzyskuję częstotliwość 50Hz (8000000Hz/1/256/625=50Hz [20ms] [prescaler=1]). Jeżeli chodzi o kwestie zasilania to zdecydowałem się na użycie czterech zwykłych baterii AAA dających na wyjściu ~6V co zmusiło mnie do użycia przetwornicy Pololu S7V7F5 do zasilania mikrokontrolera. Diody i serwomechanizmy są zasilane bezpośrednio z baterii. Nogi zostały wygięte ze stalowego drutu o średnicy 1.5mm. Do orczyków zostały przymocowane za pomocą stalowego drutu o średnicy 0.3mm. Koniec każdej nogi zalałem gorącym klejem tak, aby zapobiec ślizganiu się robota na gładkiej powierzchni. Lista elementów: mikrokontroler ATmega8A-PU 3x serwomechanizmy TowerPro SG90 przetwornica Pololu S7V7F5 odbiornik podczerwieni TSOP31236 6x diody niebieskie rezonator kwarcowy 8MHz trytki i rurki termokurczliwe druty stalowe o średnicy 1.5mm, oraz 0.3mm płytka stykowa 170 otworów 4x baterie AAA z koszykiem parę rezystorów, kondensatorów i przewodów Zapraszam do śmiałego pisania swoich pytań, opinii i uwag Pozdrawiam, Karol
×
×
  • Utwórz nowe...