2008. január 9., szerda

Bemutató és videók

Első lépések


Vonalkövetés


Vonalkövetés 2 szenzor


Labdázás


Egyensúlyozás

2007. december 5., szerda

Vonalkövetés

Algoritmus hamarosan...

>

2007. november 19., hétfő

MotorTachoCount

Ezzel szivok mostanában, mivel az összes motor forgató parancs nullázza a számlálót. Valahogy jó lenne a két motor fordulatainak számát külön megjegyezni, hogy tudjuk mennyit ment a robot.

A megoldáson még gondolkozok.

Jó hir, hogy a HiTechnic szenzorok használhatók könnyen az ultrasonichoz hasonlóan, ugyanúgy beállitva és olvasva az adatokat. Eddig a Color sensort és a Compasst használtuk.

MotorOverload

Próbálkozunk egy olyasmit megoldani, hogy ha a robot háttal nekimegy vminek, vagy oldalról felmászik a falra, akkor vegye észre magát. Sajnos a szenzorok száma korlátozott, úgyhogy a motorok encodereire szeretnénk ezt a megoldást alapozni. Sajnos a végső teszteléskor az akkuk lemerültek, úgyhogy nem tudtuk teljesen tesztelni ezt a megoldást.

Ha jól értelmezem, akkor a MotorOverload() akkor ad 1-es értéket vissza, ha több erőre van szüksége a forgáshoz, mint amennyit kap. Ez alapján akarjuk megállitani a motrokat és visszaforditani a robotot.

Az idevágó szál:

task stopback(){
while(true){
if((MotorOverload(OUT_B) == 1) || (MotorOverload(OUT_C) == 1)){
Off(OUT_BC);
ClearScreen();
GraphicOut(30,10,"faceclosed.ric");
if(curdir == 1){
Acquire(motor);
curdir = 2;
OnRevReg(OUT_BC, 30, OUT_REGMODE_SPEED);
Wait(500);
forog();
Release(motor);
}
else{
Acquire(motor);
curdir = 1;
OnFwdReg(OUT_BC, 30, OUT_REGMODE_SPEED);
Wait(500);
Release(motor);
}
ClearScreen();
GraphicOut(30,10,"faceopen.ric");

}
}
}
A robot mozgási iránya mindig be van állitva, igy tudjuk merre kell visszaforduljon.

2007. november 13., kedd

Videjók :)

ocsilalala feltett pár videót a youtube-ra, lehet nézegetni miken dolgozgattunk. (mondtam már, hogy szar az editor a blogon? kódban sokkal jobb irni :P )


Na ez a mostani robot, ezzel fogunk ez után is dolgozni




Egy kicsit meg van keményitve a karja, már nem megy szarrá egy erős fogásnál.

Eddig ezt tudja a robot:

  • induláskor 10 mp-ig körbeforog, keres valami közeli tárgyat (a labdát elméletileg), ha nincs meg akkor indul előre, másképp a labda felé
  • meglát vmit az ultrasonic-kal, lelassul, és megy tovább. kinyitott karral. Ha hirtelen már nem látja a tárgyat, akkor valszeg labda és átment fölötte és megpróbálja megfogni
  • ha sikerült megfogni (touch szenzor), akkor örül, és forog gyorsan mint a bolond, megáll majd zenél
  • ha nem tűnt el a tárgy, akkor biztos nem labda, megfordul s megy másfelé
  • ezen kivül nem esik le az asztalról a light szenzor miatt (kivéve ha háttal megy)
Valamikor felrakom a forrást is, most nincs kedvem. A program szálakkal működik.

Másik robot (ez még Robotics Studióval programozva, nem tud semmit majdnem, egyetlen szenzort használ)


2007. november 6., kedd

Doksik

Fasza NXC tutorial by Danny Benedettelli.
NXC tutorial példaprogramok
NXC teljes leirás

NXB tutorial
NXB példák

Mai szórakozás a robottal

Kipróbáltuk a Bricxcc-t és az NXC-t a robotokkal, és eddig csak jók a tapasztalatok. Messze egyszerűbb és átláthatóbb igy programozni a robotot, mint VPL-ben. Magyarul a VPL egy fos emellett.
A Watching the Brick opció nagyon fasza, minden szenzor és encoder állapotát lehet látni realtime is. Ezenkivül a Tools menüben sok más hasznos cucc van.

Egyedüli "gond" amibe az elején belefutottunk, az a csatlakozás volt. Nem elég szimplán párositani bluetoothon a robotot (Windows vagy Bluesoleil), mert kellenek az NXT driverek is. Ebben különbözött a csatlakozás az MSRS-től. Megoldás: párositás törlése a Winből, driver felrak, restart, Bricxcc elindit, vár, majd a listában megjelennek BTH előtaggal és névvel az érzékelt robotok. Tehát nem COM portot kell választani! Utána megy is, a robot kéri a passkey-t és ennyi, kikapcsolás után is egyből csatlakozik.
A leforditott programok a robot flash-jébe kerülnek, és ott is maradnak, utólag is lehet őket futtatni kézzel, gépi beavatkozás nélkül. És a programok a roboton futnak! Meg lehet őket állitani a gépről is, ha szarul sül el valami, és a robotról is. VPL-ben ezzel szopás van, és szerintem ha a robot kimegy a bluetyúk hatókörből, akkor szinte biztos, hogy a VPL program is megbolondul, ez nem :D

