arduino开关控制舵机往复运动_PWM控制舵机,看了都觉得简单易懂(干货)

本文介绍了使用Arduino通过按键控制舵机往复运动的硬件原理和程序设计。硬件部分讲解了SG90舵机的连接方式,强调了上拉电阻的重要性。程序上,利用PWM脉冲控制舵机转动,通过按键消抖和角度转换实现角度增量控制。每次按键,舵机转动20度,并伴有LED指示。文章提供了实物效果展示和代码解读。
摘要由CSDN通过智能技术生成

1.硬件原理

我们通过按键控制舵机的旋转,每按一次按键,舵机旋转的度数增加20度,旋转的同时,点亮LED,用于指示舵机的工作状态。

舵机的基础知识和工作原理上篇文章已介绍过了。这里直接介绍整个控制系统硬件原理。使用的舵机型号是SG90,能够转动的角度是0-180度,驱动电压是3.5-6V,这个舵机的齿轮是塑料的,工作扭矩是1.6KG/CM。

45ae56630d3fbfee91e509932706fdc4.png

舵机

舵机有3根线,电源线连接到Arduino板子的5V接口,信号线连接到IO9,按键接口连接到IO7,并接10k电阻上拉,上拉电阻不能省,否则按键接口电平不稳定,导致舵机不受控制,LED连接IO13。舵机的驱动用PWM信号,是一个周期为20ms,脉宽范围在0.5-2.5ms之间的信号,硬件原理图如下图。

be785b563abbe2c63318e47c30b7c52b.png

原理图

2.程序解读

算法描述:

1. PWM脉冲函数是通过控制20ms周期内高电平的时间和低电平的时间实现。我们只需要改变角度,通过角度转化为脉宽值的公式,得出高电平脉宽时间,低电平脉宽时间=20ms-高电平脉宽时间。整个脉冲产生我们可以用一个函数模拟实现。

cf23cb3c3ba8571925c795519ad4632c.png

脉冲电平

2. 检测按键的算法,按键需要消除抖动,因为一般按键按下,一瞬间,因为抖动的原因,Arduino管脚可能检测到多次按下。所以要消除抖动,用delay函数延时10ms左右后再次检测按键,就可以消抖了。

3. 主程序里面应该不断扫描按键是否按下,若有按键按下则开始用num自加1,计数完成后马上用flag=1的命令舵机开始转动与num值对应的角度数,这里设num每增加1则旋转20度。舵机旋转完毕后,flag命令需要清0,否则舵机会继续转动。

代码解读:

详细代码解读请看注释。

7a68915b4b06bec2588d444b352996c0.png
f2153fc9e687c06f65256575d3e2e86a.png

3.实物效果

实物连接图如下图,按程序定义的管脚连接到Arduino.

a19549ce06a6f61a9fe25196f8c4a9b2.png

实物连接图

逻辑分析仪采集到的舵机控制管脚的信号,是一个周期约为20ms的脉冲。

f016886863f7fba96bdc4d7eefec71e7.png

脉冲抓取

实验效果图,可以看到,每按下一次按键,舵机多旋转20度。欢迎点赞和转发,关注头条号:奔跑的晶体管 可以学到更多的电子知识哦。

bcd57623bd4f3fd72f4372c409937932.gif

实验效果图

朋友们看懂了吗,欢迎留言参与讨论。想要源代码的朋友请转发,关注后私信“舵机” 获取下载链接

要在Ubuntu上使用Python控制Arduino中的舵机往复运动,需要进行以下步骤: 1. 连接Arduino板和舵机:将舵机的信号线连接到Arduino板的数字引脚上,记住引脚的编号。 2. 在Ubuntu上安装pyserial模块:pyserial是Python的一个串口通信库,可以用来与Arduino通信。可以使用以下命令在Ubuntu上安装: ``` $ sudo apt-get install python3-serial ``` 3. 在Arduino IDE中编写程序:编写一个简单Arduino程序,通过串口接收来自Python的指令,并控制舵机往复运动。例如: ``` #include <Servo.h> Servo myservo; // create servo object to control a servo int pos = 0; // variable to store the servo position void setup() { Serial.begin(9600); // initialize serial communication myservo.attach(9); // attaches the servo on pin 9 to the servo object } void loop() { if (Serial.available() > 0) { // if data is available int angle = Serial.read(); // read the incoming byte pos = map(angle, 0, 180, 0, 180); // map the angle to servo position myservo.write(pos); // set servo position delay(1000); // wait for 1 second myservo.write(180-pos); // set servo position to the opposite angle delay(1000); // wait for 1 second } } ``` 4. 在Python中编写控制程序:编写一个Python程序,通过串口向Arduino发送指令,控制舵机往复运动。例如: ``` import serial import time ser = serial.Serial('/dev/ttyACM0', 9600) # open serial port time.sleep(2) # wait for Arduino to reset while True: ser.write('90'.encode()) # send angle to Arduino ``` 将上述Python程序保存为一个文件,例如control_servo.py,然后在终端中运行以下命令即可控制舵机往复运动: ``` $ python3 control_servo.py ``` 在程序中每次向Arduino发送90度的指令,Arduino程序会将舵机旋转到90度位置,然后等待1秒钟,再将舵机旋转到90度位置的对面位置,等待1秒钟,然后重复这个过程。这样就可以实现舵机的往复运动
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值