基础例程2
01、直流电机
对于UL2003来说,可以看作是非门
输入为1,输出为0;
输入为0,输出为高组态[接一个上拉电阻即为1]
线路的连接
4路是用做步进电机的
对于直流电机,只需要一路。即异端接VCC,一段接OUT1。
在MOTOR_IN1引脚,与15引脚相连(下拉),即初始为0,对应OUT1为高组态。直流电机一端为5V,一端高组态,即不工作。
板子:ESP32——>ESP32 Dev Module
相应的代码如下:
/* 深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
* 实验名称:直流电机实验
*
* 接线说明:电机模块-->ESP32 IO
* (IN1)-->(15)
*
* 电机模块输出-->直流电机
* (5V)-->任意一脚
* (O1)-->任意一脚
* 实验现象:程序下载成功后,直流电机旋转3S后停止
*/
//定义电机控制管脚
#define motor_pin 15
//类型重定义
typedef unsigned char u8;
typedef unsigned int u16;
//定义全局变量
void setup() {
pinMode(motor_pin, OUTPUT);//设置引脚为输出模式
digitalWrite(motor_pin,1);//输出高电平,电机开启
delay(3000);//延时3S
digitalWrite(motor_pin,0);//输出低电平,电机停止
}
void loop() {
}
02、步进电机
步进电机型号:28BYJ48
步进电机的工作原理。4向5线。1条连接VCC,另外4条线接OUT1——OUT4,从而控制4个不同的方向。总共形成8个方向
步进电机的参数信息
实验目的:通过按键控制步进电机正反转、加速与减速
对于线路连接,与01、直流电机相似
控制逻辑
- 正转
对于控制逻辑,A->AB->B->BC->C->CD->D->DA
即下面引脚依此为0
OUT1->OUT1 OUT2->OUT2->OUT2 OUT3 ->OUT3->OUT3 OUT4->OUT4->OUT4 OUT1
对于输入而言,即下面引脚依此为1
IN1——>IN1 IN2——>IN2——>IN2 IN3——>IN3——>IN3 IN4——>IN4——>IN4 IN1
- 反转
u8 temp=step;
if(dir==0) //如果为逆时针旋转
temp=7-step;//调换节拍信号
- 初始态
key1-key4全部为上拉,即初始为
- 接线说明
/*
* 接线说明:电机模块-->ESP32 IO
* (IN1-IN4)-->(15,2,0,4)
*
* 电机模块输出-->28BYJ-48步进电机
* (5V)-->红线
* (O1)-->依次排序
*
* 按键模块-->ESP32 IO
* (K1-K4)-->(14,27,26,25)
*/
实验程序
- 对于main函数而言
/* 深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
*
* 实验名称:步进电机实验
*
* 接线说明:电机模块-->ESP32 IO
* (IN1-IN4)-->(15,2,0,4)
*
* 电机模块输出-->28BYJ-48步进电机
* (5V)-->红线
* (O1)-->依次排序
*
* 按键模块-->ESP32 IO
* (K1-K4)-->(14,27,26,25)
*
* 实验现象:程序下载成功后,当按下KEY1键可调节电机旋转方向;当按下KEY2键,电机加速;
当按下KEY3键,电机减速;
*
* 注意事项:
*
*/
#include "public.h"
#include "key.h"
#include "step_motor.h"
//定义全局变量
u8 g_key=0;
u8 g_dir=0;//默认逆时针方向
u8 g_speed=STEPMOTOR_MAXSPEED;//默认最大速度旋转
u8 g_step=0;
void setup() {
key_init();
step_motor_init();
}
void loop() {
g_key=key_scan(0);
if(g_key==KEY1_PRESS)//换向
{
g_dir=!g_dir;
}
else if(g_key==KEY2_PRESS)//加速
{
if(g_speed>STEPMOTOR_MAXSPEED)//>1,延时减小,相当于加速
g_speed-=1;
}
else if(g_key==KEY3_PRESS)//减速
{
if(g_speed<STEPMOTOR_MINSPEED)//<5,延时增加,相当于减速
g_speed+=1;
}
step_motor_28BYJ48_send_pulse(g_step++,g_dir); //每次一次循环,方向移动1次
if(g_step==8)g_step=0;
delay(g_speed); //速度用延时来表示
}
- 对于按键扫描函数key.c
#include "key.h"
//端口初始化
void key_init(void)
{
pinMode(key1_pin, INPUT_PULLUP);//设置引脚为输入上拉模式
pinMode(key2_pin, INPUT_PULLUP);
pinMode(key3_pin, INPUT_PULLUP);
pinMode(key4_pin, INPUT_PULLUP);
}
/*******************************************************************************
* 函 数 名 : key_scan
* 函数功能 : 检测独立按键是否按下,按下则返回对应键值
* 输 入 : mode=0:单次扫描按键
mode=1:连续扫描按键
* 输 出 : KEY1_PRESS:K1按下
KEY2_PRESS:K2按下
KEY3_PRESS:K3按下
KEY4_PRESS:K4按下
KEY_UNPRESS:未有按键按下
*******************************************************************************/
u8 key_scan(u8 mode)
{
static u8 key=1;
if(mode)key=1;//连续扫描按键
if(key==1&&(digitalRead(key1_pin)==0||digitalRead(key2_pin)==0||digitalRead(key3_pin)==0||digitalRead(key4_pin)==0))//任意按键按下
{
delay(10);//消抖
key=0;
if(digitalRead(key1_pin)==0)
return KEY1_PRESS;
else if(digitalRead(key2_pin)==0)
return KEY2_PRESS;
else if(digitalRead(key3_pin)==0)
return KEY3_PRESS;
else if(digitalRead(key4_pin)==0)
return KEY4_PRESS;
}
else if(digitalRead(key1_pin)==1&&digitalRead(key2_pin)==1&&digitalRead(key3_pin)==1&&digitalRead(key4_pin)==1) //无按键按下
{
key=1;
}
return KEY_UNPRESS;
}
- 对于电机控制
#include "step_motor.h"
//端口初始化
void step_motor_init(void)
{
pinMode(ina_pin, OUTPUT);//设置引脚为输出模式
pinMode(inb_pin, OUTPUT);
pinMode(inc_pin, OUTPUT);
pinMode(ind_pin, OUTPUT);
}
/*******************************************************************************
* 函 数 名 : step_motor_28BYJ48_send_pulse
* 函数功能 : 输出一个数据给ULN2003从而实现向步进电机发送一个脉冲
* 输 入 : step:指定步进序号,可选值0~7
dir:方向选择,1:顺时针,0:逆时针
* 输 出 : 无
*******************************************************************************/
void step_motor_28BYJ48_send_pulse(u8 step,u8 dir)
{
u8 temp=step;
if(dir==0) //如果为逆时针旋转
temp=7-step;//调换节拍信号
switch(temp)//8个节拍控制:A->AB->B->BC->C->CD->D->DA
{
case 0: digitalWrite(ina_pin,1);digitalWrite(inb_pin,0);digitalWrite(inc_pin,0);digitalWrite(ind_pin,0);break;
case 1: digitalWrite(ina_pin,1);digitalWrite(inb_pin,1);digitalWrite(inc_pin,0);digitalWrite(ind_pin,0);break;
case 2: digitalWrite(ina_pin,0);digitalWrite(inb_pin,1);digitalWrite(inc_pin,0);digitalWrite(ind_pin,0);break;
case 3: digitalWrite(ina_pin,0);digitalWrite(inb_pin,1);digitalWrite(inc_pin,1);digitalWrite(ind_pin,0);break;
case 4: digitalWrite(ina_pin,0);digitalWrite(inb_pin,0);digitalWrite(inc_pin,1);digitalWrite(ind_pin,0);break;
case 5: digitalWrite(ina_pin,0);digitalWrite(inb_pin,0);digitalWrite(inc_pin,1);digitalWrite(ind_pin,1);break;
case 6: digitalWrite(ina_pin,0);digitalWrite(inb_pin,0);digitalWrite(inc_pin,0);digitalWrite(ind_pin,1);break;
case 7: digitalWrite(ina_pin,1);digitalWrite(inb_pin,0);digitalWrite(inc_pin,0);digitalWrite(ind_pin,1);break;
default: digitalWrite(ina_pin,0);digitalWrite(inb_pin,0);digitalWrite(inc_pin,0);digitalWrite(ind_pin,0);break;//停止相序
}
}
lWrite(ind_pin,1);break;
case 7: digitalWrite(ina_pin,1);digitalWrite(inb_pin,0);digitalWrite(inc_pin,0);digitalWrite(ind_pin,1);break;
default: digitalWrite(ina_pin,0);digitalWrite(inb_pin,0);digitalWrite(inc_pin,0);digitalWrite(ind_pin,0);break;//停止相序
}
}