2017-05-05 17:54:59 a1217158716 阅读数 5659
  • arduino实战

    学习如何在arduino中使用各种传感器,包括人体红外传感器,超声波传感器,舵机控制,温湿度传感器,激光接收传感器等,空气质量传感器,wifi模块等....课程内容会不断的更新增加,只要发现比较有趣的传感器就会做对应的实战视频

    405 人正在学习 去看看 陈贤能

Arduino对舵机的控制


舵机是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由接收机或者单片机发出信号给舵机,其内部有一个基准电路,产生周期为20ms,宽度为1.5ms 的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。经由电路板上的IC 判断转动方向,再驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回信号,判断是否已经到达定位。适用于那些需要角度不断变化并可以保持的控制系统。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。一般舵机旋转的角度范围是0 度到180 度。


舵机有很多规格,但所有的舵机都有外接三根线,分别用棕、红、橙三种颜色进行区分,由于舵机品牌不同,颜色也会有所差异,棕色为接地线,红色为电源正极线,橙色为信号线。舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms到2ms之间,但是,事实上脉宽可由0.5ms 到2.5ms 之间,脉宽和舵机的转角0°~180°相对应。有一点值得注意的地方,由于舵机牌子不同,对于同一信号,不同牌子的舵机旋转的角度也会有所不同。


用Arduino 控制舵机的方法有两种,一种是通过Arduino 的普通数字传感器接口产生占空比不同的方波,模拟产生PWM 信号进行舵机定位,第二种是直接利用Arduino自带的Servo 函数进行舵机的控制,这种控制方法的优点在于程序编写,缺点是只能控制2 路舵机,因为Arduino自带函数只能利用数字9、10 接口。Arduino的驱动能力有限,所以当需要控制1 个以上的舵机时需要外接电源。


方法一

将舵机接数字 9 接口上。
编写一个程序让舵机转动到用户输入数字所对应的角度数的位置,并将角度打印显示到屏幕上。
参考源程序A:
int servopin=9;//定义数字接口9 连接伺服舵机信号线
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("servo=o_seral_simple ready" ) ;
}
void loop()//将0 到9 的数转化为0 到180 角度,并让LED 闪烁相应数的次数
{
val=Serial.read();//读取串行端口的值
if(val>'0'&&val<='9')
{
val=val-'0';//将特征量转化为数值变量
val=val*(180/9);//将数字转化为角度
Serial.print("moving servo to ");
Serial.print(val,DEC);
Serial.println();
for(int i=0;i<=50;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse(servopin,val);//引用脉冲函数
}
}

}


方法二

先具体分析一下 Arduino 自带的Servo 函数及其语句,来介绍一下舵机函数的几个常用语句吧。
1、attach(接口)——设定舵机的接口,只有数字9 或10 接口可利用。
2、write(角度)——用于设定舵机旋转角度的语句,可设定的角度范围是0°到180°。
3、read()——用于读取舵机角度的语句,可理解为读取最后一条write()命令中
的值。
4、attached()——判断舵机参数是否已发送到舵机所在接口。
5、detach()——使舵机与其接口分离,该接口(数字9 或10 接口)可继续被用作PWM 接口。
注:以上语句的书写格式均为“舵机变量名.具体语句()”例如:myservo.attach(9)。
仍然将舵机接在数字9 接口上即可。
参考源程序B:
#include <Servo.h>//定义头文件,这里有一点要注意,可以直接在Arduino软件菜单栏单击Sketch>Importlibrary>Servo,调用Servo 函数,也可以直接输入#include<Servo.h>,但是在输入时要注意在#include与<Servo.h>之间要有空格,否则编译时会报错。
Servo myservo;//定义舵机变量名
void setup()
{
myservo.attach(9);//定义舵机接口(9、10 都可以,缺点只能控制2 个)
}
void loop()
{
myservo.write(90);//设置舵机旋转的角度
}
以上就是控制舵机的两种方法,各有优缺点大家根据自己的喜好和需要进行选择。
2019-06-06 17:58:05 weixin_40721097 阅读数 185
  • arduino实战

    学习如何在arduino中使用各种传感器,包括人体红外传感器,超声波传感器,舵机控制,温湿度传感器,激光接收传感器等,空气质量传感器,wifi模块等....课程内容会不断的更新增加,只要发现比较有趣的传感器就会做对应的实战视频

    405 人正在学习 去看看 陈贤能

