Skocz do zawartości

paczkaexpres

Użytkownicy
  • Zawartość

    50
  • Rejestracja

  • Ostatnio

Wszystko napisane przez paczkaexpres

  1. Marek1707 jesteś wielki! Rzeczywiście problemem w moim odczycie było nieustawienie tego jednego bitu. Nigdy do tej pory nie spotkałem się z taką metodą ustawiania automatycznego odczytywania następnego rejestru, dlatego nie spodziewałem się, że to tutaj może leżeć problem. Do tego popełniłem błąd nowicjusza i nie zagłębiłem się w dokumentacji. W każdym razie wielkie dzięki za pomoc.
  2. Cześć, Od paru dni zmagam się z uruchomieniem komponentów moduły GY-80. O ile odczyt z akcelerometru okazał się prostym zadaniem to mam ciągły problem z poprawnym odczytem danych z żyroskopu. Problem objawia się przy próbie odczytu z rejestróe od 0x28 (który przechowuje dane LSB z osi x) do rejestru 0x2D (MSB rejestru danych z osi Z). Wygląda on w ten sposób, że otrzymuję 6 takich samych wartości. Na przykład przy pierwszym odczycie może to być 0x22, a już przy następnym 0xF4. Pracuję na płytce Discovery Disco wyposażonego w procesor STM32F429. Moduł GY-80 jest podpięty do wejść A8 i C9. Inicjalizacja I2C: void init_I2C() { GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C3, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_I2C3); // SCL GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_I2C3); // SDA // configure I2C3 I2C_InitStructure.I2C_ClockSpeed = 100000; // 100kHz I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; // I2C mode I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; // 50% duty cycle --> standard I2C_InitStructure.I2C_OwnAddress1 = 0x00; // own address, not relevant in master mode I2C_InitStructure.I2C_Ack = I2C_Ack_Disable; // disable acknowledge when reading (can be changed later on) I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; // set address length to 7 bit addresses I2C_Init(I2C3, &I2C_InitStructure); // init I2C3 // enable I2C3 I2C_Cmd(I2C3, ENABLE); } Inicjalizajca żyroskopu: void init_Gyroscope() { I2C_write(GYROSCOPE_ADDRESS,GYROSCOPE_CTRL_REG1,0x0F); //Ustawiam Power normal mode, uruchamiam możliwosc odczytu danych z osi x,y,z I2C_write(GYROSCOPE_ADDRESS,GYROSCOPE_CTRL_REG2,0x00); //Ustawianie High Pass filter mode i High Pass filter cut off I2C_write(GYROSCOPE_ADDRESS,GYROSCOPE_CTRL_REG3,0x08); // odblokowanie sygnału gotowosci I2C_write(GYROSCOPE_ADDRESS,GYROSCOPE_CTRL_REG4,0x80); // ustawienie skali na 250 deg / sec } Odczyt wartości z żyroskopu: int16_t read_Angle_Velocity() { int16_t data; int8_t i = 0; int16_t LSB = 0; int16_t MSB = 0; data = I2C_read(GYROSCOPE_ADDRESS, ANGULAR_VELOSITY_XAXIS_LSB, 6); for(i = 0;i<3;i++) { LSB = I2C_Buff[2*i + 0]; MSB = I2C_Buff[2*i + 1]; data = LSB + (MSB<<8); I2C_Gyro[i] = gyroscope_Convert_ToAng(data); } return *I2C_Gyro; } Odczyt danych z I2C uint8_t I2C_read(uint8_t address, uint8_t data,uint8_t Lenght) { uint8_t *a = &I2C_Buff; I2C_start(I2C3, address<<1, I2C_Direction_Transmitter); I2C_SendData(I2C3, data); while(!I2C_CheckEvent(I2C3, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_start(I2C3, address<<1, I2C_Direction_Receiver); for(Lenght;Lenght > 0;Lenght--) { if(Lenght > 1) { I2C_AcknowledgeConfig(I2C3, ENABLE); } else { I2C_AcknowledgeConfig(I2C3, DISABLE); I2C_GenerateSTOP(I2C3, ENABLE); } while( !I2C_CheckEvent(I2C3, I2C_EVENT_MASTER_BYTE_RECEIVED) ); // wait until one byte has been received *a = I2C_ReceiveData(I2C3); // read data from I2C data register and return data byte a++; } return *I2C_Buff; } Jeszcze na koniec przebiegi z analizatora stanów logicznych: Będę wdzięczny za sugestie co może być nie tak.
  3. Do listy dodałbym jeszcze pistolet hotglue, który okazuje się nieraz niezbędny przy szybkich naprawach.
  4. Były nagrody duży plus za jedzenie i wodę rozdawaną na zawodach sprawnie wykonanie konkurencji nanosumo, microsumo i sumo elastyczność w związku z problemami z modułami startowymi ring do minisumo w strefie serwisowej wyniki w strefie pilnowanie sali, w której przebywali zawodnicy Nieznajomość regulaminów do sumo (na przykład ważenie koła które odpadło komuś po spadnięciu z ringu) nieprzepisowo wysokie ringi brak kontaktu przy rejestracji (do dnia zawodów nie byłem pewien czy zarejestrowałem poprawnie roboty) obowiązkowe intro na stronie 5 sekund opóźnienia w dużym sumo !!! nieuczciwy podział nagród. Za 1 miejsce LFE był tablet warty 800 zł. Za pierwsze miejsce w nano była płytka STM za 50zł. Za II miejsce w sumo była klawiatura bezprzewodowa. Potężny minus za zasilanie w sali serwisowej. Wszystko szło z jednego przedłużacza. Jeżeli coś by się spaliło / zwarło wszyscy byliby ugotowani.
  5. Silnik jest bardzo ciekawą opcją. Tak jak zauważyłeś jest to bardzo wydajny silnik. Jest jednakże jedna przyczyna dla której nie jest on wykorzystywany. Jest on bardzo duży , w tej wersji co pokazałeś ma ponad 60 mm długości co skutecznie uniemożliwia zastosowanie czterech takich silników w robocie, ba nawet wsadzenie dwóch wiąże się z pewnymi trudnościami mechanicznymi. Nie mogą bym one ustawione wzdłuż jednej linii. Przez co dwa takie silniki zajmują około 50 mm długości robota i pozostaje mało miejsca na baterię , czujniki i klin.
  6. W moduły startowe muszą być wyposażone roboty w konkurencjach : Sumo, MiniSumo ,MiniSumo ^2 ,MicroSumo. Robot oczywiście mierzony i warzony jest po zamontowaniu modułów i musi się on zmieścić w wymiarach odpowiednich dla danej konkurencji. Te moduły są zgodne z modułami które były stosowane w Wiedniu i we Wrocławiu (są nawet identyczne). Informacje o samym module można znaleźć tutaj http://www.startmodule.com/faq/.
  7. Zastanów się nad rozmieszczeniem elementów i prowadzeniem ścieżek, bo z tego co widzę to udało by się zredukować liczbę przelotek może nawet do zera.
  8. Cześć, Ostatnio mam spory problem właśnie z tym mostkiem. Na początku po przylutowaniu działał poprawnie jednakże po 2/3 włączeniu stracił moc (prawdopodobnie się spalił, nie grzał się). Nie mam zielonego pojęcia co może być powodem takiej sytuacji. Proszę więc was o pomoc. Podam trochę informacji które może się przydadzą przy problemie. Typ robota - minisumo. Zasilanie - li-pol 7,4V Silnik - Pololu 30:1 sterownik tb6612 zmostkowany (według procedury nazwy z takimi samymi numerkami łączymy) Jeszcze wrzucę część kodu obsługujące to cudo: #define PWM1_SET PORTB |= (1<<6) #define PWM1_CLR PORTB &= ~(1<<6) #define PWM1_OUT DDRB |= (1<<6) #define PWM2_SET PORTB |= (1<<5) #define PWM2_CLR PORTB &= ~(1<<5) #define PWM2_OUT DDRB |= (1<<5) #define BACKWARD_LEFT_SET PORTB |= (1<<3) #define BACKWARD_LEFT_CLR PORTB &= ~(1<<3) #define BACKWARD_LEFT_OUT DDRB |= (1<<3) #define FORWARD_RIGHT_SET PORTB |= (1<<7) #define FORWARD_RIGHT_CLR PORTB &= ~(1<<7) #define FORWARD_RIGHT_OUT DDRB |= (1<<7) #define FORWARD_LEFT_SET PORTB |= (1<<2) #define FORWARD_LEFT_CLR PORTB &= ~(1<<2) #define FORWARD_LEFT_OUT DDRB |= (1<<2) #define BACKWARD_RIGHT_SET PORTB |= (1<<4) #define BACKWARD_RIGHT_CLR PORTB &= ~(1<<4) #define BACKWARD_RIGHT_OUT DDRB |= (1<<4) void Engine(int Left,int Right) { //Left = (Left * 255)/100; //Right = (Right * 255)/100; if(Left>0) { BACKWARD_LEFT_CLR; _delay_us(3); FORWARD_LEFT_SET; OCR1A = Left; } else if(Left<0) { FORWARD_LEFT_CLR; _delay_us(3); BACKWARD_LEFT_SET; OCR1A = -Left; } if(Right>0) { BACKWARD_RIGHT_CLR; _delay_us(3); FORWARD_RIGHT_SET; OCR1B = Right; } else if(Right<0) { FORWARD_RIGHT_CLR; _delay_us(3); BACKWARD_RIGHT_SET; OCR1B = -Right; } } TCCR0 = (1 << CS02); // preskaler 256 TIMSK = (1 << TOIE0) | (1<<TOIE3); //Konfiguracja PWM TCCR1A |= (1<<WGM12) | (1<<WGM10) | (1<<COM1A1) | (1<<COM1B1); TCCR1A &= ~(1<<COM1C1) & ~(1<<COM1C0); TCCR1B = (1<<CS11); Co ciekawe bez aktywnego PWM wygląda że działa dobrze więc to może być problem programistyczny. Jeszcze takie pytanie zdarzyło wam się może kiedyś ,że wasza płytka (element na niej) lekko szumiała. Mam dosyć czuły słuch (słyszę pracę transformatora w lampce biurkowej) więc nie wiem czy mam się z tego powodu martwić. Elementy na płytce to atmega128 ,akcelerometr, 74hc595 , bluetooth.
  9. Przy kwarcu powinny być kondensatory 22pF. W dodatku strasznie zakręciłeś z wyprowadzeniami czujnika SHARP. Powinno być: 1. zasilanie , 2. opornik 1 Ohm , 3. wyjście sygnału , 4. uziemienie , 5. kondensator 1uF do masy. Dodatkowo przy SHARP możesz podłączyć 100nF.
  10. Fajnie ,że sam to zauważyłeś.Dodatkowo zwróciłbym uwagę opornika przy czujniku SHARP, w nocie proponowany jest opornik 1 Ohm. Dla wartości 470 Ohm możesz znaczącą zmniejszyć odległość pomiaru. Dodatkowo podciągnąłbym do zasilania przyciski (np. przez rezystor 10k). Radził bym ci użyć jednak atmegi w wersji SMD. Nie jest tak strasznie trudna w lutowaniu jak się wydaje ,a zaoszczędzisz sobie sporo wiercenia w płytce (czego osobiście nienawidziłem). Dodatkowo będziesz miał 2 porty więcej w rejestrze ADC.
  11. 1. Dodatkowo przy każdym wejściu zasilającym L293D dałbym kondensator filtrujący. 2. Na wyjścia L293D powinieneś wsadzić diody Shotkiego odpowiedniej mocy.
  12. Tia , i dziecko zamiast uczyć się raczkować / chodzić od najmłodszych lat będzie jeździć na wózku inwalidzkim.
  13. Mam wyłączoną kompatybilność z atmegą 103. Zastanawiam się czy źródłem problemu może być źle przylutowany akcelerometr lub system przerwań który używam w programie. Udało mi się rozwiązać pierwszy problem. Spowodowany był on nie wysłaniem komendy stop po skończonej transmisji jako ,że funkcja była w pętli to po pierwszym jej wykonaniu przestawała działać poprawnie. Nadal mam jednak problem z wysyłaniem adresu.
  14. Nie jest to raczej wina oporników. Przy portach SDA/SCL mam podłączone oporniki 4k7 do 5V.
  15. Witam, Ostatnio natknąłem się na problem którego na razie nie jestem w stanie rozwiązać samodzielnie. Otóż jestem w trakcie budowy robota minisumo. Mam zamiar wykorzystać w nim akcelerometr i żeby móc go obsługiwać potrzebna mi będzie obsługa magistrali TWI/I2C. Zacząłem więc pisać do niej sterownik jednakże bez większych sukcesów. Funkcja: (umieściłem w niej inicjalizację żeby było wszystko lepiej widoczne) int accelerometer_x() { SCL_OUT; //SCL_OUT DDRD |= (1<<0) SDA_OUT; //SDA_OUT DDRD |= (1<<1) TWBR=0x64; //skopiowałem z jakiego kodu w internecie TWSR=(0<<TWPS1)|(0<<TWPS0); // Prescaler 64 int Position = 0; TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // Wysyłam komende start while (!(TWCR & (1<<TWINT))); if((TWSR & 0xF8) != 0x08) // ??? Nie mam pojęcia czemu tu jest 0x08 { lcd_text(" NIE BANGLA ",0,0); lcd_text("Błąd przy wys-",0,1); lcd_text("łaniu komendy ",0,2); lcd_text("START ",0,3); _delay_ms(400); } TWDR = (0b0011100<<1); //adres akcelerometru + bit wysyłki danych TWCR = (1<<TWINT) | (1<<TWEN); while (!(TWCR & (1<<TWINT))); if((TWSR & 0xF8) != 0x40) // ??? Nie mam pojęcia czemu tu jest 0x40 { lcd_text(" NIE BANGLA ",0,0); lcd_text("Błąd przy wys-",0,1); lcd_text("łaniu adresu! ",0,2); _delay_ms(400); } return Position; } W kodzie przy znakach zapytania znajdują się miejsca które zapożyczyłem z innych programów i nie mogłem znaleźć co oznaczają. Problem polega na tym ,że po sprawdzeniu któregokolwiek warunku z if'a wykonuje się funkcja wewnątrz tego warunku. Wygląda na to ,że program nie wysyła poprawnie ani komendy START ani adresu urządzenia. Czy jest możliwość ,że problem leży po stronie źle przylutowanego przyspieszeniomierza ? Za każdą pomoc będę bardzo wdzięczny.
  16. Zrobiłeś w sumie głupi błąd zaraz go ci zaprezentuje: switch (a) { case 1: PORTD |= (0<<PD0); <--- break; case 2: PORTD |= (1<<PD0); <--- break; } } W case 2: ustawiasz PORTD_2 jako wyjście czyli w tym momencie stan portu wygląda tak: PORTD -> 0b00000001. Dioda się świeci. Następnie przechodzisz do case 1: i wykonujesz operację logiczą OR. Tylko ,że 0b00000001 OR 0 da ci znowu 0b00000001 (jeżeli nie wiesz czemu to powinieneś poczytać o operacjach logicznych). W każdym razie jeżeli chcesz ,żeby twój program działał poprawnie instrukcja z case 1: powinna wyglądać w ten sposób: PORTD &= ~(1< Do switha powinieneś dodać Defoulta ,bez tego program może zaczynać działać niepoprawnie np. gry naciśniesz 2 razy ten sam przycisk (możesz także zrobić warunek na to aby wartość a nie przekraczała zakresu <1,2>).
  17. Witam ponownie. Przez ostatni okres czasu raczej mało pracowałem nad moją konstrukcją. Jednak ostatnio znowu do niej powróciłem. Przez ten czas udało mi się zrobić parę istotnych rzeczy. Są to między innymi : - elektronika robota, - program ( obsługa SHARPów, sterownik silnika , sterownik wyświetlacza , sterownik rejestru przerywanego i parę pomniejszych modułów). Narazie nie dodam zdjęć ani filmu. Muszę poczekać na nowy wyświetlacz (stary niestety się popsuł). Jak go już dostanę to postaram się coś wrzucić. Obiecane zdjęcia ,niestety bez filmiku.
  18. Diody powinny być podłączone do tego samego napięcia co VS.
  19. Schemat dobrze się zapowiada, wprowadziłbym jednak parę poprawek: 1. Nie wiem czy jest to zamierzone ale na schemacie nie uwzględniłeś wyjścia programatora. 2. Do wejść ENABLE_A/B masz podłączony tylko jeden kanał PWM. Aby w pełni wykorzystać możliwości robota proponuję podłączyć wyjścia ENABLE z pinami OC1A/B procesora. 3. Nie masz podłączonego wyprowadzenia +5v do stabilizatora. 4. Do stabilizacji napięcia przy zasilaniu procesora wsadziłbym pare sztuk kondensatorów 100n. Tak naprawdę jedna sztuka powinna wystarczyć ale przezorny zawsze ubezpieczony ,a cena jednej sztuki takiego kondensatora jest raczej śmieszna. 5. Zostało ci parę wolnych portów, podłączyłbym bym do nich jakieś ledy (przez rejest lub bezpośrednio) znacznie to ułatwiło by pracę przy sprawdzaniu czy KTIR / SHARP działa poprawnie. 6. Radziłbym podłączyć wyprowadzenie VS L289D do zasilania (12V). Oczywiście nie wiem jakie silniki chcesz wykorzystać ale zakładając że będą to Pololu to stabilizator może nie wytrzymać takiego poboru prądu. Dodatkowo znacznie w ten sposób osłabiasz silniki. 7. No i oczywiście nie możesz zapomnieć o kondensatorach przy silnikach. Powodzenia przy konstrukcji !
  20. paczkaexpres

    Miniszlifierka

    Osobiście polecam Skila. Mam taki sam lub model niższy i na razie (to znaczy od 3 lat ) działa bezawaryjnie ,jedyny mankament jaki dostrzegam przy obecnej pracy (szczególnie na wysokich obrotach) to to że szlifierka wpada w wibrację (prawdopodobnie łożyska się trochę zużyły). Ciąłem nią chyba wszystko począwszy od stali nierdzewnej ( tutaj radzi sobie raczej słabo i trzeba uważać na tarczki które przy jednym błędnym ruchu rozpadną się na kawałki) przez blachę od obudowy kompa do drewna i laminatu. Jeżeli będziesz nią ciął często laminat ,a prawdopodobnie będziesz polecam zakup tarczki diamentowej ,nawet jakiejś taniej podróbki. Tnie ona laminat jak masło i nie ma obawy że się rozsypie. Jeżeli chcesz żeby twój zestaw do mini szlifierki był kompletny powinieneś zakupić regulowany trzpień (nie pamiętam nazwy) ,bardzo się przydaje jeżeli chcesz np. zamontować wiertło 0.6mm albo coś w tym rodzaju.
  21. Gdyby zawody były za tydzień to się jeszcze dało by coś zrobić, problem w tym że zawody w Bydgoszczy są 19 kwietnia (czyli jutro) .
  22. W eclipse ustawiłem Target Hardwere -> MCU Clock Freqency na 1 MHz.
  23. Chciałem sprawdzić czy będąc w funkcji Shift_register program się zacina czy nie. Skoro jest w stanie po wywołaniu main() powrucić do funkcji głównej czyli się nie zacina.
  24. Może komuś to pomoże : Gdy usunę static przy funkcji inicjalizacja to program też przestaje działać poprawnie. Co ciekawe jeżeli w tej funkcji wywołam funkcję main() to program wraca do funckji main (ale zaczyna ją wykonywać od początku) Debug.rar
  25. Foadrian oczywiście to jest zbędne. Jest to tylko pozostałość po źle skopiowanym kodzie i w programie tego nie ma.
×
×
  • Utwórz nowe...