Jump to content
ELFORUM - Forumul electronistilor
mely17

Proiect Motor DC si telecomanda IR

Recommended Posts

Buna ziua. Inainte de toate vreau sa precizez ca va fi primul proiect facut cu Arduino. Ce vreau defapt: am un corp suspendat in camera fetitei in care vreau sa bag un LedTV care la apasarea butonului de ON/OFF al telecomenzi televizorului sa coboare si sa urce singur. Pana acum am motorul DC de 12Vcc recuperat dintr-o surubelnita electrica cu acumulator, controlul original de PWM(surprins ca avea asa ceva) care cred ca are doua trepete de viteze(verific inca o data sa fie sigur). Vreau sa ma folosesc de acest controlel pentru a usura functionarea sursei de alimentare, care va fi o sursa PC.

Va rog sa ma ajutati cu programul arduino, adica partea logica. Nu vreau mura in gura doar ca nu stiu de unde sa incep. La ce m-am gandit eu pana acum: vreau ca apasand butonul de on/off al telecomenzi pentru mai mult de 2 secunde televizorul sa coboare singur, motivul acestei temporizari este de a putea pe urma porni televizorul si a impiedica urcari la loc a televizorului. Miscarea mecanica va fi facuta cu o bara filetata de 8mm si sina de sertare cu bile. La capetele cursei de deplasare voi pune doua intrerupatoare folosite si la cuptoarele de microunde. 

Fac o mica logica poate se intelege mai bine asa:

Daca IRbuton >2sec atunci porneste secventa de pornire in functie de pozitia intreupatoarelor SW1 si SW2. Lasecventa de  pornire: porneste sursa PC, actioneaza releul care controleaza directia si stabileste viteza mica de pornire pe urma dupa o temprizare de 0,5sec porneste alimentare controlerului PWM si dupa o temporizare de 1-2 sec comuta pe viteza mare. La primirea semnalului  ca TV a ajuns jos sau sus opreste PWM si opreste sursa PC. Am facut o mica schema la cum m-am gandit sa fac partea hardware doar ca am uitat sa includ in desen si partea unde se comanda sursa PC dar voi folosi un releu pentru a porni sursa.

Lista cu intrarile si iesirile a placi arduino:

Intrare: senzor IR; LimitSwitch_1; LimitSW_2

Iesire: PCpower_On; Direction; Viteza; PWM_On;

Va rog sa ma ajutati cu ce functi pot realiza acest program. Nu vreau sa il faca cineva si doar sa-l incarc pe placa. M-am gandit la o placa Arduino Nano!

Poza: https://imgur.com/nXgYTjp

Multumesc!

Link to comment
Share on other sites

In ce priveste schema, ma tem ca mos-fetul va scurtcircuita sursa +12V la masa, iar PWM-ul va primi doar vreo 4V cand tranzistorul prin care se alimenteaza este deschis cu 5V de la Arduino.

Edited by Ticu
Link to comment
Share on other sites

Schema este gresita. Se va folosi PWM pentru mosfet-ul inseriat cu contactele releului de schimbare sens. Nu ai nevoie decat de limitatori, un mosfet, o rezistenta in grila de 220 ohmi,  o rezistenta de 10K intre grila si masa. Si inca un receptor IR care sa "citeasca" telecomanda tv-ului. Era sa uit de releul de pornire al sursei. 

PS-  ai grija la turatia motorului sa nu fie prea mare. Am incercat si eu ceva cu un motor de bormasina si aproape de capatul cursei oscila destul de violent la viteza maxima.  In timpul testelor, fara limitatori, am reusit sa indoi o bara de 12mm cu motorul. Personal as renunta la limitatori si as numara rotatiile tijei filetate ,iar in functie de astea as face diferite trepte de viteza pentru motor.

Link to comment
Share on other sites

eu nu prea am inteles cu ce vrei sa fi ajutat...

