|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
tacer12 Član
Pridružen-a: Ned 01 Feb 2009 16:45 Prispevkov: 236 Aktiv.: 1.27 Kraj: Dramlje
|
Objavljeno: Čet Okt 12, 2023 9:33 pm Naslov sporočila: Program Arduino za senzor |
|
|
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.
Opis: |
|
Velikost datoteke: |
3.29 MB |
Pogledana: |
57 krat |
|
|
|
Nazaj na vrh |
|
|
mosqito Član
Pridružen-a: Čet 07 Apr 2016 23:22 Prispevkov: 3243 Aktiv.: 33.07
|
Objavljeno: Pet Okt 13, 2023 12:58 pm Naslov sporočila: |
|
|
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 |
|
|
SimonS Član
Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4592 Aktiv.: 20.59 Kraj: Kobarid
|
Objavljeno: Pet Okt 13, 2023 4:21 pm Naslov sporočila: |
|
|
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 |
|
|
tacer12 Član
Pridružen-a: Ned 01 Feb 2009 16:45 Prispevkov: 236 Aktiv.: 1.27 Kraj: Dramlje
|
Objavljeno: Pet Okt 13, 2023 8:24 pm Naslov sporočila: |
|
|
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 |
|
|
Proteus Član
Pridružen-a: Sre 15 Jun 2005 10:03 Prispevkov: 1788 Aktiv.: 8.02
|
Objavljeno: Pet Okt 13, 2023 10:23 pm Naslov sporočila: |
|
|
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 |
|
|
tilz0R Član
Pridružen-a: Čet 31 Maj 2012 15:39 Prispevkov: 898 Aktiv.: 6.19 Kraj: Črnomelj
|
Objavljeno: Sob Okt 14, 2023 4:04 pm Naslov sporočila: |
|
|
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 |
|
|
tacer12 Član
Pridružen-a: Ned 01 Feb 2009 16:45 Prispevkov: 236 Aktiv.: 1.27 Kraj: Dramlje
|
Objavljeno: Sre Okt 18, 2023 8:33 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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
|