Hej!
Niedawno udało mi się za pomocą softu zmienić RCX 1.0 na 2.0 - ot taki swapik.
Chcę zrobić małą MOC ale nie znam za dobrze składni nqc a wszelkie tutoriale, które przewertowałem nie pomagają :(
No, przechodząc do sedna sprawy:
muszę w ciągu 10 sekund odczytać pełną ilość obrotów czujnika. Następnie wykonać na tej wartości operacje matematyczne i zaprezentować na wyświetlaczu ostateczny wynik.
Ktoś jest w stanie mi jakoś pomóc? Będę bardzo wdzięczny.
Pozdrawiam
MP
RCX 1.0@ 2.0 - czujnik obrotów przez nqc
Moderatorzy: Mod Team, Mod Team
RCX 1.0@ 2.0 - czujnik obrotów przez nqc
Ostatnio zmieniony 2014-04-20, 10:12 przez OmenGda, łącznie zmieniany 3 razy.
Nie jest sztuką trafić w muchę przednią szybą...
Sztuką jest, zrobić to boczną!
Sztuką jest, zrobić to boczną!
NQC nie znam zupełnie, nawet na oczy go nie widziałem, ale spróbuję ugryźć temat od strony znanego mi rozwiązania czyli Javy (LeJOS RCX). Aby zliczać obroty musisz mieć pewność, że dostajesz sygnał o każdym kroku, bo jak dasz dużą prędkość rotacyjną czujnika i będziesz go odczytywał zbyt rzadko, to możesz przegapić obrót.
Czujnik rotacyjny w RCX ma bardzo małą rozdzielczość, 16 kroków na cały obrót, czyli 1 krok to 22,5 stopnia. Dodatkowo przy niskiej prędkości obrotowej może błędnie podawać wartości (polecam lekturę na temat tego czujnika u Philo - http://www.philohome.com/sensors/legorot.htm)
W LeJOS użyłbym listenera, który w osobnym wątku "nasłuchuje" na zmiany stanu czujnika. Wartości z czujnika czytałbym w postaci surowej i najpierw nauczył się je interpretować a następnie użył ich do zliczania obrotów.
Przykładowy kod:
Ewentualnie możesz to spróbować oprogramować liniowo według algorytmu:
1. Odczytaj wartość początkową z sensora
2. Ustaw licznik pętli na 1
3. Ustaw licznik obrotów na 0
4. W pętli odczytaj wartość sensora, jeśli się zmieniła to sprawdź czy wystąpił pełny obrót
5. Jeśli wystąpił pełny obrót zwiększ licznik obrotów o jeden
6. Zwiększ licznik pętli o 1
7. Uśpij program na 100ms (nie wiem czy to można zrobić w NQC)
8. Wyjdź z pętli po 100 iteracjach (100 * 100ms = 10s)
9. Zaprezentuj wynik
Czujnik rotacyjny w RCX ma bardzo małą rozdzielczość, 16 kroków na cały obrót, czyli 1 krok to 22,5 stopnia. Dodatkowo przy niskiej prędkości obrotowej może błędnie podawać wartości (polecam lekturę na temat tego czujnika u Philo - http://www.philohome.com/sensors/legorot.htm)
W LeJOS użyłbym listenera, który w osobnym wątku "nasłuchuje" na zmiany stanu czujnika. Wartości z czujnika czytałbym w postaci surowej i najpierw nauczył się je interpretować a następnie użył ich do zliczania obrotów.
Przykładowy kod:
Kod: Zaznacz cały
int countSensorValues = 0;
Sensor.S1.setTypeAndMode (4, 0x00); // Rotation sensor, read RAW values
Sensor.S1.activate();
Sensor.S1.addSensorListener (new SensorListener() {
public void stateChanged (Sensor src, int oldValue, int newValue) {
// Tutaj najpierw bym sprawdził jakie wartości sensor zwraca przy użyciu LCD.showNumber(newValue); i obracania sensora przy użyciu axla. Następnie przerobił to na zliczanie obrotów które Ci jest potrzebne np.
// Dodaj aktualną wartość odczytaną z sensora do zmiennej.
countSensorValues += newValue;
});
1. Odczytaj wartość początkową z sensora
2. Ustaw licznik pętli na 1
3. Ustaw licznik obrotów na 0
4. W pętli odczytaj wartość sensora, jeśli się zmieniła to sprawdź czy wystąpił pełny obrót
5. Jeśli wystąpił pełny obrót zwiększ licznik obrotów o jeden
6. Zwiększ licznik pętli o 1
7. Uśpij program na 100ms (nie wiem czy to można zrobić w NQC)
8. Wyjdź z pętli po 100 iteracjach (100 * 100ms = 10s)
9. Zaprezentuj wynik
Pozdrawiam
Szymon
Szymon
- 3dom
- Adminus Emeritus
- Posty: 5639
- Rejestracja: 2011-04-18, 20:43
- Lokalizacja: Warszawa
- brickshelf: 3dom
-
No popatrz, a jednak dało. Nie wszyscy są na forum codziennie i posty mogą zniknąć w otchłani usuniętych nieprzeczytanych.Jetboy pisze:Jak ktoś będzie potrafił, miał czas i ochotę to pomoże. Pisanie kolejnych "pleasów" nic nie da.
...na mieście już ćwierkają wróble... 🐦🐦🐦
nisiia pisze:SMAŻ SIĘ W PIEKLE ZA TE POSPINANE PLEJTY!!!!!!!!