Riadenie krokového motorčeka I.: Rozdiel medzi revíziami
Zo stránky SensorWiki
|  Vytvorená stránka „Záverečný projekt predmetu MIPS / LS2023 - '''Meno Priezvisko'''   == Zadanie ==  Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejši…“ | |||
| (27 medziľahlých úprav od 2 ďalších používateľov nie je zobrazených) | |||
| Riadok 1: | Riadok 1: | ||
| Záverečný projekt predmetu MIPS / LS2023 - ''' | Záverečný projekt predmetu MIPS / LS2023 - '''Martin Cíbik''' | ||
| == Zadanie == | == Zadanie == | ||
| zadanie č. 47:   | |||
| Krokový motorček - pohyb v smere a v protismere hodinových ručičiek po 90° | |||
| [[Obrázok: | Mám naprogramovať riadenie krokového motorčeka pre posun o 90° v smere aj v protismere hodinových ručičiek. | ||
|  Riadenie [https://www.laskakit.cz/radic-uln2003-pro-krokovy-motor/ krokového motorčeka] | |||
| [[Obrázok:Arduino uno.jpg|400px|thumb|center|Vývojová doska Arduino UNO.]] | |||
| '''Literatúra:'''   | '''Literatúra:'''   | ||
| * [ | *[https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf Dokumentácia k doske Arduino UNO] | ||
| * [ | *[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentácia k ATmega328p] | ||
| Riadok 17: | Riadok 23: | ||
| == Analýza  a opis riešenia == | == Analýza  a opis riešenia == | ||
| Zapojil som si motorček podľa tejto schémy(lepší obrázok som nenašiel).   | |||
| [[Súbor:Schema_zapojenia.png|400px|thumb|center|Schéma zapojenia Krokového motorčeka.]] | |||
| Potrebujem nasledovné súčiastky: Arduino UNO doska, krokový motorček, 6x káblik typu samička-samček, pinová doska so švábom  | |||
| === Algoritmus a program === | |||
| <tabs> | <tabs> | ||
| <tab name="AVR C-code"><source lang="c++" style="background: LightYellow;"> | <tab name="AVR C-code"><source lang="c++" style="background: LightYellow;"> | ||
| /* | |||
|  * semestralny_projekt.c | |||
|  * zadanie č. 47: krokový motorček | |||
|  * Krokový motorček - pohyb v smere a v protismere hodinových ručičiek po 90° | |||
|  *  Author: Martin Cíbik | |||
|  */ | |||
| #define F_CPU 16000000UL | |||
| #include <avr/io.h> | #include <avr/io.h> | ||
| #include <util/delay.h> | |||
| #include <stdbool.h> | |||
| void loop(bool dir, char pins[]); | |||
| void cw(char c[]); | |||
| void ccw(char pins[]); | |||
| void OneStep(char pin); | |||
| int main(void) | int main(void) | ||
| { | { | ||
| 	DDRB |= 0B00011110; | |||
| 	char pins[] = {0x10, 0x08, 0x04, 0x02}; // zadefinované piny | |||
|     while (1)  | |||
|     { | |||
| 		loop(true, pins); // v smere hodinových ručičiek | |||
| 		loop(false, pins); //v protismere hodinových ručičiek | |||
|     } | |||
| } | |||
| void loop(bool dir, char pins[]) | |||
| { | |||
| 	if (dir) | |||
| 	{ | |||
| 		for(int i = 0; i < 4; i++) | |||
| 		{ | |||
| 			cw(pins); | |||
| 			PORTB = pins[i]; | |||
| 			_delay_ms(2000); | |||
| 		} | |||
| 	} | |||
| 	else | |||
| 	{ | |||
| 		for(int i = 3; i >= 0; i--) | |||
| 		{ | |||
| 			ccw(pins); | |||
| 			PORTB = pins[i]; | |||
| 			_delay_ms(5000); | |||
| 		} | |||
| 	} | |||
| } | |||
| // void loop - zadefinovanie otáčania motorčeka, jeho rýchlosť atď | |||
| void OneStep(char pin) | |||
| { | |||
| 	PORTB = pin; | |||
| 	_delay_ms(10); | |||
| } | |||
| //v smere hodinových ručičiek | |||
| void cw(char pins[]) | |||
| { | |||
| 	for(int i = 0; i < 128; i++) | |||
| 	{ | |||
| 		for(int j = 0; j < 4; j++) | |||
| 		{ | |||
| 			OneStep(pins[j]); | |||
| 		} | |||
| 	} | |||
| 	PORTB = 0x00; | |||
| } | } | ||
| //v protismere hodinových ručičiek | |||
| void ccw(char pins[]) | |||
| { | |||
| 	for(int i = 0; i < 128; i++) | |||
| 	{ | |||
| 		for(int j = 4; j > 0; j--) | |||
| 		{ | |||
| 			OneStep(pins[j]); | |||
| 		} | |||
| 	} | |||
| 	PORTB = 0x00; | |||
| } | |||
| </source></tab> | </source></tab> | ||
| <tab name=" | <tab name="AVR C-code s povolávaním funkcie"><source lang="c++" style="background: LightYellow;"> | ||
| /* | |||
|  * semestralny_projekt.c | |||
|  * zadanie č. 47: krokový motorček | |||
|  * Krokový motorček - pohyb v smere a v protismere hodinových ručičiek po 90° | |||
|  *  Author: Martin Cíbik | |||
|  */  | |||
| #define F_CPU 16000000UL | |||
| #include <avr/io.h> | #include <avr/io.h> | ||
| #include <util/delay.h> | |||
| #include <stdbool.h> | |||
| void loop(bool dir, char pins[]); | |||
| void cw(char c[]); | |||
| void ccw(char pins[]); | |||
| void OneStep(char pin); | |||
| void loopRotate(bool dir, char pins[], int times); | |||
| int main(void) | |||
| { | |||
| 	DDRB |= 0B00011110; | |||
| 	char pins[] = {0x10, 0x08, 0x04, 0x02}; // zadefinované piny | |||
|     while (1)  | |||
|     { | |||
| 		loop(true, pins); // v smere hodinových ručičiek | |||
| 		loop(false, pins); //v protismere hodinových ručičiek | |||
|     } | |||
| } | |||
| void loop(bool dir, char pins[]) | |||
| { | |||
| 	loopRotate(dir, pins, 10);	//loopRotate(dir, pins, POČET ROTÁCIÍ O 90°) | |||
| } | |||
| // void loop - zadefinovanie otáčania motorčeka, jeho rýchlosť atď | |||
| void loopRotate(bool dir, char pins[], int times) | |||
| { | |||
| 	for(int t = 0; t < times; t++) | |||
| 	{ | |||
| 		if (dir) | |||
| 		{ | |||
| 			for(int i = 0; i < 4; i++) | |||
| 			{ | |||
| 				cw(pins); | |||
| 				PORTB = pins[i]; | |||
| 				_delay_ms(2000); | |||
| 			} | |||
| 		} | |||
| 		else | |||
| 		{ | |||
| 			for(int i = 3; i >= 0; i--) | |||
| 			{ | |||
| 				ccw(pins); | |||
| 				PORTB = pins[i]; | |||
| 				_delay_ms(2000); | |||
| 			} | |||
| 		} | |||
| 	} | |||
| } | |||
| void OneStep(char pin) | |||
| { | |||
| 	PORTB = pin; | |||
| 	_delay_ms(10); | |||
| } | |||
| //v smere hodinových ručičiek | |||
| void cw(char pins[]) | |||
| { | |||
| 	for(int i = 0; i < 128; i++) | |||
| 	{ | |||
| 		for(int j = 0; j < 4; j++) | |||
| 		{ | |||
| 			OneStep(pins[j]); | |||
| 		} | |||
| 	} | |||
| 	PORTB = 0x00; | |||
| } | |||
| //v protismere hodinových ručičiek | |||
| void ccw(char pins[]) | |||
| { | |||
| 	for(int i = 0; i < 128; i++) | |||
| 	{ | |||
| 		for(int j = 4; j > 0; j--) | |||
| 		{ | |||
| 			OneStep(pins[j]); | |||
| 		} | |||
| 	} | |||
| 	PORTB = 0x00; | |||
| } | |||
| </source></tab> | </source></tab> | ||
| </tabs> | </tabs> | ||
| Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|Zdrojové súbory Martin Cíbik.zip]] | |||
| Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip| | |||
| === Overenie === | |||
| Po zapojení sa motorček začne otáčať. Po 90° zastaví a počká 2 sekundy. To sa zopakuje 4x a nastane otáčanie v opačnom smere. Tak isto o 90° a počká (tiež 4x).  | |||
| V prípade povolávania funkcie, treba na do funkcie void loop() zadať koľko krát chceme aby sa otočilo (dal som 10 otočení), ale funguje v rovnakom princípe. | |||
| [[Súbor:fotka.jpg|400px|thumb|center|Aplikácia.]] | [[Súbor:fotka.jpg|400px|thumb|center|Aplikácia.]] | ||
| '''Video:''' | '''Video:''' | ||
| <center><youtube>6TpmggueZVk</youtube></center> | |||
| [[Category:AVR]] [[Category:MIPS]] | [[Category:AVR]] [[Category:MIPS]] | ||
Aktuálna revízia z 11:58, 8. jún 2023
Záverečný projekt predmetu MIPS / LS2023 - Martin Cíbik
Zadanie
zadanie č. 47: Krokový motorček - pohyb v smere a v protismere hodinových ručičiek po 90°
Mám naprogramovať riadenie krokového motorčeka pre posun o 90° v smere aj v protismere hodinových ručičiek.
Riadenie krokového motorčeka

Literatúra:
Analýza a opis riešenia
Zapojil som si motorček podľa tejto schémy(lepší obrázok som nenašiel).

Potrebujem nasledovné súčiastky: Arduino UNO doska, krokový motorček, 6x káblik typu samička-samček, pinová doska so švábom
Algoritmus a program
/*
 * semestralny_projekt.c
 * zadanie č. 47: krokový motorček
 * Krokový motorček - pohyb v smere a v protismere hodinových ručičiek po 90°
 *  Author: Martin Cíbik
 */
 
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdbool.h>
void loop(bool dir, char pins[]);
void cw(char c[]);
void ccw(char pins[]);
void OneStep(char pin);
int main(void)
{
	DDRB |= 0B00011110;
	char pins[] = {0x10, 0x08, 0x04, 0x02}; // zadefinované piny
		
    while (1) 
    {
		loop(true, pins); // v smere hodinových ručičiek
		loop(false, pins); //v protismere hodinových ručičiek
    }
}
void loop(bool dir, char pins[])
{
	if (dir)
	{
		for(int i = 0; i < 4; i++)
		{
			cw(pins);
			PORTB = pins[i];
			_delay_ms(2000);
		}
	}
	else
	{
		for(int i = 3; i >= 0; i--)
		{
			ccw(pins);
			PORTB = pins[i];
			_delay_ms(5000);
		}
	}
}
// void loop - zadefinovanie otáčania motorčeka, jeho rýchlosť atď
void OneStep(char pin)
{
	PORTB = pin;
	_delay_ms(10);
}
//v smere hodinových ručičiek
void cw(char pins[])
{
	for(int i = 0; i < 128; i++)
	{
		for(int j = 0; j < 4; j++)
		{
			OneStep(pins[j]);
		}
	}
	PORTB = 0x00;
}
//v protismere hodinových ručičiek
void ccw(char pins[])
{
	for(int i = 0; i < 128; i++)
	{
		for(int j = 4; j > 0; j--)
		{
			OneStep(pins[j]);
		}
	}
	PORTB = 0x00;
}
/*
 * semestralny_projekt.c
 * zadanie č. 47: krokový motorček
 * Krokový motorček - pohyb v smere a v protismere hodinových ručičiek po 90°
 *  Author: Martin Cíbik
 */ 
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdbool.h>
void loop(bool dir, char pins[]);
void cw(char c[]);
void ccw(char pins[]);
void OneStep(char pin);
void loopRotate(bool dir, char pins[], int times);
int main(void)
{
	DDRB |= 0B00011110;
	char pins[] = {0x10, 0x08, 0x04, 0x02}; // zadefinované piny
		
    while (1) 
    {
		loop(true, pins); // v smere hodinových ručičiek
		loop(false, pins); //v protismere hodinových ručičiek
    }
}
void loop(bool dir, char pins[])
{
	loopRotate(dir, pins, 10);	//loopRotate(dir, pins, POČET ROTÁCIÍ O 90°)
}
// void loop - zadefinovanie otáčania motorčeka, jeho rýchlosť atď
void loopRotate(bool dir, char pins[], int times)
{
	for(int t = 0; t < times; t++)
	{
		if (dir)
		{
			for(int i = 0; i < 4; i++)
			{
				cw(pins);
				PORTB = pins[i];
				_delay_ms(2000);
			}
		}
		else
		{
			for(int i = 3; i >= 0; i--)
			{
				ccw(pins);
				PORTB = pins[i];
				_delay_ms(2000);
			}
		}
	}
}
void OneStep(char pin)
{
	PORTB = pin;
	_delay_ms(10);
}
//v smere hodinových ručičiek
void cw(char pins[])
{
	for(int i = 0; i < 128; i++)
	{
		for(int j = 0; j < 4; j++)
		{
			OneStep(pins[j]);
		}
	}
	PORTB = 0x00;
}
//v protismere hodinových ručičiek
void ccw(char pins[])
{
	for(int i = 0; i < 128; i++)
	{
		for(int j = 4; j > 0; j--)
		{
			OneStep(pins[j]);
		}
	}
	PORTB = 0x00;
}
Zdrojový kód: Zdrojové súbory Martin Cíbik.zip
Overenie
Po zapojení sa motorček začne otáčať. Po 90° zastaví a počká 2 sekundy. To sa zopakuje 4x a nastane otáčanie v opačnom smere. Tak isto o 90° a počká (tiež 4x).
V prípade povolávania funkcie, treba na do funkcie void loop() zadať koľko krát chceme aby sa otočilo (dal som 10 otočení), ale funguje v rovnakom princípe.

Video: