Ovladanie krokoveho motora joystickom + uvod displej
Zo stránky SensorWiki
Záverečný projekt predmetu MIPS / LS2023 - Matej Ledecky
Zadanie
- 1. Prestudovanie datasheetov k danym komponentom (joystick,Lcd/i2c, stepmotor+driver).
- 2. Navrh zapojenia a funkcnosti komponentov.
- 3. Zapojenie.
- 4. Navrh programoveho riesenia
a, Citanie hodnot s joysticku a vhodna interpretacia pre dalsie pouzitie b, 1. Pohyb krokoveho motora v oboch smeroch b, 2. Rychlost krokoveho motora c, Prepojenie joystick - Motor (ovladanie joystickom smer/rychlost otocenia) d, 1. Uvodna obrazovka (vypis privitania a co robi dany projekt na LCD) d, 2. Vypis smeru otacania na LCD
- 5. Odskusanie funkcnosti (videodokumentacia)
Hardware: Arduino uno R3
Joystick
LED display 16×2 I2C
Krokový motor 28BYJ-48 modul ULN2003
Literatúra:
Analýza a opis riešenia
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
Algoritmus a program
Algoritmus programu je....
#include "main.h" // vlozenie potrebnych includeov prepojeni
#define X_PIN 0 //definovanie pinov joysticku
#define Y_PIN 1
void delay(int delay) // klasicky delay
{
for (int i=1; i<=delay; i++)
_delay_ms(1);
}
void delayus(int delay) //us delay pre pozitie v rotacii ako regulacia rychlosti
{
for (int i=1; i<=delay; i++)
_delay_us(1);
}
void left(char Pole[],int Speed){ //tocenie doprava
for (int L=0;L<10;L++)
for(int i = 0; i < 4; i++){
PORTD = Pole[i];
delayus(4250 - Speed*20);
}
PORTD = 0b00000000;
}
void right(char Pole[], int Speed){ // tocenie dolava
for (int L=0;L<10;L++)
for(int i = 3; i >= 0; i--){
PORTD = Pole[i];
delayus(4000 - Speed*20);
}
PORTD = 0b00000000;
}
int main(void)
{
MCUCR &= ~(1<<PUD);
DDRD |= 0b00111100; //paramatre pre otacanie
char Pole[] = {0b00100000, 0b00010000, 0b00001000, 0b00000100};
int Speed = 0;
unsigned int Valuex; // premenne pre nacitanie s AD prevodnika
unsigned int Valuey;
unsigned int Value;
int x = 0b00001110; // premenna pre mod LCD cursor on/OFF
int y = 0b00001100;
char *num;
TWI_Init(); //inicializacie TWI LCD ADC + uvodne texty
delay(500);
LCD_Init(y);
delay(500);
LCD_clear();
delay(500);
LCD_sendString("Vitajte");
delay(2000);
LCD_clear();
delay(500);
LCD_sendString("Riadenie Motora ");
LCD_setPosition(0,1);
LCD_sendString("Joystickom");
delay(2000);
LCD_clear();
delay(500);
LCD_sendString("Smer otacania");
LCD_setPosition(0,1);
delay(500);
adc_init();
delay(500);
while(1){
Valuex = adc_read(X_PIN)/4; //Citanie s AD do valuex
if(Valuex > 125){ //pobyb packy po osi x dolava
Speed=Valuex-123; //vypocet konstatny rychlosti
left(Pole,Speed); // rotacia dolava
LCD_setPosition(0,1); // pozicia kurzora LCD
LCD_sendString("<--"); // vypis na LCD
}
else if(Valuex < 124){ //to iste len do druhej strany s mensimi upravami kvoli rozdielnym hodnotam s AD
Speed=127-Valuex;
right(Pole, Speed);
LCD_setPosition(0,1);
LCD_sendString("-->");
}
else{
LCD_setPosition(0,1); // KED nic
LCD_sendString("<->");
}
/* num = (char *)malloc(snprintf(NULL, 0, "%d", o) + 1);
LCD_sendString(num);
free(num); */
}
return(0);
}
#ifndef MAIN_H_
#define MAIN_H_
#define BAUD 9600
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <util/delay.h>
#include "adc.h"
#include "twi.h"
#include "lcd.h"
#endif /* MAIN_H_ */
Analýza a opis riešenia
1. 2. 3.
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami... Nezabudnite doplniť schému zapojenia!
Analýza a opis riešenia
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...