NodeMCU
此NodeMCU是在乐鑫公司(Espressif Systems)生产的ESP-12F模组的基础上封装好的具备WiFi功能的开源IoT开发板。本次选用安信可公司(Ai-Thinker)生产的CP2102版本的开发板。
28BYJ-48型步进电机
28BYJ-48型步进电机是有效最大外径为28毫米的采用4相8拍控制的永磁式减速步进电机。关于该电机的工作原理可参考这两篇博客:https://blog.csdn.net/X0_ImPeRial/article/details/128228004、使用 ULN2003 驱动 28BYJ-48 步进电机_uln2003能驱动哪些步进电机-CSDN博客
采用4相8拍驱动28BYJ-48型步进电机顺时针旋转(面向可以看到输出轴的那一面)的引脚电压分配如下表所示:
引脚 | 第1步 | 第2步 | 第3步 | 第4步 | 第5步 | 第6步 | 第7步 | 第8步 |
D1 | 高 | 高 | 低 | 低 | 低 | 低 | 低 | 高 |
D2 | 低 | 高 | 高 | 高 | 低 | 低 | 低 | 低 |
D3 | 低 | 低 | 低 | 高 | 高 | 高 | 低 | 低 |
D4 | 低 | 低 | 低 | 低 | 低 | 高 | 高 | 高 |
每一步切换时需适当延时。经测试,在本项目中至少延时900ms才不会失步。经计算和实际测试,输出主轴旋转一圈约需要512个8拍。
采用4相8拍驱动28BYJ-48型步进电机逆时针旋转(面向看不到输出轴的那一面)的引脚电压分配是将上表中的电平取反。
ULN2003驱动板
ULN2003驱动板作用是将INT1、INT2、INT3、INT4输入的信号放大后输出到OUT1、OUT2、OUT3、OUT4中,以满足28BYJ-48型步进电机的工作电压。
接线
NodeMCU | ULN2003 | 28BYJ-48 | 电源 |
OUT1 | 1 | ||
OUT2 | 2 | ||
OUT3 | 3 | ||
OUT4 | 4 | ||
D4 | INT1 | ||
D3 | INT2 | ||
D2 | INT3 | ||
D1 | INT4 | ||
+ | 5 | 5V | |
GND | - | GND |
代码
//<Stepper.h>在arduino uno上运行一切正常,但在nodeMCU上会出现各种错误,索性我就自己写了个驱动。
//选择NodeMCU 0.9 (ESP-12 module)
void setup()
{
stepmotor_initial(); //步进电机初始化
}
void loop()
{
clockwise_turn_one_circle(); //顺时针转一圈
delay(2);
anti_clockwise_turn_one_circle(); //逆时针转一圈
delay(2);
}
void stepmotor_initial()
{
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
pinMode(D3, OUTPUT);
pinMode(D4, OUTPUT);
}
void clockwise_turn_one_circle()
{
for(int i=0;i<512;i++)
{
digitalWrite(D1, HIGH);
digitalWrite(D2, LOW);
digitalWrite(D3, LOW);
digitalWrite(D4, LOW);
delay(1);
digitalWrite(D1, HIGH);
digitalWrite(D2, HIGH);
digitalWrite(D3, LOW);
digitalWrite(D4, LOW);
delay(1);
digitalWrite(D1, LOW);
digitalWrite(D2, HIGH);
digitalWrite(D3, LOW);
digitalWrite(D4, LOW);
delay(1);
digitalWrite(D1, LOW);
digitalWrite(D2, HIGH);
digitalWrite(D3, HIGH);
digitalWrite(D4, LOW);
delay(1);
digitalWrite(D1, LOW);
digitalWrite(D2, LOW);
digitalWrite(D3, HIGH);
digitalWrite(D4, LOW);
delay(1);
digitalWrite(D1, LOW);
digitalWrite(D2, LOW);
digitalWrite(D3, HIGH);
digitalWrite(D4, HIGH);
delay(1);
digitalWrite(D1, LOW);
digitalWrite(D2, LOW);
digitalWrite(D3, LOW);
digitalWrite(D4, HIGH);
delay(1);
digitalWrite(D1, HIGH);
digitalWrite(D2, LOW);
digitalWrite(D3, LOW);
digitalWrite(D4, HIGH);
delay(1);
}
}
void anti_clockwise_turn_one_circle()
{
for(int i=0;i<512;i++)
{
digitalWrite(D1, LOW);
digitalWrite(D2, LOW);
digitalWrite(D3, LOW);
digitalWrite(D4, HIGH);
delay(1);
digitalWrite(D1, LOW);
digitalWrite(D2, LOW);
digitalWrite(D3, HIGH);
digitalWrite(D4, HIGH);
delay(1);
digitalWrite(D1, LOW);
digitalWrite(D2, LOW);
digitalWrite(D3, HIGH);
digitalWrite(D4, LOW);
delay(1);
digitalWrite(D1, LOW);
digitalWrite(D2, HIGH);
digitalWrite(D3, HIGH);
digitalWrite(D4, LOW);
delay(1);
digitalWrite(D1, LOW);
digitalWrite(D2, HIGH);
digitalWrite(D3, LOW);
digitalWrite(D4, LOW);
delay(1);
digitalWrite(D1, HIGH);
digitalWrite(D2, HIGH);
digitalWrite(D3, LOW);
digitalWrite(D4, LOW);
delay(1);
digitalWrite(D1, HIGH);
digitalWrite(D2, LOW);
digitalWrite(D3, LOW);
digitalWrite(D4, LOW);
delay(1);
digitalWrite(D1, HIGH);
digitalWrite(D2, LOW);
digitalWrite(D3, LOW);
digitalWrite(D4, HIGH);
delay(1);
}
}
注意事项
请避免使用NodeMCU的电源引脚为电机供电,因为这样做不仅无法提供足够的动力,还会导致程序烧录出错。
参考
零基础入门学用Arduino教程 – 专项教程篇(电机部分)-8 28BYJ-48步进电机 – 太极创客