www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Program Arduino za senzor

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
tacer12
Član
Član



Pridružen-a: Ned 01 Feb 2009 16:45
Prispevkov: 236
Aktiv.: 1.27
Kraj: Dramlje

PrispevekObjavljeno: Čet Okt 12, 2023 9:33 pm    Naslov sporočila:  Program Arduino za senzor Odgovori s citatom

Pozdravljeni.

Po dolgem času spet rabim eno pomoč. Tokrat pri programu arduino.
V službi so nabavili nov cnc za les katerega so dodelili v mojo uporabo.
Stroj kot sam je dober, le odsesovanje je pa res porazno narejeno. zato meče žagovino po celem stroju. Problem je na mizi na katerega položim obdelovanec, ki ga potem stroj odpelje v obdelavo. Pri obdelavi pa nameče žagovino na to mizo, ki jo je potrebno spihati za vsak nov kos posebej. Zato sem se odločil narediti avtomatsko izpihovanje mize. Za krmilje sem uporabil arduino uno, za senzor pa kar arduino senzor ovire. Zadeva sicer deluje, vendar ne čisto tako, kot sem si zamislil program.
Delovalo naj bi nekako tako: ko se pripelje nosilec vakumskih prijemal do senzorja, ta vklopi izpihovanje za dve sekundi, nakar naj bi se izklopil za minuto in pol, kljub temu da senzor še vedno zaznava nosilec. Vendar moj program deluje tako, da izpihuje dokler senzor zaznava nosilec. Ko se nosilec umakne, izpihuje dve sekundi in nato izklopi.
Moj program izgleda takole:

Koda:
void loop() {
            // Izpihovanje mize - senzor 1, šoba 1:
   if(digitalRead(IrPin2) == 0){
      digitalWrite(LedPin50, HIGH);
      delay(2000);
      digitalWrite(LedPin50, LOW);
      delay(90000);
      }
   else{
      digitalWrite(LedPin50, LOW);
      }

 
}


Ker sem začetnik pri arduinu, ne vem kaj točno tudi iskati na netu. Zato se obračam vam na pomoč, kaj še manjka programu.
Prilagam pa tudi sliko, kako to izgleda.



Elektro omarica.jpg
 Opis:
 Velikost datoteke:  3.29 MB
 Pogledana:  57 krat

Elektro omarica.jpg


Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mosqito
Član
Član



Pridružen-a: Čet 07 Apr 2016 23:22
Prispevkov: 3243
Aktiv.: 33.07

PrispevekObjavljeno: Pet Okt 13, 2023 12:58 pm    Naslov sporočila:   Odgovori s citatom

Tako na brzino... po delay(90000) dodaj:

Koda:
while(digitalRead(IrPin2) == 0) delay(1);


Da čaka tam, dokler je obdelovanec prisoten.


Sicer bi za to priporočal preprot "state machine". Najprej določi stanja:

- čakam_obdelovanec
- izpihovanje
- cakam_izmet
...

potem pa pogoj:
- obdelovanec_prisoten
...

in case (vrednost v milisekundah, millis() ):
- zaznan_obdelovanec
- zacetek_izpihovanja
...

potem si narediš trabelo prehodov med stanji glede na pogoje in vrednosti.

Definiraj spremenljivko za trenutno stanje, vse skupaj daj v zanko in naredi en case stavek, kjer vse zapakiraš.

Sliši se komplicirano, ampak na koncu je/bo enostavno.

Lahko ti pomagam do končne implementacije.

_________________
Always going the extra mile.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
SimonS
Član
Član



Pridružen-a: Čet 01 Jul 2004 11:18
Prispevkov: 4592
Aktiv.: 20.59
Kraj: Kobarid

PrispevekObjavljeno: Pet Okt 13, 2023 4:21 pm    Naslov sporočila:   Odgovori s citatom

Točno kot ti je Mare napisal. State machine programiranje.
Vse se vrti v zanki "state, case" na netu boš našel ogromno primerov

