• 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
Stół obrotowy z czujnikami indukcyjnymi?
#1
Photo 
Witam, mam mały problem z stołem obrotowym.
Założenia:
- Po naciśnięciu przycisku 1 stół przejeżdża do pozycji 1 i zapala się led 1. (analogicznie dla każdej pozycji).
- uniemożliwienie zmiany położenia podczas obrotu stołu (naciśnięcie przycisku nie wpływa na prace).
- zatrzymanie stołu w miejscu czujnika
- sygnalizacja położenia stołu poprzez lampkę kontrolną\
- brak zmiany pozycji podczas gdy stół znajduję się w odpowiednim miejscu.
- stół obraca się tylko w jednym kierunku
Chciałbym propozycję jak wysterować tym stołem. Jakich pętli użyć próby z instrukcjami IF skończyły się porażką Smile 
Poglądowy szkic poniżej.

[Obrazek: 89764098983418105055.jpg]
 
Odpowiedź
#2
Gdybyś przedstawił kod to łatwiej byłoby pomóc.


Cytat:Jakich pętli użyć próby z instrukcjami IF skończyły się porażką Smile

Nieważne czego użyjesz, ważna aby działało i było czytelne.
Najprościej zrobić to z użyciem maszyny stanów np: http://ep.com.pl/files/1436.pdf
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ź
#3
Jestem początkujący to kod raczej też "bardzo" początkujący.

Kod:
#define krancowka1 digitalRead(8)
#define krancowka2 digitalRead(9)
#define krancowka3 digitalRead(10)
#define krancowka4 digitalRead(11)

#define przycisk1 digitalRead(4)
#define przycisk2 digitalRead(3)
#define przycisk3 digitalRead(2)
#define przycisk4 digitalRead(1)

#define led1 7
#define led2 6
#define led3 5
#define sil 12

void setup() {
 pinMode(przycisk1, INPUT_PULLUP);
 pinMode(przycisk2, INPUT_PULLUP);
 pinMode(przycisk3, INPUT_PULLUP);
 pinMode(przycisk4, INPUT_PULLUP);

 pinMode(8, INPUT_PULLUP);
 pinMode(9, INPUT_PULLUP);
 pinMode(10, INPUT_PULLUP);
 pinMode(11, INPUT_PULLUP);
 pinMode(led1, OUTPUT);
 pinMode(led2, OUTPUT);
 pinMode(led3, OUTPUT);

}

void loop() {

 long czas = millis() / 1000;

 if ( krancowka1 == HIGH and przycisk1 == LOW ) {
   sil == HIGH;
   if (krancowka1 == HIGH) {
     sil == LOW;
     digitalWrite(led1, HIGH);
   }
 }


 if ( krancowka2 == HIGH and przycisk2 == LOW ) {
   sil == HIGH;
   if (krancowka2 == HIGH) {
     sil == LOW;
     digitalWrite(led2, HIGH);
   }
 }


 if ( krancowka3 == HIGH and przycisk3 == LOW ) {
   sil == HIGH;
   if (krancowka3 == HIGH) {
     sil == LOW;
     digitalWrite(led3, HIGH);
   }
 }


 if ( krancowka4 == HIGH and przycisk4 == LOW ) {
   sil == HIGH;
   if (krancowka2 == HIGH) {
     sil == LOW;
     digitalWrite(led3, HIGH);
   }
 }

}
 
Odpowiedź
#4
Do takich rzeczy najlepszy jest symulator np: https://www.sites.google.com/site/unoardusim/services

Nie podałeś co prawda jaki jest stan krańcówki gdy jest zadziałana ale masz błąd bo zakładam że oczekujesz zmiany stanu krańcówki a Ty sprawdzasz ten sam stan.

  if ( (krancowka1 == HIGH) and (przycisk1 == LOW )) {
    sil == HIGH;
    if (krancowka1 == HIGH) {
      sil == LOW;
      digitalWrite(led1, HIGH);
    }
  }

Dodatkowo taki kod (poprawiony) będzie niepoprawny bo nie możesz oczekiwać że w tym samym cyklu programu stan krańcówki będzie raz wysoki a raz niski. Może się co prawda tak zdarzyć ale nie powinieneś tego oczekiwać.
  if ( (krancowka1 == HIGH) and (przycisk1 == LOW )) {
    sil == HIGH;
    if (krancowka1 == LOW) {
      sil == LOW;
      digitalWrite(led1, HIGH);
    }
  }

Ponieważ w programie brakuje komentarzy to nie wiem czy moje domysły są słuszne.
Proponuję dokładnie rozpisać algorytm działania programu i dopiero wtedy zacząć pisać program.
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ź
#5
(14-10-2017, 07:25)namok napisał(a): Do takich rzeczy najlepszy jest symulator np: https://www.sites.google.com/site/unoardusim/services

Nie podałeś co prawda jaki jest stan krańcówki gdy jest zadziałana ale masz błąd bo zakładam że oczekujesz zmiany stanu krańcówki a Ty sprawdzasz ten sam stan.

  if ( (krancowka1 == HIGH) and (przycisk1 == LOW )) {
    sil == HIGH;
    if (krancowka1 == HIGH) {
      sil == LOW;
      digitalWrite(led1, HIGH);
    }
  }

Dodatkowo taki kod (poprawiony) będzie niepoprawny bo nie możesz oczekiwać że w tym samym cyklu programu stan krańcówki będzie raz wysoki a raz niski. Może się co prawda tak zdarzyć ale nie powinieneś tego oczekiwać.
  if ( (krancowka1 == HIGH) and (przycisk1 == LOW )) {
    sil == HIGH;
    if (krancowka1 == LOW) {
      sil == LOW;
      digitalWrite(led1, HIGH);
    }
  }

Ponieważ w programie brakuje komentarzy to nie wiem czy moje domysły są słuszne.
Proponuję dokładnie rozpisać algorytm działania programu i dopiero wtedy zacząć pisać program.

Dzięki wielkie za odpowiedź niestety nie miałem czasu na dniach wrócić do tematu ale dziś zabieram się dalej.
Twoje sugestie są bardzo pomocne :Smile.
Rozpiszę algorytm i dodam komentarze do kodu wtedy wrzucę ponownie.
 
Odpowiedź
#6
Witam,
Mała sugestia. Nie trzeba stosować 4-ech czujników/krańcówek. Do określenia 4-ech położeń stołu (według rysunku co 90 stopni) wystarczą 3 czujniki. Załóżmy, że użyjesz 3-ech transoptorów szczelinowych, umieszczonych co 90 stopni, a na stole obrotowym umieścisz 2-ie przesłony "oddalone" o 90 stopni. W ten sposób jesteś w stanie uzyskać wystarczającą dla Ciebie ilość stanów.
Pozdrawiam,
Tomek.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości