Skocz do zawartości

Czas Arduino start silnika


betepok

Pomocna odpowiedź

...

a)Czujnik aktywny idź do pkt. 3

...

3)Odmierzanie czasu 2 sekundy

4)Silnik START

...

Na pewno tak ma być? Po uaktywnieniu czujnika opóźnienie dwie sekundy przed uruchomieniem silnika? Co to daje?

Tak ponieważ jeśli czujnik na chwilę zmieni stan leci z programem i dorzuca kulki. Dlatego pomyślałem o opóźnieniu 2 sekundy.

[ Dodano: 13-07-2018, 17:02 ]

Nie wiem jak się czujesz mając na karku już dwóch krytyków...

JEŻELI krytyka jest konstruktywna czuje się w porządku 🙂

Spróbuj to jeszcze raz przepisać, jest naprawdę nieźle, widać postęp. Już trochę się bałem, że odpuściłeś.

Z drugiej strony widzę chęć pomocy, szkoda odpuścić.

1)Start programu

2)Odczytanie stanu czujnika aktywny (1)/nieaktywny (0)

a)Jeżeli czujnik aktywny (1) idź do pkt. 3

b)Jeżeli czujnik nieaktywny (0) idź do pkt. 1

3)Odmierzanie czasu 2 sekundy

4)Silnik START

5)Jeżeli czujnik nieaktywny (0)

6)Odmierzanie czasu 5 sekundy

7)Silnik STOP Idź do pkt.1

Link do komentarza
Share on other sites

Gość es2

Tak ponieważ jeśli czujnik na chwilę zmieni stan leci z programem i dorzuca kulki. Dlatego pomyślałem o opóźnieniu 2 sekundy.

Ale to przeczy wcześniejszej wypowiedzi:

Program ma wykryć stan LOW i dopiero jeśli stan LOW utrzyma się np dwie sekundy wykonuje kod "START silnika"

5)Jeżeli czujnik nieaktywny (0)

6)Odmierzanie czasu 5 sekundy

7)Silnik STOP Idź do pkt.1

A jeśli w pkt 5 czujnik aktywny to co? uC ma zgadywać co zrobić?

Jeśli podczas odmierzania 5 sekund czujnik zmieni stan na aktywny, to silnik i tak ma się zatrzymać, następnie skoczyć do pkt1, tam odczekać 2 sekundy i ponownie włączyć silnik na 5 sekund?

Tak zadziała algorytm który napisałeś a według opisu jaki dałeś nie o to chodzi. Ma byc tak:

- jeśli stan aktywny ponad 2 sekundy włącz silnik na 5 sekund

- silnik ma pracować 5 sekund od dezaktywacji czujnika

Dlaczego piszesz tak dziwnie:

2)Odczytanie stanu czujnika aktywny (1)/nieaktywny (0)

a)Jeżeli czujnik aktywny (1) idź do pkt. 3

b)Jeżeli czujnik nieaktywny (0) idź do pkt. 1

Już miałeś kilka przykładów jak to napisać ale jakiś upierasz się przy swoich dziwnych, rozwiązaniach. Musisz mieć świadomość, ze to nie cały Świat się przystosuje do Ciebie, tylko Ty musisz się dostosować do innych.

Link do komentarza
Share on other sites

Oj ciężko idzie. Nie masz wprawy, więc nasze uwagi słabo do Ciebie trafiają i to co wydaje się proste, sprawia Ci spory kłopot. To może zróbmy odwrotnie? Zrób schematyczny rysunek tego urządzenia. Jak rozumiem jest tam jakiś napęd który dostarcza kulki do długiej rurki w której masz czujnik. Opisz wszystko dokładnie: gdzie co jest, skąd dokąd te kulki się przesuwają, gdzie jest czujnik i jaki jest z nim problem. Tym razem może ktoś z nas spróbuje opisać to algorytmem a Ty zastanowisz się czy pokazany przepis ma sens. Czasem jeszcze jest tak, że mała zmiana w założeniach bardzo upraszcza algorytm. Przykładowo: ew. wprowadzenie drugiego czujnika (jeden na minimum poziomu kulek w rurce, drugi na maximum) uniezależniłoby układ od pomiaru czasu i od zmian prędkości silnika. No, to tylko taki luźny pomysł. Może też zachodzić przypadek w którym jakieś wstępne i bardzo proste przetwarzanie/filtrowanie/odkłócanie sygnału z czujnika diametralnie zmniejsza komplikację algorytmu. Zobaczymy.

Czyli: rysujesz, opisujesz rysunek i kilka zdań o tym jaki jest cel tj. jak jest nadrzędna idea działania bez zbędnych szczegółów, np: "sterownik ma dbać o to, by poziom kulek nigdy nie spadł poniżej minimum, ale też żeby nie wysypały się z prowadnicy" - czy jakoś tak. Podaj też parę szczegółów technicznych: jak szybko silnik dostarcza kulki, jak szybko są odbierane, jak duży (na ile sekund) starcza zapasu poniżej czujnika bez dostarczania nowych, jak szybko jesteśmy w stanie zasypać braki powyżej czujnika do przepełnienia itp. To da nam pogląd na temat koniecznych czasów reakcji i ew. wyboru algorytmu.

  • Lubię! 1
Link do komentarza
Share on other sites

Próbujmy jeszcze raz.

https://photos.app.goo.gl/D6AvMrhXorYu1ZrM6

https://photos.app.goo.gl/HRiERGmvHiqbSac26

 int detect = digitalRead(12);  // wykrywa stan HIGH/LOW

 if(detect == LOW && czasON - czasLOW >= 2000UL){

 CzasStartuSilnika_A = aktualnyCzas;
TurnOnMotorA(); 
 }

if (detect == HIGH && aktualnyCzas - CzasStartuSilnika_A >= 5000UL){ 

czasLOW = czasON;
TurnOffMotorA();
}

W czasie pracy podajnik zaczyna podawać kulki. Kiedy zatrzymam produkcję na 5 sekund podajnik kulek zatrzyma się. Jeśli produkcja trwa kulki są podawane cały czas. Myślę, że czujnik na chwilę przechodzi w stan ON następnie OFF i dolicza 5 sekund do zatrzymania.

Moim celem jest wyeliminowanie chwilowego stanu ON/OFF kiedy kulki przesuwają się w rurce.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Gość es2

W czasie pracy podajnik zaczyna podawać kulki. Kiedy zatrzymam produkcję na 5 sekund podajnik kulek zatrzyma się. Jeśli produkcja trwa kulki są podawane cały czas. Myślę, że czujnik na chwilę przechodzi w stan ON następnie OFF i dolicza 5 sekund do zatrzymania.

Moim celem jest wyeliminowanie chwilowego stanu ON/OFF kiedy kulki przesuwają się w rurce.

Popatrz na swój "algorytm" i zauważ, że nie działa zgodnie z opisem.

Napisałem "algorytm" bo znów jakieś swoje herezje rysujesz a dałem przykład algorytmu i link do strony z informacjami. Oglądałeś ta stronę z linku? Pewnie nie. Nie myśl, już to pisałem, że cały Świat przestawi się na Twój tok myślenia, Twoje fanaberie i Twoje standardy. Tak się nie stanie, chyba, że masz dużo kasy.

Wracając do Twoich "wypocin". Czy przeanalizowałeś krok po kroku jak to działa? Nie. Bo działa tak:

- Jeśli czujnik OFF, czekaj 5 sekund, wyłącz silnik.

- Jeśli czujnik ON, czekaj 2 sekundy włącz silnik.

Moim celem jest wyeliminowanie chwilowego stanu ON/OFF kiedy kulki przesuwają się w rurce

I Twój algorytm, jak widać na obrazku:

nie realizuje tej funkcji.

Jak to się ma do tego co chcesz zrealizować? Nijak!. Jedynie czasy 2 i 5 sekund są zachowane, reszta kompletnie z "kosmosu".

Co ciekawe, byłeś bardzo blisko rozwiązania problemu, ale się zapętliłeś (jak Windows) i zacząłeś wypisywać (rysować) głupoty.

Pasujesz mi na prezesa dużej firmy, z nominacji. Kompletnie nie wie czego chce, nie wie jak powiedzieć co chce. Problem nie jest związany z programowaniem, elektronika, medycyna. Problem jest w tym, że nie potrafisz jasno napisać jak ma coś(ktoś) wykonać pracę. Coś w rodzaju "rób tak aby było dobrze" w domyśle "umywam ręce od tego". Teraz wiem, dlaczego sukces ma wielu ojców (prezesów) a porażka jedną matkę (pracownika).

Link do komentarza
Share on other sites

Zadanie wykonane poniżej kod może się komuś przyda.

Wystarczyło zmniejszyć czułość diody IR. Przy przesuwaniu kulek nie wyłapuje wiązki.

Generalnie działa. W przyszłości dodam drugi silnik, zasobnik, czujnik na łuski. Może zaprojektuje jakąś prostą płytkę dla uporządkowania elementów w sterowniku.

