управление электродвигателем по RS232

Имеется Arduino плата на Atmega328 с платой управления двумя электродвигателями (L298N Shield). Ниже я навожу пример скетча для оживления данной конструкции:
// motor A
int dir1PinA = 13;
int dir2PinA = 12;
int speedPinA = 10;
// motor B
int dir1PinB = 11;
int dir2PinB = 8;
int speedPinB = 9;
unsigned long time;
int speed;
int dir;
void setup() {
pinMode(dir1PinA, OUTPUT);
pinMode(dir2PinA, OUTPUT);
pinMode(speedPinA, OUTPUT);
pinMode(dir1PinB, OUTPUT);
pinMode(dir2PinB, OUTPUT);
pinMode(speedPinB, OUTPUT);
time = millis();
speed = 0;
dir = 1;
}
void loop() {
analogWrite(speedPinA, speed);
analogWrite(speedPinB, 255 - speed);
// set direction
if (1 == dir) {
digitalWrite(dir1PinA, LOW);
digitalWrite(dir2PinA, HIGH);
digitalWrite(dir1PinB, HIGH);
digitalWrite(dir2PinB, LOW);
} else {
digitalWrite(dir1PinA, HIGH);
digitalWrite(dir2PinA, LOW);
digitalWrite(dir1PinB, LOW);
digitalWrite(dir2PinB, HIGH);
}
if (millis() - time > 5000) {
time = millis();
speed += 20;
if (speed > 255) {
speed = 0;
}
if (1 == dir) {
dir = 0;
} else {
dir =1;
}
}
}

Вопрос состоит в следующем: как управлять электродвигателем извне? Т.е передавать информацию о частоте и направлении вращения двигателей по последовательному каналу связи (RS232). Проще говоря — задавать параметр speed и dir , в выше приведенном листинге, по RS232.
Я пробовал непосредственно использовать функцию Serial.Read(), но, видимо, неправильно использовал.

Комментарии (1)

RSS свернуть / развернуть
+
0
я так понимаю, основная проблема — это считать данные из COM-порта.
Предлагаю освежить в памяти — функции ардуиновского класса Serial
Как видим, функция
Serial.read();
возвращает нам один байт (один символ (char)) из COM-порта.
Если вам хватит одного байта для хранения скорости, то формат данных может быть такой:
SBYTE DBYTE
где S и D — просто символы для большей ясности — можно и без них, выдавая в последовательный порт просто два байта.
Например, первый будет содержать скорость, а второй направление. (или три байта — 2 байта скорости и 1 направление).
В случае пакета из 2 байтов, код может быть таким:

if( Serial.available() ) {
    speed = Serial.read();  
    dir = Serial.read(); 
}
тут необходимо обратить внимание на то, что передаётся в COM-порт.
Я с этим столкнулся при написании программы для управления портами Arduino.
avatar

admin

  • 27 марта 2010, 09:36

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.