Jest tu jazda do krańcówki i zejście z niej. przykład jak zdefiniować piny do silników... no i silniki nie piszczą na starcie tylko odpowiednio startują bo jest rampa.
Zaznaczę //$$$$$$$$$ to co jest minimum do użycia.
polecenie jazdy o 100 kroków i z powrotem wygląda tak:
Kod: Zaznacz cały
osX.moveTo(osX.currentPosition()+100);
while( digitalRead(pinK) == LOW && osX.distanceToGo()!=0 ) { osX.run() ; } ;
osX.moveTo(osX.currentPosition()-100);
while( digitalRead(pinK) == LOW && osX.distanceToGo()!=0 ) { osX.run() ; } ;
w pętli while robiona jest jazda aż do osiągnięcia celu osX.distanceToGo()!=0
za pomocą { osX.run() ; }
Z tego zrobiłbym sterowanie do punktowania.
Kod: Zaznacz cały
#include <AccelStepper.h> //$$$$$$$$$ daje do kodu bibliotekę z rampą do silników krokowych
#include <Wire.h> // standardowa biblioteka Arduino
#include <LiquidCrystal_I2C.h> // dolaczenie pobranej biblioteki I2C dla LCD
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Ustawienie adresu ukladu na 0x27
/*
* LCM1602 & Arduino Uno
* VCC - > 5 V
* GND - GND
* SCL -> A5
* SDA -> A4
*/
unsigned long czas; // w zmiennej czas będziemy przekazywać aktualną wartość millis()
unsigned long czasn; //
int wybor ; //
int czaswmenu = 120 ; // liczba sekund do wyłączenia menu od wejscia
boolean wybrane = false; //
//$$$$$$$$$ definiuję pin z krańcówką i piny do silników po 2 na silnik
const int pinK = 3; // krancowka wspolna dla 3 osi podlaczone jako NC do masy
// zaklocenia - między masą a pinem dać 100nF oraz dławik szeregowo
const int pinDIRX = 6; // silnik poziomy
const int pinSTEPX = 7; // kroki -
const int pinDIRY = 8; // silnik drugi
const int pinSTEPY = 9; // kroki -
const int pinDIRZ = 4; // silnik pionowy
const int pinSTEPZ = 5; // kroki -
const int pinB1 = 10; // przycisk 1
const int pinB2 = 11; // przycisk 2
const int pinB3 = 12; // przycisk 3
int stan1p, stan2p, stan3p ;// stan przyciskow początkowy
int stan1, stan2, stan3 ; // stan przyciskow był trwały
boolean przycisk1 = false ; // czy wcisniety?
boolean przycisk2 = false ; // czy wcisniety przycisk?
boolean przycisk3 = false ; // czy wcisniety przycisk?
AccelStepper osX(1, pinSTEPX, pinDIRX); //$$$$$$$$$ definiuję osie i pokazuję którymi pinami są obsługiwane
AccelStepper osY(1, pinSTEPY, pinDIRY); //$$$$$$$$$
AccelStepper osZ(1, pinSTEPZ, pinDIRZ); //$$$$$$$$$
long Xpocz = 10; // początkowa wsp. X
long Ypocz = 10; // początkowa wsp. Y
//$$$$$$$$$ posługuję się współrzędnymi absolutnymi - tu wyliczenie liczby kroków na obrót silnika
long obrot = 48000; // krokow / 1 obrot = 200 * 8 mikrokrok * 30 przelozenie przekladni
long jazda = 48000;
int numer = 12 ;
int przerwa = 1200;
void setup() {
// initialize LCD and set up the number of columns and rows:
lcd.begin(16, 2);
lcd.noBacklight();
lcd.setCursor(0, 1);
lcd.print("I am");
pinMode(pinB1, INPUT); // przycisk 1
digitalWrite(pinB1, HIGH); // włącz rezystor wewnętrzny
pinMode(pinB2, INPUT); // przycisk 2
digitalWrite(pinB2, HIGH); // włącz rezystor wewnętrzny
pinMode(pinB3, INPUT); // przycisk 3
digitalWrite(pinB3, HIGH); // włącz rezystor wewnętrzny
//$$$$$$$$$ ustawienia przyspieszeń na osiach
osX.setMaxSpeed(3300.0); //
osX.setSpeed(3300.0); //
osX.setAcceleration(30000.0); //
osY.setMaxSpeed(3300.0); //
osY.setSpeed(3300.0); //
osY.setAcceleration(30000.0); //
osZ.setMaxSpeed(3300.0); //
osZ.setSpeed(3300.0); //
osZ.setAcceleration(30000.0); //
}
void pokaz() {
lcd.backlight(); // zalaczenie podwietlenia
lcd.setCursor(0, 0); lcd.print("X");
lcd.setCursor(4, 0); lcd.print("Y");
lcd.setCursor(8, 0); lcd.print("Z");
lcd.setCursor(12, 0); lcd.print("P");
lcd.setCursor(8, 1); lcd.print("-");
lcd.setCursor(12, 1); lcd.print("+");
}
void szybko() {
osY.setMaxSpeed(4300.0); //
osY.setSpeed(4300.0); //
osY.setAcceleration(30000.0); //
}
//$$$$$$$$$ ewentualna zmiana parametrów pracy silnika
void wolno() {
osY.setMaxSpeed(2300.0); //
osY.setSpeed(2300.0); //
osY.setAcceleration(300.0); //
}
void srednio() {
osY.setMaxSpeed(3300.0); //
osY.setSpeed(3300.0); //
osY.setAcceleration(30000.0); //
}
void pozycjaZ(){ // pozycjonowanie do krańcówki w pionie
osZpowoli();
osZ.moveTo(osZ.currentPosition()-impulsyZ); // jazda w odpowiednia strone max o podaną w impulsyZ liczbę kroków
while( digitalRead(pinK) == LOW && osZ.distanceToGo()!=0 ) { osZ.run() ; } ;
osZ.stop() ; osZ.runToPosition() ;
osZ.moveTo(osZ.currentPosition()+5*jazda); // zejscie 5mm , jazda ma zdefiniowaną liczbę kroków do poruszenia się o 1mm.
while( osZ.distanceToGo()!=0 ) { osZ.run() ; } // teraz jazda bez sprawdzania krancowek
osZ.stop() ; osZ.runToPosition() ; // tu jest jakiś trik ale już nie pamiętam...
Zpocz=osZ.currentPosition(); // definiuję to miejsce jako punkt początkowy
osZszybko(); // przywracam parametry szybszej jazdy
}
void pozycjaY(){ // pozycjonowanie do krańcówki druga wersja
osY.moveTo(osY.currentPosition()-impulsyY); // pozycjonowanie z gory
while( digitalRead(pinK) == LOW && osY.distanceToGo()!=0 ) { osY.run() ; } ;
osY.stop() ; osY.runToPosition() ;
osY.moveTo(osY.currentPosition()+2*jazda); // zejscie 2mm
while( digitalRead(pinK) == HIGH && osY.distanceToGo()!=0 ) { osY.run() ; } // taka jazda zatrzymuje po zejściu z krańcówki
osY.stop() ; osY.runToPosition() ;
osY.runToNewPosition(osY.currentPosition()+jazda);
Ypocz=osY.currentPosition();
}
void jazda1() {
osY.moveTo(osY.currentPosition()-48000);
while( digitalRead(pinB1) == LOW && osY.distanceToGo()!=0 ) { osY.run() ; }
osY.stop() ; osY.runToPosition() ; lcd.setCursor(1, 0); lcd.print("-off-1") ; delay(100);
// osY.runToNewPosition(osY.currentPosition()-100);
}
void jazda2() {
osY.moveTo(osY.currentPosition()+48000);
while( digitalRead(pinB2) == LOW && osY.distanceToGo()!=0 ) { osY.run() ; }
osY.stop() ; osY.runToPosition() ; lcd.setCursor(1, 0); lcd.print("-off-2") ; delay(100);
// osY.runToNewPosition(osY.currentPosition()+100);
}
void jazdaLEWO() {
lcd.setCursor(0, 1); lcd.print("JL") ; delay(50);
osY.moveTo(osY.currentPosition()-jazda/numer);
while( osY.distanceToGo()!=0 && ! ( digitalRead(pinB3)== LOW) ) { osY.run() ; }
osY.stop() ; osY.runToPosition() ;
delay(100);
}
void jazdaPRAWO() {
lcd.setCursor(0, 1); lcd.print("JP") ; delay(50);
osY.moveTo(osY.currentPosition()+jazda/numer);
while( osY.distanceToGo()!=0 && ! ( digitalRead(pinB3)== LOW) ) { osY.run() ; }
osY.stop() ; osY.runToPosition() ;
delay(100);
}
void demo() {
delay(8000);
while( ! ( digitalRead(pinB3)== LOW) ) {
szybko();
jazdaLEWO();
delay(1000);
jazdaPRAWO();
delay(1000);
dookolaLewo();
delay(3000);
dookolaPrawo();
delay(3000);
wolno();
dookolaLewo();
dookolaPrawo();
}
}
void okno() {
lcd.noBacklight();
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.backlight();
}
void loop() {
stan1p=digitalRead(pinB1);
stan2p=digitalRead(pinB2);
stan3p=digitalRead(pinB3);
delay(10);
stan1=digitalRead(pinB1);
stan2=digitalRead(pinB2);
stan3=digitalRead(pinB3);
if (stan3 == stan3p) {
if (stan3 != HIGH) {
menu();
}
}
if (stan1 == stan1p) {
if (stan1 != HIGH) {
jazdaLEWO();
}
}
if (stan2 == stan2p) {
if (stan2 != HIGH) {
jazdaPRAWO();
}
}
}
void menu() {
okno();
delay(1000);
czas = millis()/1000; // przypisujemy wartość millis() do zmiennej czas
czaswmenu=120;
wybor=1;
wybrane=false;
delay(100);
while( ( millis()/1000 - czas ) < 120 && wybrane==false ) {
czaswmenu = ( millis()/1000 - czas ) ;
if (digitalRead(pinB1) == LOW ) wybor++ ;
if (digitalRead(pinB2) == LOW ) wybor-- ;
if (digitalRead(pinB3) == LOW ) { wybrane = true ;} ;
if (wybor > 8 ) { wybor = 1 ; }
if (wybor < 1 ) { wybor = 8 ; }
switch (wybor) {
case 1:
lcd.setCursor(0, 1); lcd.print(wybor); lcd.print("xxxxx");
if ( wybrane ) { xxxxx() ; } ;
break;
case 2:
lcd.setCursor(0, 1); lcd.print(wybor); lcd.print("speed ");
if ( wybrane ) { szybkosc() ; } ;
break;
case 3:
lcd.setCursor(0, 1); lcd.print(wybor); lcd.print("dook L");
if ( wybrane ) { dookolaLewo() ; } ;
break;
case 4:
lcd.setCursor(0, 1); lcd.print(wybor); lcd.print("dook P");
if ( wybrane ) { dookolaPrawo() ; } ;
break;
case 5:
lcd.setCursor(0, 1); lcd.print(wybor); lcd.print("szybko");
if ( wybrane ) { szybko() ; } ;
break;
case 6:
lcd.setCursor(0, 1); lcd.print(wybor); lcd.print("wolno");
if ( wybrane ) { wolno() ; } ;
break;
case 7:
lcd.setCursor(0, 1); lcd.print(wybor); lcd.print("sred");
if ( wybrane ) { srednio() ; } ;
break;
case 8:
lcd.setCursor(0, 1); lcd.print(wybor); lcd.print("demo");
if ( wybrane ) { demo() ; } ;
break;
}
delay(300);
pokaz();
delay(100);
} ;
lcd.noBacklight();
pokaz();
okno();
}