Передача данных с помощью APC 220
- Войдите на сайт для отправки комментариев
Втр, 24/09/2013 - 21:54
Отправляю данные с потенциометра
int pot = A0; int potVal; byte LSB; byte MSB; void setup() { pinMode(pot, INPUT); Serial.begin(57600); } void loop() { potVal = analogRead(pot); LSB = potVal & 0xff; MSB = (potVal >> 8) & 0xff; Serial.print("*"); Serial.write(LSB); Serial.write(MSB); delay (2); }
Обрабатываю переданные значения и управляю сервой
#include <Servo.h> Servo myservo; int potVal; byte LSB; byte MSB; void setup() { Serial.begin(57600); myservo.attach(9); } void loop() { if(Serial.available()>2) { char ch=Serial.read(); if(ch=='*'){ LSB = Serial.read(); MSB = Serial.read(); potVal = word(MSB, LSB); if(potVal>10 & potVal<100){ myservo.writeMicroseconds(600); delay (30); } else if( potVal>110 & potVal<600){ myservo.writeMicroseconds(1200); delay (80); } else if( potVal>700 & potVal<1000){ myservo.writeMicroseconds(2000); delay (120); } Serial.println(potVal); } } }
Наблюдаю следующее. Если в коде управления сервой нет delay() то в Serial с показаниями потенциометра всё нормально. В коде примера в Serial выскакивают большие цифры 31786, 10876. От чего это происходит и как с этим бороться. Нужно обеспечить вращение сервы с разной скоростью.
Что же вы все по одним и тем же граблям то ходите, уже третию тему с одной и той же проблемой заводите...
http://arduino.ru/forum/programmirovanie/opyat-vopros-po-serial
http://arduino.ru/forum/programmirovanie/peredacha-dannykh-s-pomoshchyu-apc-220
У вас все по прежнему переполняется буфер. Вы отправляете данные каждые 2 миллисекунды, а читаете в лучшем случае каждые 30. Куда деваются остальные пакеты? Правильно в буфер. Но так буфер не резиновый - он переполняется и вы получаете свои непонятные числа.
И вообще зачем там задержки и как вы ими хотите изменить скорость серв?
А как изменить скорость поворота сервы без использования задержек? Я не знаю
А как у вас в коде задержки влияют на скорость? Судя по коду никак.
Ну да, я буду использовать
Может можно использовать millis как в примере мигать без delay?
Ну так передавайте позиции для сервы с нужной задержкой.
Двигаюсь дальше. Вот базовый код. В дальнейшем буду его развивать, добавлять кнопки. Работает. Не показываю антидребезг.
На его основе код передатчика
Приёмник. Использую библиотеку VarSpeedServo. Можно изменять скорость отработки без задержек.
При переводе в положение POS серва игнорирует установленную скорость перевода и переходит на максимальной. В коде приёмника ничего придумать не могу. Пробовал в коде передатчика ввести таймер ( на примере мигаем без delay) и после отправления А=2 через 3 сек отправить А=0 - при нажатии кнопки POS сначала на долю секунды передаётся А=0, потом А=2 и через 3 сек снова А=0.
В базовом коде серва сначала медленно переходит в положение POS а потом управляется потенциометром.
Кусок кода с передатчика