Der TPA81-PyroSensor ist ein Infrarot-Fernthermometer und kann die Temperatur (in Grad Celsius) von 8 nebeneinanderliegenden Punkten gleichzeitig messen. Das Messfenster ist ca. 41×6 Grad (je Pixel ca. 5×6 Grad). Der Wellenlängenbereich liegt bei 2um-22um. Laut Datenblatt kann man damit Personen, Kerzenflammen etc. in 2 Metern Abstand (bei einer Hintergrundtemperatur von 20 Grad) erkennen.
Der Sensor kann per I2C angesprochen werden und ist daher leicht an den Lego-NXT anschließbar. Die Schaltung ist sehr einfach. Für die 5V-Spannungversorgung nutzt man den 9V-Ausgang des NXT (weiss 9V schwarz Masse) und regelt mit einem Spanungsregler auf 5V herunter (LM2940 CT 5V + 2 Kondensatoren). Ich habe keine Pull-Up-Widerstände an SDA und SCL (mit den bekannten 82K-Widerständen hat es nicht funktioniert).
Auf dem Bild ist die Beschaltung gut zu sehen. Die Anschlüsse am TPA81 sind von unten nach oben:
- +5V
- SDA
- SCL
- nicht verbunden
- Masse
Man kan mit I2C 10 Bytes auslesen. Das erste enthält die SW-Revision und das zweite die Umgebungstemperatur in Grad Celsius. Dann folgen die 8 Messpunkte.
Hier ein Beispielprogramm in pbLua. Das sollte in anderen Sprachen ähnlich leicht sein.
-- test TPA81 on NXT -- 13.06.2013 -- pblua 2.0RC2 port = 1 i2cAddress = 0xD0 -- address of TPA81 inputType = 0x0B -- LOWSPEED_9V -- help functions function waitI2C(port) while( 0 ~= nxt.I2CGetStatus(port) ) do end end function delay(ticks) local t = nxt.TimerRead() repeat until(t+ticks < nxt.TimerRead() ) end -- init nxt.InputSetType(port, inputType) nxt.InputSetDir(port, 1, 1) -- digi0 and digi1 output nxt.InputSetState(port, 1, 1) -- 0 sets the pin of digi0 and digi1 high nxt.I2CInitPins(port) waitI2C(port) function readSensor() data = {} for i = 0,9 do i2cData = string.char(i2cAddress, i) nxt.I2CSendData(port, i2cData, 1) while( 0 ~= nxt.I2CGetStatus(port) ) do end s = nxt.I2CRecvData(port, 1) data[i] = string.byte(s,1,1) end return data end a = readSensor() print(string.format("Software-Revision: %2i", a[0])) print(string.format("Umgebungstemperatur: %2i Grad Celisius", a[1])) repeat a = readSensor() print(string.format("Sensorzeile: %2i %2i %2i %2i %2i %2i %2i %2i", a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9])) delay(500) until( 8 == nxt.ButtonRead() )