Znaleziono 4 wyniki

autor: Avalyah
12 paź 2018, 18:33
Forum: NASZE AMATORSKIE MASZYNY CNC
Temat: Maszyna do punktowania rur
Odpowiedzi: 49
Odsłony: 5570

Re: Maszyna do punktowania rur

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 :)
autor: Avalyah
23 sie 2018, 00:25
Forum: NASZE AMATORSKIE MASZYNY CNC
Temat: Maszyna do punktowania rur
Odpowiedzi: 49
Odsłony: 5570

Re: Maszyna do punktowania rur

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: Avalyah
17 sie 2018, 10:25
Forum: NASZE AMATORSKIE MASZYNY CNC
Temat: Maszyna do punktowania rur
Odpowiedzi: 49
Odsłony: 5570

Re: Maszyna do punktowania rur

Powodzenia. Jakbyś miał jakieś pytania dotyczące programowania arduino to wal śmiało tutaj lub na pw, robiłem podobne urządzonko z ekranem dotykowym i innymi bajerami i nawet działa :P
autor: Avalyah
16 sie 2018, 23:14
Forum: NASZE AMATORSKIE MASZYNY CNC
Temat: Maszyna do punktowania rur
Odpowiedzi: 49
Odsłony: 5570

Re: Maszyna do punktowania rur

Co do wysterowania sygnału pulse w sterowniku to nie ma w tym żadnej filozofii. Krok wykonywany jest, jak sygnał zmieni się z 0V na 5V. Sterownik potrzebuje coś kilka mikrosekund, żeby zarejestrować zmianę. W Twoim przypadku, żeby wykonać krok wystarczy Ci taka funkcja (poglądowo):

Kod: Zaznacz cały

static inline void doStep(uint8_t direction)
{
     digitalWrite(pinPul, LOW);       // Ustaw pin Pul na 0V.
     digitalWrite(pinDir, direction);  // Ustaw pin Dir zgodnie z wybranym kierunkiem - 0 albo 1
     digitalWrite(pinPul, HIGH);      // Ustaw pin Pul na 5V.
}
i gotowe, krok wykonany. Czas wykonywania funkcji digitalWrite jest na tyle duży (o ile pamiętam coś koło 6uS), że powinien wystarczyć sterownikowi do wykrycia zmiany bez dodawania dodatkowych opóźnień. Oczywiście możesz sobie to rozszerzyć na kilka osi itd., to co napisałem to takie minimum, żeby zakręcić silnikiem w wybranym kierunku. To, jak szybko będzie kręcił się silnik zależy oczywiście od tego, jak często będziesz tę funkcję doStep wywoływał. Możesz to zrealizować za pomocą przerwań wykonywanych równiutko co określony czas ("równolegle" do głównej pętli programu, która może w tym czasie robić coś innego), albo po prostu zrobić gdzieś pętlę z opóźnieniem (prostsze rozwiązanie ale nieeleganckie i zajmuje całkowicie procesor). Dla przykładu (znowu zupełnie poglądowo!):

Kod: Zaznacz cały

void doSteps(uint32_t numberOfSteps, uint8_t msBetweenSteps,uint8_t direction)
{
	for (uint32_t i = 0; i < numberOfSteps; i++)
	{
	      doStep(direction);
	      delay(msBetweenSteps);
	}
}
wykona Ci zadaną ilość kroków z określoną prędkością w określonym kierunku. Wywołanie w kodzie funkcji w ten sposób:

Kod: Zaznacz cały

doSteps(1000,5,1);
spowoduje, że silnik wykona 1000 kroków (5 obrotów bez mikrokroku) w ciągu 5 sekund (każdy krok co 5ms).

Chociaż nie wiem, po co ja się produkuję, to samo będziesz pewnie miał już w gotowej bibliotece od arduino :P do tego w zestawie od razu przyspieszanie itd. Ale z tego, co pamiętam te biblioteki też takie cudowne nie są, jak będziesz chciał trochę rozwinąć projekt to zobaczysz, że samemu napiszesz do tego lepszy kod.

Co do krańcówek to nie wiem, czy do końca rozumiem, ale jeśli chcesz je wykorzystać tylko jako zabezpieczenie to wystarczy je spiąć z sygnałem ena na sterowniku. Natomiast w takim przypadku gdy zostaną aktywowane to arduino się o tym nie dowie i będzie wykonywać program dalej (oczywiście silniki nie będą już odpowiadać), więc odpada Ci możliwość reakcji programowej na to i na przykład umożliwienie wznowienia pracy po usunięciu ręcznym problemu, jeżeli to możliwe.

Wróć do „Maszyna do punktowania rur”