MLX90640 and M5Fire/M5Stack
-
Hello,
I received my MLX90640 thermo cam and used this program to test it:
https://github.com/dtomyy/M5Stack-MLX90640-Thermal-Camera/blob/master/M5Stack-MLX90640-Thermal-Camera.inoI switched the debug level to verbose to see all errors and warnings.
I got some problems with the SD-card. This was ok because there is no SD-card inside M5Stack.09:42:54.222 -> [W][sd_diskio.cpp:137] sdCommand(): no token received 09:42:54.325 -> [W][sd_diskio.cpp:137] sdCommand(): no token received 09:42:54.431 -> [W][sd_diskio.cpp:471] ff_sd_initialize(): GO_IDLE_STATE failed 09:42:54.431 -> [E][sd_diskio.cpp:739] sdcard_mount(): f_mount failed 0x(3) 09:42:54.431 -> OK 09:42:54.431 -> M5.begin ok 09:42:54.431 -> Wire begin ok 09:42:54.814 -> M5Stack MLX90640 IR Camera 09:42:55.541 -> Parameter extraction failed 09:42:55.541 -> Error: Sensor did not ack 09:42:55.604 -> No ack read 09:42:55.605 -> No ack read 09:42:55.605 -> No ack readThe main problem started at this errorline "Parameter extraction failed". The program found the MLX90640 but it didn't read the data from the sensor correct. To comment the ack-check in MLX90640_I2CRead didn't work for me. I read this at https://forums.pimoroni.com/t/mlx90640-no-ack/8662/12
Can anyone help me? -
hello
you need update arduino-esp32 to the newest
see https://github.com/espressif/arduino-esp32 ,and test it
the sd card mount in M5.begin()
if you want init sd card, you can use M5.begin(true, false, true) instead M5.begin(), it will be ok -
Hello,
I continued testing and I found two problems:- It is necessary to take new arduino library. @heybin: Thanks.
- Problem with "MLX90640_I2CRead". I changed this in the function:
/* if (Wire.endTransmission(false) != 0) //Do not release bus { Serial.println("No ack read"); return (0); //Sensor did not ACK }*/ Wire.endTransmission(false);Now it worked for me.
-
Hello,
In the new arduino-esp32 library ,need to pay attention to in new IIC communication:- Wire.endTransmission(false) run ok will return 7, not 0
-
Hello heybin,
thank you for the information of the new return value from "Wire.end".Do you know why the second part in "MLX90640_I2CWrite" worked?
int MLX90640_I2CWrite(uint8_t _deviceAddress, unsigned int writeAddress, uint16_t data) { Wire.beginTransmission((uint8_t)_deviceAddress); Wire.write(writeAddress >> 8); //MSB Wire.write(writeAddress & 0xFF); //LSB Wire.write(data >> 8); //MSB Wire.write(data & 0xFF); //LSB if (Wire.endTransmission() != 0) { //Sensor did not ACK Serial.println("Error: Sensor did not ack"); return (-1); }I changed "MLX90640_I2CRead" to:
int MLX90640_I2CRead(uint8_t _deviceAddress, unsigned int startAddress, unsigned int nWordsRead, uint16_t *data) { //Caller passes number of 'unsigned ints to read', increase this to 'bytes to read' uint16_t bytesRemaining = nWordsRead * 2; //It doesn't look like sequential read works. Do we need to re-issue the address command each time? uint16_t dataSpot = 0; //Start at beginning of array //Setup a series of chunked I2C_BUFFER_LENGTH byte reads while (bytesRemaining > 0) { Wire.beginTransmission(_deviceAddress); Wire.write(startAddress >> 8); //MSB Wire.write(startAddress & 0xFF); //LSB if (Wire.endTransmission(false) != 7) //Do not release bus { Serial.println("No ack read"); return (0); //Sensor did not ACK } uint16_t numberOfBytesToRead = bytesRemaining; ... -
hello,
the return mean:typedef enum { I2C_ERROR_OK=0, I2C_ERROR_DEV, I2C_ERROR_ACK, I2C_ERROR_TIMEOUT, I2C_ERROR_BUS, I2C_ERROR_BUSY, I2C_ERROR_MEMORY, I2C_ERROR_CONTINUE, I2C_ERROR_NO_BEGIN } i2c_err_t;- when Wire.endTransmission() mean Wire.endTransmission(true), so success return I2C_ERROR_OK
- Wire.endTransmission(false) success return I2C_ERROR_CONTINUE
-
Hello,
thank you for the good explanation.