Tincu Ioan Postat Mai 10, 2020 Partajează Postat Mai 10, 2020 buna ziua. folosesc un arduino uno si o placa cu semipunti cu tle94112el de la infineon pentru a comanda independent 6 motorase din telecomanda IR. atunci cand vreau ca la o apasare a unui buton, un motor sa porneasca, acesta se invarte fin, fara pulsatii. dupa ce am implementat codul de mai jos, prin care comand rotirea motorului doar atat timp cat tin apasat butonul alocat motorului respectiv, aceste nu se mai invarte fin, ci este alimentat in impulsuri, aproximativ 2 impulsuri pe secunda. am folosit toate cele 3 frecvente pwm oferite de place (80, 100, 200hz) si diferiti factori de umplere, fara rezulatat. adaugand inca 2 motoare, am observat ca perioada impulsurior s-a marit, chiar daca eu comand rotatia unui singur motor din cele 3, astfel motorul este alimentat cu aproximativ un impuls la 0,8 secunde. aveti vreo idee care ar putea fi cauza? sau daca mai stiti o alta metoda de a comanda rotirea motorului inafara de cea utilizata de mine, va rog. #include <TLE94112.h> #include <Tle94112Motor.h> #include <IRremote.h> #define unu 0x1 #define doi 0x2 #define trei 0x3 #define cinci 0x5 unsigned long timestamp = 0; #define TIMEOUT 200 int RECV_PIN = 2; Tle94112 controller = Tle94112(); Tle94112Motor motor1(controller); Tle94112Motor motor2(controller); Tle94112Motor motor3(controller); IRrecv irrecv(RECV_PIN); decode_results results; void setup() { irrecv.enableIRIn(); controller.begin(); motor1.connect(motor1.HIGHSIDE, controller.TLE_HB1); motor1.connect(motor1.LOWSIDE, controller.TLE_HB2); motor1.setPwm(motor1.HIGHSIDE, controller.TLE_PWM1); motor1.setPwmFreq(motor1.HIGHSIDE, controller.TLE_FREQ200HZ); motor2.connect(motor2.HIGHSIDE, controller.TLE_HB3); motor2.connect(motor2.LOWSIDE, controller.TLE_HB4); motor2.setPwm(motor2.HIGHSIDE, controller.TLE_PWM2); motor2.setPwmFreq(motor2.HIGHSIDE, controller.TLE_FREQ200HZ); motor3.connect(motor3.HIGHSIDE, controller.TLE_HB5); motor3.connect(motor3.LOWSIDE, controller.TLE_HB6); motor3.setPwm(motor3.HIGHSIDE, controller.TLE_PWM3); motor3.setPwmFreq(motor3.HIGHSIDE, controller.TLE_FREQ200HZ); motor1.begin(); motor2.begin(); motor3.begin(); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); if (results.value == unu) { motor1.start(255); timestamp < millis(); } if(results.value == unu){ timestamp < millis(); } if(millis() - timestamp > TIMEOUT){ motor1.start(0); } if (results.value == doi) { motor2.start(255); timestamp < millis(); } if(results.value == doi){ timestamp < millis(); } if(millis() - timestamp > TIMEOUT){ motor2.start(0); } if (results.value == trei) { motor3.start(255); timestamp < millis(); } if(results.value == trei){ timestamp < millis(); } if(millis() - timestamp > TIMEOUT){ motor3.start(0); } if (results.value == cinci) { motor3.start(255); motor2.start(255); motor1.start(255); timestamp < millis(); } if(results.value == cinci){ timestamp < millis(); } if(millis() - timestamp > TIMEOUT){ motor3.start(0); motor2.start(0); motor1.start(0); } } } Link spre comentariu
Liviu M Postat Mai 10, 2020 Partajează Postat Mai 10, 2020 La ce e buna comanda asta? Acum 45 minute, Tincu Ioan a spus: timestamp < millis(); Link spre comentariu
Tincu Ioan Postat Mai 10, 2020 Autor Partajează Postat Mai 10, 2020 daca am inteles eu bine de la cel care mi-a zis sa folosesc comanda asta, compara durata intre doua coduri consecutive trimise de telecomanda si TIMEOUT. cand am pus egal in loc de mai mic, cum de altfel a fost recomandarea celui care m a ajutat, motorul pornea cand apasam tasta unu si se oprea cand o apasam din nou. cu < in loc de egal merge cum am scris mai sus. stii alta metoda de a obtine functionarea pe care o vreau? dupa cum am spus, intampin probleme cu configuratia actuala. Link spre comentariu
Mircea Postat Mai 10, 2020 Partajează Postat Mai 10, 2020 Daca tot nu variati viteza, de ce mai folositi PWM? Ca oricum vad factorul de umplere 0 sau 255. Link spre comentariu
sebip Postat Mai 10, 2020 Partajează Postat Mai 10, 2020 (editat) Eu nu am inteles foarte bine cand doriti sa porneasca un motor si cand doriti sa se opreasca motorul respectiv. Doriti sa functioneze doar cat timp este apasata tasta respectiva ? De exemplu apasa 1 porneste motor 1, cat timp tin apasata tasta 1 motorul sa functioneze continuu (cu factorul pwm fixat), cand nu mai tin apasata tasta 1 motorul 1 se opreste. Pentru exemplu dat de mine (nu stiu exact ce date trimite telecomanda, dar preluand din programul dvs ) ar trebui ca in foarte scurt timp de la momentul incare nu mai apasati tasta 1 de exemplu, in 200ms sa se opreasca motorul 1. Nu e cel mai optim cod dar e modificat la minim cel pus de dvs, asa puteti observa modificarile facute. Nu l-am testat neavand instalate librariileTLE. Daca tot apar intreruperi la motoare, puteti incerca sa cresteti valoarea TIMEOUT sa vedeti daca se rezolva. (am adaugat si initializarea portului serial care lipsea Serial.begin() ) #include <TLE94112.h> #include <Tle94112Motor.h> #include <IRremote.h> #define unu 0x1 #define doi 0x2 #define trei 0x3 #define cinci 0x5 unsigned long timestamp1 = 0; unsigned long timestamp2 = 0; unsigned long timestamp3 = 0; unsigned long timestamp5 = 0; #define TIMEOUT 200 int RECV_PIN = 2; Tle94112 controller = Tle94112(); Tle94112Motor motor1(controller); Tle94112Motor motor2(controller); Tle94112Motor motor3(controller); IRrecv irrecv(RECV_PIN); decode_results results; void setup() { irrecv.enableIRIn(); controller.begin(); motor1.connect(motor1.HIGHSIDE, controller.TLE_HB1); motor1.connect(motor1.LOWSIDE, controller.TLE_HB2); motor1.setPwm(motor1.HIGHSIDE, controller.TLE_PWM1); motor1.setPwmFreq(motor1.HIGHSIDE, controller.TLE_FREQ200HZ); motor2.connect(motor2.HIGHSIDE, controller.TLE_HB3); motor2.connect(motor2.LOWSIDE, controller.TLE_HB4); motor2.setPwm(motor2.HIGHSIDE, controller.TLE_PWM2); motor2.setPwmFreq(motor2.HIGHSIDE, controller.TLE_FREQ200HZ); motor3.connect(motor3.HIGHSIDE, controller.TLE_HB5); motor3.connect(motor3.LOWSIDE, controller.TLE_HB6); motor3.setPwm(motor3.HIGHSIDE, controller.TLE_PWM3); motor3.setPwmFreq(motor3.HIGHSIDE, controller.TLE_FREQ200HZ); motor1.begin(); motor2.begin(); motor3.begin(); Serial.begin(9600); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); //******************motor 1*********************************** if (results.value == unu) { motor1.start(255); timestamp1 = millis(); } if(millis() - timestamp1 > TIMEOUT) { motor1.start(0); } //******************motor 2*********************************** if (results.value == doi) { motor2.start(255); timestamp2 = millis(); } if(millis() - timestamp2 > TIMEOUT) { motor2.start(0); } //*****************motor 3************************************ if (results.value == trei) { motor3.start(255); timestamp3 = millis(); } if(millis() - timestamp3 > TIMEOUT) { motor3.start(0); } //****************toate motoarele************************************* if (results.value == cinci) { motor3.start(255); motor2.start(255); motor1.start(255); timestamp5 = millis(); } if(millis() - timestamp5 > TIMEOUT) { motor3.start(0); motor2.start(0); motor1.start(0); } } } Pe viitor foloseste butonul "<>" din editor pentru a posta cod! Editat Mai 11, 2020 de nico_2010 Link spre comentariu
Liviu M Postat Mai 10, 2020 Partajează Postat Mai 10, 2020 Acum 1 oră, Tincu Ioan a spus: daca am inteles eu bine de la cel care mi-a zis sa folosesc comanda asta, compara durata intre doua coduri consecutive trimise de telecomanda si TIMEOUT. Nu, cu mai mic (<) nu face nimic. Egalul initial dadea valoarea millis() lui timestamp. < coompara timestamp cu millis() si atat. timestamp ramane nemodificat (0). De-aia, if-ul if(millis() - timestamp > TIMEOUT){ nu mai functioneaza cum trebuie. Link spre comentariu
Tincu Ioan Postat Mai 11, 2020 Autor Partajează Postat Mai 11, 2020 Acum 11 ore, sebip a spus: Eu nu am inteles foarte bine cand doriti sa porneasca un motor si cand doriti sa se opreasca motorul respectiv. Doriti sa functioneze doar cat timp este apasata tasta respectiva ? De exemplu apasa 1 porneste motor 1, cat timp tin apasata tasta 1 motorul sa functioneze continuu (cu factorul pwm fixat), cand nu mai tin apasata tasta 1 motorul 1 se opreste. Pentru exemplu dat de mine (nu stiu exact ce date trimite telecomanda, dar preluand din programul dvs ) ar trebui ca in foarte scurt timp de la momentul incare nu mai apasati tasta 1 de exemplu, in 200ms sa se opreasca motorul 1. Nu e cel mai optim cod dar e modificat la minim cel pus de dvs, asa puteti observa modificarile facute. Nu l-am testat neavand instalate librariileTLE. Daca tot apar intreruperi la motoare, puteti incerca sa cresteti valoarea TIMEOUT sa vedeti daca se rezolva. (am adaugat si initializarea portului serial care lipsea Serial.begin() ) #include <TLE94112.h> #include <Tle94112Motor.h> #include <IRremote.h> #define unu 0x1 #define doi 0x2 #define trei 0x3 #define cinci 0x5 unsigned long timestamp1 = 0; unsigned long timestamp2 = 0; unsigned long timestamp3 = 0; unsigned long timestamp5 = 0; #define TIMEOUT 200 int RECV_PIN = 2; Tle94112 controller = Tle94112(); Tle94112Motor motor1(controller); Tle94112Motor motor2(controller); Tle94112Motor motor3(controller); IRrecv irrecv(RECV_PIN); decode_results results; void setup() { irrecv.enableIRIn(); controller.begin(); motor1.connect(motor1.HIGHSIDE, controller.TLE_HB1); motor1.connect(motor1.LOWSIDE, controller.TLE_HB2); motor1.setPwm(motor1.HIGHSIDE, controller.TLE_PWM1); motor1.setPwmFreq(motor1.HIGHSIDE, controller.TLE_FREQ200HZ); motor2.connect(motor2.HIGHSIDE, controller.TLE_HB3); motor2.connect(motor2.LOWSIDE, controller.TLE_HB4); motor2.setPwm(motor2.HIGHSIDE, controller.TLE_PWM2); motor2.setPwmFreq(motor2.HIGHSIDE, controller.TLE_FREQ200HZ); motor3.connect(motor3.HIGHSIDE, controller.TLE_HB5); motor3.connect(motor3.LOWSIDE, controller.TLE_HB6); motor3.setPwm(motor3.HIGHSIDE, controller.TLE_PWM3); motor3.setPwmFreq(motor3.HIGHSIDE, controller.TLE_FREQ200HZ); motor1.begin(); motor2.begin(); motor3.begin(); Serial.begin(9600); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); //******************motor 1*********************************** if (results.value == unu) { motor1.start(255); timestamp1 = millis(); } if(millis() - timestamp1 > TIMEOUT) { motor1.start(0); } //******************motor 2*********************************** if (results.value == doi) { motor2.start(255); timestamp2 = millis(); } if(millis() - timestamp2 > TIMEOUT) { motor2.start(0); } //*****************motor 3************************************ if (results.value == trei) { motor3.start(255); timestamp3 = millis(); } if(millis() - timestamp3 > TIMEOUT) { motor3.start(0); } //****************toate motoarele************************************* if (results.value == cinci) { motor3.start(255); motor2.start(255); motor1.start(255); timestamp5 = millis(); } if(millis() - timestamp5 > TIMEOUT) { motor3.start(0); motor2.start(0); motor1.start(0); } } } multumesc, insa si acest cod functioneaza la fel, adica motoarele sunt alimentate tot cu impulsuri. da, vreau ca motoarele sa se opreasca imediat ce eliberez butonul. am modificat TIMEOUT si nu s-a observat nicio diferenta in functionare. Link spre comentariu
Tincu Ioan Postat Mai 11, 2020 Autor Partajează Postat Mai 11, 2020 Acum 12 ore, Thunderer a spus: Daca tot nu variati viteza, de ce mai folositi PWM? Ca oricum vad factorul de umplere 0 sau 255. asa am pus in exemplul asta. in aplicatia finala, foarte probabil o sa variez viteza. Link spre comentariu
sebip Postat Mai 11, 2020 Partajează Postat Mai 11, 2020 Vedeti pe teminalul serial ce cod va da la apasarea tastei1,2,3 si 5. Comparatia tastei apasate din programul dvs presupunea ca la apasarea atstei 1 va fi valoarea "unu" ... ori nu cred ca aceasta este valoare. results.value == unu Trebuie sa gasiti codul tastei 1 la telecomanda dvs, altfel nu stim ce numar transmite telecomanda la apasarea tastei 1 (la fel si la celelalte taste). Pe urma codurile respective ar trebui schimbate in locul unu, doi, trei si cinci Link spre comentariu
sebip Postat Mai 11, 2020 Partajează Postat Mai 11, 2020 Aveti o varianta imbunatatita da tot trebuie sa schimbati valorile tastelor, de exemplu in loc de results.value==1 cu results.value== 0xFF30CF presupunand ca FF30CF este codul tastei 1 ! In programul atasat trebuie inlocuit doar unde este "results.value==" motoare_si_ir2.ino Link spre comentariu
Tincu Ioan Postat Mai 11, 2020 Autor Partajează Postat Mai 11, 2020 Acum 3 minute, sebip a spus: Vedeti pe teminalul serial ce cod va da la apasarea tastei1,2,3 si 5. Comparatia tastei apasate din programul dvs presupunea ca la apasarea atstei 1 va fi valoarea "unu" ... ori nu cred ca aceasta este valoare. results.value == unu Trebuie sa gasiti codul tastei 1 la telecomanda dvs, altfel nu stim ce numar transmite telecomanda la apasarea tastei 1 (la fel si la celelalte taste). Pe urma codurile respective ar trebui schimbate in locul unu, doi, trei si cinci telecomanda chiar transmite 1 pentru butonul 1 samd. de fapt, transmite la o apsare 1, la a doua 2049, si tot asa. iar cand mentin apasat butonul, transmite repetitiv 2049 sau unu, nu alterneaza aceste 2 valori. Link spre comentariu
Tincu Ioan Postat Mai 11, 2020 Autor Partajează Postat Mai 11, 2020 Acum 12 minute, sebip a spus: Aveti o varianta imbunatatita da tot trebuie sa schimbati valorile tastelor, de exemplu in loc de results.value==1 cu results.value== 0xFF30CF presupunand ca FF30CF este codul tastei 1 ! In programul atasat trebuie inlocuit doar unde este "results.value==" motoare_si_ir2.ino 2 kB · 1 download multumesc mult, dar in continuare functionarea este aceeasi. Link spre comentariu
sebip Postat Mai 11, 2020 Partajează Postat Mai 11, 2020 Acum 10 minute, Tincu Ioan a spus: telecomanda chiar transmite 1 pentru butonul 1 samd. de fapt, transmite la o apsare 1, la a doua 2049, si tot asa. iar cand mentin apasat butonul, transmite repetitiv 2049 sau unu, nu alterneaza aceste 2 valori. nu stiu daca chiar transmite doua valori 1 sau 2049 ...nu are logica, doar daca libraria are probleme si nu furnizeaza codul corect si constant inseamna ca la tasta 1 trimite codul 2049 .... results.value == 0x2049 similar si la tastele celelate: 2,3,5 la celelate taste ce numere furnizeaza ? oricum, daca furnizeaza cifra 1, in comparatii sa folositi cifra 1 nu "unu" !!! "unu" este un sir de caractere pe cand cifra 1 este un numar , sunt interpretate total diferit telecomanda ar trebui sa transmita un cod hexazecimal la apasarea fiecarei taste, cod din mai multe cifre Puteti sa puneti o captura cu terminalul serial sa se vada codurile ? Link spre comentariu
sebip Postat Mai 11, 2020 Partajează Postat Mai 11, 2020 Acum 13 minute, Tincu Ioan a spus: multumesc mult, dar in continuare functionarea este aceeasi. Daca nu schimbati valorile pentru taste ...nici nu are cum sa mearga altfel, practic nu tine cont de nici o tasta :-) Link spre comentariu
Tincu Ioan Postat Mai 11, 2020 Autor Partajează Postat Mai 11, 2020 Acum 10 minute, sebip a spus: nu stiu daca chiar transmite doua valori 1 sau 2049 ...nu are logica, doar daca libraria are probleme si nu furnizeaza codul corect si constant inseamna ca la tasta 1 trimite codul 2049 .... results.value == 0x2049 similar si la tastele celelate: 2,3,5 la celelate taste ce numere furnizeaza ? oricum, daca furnizeaza cifra 1, in comparatii sa folositi cifra 1 nu "unu" !!! "unu" este un sir de caractere pe cand cifra 1 este un numar , sunt interpretate total diferit la o apasare 2, la urmatoarea 2050 la o apasare 3, la urmatoarea 2051 si tot asa. am incercat toate permutarile cu unu si cu 2049 si cu 1. nicio diferenta 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