Как считывать показания серводвигателя через последовательную связь?

Я новичок в последовательной связи. Я пытался заставить Arduino общаться с MATLAB, но определенные значения разрешены для приема, например 100 и 101. Я пробовал другие значения, но это не сработало. Проблема в коде ASCII, но я пытался вычесть то, что считывается 48, но не получилось.

Это код Arduino, который я нашел в Google и отредактировал для своей проблемы с серводвигателем:

#include <Servo.h>
const int servoPin = 3;
int recValue; // received value from MATLAB
Servo Servo1;

void setup()
{
  Serial.begin(9600);
  Servo1.attach(servoPin);
}

void loop()
{
  if (Serial.available() > 0)
  {
    recValue = Serial.read();
    if  (recValue == 100)
    {
      Servo1.write(0);
      delay(1000);
    }
    if (recValue == 101)
    {
      Servo1.write(90);
      delay(1000);
    }
  }
}

И как мне прочитать правильные углы, которые я получил от MATLAB через последовательную связь? Спасибо.

, 👍1


2 ответа


Лучший ответ:

1

Крисл совершенно прав. Вам нужно понять, как MATLAB общается с вашим Arduino. Я подозреваю, что он отправляет последовательность символов для каждого угла сервопривода вместо одного символа. В вашем коде вы ждете 100 и 101, которые являются символами ASCII 'd' и 'e', а затем действуете немедленно, как только прочитали один символ. Посмотрите, повернется ли сервопривод, если вы отправите 'd' или 'e'. Если это сработает, то вам нужно прочитать целую строку символов ASCII, например '9' (что равно 57) и '0' (что равно 48), за которыми следует разделитель, например, новая строка (13) В начале строки вы можете установить int angle = 0 и каждый раз, когда вы читаете символ, умножать свой угол на 10 и добавлять новое значение, вычитая из него 48. Достигнув ограничителя, вы можете отправить угол на сервопривод. О, и убедитесь, что MATLAB использует правильную скорость передачи данных.

,

0

Я предполагаю, что вы отправляете значение угла как 1-байтовое значение, так что никаких закодированных ASCII чисел. Вот как работает код в вашем вопросе, так что он должен быть правильным.

Здесь вам не нужно ничего преобразовывать. Функция Serial.read() уже возвращает целочисленное значение, и вы сохраняете его в целочисленной переменной. Но в вашем коде вас интересуют только 2 разных состояния (100 и 101) вместо фактического значения угла. Теперь вам нужно только заменить ваши операторы if и записать это значение непосредственно в сервопривод:

Servo1.write(recValue);

РЕДАКТИРОВАТЬ:

Похоже, вы не знаете, как работает последовательная связь (точнее, USART). Поэтому я объясню подробнее:

Данные, которые передаются по последовательному интерфейсу, представляют собой просто поток байтов. Весь передаваемый контент преобразуется в поток байтов. Каждый байт имеет числовое значение. Например, байт с битовым содержимым 00100000 имеет числовое значение 32. Но в какой-то момент истории возникла необходимость отправлять текст с помощью потока байтов. Поэтому кто-то изобрел ASCII, который назначает символ или команду управления каждому числовому значению от 0 до 127. Так что если вы отправляете байт с числовым значением 32, вы можете иметь в виду фактическое числовое значение 32, или вы можете иметь в виду эквивалент ASCII для 32, который является символом пробела. Это просто интерпретация байтовых данных, которые проходят через последовательный интерфейс.

Поэтому вам нужно выяснить, в каком виде вы кодируете значение угла. Если вы используете fwrite() в своем коде Matlab, вы, скорее всего, отправляете байтовое значение, которое можно просто использовать, как описано выше. Если вы используете fprintf(), вы отправляете значение угла в виде строки в кодировке ASCII. Значение 32 из приведенного выше примера будет занимать 2 байта с символами 3 и 2, которые соответствуют байтовым значениям 51 и 50. В этом случае вам следует добавить символ-разделитель в конце в fprintf() (например, символ новой строки "\n") и использовать Serial.parseInt(), чтобы получить значение угла из строки.

Вы можете прочитать больше об этом во многих руководствах по последовательной связи, которые вы можете найти в Интернете. Также обратитесь к примеру, который идет с Arduino IDE.

,