数码之家

 找回密码
 立即注册
搜索
查看: 2211|回复: 9

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

[复制链接]
发表于 2021-2-26 07:36:09 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

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



实验场景图

38.jpg


打赏

参与人数 1家元 +7 收起 理由
不长叶子的树 + 7

查看全部打赏

 楼主| 发表于 2021-2-26 07:39:59 | 显示全部楼层
  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验一:不用舵机库,驱动舵机旋转到不同角度
  4.   使用SG90 9g之180°舵机
  5.   实验接线:舵机S端接Uno的D8,同时也接入LED作为有控制信号的指示灯
  6.   注意:上传时尽量不要接入舵机,防止烧毁USB接口
  7. */

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

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

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

  21. void loop()
  22. {
  23.   //把值的范围映射到0到165左右
  24.   for ( int angle = 0; angle < 165; angle += 10) {
  25.     for (int i = 0; i < 50; i++) //发送50个脉冲
  26.     {
  27.       servopulse(angle);   //引用脉冲函数
  28.     }
  29.     delay(1000);
  30.   }
  31. }
复制代码

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-26 07:55:16 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-26 08:11:10 | 显示全部楼层
实验动态图


动图:
080659gijj9srpnr53nsp6.gif
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-26 08:49:13 | 显示全部楼层
  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二:输入“1-9”串口命令控制舵机旋转角度
  4.   使用SG90 9g之180°舵机
  5.   实验接线:舵机S端接Uno的A0,同时也接入LED作为有控制信号的指示灯
  6. */

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

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

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

  25. void loop()//将0到9的数转化为0到180角度
  26. {
  27.   val = Serial.read(); //读取串行端口的值
  28.   if (val > '0' && val <= '9')
  29.   {
  30.     val = val - '0'; //将特征量转化为数值变量
  31.     val = val * (180 / 9); //将数字转化为角度
  32.     Serial.print("舵机旋转度数为: ");
  33.     Serial.print(val, DEC);
  34.     Serial.println();
  35.     for (int i = 0; i <= 50; i++) //给予舵机足够的时间让它转到指定角度
  36.     {
  37.       servopulse(servopin, val); //引用脉冲函数
  38.     }
  39.   }
  40. }
复制代码

回复 支持 反对

使用道具 举报

发表于 2021-2-26 09:02:22 | 显示全部楼层
本来就可以啊 数据手册上说了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-26 09:09:36 | 显示全部楼层
雾落尘 发表于 2021-2-26 09:02
本来就可以啊 数据手册上说了

:loveliness: 这样啊,懂了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-26 09:10:33 | 显示全部楼层
在串口输入1-9的数字,舵机则转动相对应的角度(实际测试A0-A5,D2-D13计18个端口都可使用)


37.jpg


回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-26 09:16:32 | 显示全部楼层
尝试在串口随机输入一组数字


40.jpg


回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-26 09:21:32 | 显示全部楼层
舵机则按每个数字指定的角度,连续旋转,直到结束


41.jpg


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-19 03:23 , Processed in 0.234001 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表