Maszyna do punktowania rur

Połączenie obrotnika z młotkiem pneumatycznym przy pomocy ardruino.

Ogólne tematy związane z maszynami CNC, maszyny o odmiennej konstrukcji czyli wszystko co nie pasuje do powyższych.
Tu możesz również przedstawić się i opisać swoją maszynę
Awatar użytkownika

pitsa
Moderator
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 2
Posty: 4693
Rejestracja: 13 wrz 2008, 22:40
Lokalizacja: PL,OP

Re: Maszyna do punktowania rur

#41

Post napisał: pitsa » 22 sie 2018, 23:26

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();    
}



zachowanie spokoju oznacza zdolności do działania
ᐃ 🜂 ⃤ ꕔ △ 𐊅 ∆ ▵ ߡ


Avalyah
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 4
Posty: 2364
Rejestracja: 29 lis 2015, 00:38
Lokalizacja: Bielsko-Biała

Re: Maszyna do punktowania rur

#42

Post napisał: Avalyah » 23 sie 2018, 00:25

mat008 pisze:
22 sie 2018, 12:10
Witam ponownie. No i Pierwsze obroty silnika są 😀 i nawet nic nie dymi 😉 póki co zrezygnowałem jednak z używania bibliotek bo chodź pisze tam że korzystają np. Z pinów od 8 do 11 to nie widzę już jak to dokładnie podłączyć. Dlatego wykorzystałem kod kolegi Avalyah. Musiałem jednak dodać delay bo bez tego silnik tylko piszaczał, może dla sterownika silnika za szybko wszystko się działo?
Dokładnie - bez opóźnienia pętla wykonuje się bardzo szybko i silnik nie miał szans nadążyć. Próbowałeś go zmusić do okolic 30 000 rpm :D
mat008 pisze:
22 sie 2018, 12:10
Teraz mam tak że na delay o wartości 1 silnik działa dość szybko, im dam większą wartość tym obroty są mniejsze.
Powinien się obracać z grubsza 5 razy na sekundę dla delay o wartości 1ms. Już danie mu 2ms sprawi, że będzie robił 2,5 obrotu na sekundę, także wszystko działa jak należy - im większy delay, tym rzadziej wykonywane są kroki - bo nasz program dłużej czeka przed wykonaniem następnego.
mat008 pisze:
22 sie 2018, 12:10
Teraz próbuje zrobić parę obrotów w jedną i parę w drugą stronę ale coś mi nie idzie. Pewnie nie jest dobrym pomysłem dawać po sobie dwie pętle for?

Kod: Zaznacz cały


void setup() {
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
     for (int i = 0; i < 400; i++) { //Wykonaj 2 obroty
     digitalWrite(9, LOW);       // Ustaw pin Pul na 0V.
     digitalWrite(8, HIGH);  // Ustaw pin Dir zgodnie z wybranym kierunkiem - 0 albo 1
     digitalWrite(9, HIGH);      // Ustaw pin Pul na 5V.
     delay(1);
     }
     for (int a = 0; a < 600; i++) { //Wykonaj 3 obroty
     digitalWrite(9, LOW);       // Ustaw pin Pul na 0V.
     digitalWrite(8, LOW);  // Ustaw pin Dir zgodnie z wybranym kierunkiem - 0 albo 1
     digitalWrite(9, HIGH);      // Ustaw pin Pul na 5V.
     delay(1);
}
}
Kod jest ogólnie dobry, nie ma nic złego w robieniu dwóch pętli pod sobą, ale masz literówkę - w drugiej pętli jako zmienną do iteracji zadeklarowałeś a, podałeś warunek, że a musi być mniejsze niż 600, a potem chcesz inkrementować zmienną i, która nie istnieje. Ogólnie jeżeli deklarujesz zmienną w pętli to ona istnieje tylko do końca pętli, więc możesz używać tej samej nazwy zmiennej.

Poprawny kod:

Kod: Zaznacz cały

