GabrielM
Vytvořené odpovědi
-
AutorPříspěvky
-
Nasranek
ÚčastníkPokud vládneš jazykem polským 🙂
tak tady máš 3 videjka
včetně dokumentace pod videem
Nasranek
ÚčastníkFaktura ti přijde z PayPal a když to celníci chcou tak jim to pošleš jako pdf
(prostě si to vytiskneš jako pdf a pošleš s přílohou).
Když budeš clít poprvé tak ti přijde dopis , potom už jen mail.Vojtěch Vosáhlo
ÚčastníkJe pravda že je to taková nehezky začarovaná smyčka ale neleze mi do hlavy jak jsem to teda dělal já ? arduino ani jiný programátor jsem rozhodně nepoužil…
Dupla
ÚčastníkKdyž myslíš. No, uvidíme.
V příloze posílám poupravený tvůj diagram.
Na začátku bych spíš definoval ZASUŇ všechny válce, jsou totiž v podstatě kolmo na sebe a mohli by se zkřížit tak, jak se mi to děje u připojení mojí třetí podmínky v mém kódu. Jinak pozor, u válců je obrácená logika: LOW – vysuň, HIGH – zasuň, u snímačů je to normálně.
Ano je to magnetický snímač – svítí/nesvítí.
Stop tlačítko tam není.Attachments:
posjirka
ÚčastníkPřerušení to pravděpodobně neovlivňuje.
Spíš bych to viděl na nevhodně strukturovaný program.
celá tato logika je postavena na principu, že všechno jde přesně po sobě.
To bohužel není pravda a v reálném světě je tu spousta zpoždění, zákmitů a vůlí, které to narušují.
Nakreslil jsem do hrubého diagramu jak chápu tvůj požadavek.
prosím podívej se na to a pokud to souhlasí tak bych zkusil navrhnou jiný program a můžeme to odzkoušet.
Je to jen opis toho co jsi mi poslal, logika programu bude potom jiná.
Určitě budu na začátku definovat výchozí stav (vysuň všechny válce), průběžněš kontrolovat celkový stav zařízení a vyhodnocovat případnou odchylku od požadovaného stavu (porucha).Ještě mě napadá jaké používáš čidla detekce koncových stavů válců? podle popisu mi to připadá jako kontrola svítí/nesvití signálka automatu.
Máš tam i nějáké „STOP“ tlačítko? Pamatuj na bezpečnost ….Attachments:
posjirka
Účastníkje kouzelné jak se kruh uzavřel a na konci jsem se vrátili k updatu firmware přes arduino 🙂
bot
ÚčastníkPodařilo se mi aktualizovat USBasp přes arduino, ani nevím jak. Nic méně, už jsem nahrál bootloader do čipu a i sketch(vše proběhlo v pořádku :D).
Děkuji všem zdejším mudrcům, za jejich nevídanou ochotu a čas strávený nad tím.
Dupla
ÚčastníkVyzkoušel jsem už několik různých variací kódu ať už s přerušením, bez něj, s vnořenými podmínkami, nebo zvlášť. Nic z toho nefungovalo správně.
Jak říkám, první dvě podmínky v kódu, který uvádím výše fungují správně, jakmile připojím tu třetí podmínku, tak se to celé rozhodí. Z důvodu, že v prvních dvou podmínkách používám válce připojené na piny 2 a 3, což jsou piny obsahující přerušení, tak mám podezření, že to bude tím.K tomu, co by měl program dělat.
Každý ze 4 pneumatických válců má 2 koncové snímače polohy. Na začátku kontroluji, jestli je vysunutý válec „dvere“, pokud není, měl by se zasunout, když se zasune, měl by zůstat v té poloze. Na něj by měl navázat válec „davkovani“, vysunout se, počkat ve vysunuté poloze např. ty 4 vtěřiny a pak se zasunout. Po jeho zasunutí by se měl vysunout válec „lisovani“, zase nějakou dobu např. 3 vteřiny setrvat ve vysunuté poloze a poté se zasunout. Následovat by mělo zasunutí prvního válce „dvere“ a poté vysunutí a hned zasunutí válce „vyhazovani“. A tak by to mělo jet pořád dokola.posjirka
Účastníkno možná ještě jeden bod:
5. když to te´d sjíždím ten tvůj kod tak ty se snažíš „krokovat“ na základě nějákých opakujících se podmínek. šlo by napsat popis funkce toho stroje ně jednotlivých kroků?
např. krok č.1 – kontrola že všechny písty jsou vysunuté, pokud ne všechny vsuň.
krok č.2 – dávkování == 1
krok č.3 ….a pak si jen uděláme proměnnou „krok“ a na základně aktuálního stavu budeme postupně celý proces krokovat ….
posjirka
Účastníkzkusím se do toho vložit.
Přerušení je proces, kdy dojde k dočasnému přerušení hlavní smyčky programu, provede se nějáká událost a po její ukončení pokračuje dále.
Přerušení je více typů a je třeba s nim jednat opatrně. Může být nejen od pinů, ale i od přetečení registru, příchodu seriové komunikace na UART nebo I2C sběrnici, …
Arduino má v základu nastavené pro UNO pouze 2 piny na přerušení, ale můžeš si je změnit, nebo detekovat celý 1 port (A, B, C nebo D). Rozhodně to není nic pro začátk.V tomto případě je to funkce řekl bych zbytečná.
Mnohem užitečnější bude nezdržovat smyčku funkci delay a radši pracovat s rychlou smyčkou.Delay je totiž jen symčka plná „NOP“ takže procesor vlastně jen počítá jak dlouho dělá/nedělá nic.
Rádi ti pomůžeme ale pojdmě na vše popořádku:
1, napiš nám prosím co má program přesně dělat (trochu podrobněji)
2, je třeba to zjednodušit a trochu si vypomoct pomocnými proměnými (např. si definuj proměnou „vysun_pist_1“, kde její hodnoty 1 např.znamena vysuń, hodnota 0 nic nedělej, 2 zasuň.) dá se pak mnohem lépe reagovat na podmínky.
3. zbytečně si dubluješ stejné podmínky např. „digitalRead(dvereVysunute) == HIGH “ Vykašli se na to a použij vnořené podmínky:
if (……){
if (….) {
} else {
}
}
prostě se snaž si 1 podmínku vkládat pouze 1x a neopakovat.
4. není špatné si to nakreslit na papír do jednoduchého vývojového diagramu, pak ti spoustu věcí dojde za pochodu.Co ty na to?
Vojtěch Vosáhlo
ÚčastníkNo je pravda že to je asi kravina, to usb je přes firmware… Pak už asi nezbývá nic jiného než druhý programátor, lidi to dělají i arduinem tak to můžete zkusit.
bot
ÚčastníkPropojil jsem piny, ale když připojím programátor do usb s propojenými piny (nesvítí led a OS nerozezná zařízení) v avrdudess při detectu vyskočí toto:
„Unable to detect MCUavrdude.exe: error: could not find USB device with vid=0x16c0 pid=0x5dc vendor=’www.fischl.de‘ product=’USBasp‘
avrdude.exe done. Thank you.“
Když piny propojím, až po připojení do USB. Tak výsledek detectu je:
„Unable to detect MCUavrdude.exe: set SCK frequency to 1500000 Hz
avrdude.exe: warning: cannot set sck period. please check for usbasp firmware update.
avrdude.exe: error: programm enable: target doesn’t answer. 1
avrdude.exe: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.avrdude.exe done. Thank you.“
Vojtěch Vosáhlo
ÚčastníkOk, pokud tyhle dva piny propojíte. Dejte tam něco co se pak dá jednoduše odstranit. S propojenými piny to zkuste připojit do pc, zapnout avrdudess, dát programmer jako usbasp a u chipu detect. I když to v žádném návodu není popsáno, mělo by to najít tu megu 8. Opět to zkuste a budem pokračovat.
bot
ÚčastníkAno máte pravdu. Je tam atmega8a, takže jeden neosazený pin je reset(PIN29) a druhý PB2(PIN14).
Vojtěch Vosáhlo
ÚčastníkPředpokládal bych že ten náš ztracený jumper jsou ty 2 neosazené piny na spodní straně desky. Zkuste za pomoci pinoutu toho procesoru co je osazený přeměřit ty dva piny. Jeden by měl jít na reset procesoru a druhý na PB2. Můžete napsat progress 😉
bot
ÚčastníkFotky jsou zde: https://postimg.org/image/bq7cnr073/ , https://postimg.org/image/9mwxg30e7/
Kupoval jsem ho z ebay: http://www.ebay.com/itm/130682846209?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT
Mohl by jste mi prosím poradit ohledně updateu?
Návody, které jsem našel vyžadovali druhý programátor a bojím se, abych si ten oc mám nějak nezničil.
Děkuji.
Vojtěch Vosáhlo
ÚčastníkNějaký odkaz na to co jste koupil, nebo obrázek? Já neznám žádné nové USBasp a vždy jsem firmware musel updatovat. Ale jde aktualizovat přes usb, není potřeba žádný programátor.
bot
ÚčastníkTak už mi přišel programátor USBasp.
Když jsem zkoušel vypálit bootloader, hlásí to chybu: „avrdude: warning: cannot set sck period. please check for usbasp firmware update.“
Co jsem tak četl měl by to být problém u starších USBasp programátoru, kterými nešli programovat čipy, běžící o více než 1/2 clock samotného USBasp. Řešením bylo aktualizovat firmware za pomocí jiného programátoru a přepnutím jumperu. Dále jsem se dočetl, že nové USBasp si detekují clock sami a už není nutný update. Což by vysvětlovalo proč na USBasp žádný jumpery nemám.
Nevíte kde může být problém?
Děkuji
5.9.2016 v 16:07 odpověď na: Dvě časově ovládaná relé ovládaná dvěma vzájemně se vybavujícími tlačítky #8266BlindP
ÚčastníkTaky přihodím 🙂
# define RELE1_PIN 5 # define RELE2_PIN 6 # define TLAC1_PIN 2 # define TLAC2_PIN 3 unsigned long pre_mill = 0; const long interval = 30000; void setup() { Serial.begin(9600); pinMode(TLAC1_PIN, INPUT_PULLUP); pinMode(TLAC2_PIN, INPUT_PULLUP); pinMode(RELE1_PIN, OUTPUT); pinMode(RELE2_PIN, OUTPUT); digitalWrite(RELE1_PIN, HIGH); digitalWrite(RELE2_PIN, HIGH); } void loop() { if(digitalRead(TLAC1_PIN) == LOW) { pre_mill = millis(); digitalWrite(RELE2_PIN, HIGH); digitalWrite(RELE1_PIN, LOW); //Serial.println("Vypinam rele c.2, zapinam rele c. 1"); } if(digitalRead(TLAC2_PIN) == LOW) { pre_mill = millis(); digitalWrite(RELE1_PIN, HIGH); digitalWrite(RELE2_PIN, LOW); //Serial.println("Vypinam rele c.1, zapinam rele c. 2"); } if(millis() - pre_mill >= interval) { digitalWrite(RELE1_PIN, HIGH); digitalWrite(RELE2_PIN, HIGH); //Serial.println("Cas vyprsel vypinam obe dve rele!!!"); } }
5.9.2016 v 15:24 odpověď na: Dvě časově ovládaná relé ovládaná dvěma vzájemně se vybavujícími tlačítky #8265posjirka
Účastníknení zač ….
5.9.2016 v 12:12 odpověď na: Dvě časově ovládaná relé ovládaná dvěma vzájemně se vybavujícími tlačítky #8264milano
ÚčastníkDěkuji moc. Když na to takhle koukám, tak mi to je jasné, ale sám bych to asi zatím nenapsal. Jenom musím přehodit obráceně spínání relé. Mám tam ty čínský dvojrelé a ty jsou ovládané obráceně. To už je ale prkotina. Ještě jenou moc děkuji 🙂
5.9.2016 v 10:48 odpověď na: Dvě časově ovládaná relé ovládaná dvěma vzájemně se vybavujícími tlačítky #8263posjirka
Účastníkzkus jako zaklad toto:
// program pro ovladani 2 rele pomoci 2 tlacitek // v01 by JP 9/2016 // program ovlada 2 rele s tím, ze: // - stiskem tlacitka 1 se na nastavenou dobu sepne rele 1 // - stiskem tlacitka 2 se na nastavenou dobu sepne rele 2 // - kdyz behem sepnuti rele 1 stisknu tlacitko 2 tak se rele 1 vypne a sepne se rele 2 // - kdyz behem sepnuti rele 2 stisknu tlacitko 1 tak se rele 2 vypne a sepne se rele 1 int RELE_1 = 10; // pin pro rele 1 int RELE_2 = 11; // pin pro rele 2 int TLACITKO_1 = 4; // pin pro tlacitko 1 int TLACITKO_2 = 3; // pin pro tlacitko 2 int ZAPNI_RELE_1 = 0; // 0 - vypnuto int ZAPNI_RELE_2 = 0; // 0 - vypnuto unsigned long CAS_VYPNUTI_RELE_1 = 0; // kdy ma rele 1 vypnout (nastavuje se v době sepnuti tlacitka) unsigned long CAS_VYPNUTI_RELE_2 = 0; // kdy ma rele 2 vypnout (nastavuje se v době sepnuti tlacitka) unsigned long DELKA_SEPNUTI_RELE = 3000; // jak dlouho maji byt rele sepnute (v milisekundach ) void setup() { pinMode(RELE_1, OUTPUT); // nastaveni pinu jako vystup pinMode(RELE_2, OUTPUT); // nastaveni pinu jako vystup pinMode(TLACITKO_1, INPUT_PULLUP); // nastaveni pinu jako vstup s interním pullup odporem pinMode(TLACITKO_2, INPUT_PULLUP); // nastaveni pinu jako vstup s interním pullup odporem } void loop() { // ovladani tlacitka 1 if (digitalRead(TLACITKO_1) == 0 ){ // když je stisknuto tlačtíko 1 CAS_VYPNUTI_RELE_1 = millis() + DELKA_SEPNUTI_RELE; ZAPNI_RELE_1 = 1; // povoleni k sepnuti rele 1 ZAPNI_RELE_2 = 0; // preventivne zakaz zapnuti rele 2 } if (ZAPNI_RELE_1 == 1) { // rele 1 ma byt sepnute if (millis() > CAS_VYPNUTI_RELE_1) { // uz pretekl cas zapnuti rele 1 ZAPNI_RELE_1 = 0; // zrus pozadavek na zapnuti rele 1 digitalWrite(RELE_1, LOW); // vypni rele 1 } else { digitalWrite(RELE_1, HIGH); // zapni rele 1 } } else { digitalWrite(RELE_1, LOW); // vypni rele 1 } // ovladani tlacitka 2 if (digitalRead(TLACITKO_2) == 0 ){ // když je stisknuto tlačtíko 2 CAS_VYPNUTI_RELE_2 = millis() + DELKA_SEPNUTI_RELE; ZAPNI_RELE_2 = 1; // povoleni k sepnuti rele 2 ZAPNI_RELE_1 = 0; // preventivne zakaz zapnuti rele 1 } if (ZAPNI_RELE_2 == 1) { // rele 2 ma byt sepnute if (millis() > CAS_VYPNUTI_RELE_2) { // uz pretekl cas zapnuti rele 2 ZAPNI_RELE_2 = 0; // zrus pozadavek na zapnuti rele 2 digitalWrite(RELE_2, LOW); // vypni rele 2 } else { digitalWrite(RELE_2, HIGH); // zapni rele 2 } } else { digitalWrite(RELE_2, LOW); // vypni rele 1 } }
4.9.2016 v 23:24 odpověď na: Dvě časově ovládaná relé ovládaná dvěma vzájemně se vybavujícími tlačítky #8261milano
ÚčastníkDěkuji moc. Myslím, že to dám dohromady.Postupně si tím musím projít. Programoval jsem kdysi ještě ve strojáku a pak 25 let nic, protože jsem po škole začal dělat autoelektriku a elektroniku a programovat jsem nepotřeboval. K Arduinu jsem se dostal díky dceři, která s ním pracuje ve škole a docela mě to chytlo 🙂
4.9.2016 v 23:06 odpověď na: Dvě časově ovládaná relé ovládaná dvěma vzájemně se vybavujícími tlačítky #8260posjirka
Účastníkněco podobného jsme už řešili na jiném foru …
http://duinozone.cz/index.php/topic,177.0.html4.9.2016 v 20:45 odpověď na: Dvě časově ovládaná relé ovládaná dvěma vzájemně se vybavujícími tlačítky #8259lubosm
ÚčastníkJe možné použiť milis. iba si treba odložiť čas zapnutia a rozdielom aktuálneho času a času zapnutia porovnávať, či ubehol portebný čas. Ako premennú pre odloženie času je vhodné použiť unsigned long a ošetriť ak milis pretečie a začne počítať od 0, napr. vynulovať aj toto.
4.9.2016 v 17:43 odpověď na: Dvě časově ovládaná relé ovládaná dvěma vzájemně se vybavujícími tlačítky #8258milano
ÚčastníkDíky, na to už jsem koukal, ale budu se tím muset asi prokousat.
4.9.2016 v 16:02 odpověď na: Dvě časově ovládaná relé ovládaná dvěma vzájemně se vybavujícími tlačítky #82564.9.2016 v 14:01 odpověď na: Dvě časově ovládaná relé ovládaná dvěma vzájemně se vybavujícími tlačítky #8254milano
ÚčastníkTak jsem to zatím provizorně vyřešil bez možnosti zastavení a jdu studovat jak to udělat bez DELAY, aby to testovalo tlačítka a v budoucnu hlídalo další dvě koncová čidla, která mám zatím v silové části .
//ovladani brany casovym spinanim bez moznosti vypnuti behem cyklu
//koncove polohy jsou resene v silove casti
//cislo tlacitka pro otevreni
int tlacitko1 = 13;
//cislo tlacitka pro zavreni
int tlacitko2 = 12;
//cislo pinu rele otevreni
int rele1 = 11;
//cislo pinu rele zavreni
int rele2 = 10;
//promenne uchovavjici stav tlacitek
int tlacitko1Stav = 0;
int tlacitko2Stav = 0;void setup() {
pinMode(tlacitko1, INPUT);
pinMode(tlacitko2, INPUT);
pinMode(rele1, OUTPUT);
pinMode(rele2, OUTPUT);
//vypnuti obou rele
digitalWrite(rele1, HIGH);
digitalWrite(rele2, HIGH);}
void loop() {
//nacteni stavu tlacitek
tlacitko1Stav = digitalRead(tlacitko1);
tlacitko2Stav = digitalRead(tlacitko2);
//kontrola tlacitek
if (tlacitko1Stav == HIGH){
digitalWrite(rele1, LOW);//zapne rele1
delay(30000);
}//kdyz neni tlacitko sepnute rele je vypnute
digitalWrite(rele1, HIGH);
if (tlacitko2Stav == HIGH){
digitalWrite(rele2, LOW);//zapne rele1
delay(30000);
}
//kdyz neni tlacitko sepnute rele je vypnute
digitalWrite(rele2, HIGH);
}Dupla
ÚčastníkJak jsem již psal výše, první dvě podmínky fungují (tzn. ovládání pneumatických válců, které jsou připojeny přes cívky na piny 2 a 3). Reagují na koncové spínače a i funkce delay(); funguje správně.
To samé bych potřeboval realizovat i s piny 4 a 5 (tzn. reagovat na koncový spínač a při vysunutí válce nějakou chvíli počkat a pak ho zase zasunout).
Ano, vím co přerušení znamená. Mám ale podezření, že je potřeba ho realizovat i na pinech 4 a 5, aby byla funkce programu správná, protože v tomto případě, tak jak jsem Vám kód poslal si program dělá co chce. Vysunout se všechny čtyři pneumatické válce naráz. Pokud nechám jen první dvě podmínky, které ovládají válce na pinech 2 a 3 a zbytek programu zakomentuji, program funguje správně, ale jen se dvěmi válci.
Možná přerušení nechci, ale chtěl bych tam, aby válec po vyjetí nějakou dobu počkal a to se mi nedaří realizovat. Jak to tedy udělat?Zbyšek Voda
ÚčastníkTo, že pin „obsahuje“ přerušení znamená, že umí přerušení vyvolat – že řekne programu „teď se zastav a dělej něco úplně jiného“.
Piny 2 a 3 jsou tedy piny, které mohou způsobit vyvolání hardwarového přerušení. Obslužná funkce tohoto přerušení se na ně připojuje pomocí funkce attachInterrupt().Na pinech 4 a 5 přerušení nevyvoláte (ve smyslu toho hardwarového přerušení).
Ve vašem programu ale pravděpodobně hardwarové přerušení vůbec nechcete. Vy jenom chcete například reagovat na koncový spínač apod. Tomu sice asi říkáte „přerušení“, ale s přerušením ve smyslu interrupt toto vůbec nesouvisí.
-
AutorPříspěvky