PIR Sensor TPA81 am NXT

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

TPA81

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() )