找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3940|回复: 4
打印 上一主题 下一主题
收起左侧

通过arduino 控制 Arduino CNC 拓展板驱动42步步进电机,通过红外遥控以及蓝摇a'...

[复制链接]
跳转到指定楼层
楼主
ID:670217 发表于 2019-12-22 00:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 L_L 于 2019-12-29 00:10 编辑

/*
* Date:2019/12/20
* Content:HC-05 or Ir control Stepper motor
* Author : L.L
*/

#include <IRremote.h>
#define EN 8 //步进电机使能端,低电平有效
#define X_DIR 5 //X轴 步进电机方向控制
#define Y_DIR 6 //y轴 步进电机方向控制
#define Z_DIR 7 //z轴 步进电机方向控制
#define A_DIR 13 //A轴 步进电机方向控制
#define X_STP 2 //x轴 步进控制
#define Y_STP 3 //y轴 步进控制
#define Z_STP 4 //z轴 步进控制
#define A_STP 12 //z轴 步进控制

#define LEN 8 //缓冲区长度,建议大于5
unsigned int keyVal = 8;//按键的值,弹起不会变0(1-8)
unsigned int rockerVal = 521;//摇杆的值,停下变0xff 0xff(0-360)
unsigned int seekBarVal = 50;//滑块的值(0-100)

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

unsigned long results_value = 0;

unsigned long Flag0 = 0,Flag1 = 0,Flag2 = 0,Flag3 = 0,Flag4 = 0,Flag5 = 0,Flag6 = 0,Flag7 = 0;
unsigned long Flag8 = 0,Flag9 = 0,Flag10 = 0,Flag11 = 0,Flag12 = 0,Flag13 = 0,Flag14 = 0,Flag15 = 0;

unsigned long flag0 = 0,flag1 = 0,flag2 = 0,flag3 = 0,flag4 = 0,flag5 = 0,flag6 = 0;

void Rocker_Data_Analyze(unsigned char *str,unsigned char len)
{
  if(str[0] == 'y')
  {
    switch(str[1])
    {
      case 'd':
          rockerVal = str[2] + str[3];
          XY_judge();
          //Serial.println(rockerVal);
          break;
      case 'b':
          keyVal = str[2];
          //Serial.println(keyVal);
          break;
      case 'v':
          seekBarVal = str[2];
          //Serial.println(seekBarVal);
          Z_judge();
          break;
      default :break;        
    }
  }
}

void Uart_Receive(unsigned char cha)
{
  static unsigned char str[8];
  static unsigned char sta = 0;
  if((sta & 0x80) == 0)
  {
    if(sta & 0x40)
    {
      if(cha != 0x0D)
      {
        sta = 0;
      }
      else
      {
        sta |= 0x80;
        sta <<= 2;
        sta >>= 2;
        Rocker_Data_Analyze(str,sta);
        sta = 0;
      }
    }
    else
    {
      if(cha == 0x0A)
      {
        sta |= 0x40;
      }
      else
      {
        str[sta & 0x3F] = cha;
        sta++;
        if(sta > (LEN - 1))
        {
          sta = 0;
        }
      }
    }
   
  }
}


/*
//函数:step 功能:控制步进电机方向,步数。
//参数:dir 方向控制, dirPin对应步进电机的DIR引脚,stepperPin 对应步进电机的step引脚, steps 步进的步数
//无返回值
*/
void step(boolean dir, byte dirPin, byte stepperPin, unsigned long int steps,unsigned int TIME)
{
  digitalWrite(dirPin,dir);//dir为true 则dirPin引脚输出高电平,dir为false则dirPin引脚输出低电平
  //delay(50);
  
  for (unsigned long int i = 0; i < steps; i++) //脉冲信号需<1kHz
  {
    judge();
    digitalWrite(stepperPin, HIGH);//stepperPin引脚输出高电平
    delayMicroseconds(TIME);//延时300us
      
    digitalWrite(stepperPin, LOW);//stepperPin引脚输出高电平
    delayMicroseconds(TIME);
  }
}

