Vlad Mihai Postat August 4, 2014 Partajează Postat August 4, 2014 Salut, testez un nou proiect ce consta in a controla viteza unui motor de curent continuu. Folosesc o telecomanda TV pe 38khz, in fine partea hardware e ok, partea soft e problema... Vreau ca atunci cand apas un anumit buton de la telecomanda sa imi incrementeze valoarea la pwm cu o anumita valoare, am scris softul dar se comporta ca o bucla infinita acel if pentru incrementare/decremetare, adica creste pwm incontinuu cu o anumita valoare. Ce e gresit? Atasez codul: #include <IRremote.h>int RECV_PIN = 2; int motor_1=9; int motor_2=10; int motor_3=11;int val1=0; //constanta motor1 int val2=0; // constanta motor2 int val3=0; //constanta motor3int m1=5; int m2=6; //led-uri indicatoare stare motorint m3=7;int motor_step=20;IRrecv irrecv(RECV_PIN);decode_results results;int addr = 0;void setup(){ pinMode(m1, OUTPUT); pinMode(m2, OUTPUT); pinMode(m3, OUTPUT); pinMode(motor_1, OUTPUT); pinMode(motor_2, OUTPUT); pinMode(motor_3, OUTPUT); irrecv.enableIRIn(); Serial.begin(9600);}void loop(){ if (irrecv.decode(&results)) { irrecv.resume(); } //motor 1 control if(results.value==16758855){ val1= val1+motor_step; } if(results.value==16748655){ val1=val1-motor_step; } if (val1 < 0) { val1= 0; } if(val1>0){ digitalWrite(m1, HIGH); } else digitalWrite(m1, LOW); //stop toate motoarele if(results.value==16713975){ val1=0; val2=0; val3=0; } analogWrite(motor_1, val1); analogWrite(motor_2, val2); analogWrite(motor_3, val3); Serial.println(val1); delay(100);} LE: am testat pe serial si functioneaza corect codul, dar pe infrarosu nu vrea..... mai incerc LE2: am pus un led ca sa vad cum functioneaza, desi ar trebui ca ledul sa fie fie aprins doar atunci cand pas pe buton, ei bine apas odata si el sta aprins incontinuu. if(results.value==16748655){ delay(50); val1-=20; digitalWrite(m1, HIGH); } else digitalWrite(m1, LOW); Link spre comentariu
Mircea Postat August 4, 2014 Partajează Postat August 4, 2014 (editat) N-am citit codul ca nu il inteleg decat in mare ;) (limbajul) dar am o intrebare: daca atunci cand apesi pe buton ai un 1 (sa zicem) continuu, nu crezi ca e normal sa incrementeze cam instantaneu de la 0 la 100 cand un ciclu dureaza microsecunde?Pune o intarziere intre incrementari si vezi diferenta. Editat August 4, 2014 de thunderer Link spre comentariu
Vlad Mihai Postat August 4, 2014 Autor Partajează Postat August 4, 2014 am pus delay de 200 ms si tot asa face... renunt la proiect, ca un atmega 328 nu poate controla 3 motoare simultan... cel putin cu programarea care o stiu eu nu merge... Link spre comentariu
Mircea Postat August 5, 2014 Partajează Postat August 5, 2014 Simplifica pentru un singur motor. Rezolva intai incrementarea si decrementarea. Apoi fa stopul. Dupa, adauga si celelalte motoare. Lucreaza pe module. Fa fiecare modul sa fie functional si apoi pune-le impreuna. Mai pune intrebari, ca mai raspunde cate cineva. Nu te da batut, ca nu ai de ce! In fine, la mine uneori merge si sa-l las balta vreo cateva zile. Apoi, pe drum de la munca conducand, sau la dus (imi ia 5-10 minute ca stau sa ma gandesc la ale mele) imi vine o alta idee de cum sa fac. Si de la zero il fac sa mearga. Curaj, mestere! Link spre comentariu
Liviu M Postat August 5, 2014 Partajează Postat August 5, 2014 Cand nu apesi nici un buton, nu mai intri in if(irrecv.decode()), asa ca results.value ramane cu valoarea de la ultima apasare de buton. 'Sterge' cumva results.value (un else la if(irrecv.decode()) de exemplu). Link spre comentariu
Vlad Mihai Postat August 6, 2014 Autor Partajează Postat August 6, 2014 Ca deobicei Liviu are dreptate si ma scoate din belele, dar oricum am renuntat la proiect ca nu mai am timp de el (ma pregatesc de migrare catre sudul tarii), dar am testat si merge bine.. Thunderer multumesc de incurajari, iti pregatesc o surpriza sper, peste cateva luni (am inceput lucrul la un robot 4x4 bldc cu carcasa din fibra de sticla care are inclus tot felul de nebunii) Numai bine! 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