没有库的Arduino伺服

Posted

技术标签:

【中文标题】没有库的Arduino伺服【英文标题】:Arduino servo without library 【发布时间】:2018-03-01 18:38:06 【问题描述】:

作为发送数字信号的教育练习,我正在尝试在不使用servo.h 库的情况下为伺服编码脉冲序列。

舵机为 9g 微型舵机。硬件是正确的,因为许多使用servo.h 的示例都可以正常工作。

我有以下代码。问题是伺服系统会晃动 3 秒,而不是移动并保持静止。

void loop() 
    movePulse_1000();
    delay(3000);


void movePulse_1000()
    Serial.print("Start movePulse_1000()\t\t");
    for (int pulseCounter=0; pulseCounter<=150; pulseCounter++)
        digitalWrite(pinServo,LOW);
        delay(20); // between pulses
        digitalWrite(pinServo,HIGH);
        delayMicroseconds(1000);
    
    Serial.println("End movePulse_1000()");

【问题讨论】:

【参考方案1】:

使用模拟伺服,平均脉冲宽度必须相隔 1.5 毫秒,并且占空比根据所需位置而变化。要将伺服保持在您想要的位置,您必须不断刷新伺服数据。这不是一个超级简单的任务,而且伺服库已经非常优化。没有理由不使用它。

它创建硬件计时器并使用它们来刷新伺服系统。这使您的常规代码看起来会定期继续,即使它被伺服库中断以服务伺服。占空比、pwm 频率和刷新率都会发挥作用。您必须查看您正在使用的伺服器的数据表以获取完整的详细信息。但它并不像你想象的那么简单,而且你使用的那些延迟/延迟微函数并不总是足够精确。这就是为什么你会使用时间和溢出中断。虽然大多数伺服系统都不太挑剔,但你可以摆脱大量的垃圾。

【讨论】:

钻石:谢谢你的想法。我已经用其他语言完成了这项工作并且工作轻松。脉冲不是间隔20ms,脉冲持续时间1-2ms吗? akizukidenshi.com/download/ds/towerpro/SG90.pdf【参考方案2】:

servo.h 不断发送脉冲,这意味着伺服咆哮 = 电池消耗

我将您的功能更改为仅在没有计时器的情况下将伺服从 0 度旋转到 180 度。

del = (7 * x) +500; - 用于我的伺服脉冲 500 到 1260us(计算,未测量)

void movePulse(int x)
    int del=(7*x)+500;
    for (int pulseCounter=0; pulseCounter<=50; pulseCounter++)
        digitalWrite(pinServo,HIGH);
        delayMicroseconds(del);
        digitalWrite(pinServo,LOW);
        delay(20); // between pulses
    

【讨论】:

以上是关于没有库的Arduino伺服的主要内容,如果未能解决你的问题,请参考以下文章

Arduino伺服和红外遥控器

arduino伺服随机移动

GND伺服和Arduino

来自python的arduino自动伺服运动信号

arduino 用伺服电机中断

python和arduino之间的串行通信