void setup()
{ //将步进电机用到的IO管脚设置成输出
  Serial.begin(9600);//设置串口波特率为9600
  irrecv.enableIRIn(); // Start the receiver
  pinMode(X_DIR, OUTPUT); pinMode(X_STP, OUTPUT);
  pinMode(Y_DIR, OUTPUT); pinMode(Y_STP, OUTPUT);
  pinMode(Z_DIR, OUTPUT); pinMode(Z_STP, OUTPUT);
  pinMode(A_DIR, OUTPUT); pinMode(A_STP, OUTPUT);
  pinMode(EN, OUTPUT);
  digitalWrite(EN, LOW);//使能
}

void Stop()//停止转动
{
  while(1)
  {//X,Y,Z,A步进引脚均输出低电平
    digitalWrite(X_STP, LOW);
    digitalWrite(Y_STP, LOW);
    digitalWrite(Z_STP, LOW);
    digitalWrite(A_STP, LOW);
    judge();
  }
}

void XY_Stop()//停止转动
{
  while(1)
  {//X,Y步进引脚均输出低电平
    digitalWrite(X_STP, LOW);
    digitalWrite(Y_STP, LOW);
    digitalWrite(A_STP, LOW);
    judge();
  }
}

void Z_Stop()//停止转动
{
  while(1)
  {//Z轴停止运动
    digitalWrite(Z_STP, LOW);
    judge();
  }
}

void XY_judge()
{
    if((((rockerVal >= 0) && (rockerVal <= 30)) || ((rockerVal >= 330) && (rockerVal < 360))) && (flag0 == 0))
    {
      flag1 = flag2 = flag3 = flag4 = flag5 = flag6 = 0;
      flag0++;
      if(flag0 > 60000) flag0 = 1;
      Serial.print("X+");Serial.print('\t');Serial.print("Speed:");Serial.println(900 - keyVal * 100);
      step(true, X_DIR, X_STP, 160000,900 - keyVal * 100);
    }
    if(((rockerVal >= 60) && (rockerVal<= 120))&& (flag1 == 0))
    {
      flag0 =flag2 = flag3 = flag4 = flag5 = flag6 = 0;
      flag1++;
      if(flag1 > 60000) flag1 = 1;
      Serial.print("Y- and A-");Serial.print('\t');Serial.print("Speed:");Serial.println(900 - keyVal * 100);
      step(false, Y_DIR, Y_STP, 160000,900 - keyVal * 100);
    }
    if(((rockerVal >= 150) && (rockerVal<= 210)) && (flag2 == 0))
    {
      flag0 = flag1 = flag3 = flag4 = flag5 = flag6 = 0;
      flag2++;
      if(flag2 > 60000) flag2 = 1;
      Serial.print("X-");Serial.print('\t');Serial.print("Speed:");Serial.println(900 - keyVal * 100);
      step(false, X_DIR, X_STP, 160000,900 - keyVal * 100);
    }
    if(((rockerVal >= 240) && (rockerVal<= 300))&& (flag3 == 0))
    {
      flag0 = flag1 =flag2 = flag4 = flag5 = flag6 = 0;
      flag3++;
      if(flag3 > 60000) flag3 = 1;
      Serial.print("Y+ and A+");Serial.print('\t');Serial.print("Speed:");Serial.println(900 - keyVal * 100);
      step(true, Y_DIR, Y_STP, 160000,900 - keyVal * 100);
    }
   
    if((rockerVal == 510) && (flag4 == 0))
    {
       flag0 = flag1 =flag2 = flag3 = flag5 = flag6 = 0;
       flag4++;
       if(flag4 > 60000)  flag4 = 1;
       Serial.println("XY_Stop");
       XY_Stop();
    }
   
}

