Проблема отладки с использованием сервы
- Войдите на сайт для отправки комментариев
Доброго дня!
При использовании типового примера Knob (единственное добавил Serial.println(val);) при открытии монитора порта начинают вываливаться ошибки:
Error inside Serial.serialEvent()
java.io.IOException: Bad file descriptor in nativeavailable
at gnu.io.RXTXPort.nativeavailable(Native Method)
at gnu.io.RXTXPort$SerialInputStream.available(RXTXPort.java:1532)
at processing.app.Serial.serialEvent(Serial.java:215)
at gnu.io.RXTXPort.sendEvent(RXTXPort.java:732)
at gnu.io.RXTXPort.eventLoop(Native Method)
at gnu.io.RXTXPort$MonitorThread.run(RXTXPort.java:1575)
На самом деле по проблеме видел две ветки форума - английского и русского, но все что мог вытащить это что может быть замыкается земля с портом на 3 вольта. Как такое возможно для меня вне понимания.
Вообще если крутить потенциоментр, серва слушается, но сам факт вываливающихся ошибок и невозможности отладки пугает. Так же если контакт с потенциометром теряется, серва начинает сама крутится - сразу до упора в одну сторону, в другую до упора рывками.
Схему подключения использовал ту же что и на офф сайте: http://arduino.cc/it/Tutorial/Knob
Ах да, у меня freeduino 2009 (328 контролер) - аналог Arduino Duemilanove.
Как я подключаю (Слева фридуино, справа макетная плата с установленой на ней потенциометром, сверху серва):
А вы точно ничего не подключайте к цифровым 0(RX) и 1(TX) выводам?
Первый обзац последнее предложение: arduino.ru/Reference/Serial
А из стпндартных примеров AnalogReadSerial работает?
питания на серво отключите, когда sketch заливаете
Те порты что помечены как TX и RX я точно не использую, собственно все как на нарисованой мною схеме. Единственное чего не нарисовал - воткнутый USB.
Вообще в других ситуациях все нормально - к примеру писал код что бы потенциометр влиял на яркость светодиода и выводил в монитор - все выходило. Использовал тот же аналоговый порт 0 что и в примере AnalogReadSerial
питания на серво отключите, когда sketch заливаете
Перед заливкой выдергивал из макетной платы провод на + к серве , после "Доне уплоад" втыкал - тоже самое. Кстати без подключенной сервы ошибок нет но и в мониторе пусто.
На текущий момент использую такой код (в ходе попыток исправления ошибки правил типовой):
#include <Servo.h>
Servo myservo; // Создаем объект серво
int potpin = 0; // Порт потенциометра (крутилка)
void setup()
{
myservo.attach(9); // Добавляем серву на 9 порт
}
// ГЛАВНЫЙ ЦИКЛ
void loop()
{
int val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val);
Serial.println(myservo.read());
//myservo.write(val); // sets the servo position according to the scaled value
delay(100); // waits for the servo to get there
}
Добавьте в функцию void setup() строку Serial.begin(9600);
А с такой задержкой "delay(100);" серва случайно не дергается?
Большое спасибо Максим! Действительно Serial.begin(9600); помог. Но как только потенциометр теряет контакт (к сожалению часто - к макетной его приходится с силой прижимать, не садится в нее), сразу повторяется ошибка как в посте 0, и далее только резет. Но это наверное уже норма. Подозреваю что запитка потенциометра от внешнего источника может решить проблему.
Нет, не дергается. Вернее дергается но малозаметно. Я специально ставлю такую задержку что бы легче отлаживать было.
Нет, запитка сервы от более мощного источника должна помочь, но никак не потенциометра. Скорее всего когда отваливается потециометр, серва пытается резко дернуться и сажает общее питание.
Спасибо - не знал этого. Батарейки кстати на 1.5 v , а серве нужно 5. Т.е. нужно искать спец. акк. на 5v?
Нет, не нужно, сервы работают в среднем от минимального напряжения 3в - 4,8в и до максимального 6в - 7,2в, возьмите 4 батарейки по 1,5в, соедените их последовательно и тогда у вас будет 6в.
И обязательно соедените минус сервы с минусом(GND) дуины.