Sterowanie: dwa oddzielne przyciski nakazujące ruch.
Kod: Zaznacz cały
#include <AccelStepper.h>
// pobierz i wgraj do libraries stąd:
// http://www.open.com.au/mikem/arduino/AccelStepper/
// pin 7 zwarty do zera ruch w jedną stronę
// pin 8 zwarty do zera ruch w drugą stronę
// po 10 sekundach wyłączany silnik krokowy
AccelStepper osX(1, 13, 11); // pin 13 - STEP, pin 11 - DIR
long goX = 200; // zdefiniowana liczba kroków do wykonania.
boolean lewo = false;
boolean bylo = false;
unsigned long czasn; // w zmiennej czas będziemy przekazywać aktualną wartość millis()
// do ustalania czas od ostatniego zadanego ruchu
void setup() {
pinMode(7, INPUT);
pinMode(8, INPUT);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
pinMode(13, OUTPUT);
pinMode(5, OUTPUT);
digitalWrite(5,LOW);
osX.setMaxSpeed(4300.0); //
osX.setSpeed(4300.0);
osX.setAcceleration(4000.0); //
// na starcie sterownika jedzie silnik w jedną stronę do pozycji na zderzak mechaniczny.
// później ruch będzie odmierzany od tego zderzaka
for ( int i=0 ; i < 360 ; i++ ) {
osX.runToNewPosition(osX.currentPosition()-1);
osX.run();
delay(2);
}
// zamiast zderzaka można pozycjonować krańcówką
// przykład tutaj: https://www.cnc.info.pl/maszyna-do-punktowania-rur-t94055-40.html#p655149
czasn = millis();
}
void loop(){
// to jest glowne polecenie ruchu - ma być w loop uruchamiane cały czas
// pozostałe rzeczy są na warunkach
osX.run();
// opcja wyłączania silnika na postoju - 10000 = 10 sek i wyłączenie silnika ENA
if ( ( millis() - czasn ) > 10000 ) {
digitalWrite(13, HIGH); // dioda na arduino
digitalWrite(5, HIGH); // sygnał ENA
}
//jeśli sygnał ruchu i pozycja po przeciwnej stronie to można jechać i zmienić pozycję o goX
if ( (digitalRead(7) == LOW ) && ( bylo == false ) ) {
delay(50);
digitalWrite(5, LOW); // obudzenie
delay(50);
if (digitalRead(7) == LOW ) {
osX.runToNewPosition(osX.currentPosition()+goX);
bylo = true ;
czasn = millis();
}
}
// i tu ruch w drugą strone
if ( (digitalRead(8) == LOW ) && ( bylo == true ) ) {
delay(50);
digitalWrite(5, LOW); // obudzenie
delay(50);
if (digitalRead(8) == LOW ) {
osX.runToNewPosition(osX.currentPosition()-goX);
bylo = false ;
czasn = millis();
}
}
}