将经纬仪改造成赤道仪,使步进电机每隔n秒转动一定角度的arduino程序

#include <Keypad.h>

/*  该程序可以设定步进电机每隔timer秒,就转动stepDistance个脉冲。42步进电机好像是2048个脉冲,电机转一圈。
    使用的时候,A和B控制电机正反转,C开启定时发脉冲的时间,D取消定时发脉冲。
    比如,每隔5秒钟让电子转动2048/20/n个脉冲,先按数字n,让电机走2048/20/n个脉冲先,然后按C开启定时模式,再按5,接着按#,设定arduino板每5秒发一次脉冲。    

   本程序主要使用薄膜键盘、arduino uno、42步进电机、12V超威电池、5节电池盒加5节南孚电池(普通5号电池也可以,给arduino供电)、tb6560电机驱动板、1模15齿凸台圆柱齿轮、1模60齿凸台圆柱齿轮、杜邦线若干、迷你面包板一个

*/
/* 键盘部分的定义 */
const byte    ROWS    = 4;    /* 四行 */
const byte    COLS    = 4;    /* 四列 */
/* 定义键盘上的按键标识 */
char    hexaKeys[ROWS][COLS] = {
    { '1', '2', '3', 'A' },
    { '4', '5', '6', 'B' },
    { '7', '8', '9', 'C' },
    { '*', '0', '#', 'D' }
};
byte    rowPins[ROWS] = { 9, 8, 7, 6 }; /* 连接到行扫描的输入输出端口 */
byte    colPins[COLS] = { 5, 4, 3, 2 }; /* 连接到列扫描的输入输出端口 */

/* 定义Keypad类的实例 */
Keypad customKeypad = Keypad( makeKeymap( hexaKeys ), rowPins, colPins, ROWS, COLS );


/* 电机部分的定义 */
int    pul        = 11;           /*脉冲,控制转动距离 */
int    dir        = 12;           /* 转动方向 */
boolean timeFlag    = false;        /* 设置转动速度的标志 */
float    timer        = 0;            /* 电机转动的定时器*/
String    sTimer        = "";           /*电机转动的计时器,用来读取设定的倒计时间隔,String类型*/
int    stepDistance    = 0;            /*手动控制的步进角度*/
int    timerClock    = 0;            /*倒计时用*/
int     delayms = 100000;            /*电机转动间隔,数值越大,转动越平滑越缓慢,震动越小,单位是微秒*/


void setup()
{
    /* arduino的针脚11接TB6560的PUL+,arduino的GND接tb6560的PUL- */
    pinMode( pul, OUTPUT );
    pinMode( dir, OUTPUT );
    /* 设定一个默认的转动方向 */
    digitalWrite( dir, HIGH );
    /* 定义串口通讯的波特率,用于把键盘上按下的按钮信息打印到arduino IDE的控制台 */
    Serial.begin( 9600 );
}


void loop()
{
    char key = customKeypad.getKey();

    /* 如果有输入 */
    if ( key != NO_KEY )
    {
        /* 打印读取到的字符,即键盘被按下的键 */
        Serial.println( key );

        if ( key == 'A' )
        {
            digitalWrite( dir, HIGH );
        }else if ( key == 'B' )
        {
            digitalWrite( dir, LOW );
        }else if ( key == 'C' )/*初始化计时器,也可以用来停止电机转动 */
        {
            timer        = 0;
            sTimer        = "";
            timeFlag    = true;
            Serial.println( "init sTimer:" + sTimer );
        }else if ( key == 'D' )
        {
            timeFlag = false;
        }else if ( key == '#' )
        {
            timer        = sTimer.toInt();
            timerClock    = timer;
            Serial.println( "set timer done:" + sTimer );
        }else{
            /* 将读取到的字符转换成整型,1是49,2是50等,所以要减去48。 */
            int ikey = int(key) – 48;


            /*
             * 如果是1到9之间,就转动该数字的ikey/4圈
             * 一圈是2048个脉冲
             */
            if ( ikey >= 0 && ikey < 10 )
            {
                if ( timeFlag )
                {
                    sTimer.concat( key );
                    Serial.println( "sTimer:" + sTimer );
                }else{
                    stepDistance = ikey;
                    for ( int x = 0; x < 2048 / 20 / ikey; x++ )    /* 循环2036次 */
                    {
                        digitalWrite( pul, HIGH );              /* PUL+输出高电平 */
                        delayMicroseconds( delayms );               /* 等待 */
                        digitalWrite( pul, LOW );               /* PUL+输出低电平 */
                        delayMicroseconds( delayms );               /* 等待 */
                    }
                }
            }
        }
    }else if ( key == NO_KEY && timeFlag && timer != 0 )

/* 如果无输入,则进行倒计时指定时间间隔,然后接着转动指定角度 */
    {
        if ( timerClock > 0 )
        {
            timerClock = timerClock – 1;
        }
        if ( timerClock <= 0 )
        {
            timerClock = timer;
            for ( int x = 0; x < 2048 / 20 / stepDistance; x++ )    /* 循环2036次 */
            {
                digitalWrite( pul, HIGH );                      /* PUL+输出高电平 */
                delayMicroseconds( delayms );                       /* 等待 */
                digitalWrite( pul, LOW );                       /* PUL+输出低电平 */
                delayMicroseconds( delayms );                       /* 等待 */
            }
            Serial.println( "finish step once:" + sTimer );
        }
        delay( 1000 );
    }
}

Author: bkdwei