Skocz do zawartości

kampo

Użytkownicy
  • Zawartość

    58
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    1

kampo wygrał w ostatnim dniu 26 maja

kampo ma najbardziej lubianą zawartość!

Reputacja

11 Dobra

O kampo

  • Ranga
    4/10

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Świdnica

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Zgadza się, wspomniałem o tym już na początku artykułu, że do języka polskiego - w tym też innych słowiańskich czy fleksyjnych jak napisałeś - należy podejść nieco inaczej. Generalnie pamiętajmy, że jest sporo ludzi, który nie mieli do czynienia z NLP w ogóle. Być może przesadnie używałem słowa "zdanie" i doświadczona osoba w tym obszarze może wskazać wiele uwag, ale chciałem artykuł utrzymać w jak najprostszej formie. Artykuł przedstawia pewne podejście i zawiera kawałek nowej wiedzy, którą trzeba przyswoić, więc aby nie komplikować za bardzo - uprościłem niektóre rzeczy. Jest to też trochę ten przypadek "skończ gadać i pokaż kod" (przynajmniej dla mnie ) Zakładam, że jeśli kogoś NLP zaintryguje i zacznie drążyć na własną rękę, to prędzej czy później dojdzie do takich wniosków odnośnie przedstawionego tutaj procesu zastosowanego do języka polskiego przykładowo Nie traktuję tego jako coś złego, dla mnie wszystkie uwagi i konstruktywna krytyka są mile widziane. Dobrze też wiedzieć, że masz z tym doświadczenie Inna sprawa, że cały czas uczę się przekazywać wiedzę w taki sposób, aby było to zrozumiałe. Także dziękuję za uwagi Dokładnie taki był cel
  2. Właśnie opublikowałem artykuł, także zapraszam: https://forbot.pl/forum/topic/16344-wstep-do-przetwarzania-jezyka-naturalnego---klasyfikacja-tekstu/
  3. Witajcie, w artykule zajmiemy się klasyfikacją tekstu z wykorzystaniem sieci neuronowej. W kontekście robotyki, klasyfikacji możemy użyć w sterowaniu robotem za pomocą języka naturalnego. Przykład można zobaczyć w wątku AgeBot. Przetwarzanie języka naturalnego (NLP) jest obszernym tematem, dlatego nie będziemy wdawać się zbytnio w szczegóły, ale przedstawię ogólną koncepcję i narzędzia przydatne do przetwarzania tekstu - da Wam punkt startowy w tej ciekawej dziedzinie Aby utrzymać artykuł we w miarę któtkiej formie zawierającej samo „mięso” założę, że Python jest Wam znany. Będziemy przetwarzać zdania w języku angielskim, który jest jednym z łatwiejszych języków w NLP. Język polski jest problematyczny (chociaż do niego też są narzędzia), więcej można dowiedzieć się z tego filmu. Niniejszy artykuł objaśni bardziej proces normalizacji tekstu, da Wam informacje czego dalej szukać oraz pokaże jak klasyfikacja tekstu z grubsza działa. Konkretną implementację udostępniłem na GitHubie (link), którą możecie traktować jako bazę, aby zrobić podobne sterowanie w Waszych robotach Polecam jednak przestudiować podlinkowany przykład kodu, aby dokładniej zrozumieć, co tam się dzieje lub rozwiać wątpliwości po przeczytaniu poniższych akapitów. Zacznijmy od początku Wspomniałem o sieci neuronowej, ale co to właściwie jest i jak ona działa? Polecam ten film. Wiedza jak działa sieć neuronowa nie jest jednak niezbędna, aby korzystać z powyższego kodu Jeśli korzystacie w swoich robotach z Raspberry PI, spokojnie powinniście bez problemu wykonywać poniższe czynności oraz uruchomić przykładowy kod na tejże platformie. Zainstalujmy potrzebne zależności: pip3 install tensorflow nltk tflearn numpy Tensorflow jest biblioteką, dzięki której możemy budować modele uczenia maszynowego. Tflearn jest nakładką, która ułatwia korzystanie z Tensorflow. Z Numpy korzystać będzie Tensorflow. Nltk natomiast jest biblioteką, która zawiera szereg przydatnych funkcji, jeśli zajmujemy się NLP. Po zainstalowaniu, przygotujmy bibliotekę nltk do użytku za pomocą konsoli Pythona (po tym kroku można uruchomić skrypt z GitHuba): import nltk nltk.download(‘punkt’) Pora na mięso Jeśli mamy sterować robotem, to przyjmijmy sobie jedno zdanie na którym objaśnię kolejne etapy - niech to będzie „move forward please”. W pierwszym kroku następuje tzw. tokenizacja – podzielenie zdania na mniejsze części, które nazywamy tokenami. W przypadku przyjętego zdania, dostaniemy: [‘move’, ‘forward’, ‘please’] Używamy do tego funkcji „word_tokenize” z biblioteki „nltk”. Samo zdanie zostało podzielone na słowa, jednak wynik przy trudniejszych zdaniach będzie wyglądał nieco inaczej. Spróbujmy „robot didn’t move!”. [‘robot’, ‘did’, „n’t”, ‘moved’, ‘!’] Pamiętajmy jednak, że języki mają różne reguły, więc rozbicie zdania za pomocą „spacji” niekoniecznie będzie poprawnym sposobem W powyższym „n’t” możemy zastąpić na „not”, gdyż te dwa słowa oznaczają to samo. Jeśli tego nie zrobimy, oba będą traktowane jako dwa osobne słowa, co może zakłócić trafność klasyfikacji. Kolejnym krokiem jest stemming. Co to takiego? Jest to redukcja konkretnych słów do ich podstawowych form. Co dzięki stemmingowi osiągamy? Jedną intencję można wyrazić na kilka sposobów, używając różnych odmian danych słów, jednak te zdania nadal oznaczają jedno. Istnieje wiele algorytmów, możecie pobawić się nimi tutaj. My użyjemy algorytmu Lancaster, który jest dosyć agresywny. Przykładowo zdanie: Programmer programmed a program which programs new programs zostanie zredukowane do formy program program a program which program new program Ostatnim krokiem jest normalizacja danych w taki sposób, aby proces był powtarzalny. Tworzymy więc sobie słownik zawierający unikalne słowa, w którym umieszczamy tokeny po stemmingu posortowane wg. alfabetu. Dane treningowe dla modelu, jako że sieć neuronowa pracuje na liczbach, musimy przekształcić... na liczby . Zakładając, że nasz słownik już po tokenizacji i stemmingu wygląda następująco: [‘forward’, ‘mov’, ‘pleas’] Tworzymy pierwszy wiersz danych trenujących korzystając z przykładów zdań. W naszym przypadku jest jedno zdanie, ale słowo „please” jest właściwie opcjonalne. Bez „please” po prostu będziemy mniej mili Tworzymy nową tablicę i iterujemy po słowniku. Jeśli napotkamy w nim słowo, które występuje w zdaniu, wstawiamy do nowo utworzonej tablicy 1, w przeciwnym wypadku 0. Ilość elementów w jednym wierszu danych trenujących musi być równa ilości słów w słowniku oraz ich kolejność musi być identyczna, stąd taki zabieg. Uzyskujemy następujące dane treningowe: Dla zdania „move forward please”: [1, 1, 1] Dla zdania „move forward”: [1, 1, 0] Analogicznie postępujemy z danymi wyjściowymi, czyli naszymi klasami. Tworzymy tablicę dostępnych, unikalnych oraz posortowanych alfabetycznie klas. Przyjmijmy, że nasze zdanie będzie sklasyfikowane jako „move” oraz do przykładów dodamy zdanie „hello there” oznaczone klasą „greeting”: [‘greeting’, ‘move’] Wyjściem będzie: Dla zdania „move forward please”: [0, 1] Dla zdania „move forward”: [0, 1] (to jest ta sama klasa zdania) Dla zdania „hello there”: [1, 0] Skupmy się jednak dalej na naszym bazowym zdaniu „move forward please”. Dane trenujące, które uzyskamy w całym tym procesie, czyli: X = [[1, 1, 1], [1, 1, 0]] Y = [[0, 1], [0, 1]] używamy, aby wytrenować sieć neuronową. Po wytrenowaniu, klasyfikując konkretne zdania, proces powtarzamy – sprowadzamy zdanie do liczb i klasyfikujemy. Gdy mamy już wytrenowany model (sieć), używamy go w celu klasyfikacji nowych (lub tych z przykładów) zdań. Ostatecznie pisząc do robota „move forward please” wiemy, że autorowi chodzi o „move”, ponieważ wyjście sieci neuronowej to prawdopodobieństwo z jaką algorytm jest "pewien" danej klasy. Suma tych liczb, przez użycie funkcji aktywacyjnej "softmax" będzie równać się jeden, niezależnie od ilości klas. Zatem programujemy programujemy robota zależnie od naszych potrzeb W tym artykule to już wszystko. Polecam jeszcze raz, aby zapoznać się z kodem na GitHubie. Jeśli coś było niejasne, chętnie odpowiem na Wasze pytania. PS: Celowo pominąłem część przykładów z kodem, ponieważ zależnie od tego jakiej biblioteki użyjecie, nazwy funkcji mogą się różnić.
  4. Jasne, może podałem nienajlepszy przykład, ale wiadomo o co chodzi Dodam jeszcze, że nie tylko ja muszę inicjować odpowiedź robota. On sam też do mnie pisze, jeśli np. wywnioskuje, że kończy mu się bateria, więc powinien zwolnić, aby ograniczyć zużycie prądu i poinformować mnie o tym, żeby naładować akumulator. W planach mam również zrobienie stacji dokującej (raczej dalszy plan), aby nie zawracał głowy
  5. Na ten moment mój serwis wspiera tylko język angielski, ponieważ jest prostszy w "obróbce" (przynajmniej prostszy od polskiego, ale o tym w nadchodzącym poście). Dodam język polski na pewno, natomiast nie zastanawiałem się nad docelowym językiem komunikacji z moim robotem - w sumie fajna okazja do przećwiczenia angielskiego, co w sumie robię w pracy, więc bardziej byłbym za polskim Czat w filmikach jest po angielsku, żeby rozumiała większa ilość osób, o czym się tam rozmawia (przynajmniej wydaje mi się, że tak jest) Super, dziękuję PS: Wspomniałem o poście. Mam zamiar napisać tam nieco szczegółowych informacji o samym procesie przetwarzania tekstu i dać taki punkt startowy dla tych, który się zainteresują. I tutaj mam do Was pytanie, czy bylibyście zainteresowani zrobić też takie sterowanie w Waszych konstrukcjach? Zaznaczam, że to wcale nie musi być robot. Możecie nawet swojemu "asystentowi" (który byłby kawałkiem programu) powiedzieć lub napisać, żeby przestać grzać w mieszkaniu, bo za gorąco Robot, dron, asystent, autonomiczny odkurzacz lub coś, do czego sięga Wasza fantazja.
  6. Oprócz czatowania mam w planie również zamontować jakiś głośnik z mikrofonem, aby można było z robotem porozmawiać. Sam czat stworzył pewne podwaliny pod tę warstwę, do tego jest elementem projektu, o którym wspomniałem na końcu posta Jeśli chodzi o czatowanie i przetwarzanie tekstu, to dobranie odpowiednich parametrów modelu tak, aby miał jak największą, poprawną trafność tego, "co ja chcę od robota", niezależnie od trenowania modelu.
  7. Witam Od około półtora roku interesuję się sztuczną inteligencją, zwłaszcza zastosowaną w robotyce. Jest to dla mnie niezwykle ciekawy temat Kilka miesięcy temu zacząłem pracować nad moim prywatnym projektem, który cały czas jest w fazie rozwoju. Pewne elementy, takie jak uczenie się poprzez rozmowę z człowiekiem są gotowe, więc postanowiłem nagrać poniższe filmy: AgeBot podłączony jest do internetu. Platforma to gotowa konstrukcja - AlphaBot-PI. Użyłem jej, aby szybciej skupić się na oprogramowaniu. W ostatnim czasie domykałem widoczne na filmach możliwości robota i w międzyczasie zacząłem pracę nad wykorzystaniem kamery (aktualny stan to ~30%). W bliskiej przyszłości platformę mam zamiar wymienić na coś bardziej zaawansowanego lub zbudować swoją, ponieważ ta zaczyna mnie powoli ograniczać (pod względem hardware'u). Jej specyfikacja dostępna jest w internecie (np. na stronie firmy Waveshare), więc nie będę kopiował Jak już zauważyliście - używam Raspberry PI. Oprogramowanie na malinkę napisałem w C++, pozostała część to C++ oraz Python. Systemem jest Raspbian. Do zautomatyzowania instalacji niektórych zależności w systemie (akurat w przypadku samej malinki) używam narzędzia Ansible, a o te krytyczne dla działania aplikacji dba manager pakietów (apt, buduję paczki .deb). Do przetwarzania tekstu użyłem biblioteki Tensorflow, natomiast w procesie uczenia się, robotowi asystuje wnioskowanie. Kamera i przetwarzanie obrazu otworzy wiele nowych drzwi, ułatwi również pracę przy kolejnej domenie - planowaniu zadań. Sam robot jest stosunkowo małą częścią projektu, ale o tym... w przyszłości Każdy feedback mile widziany Pozdrawiam PS: W ciągu kilku dni napiszę posta z trochę bardziej szczegółowymi informacjami odnośnie przetwarzania tekstu - czatowania z robotem
  8. Witam. Przedstawiam klasę obsługującą pada od Play Station 2 (napisaną na podstawie kodu stąd). Jest możliwość wyboru interfejsu SPI software'owego lub hardware'owego. Klasa powinna nadać się do użytku na większości AtMeg. Jak korzystać? W nagłówku klasy odpowiednio poustawiać numery pinów i nazwy rejestrów w define'ach, a następnie w kodzie: #include "Pad.h" [...] Pad pad = Pad(); pad.init(); pad.setMode(Pad::Analog); while(1) { _delay_ms(50); pad.poll(); if(pad.buttonPressed(Pad::R1)) { [...] } uint8_t value = pad.analogValue(Pad::LeftHorizontal); [...] } Nagłówek: #ifndef __PAD_H__ #define __PAD_H__ #include <avr/io.h> // DATA - input #define DATA_DIR_IN DDRB &= ~(1<<4) #define DATA_IN (PINB&(1<<4)) // CMD - output #define CMD_SET PORTB |= (1<<3) #define CMD_CLR PORTB &= ~(1<<3) #define CMD_DIR_OUT DDRB |= (1<<3) // ATT - output #define ATT_SET PORTB |= (1<<2) #define ATT_CLR PORTB &= ~(1<<2) #define ATT_DIR_OUT DDRB |= (1<<2) // CLK - output #define CLK_SET PORTB |= (1<<5) #define CLK_CLR PORTB &= ~(1<<5) #define CLK_DIR_OUT DDRB |= (1<<5) // Short delay #define _NOP_ asm volatile("nop\n\t""nop\n\t" "nop\n\t" "nop\n\t" ::) // Comment below line to use software SPI #define ATMEGA_SPI class Pad { public: Pad(); enum modes { Analog = 0 }; enum buttons { L1 = 42, L2 = 40, R1 = 43, R2 = 41, Up = 34, Down = 36, Left = 37, Right = 35, Select = 30, Start = 33, JotstickLeft = 32, JotstickRight = 31, Triangle = 44, Circle = 45, Cross = 46, Square = 47 }; enum analogs { LeftHorizontal = 7, LeftVertical = 8, RightHorizontal = 5, RightVertical = 6 }; void init(); void setMode(int); void poll(); bool buttonPressed(int); uint8_t analogValue(int); protected: unsigned char pollData[9]; void setAnalogMode(); unsigned char transferByte(unsigned char); void transfer(unsigned char[], unsigned char); }; #endif //__PAD_H__ Źródło: #include "Pad.h" #include <util/delay.h> Pad::Pad() { } /** * Setups SPI * * @return void */ void Pad::init() { CMD_DIR_OUT; ATT_DIR_OUT; CLK_DIR_OUT; ATT_SET; CLK_SET; CMD_SET; #ifdef ATMEGA_SPI SPCR =(1<<SPE)|(1<<MSTR)|(1<<DORD)|(1<<CPOL)|(1<<CPHA)|(1<<SPR0)|(1<<SPR1); #endif } /** * Retrieves data from pad and store result * * @return void */ void Pad::poll() { this->pollData[0] = 0x01; this->pollData[1] = 0x42; // Command 0x42 - Controller poll this->pollData[2] = 0x00; // If error occur, for example pad will not be connected with receiver, // 0x80 (128) value wont change - change it if needed this->pollData[3] = 0x80; // buttons this->pollData[4] = 0x80; // buttons this->pollData[5] = 0x80; // right horizontal joystick this->pollData[6] = 0x80; // right vertical joystick this->pollData[7] = 0x80; // left horizontal joystick this->pollData[8] = 0x80; // left vertical joystick // Send command and store poll result to pollData this->transfer(this->pollData, 9); } /** * Gets state of button. * * @param int|Pad::buttons button Buttons enum * @return bool */ bool Pad::buttonPressed(int button) { // In which byte we should search bit int byte = button / 10; // Which bit is responsible for pad button int bit = button % 10; // Pressed button results bit equals 0 return ((this->pollData[byte] & (1<<bit)) >> bit) == 0; } /** * Gets analog value of joystick. * * @param int|Pad::analogs analog Analogs enum * @return uint8_t */ uint8_t Pad::analogValue(int analog) { return this->pollData[analog]; } #ifdef ATMEGA_SPI /** * Sends/reads one byte to/from pad. * Uses hardware SPI * * @param uchar byte Byte to transfer * @return uchar */ unsigned char Pad::transferByte(unsigned char byte) { SPDR = byte; while(!(SPSR & (1<<SPIF))); _delay_us(20); return SPDR; } #else /** * Sends/reads one byte to/from pad. * Uses software SPI * * @param uchar byte Byte to transfer * @return uchar */ unsigned char Pad::transferByte(unsigned char byte) { unsigned char i,r=0; for(i=0; i<8; i++, byte>>=1) { CLK_CLR; if(byte& 0x01) CMD_SET; else CMD_CLR; _NOP_; CLK_SET; r>>=1; if(DATA_IN) r|=0x80; } CMD_SET; _delay_us(20); return r; } #endif /** * Sends/reads n bytes to/from pad. * * @param uchar bytes Bytes to transfer * @param uchar size Size of bytes * @return void */ void Pad::transfer(unsigned char bytes[],unsigned char size) { unsigned char i; ATT_CLR; for(i=0; i < size; i++) { bytes[i] = this->transferByte(bytes[i]); } ATT_SET; _delay_us(50); } /** * Sets pad mode * * @param int|Pad::modes mode Modes enum * @return void */ void Pad::setMode(int mode) { switch(mode) { case Pad::Analog: this->setAnalogMode(); break; default: break; } } /** * Sets analog mode * * @return void */ void Pad::setAnalogMode() { unsigned char data[9]; data[0]= 0x01; data[1]= 0x43; // Command 0x43 - Go into configuration mode data[2]= 0x00; data[3]= 0x01; data[4]= 0x00; this->transfer(data, 5); data[0]= 0x01; data[1]= 0x44; // Command 0x44 - Turn on analog mode data[2]= 0x00; data[3]= 0x01; data[4]= 0x03; data[5]= 0x00; data[6]= 0x00; data[7]= 0x00; data[8]= 0x00; this->transfer(data, 9); data[0] = 0x01; data[1] = 0x43; // Command 0x43 - Exit config mode data[2] = 0x00; data[3] = 0x00; data[4] = 0x5A; data[5] = 0x5A; data[6] = 0x5A; data[7] = 0x5A; data[8] = 0x5A; this->transfer(data, 9); }
  9. Czyli byłem w grubym błędzie, myśląc, że złożę wstępnie układ na płytce stykowej, a do tego, że serwo nie pobiera dużo prądu Na stabilizatorze mam założony radiator, a grzał się tak, że jak zasilanie było włączone kilka minut, to dmuchałem/wyłączałem na chwilę. Zasilane było z akumulatora 11,1V. Co do 1A na stabilizatorze, to byłem pewny, że jeśli ten prąd przekroczę, to stabilizator się uszkodzi nieodwracalnie, a nie że tylko spadnie napięcie wyjściowe. Z założenia zasilanie dla serw i dla logiki będzie osobno (z jednego akumulatora). BOD mam wyłączony. Przyznam, że dopiero teraz się dowiedziałem, że coś takiego istnieje. Generalnie podłączyłem serwo bezpośrednio do akumulatora, PWM i działa Sam wpadłbym pewnie na to za miesiąc, jeśli w ogóle. Wielkie dzięki panowie Pozdrawiam.
  10. Fusebity są ok (z 5x sprawdzałem ). Jeśli chodzi o układ, to wszystko jest na płytce stykowej, zasilane z LiPo za pośrednictwem stabilizatora liniowego 5V, 1A. Ten się trochę grzał, ale przyjąłem, że to dlatego, że przepływa przez niego prąd już w okolicach 1A, a nie spalił się, więc serwo nie wyciska > 1A. Może faktycznie to jest wąskim gardłem, dlatego słabsze serwo działa, a mocne nie, ale tu znowu wracamy do serwa 1711 - słabe, a nie działa (przynajmniej poprawnie) Mam też równolegle podłączoną diodę do sygnału PWM i ona zachowuje się normalnie, tj. świeci jaśniej i mniej jaśniej. Także reset procka bym raczej wykluczył. Pozdrawiam.
  11. Witam. Posiadam serwa: 1201MG, 1501MG, 6001HB i 1711MG (wszystkie Power HD). Problem wygląda tak, że serwo 6001HB działa mi poprawnie z poniższym kodem, ale 1201 i 1501 w ogóle się nie ruszają (w dłoni czuję, że coś tam drga, ale mogę tymi serwami kręcić, więc nawet nie są zablokowane). Natomiast 1711 zachowuje się conajmniej dziwnie - nieważne, jakie wartości będzie mieć OCR1A, ono cały czas kręci się poza zakresem, tj. najpierw idzie do samego końca, z chęcią szło by dalej, potem wraca, zatrzymuje się po przebyciu około 45 stopni. I tak w kółko. Kombinuję z tym PWM już od kilku dni i nie mam pojęcia, co może być nie tak, tym bardziej, że jedno serwo działa, a są sterowane niby na tej samej zasadzie. #define F_CPU 8000000UL int main(void) { TCCR1A |= (1<<WGM11) | (1<<COM1A1) | (1<<COM1A0); TCCR1B |= (1<<WGM13) | (1<<WGM12) | (1<<CS11); ICR1 = 19999; DDRB |= (1<<5); while(1) { OCR1A = ICR1 - 1800; _delay_ms(1000); OCR1A = ICR1 - 1000; _delay_ms(1000); } } Kontroler to AtMega128, działa na wew. oscylatorze na 8MHz. Pozdrawiam.
  12. Widziałem to, sprawdzałem datasheet od AtMegi128, w którym są przykłady kodu i nie znalazłem nic podejrzanego - nazwy rejestrów się zgadzają i ogólnie obsługa TWI.
  13. Witam. Od jakiegoś czasu próbuję nawiązać komunikację pomiędzy AtMega8 (slave) i AtMega128 (master) poprzez I2C, ale nie mogę tego uruchomić SDA i SCL mam połączone, do tego na każdej linii jest rezystor 4k7 podłączony do Vcc (5V), obydwa mikrokontrolery są taktowane na 8MHz. Wynalazłem jakieś takie biblioteki do mastera i slave'a. Problem polega na tym, że po wysłaniu bitu start i adresu urządzenia slave, nie dostaję od niego bitu ACK, do tego przerwanie TWI w slave się nie uruchamia, więc slave żadnych danych raczej nie wyśle. Master: I2C_init(); while(1) { I2C(); _delay_ms(500); } Slave: I2C_init(0x10); sei(); while(1) { } Nie wiem, jakie informacje się jeszcze przydadzą. Proszę o pomoc Pozdrawiam.
  14. Tak, myślę, że problem rozwiązany, a napisałem, bo nawet nie myślałem o tym, żeby pomyśleć, że to zasilacz. Byłem pewny, że problem leży gdzie indziej. Źle mnie zrozumiałeś. W pierwszym poście napisałem: Szeregowo, czyli miałem po prostu na myśli to, że napięcie się rozdziela po połowie, no i się później niby poprawiłem: Na schemacie faktycznie widać jak to było wcześniej podłączone, potem tylko dodałem drugi scalak i do niego podłączyłem drugi silnik. No ale juz nieważne, sprawa wyjaśniona, a ja zawsze byłem słaby w przekazywaniu informacji Dziękuję za pomoc.
  15. 1. Faaaktycznie, pomyliłem pojęcia, przepraszam Dokładnie, to chodzi mi o układ scalony L293D, jak napisałem w 1 poście. Ten układ jest dwukanałowy. 2. Zmierzyłem i wychodzi to samo - na jeden silnik idzie ~5,5V. Czyli to by się zgadzało i wychodzi, że jednak mój zasilacz nie daje rady. Sprawdziłem też napięcie, jakie daje zasilacz pod obciążeniem i waha się ono lekko +/- 8V. Spadek na L293D i mamy 5+ woltów na silnik, dobrze mówię? W powietrzu kręciłem gąsienicami i jeden silnik pobiera 250 - 300 mA. Dwa silniki to max 600mA + elektronika nawet nie wiem, czy wyjdzie 200mA. Zasilacz, jak pisałem, jest o wydajności 1A. Przynajmniej tak jest tylko napisane, na to wychodzi. 3. Posłużę się starym schematem: Różnica jest taka, że drugi silnik jest podłączony pod drugi scalak, a do zasilania silników używam 12V, nie 6-9, tyle Samo podłączenie do zasilania widać na zdjęciu gdzieś wyżej.
×
×
  • Utwórz nowe...