Отправка данных о положении сервопривода с одного Arduino на другой

Я пытаюсь получить данные о местоположении, полученные с помощью этого сервопривода, и отправить их по последовательному каналу на другой Arduino. Данные о местоположении хранятся в виде pos в коде, который я включил, каков был бы наилучший метод для этого?

/* Sweep
 by BARRAGAN <http://barraganstudio.com>
 This example code is in the public domain.

 modified 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Sweep
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

, 👍1

Обсуждение

Как насчет того, чтобы просто отправить его по серийному номеру? Вы, кажется, уже решили, что хотите использовать serial, так почему бы вам просто не сделать это? Есть ли какая-то конкретная проблема?, @chrisl

будет ли это просто базовая команда serial.read() и serial.write?, @Cody Helms

Да, это все, что вам нужно. Вы будете посылать два байта, так что принимающей стороне придется иметь дело с этим., @CrossRoads

вы опубликовали код, который не имеет ничего общего с вашим вопросом ... ваш вопрос касается отправки данных с одного arduino на другой arduino ... вы опубликовали код, который позиционирует сервопривод, @jsotola

При использовании байтов для определения местоположения (0-180 градусов) вы можете просто использовать: myservo.write(pos);myserial.write(pos); и на принимающей стороне myservo.write(receivedValue); (проверьте некоторые учебные пособия о том, как получить значение., @Paul

@jstolat - нет, как ясно сказано в вопросе, они хотят добавить связь в предоставленный код. Это очень важно, так как это отправная точка., @Chris Stratton


1 ответ


0

Да, отправка данных по последовательному каналу так же проста, как использование функции Serial.write() или ее братьев и сестер. При отправке данных по последовательному каналу вы должны учитывать, как вы хотите их отправить.

  1. Необработанные двоичные данные: Вы можете просто использовать команду Serial.write (), которая отправит переменную в виде двоичных данных. Если вы сделаете это на последовательном мониторе вашего ПК, вы не увидите читаемых чисел, потому что то, что там показано, интерпретируется как данные в кодировке ASCII, где каждое значение байта имеет соответствующий символ (например, значение 97-это буква "а"). На другом Arduino вы просто используете Serial.read() для записи байтовых данных непосредственно в переменную. Это практично, если вы отправляете всегда один и тот же объем данных (например, значение одного датчика). Если длина сообщения является переменной, необходимо использовать разделитель, чтобы отметить конец сообщения. Здесь второй способ более экономный.
  2. Данные в кодировке ASCII: Вы можете отправлять свои данные, читаемые человеком, в виде данных в кодировке ASCII. Значение 128 тогда будет состоять из 3 байтов, по одному для каждого символа. Здесь вам всегда нужно использовать разделитель, чтобы получатель мог различать значения. Общим разделителем сообщений является символ новой строки "\n". В Windows у вас также часто есть новая строка и возврат каретки "\r" вместе. Для декодирования вы можете использовать одну из многих функций, которые преобразуют массив строк/символов в число с нужным форматом (в вашем случае целое число), например atoi().

Обратитесь к последовательным примерам в среде IDE Arduino, чтобы увидеть код в действии.

Примечание: Поскольку значение pos варьируется только от 0 до 180, вы можете использовать один байт для его сохранения и передачи вместо 2 байтов, используемых целым числом.

,

На самом деле этот простой двоичный метод ограничен не сообщениями фиксированной длины, а сообщениями из одного слова. Если вы хотите отправлять более длинные сообщения, *независимо от того, являются ли они фиксированной длиной или переменной*, вам нужен механизм для достижения по крайней мере *начальной* синхронизации, чтобы указать начало слова. Временной разрыв-самый слабый такой метод, зарезервированные или экранированные коды и т. Д. Более надежны, но сложны. Кодировка ASCII с разделителем (особенно новой строкой) действительно становится привлекательной и легко наблюдается в терминале., @Chris Stratton