目录
- 前言
- 功能介绍
- 参考图
- Arduino Uno Rev3 原理图
- 接线
- 效果图
- 核心代码
- Arduino IDE
- mixly
- 同时控制2个电机
- 补充
- Arduino IDE
- 编译上传
- 日志信息
- Mixly
- 拓展
- 涂鸦蓝牙mesh模块BT3L+步进电机+Arduino
- 效果图
- 源码
前言
本文是根据STM32F103+步进电机28BYJ-48+ULN2003 实现简单的正反转demo这篇文章的拓展,针对此文章的程序进行了Arduino Uno版本的粗略适配,具体细节可以参考这篇文章。
源码参考:
步进电机28BYJ-48的驱动程序(stm32f103c8t6) STM32F103+步进电机28BYJ-48+ULN2003 实现简单的正反转demo
开发板:Arduino Uno Rev3 创客主板
开发环境(编写烧写):Arduino IDE(官网:https://www.arduino.cc/en/software)配合官方USB下载线进行烧写。
图形化编程工具:Mxily
语言:Arduino 语言(类C语言)
官方文档:https://www.arduino.cc/reference/en/
功能介绍
正转半圈,延时3秒,反转半圈,延时3秒。
参考图
Arduino Uno Rev3 原理图
接线
8-11 接 IN1-IN4
效果图
接上下载线供电(顺便烧录程序),图片进行过处理,不是实际效果。
核心代码
Arduino IDE
28BYJ-48_ULN2003_apply_demo.ino
unsigned int forward[4] = {0x03,0x06,0x0c,0x09}; // 正转
unsigned int reverse[4]= {0x03,0x09,0x0c,0x06}; // 反转
int IO_array[4] = {8, 9, 10, 11};
int flag = 0;
void SetMotor(unsigned int InputData)
{
if(InputData == 0x03)
{
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
}
else if(InputData == 0x06)
{
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
}
else if(InputData == 0x09)
{
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, HIGH);
}
else if(InputData == 0x0c)
{
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
}
else if(InputData == 0x00)
{
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
}
}
/*
功能:转1/64圈
步距角5.625 360/5.625=64 减速比1/64
故64*64个脉冲转一圈
n 圈数
_direction 方向 1正转 非1反转
delay_ms delay_ms >= 2
*/
void motor_circle(int n, int _direction, int delay_ms)
{
int i, j;
for(i = 0; i < n * 8; i++)
{
for(j = 0; j < 4; j++)
{
if(1 == _direction)
{
SetMotor(0x00);
SetMotor(forward[j]);
}
else
{
SetMotor(0x00);
SetMotor(reverse[j]);
}
delay(delay_ms > 2 ? delay_ms : 2);
}
}
}
void setup() {
// put your setup code here, to run once:
int i = 0;
for( i = 0 ; i < 4 ; i++ )
{
pinMode(IO_array[i], OUTPUT);
}
}
void loop() {
// put your main code here, to run repeatedly:
if(flag)
{
// 电机正转半圈
motor_circle(32, 1, 2);
flag = 0;
}
else
{
// 电机反转半圈
motor_circle(32, 0, 2);
flag = 1;
}
delay(3000);
}
mixly
正转有点卡顿。。。莫名其妙
同时控制2个电机
// 自行修改引脚
void SetMotor1(unsigned int InputData)
void motor_circle(int n, int _direction, int delay_ms)
{
int i, j;
for(i = 0; i < n * 8; i++)
{
for(j = 0; j < 4; j++)
{
if(1 == _direction)
{
SetMotor(0x00);
SetMotor(forward[j]);
SetMotor1(0x00);
SetMotor1(forward[j]);
}
else
{
SetMotor(0x00);
SetMotor(reverse[j]);
SetMotor1(0x00);
SetMotor1(reverse[j]);
}
delay(delay_ms > 2 ? delay_ms : 2);
}
}
}
补充
Arduino IDE
编译上传
日志信息
编译中… 速度不是很快
上传成功0.0
Mixly
拓展
涂鸦蓝牙mesh模块BT3L+步进电机+Arduino
实现手机控制 电机转动,带动小装置控制 模拟按压开关
效果图
源码
unsigned int forward[4] = {0x03,0x06,0x0c,0x09}; // 正转
unsigned int reverse[4]= {0x03,0x09,0x0c,0x06}; // 反转
int IO_array[4] = {8, 9, 10, 11};
int flag = 0;
int temp = 0;
int ble_in = 7;
void SetMotor(unsigned int InputData)
{
if(InputData == 0x03)
{
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
}
else if(InputData == 0x06)
{
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
}
else if(InputData == 0x09)
{
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, HIGH);
}
else if(InputData == 0x0c)
{
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
}
else if(InputData == 0x00)
{
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
}
}
/*
功能:转1/64圈
步距角5.625 360/5.625=64 减速比1/64
故64*64个脉冲转一圈
n 圈数
_direction 方向 1正转 非1反转
delay_ms delay_ms >= 2
*/
void motor_circle(int n, int _direction, int delay_ms)
{
int i, j;
for(i = 0; i < n * 8; i++)
{
for(j = 0; j < 4; j++)
{
if(1 == _direction)
{
SetMotor(0x00);
SetMotor(forward[j]);
}
else
{
SetMotor(0x00);
SetMotor(reverse[j]);
}
delay(delay_ms > 2 ? delay_ms : 2);
}
}
}
void setup() {
// put your setup code here, to run once:
int i = 0;
for( i = 0 ; i < 4 ; i++ )
{
pinMode(IO_array[i], OUTPUT);
}
pinMode(ble_in,INPUT); //定义蓝牙控制信号脚为输入接口
}
void loop() {
// 电机正转半圈
// motor_circle(32, 1, 2);
// 电机反转半圈
// motor_circle(32, 0, 2);
temp = digitalRead(ble_in);//读取数字7 口电平值赋给temp
// temp和上一次的flag不同 则执行电机正反转
if(temp != flag)
{
flag = temp;
motor_circle(8, 1, 2);
delay(500);
motor_circle(8, 0, 2);
}
delay(1000);
}