本文为转载,详情请点击此处---Arduino 控制舵机精讲

舵机是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由接收机或者单片机发出信号给舵机,其内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。经由电路板上的IC 判断转动方向,再驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回信号,判断是否已经到达定位。适用于那些需要角度不断变化并可以保持的控制系统。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。一般舵机旋转的角度范围是0度到180度。

舵机有很多规格,但所有的舵机都有外接三根线,分别用棕、红、橙三种颜色进行区分,由于舵机品牌不同,颜色也会有所差异,棕色为接地线,红色为电源正极线,橙色为信号线。 

用Arduino 控制舵机的方法有两种,一种是通过Arduino 的普通数字传感器接口产生占空比不同的方波,模拟产生PWM 信号进行舵机定位,第二种是直接利用Arduino 自带的Servo 函数进行舵机的控制,这种控制方法的优点在于程序编写,缺点是只能控制2 路舵机,因为Arduino 自带函数只能利用数字9、10 接口。Arduino 的驱动能力有限,所以当需要控制1 个以上的舵机时需要外接电源。 

方法一:通过Arduino 的普通数字传感器接口产生占空比不同的方波 

int servopin=9;//定义数字接口9 连接伺服舵机信号线
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("servo=o_seral_simple ready" ) ;
}
 
void loop()//将0 到9 的数转化为0 到180 角度,并让LED 闪烁相应数的次数
{
val=Serial.read();//读取串行端口的值
if(val>'0'&&val<='9')
{
val=val-'0';//将特征量转化为数值变量
val=val*(180/9);//将数字转化为角度
Serial.print("moving servo to ");
Serial.print(val,DEC);
Serial.println();
 
for(int i=0;i<=50;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse(servopin,val);//引用脉冲函数
}
 
}
}

方法二:利用Arduino 自带的Servo 函数进行舵机的控制

先具体分析一下 Arduino 自带的Servo 函数及其语句,来介绍一下舵机函数的几个常用语句吧。
1、attach(接口)——设定舵机的接口,只有数字9 或10 接口可利用。
2、write(角度)——用于设定舵机旋转角度的语句,可设定的角度范围是0°到180°。
3、read()——用于读取舵机角度的语句,可理解为读取最后一条write()命令中的值。
4、attached()——判断舵机参数是否已发送到舵机所在接口。
5、detach()——使舵机与其接口分离,该接口(数字9 或10 接口)可继续被用作PWM 接口。
注:以上语句的书写格式均为“舵机变量名.具体语句()”例如:myservo.attach(9)。仍然将舵机接在数字9 接口上即可。 

#include <Servo.h>//定义头文件,这里有一点要注意,可以直接在Arduino 软件菜单栏单击Sketch>Importlibrary>Servo,调用Servo 函数,也可以直接输入#include <Servo.h>,但是在输入时要注意在#include 与<Servo.h>之间要有空格,否则编译时会报错。
 
Servo myservo;//定义舵机变量名
void setup()
{
myservo.attach(9);//定义舵机接口(9、10 都可以,缺点只能控制2 个)
}
 
void loop()
{
myservo.write(90);//设置舵机旋转的角度
}

本博客转载内容均为个人学习和记录,如有侵犯请联系博主删除!!!

2020-01-10 14:58:18 haigear 阅读数 1430
  • arduino实战

    学习如何在arduino中使用各种传感器,包括人体红外传感器,超声波传感器,舵机控制,温湿度传感器,激光接收传感器等,空气质量传感器,wifi模块等....课程内容会不断的更新增加,只要发现比较有趣的传感器就会做对应的实战视频

    405 人正在学习 去看看 陈贤能

舵机在人工智能领域使用相当广泛,尤其是涉及到各种精确运动转向的控制中几乎都有它的身影。在我们的雷达扫描案例中就必须使用到舵机(当然,伺服电机也是可以的,步进电机由于没有角度位置传感器一般不使用在这种精确角度控制的场合)。

