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