Lösung: Lowcost - Plotter mit GRBL, Arduino, ULN2003 und 28BYJ-48

Hallo Community,

an dieser Stelle möchte ich mich einmal mit einem Lösungsbeitrag bei euch allen Bedanken.
Ihr habt mir bei meinen bisherigen Fragen immer sehr geholfen, auch bei meinem Projekt einen Plotter zu bauen, welcher Leiterplatten beschriftet. Mein besonderer Dank gilt dabei @sweber.

Im Grundsatz besteht der Plotter aus 3D-Druckteilen, etwas Holz und ein wenig Elektronik, was diesen sehr kostengünstig gestaltet.
Eine besondere Herausforderung für mich war die Ansteuerung der Schrittmotoren, wofür erst einmal keine günstige geeignete Lösung vorlag (teure Lösungen gibt es zuhauf).

Für mich habe ich die Lösung in einem Microcontroller „Atmel ATtiny84A“ und eigens dafür geschriebener Firmware gefunden.
Die Ansteuerung der Schrittmotoren erfolgt nach untenstehendem Blockschaltbild.

Die Firmware wurde mit Atmel Studio geschriben.

Quellcode:

#include <avr/io.h>
#include <stdlib.h>
#include <stdbool.h>
#include <util/delay.h>

#define F_CPU 8000000;


void O0_On() {PORTA |= (1<<PINA0);}
void O0_Off() {PORTA &= ~(1<<PINA0);}

void O1_On() {PORTA |= (1<<PINA1);}
void O1_Off() {PORTA &= ~(1<<PINA1);}

void O2_On() {PORTA |= (1<<PINA2);}
void O2_Off() {PORTA &= ~(1<<PINA2);}

void O3_On() {PORTA |= (1<<PINA3);}
void O3_Off() {PORTA &= ~(1<<PINA3);}


int main(void)
{
	DDRA = 0b11111111;
	DDRB = 0b00000000;

	bool step = false;
	bool direction = false;
	bool flankenmerker = false;


	int counter = 0;
	int counterMax = 3;

	/* Replace with your application code */
	while (1)
	{
		step = PINB & (1<<PINB0); //Step
		direction = PINB & (1<<PINB1); //Direction

		if (step && (flankenmerker == false))
		{
			flankenmerker = true;

			if (direction == true)
			{
				counter--;
			}
			else
			{
				counter++;
			}
			
		}
		else if (step == false)
		{
			flankenmerker = false;
		}
		
		if (counter > counterMax)
		{
			counter = 0;
		}

		if (counter < 0 )
		{
			counter = counterMax;
		}

		switch (counter)
		{
			case 0:
			O0_On();
			O1_Off();
			O2_Off();
			O3_Off();
			break;

			case 1:
			O0_Off();
			O1_On();
			O2_Off();
			O3_Off();
			break;

			case 2:
			O0_Off();
			O1_Off();
			O2_On();
			O3_Off();
			break;

			case 3:
			O0_Off();
			O1_Off();
			O2_Off();
			O3_On();
			break;

			default:
			O0_Off();
			O1_Off();
			O2_Off();
			O3_Off();
			break;
		}
	}
}

Ich hoffe dass meine Lösung anderen eine Hilfe sein kann.
An alle die mich bei meinem Projekt untersützt haben ein herzliches Dankeschön!

Viele Grüße
kleiner_kaktus

1 Like