void Z_judge()
{
    if((seekBarVal >= 0) && (seekBarVal <= 25))
    {
      flag0 = flag1 =flag2 = flag3 = flag4 = flag5 = flag6 = 0;
      Serial.println("Z-");
      //Serial.println(seekBarVal);
      step(false, Z_DIR, Z_STP, 80000,150);
    }
    if((seekBarVal >= 75) && (seekBarVal <= 100))
    {
      flag0 = flag1 =flag2 = flag3 = flag4 = flag5 = flag6 = 0;
      Serial.println("Z+");
      //Serial.println(seekBarVal);
      step(true, Z_DIR, Z_STP, 80000,150);
    }
   
    if(((seekBarVal > 25) && (seekBarVal < 75)) && (flag5 == 0))
    {
      flag0 = flag1 = flag2 = flag3 = flag4 = flag6 = 0;
      flag5++;
      if(flag5 > 60000)flag5 = 1;
      Serial.println("Z_Stop");
      Z_Stop();
    }  
   
}

void loop()//死循环
{
  judge();
}

void BT_judge()
{
  while(Serial.available())//若检测到串口有数据,则进入循环
  {
    char data = Serial.read();//读取串口数据
    Uart_Receive(data);
  }
}

void IR_judge()
{
   if (irrecv.decode(&results))
  {
    //Serial.println(results.value, HEX);
    results.value = results.value;
    switch(results.value)
    {
      case 0xFFC23D:
                    if(Flag0 == 0)
                    {
                      Flag1 = 0,Flag2 = 0,Flag3 = 0,Flag4 = 0,Flag5 = 0,Flag6 = 0,Flag7 = 0;
                      Flag8 = 0,Flag9 = 0,Flag10 = 0,Flag11 = 0,Flag12 = 0,Flag13 = 0,Flag14 = 0,Flag15 = 0;
                      Flag0++;
                      if(Flag0 >60000) Flag0 = 1;
                      Serial.println("STOP");
                      Stop();
                    }
                    break;
   
      case 0xFF02FD:
                    if(Flag1 == 0)
                    {
                      Flag0 = 0,Flag2 = 0,Flag3 = 0,Flag4 = 0,Flag5 = 0,Flag6 = 0,Flag7 = 0;
                      Flag8 = 0,Flag9 = 0,Flag10 = 0,Flag11 = 0,Flag12 = 0,Flag13 = 0,Flag14 = 0,Flag15 = 0;
                      Flag1++;
                      if(Flag1 >60000) Flag1 = 1;
                      Serial.println("X+");
                      step(true, X_DIR, X_STP, 160000,300);
                    }
                    break;
      case 0xFF5AA5:
                    if(Flag2 == 0)
                    {
                      Flag0 = 0,Flag1 = 0,Flag3 = 0,Flag4 = 0,Flag5 = 0,Flag6 = 0,Flag7 = 0;
                      Flag8 = 0,Flag9 = 0,Flag10 = 0,Flag11 = 0,Flag12 = 0,Flag13 = 0,Flag14 = 0,Flag15 = 0;
                      Flag2++;
                      if(Flag2 >60000) Flag2 = 1;
                      Serial.println("X++");
                      step(true, X_DIR, X_STP, 160000,200);
                    }

                    break;
      case 0xFF30CF:
                     if(Flag3 == 0)
                    {
                      Flag0 = 0,Flag1 = 0,Flag2 = 0,Flag4 = 0,Flag5 = 0,Flag6 = 0,Flag7 = 0;
                      Flag8 = 0,Flag9 = 0,Flag10 = 0,Flag11 = 0,Flag12 = 0,Flag13 = 0,Flag14 = 0,Flag15 = 0;
                      Flag3++;
                      if(Flag3 >60000) Flag3 = 1;
                      Serial.println("X+++");
                      step(true, X_DIR, X_STP, 160000,100);
                    }

                    break;
               
      case 0xFF22DD:
                    if(Flag4 == 0)
                    {
                      Flag0 = 0,Flag1 = 0,Flag2 = 0,Flag3 = 0,Flag5 = 0,Flag6 = 0,Flag7 = 0;
                      Flag8 = 0,Flag9 = 0,Flag10 = 0,Flag11 = 0,Flag12 = 0,Flag13 = 0,Flag14 = 0,Flag15 = 0;
                      Flag4++;
                      if(Flag4 >60000) Flag4 = 1;
                      Serial.println("X-");
                      step(false, X_DIR, X_STP, 160000,300);
                    }

                    break;
      case 0xFF10EF:
                    if(Flag5 == 0)
                    {
                      Flag0 = 0,Flag1 = 0,Flag2 = 0,Flag3 = 0,Flag4 = 0,Flag6 = 0,Flag7 = 0;
                      Flag8 = 0,Flag9 = 0,Flag10 = 0,Flag11 = 0,Flag12 = 0,Flag13 = 0,Flag14 = 0,Flag15 = 0;
                      Flag5++;
                      if(Flag5 >60000) Flag5 = 1;
                      Serial.println("X--");
                      step(false, X_DIR, X_STP, 160000,200);
                    }

                    break;
      case 0xFF7A85:
                     if(Flag6 == 0)
                    {
                      Flag0 = 0,Flag1 = 0,Flag2 = 0,Flag3 = 0,Flag4 = 0,Flag5 = 0,Flag7 = 0;
                      Flag8 = 0,Flag9 = 0,Flag10 = 0,Flag11 = 0,Flag12 = 0,Flag13 = 0,Flag14 = 0,Flag15 = 0;
                      Flag6++;
                      if(Flag6 >60000) Flag6 = 1;
                    Serial.println("X---");
                    step(false, X_DIR, X_STP, 160000,100);
                    }

                    break;
               
      case 0xFFA857:
                    if(Flag7 == 0)
                    {
                      Flag0 = 0,Flag1 = 0,Flag2 = 0,Flag3 = 0,Flag4 = 0,Flag5 = 0,Flag6 = 0;
                      Flag8 = 0,Flag9 = 0,Flag10 = 0,Flag11 = 0,Flag12 = 0,Flag13 = 0,Flag14 = 0,Flag15 = 0;
                      Flag7++;
                      if(Flag7 >60000) Flag7 = 1;
                    Serial.println("Y+ and A+");
                    step(true, Y_DIR, Y_STP, 160000,300);
                    }

                    break;
      case 0xFF18E7:
                    if(Flag8 == 0)
                    {
                      Flag0 = 0,Flag1 = 0,Flag2 = 0,Flag4 = 0,Flag5 = 0,Flag6 = 0,Flag7 = 0;
                      Flag3 = 0,Flag9 = 0,Flag10 = 0,Flag11 = 0,Flag12 = 0,Flag13 = 0,Flag14 = 0,Flag15 = 0;
                      Flag8++;
                      if(Flag8 >60000) Flag8 = 1;
                    Serial.println("Y++ and A++");
                    step(true, Y_DIR, Y_STP, 160000,200);
                    }

                    break;
      case 0xFF42BD:
                    if(Flag9 == 0)
                    {
                      Flag0 = 0,Flag1 = 0,Flag2 = 0,Flag4 = 0,Flag5 = 0,Flag6 = 0,Flag7 = 0;
                      Flag8 = 0,Flag3 = 0,Flag10 = 0,Flag11 = 0,Flag12 = 0,Flag13 = 0,Flag14 = 0,Flag15 = 0;
                      Flag9++;
                      if(Flag9 >60000) Flag9 = 1;
                    Serial.println("Y+++ and A+++");
                    step(true, Y_DIR, Y_STP, 160000,100);
                    }

                    break;
               
      case 0xFFE01F:
                    if(Flag10 == 0)
                    {
                      Flag0 = 0,Flag1 = 0,Flag2 = 0,Flag4 = 0,Flag5 = 0,Flag6 = 0,Flag7 = 0;
                      Flag8 = 0,Flag9 = 0,Flag3 = 0,Flag11 = 0,Flag12 = 0,Flag13 = 0,Flag14 = 0,Flag15 = 0;
                      Flag10++;
                      if(Flag10 >60000) Flag10 = 1;
                    Serial.println("Y- and A-");
                    step(false, Y_DIR, Y_STP, 160000,300);
                    }

                    break;
      case 0xFF4AB5:
                    if(Flag11 == 0)
                    {
                      Flag0 = 0,Flag1 = 0,Flag2 = 0,Flag4 = 0,Flag5 = 0,Flag6 = 0,Flag7 = 0;
                      Flag8 = 0,Flag9 = 0,Flag10 = 0,Flag3 = 0,Flag12 = 0,Flag13 = 0,Flag14 = 0,Flag15 = 0;
                      Flag11++;
                      if(Flag11 >60000) Flag11 = 1;
                    Serial.println("Y-- and A--");
                    step(false, Y_DIR, Y_STP, 160000,200);
                    }

                    break;
      case 0xFF52AD:
                    if(Flag12 == 0)
                    {
                      Flag0 = 0,Flag1 = 0,Flag2 = 0,Flag4 = 0,Flag5 = 0,Flag6 = 0,Flag7 = 0;
                      Flag8 = 0,Flag9 = 0,Flag10 = 0,Flag11 = 0,Flag3 = 0,Flag13 = 0,Flag14 = 0,Flag15 = 0;
                      Flag12++;
                      if(Flag12 >60000) Flag12 = 1;
                    Serial.println("Y--- and A---");
                    step(false, Y_DIR, Y_STP, 160000,100);
                    }

                    break;
              
      case 0xFFE21D:
                     if(Flag13 == 0)
                    {
                      Flag0 = 0,Flag1 = 0,Flag2 = 0,Flag4 = 0,Flag5 = 0,Flag6 = 0,Flag7 = 0;
                      Flag8 = 0,Flag9 = 0,Flag10 = 0,Flag11 = 0,Flag12 = 0,Flag3 = 0,Flag14 = 0,Flag15 = 0;
                      Flag13++;
                      if(Flag13 >60000) Flag13 = 1;
                    Serial.println("Z++");
                    step(true, Z_DIR, Z_STP, 160000,150);
                    }

                    break;
      case 0xFFA25D:
                     if(Flag14 == 0)
                    {
                      Flag0 = 0,Flag1 = 0,Flag2 = 0,Flag4 = 0,Flag5 = 0,Flag6 = 0,Flag7 = 0;
                      Flag8 = 0,Flag9 = 0,Flag10 = 0,Flag11 = 0,Flag12 = 0,Flag13 = 0,Flag3 = 0,Flag15 = 0;
                      Flag14++;
                      if(Flag14 >60000) Flag14 = 1;
                    Serial.println("Z--");
                    step(false, Z_DIR, Z_STP, 160000,150);
                    }

                    break;
               
      default :break;
    }
    irrecv.resume(); // Receive the next value
  }
}

void judge()
{
     if(Serial.available())
    {
        BT_judge();
    }
    else
    {     
        IR_judge();
    }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:709180 发表于 2020-3-26 04:47 | 只看该作者
没人试试吗?
回复

使用道具 举报

板凳
ID:185255 发表于 2020-4-13 19:45 | 只看该作者
楼主用的步进电机型号能不能发出来看看啊
回复

使用道具 举报

地板
ID:670217 发表于 2021-6-6 01:15 | 只看该作者
利维亚的工程师 发表于 2020-4-13 19:45
楼主用的步进电机型号能不能发出来看看啊

42步进电机
回复

使用道具 举报

5#
ID:1094297 发表于 2023-9-22 23:24 | 只看该作者
Arduino:1.8.19 (Windows 10), 开发板:"WEMOS D1 MINI ESP32, 80MHz, Default, 240MHz (WiFi/BT), 921600, None, Disabled"

sketch_sep22a:7:10: fatal error: IRremote.h: No such file or directory

#include <IRremote.h>

          ^~~~~~~~~~~~

compilation terminated.

exit status 1

IRremote.h: No such file or directory



在文件 -> 首选项开启
“编译过程中显示详细输出”选项
这份报告会包含更多信息。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表