Na akkor jöhetnek a programok:
Egyszerű előre-hátra mozgás
#include "NXCDefs.h"

task main(){
OnFwd(OUT_BC, 30);
Wait(2000);
OnRev(OUT_BC, 40);
Wait(2000);
Off(OUT_BC);

Szenzoros mozgás
Előre megy addig, amig a touch szenzor nem ér el vmit, vagy az ultrasonic 20 cm-nél közelibb távot érzékel, vagy a light szenzor 30-nál kisebb intenzitást érzékel(bekapcsolt fénnyel), vagyis ha nekimegy valami alsó tárgynak, amit az ultrasonic nem érzékel, vagy közel kerül vmihez, vagy vége az asztalnak :)
#include "NXCDefs.h"

#define THRESHOLD 30
#define NEAR 20
#define VOL 7

task music()
{
while (true)
{
PlayTone(784,73);
Wait(75);
PlayTone(740,73);
Wait(75);
PlayTone(659,73);
Wait(75);
PlayTone(587,73);
Wait(75);
PlayTone(659,35);
Wait(37);
PlayTone(659,36);
Wait(188);
PlayTone(784,73);
Wait(75);
PlayTone(740,73);
Wait(75);
PlayTone(659,73);
Wait(75);
PlayTone(587,73);
Wait(75);
PlayTone(659,35);
Wait(37);
PlayTone(659,36);
Wait(188);
PlayTone(587,16);
Wait(18);
PlayTone(659,17);
Wait(19);
PlayTone(659,17);
Wait(19);
PlayTone(587,17);
Wait(19);
PlayTone(659,35);
Wait(37);
PlayTone(659,36);
Wait(38);
PlayTone(659,35);
Wait(37);
PlayTone(659,36);
Wait(38);
PlayTone(587,16);
Wait(18);
PlayTone(659,17);
Wait(19);
PlayTone(659,17);
Wait(19);
PlayTone(587,17);
Wait(19);
PlayTone(659,35);
Wait(37);
PlayTone(659,17);
Wait(19);
PlayTone(587,17);
Wait(19);
PlayTone(659,16);
Wait(18);
PlayTone(659,36);
Wait(38);
PlayTone(659,17);
Wait(19);
PlayTone(880,35);
Wait(37);
PlayTone(784,36);
Wait(38);
PlayTone(784,16);
Wait(18);
PlayTone(587,17);
Wait(19);
PlayTone(659,36);
Wait(38);
PlayTone(587,16);
Wait(18);
PlayTone(659,36);
Wait(38);
PlayTone(587,17);
Wait(19);
PlayTone(659,35);
Wait(75);
PlayTone(659,35);
Wait(37);
PlayTone(659,36);
Wait(38);
PlayTone(659,35);
Wait(75);
PlayTone(587,16);
Wait(18);
PlayTone(587,17);
Wait(19);
PlayTone(587,36);
Wait(38);
PlayTone(587,16);
Wait(18);
PlayTone(587,17);
Wait(19);
PlayTone(494,36);
Wait(38);
PlayTone(440,16);
Wait(18);
PlayTone(392,17);
Wait(19);
PlayTone(330,36);
Wait(38);
PlayTone(330,35);
Wait(37);
}
}

task kar(){
while(true){
OnFwd(OUT_B, 10);
Wait(3000);
Off(OUT_B);
OnRev(OUT_B, 10);
Wait(3000);
Off(OUT_B);
Wait(100);
}
}

task kiir(){
while(true){
ClearScreen();
TextOut(10, 60, "distance:");
NumOut(10, 50, SensorUS(IN_4));
TextOut(10, 40, "light:");
NumOut(10, 30, Sensor(IN_3));
Wait(300);
}
}

task movement()
{
SetSensorLight(IN_3);
SetSensor(IN_1,SENSOR_TOUCH);
SetSensorLowspeed(IN_4);
OnFwd(OUT_AC, 100);
while (true)
{
if (Sensor(IN_3) < THRESHOLD)
{
OnRev(OUT_AC, 75);
Wait(500);
Off(OUT_AC);
OnRev(OUT_A, 75);
Wait(1000);
until(Sensor(IN_3) >= THRESHOLD);
OnFwd(OUT_AC, 100);
}
if ((SensorUS(IN_4) < NEAR) || (SENSOR_1 == 1)){
OnRev(OUT_AC, 75);
Wait(500);
Off(OUT_AC);
OnRev(OUT_A, 75);
Wait(1000);
until((SensorUS(IN_4) >= NEAR) || (SENSOR_1 == 0));
OnFwd(OUT_AC, 100);
}
}
}

task main(){
Precedes(kiir, music, movement, kar);
}