void setup() {
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
     for (int i = 0; i < 400; i++) { //Wykonaj 2 obroty
     digitalWrite(9, LOW);       // Ustaw pin Pul na 0V.
     digitalWrite(8, HIGH);  // Ustaw pin Dir zgodnie z wybranym kierunkiem - 0 albo 1
     digitalWrite(9, HIGH);      // Ustaw pin Pul na 5V.
     delay(1);
     }
     for (int i = 0; i < 600; i++) { //Wykonaj 3 obroty
     digitalWrite(9, LOW);       // Ustaw pin Pul na 0V.
     digitalWrite(8, LOW);  // Ustaw pin Dir zgodnie z wybranym kierunkiem - 0 albo 1
     digitalWrite(9, HIGH);      // Ustaw pin Pul na 5V.
     delay(1);
}
}
Tak, jak było wcześniej nie powinno się w ogóle skompilować, a arduino ide powinno Koledze powiedzieć, że:
'i' was not declared in this scope

-------------------------------------------------------------------------
mat008 pisze:
22 sie 2018, 22:30
Dopiero po parokrotnym przeczytaniu kodu od kolegi Avalyah widzę że próbował mi dać podpowiedź o użyciu funkcji, tylko że nie za bardzo rozumiem ten kod, głównie użytych parametrów jakie mogą mieć. Próbuje coś z tym zdziałać ale słabo idzie i już sam gubię się w tym krótkim kodzie...

Kod: Zaznacz cały


