Geneza LEGO MindStorms

1 c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009 Geneza LEGO MindStorms [r]0.25 Grupa Epistemologii i Nauczania MIT, rok 1987 Pierwsze zajęcia → Kurs ...
10 downloads 1 Views 760KB Size
1

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Geneza LEGO MindStorms

[r]0.25 Grupa Epistemologii i Nauczania MIT, rok 1987 Pierwsze zajęcia → Kurs 6.270 w 1994 Programmable Brick 120: Procesor Motorola 68332/20MHz 256KB pamięci RAM 4 silniki, 6 czujników Programowanie w językach Logo i pbForth • Firma LEGOr projektuje swój własny sterownik o nazwie RCX. • Sprzedaż zestawu MindStorms (albo RIS 1.5 od Robotics Invention System) rozpoczyna się w 1998. • Nowy zestaw Lego MindStorms NXT pojawia się w 2006 roku.

2

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

MindStorms NXT • sterownik z 32-bitowym procesorem Atmel ARM7 – AT91SAM7S256, zegar 48MHz, 256KB FLASH, 64KB SRAM • 8-bitowy mikrosterownik AVR Atmel – ATMega48, zegar 8MHz, 4KB FLASH, 512B RAM • Bluetooth układ CSR BlueCore4 v2.0, Serial Profile Port (SPP), 47MB RAM (wewnętrzna), 8Mbit FLASH (zewnętrzna) • port USB (12 Mbit/s) $ 



Š   

! 

" 

"!

• 4 porty wejściowe (6-linii) analogowe i cyfrowe (dla czujników), w tym jeden szybki port IEC-61158 Typ 4/EN 50170

!%

• 3 porty wyjściowe (dla serwomechanizmów) • czarno-biały wyświetlacz graficzny LCD 100 x 64 piksele

   Š  



  Š 

#

  

  

• głośnik – wyjściowy kanał dźwiękowy – 8-bitowa rozdzielczość • klawiatura – 4 przyciski gumowe • zasilanie – 6 baterii typu AA (6x1.5V = 9V) lub akumulatory (6x1.2 = 7V)

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

3

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

4

Napędy – serwomechanizmy

• Serwomechanizm z silnikiem prądu stałego jest zasilany napięciem nominalnym 9V i pobiera prąd od ok. 55mA do 800mA w zależności od obciążenia. • Wewnętrzna przekładnia w silniku zmniejsza prędkość obrotową do ok. 170obr/min. • Silnik jest sterowany przez programową modulację PWM – wyjście NXT dostarcza prąd ok. 700mA. • Czujnik obrotów (enkoder) umożliwia pomiar położenia kątowego z rozdzielczością ±1◦ (360 imp./obrót). Porty wyjściowe: Pin1, Pin2, Pin3, Pin4, Pin5, Pin6,

MA0 MA1 GND POWERMA TACHOA0 TACHOA1

– – – – – –

Wyjście sygnału PWM dla serwomechanizmu Wyjście sygnału PWM dla serwomechanizmu Sygnał masy dla wyjścia zasilającego Wyjście sygnału zasilającego o napięciu 4.3 V Port wejściowy dla sygnału z enkodera Port wejściowy dla sygnału z enkodera

5

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Charakterystyki napędu NXT

6

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Charakterystyki napędu NXT Napięcie 4.5 V 7V 9V 12 V

Moment Prędkość obr. Prąd Moc Mech. 16.7 N.cm 33 obr/min 0.6 A 0.58 W 16.7 N.cm 82 obr/min 0.55 A 1.44 W 16.7 N.cm 170 obr/min 0.55 A 2.03 W 16.7 N.cm 230 obr/min 0.58 A 3.10 W

Moc El. Sprawność 2.70 W 21% 3.85 W 37% 4.95 W 41% 6.96 W 44%

Zależność prędkości obrotowej od napięcia zasilania

7

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Rodzaje czujników

Czujnik dotykowy

Czujnik światła

Czujnik dźwięku

Czujnik ultradźwiękowy (sonar)

