Как связаться с датчиком через порты RX/TX Arduino?
У меня есть датчик, который обменивается данными через последовательную связь. Датчики CTi TILT-05. Он передает строку ASCII с данными, разделенными запятыми. Я хочу иметь возможность читать входящие данные ASCII в последовательном мониторе Arduino IDE в режиме реального времени (устройство представляет собой акселерометр).
Я изо всех сил пытаюсь передать это в коде. В настоящее время у меня есть RX датчика, подключенный к порту TX Arduino Uno (цифровой 1) и датчик TX-> Arduino RX (цифровой 0). Датчик питается и заземляется через Arduino.
Я искал методы последовательной связи, но не нашел ни одного работающего. Как я могу получить и интерпретировать поступающие данные от датчика?
@F Young, 👍2
2 ответа
Лучший ответ:
Вы не упомянули марку датчика или его техническое описание, так что это будет очень общий ответ на проблему.
Во-первых, то, как вы сейчас подключаете датчик, должно просто передавать информацию в последовательный монитор Arduino IDE без какого-либо кода на Arduino.
Какова скорость передачи данных и каким образом последовательный порт выходит из датчика?
Если вы хотите интерпретировать данные по мере их поступления, вам следует использовать последовательное программное обеспечение, поскольку вы не можете передавать информацию на ПК с помощью линий RX TX Arduino, подключенных к чему-то другому.
Что вы можете сделать, описано ниже (Непроверено):
#include <SoftwareSerial.h>
SoftwareSerial mySer(3, 4); //Прием TX
//это символьная область, потому что она из Serial
char accel[3] = {'0'};
uint8_t place = 0;
// массив для печати синхронно с массивом значений акселерометра
const char* SerialText[3] = {
"\nX Axis: ",
"\nY Axis: ",
"\nZ Axis: ",
};
char inData = '0';
char separator = ','; // разделитель, который вы описали
void setup(){
//устанавливаем нормальную скорость, мой для примера
Serial.begin(9600);
mySer.begin(9600);
}//~ завершение настройки
void loop(){
if(mySer.available()){
inData = mySer.read(); // получаем значение в момент наличия последовательных данных
if(inData != separator){
accel[place] = inData;
Serial.print(SerialText[place]); // распечатываем идентификатор текущих значений
Serial.print(accel[place]); // печатаем значение
place++; // увеличиваем для следующего раза
}
}
if(place >= 3) place = 0;
}//~ конец цикла
Вышеприведенный результат дает этот вывод на данный момент с вводом $CSACC,-0156.4,-0226.3,+0981.2*49
X Axis: $
Y Axis: C
Z Axis: S
X Axis: A
Y Axis: C
Z Axis: C
X Axis:
Y Axis: -
Z Axis:
X Axis: 0
Y Axis: 1
Z Axis: 5
X Axis: 6
Y Axis: .
Z Axis: 4
X Axis:
Y Axis: -
Z Axis:
X Axis: 0
Y Axis: 2
Z Axis: 2
X Axis: 6
Y Axis: .
Z Axis: 3
X Axis: +
Y Axis: 0
Z Axis: 9
X Axis: 8
Y Axis: 1
Z Axis: .
X Axis: 2
Y Axis: *
Z Axis: 4
X Axis: 9
Y Axis:
Z Axis:
X Axis:
Код не фильтрует это должным образом, но является ступенькой. Я обновлю его, чтобы он работал правильно, когда у меня будет такая возможность.
С помощью RSM мне удалось полунадежно передать показания датчика на последовательный монитор. Мне еще предстоит припаять разъемы к датчику, и я просто занимаюсь прототипированием (по сути, я просто прижимаю провод к выходному отверстию датчика), что ненадежно. Я считаю, что как только я припаю несколько разъемов к выходу, выход станет намного надежнее. Для тех, кто ищет, этот код мне помог.
Цифровые контакты 3/4 функционируют как контакты RX/TX соответственно. Подключите TX вашего датчика к RX (3) Arduino и аналогично для TX. Я использовал скорость передачи данных 115200 бод, но вы можете изменить ее на любую, которая работает в коде. Это просто упрощение кода RSM из его предыдущего ответа, и все похвалы и похвалы принадлежат ему.
#include <SoftwareSerial.h>
SoftwareSerial mySer(3, 4);
char inData = '0';
void setup(){
Serial.begin(115200);
mySer.begin(115200);
}
void loop(){
if(mySer.available()){
inData = mySer.read();
Serial.print(inData);
}
}
- Последовательная связь между ESP8266 и Arduino Uno
- В чем разница между акселерометром, гироскопом и датчиком магнитометра?
- Лазерный датчик ToF (VL53L0X) не работает
- Программирование Arduino Micro через RX/TX
- Serial Comm. проблема синхронизации между Arduino и Pyserial
- Как получить ненулевой выход из HX711 и ячейки загрузки?
- Когда дело доходит до связи UART-RS485, в чем разница между модулем "MAX485" и модулем "HW-0519"?
- Двоичный в десятичный с использованием побитовых операторов
Есть и другие способы, но я добавлю некоторую информацию позже, если понадобится, или после разъяснений ОП., @RSM
Привет! Большое спасибо за попытку помочь. Для пояснения: это датчик, который я пытаюсь использовать: http://ctisensors.com/wp-content/uploads/2016/03/TILT-05-Datasheet-01b.pdf. Он передает строку ASCII со скоростью 115200 бод. Я пробовал ваш код, но обнаружил несколько ошибок, в первую очередь: ошибка: массив должен быть инициализирован с помощью инициализатора, заключенного в фигурные скобки. символ ускорения [3] = 0;, @F Young
@FYoung спасибо за информацию о датчике, я исправлю свой ответ, а также исправлю ошибку в коде., @RSM
В качестве примечания: поскольку устройство использует NMEA 0183, вот ссылка на способ [хорошо разделить его](http://kingtidesailing.blogspot.co.za/2015/09/how-to-connect-any-nmea). -0183-device-to.html), @RSM