void setup() {
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  void doStepPrawo()
     {
     digitalWrite(9, LOW);       // Ustaw pin Pul na 0V.
     digitalWrite(8, HIGH);  // Ustaw pin Dir zgodnie z wybranym kierunkiem - 0 albo 1
     digitalWrite(9, HIGH);      // Ustaw pin Pul na 5V.
     delay(1);
}


void loop() {
doStepsPrawo(1000,5,1)
{
  for (i = 0; i < 1000; i++)
  {
        doStep(direction);
        delay(msBetweenSteps);
  }
}
     

}
Ojojoj, tutaj nie wyszło i to mocno :P

Tutaj kod poprawny:

Kod: Zaznacz cały

void doStep(uint8_t dir);
void doSteps(uint32_t numberOfSteps, uint8_t msBetweenSteps,uint8_t dir);

void setup() 
{
  pinMode(8, OUTPUT);   // Pin dir jako wyjście
  pinMode(9, OUTPUT);   // Pin step jako wyjście
}

void loop() 
{
  doSteps(1000,5,1);   // Wykonaj 1000 kroków, krok co 5ms w kierunku 1 (albo HIGH, w tym wypadku to to samo)
  delay(1000);         // Odczekaj sekundę
}

// Funkcja pomocnicza, wykonująca jeden krok w danym kierunku
void doStep(uint8_t dir)
{
     digitalWrite(9, LOW);       // Ustaw pin Pul na 0V.
     digitalWrite(8, dir);       // Ustaw pin Dir zgodnie z wybranym kierunkiem - 0 albo 1 (czyli LOW lub HIGH)
     digitalWrite(9, HIGH);      // Ustaw pin Pul na 5V.
}

void doSteps(uint32_t numberOfSteps, uint8_t msBetweenSteps,uint8_t dir)
{
  for (uint32_t i = 0; i < numberOfSteps; i++)
  {
        doStep(dir);                // Wykonaj krok w zadanym kierunku
        delay(msBetweenSteps);      // Odczekaj podaną ilość milisekund
  }
}
Najpierw deklarujemy sobie, że będziemy mieli dwie funkcje - doStep i doSteps. Dzięki temu możemy ich użyć poniżej mimo, że w środku nic jeszcze nie ma.

Następnie w funkcji setup pin 8 i 9 ustawiane są jako wyjścia.

Potem w funkcji głównej używamy naszej funkcji doSteps, żeby silnik wykonał zadaną ilość kroków. Dodałem delay 1s, bo inaczej silnik obracałby się w nieskończoność, a teraz będzie wykonywał te 1000 kroków, czekał przez sekundę po czym znowu wykonywał 1000 kroków i tak w kółko.

Następnie piszemy sobie nasze dwie funkcje, których używamy. Pierwsza to funkcja pomocnicza, żeby kod był bardziej zrozumiały i jedyne, co ona robi to wykonuje sekwencję potrzebną do wykonania kroku przez silnik.

Na samym końcu mamy naszą funkcję, która już ma poważniejsze zadanie - musi wykonać funkcję pomocniczą określoną ilość razy, a dodatkowo jeszcze wprowadzić opóźnienie, bo inaczej nie byłoby kontroli nad prędkością, a silnik by tylko zapiszczał.

Tak naprawdę nie potrzebujemy funkcji pomocniczej, nasza funkcja mogłaby wyglądać tak:

Kod: Zaznacz cały

void doSteps(uint32_t numberOfSteps, uint8_t msBetweenSteps,uint8_t dir)
{
  for (uint32_t i = 0; i < numberOfSteps; i++)
  {
        digitalWrite(9, LOW);       // Ustaw pin Pul na 0V.
        digitalWrite(8, dir);       // Ustaw pin Dir zgodnie z wybranym kierunkiem - 0 albo 1
        digitalWrite(9, HIGH);      // Ustaw pin Pul na 5V.
        delay(msBetweenSteps);      // Odczekaj podaną ilość milisekund
  }
}
ale dobrym zwyczajem jest dzielenie funkcjonalności na jak najmniejsze elementy, bo inaczej w bardziej skomplikowanych przypadkach mielibyśmy funkcje na kilkadziesiąt/kilkaset linijek, a dobry zwyczaj mówi, że funkcja powinna mieć ich maksymalnie kilkanaście,a najlepiej tylko kilka.

----------------------------------------
Ogólnie polecam jakiś poradnik o podstawach podstaw, bo metodą prób i błędów będzie bardzo ciężko. Do arduino na pewno jest wiele takich tutoriali na youtubie albo w formie tekstowej.

Dodane 49 minuty 21 sekundy:
pitsa pisze:
22 sie 2018, 23:26
no i silniki nie piszczą na starcie tylko odpowiednio startują bo jest rampa.
Bez rampy też będą dobrze startować, chyba, że pod skrajnym obciążeniem.


Autor tematu
mat008
Czytelnik forum poziom 3 (min. 30)
Czytelnik forum poziom 3 (min. 30)
Posty w temacie: 24
Posty: 30
Rejestracja: 17 maja 2015, 15:24
Lokalizacja: NML

Re: Maszyna do punktowania rur

#43

Post napisał: mat008 » 23 sie 2018, 12:07

Pitsa dzięki za kod ale nie lubię korzystać z rzeczy których nie rozumiem w chodź małym stopniu.
Ale doceniam pomoc.

Avalyah ponownie dziękuję za pomoc. No teraz to już w sumie za gotowy kod i to dobrze opisany.
Z tą literówką to taki błąd że aż wstyd 😔
Wcześniej miałem w obu pętlach "i" ale ze właśnie był błąd przy kompilacji to myślałem że nie może być ta sama zmienna w obu pętlach.
Oczywiście przed wątkiem na forum czytałem kurs arduino ale ciężko to tak wszystko od razu pojąć. Próbowałem doczytać więcej info o funkcjach ale nie mogłem znaleźć żadnego dobrego artykułu 😁 może dlatego że jeszcze za mało kumam 😉


Autor tematu
mat008
Czytelnik forum poziom 3 (min. 30)
Czytelnik forum poziom 3 (min. 30)
Posty w temacie: 24
Posty: 30
Rejestracja: 17 maja 2015, 15:24
Lokalizacja: NML

Re: Maszyna do punktowania rur

#44

Post napisał: mat008 » 12 paź 2018, 17:50

Witam ponownie. Budowa mechaniki jest ukończona, udało się również złożyć elektronikę i z pomocą na pw kolegi Avalyah znaleźć małe błędy w kodzie. Wrzucam galerię z postępem prac, no zostaje jeszcze pomalować, zmontować wszystko razem i skalibrować. Kod pewnie nie jest jakoś poprawnie napisany, ale działa ;]
https://tufotki.pl/gqsLp

Kod: Zaznacz cały

//napunktuj silnik w prawo i silnik w lewo x razy silnik nr1
//przesun w bok w prawo x obr silnik nr2
//wykonaj to x razy i obrot walem silnik nr 3
//800 to chyba cwierc obrotu silnika

//ustawienia, zalezne od modelu walu, model nr1
int skokSpust = 400; //usatlenie jak bardzo naciskac spust mlotka pneumatycznego
int przesWbok = 800; //regulacja przesuniecia, skoku w bok na srubie trapezowej
int obrWal = 5; //ile razy ma sie wszystko powrorzyc, zaleznie od fi walu
int dlWal = 20; //ile razy ma zrobic punkt i przesuniecie w bok, zlezy od dlugosci walu
int odstepNaFi = 400; //o ile ma sie obrocic wal na obrotniku

