Skocz do zawartości

kampo

Użytkownicy
  • Zawartość

    51
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O kampo

  • Ranga
    4/10

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Świdnica
  1. 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); }
  2. kampo

    [C] Problem ze sterowaniem serw

    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.
  3. kampo

    [C] Problem ze sterowaniem serw

    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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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.
  9. Dziękuję za odpowiedź. Jak zwykle zapomniałem wspomnieć o kilku szczegółach 1) Oczywiście, jeden silnik na jedną gąsienicę, mostek jest dwukanałowy, więc żeby kręcić chociażby obydwoma silnikami w różne strony, nie ma problemu. 2) Zasilacz ma wydajność 1A. Silnik maksymalnie pożera coś koło 200mA, więc z tym raczej nie ma problemu, ale dla pewności mogę zmierzyć. 3) Z wersją szeregową miałem na myśli, że oba silniki są podłączone do jednego mostka, który w przypadku, gdy obydwa są uruchomione, rozdziela na nie napięcie po równo. Tutaj bardzo szybko rysowany schemat: Mam nadzieję, że jest dosyć czytelny. To jest ta moja wersja "równolegle" połączonych silników. Efekt i tak jest taki sam, jak w punkcie 3. 4) Silniki mają nominalne napięcie 6V, ale ja je męczyłem na 12V i nie zamęczyłem. Jeśli uda się zrobić tak, żeby takie napięcie, jakie podaję z zasilacza szło na silnik, nieważne czy drugi się kręci, czy nie, to myślę, że wtedy 9V powinno dla nich wystarczyć. Dziękuję za informacje na temat mojego drugiego pytania. Zapoznam się z tym jutro, jak znajdę trochę czasu. Pozdrawiam.
  10. Witam. Może to jest banalne, ale ja nie widzę rozwiązania mojego problemu. Sprawa wygląda tak: buduję robota z gąsienicami, mam 2 silniki HL 149. Ich moment nie jest super duży, nominalne napięcie to 6V. Do przodu i do tyłu ładnie się zbierają, ale gorzej na boki w miejscu (tu własciwie będzie też 2 pytanie, ale w swoim czasie). Mam zasilacz maksymalnie na 12V. Teoretycznie mógłbym użyć innego, z większym napięciem maksymalnym, np. uniwersalny od laptopów (albo mocniejsze silniki, nawet znalazłem odpowiednie, ale i tak mnie to zaintrygowało), ale co, jeśli będę chciał skorzystać z Li-Pola? Największe jakie widziałem to z napięciem 11,1V (no...14,8V, ale jednak troszkę nie ta cena...). Wtedy będzie jescze gorzej. Używam standardowo mostka L293D. Napięcie z zasilacza idzie na silniki, logika jest zasilana za pośrednictwem stabilizatora 5V. Wiem, że oba silniki kręcące się na tym mostku ze 100% PWM "działają" szeregowo (nie mam pojęcia, jak to fachowo powiedzieć), więc w moim przypadku na silnik idzie nawet niecałe 6V (spadek napięcia na mostku, jeśli dobrze mówię). Chciałem to zmenić, żeby na każdy włączony silnik szło ~12V, w tym celu (może to zabrzmi głupio) silniki podłączyłem do dwóch mostków L293D, każdy osobno (niby równolegle). No i się zdziwiłem, jak zauważyłem, że to nic nie dało... Jeśli schemat będzie potrzebny, to na szybko jakiś zmajstruję, ale to raczej prościzna dla Was. No i tutaj moje pytanie: 1) Można coś zrobić (niskim, a najlepiej zerowym kosztem), żeby silniki "działały" równolegle? Kolejna sprawa: robotem będe także sterował przez Bluetooth. Mam już jakąś aplikację na Androida, na mikrokontrolerze też jest program i niby działa, ale nie do końca. Gdy trzymam Zbyszka (robota tak nazwałem) w powietrzu i steruję, to wszystko pięknie i ładnie śmiga. Jak położę, pięknie śmiga tylko przód i tył. Gdy skręcam na boki, silniki nie mają odpowiedniej motywacji i Zbysiu prawie stoi w miejscu. Wiąże się z tym taki problem, że żeby go zatrzymać, musze zrestartować uC. Aplikacja na Andku się dziwnie zawiesza i nie mam pojęcia, co się dzieje. Wpadłem na pomysł, że być może próbujący się kręcić silnik wytwarza jakieś większe pole magnetyczne i to zakłóca sygnał modułu Bluetooth, który wysyła pełno śmieci i apka nie daje rady. Znalazłem starą kartę WiFi, która ma ekranowanie, więc położyłem ją między modułem, a silnikiem i wydawało się, że jest jakby nieco lepiej. Tak więc kolejne pytanie: 2) Jak to jest faktycznie z tymi kręcącymi się silnikami (właściwie, to próbującymi się kręcić) zablokowanymi, a niezablokowanymi? Pozdrawiam.
  11. kampo

    Ujemne napięcie przy ADC

    Masz rację. Pomiar nie musi być super dokładny. O pojęciu częstotliwości filtra słyszę pierwszy raz. Próbowałem coś poczytać o tym w internecie, ale wszędzie jest to napisane tak, że nic z tego nie rozumiem. Mógłbyś mi to jakoś rozjaśnić? Pozdrawiam.
  12. kampo

    Ujemne napięcie przy ADC

    Pomysły 2 i 3 wydają mi się chyba najlepsze. Dokładność nie musi być jakaś super, więc myślę, że wybrałbym 3, ponieważ jak pisałeś, przetwornik może nie nadążyć z mierzeniem, tym bardziej, że w przypadku 3 opcji pomiar mógłbym robić kiedy bym tylko chciał.
  13. kampo

    Ujemne napięcie przy ADC

    Nieee, nie dąsam się Sprawa też jest taka, że jestem początkujący, nawet bardzo i nie do końca potrafię może przekazać o co mi chodzi dokładnie, ponieważ ja i Wy myślimy inaczej: A więc tak: 1. Generuje PWM 2. Mam dostęp. 3. 6-12V? Przyjmijmy, że 9V. 4. Powiedzmy, że wynik (w postaci woltów) chcę wyświetlić na wyświetlaczu, wysłać przez jakiś interfejs komunikacyjny. Może nawet sterować tym napięciem przyciskami/potencjometrem. Miernikiem nie chce mierzyć, po prostu chcę sobie gdzieś to ładnie wyświetlić. 5. Jeśli dobrze rozumiem, to nie. Widzę to np. tak: Źródło 9V, do zasilania silnika i stabilizator, powiedzmy 5V do logiki. Więc jak na moje, to wszsytko ma wspólną masę, ale jak jestem w błędzie, to proszę mnie z niego wyprowadzić Pozdriawiam.
  14. kampo

    Ujemne napięcie przy ADC

    W pierwszym poście napisałem: Takie urządzenie jako pierwsze przyszło mi do głowy (zresztą innego podobnego nie znam), więc na takim przykładzie wytłumaczyłem, o co mi chodzi. W kolejnym poście: Myślałem, że tym postem wyjaśniłem dokładnie o co mi chodzi. Rozumiem z tego, że jak podłączymy masę do pinu ADC, to mikrokontroler będzie miał to w nosie. Pan marek1707 już mniej-więcej nakreślił mi sprawę, pan Sabre także, więc na przyszłość będę wiedział czego szukać. Nie rozumiem, dlaczego dyskusja zeszła na temat PWM, przecież nie pytałem o to, bo wiem co to jest i wiem, że sam podejmuje decyzje jakie napięcie dać na silnik. I to też niedokładnie, bo przecież po drodze jest jeszcze spadek w jakiejś tam granicy (mały czy duży - nieważne) np. właśnie na mostku. No ale co w przypadku, gdy nie mam na nie wpływu i po prostu chce sobie monitorować napięcie, które sobie "idzie" do jakiegoś urządzenia, w którym można zmieniać polaryzację? No nieważne, bo zaraz się tu zrobi z tej dyskusji jakaś kłótnia, czy coś. Najwyżej sobie sam jakoś poradzę. Temat do zamknięcia. Pozdrawiam.
  15. kampo

    Ujemne napięcie przy ADC

    Może faktycznie pomyliłem definicje, chodziło mi dokładnie o podpięcie się do masy. Na razie nie zamierzam tego nigdzie wykorzystać, tak po prostu sobie spekuluję. Przybliżoną wartość można wyliczyć w programie - wiadomo, ale ja chciałbym się dowiedzieć, czy można zmierzyć napięcie (już nawet nie mówię tylko o silniku), podłączając GND jakiegoś tam sobie urządzenia do ADC tak, żeby pomiar działał też przy "plusie". Może zobrazuję swoją myśl: Połączenie z ADC jest między urządzeniem, a innym urządzeniem (opcjonalnie) sterującym nim. Dokładnie chodzi mi o to, czy w ogóle można w ten sposób mierzyć napięcie przez ADC, a jeśli tak, to co należy zrobić, co podłączyć miedzy pin a GND urządzenia, a może jeszcze coś innego? Pozdrawiam.
×