Wizualizacja danych sensorycznych. Control Center.

Podobne dokumenty
Struktura QSM (Queued Serial Module)

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Pobieranie argumentów wiersza polecenia

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

1. Tworzenie nowego projektu.

Uniwersalny asynchroniczny. UART Universal Asynchronous Receier- Transmiter

Sieciowa komunikacja procesów - XDR i RPC

PMiK Programowanie Mikrokontrolera 8051

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Obługa czujników do robota śledzącego linie. Michał Wendland czerwca 2011

Iteracyjny serwer TCP i aplikacja UDP

Instytut Teleinformatyki

RS868v3 module configuration

Programowanie Proceduralne

Testy jednostkowe - zastosowanie oprogramowania JUNIT 4.0 Zofia Kruczkiewicz

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

DR INŻ. ROBERT WÓJCIK DR INŻ. JERZY DOMŻAŁ

Wykład 1

Warstwy oprogramowania wejścia/wyjścia

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

Laboratorium Komputerowe Systemy Pomiarowe

Programowanie Mikrokontrolerów

Struktury. Przykład W8_1

Urządzenia peryferyjne RS-232. Wykład 2

Pamięci i urządzenia peryferyjne Wprowadzenie do przedmiotu

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

NARZĘDZIE KONFIGURACYJNE VNX SETUP TOOL MODUŁÓW RODZINY VNX ADVANCED

Sterowanie wyświetlaczem graficznym z kontrolerem firmy Toshiba T6963C kod programu.

Laboratorium Podstaw Robotyki I Ćwiczenie Khepera dwukołowy robot mobilny

How to share data from SQL database table to the OPC Server? Jak udostępnić dane z tabeli bazy SQL do serwera OPC? samouczek ANT.

Modelowanie numeryczne w fizyce atmosfery Ćwiczenia 3

Zdalne wywołania procedur. Jarosław Kuchta Programowanie Współbieżne

ĆWICZENIE 5. TEMAT: OBSŁUGA PORTU SZEREGOWEGO W PAKIECIE KEILuVISON WYSYŁANIE PORTEM SZEREGOWYM

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Zakopane, plan miasta: Skala ok. 1: = City map (Polish Edition)

TECHNIKA MIKROPROCESOROWA II

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780

Wstęp do programowania 1

Instrukcja do ćwiczeń

Instytut Teleinformatyki

Rodzina protokołów TCP/IP. Aplikacja: ipconfig.

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

1. Aplikacja LOGO! App do LOGO! 8 i LOGO! 7

IEEE Centronics

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

Helena Boguta, klasa 8W, rok szkolny 2018/2019

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

1: ////////// 2: // test.c. 3: ssize_t ret = read(fd, buf, nbytes);

SQL 4 Structured Query Lenguage

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

Instrukcja do oprogramowania ENAP DEC-1

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Instrukcja obsługi User s manual

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

X11R5. .Xresources. Pliki konfiguracyjne X-Windows. Zasada działania X11. .xinitrc. X protocol X server. X client. X library

4 Transmisja szeregowa na przykładzie komunikacji dwukierunkowej z komputerem PC, obsługa wyświetlacza LCD.

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

Stargard Szczecinski i okolice (Polish Edition)


start Program mikroprocesorowego miernika mocy generowanej $crystal = deklaracja

Podstawowa konfiguracja routerów. Interfejsy sieciowe routerów. Sprawdzanie komunikacji w sieci. Podstawy routingu statycznego

Systemy Wbudowane. Raspberry Pi Sterowanie serwomechanizmem (wersja 2019) Serwomechanizm. Serwomechanizm z silnikiem krokowym

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

4 Transmisja szeregowa, obsługa wyświetlacza LCD.

Wojewodztwo Koszalinskie: Obiekty i walory krajoznawcze (Inwentaryzacja krajoznawcza Polski) (Polish Edition)

Linux Kernel III. Character devices

2. Format danych i zaimplementowane funkcje MODBUS

Inżynieria Wytwarzania Systemów Wbudowanych

