const byte PUL = 10; // Sterownik, narastające zbocze - kolejny krok.
const byte DIR = 11; // Sterownik, wysoki poziom - obroty lewe, niski - obroty prawe.
const byte LEFT = A0; // Klawiatura, niski poziom - obroty w lewo.
const byte RIGHT = A1; // Klawiatura, niski poziom - obroty w prawo.
const byte SPEED = A2; // Potencjometr, obroty.
const byte MODE_CONTINUOUS = 2; // Przełącznik od trybu ciągłego
const byte MODE_AUTOMATIC = 3; // Przełącznik od trybu automatycznego
const byte TRIGGER_AUTOMATIC = 9; // Przycisk od wyzwolenie trybu automatycznego
void setup(){
pinMode(PUL, OUTPUT); // Zadeklaruj porty biegnące do sterownika jako wyjścia.
pinMode(DIR, OUTPUT);
pinMode(LEFT, INPUT_PULLUP); // Zadeklaruj porty klawiatury jako wejścia podciągnięte wewnętrznie do wysokiego stanu.
pinMode(RIGHT, INPUT_PULLUP);
pinMode(MODE_CONTINUOUS, INPUT_PULLUP);
pinMode(MODE_AUTOMATIC, INPUT_PULLUP);
pinMode(TRIGGER_AUTOMATIC, INPUT_PULLUP);
}
void loop(){
if(digitalRead(MODE_CONTINUOUS) == LOW){ // Czy tryb ciągły?
if (digitalRead(LEFT) == LOW){ // Czy wciśnięto przycisk lewych obrotów?
digitalWrite(DIR, HIGH); // Aktywuj kierunek lewy.
PREPARE(); // Idź do procedury przygotowania sterownika do pracy.
while (digitalRead(LEFT) == LOW && digitalRead(MODE_CONTINUOUS) == LOW) // Powtarzaj dopóki przycisk jest wciśnięty i nadal jest tryb ciągły
ROTATE(); // Idź do procedury obracania.
}
if (digitalRead(RIGHT) == LOW){ // Czy wciśnięto przycisk prawych obrotów?
digitalWrite(DIR, LOW); // Aktywuj kierunek prawy.
PREPARE(); // Idź do procedury przygotowania sterownika do pracy.
while (digitalRead(RIGHT) == LOW && digitalRead(MODE_CONTINUOUS) == LOW) // Powtarzaj dopóki przycisk jest wciśnięty i nadal jest tryb ciągły
ROTATE(); // Idź do procedury obracania.
}
}
else if(digitalRead(MODE_AUTOMATIC) == LOW){ // Czy tryb automatyczny?
if(digitalRead(TRIGGER_AUTOMATIC) == LOW){ // czy wciśnięto przycisk wyzwolenia?
delay(50); // Odczekanie na drgranie styków przycisku
if(digitalRead(TRIGGER_AUTOMATIC) == LOW){ // czy nadal wciśnięto przycisk wyzwolenia?
while(digitalRead(TRIGGER_AUTOMATIC) == LOW); // czekaj na puszczenie przycisku
DO_AUTOMATIC(); // wykonaj sekwencję trybu automatycznego
}
}
}
}
void PREPARE(){
delayMicroseconds (5);
}
void ROTATE(){
digitalWrite(PUL, HIGH); // Wyślij rozkaz kroku.
delayMicroseconds (5);
digitalWrite(PUL, LOW);
delayMicroseconds (5);
delayMicroseconds(1024 - analogRead(SPEED)); // Wprowadź opóźnienie zgodne z pozycją potencjometru.
}
void DO_AUTOMATIC(){
digitalWrite(DIR, LOW); // Aktywuj kierunek prawy.
for(int i = 0; i < 400; i++) // Powtórz jeden obrót 400 razy
ROTATE();
digitalWrite(DIR, HIGH); // Aktywuj kierunek lewy.
for(int i = 0; i < 400; i++) // Powtórz jeden obrót 400 razy
ROTATE();
digitalWrite(DIR, LOW); // Aktywuj kierunek prawy.
for(int i = 0; i < 400; i++) // Powtórz jeden obrót 400 razy
ROTATE();
}