Read the temperature from the TPA81 Sensor with Lego NXT 2.0

Discussion specific to NXT-G, NXC, NBC, RobotC, Lejos, and more.
warrocket94
Posts: 6
Joined: 09 Apr 2012, 21:31

Read the temperature from the TPA81 Sensor with Lego NXT 2.0

Post by warrocket94 »

Hi
i'm Davide and i bought the TPA81 three weeks ago. I would to use the sensor with my Lego Mindstorm NXT 2.0 and i would to read the temperature from the sensor. The hardware part is finished:
I use four pins of the TPA 81: I use Vcc +5V and i connect this pin to the green wire (+4,3V supply) of the Lego cable, then i connect the ground pins of the TPA81 to the red wire of the Lego cable. Then i connect the SCL pin of the TPA81 to the yellow wire of the Lego Cable and finally i connect the SDA pins of the TPA81 the blue wire of the lego cable. I use two 1.8k pull up resistor on the SDA and SCL lines. Is it a right connection to use TPA 81 Sensor?
I use NXC Language to programme the Lego Mindstorm and i use Bricx Command Center software but i can't programme the TPA81 because every time there are some File error. I see, in this forum, a topic that concern this argument but i don't understand very well. Is there someone that can write me the programme to read the temperature from TPA81 using NXC Language.

Thank you very much in advance.

Davide
mattallen37
Posts: 1818
Joined: 02 Oct 2010, 02:19
Location: Michigan USA
Contact:

Re: Read the temperature from the TPA81 Sensor with Lego NXT 2.0

Post by mattallen37 »

Due to the NXT HW setup, your pullups should be 82k instead of 1.8k. I personally have been able to use pullups in the range of 47k to 100k, and even 10k with varying degrees of success. However, 1.8k is far too strong. Other than that, your HW setup sounds fine.

Can you post your NXC code for us to see?
Matt
http://mattallen37.wordpress.com/

I'm all for gun control... that's why I use both hands when shooting ;)
warrocket94
Posts: 6
Joined: 09 Apr 2012, 21:31

Re: Read the temperature from the TPA81 Sensor with Lego NXT 2.0

Post by warrocket94 »

yes this is the code that i try but it's wrong!
//#define S1 1
//#define I2C_ADDR_DEFAULT 0xD0
//#define I2C_REG_CMD 0x11

//char ReadI2CRegister ( byte port,
// byte i2caddr,
// byte reg,
// byte & out
// ) [inline]

byte out;
char result;
byte CMD_Read[] = {0xD1, 0x11};
task main()
{
SetSensorType(S2, IN_TYPE_CUSTOM);
SetSensorMode(S2, IN_MODE_RAW);
while (I2CCheckStatus(S2) == STAT_COMM_PENDING);
do
{
result = ReadI2CRegister(0, 0xD0, 0x11, out);
//I2CWrite(S1, 2, CMD_Read); // Send the message
TextOut(1,LCD_LINE1,NumToStr(out));
TextOut(1,LCD_LINE2,NumToStr(result));
Wait(1000);
}
while(1);
}


the lcd lego display show me two values: "0" is the first value that the lcd lego display show me and the second value is "-32".. please help me to read the temperature!! :D
warrocket94
Posts: 6
Joined: 09 Apr 2012, 21:31

Re: Read the temperature from the TPA81 Sensor with Lego NXT 2.0

Post by warrocket94 »

Yeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeahhhhhhhhhhhhhhh!!!!!!!!!!!!!!!!!!!!!!!!!!!!! i read the temperature on the lcd lego display from the TPA81 using NXC language :D i use this code:
// READ TPA81
#define TPA81_PORT IN_1
#define TPA81_ADDR 0xD0

void MyI2CRead(byte port, byte addr, byte reg, byte cnt, byte& outbuf[])
{
byte cmdbuf[]; // register number holder
int loop;
byte nByteReady = 0;

ArrayBuild(cmdbuf, addr, reg);

loop = STAT_COMM_PENDING; //Wait until bus is free
while (loop == STAT_COMM_PENDING ){ // ''
loop = I2CStatus(port, nByteReady); // ''
} // ''

I2CBytes(port, cmdbuf, cnt, outbuf) //Read the registers
}

task main()
{
SetSensorLowspeed(TPA81_PORT);

byte inbuf[10];

while( 1 )
{
MyI2CRead(TPA81_PORT, TPA81_ADDR, 0, 10, inbuf);
NumOut( 0, LCD_LINE1, inbuf[5], DRAW_OPT_CLEAR_WHOLE_SCREEN );

}
}