不论是伺服电机还是舵机,都是有角度传感器的,舵机中比伺服电机中多了一个减速齿轮而已增加其扭矩,以便使用在负重运动的关节上,其余基本一样,也就是说使用上基本没有什么差别,他们都是靠脉冲宽度调制(PWM)来驱动的。

首先我们看看,我们能买到的最便宜的舵机是什么样子吧,这里我们用的是SG90(SG90有两种一种是SG90A一类是SG90D,分别是模拟和数字类型的,我这里使用模拟量的SG90A),转动角度为(090度或者0180)。如果要满足我们前面雷达扫描的360度的扫描可以购买360度的舵机(如MG945/946、995/996都可以,伺服电机也很好,就是贵了些)。
下图为SG90
在这里插入图片描述
下图为MG996/995/945/946
在这里插入图片描述

三根线:橙色为正极,棕色为负极,黄色为信号线
在这里插入图片描述
我们必须首先了解一下什么是PWM?

PWM是Pulse-width modulation的缩写,我们可以简单的翻译为脉冲宽度调制,或者脉冲宽度控制。那么这个东东是干什么用的呢,实际可以很简单的理解,就是通过将能量切片后得到的宽度占比来控制单位时间内输出能量的大小的方法。切片的宽度越小,输出的能量大小则越小,电机啊,灯泡等单位时间内得到的能量就越小,转速及亮度就越小,举个栗子,在电流不变的情况下,我们将输出的脉冲电压(如5V电压)切割为原来一半的宽度,并每间隔一个就拿掉它,那么就只剩下原来脉冲波的一半的宽度了,那么输出的总能量也就是以前的一半了,相当如2.5V。我们可以从下图来尝试理解:
在这里插入图片描述

了解了PWM后,我们就必须了解如何获得不同的脉冲宽度,尤其是在arduino中如何获得不同的脉冲宽度。

既然,我们已经知道,不同的脉冲宽度可以通过持续拉高或者拉低某个管脚的电平来实现,那么代码就很容易实现了。我们看看最简单的代码实现:

学会了如何使舵机工作起来后,接下来我们就要对它的精准度进行测试了。
我们知道,在arduino中或者是51单片机程序中使用舵机是需要先加载驱动类库的,如果没有这些类库,电机基本无法正常驱动的。当然,即使有驱动库,有很多时候舵机也可能不会按照我们设定的方式转动。
所以才有了我下面的这段自编写的舵机测试代码。

ardunio端代码如下:

int srvPin = 9; //数字接口9连接舵机信号线
int Angle;
int pWidth;
char val;
                   
void setup(){
    pinMode(srvPin,OUTPUT);
    Serial.begin(9600);
    Serial.println("--");
}
void loop()
{
  turnAround(90);
}

//转动函数
void turnAround(int pin,float agl)
{
   for(int i = 0;i<=18;i++)
   {        
      angleChange(pin,agl);
      delay(20);
   }     
}

//脉冲函数
void angleChange(int pin ,float angle)
{
    //500高电平毫秒为0度
    pWidth =500+map(angle,180,0,1800,0);// 
    digitalWrite(pin,HIGH); //舵机电平升高
    delayMicroseconds(pWidth);//延时脉宽值的微妙数
    digitalWrite(pin,LOW); //拉低电平
}

经过测试电机要旋转18次才能旋转到指定的角度。

1、对于板载电压的测试
还有一点,arduino uno的板子,很多时候供电达不到,舵机也不会转动,会导致串口通讯中断,不能通过指令来转动。而且在脱机转动的时候,arduino板上的指示灯会随着转动变暗。

2、脉冲宽度的测试
经过测试为13.9ms转动1度,与官方给出的2.5秒转动180度基本吻合。一旦脉冲宽度达到2500后超过300都按照2500来计算,或者叫做这300叫做冗余部分,超过2800后就开始这算了,自动折算为2800-2500,那么转动角度就是300/2500

