• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Gietarka do drutu "cnc"
#1
Witam serdecznie, zbudowałem giętarkę do drutu (0,9 mm) sterowaną za pomocą Leonardo. Konstrukcja bazuje na zmostkowanych (w celu zwiększenia wydajności prądowych) układach L298n i posiada 3 części ruchome napędzane silnikami dc:
- podajnik do drutu jako pierwszy
- głowica gnąca jako drugi
- "winda" podnosi i opuszcza głowicę w celu ustawienia głowicy do gięcia w zadaną stronę.
 Całość można zobaczyć na YT pod poniższym linkiem.

https://www.youtube.com/watch?v=FwsUF65b...e=youtu.be

Na ten moment filmik wrzuciłem celem objaśnienia idei działania żeby łatwiej było rozmawiać nt mojego problemu.

Ja widzieliście co jakiś czas głowica obraca się w prawo celem zbazowania punktu wyjścia (jest to warunek konieczny zachowania dokładności kąta gięcia jako że są to silniki DC a nie krokowe). Do tej pory bazowanie działało w oparciu o dodatkowy sterownik L298n zatrzymywany krańcówką ale 2 układy podłączone do 1 silnika nie sprawdzają się bo mówiąc laicko prąd przechodził ze sterownika 1 do 2-go uszkadzając go po jakimś czasie, ponadto rozwiązanie to jest nieefektywne bo wymaga dodatkowego sterownika, a po co jak można załatwić to programowo. No i tutaj pojawił się problem:
Urządzenie działa na prostej pętli If else inicjowanej przez pullup z pinu 13 .
Jeżeli warunek jest spełniony to wykonuje się szereg poleceń adresowanych do danych trzech sterowników tj. podanie drutu, ustawienie głowicy gnącej, podniesienie "windy", gięcie, bazowanie głowicy gnącej, tak jak zobaczycie w poniższym sketchu.
Problem pojawia się w zagnieżdżeniu pętli sterującej bazą (pullup z pinu 12)
Kod:
void setup()
{
 pinMode(13, INPUT_PULLUP);
 pinMode(12, INPUT_PULLUP);
 pinMode(11, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(8, OUTPUT);
 pinMode(7, OUTPUT);
 pinMode(6, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(4, OUTPUT);
 

 digitalWrite(11, LOW);
 digitalWrite(10, LOW);
 digitalWrite(9, LOW);
 digitalWrite(8, LOW);
 digitalWrite(7, LOW);
 digitalWrite(6, LOW);
 digitalWrite(5, LOW);
 digitalWrite(4, LOW);

}
void loop() {
if (digitalRead(13) == LOW) {
 
 digitalWrite(10, HIGH); //Obrot w prawo
 digitalWrite(11, LOW);
 delay(500);
 digitalWrite(10, LOW);
 digitalWrite(11, LOW);
 delay(100);


 digitalWrite(11, HIGH); //Obrot w lewo
 digitalWrite(10, LOW);
 delay(300);
 digitalWrite(10, LOW);
 digitalWrite(11, LOW);
 delay(100);




}

else { }
   
}


Powyżej znajduje się sketch zawierający komendy wyłącznie do głowicy (żeby już nie mieszać) ten docelowy różni się wyłącznie wmieszanymi komendami do pozostałych 2 par pinów (podajnika i windy). Jak widać polega na tym, że jeżeli naciskam mikrowłącznik to wykonują się kolejne polecenia aż do końca zgodnie z kształtem jaki ma osiągnąć wyginany drut. kształt jest trochę skomplikowany i normalnie sketch zawierał ponad 800 linijek ale to nie problem (nie umiem definiować poleceń).

Jak już zorientowaliście się nie jestem biegły w programowaniu i bardziej zajmuję się hardware niż software wydaje mi się że bazowanie powinno odbywać się na zasadzie

if (digitalRead(12) == LOW) {
 
  digitalWrite(10, HIGH); //Obrot w prawo do bazy aż krańcówka rozłączy obwód pomiędzy pin12 a gnd w ardu)
  digitalWrite(11, LOW); }
  else
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  delay(100);

Wklejam to do pętli ale wykonywany jest tylko początek i kręci się w kółko, nie zatrzymuje się w momencie zetknięcia wypustki na głowicy z krańcówka tj. zbazowania głowicy. Program nie jest realizowany do końca, męczę się z tym już długo. Mógłbym to załatwić zwykłym przekaźnikiem , który podczas czynności bazowania odłącza sterownik odpowiadający za obrót głowicy od układu ale nie w tym rzecz, chcę uprościć układ i wiem że rozwiązanie jest banalne dla średniego zjadacza chleba smarowanego językiem C.
Mam nadzieję że ktoś pochyli się nad moim problemem i podyktuje mi rozwiązanie albo wskazówkę.

Dodam tylko że moją intencją jest wrzucenie filmiku z działającą maszyną na YT jako przedmiot edukacyjny, nie zamierzam zarabiać na dzieleniu się wiedzą, jak ktoś będzie chciał zrobić coś podobnego to służę pomocą, pracuję na obrabiarce CNC na której to obrabiarce zrobiłem tą gientarkę Smile więc w tym też chętnie pomogę. . Pozdrawiam i życzę miłego!!!
 
Odpowiedź
#2
Po pierwsze, nie byłoby rozwiązaniem wstawić na końcu każdego ze sterowników diodę? Zabezpieczy Ci to sterowniki przed cofaniem się napięcia lub też przechodzeniem napięcia z jednego na drugi.
Po drugie, w kodzie, który podałeś (digitalRead(12)) blok else jest pozbawiony klamry. W wyniku tego wykona się tylko pierwsza linijka (digitalWrite(10, LOW)Wink, pozostałe dwie (digitalWrite(11, LOW) oraz (delay(100)) zostaną wykonane niezależnie od tego, czy warunek (stan niski na pinie 12) zaistnieje, czy też nie.
 
Odpowiedź
#3
(16-05-2017, 19:32)krn78 napisał(a): Po pierwsze, nie byłoby rozwiązaniem wstawić na końcu każdego ze sterowników diodę? Zabezpieczy Ci to sterowniki przed cofaniem się napięcia lub też przechodzeniem napięcia z jednego na drugi.
Po drugie, w kodzie, który podałeś (digitalRead(12)) blok else jest pozbawiony klamry. W wyniku tego wykona się tylko pierwsza linijka (digitalWrite(10, LOW)Wink, pozostałe dwie (digitalWrite(11, LOW) oraz (delay(100)) zostaną wykonane niezależnie od tego, czy warunek (stan niski na pinie 12) zaistnieje, czy też nie.

Dioda nie pomoże, (przyznam że to najczęstsza podpowiedź) głowica kręciłaby się wtedy tylko w jedną stronę a gięcie drutu odbywa się przecież w obie strony.

Wklejenie nawiasu klamrowego po else też nic nie pomoże. BD nagrywał film z Waszymi propozycjami i wrzucał na YT żebyście sami się przekonali na żywo jaki efekt dają konkretne propozycje zmian w kodzie.
Poniżej link z działania układu z propozycją zmiany dok przez krn78 oraz zastosowany kod.

https://www.youtube.com/watch?v=L0eUNiDc17Q


Kod:
void setup()
{
 pinMode(13, INPUT_PULLUP);
 pinMode(12, INPUT_PULLUP);
 pinMode(11, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(8, OUTPUT);
 pinMode(7, OUTPUT);
 pinMode(6, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(4, OUTPUT);
 

 digitalWrite(11, LOW);
 digitalWrite(10, LOW);
 digitalWrite(9, LOW);
 digitalWrite(8, LOW);
 digitalWrite(7, LOW);
 digitalWrite(6, LOW);
 digitalWrite(5, LOW);
 digitalWrite(4, LOW);

}
void loop() {
if (digitalRead(13) == LOW) {
 
 digitalWrite(10, HIGH); //Obrot w prawo
 digitalWrite(11, LOW);
 delay(200);
 digitalWrite(10, LOW);
 digitalWrite(11, LOW);
 delay(100);

 digitalWrite(10, HIGH); //Obrot w prawo
 digitalWrite(11, LOW);
 delay(200);
 digitalWrite(10, LOW);
 digitalWrite(11, LOW);
 delay(100);
 
 digitalWrite(11, HIGH); //Obrot w lewo
 digitalWrite(10, LOW);
 delay(250);
 digitalWrite(10, LOW);
 digitalWrite(11, LOW);
 delay(100);

if (digitalRead(12) == LOW) {
digitalWrite(10, HIGH); //Obrot w prawo bazuje az krancowka rozlaczy obwod
digitalWrite(11, LOW);
} else {
 digitalWrite(10, LOW);
 digitalWrite(11, LOW);}
 delay(100);

}
else { }
}

Jak widać na filmie i po kodzie głowica obraca się w prawo, prawo, lewo, następnie zaczyna realizować bazowanie ale go nie kończy tj kreci się bez końca.
 
Odpowiedź
#4
Używasz adresów absolutnych więc nie chce mi się analizować co jest gdzie.

Jeśli program masz w postaci:
Kod:
void loop()
{
   digitalWrite(10, HIGH);
   digitalWrite(11, LOW);
   delay(500);
   digitalWrite(10, LOW);
   digitalWrite(11, LOW);
   delay(700);
   krancowka = digitalRead(13);
}
to zmienna krancowka będzie uaktualniana co 1,2 sekundy!!!

Twój problem prawdopodobnie da się rozwiązać w następujący sposób(bez znacznej modyfikacji programu):
Kod:
const int krancowka = 4;
const int zalPrawo = 7;
const int zalLewo = 6;

void setup()
{
    pinMode(krancowka, INPUT_PULLUP);
    pinMode(zalPrawo, OUTPUT);
    pinMode(zalLewo,OUTPUT);    
}

void loop()
{
    digitalWrite(zalPrawo, HIGH);    //zalaczenie bazowania
    while(digitalRead(krancowka)){}    //oczekiwanie na krancowke - 0 to zadzialanie
    digitalWrite(zalPrawo,LOW);            
    digitalWrite(zalLewo,HIGH);
    delay(2000);
    digitalWrite(zalLewo,LOW);
}
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości