因为实验Lagging Pendulum需要一个电机驱动L型摆,要求速度可调可测。在寻找现成设备无果后,决定自己造一个。
Arduino作为一个流行的开源硬件,上手简单,搭配不同扩展板可实现丰富功能,网上资源众多。因为四天后就要交实验答辩ppt,所以妥妥选择了Arduino。
硬件设备
Arduino开发板
L298N电机驱动板
光电测速模块及码盘
直流减速电机
两节18650电池(共7.4V)
导线若干
硬件原理
Arduino的DigitalPin 3、5、6、9和11可以输出pwm脉宽调制。使用函数analogWrite
来输出设定值。analogWrite
需要一个0~255的参数,其中0为关闭,255为全功率。
L298N电流驱动板可以驱动一个步进电机或两个直流电机。7.4V电池提供驱动电压,5V逻辑电压可由L298N板内供电。将Arduino的PWM接到L298N的使能端口EA。Pin8、9接到I1、I2;OUT1、OUT2接到直流电机两端。
光电码盘测速就三个引脚,Vcc(5V), Gnd, Out(clk)。将Out连接到Arduino的Pin2。随着码盘转动,Out输出方波,频率与速度成正比。
程序清单
#include <MsTimer2.h>
int pinI1=8;//定义I1接口
int pinI2=9;//定义I2接口
int pwmPin=10;//定义EA(PWM调速)接口
int speed=200;
int vTest=2;//定义中断测速接口
int nWheel = 0; //记录测速模块的次数
float omega = 0; //角速度
float velocity(int n)
{
//角速度的计算公式为(n/20)*(2pi),即n*0.31415
float vel = n*0.31415;
return vel;
}
void flash()
{
int nr;
nr = nWheel;
omega = velocity(nr);
nWheel = 0;
Serial.print(omega);
Serial.println("rad/s");
}
void setup()
{
Serial.begin(9600); //串口波特率为9600
attachInterrupt(0,count, FALLING);
pinMode(pinI1,OUTPUT);//定义该接口为输出接口
pinMode(pinI2,OUTPUT);
pinMode(pwmPin,OUTPUT);
pinMode(vTest,INPUT);
pinMode(13, OUTPUT);
digitalWrite(pinI1,LOW);//使直流电机顺时针转
digitalWrite(pinI2,HIGH);
MsTimer2::set(1000, flash); // 中断设置函数,每 1s 进入一次中断
MsTimer2::start();
}
void loop()
{
analogWrite(pwmPin,speed);
digitalWrite(13, HIGH);
}
void count()
{
nWheel++;
}
改进
目前实现的功能只有用PC设定速度(0~255),测速模块将信息传送给Arduino,经计算将速度打印在PC屏幕上。调速不方便,可以用旋转角度电位计做模拟输入,用map
函数映射到pwm参数设置,可以实现用旋钮调速。
引用
- MsTimer2库-github
- Programming Arduino-Getting Started With Sketches by Simon Monk