单片机控制舵机及步进电机
#include <Arduino.h>
#define AA1 4 //引脚命名
#define B1 5
#define C1 6
#define D1 7 ///128bu
#define AA2 8 //引脚命名
#define B2 9
#define C2 10
#define D2 11 ///128bu
#define dj1 A0
#define dj2 A1
#define dj3 A2
#define dj4 A3
#define dj5 A4
#define dj6 A5
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
String inputString = ""; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete
boolean getgm65stringComplete = false;
String getgm65 = "";
int _step = 0 ;
boolean dir; //= -1;正反转
int stepperSpeed = 4;//电机转速,1ms⼀步
#define KEY 12
void setup()
{Serial.begin(9600);mySerial.begin(9600);pinMode(13, OUTPUT);Serial.println("ok");pinMode(KEY, INPUT_PULLUP);pinMode(AA1, OUTPUT); //设置引脚为输出引脚pinMode(B1, OUTPUT);pinMode(C1, OUTPUT);pinMode(D1, OUTPUT);pinMode(AA2, OUTPUT); //设置引脚为输出引脚pinMode(B2, OUTPUT);pinMode(C2, OUTPUT);pinMode(D2, OUTPUT);motorZ1(100, 3);motorF1(100, 3);motorT1();motorZ2(100, 3);motorF2(100, 3);motorT2();mydj(dj1, 160);delay(1000);mydj(dj1, 10);delay(1000);mydj(dj2, 160);delay(1000);mydj(dj2, 10);delay(1000);mydj(dj3, 160);delay(1000);mydj(dj3, 10);delay(1000);mydj(dj4, 160);delay(1000);mydj(dj4, 10);delay(1000);mydj(dj5, 160);delay(1000);mydj(dj5, 10);delay(1000);mydj(dj6, 160);delay(1000);mydj(dj6, 10);delay(1000);
}
int xiangmu = 0;
char shaomafig1 = 0;
String shaoma1 = "";
String weizi[4] = {"", "", "", ""};
int weizinum = 0;
void loop()
{if (xiangmu == 0){if (digitalRead(KEY) == 0){delay(10);if (digitalRead(KEY) == 0){Serial.println("start");//按下开始送料电机转 300 步for (int i = 0; i < 4; i++){if (weizi[i] == ""){xiangmu = 1;}}if(xiangmu ==0)Serial.println("没有空的仓位");else{shaomafig1 = 0;motorZ1(300, 3);motorT1(); }}}}else if (xiangmu == 1)//等待扫码1 ok 送料电机转 300 步到 升降电机 升降电机找空位储存{// Serial.println(shaomafig1);if (shaomafig1 == 1){xiangmu = 2;shaomafig1 = 0;motorZ1(300, 3);motorT1();for (int i = 0; i < 4; i++){if (weizi[i] == ""){weizinum = i;i = 4;//return;}}Serial.println("位置=" + String(weizinum));if (weizinum == 0) //第⼀个储存位置{weizi[0] = shaoma1;for (int i = 0; i < 4; i++)Serial.println("位置" + String(i) + "码=" + String(weizi[i]));motorZ2(150, 3);//升降电机 转 150 步motorT2();mydj(dj5, 160); //第⼀层 舵机推⼊储存delay(1000);mydj(dj5, 10);delay(1000); xiangmu = 0;}else if (weizinum == 1) //第2个储存位置{weizi[1] = weizi[0]; //weizi[0] = shaoma1;for (int i = 0; i < 4; i++)Serial.println("位置" + String(i) + "码=" + String(weizi[i]));motorZ2(150, 3);//升降电机 转 150 步motorT2();mydj(dj5, 160); //第⼀层 舵机推⼊储存delay(1000);mydj(dj5, 10);delay(1000); xiangmu = 0;}else if (weizinum == 2) //第3个储存位置{weizi[2] = shaoma1;for (int i = 0; i < 4; i++)Serial.println("位置" + String(i) + "码=" + String(weizi[i]));motorZ2(300, 3);//升降电机 转 300 步motorT2();mydj(dj6, 160); //第2层 舵机推⼊储存delay(1000);mydj(dj6, 10);delay(1000); xiangmu = 0;}else if (weizinum == 3) //第4个储存位置{weizi[3] = weizi[2]; //weizi[2] = shaoma1;for (int i = 0; i < 4; i++)Serial.println("位置" + String(i) + "码=" + String(weizi[i]));motorZ2(300, 3);//升降电机 转 300 步motorT2();mydj(dj6, 160); //第2层 舵机推⼊储存delay(1000);mydj(dj6, 10);delay(1000); xiangmu = 0;}}}// digitalWrite(PC13,HIGH);// delay(300);// digitalWrite(PC13,LOW);// delay(300);//Serial.println("sdf");serialEvent1();serialEvent2();
}
void serialEvent1() {while (Serial.available()) {// get the new byte:char inChar = (char)Serial.read();Serial.write(inChar);// add it to the inputString:getgm65 += inChar;// if the incoming character is a newline, set a flag// so the main loop can do something about it:if (inChar == '!'){getgm65stringComplete = true;}if (getgm65stringComplete){Serial.println(getgm65);shaomafig1 = 1;Serial.println(shaomafig1);shaoma1 = getgm65;getgm65 = "";getgm65stringComplete = false;}}
}
void serialEvent2() {while (mySerial.available()) {// get the new byte:char inChar = (char)mySerial.read();Serial.write(inChar);// add it to the inputString:getgm65 += inChar;// if the incoming character is a newline, set a flag// so the main loop can do something about it:if (inChar == '!'){getgm65stringComplete = true;}if (getgm65stringComplete){Serial.println(getgm65);if (strstr(getgm65.c_str(), weizi[0].c_str()) != NULL && weizi[0] != ""){weizi[0] = "";mydj(dj1, 160);delay(1000);mydj(dj1, 10);}if (strstr(getgm65.c_str(), weizi[1].c_str()) != NULL && weizi[1] != ""){weizi[1] = "";mydj(dj2, 160);delay(1000);mydj(dj2, 10);}if (strstr(getgm65.c_str(), weizi[2].c_str()) != NULL && weizi[2] != ""){weizi[2] = "";mydj(dj3, 160);delay(1000);mydj(dj3, 10);}if (strstr(getgm65.c_str(), weizi[3].c_str()) != NULL && weizi[3] != ""){weizi[3] = "";mydj(dj4, 160);delay(1000);mydj(dj4, 10);}for (int i = 0; i < 4; i++)Serial.println("位置" + String(i) + "码=" + String(weizi[i]));getgm65 = "";getgm65stringComplete = false;}}
}
void motorT1()
{digitalWrite(AA1, 0); //A1引脚⾼电平digitalWrite(B1, LOW);digitalWrite(C1, LOW);digitalWrite(D1, LOW);
}
void motorF1(long bu, int yanshi)
{for (int i = 0; i < bu; i++){Phase_D1(); //设置A相位delay(yanshi); //改变延时可改变旋转速度Phase_C1(); //设置B相位delay(yanshi);Phase_B1(); //设置C相位delay(yanshi);Phase_A1(); //设置D相位delay(yanshi);}
}
void motorZ1(long bu, int yanshi)
{for (int i = 0; i < bu; i++){Phase_A1(); //设置A相位delay(yanshi); //改变延时可改变旋转速度Phase_B1(); //设置B相位delay(yanshi);Phase_C1(); //设置C相位delay(yanshi);Phase_D1(); //设置D相位delay(yanshi);}
}
void Phase_A1()
{digitalWrite(AA1, HIGH); //A1引脚⾼电平digitalWrite(B1, LOW);digitalWrite(C1, LOW);digitalWrite(D1, LOW);
}
void Phase_B1()
{digitalWrite(AA1, LOW);digitalWrite(B1, HIGH); //B1引脚⾼电平digitalWrite(C1, LOW);digitalWrite(D1, LOW);
}
void Phase_C1()
{digitalWrite(AA1, LOW);digitalWrite(B1, LOW);digitalWrite(C1, HIGH); //C1引脚⾼电平digitalWrite(D1, LOW);
}
void Phase_D1()
{digitalWrite(AA1, LOW);digitalWrite(B1, LOW);digitalWrite(C1, LOW);digitalWrite(D1, HIGH); //D1引脚⾼电平
}
void motorT2()
{digitalWrite(AA2, 0); //A1引脚⾼电平digitalWrite(B2, LOW);digitalWrite(C2, LOW);digitalWrite(D2, LOW);
}
void motorF2(long bu, int yanshi)
{for (int i = 0; i < bu; i++){Phase_D2(); //设置A相位delay(yanshi); //改变延时可改变旋转速度Phase_C2(); //设置B相位delay(yanshi);Phase_B2(); //设置C相位delay(yanshi);Phase_A2(); //设置D相位delay(yanshi);}
}
void motorZ2(long bu, int yanshi)
{for (int i = 0; i < bu; i++){Phase_A2(); //设置A相位delay(yanshi); //改变延时可改变旋转速度Phase_B2(); //设置B相位delay(yanshi);Phase_C2(); //设置C相位delay(yanshi);Phase_D2(); //设置D相位delay(yanshi);}
}
void Phase_A2()
{digitalWrite(AA2, HIGH); //A2引脚⾼电平digitalWrite(B2, LOW);digitalWrite(C2, LOW);digitalWrite(D2, LOW);
}
void Phase_B2()
{digitalWrite(AA2, LOW);digitalWrite(B2, HIGH); //B2引脚⾼电平digitalWrite(C2, LOW);digitalWrite(D2, LOW);
}
void Phase_C2()
{digitalWrite(AA2, LOW);digitalWrite(B2, LOW);digitalWrite(C2, HIGH); //C2引脚⾼电平digitalWrite(D2, LOW);
}
void Phase_D2()
{digitalWrite(AA2, LOW);digitalWrite(B2, LOW);digitalWrite(C2, LOW);digitalWrite(D2, HIGH); //D2引脚⾼电平
}
void mydj(int pin, int angle)
{int x;pinMode(pin, OUTPUT);x = map(angle, 0, 180, 500, 2500);for (int i = 0; i < 40; i++){digitalWrite(pin, 1);delayMicroseconds(x);digitalWrite(pin, 0);delayMicroseconds(20000 - x);}
}
单片机控制舵机及步进电机相关推荐
- 51单片机控制二相四线步进电机
步进电机按定子上绕组来分,有二相.三相和五相等系列.最受欢迎的是两相混合式步进电机,约占97%以上的市场份额,其原因是性价比高,配上细分驱动器后效果良好.该种电机的基本步距角为1.8°/步,配上半步驱 ...
- 89c52单片机控制两个步进电机正反转加减速(程序+仿真)
89c52单片机控制两个步进电机正反转加减速(程序+仿真) 先上图: 源代码: /*********************************************************** ...
- 单片机控制舵机matlab仿真,单片机舵机控制程序教程及proteus仿真原理图
单片机控制舵机的proteus仿真原理图: 单片机舵机控制程序教程,在压缩包中可下载全部内容: 单片机源程序: /******************************************* ...
- Arduino从零开始(2)——控制舵机与步进电机
0.前言 本文主要介绍通过Arduino控制舵机,步进电机以及循环的使用 目录 0.前言 1.介绍 2.Arduino控制舵机: 2.1方法一 2.2方法二 3.Arduino控制步进电机 1.介绍 ...
- 单片机控制两个步进电机画圆_基于单片机的步进电机转速控制设计详解(附程序)...
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件.在非超载的情况下,电机的转速.停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角.这 ...
- 步进电机-STM32单片机控制四相五线步进电机的程序
单片机控制步进电机的方法很简单,可以用IO口输出脉冲控制线圈电流驱动电机旋转,可分为四相四拍,四相八拍.四相电机,有四相四拍运行方式AB-BC-CD-DA-AB,四相八拍运行方式即 A-AB-B-BC ...
- 单片机控制两个步进电机画圆_51单片机控制两个步进电机
/*----------------------------------------------- 步进电机控制 ------------------------------------------- ...
- 使用51单片机控制舵机入门
舵机(sg90,板子是普中的51) 本人小白一枚,昨天用51实现了舵机的几个小功能,帮助和我一样初学的朋友~(。・`ω´・) 如有错误不足还请大家指点 接线 红电源 棕接地 橙色数据线 代码 希望实现 ...
- 51单片机控制舵机,舵机不动的定时器原因
舵机: 红色:VCC 棕色:GND 黄色:PWM 这是定时器0初始化: unsigned cha count = 0; unsigned char timer1 ;void Timer1_Init() ...
- 基于STC8G2K64S4单片机控制小车循迹(直流电机和步进电机)
基于STC8G2K64S4单片机控制小车循迹 #前言 本文从硬件和软件两方面介绍了使用STC8G2K64S4单片机控制舵机的方法,并使用步进电机和直流电机来举例说明 之前说讲了如何用STC8G2K64 ...
最新文章
- 一步一步SharePoint 2007之十六:注册并配置一个网站用户
- php。defined,PHP defined()函数的使用图文详解
- Pieczęć(模拟)
- pycharm项目目录结构_「Actix-web项目」-项目整体目录结构
- 2019年JavaScript状态调查中的新增功能
- 2017.10.11 Problem c 失败总结
- oracle怎么变为整数,如何在Oracle 11g SQL中为char添加整数?(How to add integers to char in Oracle 11g SQL?)...
- 大数据_Spark框架_快速上手_word count 案例-功能实现---Spark工作笔记0007
- 大数据之-Hadoop完全分布式_RM启动注意事项---大数据之hadoop工作笔记0041
- 常用商品条形码简介和成员国前缀码
- Android Paint类属性说明
- spark 读写SequenceFile
- 笔记:WPS关于设置页眉页脚的问题
- k8s-kubeadm安装(五 网络插件calico)
- 同是匿名社交,国内外“秘密”大不同
- Machine Learning 机器学习基本概念
- 3D建模刚学如何入手制作角色模型,需要学习哪些软件?
- linux 使用了哪个存储阵列卡,Linux中RAID概述及配置实验
- WPS转换成PDF在线
- 解决--python+selenium获取页面一闪几秒就消失的元素内容