• 偶然发现Arduino Uno的 D0-D13与A0-A5端均可以正常使用舵机


    今天早上在做小实验中,偶然发现Arduino的所有20个输入输出端口都能控制舵机(实验中使用SG90 9g之180°舵机),原来的观念是只有带~ 符号的PWM引脚能够控制舵机,而在实际测试中,发现数字端D0-D13,模拟端A0-A5均可以正常使用舵机。也就是说,Arduino有可能直接控制20路舵机。

    实验场景图

    /*
    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
    实验一:不用舵机库,驱动舵机旋转到不同角度
    使用SG90 9g之180°舵机
    实验接线:舵机S端接Uno的D8,同时也接入LED作为有控制信号的指示灯
    注意:上传时尽量不要接入舵机,防止烧毁USB接口
    */

    int servopin = 8; //定义舵机接口数字接口8 也就是舵机的橙色信号线。

    void servopulse(int angle)//定义一个脉冲函数
    {
    int pulsewidth = (angle * 11) + 500; //将角度转化为500-2480的脉宽值
    digitalWrite(servopin, HIGH); //将舵机接口电平至高
    delayMicroseconds(pulsewidth); //延时脉宽值的微秒数
    digitalWrite(servopin, LOW); //将舵机接口电平至低
    delayMicroseconds(20000 - pulsewidth);
    }

    void setup()
    {
    pinMode(servopin, OUTPUT); //设定舵机接口为输出接口
    }

    void loop()
    {
    //把值的范围映射到0到165左右
    for ( int angle = 0; angle < 165; angle += 10) {
    for (int i = 0; i < 50; i++) //发送50个脉冲
    {
    servopulse(angle); //引用脉冲函数
    }
    delay(1000);
    }
    }

    使用D0端的实验视频(15秒)

    https://v.youku.com/v_show/id_XNTExMDgxOTExMg==.html?spm=a2hzp.8244740.0.0

    使用A5端的实验视频(15秒)

    https://v.youku.com/v_show/id_XNTExMDgxODE4NA==.html?spm=a2hzp.8244740.0.0

    实验动态图

    动图 https://mc.dfrobot.com.cn/data/attachment/forum/202102/26/080659gijj9srpnr53nsp6.gif

    /*
    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
    实验二:输入“1-9”串口命令控制舵机旋转角度
    使用SG90 9g之180°舵机
    实验接线:舵机S端接Uno的A0,同时也接入LED作为有控制信号的指示灯
    */

    int servopin = A0; //定义舵机接口A0
    int myangle;//定义角度变量
    int pulsewidth;//定义脉宽变量
    int val;

    void servopulse(int servopin, int myangle) //定义一个脉冲函数
    {
    pulsewidth = (myangle * 11) + 500; //将角度转化为500-2480的脉宽值
    digitalWrite(servopin, HIGH); //将舵机接口电平至高
    delayMicroseconds(pulsewidth);//延时脉宽值的微秒数
    digitalWrite(servopin, LOW); //将舵机接口电平至低
    delay(20 - pulsewidth / 1000);
    }

    void setup()
    {
    pinMode(servopin, OUTPUT); //设定舵机接口为输出接口
    Serial.begin(9600);//连接到串行端口,波特率为9600
    Serial.println("舵机准备就绪,请输入1-9" ) ;
    }

    void loop()//将0到9的数转化为0到180角度
    {
    val = Serial.read(); //读取串行端口的值
    if (val > '0' && val <= '9')
    {
    val = val - '0'; //将特征量转化为数值变量
    val = val * (180 / 9); //将数字转化为角度
    Serial.print("舵机旋转度数为: ");
    Serial.print(val, DEC);
    Serial.println();
    for (int i = 0; i <= 50; i++) //给予舵机足够的时间让它转到指定角度
    {
    servopulse(servopin, val); //引用脉冲函数
    }
    }
    }

    在串口输入1-9的数字,舵机则转动相对应的角度(实际测试A0-A5,D2-D13计18个端口都可使用)

    尝试在串口随机输入一组数字

    舵机则按每个数字指定的角度,连续旋转,直到结束

  • 相关阅读:
    Merge sorted ranges
    call_once/once_flag的使用
    对‘boost::serialization::singleton_module::get_lock()’未定义的引用
    C++多线程lock_guard
    长度为0的数组—— Arrays of Length Zero
    Utunbu VLC 播放器播放本机rtp码流
    Utunbu VLC 播放器播放本机h264码流
    Declaration of non-local variable in 'for' loop
    ZFEC--Demo--C语言接口
    malloc-demo
  • 原文地址:https://www.cnblogs.com/eagler8/p/14450575.html
Copyright © 2020-2023  润新知