Sari la conținut
ELFORUM - Forumul electronistilor

Proiect Motor DC si telecomanda IR


mely17

Postări Recomandate

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
  • Răspunsuri 24
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

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

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

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

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

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 de nico_2010
Link spre comentariu
  • 2 săptămâni mai târziu...
  • 4 săptămâni mai târziu...

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
  • 2 luni mai târziu...

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări