Sensoren
Aus Debacher-Wiki
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.

