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
Znaleziono 4 wyniki
Wróć do „Maszyna do punktowania rur”
- 12 paź 2018, 18:33
- Forum: NASZE AMATORSKIE MASZYNY CNC
- Temat: Maszyna do punktowania rur
- Odpowiedzi: 49
- Odsłony: 5570
- 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
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 rpmmat008 pisze: ↑22 sie 2018, 12:10Witam 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?
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.
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.mat008 pisze: ↑22 sie 2018, 12:10Teraz 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); } }
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);
}
}
'i' was not declared in this scope
-------------------------------------------------------------------------
Ojojoj, tutaj nie wyszło i to mocnomat008 pisze: ↑22 sie 2018, 22:30Dopiero 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); } } }
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
}
}
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
}
}
----------------------------------------
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:
Bez rampy też będą dobrze startować, chyba, że pod skrajnym obciążeniem.
- 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
- 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):
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!):
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:
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 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.
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.
}
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);
}
}
Kod: Zaznacz cały
doSteps(1000,5,1);
Chociaż nie wiem, po co ja się produkuję, to samo będziesz pewnie miał już w gotowej bibliotece od arduino 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.