/* this arduino sketch / script is based on stm32duino libmaple core
* running on stm32f103c{8,b} maple mini or blue pill
*
* the various waveforms used are based on inspiration from wikipedia and hence i named the functions similarly
* https://en.wikipedia.org/wiki/Stepper_motor#Phase_current_waveforms
*
* this sketch respond to keystroke commands on the usb-serial console
*
* 's' - start or stop
* 'r' - reverse the direction
* '+' - increase the speed (reduce the wait delay)
* '-' - reduce the speed (increase the wait delay)
* 'm' - switches the mode (wave drive (default), half step and full step)
*
* license MIT
*/
#include <Arduino.h>
#include <usb_serial.h>
void checkcmd(void);
void halfstep(void);
void fullstep(void);
void wavedrive(void);
//#define ledPin PC13 //blue pill
int ledPin = PB1; // LED connected to 'pin' 33 / PB1 on maple mini
//int ledPin = PC13; // blue pill
//int ledPin = 6; // LED connected to 'pin' PA5 olimexino
//int ledPin = LED_BUILTIN;
int print = false;
bool led = true;
int state = 0;
int wait = 10;
bool dir = true;
uint8 mode = 1; //wave drive
void setup() {
//initialize the digital pin as an output:
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, led);
pinMode(PA0, OUTPUT);
pinMode(PA1, OUTPUT);
pinMode(PA2, OUTPUT);
pinMode(PA3, OUTPUT);
Serial.begin(115200);
}
void loop() {
led = led?false:true;
digitalWrite(ledPin, led);
checkcmd();
switch(mode) {
case 1:
wavedrive();
break;
case 2:
halfstep();
break;
case 3:
fullstep();
break;
default:
break;
}
for(int i=0; i<wait; i++)
asm("wfi"); //sleep 1ms
}
void wavedrive() {
switch(state) {
case 0:
digitalWrite(PA0, HIGH);
digitalWrite(PA1, LOW);
digitalWrite(PA2, LOW);
digitalWrite(PA3, LOW);
break;
case 1:
digitalWrite(PA0, LOW);
digitalWrite(PA1, LOW);
digitalWrite(PA2, HIGH);
digitalWrite(PA3, LOW);
break;
case 2:
digitalWrite(PA0, LOW);
digitalWrite(PA1, HIGH);
digitalWrite(PA2, LOW);
digitalWrite(PA3, LOW);
break;
case 3:
digitalWrite(PA0, LOW);
digitalWrite(PA1, LOW);
digitalWrite(PA2, LOW);
digitalWrite(PA3, HIGH);
break;
default:
digitalWrite(PA0, LOW);
digitalWrite(PA1, LOW);
digitalWrite(PA2, LOW);
digitalWrite(PA3, LOW);
break;
}
if(state != 10) {
if(dir) {
state++;
if(state>3) state=0;
} else {
state--;
if(state<0) state=3;
}
}
}
void halfstep() {
switch(state) {
case 0:
digitalWrite(PA0, HIGH);
digitalWrite(PA1, LOW);
digitalWrite(PA2, LOW);
digitalWrite(PA3, LOW);
break;
case 1:
digitalWrite(PA0, HIGH);
digitalWrite(PA1, LOW);
digitalWrite(PA2, HIGH);
digitalWrite(PA3, LOW);
break;
case 2:
digitalWrite(PA0, LOW);
digitalWrite(PA1, LOW);
digitalWrite(PA2, HIGH);
digitalWrite(PA3, LOW);
break;
case 3:
digitalWrite(PA0, LOW);
digitalWrite(PA1, HIGH);
digitalWrite(PA2, HIGH);
digitalWrite(PA3, LOW);
break;
case 4:
digitalWrite(PA0, LOW);
digitalWrite(PA1, HIGH);
digitalWrite(PA2, LOW);
digitalWrite(PA3, LOW);
break;
case 5:
digitalWrite(PA0, LOW);
digitalWrite(PA1, HIGH);
digitalWrite(PA2, LOW);
digitalWrite(PA3, HIGH);
break;
case 6:
digitalWrite(PA0, LOW);
digitalWrite(PA1, LOW);
digitalWrite(PA2, LOW);
digitalWrite(PA3, HIGH);
break;
case 7:
digitalWrite(PA0, HIGH);
digitalWrite(PA1, LOW);
digitalWrite(PA2, LOW);
digitalWrite(PA3, HIGH);
break;
default:
digitalWrite(PA0, LOW);
digitalWrite(PA1, LOW);
digitalWrite(PA2, LOW);
digitalWrite(PA3, LOW);
break;
}
if(state != 10) {
if(dir) {
state++;
if(state>7) state=0;
} else {
state--;
if(state<0) state=7;
}
}
}
void fullstep() {
switch(state) {
case 0:
digitalWrite(PA0, HIGH);
digitalWrite(PA1, LOW);
digitalWrite(PA2, HIGH);
digitalWrite(PA3, LOW);
break;
case 1:
digitalWrite(PA0, LOW);
digitalWrite(PA1, HIGH);
digitalWrite(PA2, HIGH);
digitalWrite(PA3, LOW);
break;
case 2:
digitalWrite(PA0, LOW);
digitalWrite(PA1, HIGH);
digitalWrite(PA2, LOW);
digitalWrite(PA3, HIGH);
break;
case 3:
digitalWrite(PA0, HIGH);
digitalWrite(PA1, LOW);
digitalWrite(PA2, LOW);
digitalWrite(PA3, HIGH);
break;
default:
digitalWrite(PA0, LOW);
digitalWrite(PA1, LOW);
digitalWrite(PA2, LOW);
digitalWrite(PA3, LOW);
break;
}
if(state != 10) {
if(dir) {
state++;
if(state>3) state=0;
} else {
state--;
if(state<0) state=3;
}
}
}
void checkcmd() {
char r;
if(Serial.available()) {
r = Serial.read();
} else
return;
if(r=='r') {
dir = dir?false:true;
if(dir)
Serial.println(F("forward"));
else
Serial.println(F("reverse"));
} else if (r=='s') {
if(state==10) {
state=0;
Serial.println(F("start"));
} else {
state=10;
Serial.println(F("stopped"));
}
} else if (r=='+') {
wait--;
if(wait < 0) wait=0;
Serial.println(wait);
} else if (r=='-') {
wait++;
Serial.println(wait);
} else if (r=='m') {
mode++;
if(mode>3) mode = 1;
switch(mode) {
case 1:
Serial.println(F("wavedrive"));
break;
case 2:
Serial.println(F("halfstep"));
break;
case 3:
Serial.println(F("fullstep"));
break;
default:
break;
}
}
}
Comments