ag123
Published © MIT

Some Stepper Fun on a Maple Mini STM32F103 - 28BYJ-48

Some stepper fun on a maple mini STM32F103 - 28BYJ-48.

BeginnerWork in progress1 hour742

Story

Read more

Code

byj48stepper.ino

Arduino
/* 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;
		}
	}

}

Credits

ag123
1 project • 0 followers

Comments