void silnikNr1lewo(int n, int vObroty);
void silnikNr1prawo(int n, int vObroty);
void silnikNr2prawo(int n, int vObroty);
void silnikNr2lewo(int n, int vObroty);
void silnikNr3lewo(int n, int vObroty);
void punktIprzesun(int n);

void setup() {
  pinMode(4, OUTPUT); //ustawianie pinow jako wyjscia
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  delay(3000);

for (int a = 0; a < obrWal; a++)  //wszystko wykonaj x razy, zaleznie od srednicy walu
{
punktIprzesun(dlWal); //wykonaj x razy punkt i przesun w bok
delay(1000);
silnikNr2lewo(dlWal*przesWbok, 1); //cofanie punktaka w lewo, mnozenie skoku razy ilosc przesuniec w bok, maks predkosc
delay(1000);
silnikNr2prawo(przesWbok/2, 1); //wykonaj pol skoku w prawo by zrobic przesuniecie punktow, z maks szybkosc za pomoca funkcji silnikNr2prawo
delay(1000);
silnikNr3lewo(odstepNaFi, 2); //obrot walu na obrotniku, dwa obr predkosc dwa
delay(1000);
punktIprzesun(dlWal);
delay(1000);
silnikNr2lewo(dlWal*przesWbok, 1);
delay(1000);
silnikNr2lewo(przesWbok/2, 1); //wykonaj dodatkowo pol skoku w lewo, by usunac przesuniecie punktow
delay(1000);
silnikNr3lewo(odstepNaFi, 2); //obrot walu, dwa obr predkosc dwa
delay(1000);
}
}

void loop() {
}

void silnikNr1lewo(int n, int vObroty) //ile razy ma sie obrocic 200 to 1 obr osi, z jaka szybkoscia 1 to najszybciej
{
for (int r = 0; r < n; r++)
{
     digitalWrite(5, LOW);       // Ustaw pin Pul na 0V.
     digitalWrite(4, HIGH);  // Ustaw pin Dir zgodnie z wybranym kierunkiem obrotu - 0 albo 1
     digitalWrite(5, HIGH);      // Ustaw pin Pul na 5V.
     delay(vObroty);
}
}
void silnikNr1prawo(int n, int vObroty) //ile razy ma sie obrocic 200 to 1 obr osi, z jaka szybkoscia 1 to najszybciej
{
for (int e = 0; e < n; e++)
{
     digitalWrite(5, LOW);       // Ustaw pin Pul na 0V.
     digitalWrite(4, LOW);  // Ustaw pin Dir zgodnie z wybranym kierunkiem obrotu - 0 albo 1
     digitalWrite(5, HIGH);      // Ustaw pin Pul na 5V.
     delay(vObroty);
}
}
void silnikNr2prawo(int n, int vObroty) //ile razy ma sie obrocic 200 to 1 obr osi, z jaka szybkoscia 1 to najszybciej
{
for (int w = 0; w < n; w++)
{
     digitalWrite(7, LOW);       // Ustaw pin Pul na 0V.
     digitalWrite(6, LOW);  // Ustaw pin Dir zgodnie z wybranym kierunkiem obrotu - 0 albo 1
     digitalWrite(7, HIGH);      // Ustaw pin Pul na 5V.
     delay(vObroty);
}
}
void silnikNr2lewo(int n, int vObroty) //ile razy ma sie obrocic 200 to 1 obr osi, z jaka szybkoscia 1 to najszybciej
{
for (int q = 0; q < n; q++)
{
     digitalWrite(7, LOW);       // Ustaw pin Pul na 0V.
     digitalWrite(6, HIGH);  // Ustaw pin Dir zgodnie z wybranym kierunkiem obrotu - 0 albo 1
     digitalWrite(7, HIGH);      // Ustaw pin Pul na 5V.
     delay(vObroty);
}
}
void silnikNr3lewo(int n, int vObroty) //ile razy ma sie obrocic 200 to 1 obr osi, z jaka szybkoscia 1 to najszybciej
{
for (int k = 0; k < n; k++)
{
     digitalWrite(9, LOW);       // Ustaw pin Pul na 0V.
     digitalWrite(8, HIGH);  // Ustaw pin Dir zgodnie z wybranym kierunkiem obrotu - 0 albo 1
     digitalWrite(9, HIGH);      // Ustaw pin Pul na 5V.
     delay(vObroty);
}
}
void punktIprzesun(int n) //ile razy ma wykonac punkt i przesunac w bok
{
for (int h = 0; h < n; h++)
{
     silnikNr1lewo(skokSpust, 1); //wykonaj 2obr z maks szybkosc za pomoca funkcji silnikNr1lewo
     delay(300);
     silnikNr1prawo(skokSpust, 1); //wykonaj 2obr z maks szybkosc za pomoca funkcji silnikNr1prawo
     delay(300);
     silnikNr2prawo(przesWbok, 1); //wykonaj 4obr z maks szybkosc za pomoca funkcji silnikNr2prawo
     delay(300);
}
}



