PROGRAMOWANIE
11
N
Na
a k
ko
olle
ejjn
ny
ycch
h ssttrro
on
na
acch
h zza
am
miie
esszzcczzo
on
no
o k
ko
od
d w
w jj´
´zzy
yk
ku
u JJa
av
va
a p
po
ozzw
wa
alla
ajjà
àccy
y sstte
erro
ow
wa
açç d
d∏∏o
on
niià
à
((cch
hw
wy
ytta
ak
kiie
em
m)) ii--D
D0
01
1.. B
B´
´d
dzziie
esszz m
mó
óg
g∏∏ g
go
o sszzy
yb
bk
ko
o w
wy
yk
ko
orrzzy
ysstta
açç d
do
o ttw
wo
orrzze
en
niia
a w
w∏∏a
assn
ny
ycch
h
p
prro
og
grra
am
mó
ów
w,, g
gd
dy
y tty
yllk
ko
o zza
ak
ko
oƒ
ƒcczzy
y ssii´
´ ssk
k∏∏a
ad
da
an
niie
e rr´
´k
kii rro
ob
bo
otta
a..
W
zaprezentowanym w tym numerze przyk∏adzie prze-
stawiono zasoby w j´zyku Java, pozwalajàce stero-
waç d∏onià i-D01. Zanim b´dziesz móg∏ ich u˝yç, mu-
sisz poczekaç na zeszyt nr 89, do którego zostanie do∏àczona
p∏ytka elektroniczna do sterowania d∏onià. W odró˝nieniu od
przyk∏adów przedstawionych w poprzednich numerach, tym
razem nie wprowadzamy ˝adnego interfejsu graficznego – ty
sam b´dziesz móg∏ go stworzyç, tak jak zechcesz, zgodnie
z w∏asnymi potrzebami. JeÊli nie masz na to ochoty, b´dziesz
móg∏ ograniczyç si´ do stosowania metod z zasobów, u˝ywa-
jàc ich do kolejnych twoich programów.
KLASA HANDCONTROL
Klasa H
Ha
an
nd
dC
Co
on
nttrro
oll oddaje do dyspozycji szereg metod do ste-
rowania chwytakiem i-D01. W odró˝nieniu od j´zyka C-like czy
Visual C-like w Javie przewidziano dwa tryby sterowania. Pierw-
szy, prostszy, pozwala kontrolowaç zamkni´cie d∏oni, ustawia-
jàc konkretny próg „si∏y”, po przekroczeniu którego nap´d ma
si´ zatrzymaç. Próg ten, którego wartoÊç mo˝e wahaç si´ od
1 do 10, jest odwrotnie proporcjonalny do „delikatnoÊci” i-D01
podczas chwytania przedmiotu. Przy wartoÊci równej 1 nap´d
sterujàcy d∏onià zatrzyma uchwyt, gdy tylko napotka lekki opór.
Przy wy˝szym progu przeciwnie – ÊciÊnie mocniej, zanim za-
blokuje chwyt. Choç mo˝na ustawiç dowolnà wartoÊç miesz-
czàcà si´ w przedziale 1-10, aby uniknàç nadmiernego obcià-
˝enia kó∏ z´batych i palców, zalecana si´ u˝ywanie wartoÊci
mniejszych od 7. Z tego samego powodu zresztà, w Visual
C-like nie ma poziomów wy˝szych od 6.
Drugi tryb sterowania opiera si´ natomiast na monitorowa-
niu nat´˝enia pràdu elektrycznego pobieranego przez nap´d,
aby ustaliç, czy d∏oƒ chwyta przedmiot. Zanalizujemy teraz do-
k∏adnie ró˝ne metody zasobów. Oprócz konstruktora klasy
pierwszymi metodami, które spotykamy, sà h
ha
an
nd
d_
_o
op
pe
en
n
i h
ha
an
nd
d_
_ccllo
osse
e pozwalajàce, odpowiednio, otworzyç i zamknàç
d∏oƒ robota przy u˝yciu kontroli si∏y. Parametr ffo
orrcce
e metody
h
ha
an
nd
d_
_ccllo
osse
e ustala próg si∏y na podstawie takiej, jak podano po-
wy˝ej. Metoda otwarcia d∏oni nie wymaga ˝adnego parame-
tru: w tym wypadku poziom si∏y zostaje ustawiony automa-
tycznie przez oprogramowanie robota. Kolejna metoda,
h
ha
an
nd
d_
_sstto
op
p, wymusza zatrzymanie ruchu d∏oni. Aby otrzymaç
informacje na temat stanu d∏oni, trzeba si´gnàç do g
ge
ett_
_h
ha
an
nd
d_
_p
po
oss
i g
ge
ett_
_e
errrro
orr_
_ttyyp
pe
e. Pierwsza z tych metod zwraca wartoÊç 0, gdy
d∏oƒ znajduje si´ w pozycji nieokreÊlonej; 1, gdy jest ca∏kowi-
cie otwarta; 2 – ca∏kowicie zamkni´ta; 3, gdy jest w ruchu. Prze-
widziano wreszcie wartoÊç –1, aby zasygnalizowaç anomalie
w dost´pie do rejestrów i-D01. Z kolei druga metoda przyda-
je si´ do otrzymywania informacji o ewentualnych problemach
pojawiajàcych si´ podczas u˝ywania d∏oni robota. Ostatnie
dwie metody, h
ha
an
nd
d_
_o
op
pe
en
n_
_ccu
urrrre
en
ntt i h
ha
an
nd
d_
_ccllo
osse
e_
_ccu
urrrre
en
ntt, s∏u˝à
do kontroli d∏oni poprzez bazowanie na nat´˝eniu pràdu p∏y-
nàcego przez nap´d. Wi´cej szczegó∏ów znajdziesz na czwartej
p∏ycie zawierajàcej dokumentacj´ technicznà protoko∏u I2C.
Aby korzystaç z zasobów przedstawionych na nast´pnej
stronie, musisz poczekaç na zeszyt nr 89, gdzie
znajdziesz p∏ytk´ do sterowania d∏onià (powy˝ej widaç,
jak b´dzie wyglàda∏a d∏oƒ po zakoƒczeniu monta˝u).
KROK PO KROKU
STEROWANIE DLONIA
W JEZYKU JAVA
STEROWANIE D¸ONIÑ
W J¢ZYKU JAVA
KROK PO KROKU
12
PRZYK¸ADY PROGRAMOWANIA
CLASSE HANDCONTROL
package communication.examples;
import communication.handler.internal.InternalHandler;
import communication.handler.internal.InternalModule;
import communication.handler.internal.HandData;
import communication.handler.internal.HandRegister;
import java.io.IOException;
public class HandControl {
private InternalHandler internal;
public HandControl(InternalHandler internal) {
this.internal = internal;
} // class constructor
void hand_open() {
int[] buf = new int[1];
// Poziom si∏y otwarcia
buf[0] = HandData.OPEN;
try {
internal.writeRegister(InternalModule.HAND,
HandRegister.COMMAND, buf);
} catch (Exception e) {
e.printStackTrace();
}
} // hand_close
void hand_close(int force) {
int[] buf = new int[1];
if ((force < 1) || (force > 10)) return;
buf[0] = force;
try {
internal.writeRegister(InternalModule.HAND,
HandRegister.FORCE_LEVEL, buf);
} catch (Exception e) {
e.printStackTrace();
}
buf[0] = HandData.CLOSE; // Poziom si∏y zamkni´cia
try {
internal.writeRegister(InternalModule.HAND,
HandRegister.COMMAND, buf);
} catch (Exception e) {
e.printStackTrace();
}
} // hand_close
void hand_stop() {
int[] buf = new int[1];
buf[0] = HandData.STOP; // stop
try {
internal.writeRegister(InternalModule.HAND,
HandRegister.COMMAND, buf);
} catch (Exception e) {
e.printStackTrace();
}
} // hand_stop
int get_hand_pos() {
int[] buf = new int[1];
try {
internal.readRegister(InternalModule.HAND,
HandRegister.COMMAND, buf);
return buf[0];
} catch (Exception e) {
e.printStackTrace();
return -1;
}
} // get_hand_pos
int get_error_type() {
int[] buf = new int[1];
try {
internal.readRegister(InternalModule.HAND, 6, buf);
return buf[0];
} catch (Exception e) {
e.printStackTrace();
return -1;
}
} // get_error_type
void open_hand_current(int level) {
int[] buf = new int[1];
if ((level < 0) || (level > 80)) return;
buf[0] = level;
try {
internal.writeRegister(InternalModule.HAND,
HandRegister.OPEN_CURRENT, buf);
} catch (Exception e) {
e.printStackTrace();
}
// Próg pràdu przy otwieraniu
buf[0] = HandData.OPEN_CUR;
try {
internal.writeRegister(InternalModule.HAND,
HandRegister.COMMAND, buf);
} catch (Exception e) {
e.printStackTrace();
}
} // open_hand_current
void close_hand_current(int level) {
int[] buf = new int[1];
if ((level < 0) || (level > 80)) return;
buf[0] = level;
try {
internal.writeRegister(InternalModule.HAND,
HandRegister.CLOSE_CURRENT, buf);
} catch (Exception e) {
e.printStackTrace();
}
// Próg pràdu przy zamykaniu
buf[0] = HandData.CLOSE_CUR;
try {
internal.writeRegister(InternalModule.HAND,
HandRegister.COMMAND, buf);
} catch (Exception e) {
e.printStackTrace();
}
} // close_hand_current
} // class HandControl
Przyk∏ad kodu Java wprowadzajàcy zasoby do sterowania d∏onià
i-D01. Do zarzàdzania nià przewidziano dwa rodzaje kontroli –
jeden „si∏owy”, za pomocà progu podanego jako liczba mi´dzy
1 a 10; drugi – na podstawie pràdu elektrycznego pobieranego
przez nap´d. W pierwszym trybie znajdujà si´ metody hand_open
i hand_close; zaÊ w drugim hand_open_current i hand_close_cur-
rent. Inne metody obecne w zasobach pozwolà uzyskaç pewne
szczegó∏owe informacje na temat stanu d∏oni i-D01.