NXC lego color sensor

0

Witam wszystkich.
Mam pewien problem z zaprogramowaniem Lego Color Sensor(RGB). Zbudowałem pojazd mający za zadanie śledzić linię. W blokach NXT - G jest prosty sposób na zmienianie trybu czujnika z color na light. Nie mam pojęcia jak to wykonać w NXC(BricxCC). Potrzebuję aby sensor mierzył natężenie światła i zwracał je w postaci zmiennej, gdyż mój pomysł na line follower'a wygląda następująco:
Definiuję mu czarny, biały i czarno-biały kolor(krawędź linii). Ustawiam robota na zewnętrznej krawędzi toru. Jeśli sensor podaje czarno-biały, czyli krawędź, to jedzie prosto, jeśli biały, to skręca w prawo, jeśli czarny, to skręca w lewo. Napisałem prosty program używając funkcji koloru, ale to nie działa tak ja chcę, bo mam do dyspozycji tylko 2 stany : czarny i biały, dlatego bardzo mi zależy na odczycie natężenia światła z tego czujnika. :)

0

Ponawiam prośbę ;)

0

W zestawie powinieneś mieć instrukcje po polsku i opis jak programować Color Sensor. Większość z nas nie ma tej zabawki, czyli zwiedzą na jej temat tez jest kiepsko. Prawdopodobnie znalazło by się tylko parę osób, ale niekoniecznie są aktywne na forum.
Jeśli chcesz pomocy to:
Pokaż swój kod, z którym masz problem i równocześnie daj linka do dokumentacji zestawu (opis funkcji dostępnych przy programowaniu).
Wtedy większa ilość osób będzie wstanie ci pomóc.

edit: Wygooglane: http://botbench.com/blog/2011/02/16/robotc-using-the-nxt-2-0-colour-sensor/ tu wygląda na to, że sensor daje tylko określone wartości bez stopniowania jasności.

0

Więc tak, w zestawie mam instrukcję jak programować, ale w NXT - G, czyli za pomocą schematów blokowych, to umiem, wystarczy zaznaczyć w specjalnym programie tryb albo color albo light. Jednak jest mi potrzebny kod w NXC- specjalistyczny język do programowania NXT na wzór C.Tak w linku, który podałeś jest programowanie czujnika w trybie domyślnym - color i na dodatek nie w NXC.
Oto mój schemat kodu:
/* natężenie światła >80 - biały
natężenie światła <80 || >40 - czarny z białym(brzeg trasy)
natężenie światła <40 - czarny */

void brzeg1()
{
}

void brzeg2()
{
}

void brzeg3()
{
}

task main()
{
SetSensorColorFull(IN_3); // określam port sensora
//tutaj potrzebuję komendę/y na zmianę z trybu color na light
OnFwd(OUT_BC,100); // robot rozpoczyna jazdę to przodu z maksymalną mocą
while(true) // nieskończona pętla
{
if( /* tutaj potrzebuję komendę sprawdzającą, czy natężenie światła <40*/ )
{
brzeg1(); // przejście do funkcji brzeg1
}
if( /* tutaj potrzebuję komendę sprawdzającą, czy natężenie światła <80 || > 40*/ )
{
brzeg2(); // przejście do funkcji brzeg2
}
if( /* tutaj potrzebuję komendę sprawdzającą, czy natężenie światła >80*/ )
{
brzeg3(); // przejście do funkcji brzeg3
}

}

}
Chodzi mi o osiągnięcie efektu jak w , oglądając od 0:55. Został tam użyty czujnik koloru z trybem pomiaru światła, napisane w blokach, ja chcę to napisać w NXC. Na filmiku wyraźnie widać, że robot podświetla i śledzi krawędź, a nie linię.

0

Szukałem, próbowałem , no i w końcu przeniosłem się na RobotC. Udało mi się wykorzystać czujnik koloru jako światła, zrobiłem prosty program:

#pragma config(Sensor, S3, COLOUR, sensorCOLORRED)
#pragma config(Motor, motorB, prawy, tmotorNormal, PIDControl, reversed, encoder)
#pragma config(Motor, motorC, lewy, tmotorNormal, PIDControl, reversed, encoder)

const int czarny = 220;
const int bialy = 525;

int normalnapobieranie(int wartosc_raw)
{
if(wartosc_raw <= czarny)
return 0;

else if(wartosc_raw >= bialy)
return 100;

else
return((long)(wartosc_raw - czarny) * 100) / (bialy - czarny);
}

task main()
{
int wartosc_raw = 0;
int normalna = 0;
while(true)
{
wartosc_raw = SensorRaw[COLOUR];
normalna = normalnapobieranie (wartosc_raw);

if(normalna > 90)
{
  motor[lewy] =  20;
  motor[prawy] = -20;
}

else if(normalna < 10)
{
  motor[lewy] = -20;
  motor[prawy] = 20;
}
else
{
motor[lewy] = 40;
motor[prawy] = 40;
}

}
}

Możecie mi poradzić co mogę dodać do programu by jechał jak na załączonym linku powyżej od połowy filmu? wydaje mi się , że czas reakcji procesora jest dość niski i zanim zauważy zmianę światła, to już wyjedzie za daleko, więc mi się tak obija od tej linii z lewa na prawo.

0

#pragma config(Sensor, S2, lightSensor, sensorLightActive)
#pragma config(Sensor, S3, COLOUR, sensorCOLORRED)
#pragma config(Motor, motorB, prawy, tmotorNormal, PIDControl, reversed, encoder)
#pragma config(Motor, motorC, lewy, tmotorNormal, PIDControl, reversed, encoder)

const int czarny = 220;
const int bialy = 525;

int normalnapobieranie(int wartosc_raw)
{
if(wartosc_raw <= czarny)
return 0;

else if(wartosc_raw >= bialy)
return 100;

else
return((long)(wartosc_raw - czarny) * 100) / (bialy - czarny);
}

task main()
{
wait1Msec(50);
int wartosc_raw = 0;
int normalna = 0;
while(true)
{
wartosc_raw = SensorRaw[COLOUR];
normalna = normalnapobieranie (wartosc_raw);

 if(normalna<20 && SensorValue[lightSensor]<70)
 {
   motor[lewy] = 20;
   motor[prawy] = 20;       
 }
 else if(normalna<20)
 {
   motor[lewy] =  -50;
   motor[prawy] = 50;
 }
 else if(SensorValue[lightSensor]<70)
 {
   motor[lewy] = 50;
   motor[prawy] = -50;
 }
 else
 {
   motor[lewy] = 20;
   motor[prawy] = 20;
 }

}
}

Kupiłem 2 czujnik, gdyż nie udało mi się odpowiednio zaprogramować, by jechał odpowiednio szybko. Dla chętnych kod programu w RobotC jest powyżej. Temat do zamknięcia.

0

Sorry ze rozgrzebuje stary temat, jednak jeżeli ktoś ma podobny problem to wystarczy przejżeć dokumentację języka NXC i podstawowy plik źródłowy NXCDefs.h który zawiera najpotrzebniejsze funkcje dla mindstorms-ów, a dokładnie chodzi o te funkcję:
http://bricxcc.sourceforge.net/nbc/nxcdoc/nxcapi/group___input_module_functions_gaa01fe205f2303fd753ed8ec71d80ce99.html#gaa01fe205f2303fd753ed8ec71d80ce99</code>

1 użytkowników online, w tym zalogowanych: 0, gości: 1