Акселерометр (I2C) и Fona Shield (software serial) не работают вместе

Я использую шилд Fona 808 с Arduino Uno и акселерометром LSM303. Акселерометр подключен через I2C, а Fona использует программный последовательный порт.

Мой проект требует, чтобы акселерометр постоянно опрашивался и периодически общался с фоном. Я написал программу, которая просто использовала Fona, но как только я добавил код акселерометра, программа зависла на несколько секунд после открытия связи с Fona. Я тестировал отдельно акселерометр и фоновый экран, и они работают нормально. Итак, я написал еще одну меньшую (тестовую) программу (которая прилагается ниже), чтобы найти источник программы, которую я идентифицировал как:

fonaSerial->begin(4800);

fona.begin(*fonaSerial);

После добавления этих строк кода возникает проблема. Как я уже говорил, это то, что я вижу через несколько секунд после того, как связь с Фона была открыта. http://pasteboard.co/A16708fo3.png

Моя тестовая программа считывает значение с акселерометра, вычисляет величину ускорения и, если оно больше 20, печатает «Более 20», а также инициализирует последовательный порт Fona.

Мой вопрос: почему акселерометр (I2C) и Fona (Serial) не работают вместе и как это исправить?

Это очень срочно, поэтому мы будем очень признательны за быстрые ответы!

Мой код:

#include <Adafruit_FONA.h>
#include <Adafruit_Sensor.h>
#include <My2_Adafruit_LSM303_U.h>
#include <Wire.h>


#define FONA_RX 2
#define FONA_TX 3
#define FONA_RST 4


#include <SoftwareSerial.h>
SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);
SoftwareSerial *fonaSerial = &fonaSS;


Adafruit_FONA fona = Adafruit_FONA(FONA_RST);


volatile byte accelMagnitude;

Adafruit_LSM303_Accel_Unified accel = Adafruit_LSM303_Accel_Unified(54321);

void setup() {
  // put your setup code here, to run once:

    accel.begin();

    Serial.begin(115200);


    fonaSerial->begin(4800);
    fona.begin(*fonaSerial);

}


void ReadAccel(){

//Get a new accelerometer sensor event
  sensors_event_t event;
 // Serial.println(F("Accel---------"));
  accel.getEvent(&event);

  accelMagnitude = sqrt( sq(event.acceleration.x) + sq(event.acceleration.y) + sq(event.acceleration.z));

}


void loop() {
    // put your main code here, to run repeatedly:

    ReadAccel();

    if (accelMagnitude > 20){

        while (accelMagnitude > 20){

            Serial.println("waiting");
            ReadAccel();
        }

        Serial.println("Over 20");

    }
}

, 👍1

Обсуждение

Попробуйте добавить несколько дополнительных команд Serial.print, чтобы вы могли видеть, где программы зависают., @Gerben

Код работает нормально около 4 секунд после открытия связи с ATs, а затем просто полностью останавливается., @nford64

Откуда вы знаете, что это останавливается полностью? Возможно, акселерометр возвращает ложные данные, а код Arduino все еще работает нормально. Вот почему я предложил добавить дополнительные команды Serial.println. При отладке некоторого кода у меня иногда появляется Serial.println между каждой строкой кода, поэтому я точно знаю, где возникает проблема., @Gerben

Я добавил Serial.println("Привет"); в петлю. Привет печатается непрерывно, а затем останавливается через 4 секунды., @nford64

Ну вот вы немного сузили круг. Попробуйте добавить еще несколько команд и посмотрите, после какого именно оператора останавливается. Тем временем попробуйте изменить событие sensors_event_t на событие static Sensors_event_t. У меня есть ощущение, что, возможно, есть проблема с памятью., @Gerben

Я добавил статику, но ничего не изменилось. Я также добавил Serial.println("Пока"); в ReadAccel(); функция. Последнее слово, которое она печатает, это hello (это означает, что программа останавливается в функции ReadAccel())., @nford64

Что вы используете для питания цепи?, @Gerben

Кроме того, попробуйте добавить небольшую задержку в цикле и посмотрите, занимает ли она теперь более 4 секунд., @Gerben

Я использую литий-полимерный аккумулятор 3,7 В для питания схемы. Сначала я добавил задержку 100 мс, а затем 10 мс. Задержка в 100 мс работала около минуты. 10 мс вызвали ту же проблему, что и раньше, и как только я вернулся к задержке 100 мс, у меня снова возникла та же проблема, что и раньше., @nford64

У меня нет идей. Извини., @Gerben

Я снял статику и снова попробовал задержку. Кажется, теперь это работает. Почему это могло быть?, @nford64

Слишком мало свободной оперативной памяти? Слишком мало мощности (например, фонона подключается к сотовой сети через 4 секунды, а для передачи требуется много энергии)? Что-то другое?, @Gerben

Спасибо, Спасибо, Спасибо, Спасибо!!!!! Похоже, проблема в подключении к сотовой сети. Я добавил 10-секундную задержку перед запуском цикла, чтобы Fona могла подключиться к сети!, @nford64

Рад, что у тебя получилось. Но я все равно попытаюсь выяснить точную проблему, если вы можете. Это может появиться позже, например, когда вы попытаетесь отправить текстовое сообщение. Возможно добавление большого конденсатора к Vcc., @Gerben

У меня такая же проблема, я использую не акселерометр, а датчик RGB, который тоже работает через I2C. Я пришел к тому же решению: подождать некоторое время перед инициализацией I2C, но через случайное время он перезапустит Arduino., @Al Lz


1 ответ


1

Как предполагает Гербен, не рекомендуется просто добавлять отсрочку и заканчивать работу.

1) Установите большой электролитический конденсатор между Vcc и GND как можно ближе к FONA и

2) FONA имеет getNetworkStatus(); создайте небольшой цикл управления и опрашивайте его, пока не получите статус 1 или 5, в зависимости от того, в какой сети вы находитесь. Из примера FONA:

if (n == 0) Serial.println(F("Not registered"));
if (n == 1) Serial.println(F("Registered (home)"));
if (n == 2) Serial.println(F("Not registered (searching)"));
if (n == 3) Serial.println(F("Denied"));
if (n == 4) Serial.println(F("Unknown"));
if (n == 5) Serial.println(F("Registered roaming"));

А затем приступайте к остальной части вашего кода. Вы можете выполнить дополнительные проверки качества сигнала с помощью getRSSI();

,