Pomoc dla użytkowników systemu asix 6 i 7. Drajwer Bufor. Dok. Nr PLP6021 Wersja:

Listing_ $crystal = deklaracja

Dynamiczny DNS dla usług typu Neostrada przykład konfiguracji

E S - uniwersum struktury stosu

GND(VSS) i VCC - masa i zasilanie. V0 - regulacja kontrastu

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Shared memory and messages. Functions. process 0. process 1. program 0. program 0. data 0. data 1. program 1. data 0. data 1.

Konfiguracja po czenia pomi dzy serwerem OPC, a sterownikiem PLC dla sieci Profibus

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

Microsoft IT Academy kurs programowania

Komunikacja w mikrokontrolerach. Magistrala szeregowa I2C / TWI Inter-Integrated Circuit Two Wire Interface

TECHNIKA MIKROPROCESOROWA

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Sterownik momentu obrotowego silnika prądu stałego

Język ludzki kod maszynowy

CW-HC08 Programowanie mikrokontrolera MC9S08QD4 [2]

INSTRUKCJE JAK AKTYWOWAĆ SWOJE KONTO PAYLUTION

Wydział Elektryczny. Katedra Telekomunikacji i Aparatury Elektronicznej. Konstrukcje i Technologie w Aparaturze Elektronicznej.

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Shellcody a architektura MIPS na systemach IRIX. Adam Zabrocki.

UNIPROD GLIWICE ul. Sowińskiego 3 tel: , fax kontakt@uniprod.pl

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Architektura typu Single-Cycle

dr inż. Tomasz Krzeszowski

Installation of EuroCert software for qualified electronic signature

Moduł Ethernetowy. instrukcja obsługi. Spis treści

Transkrypt:

Wizualizacja danych sensorycznych. Control Center. Jan Kędzierski Edgar Ostrowski Wrocław, 18.06.2007

S trona 2 Spis treści 1 Wstęp... 3 2 Komunikacja... 3 3 Lista komend... 5 4 Kolejka FIFO... 6 5 Przesyłanie tekstu...10 6 Przesyłanie i rozpoznawanie komend...11 7 Literatura...15

S trona 3 1 Wstęp Celem projektu było stworzenie panelu do sterowania oraz wizualizacji danych sensorycznych dla platformy mobilnej I 3 BOOT. Oprogramowanie stworzono za pomocą biblioteki QT. Niniejszy raport zawiera opis przygotowanej części sprzętowo-kominikacyjnej dla robota. Zawarto w nim opis instrukcji, komend oraz listing kodu realizujący kolejkę FIFO. W robocie zrealizowano redundantny system pomiarowy. Wyposażono go w pomiar prędkości za pomocą akcelerometrów, optycznego czujnika przyspieszeń oraz enkoderów. Pomiar przemieszczenia wykonywany jest za pomocą optycznego czujnika. Do wizualizacji ruchu robota wykorzystano pomiary przesunięcia w globalnym układzie odniesienia. Informacje o użytym w robocie mikrokontrolerze, czujnikach i pozostałych peryferiach można znaleźć na stronie [2]: http://www.konar.ict.pwr.wroc.pl/infopage.php?id=13 2 Komunikacja Komunikacja z robotem odbywa się przy pomocy interfejsu RS232. Wykorzystano zintegrowany w mikrokontrolerze interfejs komunikacyjny SCI [1]. W ramach projektu zrealizowano możliwość konfiguracji transmisji po stronie nadajnika jak i odbiornika [Fot. 1] [Fot. 2]. Konstrukcję wyposażona była w graficzny wyświetlacz 240x128 pkt dzięki temu możliwe było napisanie łatwego w obsłudze programu konfigurującego łącze komunikacyjne. Zmian prędkości, bitu stopu, bitu parzystości można łatwo dokonywać dzięki przyjaznemu interfejsowi na wyświetlaczu robota. W menu robota wybieramy poszczególne opcje MAIN MENU>SETTINGS>RS-232 Fot. 1 Interfejs konfiguracyjny

S trona 4 Fot. 2 Konfiguracja po stronie komputera PC. W robocie zrealizowano także prostą konsole, która wyświetla i potwierdza zrozumiałe komendy [Fot. 2]. Dzięki konsoli można w łatwy sposób sprawdzić czy robot otrzymuje odebrane informacje. Fot. 3 Konsola robota

S trona 5 3 Lista komend Poniżej w tabeli poniżej przedstawiono wszystkie obecnie obsługiwane komendy przez robota. Lp. Nazwa komendy wartość zwracana Uwagi 1 go(v lin,v kat ) MC68k: OK. (potwierdzenie) zadanie prędkości 2 stop MC68k: OK. (potwierdzenie) zatrzymanie napędów 3 AA aa(a x,a y ) wartości przyspieszeń platformy 4 AV aa(v lin,v kat ) prędkości robota zmierzone przy pomocy akcelerometrów 5 OV ov(v lin,v kat ) prędkości robota zmierzone przy pomocy czujnika optycznego 6 OP op(x,y,theta) pozycja robota w globalnym układzie odniesienia 7 op(x,y,theta) MC68k: OK. (potwierdzenie) ustawienie pozycji robota w globalnym układzie odniesienia 8 EV ev(v lin,v kat ) Prędkości robota zmierzone przy pomocy enkoderów 9 OEV oev(v lin,v kat, V lin,v kat ) prędkości robota zmierzone przy pomocy enkoderów i czujnika optycznego 10 WV wv(v L,V P ) prędkości kół zmierzone przy pomocy enkoderów 11 PID pid(kp,kd,ki) zwraca nastawy regulatorów PID 12 pid(kp,kd,ki) MC68k: OK. (potwierdzenie) ustawia nastawy regulatorów PID Przykładowe zapytania: << go(5,0) >> MC68k: OK. << pid(40,12,10) >> MC68k: OK. << WV >> wv(5,4) Tabela 1. Zestaw komend.

S trona 6 4 Kolejka FIFO Kolejka (ang. FIFO, First In, First Out; pierwszy na wejściu, pierwszy na wyjściu) liniowa struktura danych, w której nowe dane dopisywane są na końcu kolejki, a z początku kolejki pobierane są dane do dalszego przetwarzania. W robocie zaimplementowaną na potrzeby projektu kolejkę wykorzystano do przesyłania tekstów (komend) znak po znaku. Kod kolejki dla mikrokontrolera MC68332 pobrano ze strony domowej formy Freescale. Napisano go z pomocą mgr Mariusza Janiaka na podstawie dokumentu AN1724/D. Zawartość pliku scibuf.h #ifndef LWORD #define LWORD unsigned long #endif #ifndef WORD #define WORD unsigned int #endif #ifndef BYTE #define BYTE unsigned char #endif #define QSIZE 200 /*Definicje struktur*/ typedef struct unsigned int in; unsigned int full; unsigned int out; unsigned char q[qsize]; queue_struct; /*Prototypy funkcji*/ /*rozmiar kolejki*/ /*Wzkaznik na poczatek kolejki*/ /*Flaga pelnej kolejki*/ /*Wskaznik na koniec kolejki*/ /*Tablica kolejki*/ void qinit(queue_struct *); /*Inicjalizuje wybrany bufor */ WORD qstat(queue_struct *); /* Zwaraca info. o stanie wybranego bufora */ //sciinit(void); /* SCI module initialization */ interrupt void sciint(void); /* wskaznik przerwania SCI (TX i RX) */ char rx_byte(byte *); /* Czyta bajt z bufora RX */ char tx_byte(byte); /* Zapisuje bajt do bufora TX */ BYTE SCI_PutText(char *, BYTE); /*Wysyla stringa przez RS-a*/ void komunikacja(); void test_screen(); /*UWAGA: Wymaga wczesniejszego skonfigurowania SCI*/ Zawartość pliku scibuf.c #include "scibuf.h" #include "qsm.h" #include "lcd.h" #include <stdio.h> #include <string.h> char rx_byte(byte *rxbyte) /* Read a received byte from the RX buffer */ /* Return 0 if no byte available, or non zero if byte read OK */

S trona 7 LWORD rxq_full_out; WORD rxin, rxfull, rxout; /* Read rx buffer variables into locals */ rxin = rxbuff.in; rxfull = rxbuff.full; rxout = rxbuff.out; if ((rxin!=rxout) rxfull) /* IF (rx data avaialable) */ *rxbyte = rxbuff.q[rxout]; /* read data byte */ rxout++; /* update pointer..*/ if (rxout>(qsize-1)) rxout = 0; /* check for wraparound */ rxq_full_out = (LWORD)rxout; /* prepare for coherent write..*/ *(LWORD *)(&rxbuff.full) = rxq_full_out; /* of rxqout with rxqfull zero */ return 1; /* return 1 for successful read */ else return 0; /* return 0 as no byte available */ void qinit (queue_struct *qvar) /* Initialize specified queue */ qvar->in = 0x0002; /* Set in=out, and full=0, ie. buffer empty */ qvar->full = 0x0000; qvar->out = 0x0002; WORD qstat(queue_struct *qvar) /* Return the number of valid bytes in a specified buffer */ WORD qin, qfull, qout; /* Read q buffer variables into locals */ qin = qvar->in; qfull = qvar->full; qout = qvar->out; if (qin>qout) /* Data in buffer, no pointer wrap */ return (qin-qout); if (qin<qout) /* Data in buffer with pointer wrap */ return (QSIZE-qout+qin); /* qin must be = qout */ if (qfull) /* Buffer full */ return (QSIZE); /* Buffer empty */ return (0); char tx_byte(byte txbyte) /* Queue a byte into the TX buffer for transmission */ /* Return 0 if buffer already full, or non zero if byte queued OK */

S trona 8 WORD txin, txfull, txout; LWORD txq_in_full; /* Read rx buffer variables into locals */ txin = txbuff.in; txfull = txbuff.full; txout = txbuff.out; if ((txin!=txout)!txfull) /* IF (tx buffer not full) */ /* Add data to tx buffer as space is available */ txbuff.q[txin] = txbyte; txin++; if (txin>(qsize-1)) txin = 0; /* check for wraparound */ if (txin==txout)/* Buff is now full, need to set FULL flag coherently with upd. of txin */ /* Also generate warning that buffer is now full */ txq_in_full = (((LWORD)txout)<<16) 1; /* prepare for coherent write..*/ *(LWORD *)(&txbuff.in) = txq_in_full;/* of txin with txqfull non-zero */ else /* Buffer not full yet, so don't set FULL */ txbuff.in = txin; /* Enable transmitter interrupt (TIE bit set) */ SCCR1 = 0x00ac; return (1); else /* Return error code as no buffer space to queue data */ return (0); interrupt void sciint() /* SCI RX interrupt handler */ /* Note : The SCI interrupt handler will only clear a single interrupt source each time it is executed, by using an else-if structure. This ensures that the transmitter routine is not called unnecessarily if the SCI transmitter is idle (TDRE set) but with no transmit buffer data pending, and the interrupt source therefore disabled */ WORD status, qin, qfull, qout; WORD scidata; LWORD q_long; /* Read status reg to determine source of exception */ status=scsr; if (status & 0x0040)/* if RDRF (rx data register full) flag set */ scidata = SCDR; /* Read received data (+ clear RDRF) */ if (status & 0x0008) /* if OR (receiver OverRun) flag set */

S trona 9 /* Note : typically RDRF will be set at the same time as OR, in which case the RDRF handler will clear OR. OR may be set on its own if an overrun is generated in between QSM_SCSR being read with RDRF set (normal receive), and RDRF being cleared by reading SCDR. Because of this possibility, we need an independent OR flag test and clear mechanism */ /* Any additional receiver overrun handling should be added here and in the separate OR handler. */ else /* Note : This s/w flow discards any received data which has caused a receiver overrun, as it may be regarded as a non-recoverable error. The s/w could be modofied by removing the previous 'else' statement so that no data is discarded, although this may result in missing data from the receive buffer when overrun occurs. */ /* Read rx buffer variables into locals */ qin = rxbuff.in; qfull = rxbuff.full; qout = rxbuff.out; if ((qin!=qout)!qfull)/* IF (rx buffer not full) */ /* data received, but OK. as space in rx buffer */ rxbuff.q[qin] = (BYTE)scidata; qin++; if (qin>(qsize-1)) qin = 0;/* check for wraparound */ if (qin==qout)/* Buffer now full, so set FULL flag coherently with update of qin */ /* Also generate warning that buffer is now full */ q_long = (((LWORD)qout)<<16) 1;/* prepare for coherent write..*/ *(LWORD *)(&rxbuff.in) = q_long;/*of qin with rxqfull non-zero*/ else /* Buffer not full yet, so don't set FULL */ rxbuff.in = qin; else /* Data received, but buffer full (buffer overrun) so flag error */ /* Any additional handler for buffer overrun should be added here */ else if (status & 0x0008) /* if OR (receiver OverRun) flag set */ /* Note : typically RDRF will be set at the same time as OR, in which case the RDRF handler will clear OR.OR may be set on its own if an overrun is generated in between SCSR being read with RDRF set (normal receive), and RDRF being cleared by reading SCDR. Because of this possibility, we need an independent OR flag test and clear mechanism */ scidata = SCDR;

S trona 10 /* Read received data to clear OR */ /* Any additional receiver overrun handling should be added here and in the RDRF + OR handler */ else if (status & 0x0100) /* if TDRE (tx data register empty) flag set */ qin = txbuff.in; qfull = txbuff.full; qout = txbuff.out; if ((qin!=qout) qfull) /* IF (tx data avaialable) */ scidata = txbuff.q[qout];/* read data byte */ qout++; /* update pointer..*/ if (qout>(qsize-1)) qout = 0;/* check for wraparound */ q_long = (LWORD)qout; /* prepare for coherent write..*/ *(LWORD *)(&txbuff.full) = q_long; /* of txqout with txqfull zero */ SCDR = scidata; /* Write tx data to SCI (+ clear TDRE)*/ else /* no more tx data pending.. */ /*..so disable transmitter interrupt (clear TIE bit) */ SCCR1 = 0x002c; /* else /* some other interrupt source */ /* */ /* sciinit(); /* something is wrong - re-initialize sci */ /* */ 5 Przesyłanie tekstu Przesyłanie tekstu odbywało się znak po znaku. W argumencie funkcji przesyłającej podawano ciąg znaków w postaci tablicy. Funkcja ta przesyłała kolejno znak po znaku do kolejki FIFO. BYTE SCI_PutText(char *str, BYTE mode) /*Dodaje stringa do kolejki*/ /* mode = 0 - program czeka az uda mu sie umiescic wszystkie znaki w kolejce*/ /* mode = 1 - program nie czeka gdy nie uda mu sie umiescic znaku w kolejce */ /* zapamietuje polozenie znaku ostatnio nadanego. */ /*Zwraca 0 jesli nie udalo mu sie umiescic calego stringa w kolejce, 1 w */ /*przeciwnym razie.*/ static WORD offset=0; switch (mode) case 0:

S trona 11 while(*str) if(tx_byte(*str)) str++; offset=0; return 1; case 1: str+=offset; while(*str) if(tx_byte(*str)) str++; offset++; else return 0; offset=0; return 1; 6 Przesyłanie i rozpoznawanie komend. Komendy rozpoznawano porównując pierwsze trzy znaki. Znaki te dla każdej funkcji były unikalne. Funkcja rozpoznająca komendy sprawdzała z możliwie dużą prędkością czy w kolejce przechowującej odebrane informacje znajdują się jakieś znaki. Jeśli tak wystarczyło sprawdzić czy komenda jest kompletna. Kompletna komenda zakończona powinna być znakiem końca linii \n. Pojawienie się tego znaku zezwalało w kolejnym kroku rozpoznać jaka to komenda. void komunikacja() unsigned char buf[40]; unsigned char buf2[80]; unsigned char rxchar; unsigned int i=0; unsigned int znaki=0; signed int WL=0; signed int WK=0; float kat=0; znaki= qstat(&rxbuff); if (rxbuff.in>0) i=rxbuff.in-1; rxchar=rxbuff.q[i]; if ((znaki>0)&&(rxchar=='\n')) for (i=0;i<40;i++) buf[i]=' '; for (i=0;i<znaki;i++) rx_byte(&rxchar); buf[i]=rxchar; /////// go(x,x) /////////////////// if (strncmp(buf,"go(0,0)\n",3)==0) SCI_PutText("MC68k: OK.\n", 0); sscanf(buf,"go(%d,%d)\n",&wl,&wk); if (stan.state==2)

S trona 12 ster.v_lin=wl; ster.v_kat=wk; ster.v_l=(wl-wk); ster.v_p=(wl+wk); /////// stop /////////////////// if (strncmp(buf,"stop\n",4)==0) SCI_PutText("MC68k: OK.\n", 0); if (stan.state==2) ster.v_lin=0; ster.v_kat=0; ster.v_l=0; ster.v_p=0; motors_stop(); /////// AA - acc acc /////////// if (strncmp(buf,"aa\n",2)==0) sprintf(buf2,"aa(%d,%d)\n",stan.a_lin,stan.a_kat); /////// AV - acc vel //////////// if (strncmp(buf,"av\n",2)==0) sprintf(buf2,"aa(%d,%d)\n",stan.v_a_lin,stan.v_a_kat); /////// OV - optic vel /////////// if (strncmp(buf,"ov\n",3)==0) sprintf(buf2,"ov(%.1f,%.1f)\n",stan.v_m_lin,stan.v_m_kat); /////// OP - optic pos //////////// if (strncmp(buf,"op\n",2)==0)

S trona 13 sprintf(buf2,"op(%.1f,%.1f,%.2f)\n",stan.poz_x,stan.poz_y,stan.theta); /////// op - set optic pos ////////// if (strncmp(buf,"op(0,0,0)\n",3)==0) SCI_PutText("MC68k: OK.\n", 0); sscanf(buf,"op(%d,%d,%f)\n",&wl,&wk,&kat); stan.poz_x=wl; stan.poz_y=wk; stan.theta=kat; /////// EV - encoder vel ///////////// if (strncmp(buf,"ev\n",2)==0) sprintf(buf2,"ev(%d,%d)\n",stan.v_e_lin,stan.v_e_kat); /////// OEV - optic encoder vel /////// if (strncmp(buf,"oev\n",3)==0) sprintf(buf2,"oev(%.1f,%.1f,%d,%d)\n",stan.v_m_lin,stan.v_m_kat,stan.v_e_li n,stan.v_e_kat); /////// WV - wheel encoder /////////// if (strncmp(buf,"wv\n",3)==0) sprintf(buf2,"wv(%d,%d)\n",stan.v_w_l,stan.v_w_p); /////// PID - PID settings /////////// if (strncmp(buf,"pid\n",3)==0) sprintf(buf2,"pid(%d,%d,%d)\n",settings.kp,settings.kd,settings.ki);

S trona 14 /////// pid - set pid ////////// if (strncmp(buf,"pid(0,0,0)\n",3)==0) SCI_PutText("MC68k: OK.\n", 0); sscanf(buf,"pid(%d,%d,%d)\n",&settings.kp,&settings.kd,&settings.ki);

S trona 15 7 Literatura [1] QSM Queued Serial Module Reference Manual, Freescale Semiconductors Inc. [2] Kędzierski J. Ostrowski E. Robot mobilny klasy (2,0) Blue Screen. http://www.konar.ict.pwr.wroc.pl/infopage.php?id=13