Koda:
void loop (void)
{
    switch (state) {
    case ST_OFF:
        if (getButton ())  {
            digitalWrite (PinLeds [0], On);
            state = ST_1;
        }
        break;

    case ST_1:
        if (getButton ())  {
            digitalWrite (PinLeds [0], Off);
            digitalWrite (PinLeds [1], On);
            state = ST_2;
        }
        break;

    case ST_2:
        if (getButton ())  {
            digitalWrite (PinLeds [1], Off);
            digitalWrite (PinLeds [2], On);
            state = ST_3;
        }
        break;
}

_________________
Lep dan
Simon
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tacer12
Član
Član



Pridružen-a: Ned 01 Feb 2009 16:45
Prispevkov: 236
Aktiv.: 1.27
Kraj: Dramlje

PrispevekObjavljeno: Pet Okt 13, 2023 8:24 pm    Naslov sporočila:   Odgovori s citatom

Hvala za pomoč obema. Če sem iskren mi ni veliko jasno s temi ukazi. Je pa izhodišče, da se učim naprej. Vsekakor bom poskusil sestavit - popravit program, če pa ne bo šlo, bi pa prosil za pomoč.
Hvala
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Proteus
Član
Član



Pridružen-a: Sre 15 Jun 2005 10:03
Prispevkov: 1788
Aktiv.: 8.02

PrispevekObjavljeno: Pet Okt 13, 2023 10:23 pm    Naslov sporočila:   Odgovori s citatom

Najprej program kot tak je nepopoln, ker manjka deklaracijski del, recimo, da tega nisi pripel.

Če povzamem, tvoj program spremlja stanje senzorja na pinu IrPin2. Če senzor nekaj zazna, vklopi LedPin50 za 2 sekundi, nato ga izklopi in počaka 90 sekund, preden ponovno preveri stanje senzorja. Če senzor ne zazna ničesar, enostavno ves čas izklaplja LedPin50. Načeloma bi to moralo delovati ampak ko pogledam izvedbo tvoje avtomatike, pa je bog se usmili.

Polna delavnica žagovine, ti pa imaš leseno ohišje brez tesnila, neustrezne kable, ki jih uvodnice sploh ne tesnijo, lestenčne sponke, nikjer ne vidim optičnih ločilnikov, PCB-ji pritrjeni na les brez distančnikov, itd...

Skratka tale tvoja izvedba dobesedno izgleda kot ena velika antena za sprejemanje motenj. Vprašanje ali sploh je napaka v SW, ker mi tale tvoj HW izgleda zelo sumljivo.

Mimogrede, programiranje v FSA pomeni tudi da preideš iz sinhronega v asinhroni način programiranja, kar ti lahko povzroči samo še več problemov, če nisi vešč programiranja. Poleg tega, to kar sta ti napisala mosqito in SimonS še zdaleč ni dovolj, za obdelavo časovnih zakasnitev potrebuješ števece, ki se povečujejo v interruptih, watchdog timer, itd..
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
tilz0R
Član
Član



Pridružen-a: Čet 31 Maj 2012 15:39
Prispevkov: 898
Aktiv.: 6.19
Kraj: Črnomelj

PrispevekObjavljeno: Sob Okt 14, 2023 4:04 pm    Naslov sporočila:   Odgovori s citatom

Proteus je napisal/a:
Mimogrede, programiranje v FSA pomeni tudi da preideš iz sinhronega v asinhroni način programiranja, kar ti lahko povzroči samo še več problemov, če nisi vešč programiranja. Poleg tega, to kar sta ti napisala mosqito in SimonS še zdaleč ni dovolj, za obdelavo časovnih zakasnitev potrebuješ števece, ki se povečujejo v interruptih, watchdog timer, itd..


Ta aplikacija je šolski primer, zakaj potrebuje asinhron način.
Millis se sicer povečuje v interruptih. Poleg tega, kar je SimonS napisal, mu manjka še čas, da ve, kdaj je nek timeout (predolgo v nekem stanju?). WDG je pa dodatna zadeva, ki jo mora implementirati.

Poleg tega ne škodi en PCB kot Arduino extension, da se te grdi kabli zapičeni v Arduino naredijo boljše s pravimi konektorji. Ne bo škodlo, vseeno je to neka profi mašina.

Koda:
#define GO_TO_STATE(s)                                                                                                 \
    do {                                                                                                               \
        state = (s);                                                                                                   \
        tick_last = (tick);                                                                                            \
    } while (0)

typedef enum {
    STATE_WAIT_OBDELOVANEC,
    STATE_IZPIHOVANJE_1,
    STATE_OFF,
} state_t;

state_t state = STATE_WAIT_OBDELOVANEC;

void
loop(void) {
    static uint32_t tick_last;
    uint32_t tick = millis();

    switch (state) {
        case STATE_WAIT_OBDELOVANEC: {
            if (digitalRead(IrPin)) {
                digitalWrite(OutPin, HIGH); /* Cklopi sesalnik */
                GO_TO_STATE(STATE_IZPIHOVANJE);
            }
            break;
        }
        case STATE_IZPIHOVANJE: {
            if ((tick - tick_last) >= 2000) {
                digitalWrite(outPin, LOW);  /* Izklopi sesalnik */
                GO_TO_STATE(STATE_OFF);
            }
            break;
        }.
        case STATE_OFF: {
            /* Cakaj 90sekund */
            if ((tick - tick_last) >= 90000) {
                GO_TO_STATE(STATE_WAIT_OBDELOVANEC);
            }
        }
        default: {
            GO_TO_STATE(STATE_WAIT_OBDELOVANEC);
        }
    }

    /* Delas karkoli drugega, zgornja koda ne bo blokirala izvajanje tega programa */
}

_________________
Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
tacer12
Član
Član



Pridružen-a: Ned 01 Feb 2009 16:45
Prispevkov: 236
Aktiv.: 1.27
Kraj: Dramlje

PrispevekObjavljeno: Sre Okt 18, 2023 8:33 pm    Naslov sporočila:   Odgovori s citatom

Hvala vsem za pomoč. Vendar sem vse skupaj podrl in pospravil, ker sem upošteval mnenje Proteus-a, da je vse skupaj slabo narejeno.
Hvala še enkrat.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 77 dni


Powered by phpBB © 2001, 2005 phpBB Group