3、转动角度测试
我对10个SG90进行了测试,没有一个会按照脉冲2500来转动180度,都会存在接近30度的多于角度,也就是每转动30度就会有5度的余量差。对于转动180度来说最终我们调整脉冲宽度为2100时基本转动角度符合要求了,但对于转动90度来说确有不足90了。
所以最终,我们决定将脉冲宽度的映射做一个变化处理,,这也就是angleChange函数中第一行使用map的原因。

我们通过测试,发现在0到20度内的角度无法给出转动动作。所以感觉这种舵机基本不能用于小角度的控制。当然,从大角度回转到小角度20度以内也会产生很大的误差,舵机会转动到0度附近。

每个舵机实际都需要调试,脉冲宽度为0的时候,电机也是为转动到某个角度的,而且转动到某个极限角度,在这个极限下,直到某个脉冲宽度下,都被视为0度,所以我们在调试舵机的时候必须给定一个0度参考脉冲宽度,也就是说,这个脉冲款都就是0度,在这个的基础上增加脉冲宽度是有转动动作发生的。

也就是说,我们给出了列入200的脉冲宽度,虽然舵机转动到了某个角度,但我们试图给它增加200的脉冲令其转动是不能成功的,它可能还在原地。也就是说,500内的脉冲区域其实都是舵机的转动死角区域,或者说非响应区,跟没有发指令一样,最多电机响动但不转动,而且进入死区后舵机可能在接收正常脉冲后还会一时难以恢复正常转动。

理论上2500毫秒是可以达到180度的转动,但实际也需要根据不同的舵机的位置传感器来确定,有的脉冲宽度2300就到了180度。这是我们必须引起注意的。

舵机的转速测试
舵机的转速慢,给定脉冲后它会朝着目标角度转去,位置传感器会告知电机是否到达了目标位置,如果没有到达那就继续转,一直到到达则不再转动。

2019-10-01 14:51:47 qq_43006346 阅读数 429
  • arduino实战

    学习如何在arduino中使用各种传感器,包括人体红外传感器,超声波传感器,舵机控制,温湿度传感器,激光接收传感器等,空气质量传感器,wifi模块等....课程内容会不断的更新增加,只要发现比较有趣的传感器就会做对应的实战视频

    405 人正在学习 去看看 陈贤能

python与arduino结合控制舵机

一.任务说明:

我们要实现的是使用一个图像软件来控制舵机的角度,例如下图,直接使用鼠标来拖到滚动条,来实现舵机不同角度的控制。

在这里插入图片描述

二.环境说明:

  1. 本机系统:Ubuntu19.4

  2. python版本:3.71

  3. arduino版本:2:1.0.5

  4. 需要到的Python第三方库:

​ (1)tkinter:用于GUI图形界面的搭建

​ (2)pyserial::用于arduino与Python的串口通信

  1. 舵机:MG995

三实现说明:

python的tkinter库实现图形界面的搭建,用户拖动鼠标来改变转动的角度数据,通过serial库从串口通信把数据传送给arduino,然后arduino根据传过来的数据去控制舵机转动不同的角度。

四代码说明:

1. arduino代码

(特别注意:舵机的控制需要的是模拟信号,所以舵机信号线所接的引脚应该是模拟输出端口)

/*
  舵机的控制
*/

//导入舵机的库
#include <Servo.h>

Servo servo_pin_1;

int state=0; //初始状态
int t=10; //延时毫秒
void setup()
{
  Serial.begin(9600);
  servo_pin_1.attach(1);//使用第1号引脚为信号输出
}

void loop()
{
  while(!Serial)//检测是否有串口接通
  {} 
  if(Serial.available()>0) //判断是否具有输入
  {
    state=Serial.parseInt(); //接收数据
    servo_pin_1.write( state ); //定义舵机的转动角度
//    delay( t );//延时1000毫秒
  }
}

2.python代码

"""
    python:tkinter控制舵机的角度

"""
# 导入模块
import serial
import tkinter as tk
import time

# 建立串口连接
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=0.5)