marek1707 dzięki za dobre słowo i wsparcie.

Zasobnik do wydruku 3D

Sam sterownik

/*
* - uruchaminie silnikow DC przy urzyciu 1xL298 dwukanalowy sterownik silnikow
* - sterowanie predkosci silnikow 2x10kΩ  
* - czujnik podczerwieni IR
* - przelacznik mikrostyk
*/
unsigned long aktualnyCzas = 0;
unsigned long CzasStartuSilnika_A = 0;
unsigned long CzasStartuSilnika_B = 0;

int buttonPin2 = 3; //Wlacznik silnika B

//Silnik A - podlaczenie do L298
int in1 = 4; 
int in2 = 5;
int ConA = 6;
int speed1; // czytaj z (A0)

//Silnik B - podlaczenie do L298
int in3 = 7; 
int in4 = 8;
int ConB = 9;
int speed2; // czytaj z (A1)

void setup() {


//Wlacznik silnika A
Serial.begin(9600);
 pinMode(12, INPUT);// Czujnik IR
   digitalWrite(12, HIGH); //spoczynkowy stan wysoki (rezystory podciagajace wlaczone)

 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);  
 pinMode(6, OUTPUT);


//Wlacznik silnika B
pinMode(buttonPin2, INPUT); //pracuje jako wejscie mikrostyk
  digitalWrite(buttonPin2, HIGH); //spoczynkowy stan wysoki (rezystory podciagajace wlaczone)

 pinMode(7, OUTPUT);
 pinMode(8, OUTPUT);  
 pinMode(9, OUTPUT);


}

//Silnik A - Kontrola obrotów i predkosci
void TurnOnMotorA(){            //Wlaczenie silnika A
 digitalWrite(in1, LOW);       //Zmiana kierunku - wstecz HIGH, LOW
 digitalWrite(in2, HIGH);
 speed1 = analogRead(A0);      //Czytanie wartosci z A0
 speed1 = speed1*0.2492668622; //Kalibracja potencjometru
 analogWrite(ConA,speed1);     //Przeslanie wartosci do silnika
}
void TurnOffMotorA(){           //Wylaczenie silnika A
 digitalWrite(in1, LOW);       //Zmiana kierunku - wstecz HIGH, LOW
 digitalWrite(in2, LOW);
 speed1 = analogRead(A0);
 speed1 = speed1*0.2492668622; 
 analogWrite(ConA,speed1);
}


//Silnik B
void TurnOnMotorB(){            //Wlaczenie silnika B
 digitalWrite(in3, LOW);
 digitalWrite(in4, HIGH);
 speed2 = analogRead(A1);
 speed2 = speed2*0.2492668622; 
 analogWrite(ConB,speed2);
}
void TurnOffMotorB(){           //Wylaczenie silnika B
 digitalWrite(in3, LOW); 
 digitalWrite(in4, LOW);
 speed2 = analogRead(A1);
 speed2 = speed2*0.2492668622;
 analogWrite(ConB,speed2);
}



void loop() {

   //Pobierz liczbe milisekund od startu
 aktualnyCzas = millis();

//Silnik A

 int detectIR = digitalRead(12);         // Czytanie wartosci czujnika IR

 if(detectIR == HIGH && aktualnyCzas - CzasStartuSilnika_A >= 5000UL){
    Serial.println("MOTOR STOP"); 
       CzasStartuSilnika_A = aktualnyCzas;
         TurnOffMotorA();
 }

delay(100);

if (detectIR == LOW && aktualnyCzas - CzasStartuSilnika_A >= 2000UL){ 
 Serial.println("Motor START");
       CzasStartuSilnika_A = aktualnyCzas;
         TurnOnMotorA(); 

}



//Silnik B
 if(digitalRead(buttonPin2) == HIGH) { //Jezeli przycisk nie jest wcisniety
TurnOnMotorB(); //Wlacz Motor B
 }
else
{
TurnOffMotorB(); //Wylacz Motor B
}
}
Link do komentarza
Share on other sites

Gość es2

Możesz wyjaśnić jaka role spełnia:

delay(100);

?

Czy to tak, bo każdy Arduinowiec musi cały kod spie.... dając delay?

Gdyby było tam usypianie uC to bym rozumiał ale delay? Co on polepsza?

Link do komentarza
Share on other sites

Możesz wyjaśnić jaka role spełnia:
delay(100);

?

Czy to tak, bo każdy Arduinowiec musi cały kod spie.... dając delay?

Gdyby było tam usypianie uC to bym rozumiał ale delay? Co on polepsza?

Nic nie polepsza jest zbędny.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.