• Czujniki analogowe: dotykowy, światła, dźwięku (mikrofon) • Czujnik cyfrowy: ultradźwiękowy • Czujniki mogą być bierne lub aktywne – Czujnik bierny nie wymaga zasilania – Czujnik aktywny może czerpać z NXT prąd do 15mA (przy ok. 8V) w czasie cyklu pomiarowego: 3ms zasilanie, 0.1 ms odczyt.

8

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Współpraca NXT z czujnikami Porty wejściowe: Pin1, Pin2, Pin3, Pin4, Pin5, Pin6,

ANA GND GND IPOWERA DIGIAI0 DIGIAI1

– – – – – –

Wejście analogowe (podłączone do 10-bitowego przetwornika A/C procesora AVR) Sygnał masy Sygnał masy Wyjście sygnału zasilającego o napięciu 4.3 V Cyfrowe we/wy podłączone do ARM7 (może działać jako magistrala I2 C) Cyfrowe we/wy podłączone do ARM7 (może działać jako magistrala I2 C)

• W porcie wejściowym nr 4 linie DIGIAI0 i DIGIAI1 są podłączone do RS-485, co umożliwia szybką komunikację szeregową • Magistrala szeregowa I2C (linie DIGIAI0 i DIGIAI1) działa z szybkością 9600 bit/s • Częstotliwość próbkowania przetwornika A/C wynosi 333Hz (wynika z czasu 3ms zasilania czujnika)

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

9

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

10

11

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Wybrane środowiska programowania NXT Cechy Rodzaj języka Firmware IDE

NXT-G Robo NBC NXC RobotC LabView LejOS Lab 2.9 NXJ graficzny graficzny asembler C poC graficzny Java dobne standard standard standard standard standard standard własne Tak Tak Tak Tak Tak Nie Nie

Windows Tak Tak Tak Tak Tak Linux Nie Nie Tak Tak Nie Zdarzenia Nie Nie Tak Nie Nie Wielowątkowość Tak Tak Tak Tak Tak Bluetooth Tak Nie Tak Tak Tak NXT-PC Bluetooth Tak Nie Tak Tak Nie NXT-NXT Wsparcie I2C Tak/? Tak Tak Tak Tak System plików Tak Tak Tak Tak Tak Zmienny przeNie Tak Nie Nie Tak cinek Programy użytkownika są ładowalne i wykonują się na procesorze ARM7.

pbLua LEJOS OSEK Lua ANSI C własne własne Nie Eclipse CDT Tak Tak Tak Nie Nie Tak Tak Tak Tak Tak

Tak Nie Tak Tak Tak

Tak Tak Nie Tak Tak

Tak

Nie

Tak

Nie

Tak Tak Nie

Nie Nie Tak

Tak Nie Tak

Tak Nie Tak

12

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Not eXactly C • Prosty język programowania NXC o składni zbliżonej do języka C. • Kompilator przetwarza kod źródłowy NXC na kod bajtowy interpretowany przez firmowy interpreter LEGO. • Język NXC ma wiele ograniczeń wynikających z możliwości firmowego interpretera. • API składa się ze stałych, makr, funkcji obsługi: serwomechanizmów, czujników, wyświetlacza/klawiatury, komunikacji, wątków. • NXT wspiera wielowątkowość – zadanie w NXC odpowiada wątkowi NXT. Program musi zawierać przynajmniej jedno zadanie o nazwie main(). Maksymalna liczba zadań – 256. • Instrukcje mogą być grupowane w funkcje.

13

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Not eXactly C Słowa kluczowe: RETURN

char

long

sub

RETVAL

const

mutex

switch

STRRETVAL

continue priority task

TMPBYTE

default

repeat

true

TMPWORD

do

return

typedef

TMPLONG

else

safecall unsigned

abs

false

short

until

asm

for

sign

void

bool

goto

start

while

break

if

stop

byte

inline

string

case

int

struct

14

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Struktura programu NXC Program NXC składa się z bloków kodu i zmiennych. Są dwa typy bloków kodu: zadania i funkcje. # define MOVE_TIME 1000 # define TURN_TIME 200 task main () { OnFwd ( OUT_AC , 60); Wait ( MOVE_TIME ); OnRev ( OUT_C , 60); Wait ( TURN_TIME ); Off ( OUT_AC ); } Wywołanie funkcji – synchronizowany dostęp między wątkami: [ safecall ] [ inline ] return_type name ( argument_list ) { // ciało funkcji } void abc ( int x ) { x = 1; }

15

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Typy zmiennych Typ

Opis

bool

8-bitowy bez znaku

byte, unsigned char 8-bitowy bez znaku char

8-bitowy ze znakiem

unsigned int

16-bitowy bez znaku

short, int

16-bitowy ze znakiem

unsigned longa

32-bitowy bez znaku

long

32-bitowy ze znakiem

mutex

Specjalny typ używany do wzajemnego wykluczania

string

Tablica typu byte

struct

Struktura zdefiniowana przez użytkownika

Arrays

Tablice dowolnego typu

16

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Funkcje systemowe Obsługa czasu systemowego: Wait(time) – uśpienie zadania na określony czas (w milisekundach [ms]) CurrentTick() – zwraca 32-bitową wartość bez znaku, aktualny czas systemowy (zwanym „tyknięciem”) w [ms] FirstTick()

– zwraca 32-bitową wartość bez znaku, aktualny czas systemowy w [ms] od chwili rozpoczęcia programu

SleepNow()

– natychmiast wyłącza NXT

Funkcje numeryczne: Random(n)

– zwraca 16-bitową liczbę losową bez znaku z zakresu 0..n

Random()

– zwraca 16-bitową liczbę losową ze znakiem

Sqrt(x)

– zwraca wartość pierwiastka kwadratowego argumentu

Sin(deg)/Cos(deg)

– zwraca wartość sinusa/cosinusa kąta w stopniach. Wynik jest 100 razy większy od sin/cos (−100, . . . , 100)

Asin(value)/Acos(value) – zwraca wartość arcsinusa/arccosinusa dla argumentu z zakresu (−100..100). Wynik w stopniach z zakresu (−90◦..90◦)

17

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Typy czujników SetSensorType ( port , const type ); SetSensor ( S1 , SENSOR_TOUCH ); Typ czujnika SENSOR TYPE SENSOR TYPE SENSOR TYPE SENSOR TYPE SENSOR TYPE SENSOR TYPE SENSOR TYPE SENSOR TYPE SENSOR TYPE SENSOR TYPE SENSOR TYPE SENSOR TYPE SENSOR TYPE

Znaczenie NONE brak skonfigurowanego czujnika TOUCH czujnik dotykowy NXT lub RCX TEMPERATURE czujnik temperatury RCX LIGHT czujnik światła RCX ROTATION czujnik obrotów RCX LIGHT ACTIVE czujnik światła (ze światłem) NXT LIGHT INACTIVE czujnik światła (bez światła) NXT SOUND DB czujnik dźwięku NXT ze skalą w dB SOUND DBA czujnik dźwięku NXT ze skalą w dBA CUSTOM inny czujnik (nieużywane) LOWSPEED czujnik cyfrowy I2C LOWSPEED 9V czujnik cyfrowy I2C (zasilanie 9V) HIGHSPEED Szybki czujnik (nieużywane)

18

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Tryby pracy czujników SetSensorMode ( port , const mode ); SetSensorMode ( S1 , SENSOR_MODE_RAW ); // raw mode \\ SetSensorMode ( S1 , SENSOR_MODE_RAW + 10); // slope 10 Tryb czujnika SENSOR MODE SENSOR MODE SENSOR MODE SENSOR MODE SENSOR MODE SENSOR MODE SENSOR MODE SENSOR MODE

Znacznie RAW „surowa” wartość z przedziału 0..1023 BOOL wartość typu boolowskiego (0 lub 1) EDGE zlicza liczbę boolowskich przejść (dla ustalonych progów wartości) PULSE zlicza liczbę boolowskich okresów PERCENT wartość z zakresu 0..100 (procenty) FAHRENHEIT temperatura w stopniach F CELSIUS temperatura w stopniach C ROTATION obroty (16 impulsów na obrót)

19

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Standardowe konfiguracje czujników Konfiguracja czujnika SENSOR TOUCH SENSOR LIGHT SENSOR ROTATION SENSOR CELSIUS SENSOR FAHRENHEIT SENSOR PULSE SENSOR EDGE

Typ SENSOR SENSOR SENSOR SENSOR SENSOR SENSOR SENSOR

Tryb TYPE TOUCH SENSOR TYPE LIGHT SENSOR TYPE ROTATION SENSOR TYPE TEMPERATURE SENSOR TYPE TEMPERATURE SENSOR TYPE TOUCH SENSOR TYPE TOUCH SENSOR

MODE MODE MODE MODE MODE MODE MODE

BOOL PERCENT ROTATION CELSIUS FAHRENHEIT PULSE EDGE

20

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Obsługa czujników SetSensor(port, const configuration) – ustawienie typu i trybu czujnika SetSensorLight(port)

– konfigurowanie czujnika na danym porcie jako czujnika światła

SetSensorLight(port)

– konfigurowanie czujnika na danym porcie jako czujnika dotykowego

SetInput(port, const field, value)

– ustawienie pola w porcie na określoną wartość

ResetSensor(port)

– wyzerowanie czujnika

Sensor(n)

– odczyt wartości czujnika z portu n

Przykład: SetSensor() = SetSensorType() + SetSensorMode(); SetSensor ( IN_1 , SENSOR_TOUCH ); /* SetSensorType ( IN_1 , SENSOR_TYPE_TOUCH ); SetSensorMode ( IN_1 , SENSOR_MODE_BOOL ); ResetSensor ( IN_1 ); */ if ( SENSOR_1 ) { /* ... */ } x = Sensor ( S1 ); // odczyt czujnika 1

21

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Sterowanie silnikami Zdefiniowane stałe: OUT_A, OUT_B, OUT_C - pojedyncze porty wy OUT_AB, OUT_AC, OUT_BC - pary portów wy OUT_ABC - trzy porty wy Off(outputs)

– wyłącza (z hamowaniem) podane wyjścia (silniki)

Coast(outputs)

– wyłącza (bez hamowania) wyjścia powodując zatrzymanie silników

Float(outputs)

– działa jak Coast(outputs)

OnFwd(outputs, pwr)

– ustawienie ruchu w przód (umowne) i włączenie silników

OnRev(outputs, pwr)

– ustawienie ruchu w tył (umowne) i włączenie silników

OnFwdReg(outputs, pwr, regmode) – uruchomienie ruchu silników w przód z określonym trybem regulacji RotateMotor(outputs, pwr, angle)

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Sterowanie silnikami: task main () { OnFwd ( OUT_AC , 75); Wait (500); Off ( OUT_AC ); Wait (1000); OnFwd ( OUT_AC , 75); Wait (500); Float ( OUT_AC ); }

– obrót silników o zadany kąt

22

23

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Komunikacja z użytkownikiem Komunikacja dźwiękowa: PlayTone(frequency, duration) – odgrywa pojedynczy ton o częstotliwości w Hz przez określony czas w [ms] PlayFile(filename) – odgrywa plik dźwiękowy (.rso) lub plik z melodią (.rmd) Komunikacja graficzna: NumOut(x, y, value) TextOut(x, y, msg) CircleOut(x, y, radius) LineOut(x1, y1, x2, y2) PointOut(x, y) RectOut(x, y, width, height) ClearScreen()

– – – – – – –

wypisuje na ekranie wartość numeryczną w pozycji x, y wypisuje na ekranie wartość tekstową w pozycji x, y rysuje okrąg na ekranie w pozycji x, y o zadanym promieniu rysuje linię od (x1, y1) do (x2, y2) Rysuje punkt w (x, y) rysuje prostokąt na ekranie w pozycji x, y o zadanej szerokości i wysokości czyści ekran (pusty ekran)

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

