本人新手,还在实验入门教程,根据教程的代码不管怎么写都只朝一个方向转,没弄明白,只好看Stepper.cpp源码。发现注释有这个玩意,应该是步进各相的时序吧(四拍?)
Step C0 C1 C2 C3
1 1 0 1 0
2 0 1 1 0
3 0 1 0 1
4 1 0 0 1
但网上只查到这种时序(八拍?),
橙 黄 粉 蓝 十六制
1 0 0 0 0x08
1 1 0 0 0x0c
0 1 0 0 0x04
0 1 1 0 0x06
0 0 1 0 0x02
0 0 1 1 0x03
0 0 0 1 0x01
1 0 0 1 0x09
于是在Stepper里加了个方法:
- void Stepper::stepMotor1(int thisStep){
- switch (thisStep) {
- case 0: // 0001
- digitalWrite(motor_pin_1, LOW);
- digitalWrite(motor_pin_2, LOW);
- digitalWrite(motor_pin_3, LOW);
- digitalWrite(motor_pin_4, HIGH);
- break;
- case 1: // 0011
- digitalWrite(motor_pin_1, LOW);
- digitalWrite(motor_pin_2, LOW);
- digitalWrite(motor_pin_3, HIGH);
- digitalWrite(motor_pin_4, HIGH);
- break;
- case 2: //0010
- digitalWrite(motor_pin_1, LOW);
- digitalWrite(motor_pin_2, LOW);
- digitalWrite(motor_pin_3, HIGH);
- digitalWrite(motor_pin_4, LOW);
- break;
- case 3: //0110
- digitalWrite(motor_pin_1, LOW);
- digitalWrite(motor_pin_2, HIGH);
- digitalWrite(motor_pin_3, HIGH);
- digitalWrite(motor_pin_4, LOW);
- break;
- case 4: //0100
- digitalWrite(motor_pin_1, LOW);
- digitalWrite(motor_pin_2, HIGH);
- digitalWrite(motor_pin_3, LOW);
- digitalWrite(motor_pin_4, LOW);
- break;
- case 5: //1100
- digitalWrite(motor_pin_1, HIGH);
- digitalWrite(motor_pin_2, HIGH);
- digitalWrite(motor_pin_3, LOW);
- digitalWrite(motor_pin_4, LOW);
- break;
- case 6: //1000
- digitalWrite(motor_pin_1, HIGH);
- digitalWrite(motor_pin_2, LOW);
- digitalWrite(motor_pin_3, LOW);
- digitalWrite(motor_pin_4, LOW);
- break;
- case 7: //1001
- digitalWrite(motor_pin_1, HIGH);
- digitalWrite(motor_pin_2, LOW);
- digitalWrite(motor_pin_3, LOW);
- digitalWrite(motor_pin_4, HIGH);
- break;
- }
- }
复制代码
同时把step里面的代码改下
- //stepMotor(this->step_number % 4);
- stepMotor1(this->step_number % 8);
复制代码
OK, 这下调用step()方法两个方向都能转了。。虽然可以通过调整调用stepMotor1的频率来控制转速,
但还是不清楚28BYJ-48一圈到底是多少步,于是又实验下,发现外围转一圈大概调用四千多次方法,难道步数就是360除以步进角度吗?查了下28BYJ-48步进角度5.625/64,是那不就是360/(5.625/64)=4096步吗?跟实验不谋而合,求证实,因为没看到一个教程说28BYJ-48一圈是4096步。。。{:soso_e132:} {:soso_e103:}
|