|
本帖最后由 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 //步進(jìn)電機(jī)使能端,低電平有效
#define X_DIR 5 //X軸 步進(jìn)電機(jī)方向控制
#define Y_DIR 6 //y軸 步進(jìn)電機(jī)方向控制
#define Z_DIR 7 //z軸 步進(jìn)電機(jī)方向控制
#define A_DIR 13 //A軸 步進(jìn)電機(jī)方向控制
#define X_STP 2 //x軸 步進(jìn)控制
#define Y_STP 3 //y軸 步進(jìn)控制
#define Z_STP 4 //z軸 步進(jìn)控制
#define A_STP 12 //z軸 步進(jìn)控制
#define LEN 8 //緩沖區(qū)長度,建議大于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;
}
}
}
}
}
/*
//函數(shù):step 功能:控制步進(jìn)電機(jī)方向,步數(shù)。
//參數(shù):dir 方向控制, dirPin對應(yīng)步進(jìn)電機(jī)的DIR引腳,stepperPin 對應(yīng)步進(jìn)電機(jī)的step引腳, steps 步進(jìn)的步數(shù)
//無返回值
*/
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);//延時(shí)300us
digitalWrite(stepperPin, LOW);//stepperPin引腳輸出高電平
delayMicroseconds(TIME);
}
}
void setup()
{ //將步進(jìn)電機(jī)用到的IO管腳設(shè)置成輸出
Serial.begin(9600);//設(shè)置串口波特率為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()//停止轉(zhuǎn)動
{
while(1)
{//X,Y,Z,A步進(jìn)引腳均輸出低電平
digitalWrite(X_STP, LOW);
digitalWrite(Y_STP, LOW);
digitalWrite(Z_STP, LOW);
digitalWrite(A_STP, LOW);
judge();
}
}
void XY_Stop()//停止轉(zhuǎn)動
{
while(1)
{//X,Y步進(jìn)引腳均輸出低電平
digitalWrite(X_STP, LOW);
digitalWrite(Y_STP, LOW);
digitalWrite(A_STP, LOW);
judge();
}
}
void Z_Stop()//停止轉(zhuǎn)動
{
while(1)
{//Z軸停止運(yùn)動
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()//死循環(huán)
{
judge();
}
void BT_judge()
{
while(Serial.available())//若檢測到串口有數(shù)據(jù),則進(jìn)入循環(huán)
{
char data = Serial.read();//讀取串口數(shù)據(jù)
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();
}
}
|
評分
-
查看全部評分
|