# define X_MAX 99 # define Y_MAX 63 # define X_MID ( X_MAX +1)/2 # define Y_MID ( Y_MAX +1)/2 task main (){ int i = 1234; TextOut (15 , LCD_LINE1 , " Display " , true ); NumOut (60 , LCD_LINE1 , i ); PointOut (1 , Y_MAX -1); PointOut ( X_MAX -1 , Y_MAX -1); PointOut (1 ,1); PointOut ( X_MAX -1 ,1); Wait (200); RectOut (5 ,5 ,90 ,50); Wait (200); LineOut (5 ,5 ,95 ,55); Wait (200); LineOut (5 ,55 ,95 ,5); Wait (200); CircleOut ( X_MID , Y_MID -2 ,20); Wait (800); ClearScreen (); GraphicOut (30 ,10 , " faceclosed . ric " ); Wait (500); learScreen (); GraphicOut (30 ,10 , " faceopen . ric " ); Wait (1000); }

24

25

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Programy wielowątkowe sterowanie wykonaniem programu: Stop(bvalue) – całkowite zatrzymanie programu jeśli wartość jest prawdą StopAllTasks()

– zatrzymanie wszystkich zadań (zakończenie programu)

StartTask(task) – uruchomienie określonego zadania StopTask(task) – zatrzymanie zadania Acquire(mutex)

– zajmuje określoną zmienną typu mutex

Release(mutex)

– zwalnia zmienną mutex

Precedes(task1, task2, . . . , taskN) – szereguje zadania do wykonania, gdy tylko zakończy się bieżące zadanie Follows(task1, task2, . . . , taskN)

– szereguje do wykonania bieżące zadanie, jeśli zakończy się jedno z wymienionych zadań

ExitTo(task)

– natychmiast kończy bieżące zadanie i przechodzi do wykonania podanego zadania.

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

mutex moveMutex ; task move_square () { while ( true ) { Acquire ( moveMutex ); OnFwd ( OUT_AC , 75); Wait (1000); OnRev ( OUT_C , 75); Wait (500); Release ( moveMutex ); } } task check_sensors () { while ( true ) { if ( SENSOR_1 == 1) { Acquire ( moveMutex ); OnRev ( OUT_AC , 75); Wait (500); OnFwd ( OUT_A , 75); Wait (500); Release ( moveMutex ); } } } task main () { Precedes ( move_square , check_sensors ); SetSensorTouch ( IN_1 ); }

26

27

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Kompilacja i ładowanie programu user@irp1:~/nxt$ nbc -help Next Byte Codes Compiler version 1.0.1.b32 (1.0.1.32, built Tue Oct 2 16:24:33 CEST 2007) Copyright (c) 2006, John Hansen Syntax: nbc [options] filename [options] -D=[=]: define macro -Z[1|2]: turn on compiler optimizations -O= : specify output file -w[-|+] : warnings off or on [default is off] -EF : enhanced firmware -safecall: NXC will wrap all function calls in Acquire/Release -api: dump the API to stdout -help : display command line options

Przykład: user@irp1:~/STUDIES/NXT/nxt$ nbc -Z2 -O=first.rxe first.nxc

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Ładowanie i uruchomianie programu user@irp1:~/STUDIES/NXT/nxt$ NXTRC Usage: NXTRC [-s | -a ADDR command] [-v] -a ADDR Connect with NXT at ADDR required unless -s is used or ADDR is in BTADDR Env Var -v Be verbose and one command -i Get info on NXT brick -l List files on NXT brick -L PATT List files that match PATT (e.g. *.rxe) -b Get Battery Level -n NAME Set NXT name to NAME -w FILE Write FILE on NXT -W FILE Same as -w overwriting FILE if exists -r FILE Read FILE frome NXT and save it -d FILE Delete FILE frome NXT -p FILE Run Program FILE on NXT -k Stop a program running on NXT -m FILE Play Sound File once -M FILE Play Sound File indefinitely -z Stop Sound Playback or

-s

Scan for BT devices

if more than one command is given only the last one is performed.

28

29

c Wstęp do Robotyki – ¥W. Szynkiewicz, 2009

Programy i szczegółowa dokumentacja na komputerach w laboratorium i na stronie:

http://bricxcc.sourceforge.net/nxc/