Znaleziono 2 wyniki

autor: pitsa
22 sie 2018, 23:26
Forum: NASZE AMATORSKIE MASZYNY CNC
Temat: Maszyna do punktowania rur
Odpowiedzi: 49
Odsłony: 6070

Re: Maszyna do punktowania rur

Pokażę kawałek prostego kodu pod arduino którym sterowałem 3 silnikami. Może się komuś przyda.
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() ; } ; 
osX.currentPosition() zna bieżącą pozycję i do niej dokładam ile potrzebuję.
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();    
}

autor: pitsa
17 sie 2018, 21:12
Forum: NASZE AMATORSKIE MASZYNY CNC
Temat: Maszyna do punktowania rur
Odpowiedzi: 49
Odsłony: 6070

Re: Maszyna do punktowania rur

Shieldy są zbędne.

Do szybkich testów silnika i łatwego programowania pracy silników z arduino polecam gotową bibliotekę AccelStepper. Jej zaleta to możliwość ustawienia przyspieszeń przy starcie i zatrzymywaniu silnika.

tak się definiuje silniki dla step/dir:
http://www.airspayce.com/mikem/arduino/ ... ample.html

Przykład jazdy w te i we wte:
http://www.airspayce.com/mikem/arduino/ ... ample.html

Wyszukaj na forum posty z "accelstepper" i poczytaj wątki.

Wróć do „Maszyna do punktowania rur”