Код 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);
    }
}

, 👍0

Обсуждение

Какой код вы используете? Пожалуйста, покажите нам. Также: Вы правильно подключили его? Насколько я помню, оборудование 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


1 ответ


1

Я добавил на плату подтягивающие резисторы, и она заработала. Оказалось, что платы были плохо спроектированы, и линии I2C были подтянуты до 1,8 В вместо Vin. После удаления подтягиваний и добавления подтягиваний к Вин схема заработала. Схема работала с Mega, потому что в ней есть встроенные подтягивающие резисторы.

,

И это можно сделать, потому что эти контакты могут быть подтянуты до 6 В (абсолютный максимум)., @KIIV