I find this code into a topic in this forum and i try to use it. Then i download the code on my Lego Mindstorm NXT and on the lcd lego display is appeared some values ("17-20-21-22") and when i put a candle near the sensor those values change in 120-130-128-123 :D:D i'm very happy :D
mattallen37
Posts: 1818
Joined: 02 Oct 2010, 02:19
Location: Michigan USA
Contact:

Re: Read the temperature from the TPA81 Sensor with Lego NXT 2.0

Post by mattallen37 »

Cool, I'm glad you got it working!

BTW, here is the latest version of my I2C library:
MyI2C lib.nxc
(3.55 KiB) Downloaded 356 times
This version should be thread-safe.
Matt
http://mattallen37.wordpress.com/

I'm all for gun control... that's why I use both hands when shooting ;)
warrocket94
Posts: 6
Joined: 09 Apr 2012, 21:31

Re: Read the temperature from the TPA81 Sensor with Lego NXT 2.0

Post by warrocket94 »

Yes :) but the TPA81 has got 8 pixel to read the temperature. With this programme i read only one value of temperature but can i read the temperature of all eight pixel? How i can do it?
mattallen37
Posts: 1818
Joined: 02 Oct 2010, 02:19
Location: Michigan USA
Contact:

Re: Read the temperature from the TPA81 Sensor with Lego NXT 2.0

Post by mattallen37 »

Take a look at this page; it has a chart of all the I2C registers. The way you have your program setup, you are reading all 10 of them. According to your program, all the pixel data gets stored in the inbuf[] array, in elements 2 through 9. You are only displaying element 5 (pixel 4).

Try this:

Code: Select all

// READ TPA81
#define TPA81_PORT IN_1
#define TPA81_ADDR 0xD0

safecall void MyI2CRead(byte port, byte addr, byte reg, byte cnt, byte& outbuf[])
{
  byte cmdbuf[];                                                      // The buffer of data that will be sent
  byte nByteReady;                                                    // required for getting the status

  ArrayBuild(cmdbuf, addr, reg);                                      // Build the output buffer

  while (I2CStatus(port, nByteReady) ==  STAT_COMM_PENDING){Yield();} // Wait until bus is free

  I2CBytes(port, cmdbuf, cnt, outbuf)    //Read the registers

  while (I2CStatus(port, nByteReady) ==  STAT_COMM_PENDING){Yield();} // Wait until bus is free
}

task main()
{
  SetSensorLowspeed(TPA81_PORT);

  byte inbuf[10];

  while(true)
  {
    MyI2CRead(TPA81_PORT, TPA81_ADDR, 0, 10, inbuf);
    ClearScreen();
    for (int i = 0; i < 8; i ++){
      NumOut(0, LCD_LINE1 - (i*8), inbuf[i+2]);
    }
    Wait(50);
  }
}
BTW, it's helpful if you use code tags when posting code on forums:

Code: Select all

[code]
[/code]
Matt
http://mattallen37.wordpress.com/

I'm all for gun control... that's why I use both hands when shooting ;)
warrocket94
Posts: 6
Joined: 09 Apr 2012, 21:31

Re: Read the temperature from the TPA81 Sensor with Lego NXT 2.0

Post by warrocket94 »

yes this is great :D thank you very much but the sensitivity of tpa81 is low.... i put a candle in front of the sensor but only one value of the pixel increase...for example if i put a candle in front of the tpa81 the values that i see on the lcd lego display are: 25,21,31,65,103,21,23,26
why this?
mattallen37
Posts: 1818
Joined: 02 Oct 2010, 02:19
Location: Michigan USA
Contact:

Re: Read the temperature from the TPA81 Sensor with Lego NXT 2.0

Post by mattallen37 »

I have no experience with the sensor. All my knowledge of it came from that page I linked to.

It would be my guess though, that only two of the sensors are being effected (the 65 and the 103). Probably all the sensors (pixels) span a horizon. If you were to move the flame compared to the sensor, you would likely see the higher readings from some of the other sensors (pixels).
Matt
http://mattallen37.wordpress.com/

I'm all for gun control... that's why I use both hands when shooting ;)
warrocket94
Posts: 6
Joined: 09 Apr 2012, 21:31

Re: Read the temperature from the TPA81 Sensor with Lego NXT 2.0

Post by warrocket94 »

ok thank you very much... i have a last question to ask!? Can i open a topic in this forum to explain how built a TPA 81 sensor and how can you programme it with NXC. Because on the web there aren't examples in NXC
Post Reply

Who is online

Users browsing this forum: Semrush [Bot] and 13 guests