SRV1 Blackfin
A PSZTWiki wikiből
Tartalomjegyzék |
Weboldalak
Új! Bolla Kálmán (Kecskemét, GAMF) http://www.gamf.hu/portal2/surveyor-robot anyagai a firmware frissítésről, visszaállításról, kapcsolódó programokról és egyéb hasznos Surveyor SRV1 infó. Surveyor SRV1 Blackfin robotokról információk.
- http://www.surveyor.com/SRV_protocol.html
- http://www.surveyor.com/C.html
- http://www.ofitselfso.com/SRV1CSharpConsole.php (autorun, return!?)
- http://code.google.com/p/surveyor-srv1-firmware/
- http://www.surveyor.com/blackfin/#blackfin4
- http://www.roborealm.com/tutorial/Fun_with_Surveyor/slide010.php
SURV001
A SURV001 robothoz peer-to-peer (Ad-Hoc) wifi hálózaton keresztül lehet csatlakozni.
Megjelenik a WiFi hálózatok közt egy SRV1 hálózat, és arra kell csatlakozni.
A robot IP címe: 169.254.0.10 lesz amire a 10001-es porton lehet bejelentkezni (pld. telnet).
SURV002
A SURV002 robothoz egy wifi hozzáférési ponton kapcsolaton keresztül lehet kapcsolódni. A robot IP címe: 192.168.1.102
-
telnet 192.168.1.102 10001lehet rá kapcsolódni. -
##Version - SRV-1 Blackfin w/picoC 0.91 08:18:04 - Sep 10 2009
A SURV002 robot 4 Maxsonar EZ1 ultrahangos távbolságmérővel van felszerelve.
- EZ1 Maxsonar ultrahangos távolságmérő
- adatlap http://www.maxbotix.com/uploads/LV-MaxSonar-EZ1-Datasheet.pdf
- FAQ http://www.maxbotix.com/MaxSonar-EZ1__FAQ.html
- csatlakoztatása a Surveyor-hoz http://www.surveyor.com/cgi-bin/yabb2/YaBB.pl?num=1202831771
Surveyor robotok programozása
PicoC
Windows alatt, Tera Term Pro használatával, picoC nyelven.
- program megírása egy szövegszerkesztővel, például:
int t1;
int t2;
int i;
for(i=0;i<100;i++)
{
t1=sonar(1);
t2=sonar(4);
if (t1>t2)
motors(0,30);
else
motors(30,0);
delay(500);
}
motors(0,0);
exit();
- Wifi hozzáférési pont és SURV002 robot bekapcsolása
- Tera Term Pro indítása, TCP/IP Host: 192.168.1.102, Telnet - kikapcsolava, TCP port#: 10001
- kapcsolat ellenőrzése a Tera Term Pro ablakban: V ("V" karakter beírása, "" és enter nélkül), a többi parancsot is a Tera Term Pro ablakban kell beírni.
- Program feltöltési mód elindítása: "X" erre C karakterek jelennek meg az ablakban
- A program feltöltése: File, Transfer, XMODEM, Send, és a feltöltendő fájl kiválasztása.
- a feltöltés után "zw" (uzer-write) parancssal lehet/kell a programot a feltölti memóriából a felhasználói memóriába menteni, "zd" (uzer-dump) paranccsal lehet a programot ellenőrizni.
- a program futtatása: "Q"
Egy példa program feltöltés (Tera Term Pro ablak másolat):
##Version - SRV-1 Blackfin w/picoC 0.91 15:32:46 - Oct 25 2009
C##Xmodem success. Count: 256
##zwrite count: 65536
##zdump:
motors(50,50);
delay(100);
motors(0,0);
int t1;
int t2;
int i;
for(i=0;i<100;i++)
{
t1=sonar(1);
t2=sonar(4);
if (t1>t2)
motors(0,30);
else
motors(30,0);
delay(500);
}
motors(0,0);
exit();
leaving picoC
Tapasztalatok, tanácsok
- az újabb (2009 nyár? utáni) picoC-ben NEM kell main().
- egy program pld. úgy nézhet ki:
{ motors(50,50); delay(3000); motors(0,0); } - a programot
zwparanccsal lehet elmenteni (zrvisszatöltés) ésQ-val futtatni. - az interkatív szerkesztő "időnként minden második karaktert "lenyel", így rossz lesz a program (ellenőrzés:
zd) - uClinux installálás (Blackfin processzorra) http://docs.blackfin.uclinux.org/doku.php?id=installing_linux
- SRV1CSharpConsole [1] használatával a picoC programok feltöltése "általában" NEM sikerül...
- A "c library:4: too many parameters" hiba javítása: [2]
- a picoC programot célszerű "exit()" utasítással befejezni, hogy a vezérlés visszakerüljön az interaktív parancsértelmezőhöz
Még egy picoC példaprogram 4 ultrahang szenzorral:
autorun(5);
motors(0,0);
int t1;
int t2;
int t3;
int t4;
int m1;
int m2;
int i;
for(i=0;i<200;i++)
{
t2=sonar(2);
delay(70);
t3=sonar(3);
printf("%d - %d\r\n",t2,t3);
if (t1>12)
if (t2>12)
// forward
{
m1=t2*2;
m2=t3*2;
if (m1>100) m1=100;
if (m2>100) m2=100;
motors(m1,m2);
}
else
// turn...
{
motors(0,0);
delay(70);
t1=sonar(1);
delay(70);
t4=sonar(4);
if (t1>t4)
motors(50,-50);
else
motors(-50,50);
}
else
// turn...
{
motors(0,0);
delay(70);
t1=sonar(1);
delay(70);
t4=sonar(4);
if (t1>t4)
motors(50,-50);
else
motors(-50,50);
}
delay(200);
}
motors(0,0);
exit();
Fedélzeti kamera használata, programozása
A kamera használata:
Kritikus szempont a fényerősség megtalálása, javasolt intervallum Y=50..200.
- RGB <==> YUV konvertálás: http://www.mikekohn.net/file_formats/yuv_rgb_converter.php/yuv_rgb_converter.php]
- színek megtalálásához az alábbi program használható
motors(0,0);
// a kepet 12 reszre bontjuk 320x240 felbontas mellett 80x80 kepreszletek
int reszKepX1[12];
int reszKepX2[12];
int reszKepY1[12];
int reszKepY2[12];
int i;
int j;
int cPix;
// nem biztos hogz 5mp szukseges, de ez egy biztonsagos hatarnak bizonyult
vcap();
vcam(7);
printf("Autodetection ready!\r\n");
delay(5000);
// szinek inicializálása 36 szín, csak az U es V szerint
for ( i = 0; i < 6; i++ )
{
for ( j = 0; j < 6; j++ )
{
vcolor( ((i*6)+j), 50, 200, (i*42), (((i+1)*42)-1), (j*42), (((j+1)*42)-1) );
}
}
// kép felosztása 12 részre
for ( i = 0; i < 3; i++ )
{
for ( j = 0; j < 4; j++ )
{
reszKepX1[((i*4)+j)] = (j*80);
reszKepX2[((i*4)+j)] = (((j+1)*80)-1);
reszKepY1[((i*4)+j)] = (i*80);
reszKepY2[((i*4)+j)] = (((i+1)*80)-1);
}
}
// kep elmentese
vcap();
// a console nem kepes mind a 36 szinre vonatkozo infot megtartani a bufferben
// itt lehet allitgatni hogy mely szineket nezegetjuk
// megj: piros ~ 15/16-os szin
for ( i = 10; i < 25; i++ )
{
printf("szin: #%d\r\n", i);
for ( j = 0; j < 12; j++ )
{
cPix = vfind( i, reszKepX1[j], reszKepX2[j], reszKepY1[j], reszKepY2[j] );
printf("\t%d", cPix);
if (j == 3 || j == 7 || j == 11)
{
printf("\r\n");
}
}
printf("---------------------------------\r\n");
}
exit();
Lézeres távérzékelés
A lézeres távérsékelés lényege az hogy a robot a rajta található két lézer segítségével állapítja meg hogy milyen távol van tőlle a egelső előtte elhelyeszkedő objektum. Viszont ennek a távérzékelésnek vannak hátrányai. Ugyanis csak olyan felületen tud hiba nélkül távolságot mérni amin nem keletkezik szórtfény és nem tükröződik. Maga a távolság felmérése nagyon egyszerű mert csak a range függvényt kell meghívni és ez vissza adja nekünk a távoságot. Ám ez nem feltétlen pontos így érdemes többszőr távolságot mérni és ezen értékek átlagát venni.
autorun(1);
int dist;
int i;
int tavMeresSzam;
int osszeg;
i=0;
osszeg=0;
tavMeresSzam=0;
dist=0;
while (dist<100)
{
osszeg=0;
tavMeresSzam=0;
while (tavMeresSzam<5)
{
osszeg+=range();
tavMeresSzam++;
}
dist=osszeg/5;
if(dist<100)
{
motors(50,-50);
delay(250);
}
}
while(i<10)
{
if(dist<100)
{
while (dist<70)
{
motors(50,-50);
delay(250);
osszeg=0;
tavMeresSzam=0;
while (tavMeresSzam<5)
{
osszeg+=range();
tavMeresSzam++;
}
dist=osszeg/5;
}
}
if(dist>=100)
{
motors(50,50);
delay(700);
}
motors(0,0);
osszeg=0;
tavMeresSzam=0;
while (tavMeresSzam<5)
{
osszeg+=range();
tavMeresSzam++;
}
dist=osszeg/5;
i++;
}
exit();
