Sensoren

Aus Debacher-Wiki

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Weitere Möglichkeiten zur Ansteuerung der Sensoren

Alternativ zu den vielen SetSensor...-Befehlen kann man auch den allgemeinen Befehl SetSensor benutzen und den Sensor-Typ als Parameter angeben:

SetSensor(port, Konfiguration) konfiguriert den Sensor an port 

Für Konfiguration sind folgende Werte definiert:

SENSOR_TOUCH   
SENSOR_LIGHT
SENSOR_ROTATION
SENSOR_PULSE
SENSOR_EDGE

Genaugenommen ist es mit den Sensoren aber etwas komplizierter. Ihre Konfiguration besteht aus dem Sensor-Typ und dem Modus. Beim Lichtsensor z.B. muss man die Typen SENSOR_TYPE_LIGHT_ACTIVE und SENSOR_TYPE_LIGHT_INACTIVE unterscheiden, damit wird festgelegt, ob die Leuchtdiode eingeschaltet wird oder nicht. Es stehen folgende Typen zur Verfügung:

SENSOR_TYPE_TOUCH
SENSOR_TYPE_LIGHT_ACTIVE
SENSOR_TYPE_LIGHT_INACTIVE
SENSOR_TYPE_ROTATION
SENSOR_TYPE_SOUND_DB
SENSOR_TYPE_SOUND_DBA
SENSOR_TYPE_CUSTOM
SENSOR_TYPE_LOWSPEED


Beim Modus hat man dann generell die Wahl zwischen:

SENSOR_MODE_RAW      Roh-Werte zwischen 0 und 1023
SENSOR_MODE_BOOL     Logische Werte 0 bzw. 1
SENSOR_MODE_PERCENT  skalierte Werte von 0 bis 100
SENSOR_MODE_ROTATION skalierte Werte, 16 Schritte pro Umdrehung

In der Regel muss man also Typ und Modus setzen:

SetSensorType(S3, SENSOR_TYPE_LIGHT_ACTIVE);
SetSensorMode(S3, SENSOR_MODE_RAW);


Sensoren von HiTechnic

Von der Firma HiTechnic gibt es eine Reihe zusätzlicher Sensoren. Diese werden von den aktuellen NXC-Versionen direkt unterstützt, man kann aber auch einfach einen passenden Sensor-Typ auswählen.

Auslesen der Register

Die Sensoren der Firma HiTechnic verfügen über interne Register, in denen die gemessenen Werte zur Verfügung stehen. Die Inhalte der Register sind von Sensor zu Sensor unterschiedlich. Solange der Sensor von NXC direkt unterstützt wird ist die direkte Abfrage der Register auch nicht notwendig. Bei neuen Sensoren kann das folgende Listing beim Auslesen nützlich sein:

01 // Programm zum Auslesen der Register von I2C Sensoren
02 
03 byte bufLSWrite[] = {0x2, 0x42};
04 
05 task main()
06 {
07  byte outbuf[];
08  byte count;
09  bool result;
10
11  SetSensorLowspeed(S4);
12
13  while (true)
14  {
15    count = 6;
16    I2CBytes(S4, bufLSWrite, count, outbuf);
17    NumOut(10, LCD_LINE1, outbuf[0], true);
18    NumOut(10, LCD_LINE2, outbuf[1]);
19    NumOut(10, LCD_LINE3, outbuf[2]);
20    NumOut(10, LCD_LINE4, outbuf[3]);
21    NumOut(10, LCD_LINE5, outbuf[4]);
22    NumOut(10, LCD_LINE6, outbuf[5]);
23  }
24 }

In Zeile 03 wird hier ein Byte-Array mit zwei Bytes gefüllt. Das erste Byte gibt an, wieviele Bytes das Array beinhaltet und der Wert des zweiten Bytes gibt an, ab welchem Register gelesen werden soll.

Das Array wird dann mit dem Befehlt I2CBytes an den Sensor geschickt, der darauf das Byte-Array outbuf[] mit der gewünschten Anzahl an Registerinhalten füllt. Die Anzahl der zu lesenden Bytes darf hier nicht direkt als Zahlenkonstante angegeben werden, daher die Nutzung der Variablen count.

Der Kompass-Sensor

Der Sensor liefert Richtungs-Angaben im Bereich von 0° (Norden) bis 359°. Es ist aber darauf zu achten, dass er möglichst eben eingebaut wird, sonst ergeben sich unbrauchbare Werte.

// Nutzung des Kompass-Sensors von HiTechnic
task main()
{
 SetSensorLowspeed(S4);
 until(false)
 {
   NumOut(0, LCD_LINE1, SensorHTCompass(S4), true);
   Wait(100);
 }
}

Spricht man den Sensor an wie den Ultraschallsensor, so liefert er die Ergebnisse in 2Grad-Schritten, also einen Werte-Bereich von 0 bis 127. Das hängt damit zusammen, dass von den benötigten 9 Bit im Register 0x42 quasi die oberen Acht stehen und im Register 0x44 das unterste Bit.

Die wichtigsten Register dieses Sensors:

Adresse Typ Inhalt Anmerkung
0x00 - 0x07 Chars Version ²V1.23
0x08 - 0x0F Chars Hersteller HiTechnc
0x10 - 0x17 Chars Sensor-Typ Compass
0x41 Byte Mode 0x0: Messen 0x43: Kalibrierung
0x42 Byte Richtung auf 2° 0 bis 179
0x43 Byte fehlendes Bit 0 bzw. 1
0x44 - 0x45 Word Richtung low,high 0-359


Der Farb-Sensor

Der Farbsensor liefert im einfachsten Fall einen Wert zwischen 0 und 17, der dir Farbe beschreibt. Dabei sind einige der Werte einfach zuzuordnen:

00: Schwarz
02: Blau
04: Grün
05: Gelb
08: Rot
17: Weiß

Die restlichen Farbbeschreibungen ergeben sich aus dem Farbverlauf bzw. aus der Anleitung zum Sensor.

// Nutzung des Farb-Sensors von HiTechnic im Farb-Nummern Modus
task main()
{
 SetSensorLowspeed(S4);
 until(false)
 {
  NumOut(0, LCD_LINE1, SensorHTColorNum(S4), true);
  Wait(100);
 }
}

Der Sensor kann die Farbinformation aber auch genauer liefern:

// Nutzung des Farb-Sensors von HiTechnic

long num, r, g , b;
bool erg;

task main()
{
 SetSensorLowspeed(S4);
 until(false)
 {
  erg=ReadSensorHTColor(S4, num, r, g, b);
  NumOut(0, LCD_LINE1, erg, true);
  NumOut(0, LCD_LINE2, num);
  NumOut(0, LCD_LINE3, r);
  NumOut(0, LCD_LINE4, g);
  NumOut(0, LCD_LINE5, b);
  Wait(100);
 }
}

Über ReadSensorHTColor ergeben sich Farbnummern im Bereich von 0 bis 17 und Farbwerte im Bereich von jeweils 0 bis 100 (??).

Über ReadSensorNormalizedColor ergeben sich Farbnummern im Bereich von 0 bis 63 (s.u.) und Farbwerte im Bereich von 0 bis 255.

ReadSensorHTRawColor liefert nur die Farbwerte und die jeweils von 0 bis 65000.

Die wichtigsten Register dieses Sensors:

Adresse Typ Inhalt Anmerkung
0x00 - 0x07 Chars Version ²V1.23
0x08 - 0x0F Chars Hersteller HiTechnc
0x10 - 0x17 Chars Sensor-Typ Color
0x41 Byte Mode nicht benutzt
0x42 Byte Farbnummer 0 bis 17
0x43 Byte Rot-Anteil 0 bis 63 ?
0x44 Byte Grün-Anteil 0 bis 63 ?
0x45 Byte Blau-Anteil 0 bis 63 ?
0x46 - 0x47 Word Rot-Raw high,low
0x48 - 0x49 Word Grün-Raw high,low
0x4A - 0x4B Word Blau-Raw high,low
0x4C Byte Farb-Index 6 Bit, je zwei RGB, 0-63
0x4D Byte Rot normalisiert 0 bis 255
0x4E Byte Grün normalisiert 0 bis 255
0x4F Byte Blau normalisiert 0 bis 255


Der Beschleunigungssensor

Der Sensor misst die Beschleunigung in allen drei Raumachsen. Dabei ist die Zuordnung der Achsen folgendermaßen:

x: in Fahrtrichtung

y: links bzw. rechts

z: senkrecht zur Ebene

Der Wertebereich umfasst 10 Bit vorzeichenbehaftet, also theoretisch von -511 bis +512.

// Nutzung des Beschleunigungs-Sensors von HiTechnic

int x, y, z;
bool erg;

task main()
{
 SetSensorLowspeed(S4);
 until(false)
 {
  erg=ReadSensorHTAccel(S4, x, y, z);
  NumOut(0, LCD_LINE1, erg, true);
  NumOut(0, LCD_LINE3, x);
  NumOut(0, LCD_LINE4, y);
  NumOut(0, LCD_LINE5, z);
  Wait(100);
 }
}

Die wichtigsten Register dieses Sensors:

Adresse Typ Inhalt Anmerkung
0x00 - 0x07 Chars Version ²V1.1
0x08 - 0x0F Chars Hersteller HITECHNC
0x10 - 0x17 Chars Sensor-Typ Accel.
0x42 Byte x obere 8 Bit
0x43 Byte y obere 8 Bit
0x44 Byte z obere 8 Bit
0x45 Byte x untere 2 Bit
0x46 Byte y untere 2 Bit
0x47 Byte z untere 2 Bit


Der Gyro-Sensor

Im Unterschied zu den bisher beschriebenen zusätzlichen Sensoren ist der Gyro-Sensor keine I2C Sensor, sondern ein Sensor wie der mitgelieferte Schall-Sensor. Von daher ist die Abfrage der Messwerte auch entsprechend:

// Nutzung des Gyro-Sensors von HiTechnic

#define GYRO_OFFSET 4

task main()
{
 SetSensorHTGyro(S1);
 until(false)
 {
  NumOut(0, LCD_LINE1, SensorHTGyro(S1,GYRO_OFFSET), true);
  Wait(100);
 }
}

Die Messwerte sind zu interpretieren, als Änderung des Winkels pro Sekunde. Je schneller sich der Roboter also dreht, desto größer ist der Messwert.

Persönliche Werkzeuge