arduino就是一块神奇的板子,为嘛神奇,因为外行也能用它作出不可思议的东西。 下面先介绍一下如何使用arduino控制舵机,最终实现接电话开门的动作。

材料

  • 板子,某宝可入正版,90大洋能搞定。
  • 舵机,10大洋以内可入。长这样,上面装了个桨。

servo

入门

  • 先把板子和电脑用自带的USB连上,因为驱动的东西不多,就直接使用USB供电了。
  • 下载安装arduino IDE, windows,mac,linux版本都有,只需在官网下载即可使用。
  • IDE提供了很多示例程序,直接拿过来使用,稍微修改一下就能直接上传到板子使用,很方便。
  • IDE也提供了串口通讯监视器,可直接发送数据给arduino,也可以接收arduino输出的数据,为调试提供了很大的便利。
  • 要注意个地方在于,linux下的权限问题, 串口通讯需要往串口输入数据的权限,采用下面的命令修改权限

    sudo usermod -a -G dialout username 
    sudo chmod a+rw /dev/ttyACM0
    

    /dev/ttyACM0 就是arduino设备

    其他的资料基本可以自行脑补,就不多敷述了。

连接线路

普通舵机有三根线:GND(黑,接地)、VCC(红,电源)、Signal(黄,信号) 接线如下:

servo

GND表示ground的意思,接地; vcc 接5v电源; signal 接9号针脚。

测试

arduino IDE自带了很多示例,选一个舵机的示例测试一下,打开 arduino ide -> 文件 -> 示例 -> 第三方示例 -> Servo -> sweep 源码如下:

/* Sweep
 by BARRAGAN <http://barraganstudio.com>
 This example code is in the public domain.

 modified 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Sweep
*/

#include <Servo.h>

// 创建一个servo(舵机)控制对象
Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

// 储存舵机位置
int pos = 0;    // variable to store the servo position

// 初始化
void setup() {
  // 绑定myservo到9号针脚,后面只能通过9号针脚控制myservo
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

// 死循环
void loop() {
  // 从0转到180度
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  
  // 从180度转到0度
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

如上,arduino 控制程序主要只有两个方法,setup和loop。 setup初始化一些东西, 比如绑定舵机到9号针脚。 在loop里面实现控制程序。

arduino从一启动先执行setup,然后进入loop死循环,所以loop才是主战场。

控制两个舵机,实现开门

接电话分三个动作:

  • 接 - 拿起电话,放电话的槽中有个按钮会弹起来,从而接通
  • 按 - 右侧边有个开门的按钮, 按下去,会把门打开
  • 挂 - 把电话挂掉,把第一步的那个按钮按下去

如下图摆放(做的很粗糙,拍照技术也渣),

左側phoneServo否则接电话和挂电话, 右側unlockServo负责开门。 phoneServo需要先初始化为90度,把按钮按下去; unlockServo初始化为0度。

servo

流程清楚了,程序也很简单,顺便加了串口通讯在里面。如下:

/**
 * servo control program
 * 
 * @author dongyado<dongyado@gmail.com>
 */

#include<Servo.h>

Servo unlockServo; // 开门舵机
Servo phoneServo;  // 电话舵机

int pos = 0;

int maxPhonePos  = 90; // phoneServe最大角度
int maxUnlockPos = 30; // unlockServe最大角度

String comdata = ""; // 存储接收的指令

void setup() {
  
    Serial.begin(9600); // 监听串口,波特率9600
    
    // connect 
    unlockServo.attach(9);
    phoneServo.attach(10);
  
    //reset
    unlockServo.write(0);
    phoneServo.write(maxPhonePos);
    
    delay(200); // 延时是为了等待舵机转动完成
    
    // disconnect
    unlockServo.detach();
    phoneServo.detach();
}

void loop() {

    //接收串口发来的数据
    while (Serial.available() > 0)  
    {
        comdata += char(Serial.read());
        delay(10);
    }
    
    // 接收到数据
    if (comdata.length() > 0)
    {
        // connect 
        unlockServo.attach(9);
        phoneServo.attach(10);

        // 判断指令
        if (comdata == "open" || comdata == "1" ) {
            
            // get the phone up 
            for (pos = maxPhonePos; pos >= 1; pos -=1 ){
              phoneServo.write(pos);
              delay(10);  
            }

            delay(500);
            
            // press the button of open door
            for (pos = 1; pos < maxUnlockPos; pos+=1) {
                unlockServo.write(pos);
                delay(10);
            }

            delay(200);

            //release the unlock button
            for (pos = maxUnlockPos; pos >= 1; pos -=1 ){
              unlockServo.write(pos);
              delay(10);  
            }

            // get the phone down            
            for (pos = 1; pos < maxPhonePos; pos+=1) {
                phoneServo.write(pos);
                delay(10);
            }
        }

        //Serial.println(comdata);

        // disconnect
        unlockServo.detach();
        phoneServo.detach();
    } 

 
    delay(10);
    comdata = "";
}

以上逻辑很简单,还加了串口通讯,使用自带的串口监视器即可发送open或者1给arduino,到此,arduino接电话开门的动作完成,下一步要做的就是实现远程调用接口开门.

该主题其他文章: Remote-control-door

相关链接: