无需移动即可连接Arduino伺服

时间:2014-11-02 03:15:33

标签: arduino

我正在使用Arduino ServoTimer2库(因为我还需要在同一草图中使用VirtualWire库。我不知道常规{{3}中是否也存在此问题库,但我认为值得一提。

每当我调用servo.attach(pin)时,伺服从其当前位置移动到其范围的正中间(1500微秒)。这是一个问题,因为我的Arduino需要定期安装和拆卸伺服系统,然后重新设置回中心会失去我项目的目的。

我读到在servo.write(xxxx)之前立即调用servo.attach(pin)会导致它默认为xxxx而不是1500,但这对我来说似乎不起作用(我甚至不理解它是如何工作的如果引脚没有连接......)。有什么想法吗?

*

修改 我的解决方案

感谢djUniversal的回答,我让它工作,以便伺服在连接时不会移动。如果其他人想要做同样的事情,我所做的只是进入ServoTimer2.cpp并注释掉initISR方法的前3行。它现在看起来像这样:

static void initISR()
{
//    for(uint8_t i=1; i <= NBR_CHANNELS; i++) {  // channels start from 1
//        writeChan(i, DEFAULT_PULSE_WIDTH);  // store default values
//    }
    servos[FRAME_SYNC_INDEX].counter = FRAME_SYNC_DELAY;   // store the frame sync period

    Channel = 0;  // clear the channel index
    ISRCount = 0;  // clear the value of the ISR counter;

    /* setup for timer 2 */
    TIMSK2 = 0;  // disable interrupts
    TCCR2A = 0;  // normal counting mode
    TCCR2B = _BV(CS21); // set prescaler of 8
    TCNT2 = 0;     // clear the timer2 count
    TIFR2 = _BV(TOV2);  // clear pending interrupts;
    TIMSK2 =  _BV(TOIE2) ; // enable the overflow interrupt

    isStarted = true;  // flag to indicate this initialisation code has been executed
}

一旦我这样做并重新编译,伺服器在连接时立即停止移动,现在只有在写入时才会移动。

2 个答案:

答案 0 :(得分:2)

ServoTimer2定义了一个起始脉冲:

#define DEFAULT_PULSE_WIDTH  1500
.h文件中的

。每次伺服对象初始化时,它都被用作通道的起始点。常规的伺服库具有相同的机制。

如果你想做你想做的事,你需要修改库文件以满足你的需要,否则这是不可能的。

为什么你需要继续拆卸伺服系统?你有什么可以改变的吗?

答案 1 :(得分:0)

为完成此操作,对于标准伺服库,它可以使用先前值(来自EEPROM)初始化伺服器,并在其后附加引脚:

    // set servo to remembered position!
    servo_9.write(pos);
    // attach pin after position setting, so restarting from previous position
    servo_9.attach(9);