collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: MLX90614 com arduino leonardo  (Lida 6813 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.224
    • Clube de Robotica
MLX90614 com arduino leonardo
« em: 10 de Setembro de 2012, 14:38 »
arranjei um sensor termico  MLX90614 mas não estou a conseguir mete-lo a funcionar.
tentei com i2c como diz neste blog http://bildr.org/2011/02/mlx90614-arduino/ mas o codigo tem um erro:

MLX90614.cpp: In function 'void setup()':
MLX90614:10: error: 'PORTC4' was not declared in this scope
MLX90614:10: error: 'PORTC5' was not declared in this scope

tentei substituir isso por "SCL" e "SDA" ou simplesmente tirar essa parte do codigo o que resultou mais ao menos mas ao aponta-lo para um isqueiro deu-me 30ºC.
e agora nem da nada a serial port por alguma razão

o codigo é este:

#include <i2cmaster.h>

    unsigned int chama = 0;
    unsigned int apagar = 0;

void setup(){
   Serial.begin(9600);
   Serial.println("Setup...");
   
   i2c_init(); //Initialise the i2c bus
   PORTC = (1 << PORTC4) | (1 << PORTC5);//enable pullups
}
void loop (){
 termico();
}
void termico(){
 
    int dev = 0x5A<<1;
    int data_low = 0;
    int data_high = 0;
    int pec = 0;
   
    chama=0;
    apagar=0;
   
    i2c_start_wait(dev+I2C_WRITE);
    i2c_write(0x07);
   
    // read
    i2c_rep_start(dev+I2C_READ);
    data_low = i2c_readAck(); //Read 1 byte and then send ack
    data_high = i2c_readAck(); //Read 1 byte and then send ack
    pec = i2c_readNak();
    i2c_stop();
   
    //This converts high and low bytes together and processes temperature, MSB is a error bit and is ignored for temps
    double tempFactor = 0.02; // 0.02 degrees per LSB (measurement resolution of the MLX90614)
    double tempData = 0x0000; // zero out the data
    int frac; // data past the decimal point
   
    // This masks off the error bit of the high byte, then moves it left 8 bits and adds the low byte.
    tempData = (double)(((data_high & 0x007F) << 8) + data_low);
    tempData = (tempData * tempFactor)-0.01;
   
    float celcius = tempData - 273.15;

    Serial.print("Celcius: ");
    Serial.println(celcius);   
    delay(1000); // wait a second before printing again
   
    if (celcius > 50){
      chama=1;
    } 
}






tambem ha um modo de PWM neste sensor mas não sei como usar.

alguem me pode ajudar?
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: MLX90614 com arduino leonardo
« Responder #1 em: 10 de Setembro de 2012, 14:41 »
Apaga esta linha:
   PORTC = (1 << PORTC4) | (1 << PORTC5);//enable pullups

E certifica-te que tens pull-ups externos nas linhas SDA e SCL.
Avr fanboy

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.224
    • Clube de Robotica
Re: MLX90614 com arduino leonardo
« Responder #2 em: 10 de Setembro de 2012, 14:44 »
tenho sim. uma resistencia 4k7 no sda e outra no scl. ambos para os 3.3v

agora mesmo metendo assim a serial port nao da nada:

void loop (){
  Serial.print("inicio");
  termico();
  Serial.print("fim ");
}
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.768
Re: MLX90614 com arduino leonardo
« Responder #3 em: 10 de Setembro de 2012, 15:10 »
Para o Mega eu coloquei o MLX90614 a funcionar com este código base:

Código: [Seleccione]
#include <i2cmaster.h>


void setup(){
Serial.begin(9600);
Serial.println("Setup...");

i2c_init(); //Initialise the i2c bus
PORTD = (1 << PORTD0) | (1 << PORTD1);//enable pullups
}

void loop(){
    int dev = 0x5A<<1;
    int data_low = 0;
    int data_high = 0;
    int pec = 0;
   
    i2c_start_wait(dev+I2C_WRITE);
    i2c_write(0x07);
   
    // read
    i2c_rep_start(dev+I2C_READ);
    data_low = i2c_readAck(); //Read 1 byte and then send ack
    data_high = i2c_readAck(); //Read 1 byte and then send ack
    pec = i2c_readNak();
    i2c_stop();
   
    //This converts high and low bytes together and processes temperature, MSB is a error bit and is ignored for temps
    double tempFactor = 0.02; // 0.02 degrees per LSB (measurement resolution of the MLX90614)
    double tempData = 0x0000; // zero out the data
    int frac; // data past the decimal point
   
    // This masks off the error bit of the high byte, then moves it left 8 bits and adds the low byte.
    tempData = (double)(((data_high & 0x007F) << 8) + data_low);
    tempData = (tempData * tempFactor)-0.01;
   
    float celcius = tempData - 273.15;
    //float fahrenheit = (celcius*1.8) + 32;

    Serial.print("Celcius: ");
    Serial.println(celcius);

    //Serial.print("Fahrenheit: ");
    //sSerial.println(fahrenheit);

    delay(100); // wait a second before printing again
}

É só ver as Port do Leonardo na datasheet...

No uno com este código que coloquei julgo que também funcionava, mas já não me recordo ao certo.
Cumprimentos,
André Carvalho.

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.224
    • Clube de Robotica
Re: MLX90614 com arduino leonardo
« Responder #4 em: 10 de Setembro de 2012, 19:08 »
Para o Mega eu coloquei o MLX90614 a funcionar com este código base:

Código: [Seleccione]
#include <i2cmaster.h>


void setup(){
Serial.begin(9600);
Serial.println("Setup...");

i2c_init(); //Initialise the i2c bus
PORTD = (1 << PORTD0) | (1 << PORTD1);//enable pullups
}

void loop(){
    int dev = 0x5A<<1;
    int data_low = 0;
    int data_high = 0;
    int pec = 0;
   
    i2c_start_wait(dev+I2C_WRITE);
    i2c_write(0x07);
   
    // read
    i2c_rep_start(dev+I2C_READ);
    data_low = i2c_readAck(); //Read 1 byte and then send ack
    data_high = i2c_readAck(); //Read 1 byte and then send ack
    pec = i2c_readNak();
    i2c_stop();
   
    //This converts high and low bytes together and processes temperature, MSB is a error bit and is ignored for temps
    double tempFactor = 0.02; // 0.02 degrees per LSB (measurement resolution of the MLX90614)
    double tempData = 0x0000; // zero out the data
    int frac; // data past the decimal point
   
    // This masks off the error bit of the high byte, then moves it left 8 bits and adds the low byte.
    tempData = (double)(((data_high & 0x007F) << 8) + data_low);
    tempData = (tempData * tempFactor)-0.01;
   
    float celcius = tempData - 273.15;
    //float fahrenheit = (celcius*1.8) + 32;

    Serial.print("Celcius: ");
    Serial.println(celcius);

    //Serial.print("Fahrenheit: ");
    //sSerial.println(fahrenheit);

    delay(100); // wait a second before printing again
}

É só ver as Port do Leonardo na datasheet...

No uno com este código que coloquei julgo que também funcionava, mas já não me recordo ao certo.


parece ser igual ao meu excepto numa coisa que eu tentei fazer mas mal que eu nunca trabalhei com o arduino nem com esse tipo de linguagem.
tentei meter nos pullup D3 e D4 (ou que era agora nao me lembro de cor os numeros) em vez de PORT.
muito obrigado vou ver se testo
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: MLX90614 com arduino leonardo
« Responder #5 em: 10 de Setembro de 2012, 19:38 »
Ligar os pull-ups internos ou não, não fazem diferença, porque são fracos(na casa dos 50Kohms) e precisas de pull-ups de 10K ou menos para o i2c funcionar de maneira fiavel, logo não é por isso que não funciona.
Avr fanboy

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.224
    • Clube de Robotica
Re: MLX90614 com arduino leonardo
« Responder #6 em: 10 de Setembro de 2012, 19:54 »
mas no exemplo que vi tinha as resistencias e os pullups.
eu nem sei se é do sensor. de alguma forma o arduino nao faz nenhum print.

outra coisa eu tenho um diodo sem serie no negativo do sensor para impedir polaridade inversa. poderá isto fazer com que o sensor dê 30º a uma chama?
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: MLX90614 com arduino leonardo
« Responder #7 em: 10 de Setembro de 2012, 19:56 »
Eu não fazia isso, estás a levantar a referência de massa do sensor, assim quando o arduino poe um pino a zero o sensor vai ver pelo -0.7v o que muito provavelmente o vai queimar ou já queimou, se queres meter um diodo, metias no pino do vcc, mas acho isso desnecessário.
Avr fanboy

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.224
    • Clube de Robotica
Re: MLX90614 com arduino leonardo
« Responder #8 em: 10 de Setembro de 2012, 20:00 »
o problema é que agora nem sei o que se passa com o sensor. o arduino nao me da qualquer dado no monitor

eu meto no negativo porque se me enganar meto o 3.3V no ground
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: MLX90614 com arduino leonardo
« Responder #9 em: 10 de Setembro de 2012, 20:04 »
Então, tens de montar isso com atenção, porque se tens o diodo e lhe dás sinais negativos matas o sensor..
Avr fanboy

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.224
    • Clube de Robotica
Re: MLX90614 com arduino leonardo
« Responder #10 em: 10 de Setembro de 2012, 21:56 »
mas o diodo nao ira impedir a corrente se estiver oposta?
a queda de tensão do diodo pode fazer com que o sensor tenha falta de corrente?
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline zordlyon

  • Mini Robot
  • *
  • Mensagens: 1.768
Re: MLX90614 com arduino leonardo
« Responder #11 em: 10 de Setembro de 2012, 22:05 »
Eu na altura lidei com esses sensores e eles são muito precisos por acaso...

Em relação a diodo não usei diodo nenhum, montei o esquema desse blog que foi mencionado por si...

Tem que ter em atenção a pinagem, na altura o que fiz para nao me enganar foi com uma caneta de acetatos (cd's) marcar na parte de traz do sensor o + e -....

Cumprimentos,
André Carvalho.