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

单片机控制舵机及步进电机相关推荐

  1. 51单片机控制二相四线步进电机

    步进电机按定子上绕组来分,有二相.三相和五相等系列.最受欢迎的是两相混合式步进电机,约占97%以上的市场份额,其原因是性价比高,配上细分驱动器后效果良好.该种电机的基本步距角为1.8°/步,配上半步驱 ...

  2. 89c52单片机控制两个步进电机正反转加减速(程序+仿真)

    89c52单片机控制两个步进电机正反转加减速(程序+仿真) 先上图: 源代码: /*********************************************************** ...

  3. 单片机控制舵机matlab仿真,单片机舵机控制程序教程及proteus仿真原理图

    单片机控制舵机的proteus仿真原理图: 单片机舵机控制程序教程,在压缩包中可下载全部内容: 单片机源程序: /******************************************* ...

  4. Arduino从零开始(2)——控制舵机与步进电机

    0.前言 本文主要介绍通过Arduino控制舵机,步进电机以及循环的使用 目录 0.前言 1.介绍 2.Arduino控制舵机: 2.1方法一 2.2方法二 3.Arduino控制步进电机 1.介绍 ...

  5. 单片机控制两个步进电机画圆_基于单片机的步进电机转速控制设计详解(附程序)...

    步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件.在非超载的情况下,电机的转速.停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角.这 ...

  6. 步进电机-STM32单片机控制四相五线步进电机的程序

    单片机控制步进电机的方法很简单,可以用IO口输出脉冲控制线圈电流驱动电机旋转,可分为四相四拍,四相八拍.四相电机,有四相四拍运行方式AB-BC-CD-DA-AB,四相八拍运行方式即 A-AB-B-BC ...

  7. 单片机控制两个步进电机画圆_51单片机控制两个步进电机

    /*----------------------------------------------- 步进电机控制 ------------------------------------------- ...

  8. 使用51单片机控制舵机入门

    舵机(sg90,板子是普中的51) 本人小白一枚,昨天用51实现了舵机的几个小功能,帮助和我一样初学的朋友~(。・`ω´・) 如有错误不足还请大家指点 接线 红电源 棕接地 橙色数据线 代码 希望实现 ...

  9. 51单片机控制舵机,舵机不动的定时器原因

    舵机: 红色:VCC 棕色:GND 黄色:PWM 这是定时器0初始化: unsigned cha count = 0; unsigned char timer1 ;void Timer1_Init() ...

  10. 基于STC8G2K64S4单片机控制小车循迹(直流电机和步进电机)

    基于STC8G2K64S4单片机控制小车循迹 #前言 本文从硬件和软件两方面介绍了使用STC8G2K64S4单片机控制舵机的方法,并使用步进电机和直流电机来举例说明 之前说讲了如何用STC8G2K64 ...

最新文章

  1. 一步一步SharePoint 2007之十六:注册并配置一个网站用户
  2. php。defined,PHP defined()函数的使用图文详解
  3. Pieczęć(模拟)
  4. pycharm项目目录结构_「Actix-web项目」-项目整体目录结构
  5. 2019年JavaScript状态调查中的新增功能
  6. 2017.10.11 Problem c 失败总结
  7. oracle怎么变为整数,如何在Oracle 11g SQL中为char添加整数?(How to add integers to char in Oracle 11g SQL?)...
  8. 大数据_Spark框架_快速上手_word count 案例-功能实现---Spark工作笔记0007
  9. 大数据之-Hadoop完全分布式_RM启动注意事项---大数据之hadoop工作笔记0041
  10. 常用商品条形码简介和成员国前缀码
  11. Android Paint类属性说明
  12. spark 读写SequenceFile
  13. 笔记:WPS关于设置页眉页脚的问题
  14. k8s-kubeadm安装(五 网络插件calico)
  15. 同是匿名社交,国内外“秘密”大不同
  16. Machine Learning 机器学习基本概念
  17. 3D建模刚学如何入手制作角色模型,需要学习哪些软件?
  18. linux 使用了哪个存储阵列卡,Linux中RAID概述及配置实验
  19. WPS转换成PDF在线
  20. 解决--python+selenium获取页面一闪几秒就消失的元素内容

热门文章

  1. 为什么计算机和网络设备都需要接地,一个实例全面讲解机房如何做防雷接地?...
  2. Maya 2018 for Mac中文破解版永久激活方法含注册机
  3. Python 实现大量图片裁剪拼接并生成PDF
  4. 供应商管理系统SRM
  5. 实现生成木马的自动变异
  6. Stata:工具变量法(两阶段最小二乘法2SLS)——解决模型内生性
  7. 让优秀成为一种习惯——笔录
  8. Vue.js开发基础 05
  9. FPGA学习.7——DDS信号发生器
  10. java编程删除文本框_Java获取和删除Word文本框中的表格