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.

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 10001 lehet 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.

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();
  1. Wifi hozzáférési pont és SURV002 robot bekapcsolása
  2. Tera Term Pro indítása, TCP/IP Host: 192.168.1.102, Telnet - kikapcsolava, TCP port#: 10001
  3. 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.
  4. Program feltöltési mód elindítása: "X" erre C karakterek jelennek meg az ablakban
  5. A program feltöltése: File, Transfer, XMODEM, Send, és a feltöltendő fájl kiválasztása.
  6. 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.
  7. 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 zw paranccsal lehet elmenteni (zr visszatöltés) és Q-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();
Személyes eszközök