Avalyah
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 4
Posty: 2364
Rejestracja: 29 lis 2015, 00:38
Lokalizacja: Bielsko-Biała

Re: Maszyna do punktowania rur

#45

Post napisał: Avalyah » 12 paź 2018, 18:33

Jak działa, to znaczy, że jest poprawnie napisany. Czy elegancki to inna sprawa, ale to jest w gruncie rzeczy sztuka dla sztuki, warta świeczki tylko, jeżeli projekt miałby być w przyszłości poważnie rozwijany.

To teraz czekamy na filmy z działania :)


Bronsonboss
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 11
Posty: 304
Rejestracja: 14 sty 2018, 18:27
Lokalizacja: Cedry Wielkie

Re: Maszyna do punktowania rur

#46

Post napisał: Bronsonboss » 14 paź 2018, 11:07

Właśnie... Też czekam na film jak to finalnie będzie działać..


bioxus
Czytelnik forum poziom 1 (min. 10)
Czytelnik forum poziom 1 (min. 10)
Posty w temacie: 2
Posty: 19
Rejestracja: 17 sie 2018, 22:27
Lokalizacja: Kraków

Re: Maszyna do punktowania rur

#47

Post napisał: bioxus » 14 paź 2018, 21:14

Mam znakowarkę Flexmark, który można punktować rury, ale ona generalnie służy do grawerowania a nie samego punktowania choć sposób działania warty uwagi dla budowy urządzeń jak to wspomniane powyżej.znakowarki mikroudarowe


Autor tematu
mat008
Czytelnik forum poziom 3 (min. 30)
Czytelnik forum poziom 3 (min. 30)
Posty w temacie: 24
Posty: 30
Rejestracja: 17 maja 2015, 15:24
Lokalizacja: NML

Re: Maszyna do punktowania rur

#48

Post napisał: mat008 » 15 paź 2018, 11:53

Przez małą ilość wolnego czasu pewnie chwilę z tym zejdzie 😅 ale obiecuję że jak tylko będę miał film to zaraz go wrzucę 😉 może kolega bioxus pokaże swoją maszynę w boju ?


bioxus
Czytelnik forum poziom 1 (min. 10)
Czytelnik forum poziom 1 (min. 10)
Posty w temacie: 2
Posty: 19
Rejestracja: 17 sie 2018, 22:27
Lokalizacja: Kraków

Re: Maszyna do punktowania rur

#49

Post napisał: bioxus » 17 paź 2018, 22:11

Na razie jest rozmontowana, ale na szybko to tu zobaczysz zasadę działania. Jak znajdę chwilę to nagram jakiś filmik. Interesuje Cię znakowanie jakiegoś konkretnego przedmiotu, treści lub części czy tylko poglądowo?


Autor tematu
mat008
Czytelnik forum poziom 3 (min. 30)
Czytelnik forum poziom 3 (min. 30)
Posty w temacie: 24
Posty: 30
Rejestracja: 17 maja 2015, 15:24
Lokalizacja: NML

Re: Maszyna do punktowania rur

#50

Post napisał: mat008 » 18 paź 2018, 22:08

Fajne cudo, tak tylko podglądowo mnie ciekawiło.

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „NASZE AMATORSKIE MASZYNY CNC”