ARDUINO板驱动两个NEMA17电机同步运转

2024-03-05 07:50

本文主要是介绍ARDUINO板驱动两个NEMA17电机同步运转,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在做一个案例,要求ARDUINO板驱动两个NEMA17电机. 查了以下,有个AccelStepper.h库,用着也挺方便.但我有另一个硬性的要求,用这个库很难实现.索性自己写了个程序,完成了这一目标.

这个硬性的要求就是:两个电机要同步,即同时起步,同时停止.旋转的速度和方向可以不一样.

下面是实现的详细过程.

1.BOM

ARDUINO uno R3,1

A4988,2

5V power,1(单独给电机供电)

小面包板,1

面包线,若干

2,示意图

3,操作说明

通过ARDUINO IDE的串口监视器输入控制命令:

1,点亮LED灯

0,熄灭LED灯

4,前进200步

5,后退200步

8,先前进,再后退,即两电机先正转,再反转

9,先右旋转,再左旋转,即两电机先左正右反,再左反右正.

在电机运转时,LED等点亮.

4,指令说明

指令格式:200,400,1000000,1

200-左电机运行步数,正为前进,负为后退;

400-右电机运行步数,正为前进,负为后退;

1000000-表示在1秒内完成运行动作,单位为微秒;

1-为舵机预留的控制位.

5,源程序

// UNO + A4988 + NEMA17//此模式两个电机可以是同步运行的,即能保持“以不同的旋转速度”同时旋转(同时开始,同时停止)。
// 逐步改进,时间、速度可输入;
// 停止是处于非激活状态 int ledpin=13 ;    //定义LED灯引线。//  步进电机
//  Enable,STEP步距,DIR方,MS1/MS2
int PIN[2][3]={{4,3,2}, //电机1 的IO引脚, {7,6,5}  //电机2 的IO引脚, 
};void setup()
{Serial.begin(9600);   //用蓝牙监视器代替//  初始化步进电机的引脚  for(int i=0;i<2;i++)for(int j=0;j<3;j++)pinMode(PIN[i][j]   ,OUTPUT);  pinMode(ledpin, OUTPUT);       //设置管脚2为输出模式 , 板载LEDSerial.begin(9600);digitalWrite(PIN[0][0],HIGH);    // 输出高电平,关闭电机digitalWrite(PIN[1][0],HIGH);    // 输出高电平,关闭电机   }long int num = 0;void loop()
{int inChar;         // 接受从串口监视器传来的信息,如果是蓝牙监视器的话,则接受从蓝牙监视器传来的信息。if (Serial.available()) {inChar = Serial.read();Serial.write(inChar);switch (inChar) {case '1':digitalWrite(ledpin, HIGH);   // 点亮LEDbreak;case '0':digitalWrite(ledpin, LOW);   // 熄灭LEDbreak; case '4':CarRun("200,400,1000000,1");break;case '5':CarRun("-200,-400,1000000,0");break;  case '8':CarRun("2000,2000,10000000,1,-2000,2000,10000000,0");break;case '9':CarRun("1000,-2000,10000000,1,-1000,2000,10000000,0");break;default:Serial.println(F("Wrong Input :("));break;}}
}//  步进电机的旋转,200步为一周,正值为逆时针,负值为顺时针
//  step1 电机1的步进数
//  step2 电机2的步进数
//  msec  旋转时间,单位为微秒(us)
void Run(long int step1,long int step2,unsigned long int msec) {if(step1>0){digitalWrite(PIN[0][2],HIGH); // 设置高电平的方向 逆} else {digitalWrite(PIN[0][2],LOW);  // 设置低电平的方向 顺step1 = -step1;}if(step2>0){digitalWrite(PIN[1][2],HIGH); // 设置高电平的方向 逆} else {digitalWrite(PIN[1][2],LOW);  // 设置低电平的方向 顺step2 = -step2;}unsigned long int mtime0,n1,n2;mtime0=micros(); 
n1 = 0;
n2 = 0;//  以下循环中不要出现与运转无关的语句或运算,否则可能出现较大的运行误差。while(micros()-mtime0<msec){if((micros()-mtime0)>=n1*(unsigned long int)(msec/step1)){ digitalWrite(PIN[0][1],HIGH);delayMicroseconds(10);digitalWrite(PIN[0][1],LOW);delayMicroseconds(10); n1++;}if((micros()-mtime0)>=n2*(unsigned long int)(msec/step2)){ digitalWrite(PIN[1][1],HIGH);delayMicroseconds(10);digitalWrite(PIN[1][1],LOW);delayMicroseconds(10);n2++;} }  
} //小车运动
void CarRun(String Dstr)
{  long int data1,data2,time1;int servo;long int dats[100];for(int i=0;i<100;i++){dats[i]=0;} int N = GetNums(Dstr,dats); //4的倍数digitalWrite(PIN[0][0],LOW);    // 输出低电平,启动电机digitalWrite(PIN[1][0],LOW);    // 输出低电平,启动电机digitalWrite(ledpin, HIGH);   // 点亮LEDfor(int n=0;n<N/4;n++) {data1 = dats[n*4];data2 = dats[n*4+1];time1 = dats[n*4+2];servo = dats[n*4+3];Serial.print(F("data:"));   Serial.print(data1); Serial.print(F(","));   Serial.print(data2); Serial.print(F(","));   Serial.print(time1); Serial.print(F(","));   Serial.print(servo); Serial.println(F("<<<"));  Run(data1,data2,time1);}digitalWrite(PIN[0][0],HIGH);    // 输出高电平,关闭电机digitalWrite(PIN[1][0],HIGH);    // 输出高电平,关闭电机   digitalWrite(ledpin, LOW);   // 熄灭LED
}//将从串口读取的数据串str进行解析到num中
//输入:str---字符串指针,
//    num---要保存数字的数组指针
//返回:数字个数
//    只取整型
int GetNums(const String str,long int* num)
{int len=str.length(); //strlen(str);int index=0;  //数值个数int t;    //某位的数字int p=1;  //默认为正数,-1为负数int nFlag=0;  //1:表示取到一个数字for(int i=0;i<len;i++){if(str[i]=='-') {p=-1; continue;}while(!((str[i]>='0'&&str[i]<='9')||str[i]=='+')){i++;}while(str[i]>='0'&&str[i]<='9'){nFlag=1;t=str[i]-'0';num[index]=num[index]*10+t; i++;if(i==len) break;}if(nFlag==1){num[index] *= p; index++;}p=1;nFlag=0;}return index;
}

最后说明:

电机请接12V电源,5V可能运转不畅!

这篇关于ARDUINO板驱动两个NEMA17电机同步运转的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/775795

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

arduino ide安装详细步骤

​ 大家好,我是程序员小羊! 前言: Arduino IDE 是一个专为编程 Arduino 微控制器设计的集成开发环境,使用起来非常方便。下面将介绍如何在不同平台上安装 Arduino IDE 的详细步骤,包括 Windows、Mac 和 Linux 系统。 一、在 Windows 上安装 Arduino IDE 1. 下载 Arduino IDE 打开 Arduino 官网

MySQL主从同步延迟原理及解决方案

概述 MySQL的主从同步是一个很成熟的架构,优点为: ①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力; ②在从主服务器进行备份,避免备份期间影响主服务器服务; ③当主服务器出现问题时,可以切换到从服务器。 相信大家对于这些好处已经非常了解了,在项目的部署中也采用这种方案。但是MySQL的主从同步一直有从库延迟的问题,那么为什么会有这种问题。这种问题如何解决呢? MyS

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。

【电机控制】数字滤波算法(持续更新)

文章目录 前言1. 数字低通滤波 前言 各种数字滤波原理,离散化公式及代码。 1. 数字低通滤波 滤波器公式 一阶低通滤波器的输出 y [ n ] y[n] y[n] 可以通过以下公式计算得到: y [ n ] = α x [ n ] + ( 1 − α ) y [ n − 1 ] y[n] = \alpha x[n] + (1 - \alpha) y[n-1]

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

使用条件变量实现线程同步:C++实战指南

使用条件变量实现线程同步:C++实战指南 在多线程编程中,线程同步是确保程序正确性和稳定性的关键。条件变量(condition variable)是一种强大的同步原语,用于在线程之间进行协调,避免数据竞争和死锁。本文将详细介绍如何在C++中使用条件变量实现线程同步,并提供完整的代码示例和详细的解释。 什么是条件变量? 条件变量是一种同步机制,允许线程在某个条件满足之前进入等待状态,并在条件满