in orice caz, pe partea mecanica, eu as pune un motor de stergator de parbriz, un pic modificat, in sensul ca: trebuie sa poata faca rotatii continue, cele noi sunt limitate la cateva grade mecanic. in afara de asta, mai trebuie sa-l echipezi cu un encoder, si doi limitatori de cursa. 

pe partea electronica de putere nu iti trebuie decat un FET, il comanzi pwm, iar ca intrari ... pentru encoder, si pentru receiverul IR. inca o iesire ptr pwm. nici un releu pe sursa, pentru ca ramane alimentat 24h. in fond e ceva cu telecomanda.

cred ca te-ar ajuta si o macara de geam auto, poate chiar mai mult decat...

obs: ma tem ca topicul nu prea are legatura cu Arduino, pana acum.

Edited by Guest
Link to comment
Share on other sites

Un bun inceput ar fi cu asta:

/*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Enabled IRin");
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

Folosesti sketch-ul pentru a citi semnalele transmise de telecomanda TV. Odata ce ti-ai stabilit ce butoane vei folosi pentru comanda motorului  te folosesti de codurile transmise de acestea pentru a da comenzile de coborare/ridicare a televizorului. Libraria "IR remote" se descarca si instaleaza din Arduino IDE-->Sketch--> Include Library-->Manage Libraries cu motor de cautare IR remote.

Link to comment
Share on other sites

Poţi lua semnal şi din TV pt. acţionarea motorului, de ex. la mufa HDMI există la pinul 18 5V când TV-ul este pornit, sau ieşirea optică audio luminează după pornire şi se poate folosi un fototranzistor, etc.

Edited by mihaicozac
Link to comment
Share on other sites

Buna idee....

s-ar putea folosi si mufa Euroscart caci este mai comoda, neffind atat de miniaturizata... pinul 8.

Sau daca nu, o mufa USB. Dar pentru aceasta solutie ar trebui ca infrarosul telecomenzii sa ajunga la TV si cand acesta este "ascuns".

Altfel, nu trebuie decodat semnalul IR. Pentru a lasa TV.ul jos, cu un receptor TSOP382-384 se sesizeaza apasarea unei taste, iar pentru a-l urca la loc se sesizeaza disparitia tensiunii de 5V de la USB, astfel nu se mai complica cu decodarea RC5 - DACA ESTE RC5 !!!!

Acest proiect are si vreo utilitate practica sau este doar pentru pasiune ? De ce trebuie retras televizorul cand nu este folosit ?

Edited by one
Link to comment
Share on other sites

Este o idee buna dupa parerea mea. Voi prelungi firele de la senzorul tv si il voi scoate in afara. Camera este destul de mica si nu vreau ca televizorul sa ocupe in permanenta spatiul de pe birou, in felul asta castig spatiu suficient pe birou si nu sunt obligat sa fac unul mare. Pot sa ma folosec si de tensiunea de PS_On din televizor pentru  comanda de urcare si coborare.  In felul asta se simplifica mult situatia.

Link to comment
Share on other sites

privesti gresit problema dupa parerea mea. complicatura inutila si interventie asupra TV. de ce , cand poti decoda atat de banal telecomanda tv ? am o gramada de aplicatii care folosesc butoanele de teletext alte tv, in general inutile. ai acolo rosu, verde, galben, albastru. la alegere pentru comanda suportului. ai putea sa citesti exact comanda de oprire tv, cu conditia sa nu aiba un toogle switch. si asta s-ar putea rezolva cu un ldr plasat in cutia de retractie.

eu zic ca la proiectul asta mai dificila e partea mecanica, electronica si programul in sine e vax music.

si ce daca nu este RC5, SONY sau NEC ? ai primit un cod deja de la nico motamo... 

Edited by Guest
Link to comment
Share on other sites

Salutare. Dupa mai multe incercari de a face sistemul am reusit sa il termin 80%!

Ce am acut pana acuma:

1.am renuntat sa citesc telecomanda tv-ului si folosec un semnal de 5V din tv printr-un optocuplor,

2.am adaugat un releu de franare pentru a opri mai repede miscarea,

3.activez/dezactivez  o sursa de PC.

 

Codul functioneaza bine adica merge jos, merge sus si se opreste doar ca nu pot sa il bag in STBY dupa 5 secunde petrecute in STOP.

Atasez codul actual care dupa 5 min de STOP intra in STBY dar nu mai reusesc sa il scot nici cum. 

Ce gresesc?

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

unsigned long time_to_stby = false ; //variabila care bune state in stby
const long time_before_stby = 5000 ;  // timpul care trebe sa treaca
unsigned long previostime = 0;   //timpul care a trecut
unsigned long curenttime = 0 ;   // timpul actual

enum {STOP, MOVE_DWN, MOVE_UP, TRANZIT, STBY };
byte state(){
  if (((digitalRead(limit_switch_dwn)== LOW)&&(digitalRead(limit_switch_up)== HIGH)&&(digitalRead(Tv_on)==HIGH)&&(time_to_stby==false))
  ||((digitalRead(limit_switch_dwn)== HIGH)&&(digitalRead(limit_switch_up)== LOW)&&(digitalRead(Tv_on)==LOW)&&(time_to_stby==false))) 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 if (time_to_stby == true) return STBY;
  
  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() {
    digitalWrite(enable_ps, HIGH);
    delay(10);
    analogWrite(pwm_m_speed, 0);
    delay(50);
    digitalWrite(M_stop, HIGH);
    delay(50);
    digitalWrite(rot_dir, LOW);
}
    
 void stby () { 
  analogWrite(pwm_m_speed, 0);
  digitalWrite(M_stop, LOW);
  digitalWrite(rot_dir, LOW);
  digitalWrite(enable_ps, LOW);
}  

void timer() { 
      
 curenttime = millis() ;
 
 if (curenttime -  previostime >= time_before_stby) {
  time_to_stby = true;
  previostime = curenttime;
 }else if (state()!= STBY) {
  time_to_stby = false;
  } 
}

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);
  }
  
void loop () {
 Serial.begin(9600);

  if(state()== STOP){
    stop_tv();
    timer();
    }else if(state()== MOVE_DWN){
    open_tv();
    } else if(state()== MOVE_UP){
    close_tv();
    } else if(state()== STBY) {
      stby();
    }
  Serial.print("State=");
  Serial.println(state());
  Serial.print("time_to_stby=");
  Serial.println(time_to_stby);
  delay(1000);
  }

 

Edited by nico_2010
Link to comment
Share on other sites

Dacă ai releele şi senzori de cap de cursă în principiu nu mai ai nevoie de microcontroller...  stările intermediare nu sunt importante devreme ce mecanismul se plimbă automat între cele 2 capete, direcţia fiind comandată de absenţa sau prezenţa semnalului pe optpcuplor. 

Cât priveşte partea cu stand-by, e clar că din starea aia nu mai poţi să-l scoţi software , doar un impuls exterior sau un reset îl poate readuce în funcţionare.

La un sistem realizat de mine era necesară intrarea în standby după 10 minute, caz în care Arduino îşi tăia singur alimentarea, bineînţeles că din această stare nu se mai putea ieşi decât din deconectarea şi apoi reconectarea sursei de alimentare sau apăsarea mai lungă a unui buton, ambele fiind secvenţe hardware exterioare microcontrollerului care implicau de fapt resetarea lui.

Link to comment
Share on other sites

Am vrut sa folosesc Arduino pentru a invata un pic de c++ si am nevoie si de pwm pentru ca turatia motorului este mult prea mare.

 

- intrebare: pot folosi doua functii enum? Unu sa il folosec pentru statusul mecanizmului si unul sa-l folosec pentru a vedea daca am cerinta de miscare? In felu asta cred ca pot sa-l scot din standby urmarind semnalul de la Tv_on!

 

- intrebare: in void loop se executa totul  ciclic(infinit). Cand fac o chemare catre alt loop de exemplu open_tv programul va iesi din void loop pana se executa loopul chemat mai ales ca am functie while in acel loop? Si in acelas timp programul face update si la state()?

Multumesc. 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines