/*

Arduino通过AccelStepper库控制28BYJ-48步进电机示例程序-2

by 太极创客(www.taichi-maker.com)

可通过Arduino IDE 串口监视器输入电机指令

本程序旨在演示move/moveTo/runToNewPosition区别 (两个28BYJ-48电机演示)

如需获得本示例程序详细电路信息以及如何使用Arduino控制电机的更多知识,请参考太极创客网站:

http://www.taichi-maker.com/homepage/reference-index/arduino-library-index/accelstepper-library/

* 电机指令列表

* 'o' 利用currentPosition获取当前电机输出轴位置并通过串口监视器输出该信息

* 'v' 利用moveTo函数使电机运行到用户指定坐标位置,moveTo函数不会“block”程序。

* 例:v1024 - 将电机moveTo到1024位置

* 'm' 利用move函数使电机运行相应步数。move函数不会“block”程序。

* 例:m1024 - 使电机运行1024步

* 'r' 利用runToNewPosition函数让电机运行到用户指定坐标位置。runToNewPosition函数功能

* 与moveTo函数功能基本相同。唯一区别是runToNewPosition函数将“block”程序运行。

* 即电机没有到达目标位置前,Arduino将不会继续执行后续程序内容。

* 这一点很像Arduino官方Stepper库中的step函数。

* 例:r1024 - 将电机runToNewPosition到1024位置。Arduino在电机达到1024位置前将停止

* 其它程序任务的执行。

* 's' 利用setCurrentPosition函数设置当前位置为用户指定位置值。

* 例:s0 - 设置当前位置为0

* 'a' 利用setAcceleration函数设置加速度

* 例:a100 - 设置电机运行的加速度为100

* 'x' 利用setMaxSpeed函数设置最大速度

* 例:x500 - 设置电机运行的最大速度为500

* 'd' 用户通过此指令可指定哪一个电机进行工作

* 例:d1 一号电机工作,d2 二号电机工作, d0 两个电机同时工作

*/

#include "AccelStepper.h"

// 电机步进方式定义

#define FULLSTEP 4 //全步进参数

#define HALFSTEP 8 //半步进参数

// 定义步进电机引脚

#define motor1Pin1 8 // 一号28BYJ48连接的ULN2003电机驱动板引脚 in1

#define motor1Pin2 9 // 一号28BYJ48连接的ULN2003电机驱动板引脚 in2

#define motor1Pin3 10 // 一号28BYJ48连接的ULN2003电机驱动板引脚 in3

#define motor1Pin4 11 // 一号28BYJ48连接的ULN2003电机驱动板引脚 in4

#define motor2Pin1 4 // 二号28BYJ48连接的ULN2003电机驱动板引脚 in1

#define motor2Pin2 5 // 二号28BYJ48连接的ULN2003电机驱动板引脚 in2

#define motor2Pin3 6 // 二号28BYJ48连接的ULN2003电机驱动板引脚 in3

#define motor2Pin4 7 // 二号28BYJ48连接的ULN2003电机驱动板引脚 in4

// 定义两个步进电机对象

// 定义中ULN2003驱动板引脚顺序为 in1-in3-in2-in4

// 1号电机设置为全步进运行,2号电机设置为全步进运行

AccelStepper stepper1(FULLSTEP, motor1Pin1, motor1Pin3, motor1Pin2, motor1Pin4);

AccelStepper stepper2(FULLSTEP, motor2Pin1, motor2Pin3, motor2Pin2, motor2Pin4);

char cmd; //电机指令字符

int data; //电机指令参数

int stepperNum; //控制电机编号

void setup()

{

stepper1.setMaxSpeed(500.0); // 1号电机最大速度500

stepper1.setAcceleration(50.0); // 1号电机加速度50.0

stepper2.setMaxSpeed(500.0); // 2号电机最大速度500

stepper2.setAcceleration(50.0); // 2号电机加速度50.0

Serial.begin(9600);

Serial.println(F("++++++++++++++++++++++++++++++++++"));

Serial.println(F("+ Taichi-Maker AccelStepper Demo +"));

Serial.println(F("+ www.taichi-maker.com +"));

Serial.println(F("++++++++++++++++++++++++++++++++++"));

Serial.println(F(""));

Serial.println(F("Please input motor command:"));

}

void loop(){

if (Serial.available()) { // 检查串口缓存是否有数据等待传输

cmd = Serial.read(); // 获取电机指令中指令信息

Serial.print(F("cmd = "));

Serial.print(cmd);

Serial.print(F(" , "));

data = Serial.parseInt(); // 获取电机指令中参数信息

Serial.print(F("data = "));

Serial.print(data);

Serial.println(F(""));

runUsrCmd();

}

stepper1.run();

stepper2.run();

}

void runUsrCmd(){

switch(cmd){

case 'o': //利用currentPosition获取当前电机输出轴位置并通过串口监视器输出该信息

Serial.print(F("stepper1 Position: "));

Serial.println(stepper1.currentPosition());

Serial.print(F("stepper2 Position: "));

Serial.println(stepper2.currentPosition());

Serial.print(F("Current Running Motor: "));

if (stepperNum == 1 || stepperNum == 2 ) {

Serial.print(F("Motor# "));

Serial.println(stepperNum);

} else if (stepperNum == 0 ) {

Serial.println(F("Both Motors"));

}

break;

case 'v': //利用moveTo函数使电机运行到用户指定坐标位置,moveTo函数不会“block”程序。

if (stepperNum == 1){

Serial.print(F("Motor1 'moveTo' ")); Serial.println(data);

stepper1.moveTo(data);

} else if (stepperNum == 2){

Serial.print(F("Motor2 'moveTo' ")); Serial.println(data);

stepper2.moveTo(data);

}else if (stepperNum == 0){

Serial.print(F("Both Motors 'moveTo' ")); Serial.println(data);

stepper1.moveTo(data);

stepper2.moveTo(data);

}

break;

case 'm': // 利用move函数使电机运行相应步数。move函数不会“block”程序。

if (stepperNum == 1){

Serial.print(F("Motor1 'move' ")); Serial.println(data);

stepper1.move(data);

} else if (stepperNum == 2){

Serial.print(F("Motor2 'move' ")); Serial.println(data);

stepper2.move(data);

}else if (stepperNum == 0){

Serial.print(F("Both Motors 'move' ")); Serial.println(data);

stepper1.move(data);

stepper2.move(data);

}

break;

case 'r': //利用runToNewPosition函数让电机运行到用户指定位置值。

if (stepperNum == 1){

Serial.print(F("Motor1 'runToNewPosition' "));

Serial.println(data);

stepper1.runToNewPosition(data);

} else if (stepperNum == 2){

Serial.print(F("Motor2 'runToNewPosition' "));

Serial.println(data);

stepper2.runToNewPosition(data);

}else if (stepperNum == 0){

Serial.print(F("Both Motors 'runToNewPosition' "));

Serial.println(data);

stepper1.runToNewPosition(data);

stepper2.runToNewPosition(data);

}

break;

case 's': //利用setCurrentPosition函数设置当前位置为用户指定位置值。

if (stepperNum == 1){

Serial.print(F("Set stepper1 Current Position to "));

Serial.println(data);

stepper1.setCurrentPosition(data);

} else if (stepperNum == 2){

Serial.print(F("Set stepper2 Current Position to "));

Serial.println(data);

stepper2.setCurrentPosition(data);

}else if (stepperNum == 0){

stepper1.moveTo(data);

Serial.print(F("Set both steppers' Current Position to "));

Serial.println(data);

stepper1.setCurrentPosition(data);

stepper2.setCurrentPosition(data);

}

break;

case 'a': //利用setAcceleration函数设置加速度

if (stepperNum == 1){

Serial.print(F("Motor1 'setAcceleration' "));

Serial.println(data);

stepper1.setAcceleration(data);

} else if (stepperNum == 2){

Serial.print(F("Motor2 'setAcceleration' "));

Serial.println(data);

stepper2.setAcceleration(data);

}else if (stepperNum == 0){

Serial.print(F("Both Motors 'setAcceleration' "));

Serial.println(data);

stepper1.setAcceleration(data);

stepper2.setAcceleration(data);

}

break;

case 'x': //利用setMaxSpeed函数设置最大速度

if (stepperNum == 1){

Serial.print(F("Motor1 'setMaxSpeed' "));

Serial.println(data);

stepper1.setMaxSpeed(data);

} else if (stepperNum == 2){

Serial.print(F("Motor2 'setMaxSpeed' "));

Serial.println(data);

stepper2.setMaxSpeed(data);

}else if (stepperNum == 0){

Serial.print(F("Both Motors 'setMaxSpeed' "));

Serial.println(data);

stepper1.setMaxSpeed(data);

stepper2.setMaxSpeed(data);

}

break;

case 'd': //用户通过此指令可指定哪一个电机进行工作

if ( data == 1 || data == 2 ){

stepperNum = data;

Serial.print(F("Running Motor ")); Serial.println(stepperNum);

} else if (data == 0 ){

stepperNum = data;

Serial.println(F("Running Both Motors "));

} else {

Serial.print(F("Motor Number Wrong."));

}

break;

default: // 未知指令

Serial.println(F("Unknown Command"));

}

}

accelstepper 获取方向_AccelStepper库相关推荐

  1. Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php  c#.Net...

    Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php  c#.Net 1. -catalog与schema的设计区别1 ...

  2. python中哪个库用于中文分词_以下属于?Python?中文分词方向第三方库的是:

    以下属于?Python?中文分词方向第三方库的是: 答:jieba 霍兰德代码由几个字母组成: 答:3 在弹性价格下的货币模型下,当汇率变动与本国货币存量的供给成正比,与外国货币供给成反比,当本国货币 ...

  3. 从搜狗获取行业词库并转换成jieba可用的词库文件

    从搜狗获取行业词库并转换成jieba可用的词库文件 从搜狗获取行业词库 利用网站在线转换 利用Django建立网站 从搜狗获取行业词库 搜狗官方的词库地址 下载下来后是.scel扩展名的文件 利用网站 ...

  4. ladp3 获取属性_Ldap3库使用方法(四)

    #!/usr/bin/env python # -*- coding: utf-8 -*- import json from ldap3 import ALL_ATTRIBUTES # 注意:ldap ...

  5. input内容右对齐_向右打方向倒库过程中,如何判断后车距离?光线较暗车库倒库技巧...

    现在进入泉城广场的地下停车场,根据上方导向箭头提示,车位和出口都在右转方向. 现在大家从画面中可能觉得光线还可以,其实这个停车场光线比较差,从后视镜中可以看到相对真实的光线状态. 很多朋友曾经问过我, ...

  6. 获取手机指纹库指纹信息

    本Demo 所示用测试机为华为KIW-UL00 系统版本:Android 6.0.1, API 23 参考谷歌官方文档可知,公开的指纹操作类只有一个FingerprintManager.且暴露的方法有 ...

  7. 获取谷歌语音库单词发音

    最近要做一个英语学习软件,首先要考虑的就是词库,单词好找,发音比较难解决,分析了市面上几家语音引擎提供商,谷歌是发音最标准的了,下面是采集谷歌单词发音的c#代码. /// <summary> ...

  8. ladp3 获取属性_Ldap3 库使用方法(三)

    #!/usr/bin/env python # -*- coding: utf-8 -*- import json from ldap3 import ALL_ATTRIBUTES # 注意:ldap ...

  9. java、python、node等,轻松获取驾考题库数据

    今天分享一个免费获取各类驾考试题的API,接入非常简单,试题种类也非常丰富 介绍:最新驾照考试题库,分小车,货车,客车,客运,货运5类.可按顺序或者随机获取题库试题,题库包含:"A1&quo ...

最新文章

  1. 在阿里云Kubernetes容器服务上打造TensorFlow实验室
  2. linux中编译C语言程序
  3. TP 框架没有考虑完善的功能点:1、表达式查询不支持INSTR形式的查询
  4. WebStorm无法显示文件夹目录
  5. Qt Creator配置项目
  6. spring控制事务:声明式事务(注解)
  7. 好工作为什么会与你擦肩而过?
  8. 2019年今日头条机试_JAVA后台岗_第一题
  9. Amos简介及安装步骤
  10. 关于PreScan的Vissim插件
  11. PDF Candy Desktop(全能PDF工具箱)官方中文版V2.91 | pdf candy desktop官网下载 | 含pdf candy desktop使用教程
  12. 阿里云云计算工程师ACA认证(Alibaba Cloud Certified Associate - Cloud Computing)考试大纲-V3.0
  13. Spark MLlib特征处理:MinMax最大最小值区间缩放---原理及实战
  14. PostgreSQL的集群化和容器化部署
  15. 有趣的python小程序
  16. 合成孔径雷达干涉测量InSAR数据处理、地形三维重建、形变信监息提取、测
  17. hexo部署到云服务器
  18. 清除页面缓存快捷键-避免重新登陆方式
  19. 编程的第二个十年:关于Real™编程器的全部
  20. 现代OpenGL教程 02 - 贴图

热门文章

  1. CES 2023:微星展示数十款系列新品
  2. 检查单 2015-02-01-01
  3. 单臂路由实现VLAN间通信(不同VLAN,不同网段互访)
  4. iOS 很好用的二进制、八进制、十进制、十六进制互相转换
  5. 转自PC426 一体式水冷的新突破——银欣TD02赏析
  6. 服务器换硬盘关机好还是在线换,服务器硬盘能用多久,多久需要更换新的
  7. Cisco 路由器SSH配置
  8. 激光SLAM生成并保存pcd点云地图
  9. Vue Tooltip封装全局问号提示组件
  10. 如何设计一个低代码平台