mihaicozac Postat Mai 7, 2018 Partajează Postat Mai 7, 2018 Funcţia loop se execută încontinuu, însă în funcţie de ramificaţia programului poţi avea executări parţiale.. Altă funcţie loop nu există la Arduino, doar void fără returni sau int cu return. saO funcţie while determină execuţia numai a codului din interior, cât timp este îndeplinită condiţia, restul codului este neglijat. Variabila enum cred că este inutilă, cerinţă de mişcare ai dacă ambii senzori de capete sunt liberi, iar în acel moment direcţia de deplasare o va da absenţa sau lipsa tensiunii de la TV. Link spre comentariu
mely17 Postat Mai 7, 2018 Autor Partajează Postat Mai 7, 2018 M-am gandit sa fac in felul urmator: diferenta dintre stop si standby este doar iesirea enable_ps ca urmare programul poate sa stea in STOP si doar sa dezactiveze enable_ps dupa circa 5-10secunde. Cum pot face o temporizarea care sa porneasca doar cand state () == Stop? Link spre comentariu
mihaicozac Postat Mai 7, 2018 Partajează Postat Mai 7, 2018 Deci tu vrei să ai 2 surse separate pt. acţionare? adică iei din sursa PC 5VSB pt. Arduino şi porneşti restul doar la nevoie? Cât priveşte temporizarea sunt 2 variante, foloseşti funcţia millis() sau un integer care se incrementează în starea de stop şi care când ajunge la o anumită valoare dezactivează sursa. În al doilea caz ar fi nevoie de ceva delay pt. stabilizare. Link spre comentariu
mely17 Postat Mai 7, 2018 Autor Partajează Postat Mai 7, 2018 Exact. Folosesc 5v standby din sursa si pornesc 12 v daca este nevoie. Am incercat sa fac cu millis() dar nu reusesc nici cum. Cu incrementare nu am incercat. In cazul incrementari la sfarsitul lui void loop pun un delay de 10ms si monitorizez de cate ori a trecut prin stop (). Daca a trecut de 500 ori inseamna ca au trecut 5secunde. Este corect? Link spre comentariu
mihaicozac Postat Mai 7, 2018 Partajează Postat Mai 7, 2018 Exact, iar contorul îl resetezi la nevoie. Cu millis se face în felul următor: iniţial unei variabile long îi dai valoarea millis: long now = millis(); ulterior faci o comparaţie if (millis() - now > 5000) face ceva acolo. Resetarea se face dând din nou valoarea millis variabilei now. Link spre comentariu
nico_2010 Postat Mai 8, 2018 Partajează Postat Mai 8, 2018 Salut, O aplicatie destul de clara, cred, este cea de aici: Urmareste ultimele mele postari. Link spre comentariu
mely17 Postat Mai 8, 2018 Autor Partajează Postat Mai 8, 2018 (editat) Am facut cu counter pentru ca mi sa parut mai usor. Am sa incerc sa implementez si cu timer. Atasez codul cu care merge dupa preferintele mele. Multumesc pentru ajutor. int limit_switch_up = 6; //senzor mecanism sus int limit_switch_dwn = 5; //senzor mecanism jos int rot_dir = 4; //iesire pentru activarea releului care schimba directia de rotatie a motorului int enable_ps= 7; // iesire care activeaza pornirea sursei de calculator int pwm_m_speed = 11; // iesire pentru controlul vitezei int Tv_on = 3; //intrare stare tv (daca este pornit primim 5v de la tv) int M_stop = 8; // iesire pentru activarea releului care pune in scurt motorul pentru franare int counter =0 ; enum {STOP, MOVE_DWN, MOVE_UP, TRANZIT }; byte state(){ if (((digitalRead(limit_switch_dwn)== LOW)&&(digitalRead(limit_switch_up)== HIGH)&&(digitalRead(Tv_on)==HIGH)) ||((digitalRead(limit_switch_dwn)== HIGH)&&(digitalRead(limit_switch_up)== LOW)&&(digitalRead(Tv_on)==LOW))) return STOP ; else if ((digitalRead(limit_switch_dwn)== LOW)&&(digitalRead(limit_switch_up)== HIGH)&&(digitalRead(Tv_on)==LOW))return MOVE_DWN ; else if ((digitalRead(limit_switch_dwn)== HIGH)&&(digitalRead(limit_switch_up)== LOW)&&(digitalRead(Tv_on)==HIGH))return MOVE_UP; else return TRANZIT; } void open_tv() { while( STOP != state()){ digitalWrite(enable_ps, HIGH); digitalWrite(M_stop, LOW); digitalWrite(rot_dir, HIGH); delay(100); analogWrite(pwm_m_speed, 70); } } void close_tv() { while( STOP != state()){ digitalWrite(enable_ps, HIGH); digitalWrite(M_stop, LOW); digitalWrite(rot_dir, LOW); delay(100); analogWrite(pwm_m_speed, 90); } } void stop_tv() { if (digitalRead(Tv_on)== HIGH){ counter = counter + 1; if (counter >= 100){ digitalWrite(enable_ps, LOW); if(counter >= 101){ counter = 100; } }else digitalWrite(enable_ps, HIGH); }else { counter = 0; digitalWrite(enable_ps, HIGH); } analogWrite(pwm_m_speed, 0); delay(50); digitalWrite(M_stop, HIGH); delay(50); digitalWrite(rot_dir, LOW); } void setup (){ pinMode(limit_switch_up, INPUT_PULLUP); pinMode(limit_switch_dwn, INPUT_PULLUP); pinMode(rot_dir, OUTPUT); pinMode(enable_ps, OUTPUT); pinMode(pwm_m_speed, OUTPUT); pinMode(Tv_on, INPUT_PULLUP); pinMode(M_stop, OUTPUT); analogWrite(pwm_m_speed, 0); digitalWrite(M_stop, LOW); digitalWrite(rot_dir, LOW); digitalWrite(enable_ps, LOW); } void loop () { if(state()== STOP){ stop_tv(); }else if(state()== MOVE_DWN){ open_tv(); }else if(state()== MOVE_UP){ close_tv(); } delay(10); } Pe viitor, cand mai postezi cod foloseste simbolul <> din editorul de text, nu citat Editat Mai 8, 2018 de nico_2010 Link spre comentariu
mely17 Postat Mai 16, 2018 Autor Partajează Postat Mai 16, 2018 Un scurt video cu sistemul functionand. Singurul lucru care ma supara este zgomotul produs de motor. Motorul este unul cu reductor recuperat dintr-o frana de mana auto. Link spre comentariu
RealAlex Postat Iunie 13, 2018 Partajează Postat Iunie 13, 2018 Felicitari pt realizare. Sa pui proiectul pe forum pt ca este unul foarte interesant. Ai incercat sa izolezi fonic ansamblul motor- reductor? Din cauza timpului scurt de actionare nu cred ca se pune problema supraincalzirii lui. Motorul contine si siguranta termica? Este foarte buna in caz ca se intampla ceva neprevazut si nu iti functioneaza restul limitarilor. Posibil ca dulapul acela sa influenteze sunetul, incearca sa testezi sistemul fara dulap montat si daca se aude mai incet atunci izoleaza si spatele dulapului. P.s. In ultima instanta poti muta motorasul la vecinul de sus si ai scapat de zgomote :). Link spre comentariu
mely17 Postat Septembrie 2, 2018 Autor Partajează Postat Septembrie 2, 2018 Revin un pic mai tarziu cu un raspuns. Deocamdata am lasat asa cum este din lipsa de timp si idei bune. Sistemul functioneaza bine doar ca este zgomotos. Nu cred ca pot sa izolez bine cu vata deoarece nu prea am spatiu, televizorul vine foarte aproape de motor. Ca solutie ma gandeam sa folosesc un motor mai mic cu reductor 1:100, 1:200 etc doar ca implica modificari mecanice si ridicarea/ coborarea va deveni foarte lenta. Deocamdata nu ma deranjeaza dar va veni vremea cand va trebui sa-l folosesc mai des (creste bebe) si atunci o sa fiu nevoit sa gasesc o solutie cat mai silentioasa si rapida. Daca are cineva vreo ideie ii multumesc! Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum