Takže trochu progres: driver bol mŕtvy, nový je v poriadku.
(Skoro) všetko funguje ako treba, tu je prvá verzia programu, ak by niekto nutne okamžite chcel ovládať KM pomocou arduina.
Je to na malé posuvy, treba si to prepísať (r. 52-124) pre vlastnú potrebu.
Zatiaľ len pre jednu osu, nemám viac tlačítok doma
Kód: Vybrat vše
/* VSEOBECNE NASTAVENIA */
int prah=5; // citlivost na zmenu vstupu potenciometra na ovladanie rychlosti posuvu
/* ---------- OSA X ---------- */
int tlacitko_X_dolava;
int tlacitko_X_doprava;
int pot_pin_X = A1; // potenciometer na analogovom pine A1
int analog_hodnota_X; // 0-1023 analog vstup z potenciometra
int pwm_hodnota_X; // digital výstup
float posuv_X;
float mikrokrok_X = 16; // mikrokrok
float impulzov_na_mm_X = 200 * mikrokrok_X;
float dlzka_impulzu_X = 0.01; // milisekundy
float impulzov_za_sekundu_X;
float delay_X;
float pohyb_na_impulz_X = (1 / (200 * mikrokrok_X)) ; // stúpanie / (celokrok * mikrokrok) v mm
float pociatocne_X;
/* ---------- OSA Y ---------- */
int tlacitko_Y_hore;
int tlacitko_Y_dole;
void setup() {
pinMode(2, INPUT_PULLUP); // X dolava
pinMode(3, INPUT_PULLUP); // X doprava
pinMode(4, OUTPUT); // STEP
pinMode(5, OUTPUT); // DIR
pinMode(6, INPUT_PULLUP); // Y dolava
pinMode(7, INPUT_PULLUP); // Y doprava
pinMode(13, OUTPUT); // LED na doske
Serial.begin(250000);
}
void loop() {
/* ---------- posuv podla potenciometra ---------- */
analog_hodnota_X = analogRead(pot_pin_X); // nacitanie hodnoty z potenciometra X (0-1023)
pwm_hodnota_X = map(analog_hodnota_X, 0, 1023, 0, 20); // preskalovanie na 0-20 pre posuv
if (pwm_hodnota_X == 0) {
posuv_X = 0;
impulzov_za_sekundu_X = 0;
pociatocne_X = 0;
}
else if ((pwm_hodnota_X > 0) && (pwm_hodnota_X < 11)) {
posuv_X = pwm_hodnota_X * 0.1;
impulzov_za_sekundu_X = (impulzov_na_mm_X * posuv_X)/ 60;
delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
pociatocne_X = pociatocne_X + pohyb_na_impulz_X;
}
else if (pwm_hodnota_X == 11) {
posuv_X = 1.5;
impulzov_za_sekundu_X = (impulzov_na_mm_X * posuv_X)/ 60;
delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
pociatocne_X = pociatocne_X + pohyb_na_impulz_X;
}
else if (pwm_hodnota_X == 12) {
posuv_X = 2;
impulzov_za_sekundu_X = (impulzov_na_mm_X * posuv_X)/ 60;
delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
pociatocne_X = pociatocne_X + pohyb_na_impulz_X;
}
else if (pwm_hodnota_X == 13) {
posuv_X = 2.5;
impulzov_za_sekundu_X = (impulzov_na_mm_X * posuv_X)/ 60;
delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
pociatocne_X = pociatocne_X + pohyb_na_impulz_X;
}
else if (pwm_hodnota_X == 14) {
posuv_X = 3;
impulzov_za_sekundu_X = (impulzov_na_mm_X * posuv_X)/ 60;
delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
pociatocne_X = pociatocne_X + pohyb_na_impulz_X;
}
else if (pwm_hodnota_X == 15) {
posuv_X = 3.5;
impulzov_za_sekundu_X = (impulzov_na_mm_X * posuv_X)/ 60;
delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
pociatocne_X = pociatocne_X + pohyb_na_impulz_X;
}
else if (pwm_hodnota_X == 16) {
posuv_X = 4;
impulzov_za_sekundu_X = (impulzov_na_mm_X * posuv_X)/ 60;
delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
pociatocne_X = pociatocne_X + pohyb_na_impulz_X;
}
else if (pwm_hodnota_X == 17) {
posuv_X = 5;
impulzov_za_sekundu_X = (impulzov_na_mm_X * posuv_X)/ 60;
delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
pociatocne_X = pociatocne_X + pohyb_na_impulz_X;
}
else if (pwm_hodnota_X == 18) {
posuv_X = 6;
impulzov_za_sekundu_X = (impulzov_na_mm_X * posuv_X)/ 60;
delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
pociatocne_X = pociatocne_X + pohyb_na_impulz_X;
}
else if (pwm_hodnota_X == 19) {
posuv_X = 8;
impulzov_za_sekundu_X = (impulzov_na_mm_X * posuv_X)/ 60;
delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
pociatocne_X = pociatocne_X + pohyb_na_impulz_X;
}
else if (pwm_hodnota_X == 20) {
posuv_X = 10;
impulzov_za_sekundu_X = (impulzov_na_mm_X * posuv_X)/ 60;
delay_X = (1000 / impulzov_za_sekundu_X) - dlzka_impulzu_X ;
pociatocne_X = pociatocne_X + pohyb_na_impulz_X;
}
tlacitko_X_dolava = digitalRead(2);
tlacitko_X_doprava = digitalRead(3);
if ((tlacitko_X_dolava == 0) && (tlacitko_X_doprava == 1)) {
digitalWrite(4, HIGH); // STEP signal
delay(dlzka_impulzu_X);
digitalWrite(4, LOW); // STEP pauza
delay(delay_X);
digitalWrite(5, LOW); // DIR CW
digitalWrite(13, HIGH);
}
else if ((tlacitko_X_doprava == 0) && (tlacitko_X_dolava == 1)) {
digitalWrite(4, HIGH); // STEP signal
delay(dlzka_impulzu_X);
digitalWrite(4, LOW); // STEP pauza
delay(delay_X);
digitalWrite(5, HIGH); // DIR CCW
digitalWrite(13, LOW);
}
else if ((tlacitko_X_dolava == 0) && (tlacitko_X_doprava == 0)) {
digitalWrite(4, LOW); // STEP pauza - cize nijaky signal, motor zastavi
}
else if ((tlacitko_X_dolava == 1) && (tlacitko_X_doprava == 1)) {
digitalWrite(4, LOW); // STEP pauza - cize nijaky signal, motor zastavi
pociatocne_X = 0;
}
Serial.print("posuv X: ");
Serial.print(posuv_X, 2);
Serial.print(" mm/min ");
Serial.print("draha X: ");
Serial.print(pociatocne_X, 3);
Serial.println(" mm");
}
Je to funkčné, ale
- rampy nie sú, myslím že pri týchto rýchlostiach netreba
- pri 0 mm/min sa motor aj tak točí (veľmi pomaly), neviem prečo
- pri štarte treba pohnúť potenciometrom, aby bola nastavená hodnota, ináč sa točí ako sa mu zachce (opravím)
- nedrží hodnotu prejdenej dráhy, pri uvoľnení tlačítka sa vynuluje (opravím)
Ináč - možno je to strašne napísané, ale funguje to tak ako potrebujem...
Je to môj prvý program na Arduino. Učím sa to druhý deň, tak zhovievavosť
Pekný deň, Patrik
P.S.: kľudne sa niekto skúsenejší môže pridať
A všetkým veľmi pekne ďakujem za rady vyššie...