Отправка данных о положении сервопривода с одного 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
}
}
@Cody Helms, 👍1
Обсуждение1 ответ
Да, отправка данных по последовательному каналу так же проста, как использование функции Serial.write()
или ее братьев и сестер. При отправке данных по последовательному каналу вы должны учитывать, как вы хотите их отправить.
- Необработанные двоичные данные: Вы можете просто использовать команду
Serial.write ()
, которая отправит переменную в виде двоичных данных. Если вы сделаете это на последовательном мониторе вашего ПК, вы не увидите читаемых чисел, потому что то, что там показано, интерпретируется как данные в кодировке ASCII, где каждое значение байта имеет соответствующий символ (например, значение 97-это буква "а"). На другом Arduino вы просто используетеSerial.read()
для записи байтовых данных непосредственно в переменную. Это практично, если вы отправляете всегда один и тот же объем данных (например, значение одного датчика). Если длина сообщения является переменной, необходимо использовать разделитель, чтобы отметить конец сообщения. Здесь второй способ более экономный. - Данные в кодировке ASCII: Вы можете отправлять свои данные, читаемые человеком, в виде данных в кодировке ASCII. Значение 128 тогда будет состоять из 3 байтов, по одному для каждого символа. Здесь вам всегда нужно использовать разделитель, чтобы получатель мог различать значения. Общим разделителем сообщений является символ новой строки "\n". В Windows у вас также часто есть новая строка и возврат каретки "\r" вместе. Для декодирования вы можете использовать одну из многих функций, которые преобразуют массив строк/символов в число с нужным форматом (в вашем случае целое число), например
atoi()
.
Обратитесь к последовательным примерам в среде IDE Arduino, чтобы увидеть код в действии.
Примечание: Поскольку значение pos
варьируется только от 0 до 180, вы можете использовать один байт для его сохранения и передачи вместо 2 байтов, используемых целым числом.
На самом деле этот простой двоичный метод ограничен не сообщениями фиксированной длины, а сообщениями из одного слова. Если вы хотите отправлять более длинные сообщения, *независимо от того, являются ли они фиксированной длиной или переменной*, вам нужен механизм для достижения по крайней мере *начальной* синхронизации, чтобы указать начало слова. Временной разрыв-самый слабый такой метод, зарезервированные или экранированные коды и т. Д. Более надежны, но сложны. Кодировка ASCII с разделителем (особенно новой строкой) действительно становится привлекательной и легко наблюдается в терминале., @Chris Stratton
- Как остановить серводвигатель в текущем положении при использовании последовательного порта? Я хочу, чтобы он оставался в одном положении при получении «0».
- Управлять 2 сервоприводами с последовательным считыванием
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Arduino как USB HID
- Serial1' was not declared in this scope
Как насчет того, чтобы просто отправить его по серийному номеру? Вы, кажется, уже решили, что хотите использовать 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