# 创建一个按钮的窗体
class ButtonsApp(tk.Tk):
    def __init__(self):
        super().__init__()
        # 开灯按钮 resolution=50 表示步长为50
        self.scale = tk.Scale(self, from_=0,
                              tickinterval=30,
                              resolution=30,
                              to=180, length=800,
                              width=50,  orien=tk.HORIZONTAL,
                              cursor="hand2",
                              command=self.on)
        self.scale.pack(padx=40, pady=10)

    # 控制函数,特别注意event参数的使用
    def on(self, event):
        val = str(self.scale.get())
        ser.write(val.encode('utf-8'))
        print(val)


if __name__ == '__main__':
    app = ButtonsApp()
    app.title('滚动条控制舵机')
    app.mainloop()


接好各电源线之后,应该先运行arduino程序,再运行Python程序。

2011-12-08 00:18:56 quiii 阅读数 615
  • arduino实战

    学习如何在arduino中使用各种传感器,包括人体红外传感器,超声波传感器,舵机控制,温湿度传感器,激光接收传感器等,空气质量传感器,wifi模块等....课程内容会不断的更新增加,只要发现比较有趣的传感器就会做对应的实战视频

    405 人正在学习 去看看 陈贤能

关于 Arduino 

 

http://item.taobao.com/item.htm?id=6804680647

http://item.taobao.com/item.htm?id=4328931317

 

DFRobot 的板越来越糙了(比别家散货还是好些的),倒是不影响使用。如果很注重外观可以考虑iteadStudio的板 http://itead.taobao.com/,包装、做工好的一塌糊涂,还便宜。

 

电子商店:sparkfun, dfrobot, elecfreaks, iteadstudio

一个不错的视屏教程:http://v.youku.com/v_show/id_XMjYyMzY1MDU2.html

 

 

Knob舵机控制库

 

#include <Servo.h> 
 
Servo servo1;
Servo servo2;

void setup() 
{
  Serial.begin(115200);
  Serial.println(":-]");
  
  servo1.attach(9);
  servo2.attach(8);
} 

void loop() 
{
  if (Serial.available()) {
    char val = Serial.read();
    if (val == '.') {
      Serial.println(' ');
      Serial.println("bye");
      Serial.end();
    }
    if (val == '>') {
      servo1.write(179);
      servo2.write(0);
    }
    if (val == '<') {
      servo1.write(0);
      servo2.write(179);
    }
  }  

  delay(100);
} 

 

用arduinoIDE自带的串口工具或者putty连接,输入<或者>,控制舵机正转、反转。

 

 

即使没有信号输出,舵机也在缓缓地转,是什么问题 囧。

 

感谢dfrobot店家热心的售后服务,问题解答如下:

 

  • 360度的舵机,信号为 频率50HZ,高电平1.5ms为停止,大于1.5ms正转,小于1.5反转所以要停下了,必须是标准的1.5ms
  • Arduino生产的信号不是很标准,所以会出现慢慢转我们都是用舵机控制器控制的

 

--- 分 - 割 - 线 --- 分 - 割 - 线 --- 分 - 割 - 线 ---

 

闪个灯,新买的板可以用它测个试。串口通信,接收一位数字(也就是说1-9,单位秒),以改变led闪烁时亮着的时间

 

int pin = 13;
int stay = 3000;

void setup() {                
  pinMode(pin, OUTPUT);     
  
  Serial.begin(9600);
  Serial.println(":-] hi");
  
  delay(300);
}

void loop() {
  if (Serial.available()) {
    char in = Serial.read();
    Serial.print(in);
    
    if (in > 48 && in <= 57) {
      Serial.print(" is in range (0, 9]");
      
      stay = (in - 48) * 1000;
      
      for (int i = 0; i < 3; i++) {
        digitalWrite(pin, HIGH);
        delay(100); 
        digitalWrite(pin, LOW);
        delay(100);
      }
    }
    
    Serial.println(".");
  }
  
  Serial.print("stay bright in ");
  Serial.print(stay);
  Serial.println(" ms");
  digitalWrite(pin, HIGH);
  delay(stay); 
  digitalWrite(pin, LOW);
  delay(1000);
}

 

 

Arduino之舵机控制

阅读数 3952

【Arduino】控制舵机

阅读数 1041

没有更多推荐了,返回首页