Код I2C работает на Mega 2560, но не на Uno и nano
Я недавно приобрел этот датчик частоты сердечных сокращений и пытался сделать это работает. Я использовал эту библиотеку MAX30100, которую нашел на Github. По какой-то причине, когда я использую любой из приведенных примеров, они, кажется, работают хорошо, когда я использую Mega2560, который у меня есть, но не на Uno или Nano. Это связано с процессором? Я так не думаю, потому что в README на Github упоминается, что они тестировали его на Uno. Но если это так, как мне изменить код, чтобы он работал с Uno и nano?
Пример кода, который я использовал:
// Этот пример можно использовать для проверки подключения и работы датчика
// проверьте файл README в корне репозитория, чтобы найти руководство по устранению неполадок в casem
// любой из запущенных тестов не проходит
#include <Wire.h>
#include "MAX30100.h"
MAX30100 sensor;
void setup()
{
Serial.begin(9600);
Serial.print("Initializing MAX30100..");
if (!sensor.begin()) {
Serial.print("FAILED: ");
uint8_t partId = sensor.getPartId();
if (partId == 0xff) {
Serial.println("I2C error");
} else {
Serial.print("wrong part ID 0x");
Serial.print(partId, HEX);
Serial.print(" (expected: 0x");
Serial.println(EXPECTED_PART_ID, HEX);
}
// Остановитесь здесь
for(;;);
} else {
Serial.println("Success");
}
Serial.print("Enabling HR/SPO2 mode..");
sensor.setMode(MAX30100_MODE_SPO2_HR);
Serial.println("done.");
Serial.print("Configuring LEDs biases to 50mA..");
sensor.setLedsCurrent(MAX30100_LED_CURR_50MA, MAX30100_LED_CURR_50MA);
Serial.println("done.");
delay(1000);
Serial.print("Lowering the current to 7.6mA..");
sensor.setLedsCurrent(MAX30100_LED_CURR_7_6MA, MAX30100_LED_CURR_7_6MA);
Serial.println("done.");
delay(1000);
Serial.print("Shutting down..");
sensor.shutdown();
Serial.println("done.");
delay(1000);
Serial.print("Resuming normal operation..");
sensor.resume();
delay(500);
Serial.println("done.");
uint32_t tsTempSampStart = millis();
Serial.print("Sampling die temperature..");
sensor.startTemperatureSampling();
while(!sensor.isTemperatureReady()) {
if (millis() - tsTempSampStart > 1000) {
Serial.println("ERROR: timeout");
// Остановитесь здесь
for(;;);
}
}
float temperature = sensor.retrieveTemperature();
Serial.print("done, temp=");
Serial.print(temperature);
Serial.println("C");
if (temperature < 5) {
Serial.println("WARNING: Temperature probe reported an odd value");
} else {
Serial.println("All test pass.");
}
Serial.println();
Serial.println("Press any key to go into sampling loop mode");
while (!Serial.available());
sensor.resetFifo();
}
void loop()
{
uint16_t ir, red;
sensor.update();
while (sensor.getRawValues(&ir, &red)) {
Serial.print("IR=");
Serial.print(ir);
Serial.print(" RED=");
Serial.println(red);
}
}
@Prateek Dhanuka, 👍0
Обсуждение1 ответ
Я добавил на плату подтягивающие резисторы, и она заработала. Оказалось, что платы были плохо спроектированы, и линии I2C были подтянуты до 1,8 В вместо Vin. После удаления подтягиваний и добавления подтягиваний к Вин схема заработала. Схема работала с Mega, потому что в ней есть встроенные подтягивающие резисторы.
И это можно сделать, потому что эти контакты могут быть подтянуты до 6 В (абсолютный максимум)., @KIIV
- Сколько соединений может создать метод Arduino I2C?
- Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?
- Arduino Uno: avrdude: stk500_recv(): программатор не отвечает
- В чем разница между delay() и delaymicroseconds()
- Программирование Arduino на Паскале?
- Отправка строки из RPi в Arduino - Рабочий код
- Сброс адреса I2c — MLX90614
- Как реализовать Arduino NANO в качестве адаптера RS-232 к USB (или нужен Arduino Mega?) Для связи с 3D принтером
Какой код вы используете? Пожалуйста, покажите нам. Также: Вы правильно подключили его? Насколько я помню, оборудование I2C находится на разных контактах для Uno/Nano и Mega., @chrisl
Также: Что не работает на Uno/Nano? Какая у вас ошибка? Вы проверили результат тестового примера библиотеки?, @chrisl
Я добавил пример, который я использовал в вопросе. Для соединений я просто подключил Vin к 3,3 В, SDA к SDA, SCL к SCL и GND к GND., @Prateek Dhanuka
Основное отличие состоит в том, что Arduino mega имеет подтягивающие резисторы на линиях SCL/SDA., @KIIV
Пожалуйста, протестируйте с тестовым примером библиотеки. Это может показать, какая именно проблема у нас здесь. Пробовали ли вы добавлять подтягивающие резисторы к линиям, как указано в разделе устранения неполадок в файле readme библиотек?, @chrisl