Skocz do zawartości

Mateusz

Użytkownicy
  • Zawartość

    268
  • Rejestracja

  • Ostatnio

Reputacja

2 Neutralna

O Mateusz

  • Ranga
    6/10
  • Urodziny 09.12.1988

Informacje

  1. Hej mam problem z czujnikiem GP2Y0D810Z0F sharpa na płytce http://robo-hobby.com/product.php?id_product=42. Podłączony jest banalnie +5V GND oraz wyjście sygnałowe bezpośrednio do procka. I teraz pytanie czy wyjście to powinno być podciągnięte do VCC? Wewnętrznie czy rezystorkiem? Czujnik podłączony jest do PD2 w Atmedze8. Dziwne jest to że jak podłączony jest programator czujnik działa normalnie jednak gdy go odłączę czujnik non stop podaje 0 i 1 na wyjściu.
  2. Udało mi się odczytać dane z akcelerometru bez żadnego problemu. Jednak w żaden sposób nie mogę odczytać danych z żyroskopu. Odczytując wartości otrzymuje zawszę tę samą wartość, tak jakby rejestr się nie odświeżał. Po zresetowaniu procesora wartość jest dalej ta sama. Jednak po odłączeniu układu od zasilania i podłączenia na nowo wartość ta się zmienia, ale wysyłana jest cały czas ta sama. Funkcja inicjująca żyroskop: int LSM330DL_gyro_init(void) { char err; err=i2c(); err+=i2c(); err+=i2c(); return (int)err; } Nie zwraca żadnych błędów w komunikacji. Następna wywoływana funkcja odczytuje dane z rejestrów i wysyła po UART: void LSM330DL_read_gyro_registers(void) { char buf[20]; i2c(); i2c_rep(); sprintf(buf,"20: %i\n", raw); USART_send_string(buf); //88888888888888888888888888888888888888 i2c(); i2c_rep(); sprintf(buf,"21: %i\n", raw); USART_send_string(buf); //88888888888888888888888888888888888888 i2c(); i2c_rep(); sprintf(buf,"22: %i\n", raw); USART_send_string(buf); //88888888888888888888888888888888888888 i2c(); i2c_rep(); sprintf(buf,"23: %i\n", raw); USART_send_string(buf); //88888888888888888888888888888888888888 i2c(); i2c_rep(); sprintf(buf,"24: %i\n", raw); USART_send_string(buf); //88888888888888888888888888888888888888 i2c(); i2c_rep(); sprintf(buf,"25: %i\n", raw); USART_send_string(buf); //88888888888888888888888888888888888888 i2c(); i2c_rep(); sprintf(buf,"26: %i\n", raw); USART_send_string(buf); //88888888888888888888888888888888888888 i2c(); i2c_rep(); sprintf(buf,"27: %i\n", raw); USART_send_string(buf); //88888888888888888888888888888888888888 i2c(); i2c_rep(); sprintf(buf,"2E: %i\n", raw); USART_send_string(buf); //88888888888888888888888888888888888888 i2c(); i2c_rep(); sprintf(buf,"2F: %i\n", raw); USART_send_string(buf); //88888888888888888888888888888888888888 i2c(); i2c_rep(); sprintf(buf,"30: %i\n", raw); USART_send_string(buf); //88888888888888888888888888888888888888 i2c(); i2c_rep(); sprintf(buf,"31: %i\n", raw); USART_send_string(buf); } Następnie w pętli głównej odczytuje wartości z jednej osi żyroskopu: int LSM330DL_GYR_read_z(void) { i2c(); i2c_rep(); int16_t raw_z = raw_zl|(raw_zh<<8); return (int)raw_z; } Adres rejestru jest A8 zamiast 28 ponieważ aby odczytywać kilka rejestrów jeden po drugim należy dać 1 n MSB adresu. I w pętli głównej w skrócie: gyro_z = LSM330DL_GYR_read_z(); time++; if(time==3) { int ready = LSM330DL_GYR_ready(); sprintf(buf,"%i;%i;%i;%i\n", acc_x, acc_y, gyro_z, ready); //sprintf(buf,"%i\n", gyro_z); USART_send_string(buf); time=0; } Funkcja sprawdzająca rejestr w którym podawane są flagi sygnalizujące odświeżenie danych: int LSM330DL_GYR_ready(void) { i2c(); i2c_rep(); return (int)raw_zh; } No i oczywiście dane otrzymywane po uart: Nie mam więcej pomysłów co jest nie tak. Wymieniłem kondensator, Cs jest podłączone do 1. Niestety konwertera napięć nie dam rady już domontować . Ale udaje mi się komunikować z 2 urządzeniami bez problemów tak więc żyro też powinno być ok. Tym bardziej, że odczytuje poprawnie dane zapisane w rejestrach. No i piny RES też już nie dam rady podłączyć.
  3. Witam. Zamontowałem w swoim układzie czujnik LSM330DL i w żaden sposób nie mogę się z nim skomunikować. I nie wiem czy słusznie podłączyłem CS do 3V3. W datasheet jest apisane tak: Ale na schematach protokołu CS jest ściągane na 0 przed rozpoczęciem nadawania: Proszę o jakąś pomoc. Adresy jaie sprawdzałem to: 0x30 i 0xD0. I otrzymałem błąd. Komunikacja raczej działa bo z innym układem komunikuje się bez przeszkód. Edit: Wydaje mi się, że jednak CS powinien być ściągany do masy. No i teraz rodzi się pytanie, czy może być po prostu cały czas podłączony do masy czy muszę podłączyć CS do UC i podawać 0 przed transmisją?
  4. Jestem już zaawansowanym klientem HK Więc musisz mi uwierzyć na słowo. Jak przejdziesz dalej z zamówieniem masz dopiero listę możliwych wysyłek. I w śród nich nie ma żadnej z Europy. W tej liście masz na przykład dostepny model: Mini A-6 Intruder EDF Fighter Jet EPO (PNF) w europie. http://www.hobbyking.com/hobbyking/store/__424__191__Planes_ARF_RTF_KIT-EDF_JET.html A tutaj niestety masz international Warehouse, czyli gdzieś tam w okolicach Chin: http://www.hobbyking.com/hobbyking/store/__702__689__DIY_Electronics-Robotics.html
  5. To że jest do wyboru w koszyku nie znaczy, że mają na stanie w innych magazynach. Gdyby mieli to przy cenie na stronie produktu napisane by było DE warehouse. Najtańsza wysyłka tej platformy to 22.85$ (zrobiłem symulację zamówienia )
  6. No tak ale nie mają ich na magazynach Niemieckich. A poza tym jak mają sprzęt na magazynach europejskich to jest większa cena samego sprzętu więc wychodzi na to samo prawie . Ja zamawiałem am już bardzo dużo sprzętu i zastanawiam się czy opłaca się taka platforma w takiej cenie.
  7. Zastanawiam się nad zamówieniem platformy gąsienicowej z chin (+enkodery, silniki) ale nie wiem czy się opłaca za około 150zł. Co o tym sądzicie?
  8. Czyli jeszcze powinno być podłączone CS_A, CS_G, SDO_A i SDO_G do UC? Nie bardzo wiem o co chodzi z tym SDO bo zazwyczaj Read i Write to porostu inne adresy urządzenia które wystawia się na szynę I2C, ze zmienionym zerowym bitem. Czy przy SDO_X po prostu zmienię adres urządzenia dzięki czemu mogę mieć ich więcej w układzie? I mogę po prostu do GND to podłączyć i wtedy adresy: Read: 0x31 Write: 0x30? Dzięki z góry za pomoc, i może pytania głupie ale chciałbym przed wysyłką do Satlandu mieć pewność, że wszystko jest ok
  9. Dzięki bardzo za uwagi. Wezmę je pod uwagę i przeprojektuję płytkę. A czy wie może ktoś po co sygnał SDO w żyro i akcelerometrze?
  10. Witam. Czy mógłby ktoś rzucić okiem na schemat. Chciałbym to wytrawić w satlandzie dlatego wolałbym uniknąć głupich błędów . Głównie chodzi mi o podłączenie czujnika LSM330DL.
  11. Witam. Czy znacie jakieś dobre jednoosiowe żyroskopy cyfrowe (I2C)? Żyroskop ma wychwytywać raczej wolne obroty do 300 stopni na sek. Ja szukam i szukam i nic nie mogę znaleźć
  12. Witam. Czy ma ktoś pomysł jak mógłbym zrobić kompensację przechyleń w czujniku HMC5883L to co znalazłem na necie nie za bardzo działa. Układ pochylany będzie tylko w jednej osi, czyli wokół osi y. Znany jest kąt przechylenia i wartości x,y,z z kompasu. Nie za bardzo rozumiem pomiary z x, wg. mnie powinno być tak, że wartość x jest taka sama dla przechylenia +30 stopni i -30 stopni. Niestety tak nie jest. W załączniku jest plik z pomiarami w excelu, pomiary były robione z płytką skierowaną cały czas w tą samą stronę tak więc kąt powinien być taki sam cały czas. Ja przeliczałem to w ten sposób: int getHeadingHMC_TiltComp(float pitch, float roll) { uint8_t raw_xh = 0; uint8_t raw_xl = 0; uint8_t raw_yh = 0; uint8_t raw_yl = 0; uint8_t raw_zh = 0; uint8_t raw_zl = 0; long x,y,z; i2c(); i2c_rep(); x = raw_xl|(raw_xh<<8); y = raw_yl|(raw_yh<<8); z = raw_zl|(raw_zh<<8); //float err = 0.5 * pitch; double Xh = (double)x * cos(M_PI*pitch/180) + (double)z * sin(M_PI*pitch/180); double Yh = (double)y; int headingDegrees = (double)(atan2(Yh,Xh)* 57 + 180); char buf[40]; sprintf(buf,"%4.i : %4.i : %4.i : %4.i\n",(int)x, (int)y, (int)z, (int)pitch); USART_send_string(buf); return headingDegrees; } Ale nie za bardzo się to sprawdziło. Pomyślałem żeby zrobić kalibrację czujnika ale nie bardzo wiem jak ona działa. Mam taki kod: void HMC5883L_ScaleFactorCalib(void) { int16_t raw_x = 0; int16_t raw_y = 0; int16_t raw_z = 0; int err=i2c(); i2c(); i2c(); i2c(); i2c_rep(); char buf[40]; sprintf(buf,"Calib: %4.i : %4.i : %4.i\n",raw_x, raw_z, raw_y); USART_send_string(buf); return 0; } Dostaję jakieś tam wyniki ale nie wiem co z nimi zrobić . pomiary.xls
  13. Teraz czego bym nie, pobrał dostaje w odpowiedzi 61 czyli 0x3D (adres HMC5883L_READ) niezależnie od rejestru. Pobierałem dane takimi funkcjami: int readMirek(void) { int b = 0; i2c(); i2c(); i2c(); _delay_ms(50); i2c(); i2c_rep(); i2c_rep(); i2c_rep(); //char buf[80]; //sprintf(buf,"%d :%d :%d\n", raw_x, raw_y, raw_z); //USART_send_string(buf); int headingDegrees = atan2(raw_y,raw_x)* 57 + 180; return raw_x; }
  14. Mój czujnik pracuje w trybie Continuous-Measurement Mode, i dlatego nie muszę chyba czekać na wyniki bo te aktualizują się same po dokonaniu pomiaru przez czujnik, najwyżej odczytałbym poprzednią wartość. No i zastanawia mnie czemu, źle odczytuje mi wartości z rejestru 0x00. Ten czujnik mnie dobije
  15. F_CPU mam ustawione w properties projektu: A program ten co dałem to nie jest ten do testowania . Ten testowy wyglądał tak, że zakomentowałem wszystko w pętli głównej i dodałem: for(uint8_t i=0;i<=254;i++) { char err=i2c(); i2c(); i2c(); } Następnie w while pobieram dane: kompas_poss = getHeadingHMC(); int getHeadingHMC(void) { int16_t raw_x = 0; int16_t raw_y = 0; int16_t raw_z = 0; i2c(); i2c_rep(); int headingDegrees = atan2(raw_y,raw_x)* 57 + 180; return headingDegrees; } I mam kosmosy. Macie jakieś pomysły? Czy mogą być aż takie zawahania przez złe umieszczenie czujnika względem reszty elementów? [ Dodano: 17-09-2012, 20:05 ] A taka funkcja: int read_a(void) { int16_t a = 0; i2c(); return a; } Zwraca mi 0 a w funkcji HMC5883L_init ustawiam adres 00 na 70.
×
×
  • Utwórz nowe...