//----------------------------------------------------------- // Ovladani krokoveho motoru pomoci joysticku // nahoru / dolu .... rychly pohyb // vlevo / vpravo .... krokovani po jednotlivych krocich (po kazdem kroku se musi joystick narovnat) // kdyz bude joystick vychyleny vlevo nebo vpravo delsi dobu, bude se motor otacet pomalu //----------------------------------------------------------- // verze 1 // // video: https://youtu.be/IQKGL_IqD00 //---------------------------------- // prirazeni pinu #define pin_X A0 // joystick - osa X #define pin_Y A1 // joystick - osa Y #define motor_A 4 // vstupy ULN2003 #define motor_B 5 #define motor_C 6 #define motor_D 7 #define rychly_krok 5 // jak dlouha pauza ma byt mezi rychlymi kroky pri naklonu nahoru nebo dolu (mensi cislo = vetsi rychlost) #define pomaly_krok 50 // jak dlouha pauza ma byt pri pomale rychlosti (dlouhe nakloneni vlevo / vpravo) //---------------------------------- // globalni promenne unsigned int osa_X; // analogova hodnota vychyleni joysticku pro osu X unsigned int osa_Y; // analogova hodnota vychyleni joysticku pro osu Y int mikrokrok; // pamet pro aktualni mikrokrok boolean odblokovano = true; // blokovani pro jednotlive kroky pri vychyleni ve smeru vlavo/vpravo unsigned long casovac; // odpocet dlouheho nakloneni joysticku vlevo nebo vpravo byte sekvence[8][4] = { // definice stavu ovladacich pinu pro ULN2003 pro kazdy mikrokrok {1,0,0,0}, // mikrokrok 0 {1,1,0,0}, // mikrokrok 1 {0,1,0,0}, // mikrokrok 2 {0,1,1,0}, // mikrokrok 3 {0,0,1,0}, // mikrokrok 4 {0,0,1,1}, // mikrokrok 5 {0,0,0,1}, // mikrokrok 6 {1,0,0,1} // mikrokrok 7 }; //---------------------------------- // nastaveni smeru pinu void setup(void) { pinMode(pin_X, INPUT); pinMode(pin_Y, INPUT); pinMode(motor_A, OUTPUT); pinMode(motor_B, OUTPUT); pinMode(motor_C, OUTPUT); pinMode(motor_D, OUTPUT); } //---------------------------------- // hlavni smycka void loop(void) { osa_X = analogRead(pin_X); // v kazde smycce se zmeri napeti na obou osach osa_Y = analogRead(pin_Y); if (osa_Y < 100) // naklon joysticku dolu { krok_minus(); delay(rychly_krok); } if (osa_Y > 900) // naklon joysticku nahoru { krok_plus(); delay(rychly_krok); } if (osa_X > 400 and osa_X < 600) // osa X neni vychylena { odblokovano = true; // v teto poloze se odblokuje jeden krok na motoru } if (osa_X < 100 and odblokovano == true) // naklon joysticku vlevo { krok_minus(); odblokovano = false; // po jednom kroku se krokovani zablokuje az do te doby, nez se joystick narovna casovac = millis(); // zaznam casu nakloneni } if (osa_X < 100 and (millis()-casovac) > 1000) // naklon joysticku vlevo trva uz dele nez sekundu { krok_minus(); delay(pomaly_krok); } if (osa_X > 900 and odblokovano == true) // naklon joysticku vpravo { krok_plus(); odblokovano = false; // po jednom kroku se krokovani zablokuje az do te doby, nez se joystick narovna casovac = millis(); // zaznam casu nakloneni } if (osa_X > 900 and (millis()-casovac) > 1000) // naklon joysticku vpravo trva uz dele nez sekundu { krok_plus(); delay(pomaly_krok); } } //---------------------------------- // pootoceni motoru o jeden krok dopredu void krok_plus(void) { mikrokrok ++; if (mikrokrok == 8) mikrokrok = 0; nastav_motor(mikrokrok); } //---------------------------------- // pootoceni motoru o jeden krok dozadu void krok_minus(void) { mikrokrok --; if (mikrokrok < 0) mikrokrok = 7; nastav_motor(mikrokrok); } //---------------------------------- // nastaveni vystupu pro ovladani motoru void nastav_motor(byte index_pole) { digitalWrite(motor_A , sekvence[index_pole][0]); digitalWrite(motor_B , sekvence[index_pole][1]); digitalWrite(motor_C , sekvence[index_pole][2]); digitalWrite(motor_D , sekvence[index_pole][3]); }