Акселерометр (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");
}
}
@nford64, 👍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();
- Как использовать I2C от Arduino Uno, когда у меня установлен GSM-shield?
- Проблемы с зеленым портом TWI (I2C) на Arduino Braccio Shield
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- AT-команда не отвечает на последовательный монитор
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Получить данные с сайта с помощью ESP8266 с помощью AT-команд
- SD-карта не инициализируется
Попробуйте добавить несколько дополнительных команд 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