目录

  • 前言
  • 功能介绍
  • 参考图
  • 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 Uno+步进电机28BYJ-48+ULN2003 实现简单的正反转demo_步进电机


开发环境(编写烧写):Arduino IDE(官网:https://www.arduino.cc/en/software)配合官方USB下载线进行烧写。

Arduino Uno+步进电机28BYJ-48+ULN2003 实现简单的正反转demo_步进电机_02


图形化编程工具:Mxily

Arduino Uno+步进电机28BYJ-48+ULN2003 实现简单的正反转demo_步进电机_03

语言:Arduino 语言(类C语言)
官方文档:https://www.arduino.cc/reference/en/

功能介绍

正转半圈,延时3秒,反转半圈,延时3秒。

参考图

Arduino Uno Rev3 原理图

Arduino Uno+步进电机28BYJ-48+ULN2003 实现简单的正反转demo_嵌入式_04


Arduino Uno+步进电机28BYJ-48+ULN2003 实现简单的正反转demo_Arduino_05

Arduino Uno+步进电机28BYJ-48+ULN2003 实现简单的正反转demo_ci_06

接线

8-11 接 IN1-IN4

Arduino Uno+步进电机28BYJ-48+ULN2003 实现简单的正反转demo_步进电机_07


Arduino Uno+步进电机28BYJ-48+ULN2003 实现简单的正反转demo_步进电机_08

效果图

接上下载线供电(顺便烧录程序),图片进行过处理,不是实际效果。

Arduino Uno+步进电机28BYJ-48+ULN2003 实现简单的正反转demo_Arduino_09

核心代码

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

正转有点卡顿。。。莫名其妙

Arduino Uno+步进电机28BYJ-48+ULN2003 实现简单的正反转demo_步进电机_10

同时控制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

编译上传

Arduino Uno+步进电机28BYJ-48+ULN2003 实现简单的正反转demo_嵌入式_11

日志信息

编译中… 速度不是很快

Arduino Uno+步进电机28BYJ-48+ULN2003 实现简单的正反转demo_ci_12


上传成功0.0

Arduino Uno+步进电机28BYJ-48+ULN2003 实现简单的正反转demo_Arduino_13

Mixly

Arduino Uno+步进电机28BYJ-48+ULN2003 实现简单的正反转demo_ci_14

拓展

涂鸦蓝牙mesh模块BT3L+步进电机+Arduino

实现手机控制 电机转动,带动小装置控制 模拟按压开关

效果图

Arduino Uno+步进电机28BYJ-48+ULN2003 实现简单的正反转demo_步进电机_15


Arduino Uno+步进电机28BYJ-48+ULN2003 实现简单的正反转demo_Uno_16

源码

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);
}