Programare

Ce cip e în telecomenzile originale? Există posibilitatea să programezi și alte telecomenzi (ca să le vadă storurile)?
 
Adică îți trebuie ceva cu rezoluție 100KHz (ca să ajungi la alea 0.01ms). Dacă nu e receptorul chiar așa pretențios, probabil și 10KHz (0.1ms). Vezi aici benchmarks pentru diverse moduri de bit banging în raspberry. wiringPi pare destul de performantă.

Ca în orice multitasking preemptiv, problema ta nu e performanța brută, ci faptul că programul tău poate fi întrerupt oricând - adică fix când trimiteai burst-ul. De-asta preferă lumea Arduino and stuff pentru așa ceva - pentru că nu te întrerupe nimeni dacă nu vrei.
 
Nu ma pricep la C, dar am niste indoieli:
Performanta on/off e una, dar daca pun un sleep acolo, cred ca datele problemei se schimba. Sunt absolut convins ca un sleep conduce obligatoriu la un context switch imediat ce executia ajunge acolo; procesorul se va ocupa de alt program in timp ce timer-ul merge. Ce probabilitate este ca executia sa continue dupa exact 0.56 ms? Mica. Si nanosleep, care tinea procesorul ocupat pana la 2 ms, se pare ca nu mai face asa incepand de la kernel v2.6.
Fac un test in weekend cu wiringPi sa vad ce iese.
Intreruperile n-ar fi chiar atat de problematice daca sleep n-ar face context switch obligatoriu. Chiar si telecomanda originala trimite codul de doua ori.
 
Aș fi foarte surprins dacă sistemul de control wireless nu ar avea deja și un aparat pe post de telecomandă programabilă, fie în funcție de timp, fie cu senzor de lumină. Nu mai sunt atât de mulți dobitoci în industrie ca să-și facă pe genunchi propriile invenții wireless, toți iau aceleași circuite de comandă și control care folosesc frecvențe și protocoale standardizate. Deci nu înțeleg de ce ar trebui să reinventezi roata și să te apuci să faci programatic o implementare oarbă a unui protocol standard și care va avea o oarecare șansă de succes, în loc să iei direct aparatul care face direct asta și funcționează 100% din cazuri. Că doar nici pentru moto nu-ți iei o bucată de metal și un strung și te apuci să-ți bricolezi chestii, ci cumperi piesa de-a gata făcută.

Deci poate ar trebui început cu ce brand și model sunt controllerele motorizate pentru rulourile de la ferestre, și plecăm de-acolo cu căutatul, iar opțiunea de a programa burst-uri de transmisie radio măsurate în milisecunde va fi uuuuuultima opțiune când orice altă variantă a fost epuizată.
 
Lasă telecomanda, zi de modelul de control din rulouri (dacă e separat, sau rulourile cu totul dacă au venit de-a gata). Expert-Rulouri e vânzătorul, da' producătorul cine e?
 
Totul e integrat in carcasa rulourilor. Nu-i afara decat cablul la priza. Rulourile sunt cumparate de la Qfort, dar nu stiu modelul.

Am scris azi ceva in C cu WiringPi si usleep. Dupa nenumarate erori de compilare, a mers. Am conectat emitatorul. Se pare ca emite duratele de timp corecte cu marja de eroare sub 10%. Nici nu am cu ce masura atat de exact. Cand o sa am mai mult timp o sa scriu un program mai serios care transmite codurile telecomenzii. Nu stiu C si chiar n-aveam chef acum sa mai invat si C.
 
Am invatat C. Pentru nivelul de incepator la genunchiul broastei ma pot lauda ca ^ merge. In peste 90% din cazuri merge de la prima comanda. Cred ca restul sunt probabil interferente, ca semnalul emitatorului e slab comparativ cu telecomanda originala. Urmeaza sa-i pun antena.
Am scris si un program care "asculta" semnalele si afiseaza duratele semnalelor si pauzelor. Urma sa-l folosesc ca sa scap de inregistrat si descifrat coduri cu RTL-SDR. Epic fail. Afiseaza numai aberatii. Nu stiu unde am gresit.

Pana mai imi vin idei, am alt proiect legat de programarea in C.
Am o placa MCB2130 cu LPC2138. M-am jucat cu ea. Pana acum mi-au iesit aprinsul si stinsul LED-urilor si (partial) sleep pentru CPU, trezire cu IRQ generat de timer. Zic partial pentru ca timer-ul are o abatere marisoara. La PLL nu m-am bagat, probabil acolo e cauza.

Vreau sa fac cu placa asta un contor de celule pentru folosit la serviciu. Ce-i ala: Aparat cu multe butoane si un afisaj. Fiecare buton reprezinta o categorie de celule si are un contor. Apas diversele butoane pe masura ce vad celulele la microscop. Cand ajung la 100, aparatul imi arata de cate ori am apasat fiecare buton (procentul fiecarei categorii de celule).

Am nevoie de un sfat in legatura cu fiabilitatea. Butoanele sunt... problematice. Daca contactul e prost sau apas butonul ceva mai lent, exista posibilitatea sa inregistreze doua sau mai multe apasari logice pentru o singura apasare fizica. M-am gandit sa pun o limita minima de timp pentru fiecare apasare (vreo 50ms?) si un beep de confirmare, ca voi sta cu ochii in microscop, nu pe afisaj. Dar nu vreau ca delay-ul acelei limite de timp sau durata beep-ului sa tina procesorul ocupat si sa-l faca sa rateze o alta apasare de buton. Cum ar trebui sa procedez? Sunt prea multe butoane ca sa pun intrerupere pe fiecare.
 
Folosești butoane bune (cu feedback tactil și care nu fac bouncy bounce să genereze 15 count-uri), le pui pullup/pull down, generezi întreruperi la apăsarea oricărui buton (vezi aici), iar beep-ul îl faci extern (nu îl generezi în procedura de întrerupere, ci separat). Pui cooldown de 20 de milisecunde, să nu numere dacă e așa rapid (just in case).
 
Interesanta metoda aia fara diode. :thumbs: Testez.
Momentan ma ocup de conectarea afisajului.

PS: Unde gasesc niste butoane serioase? Mi-ar place ceva macar de dimensiunile butoanelor de tastatura obisnuita.
Am vazut la POS-uri diverse tastaturi custom la care butoanele au capac transparent sub care se pune eticheta de hartie cu functia butonului. Gasesc pe undeva butoane din alea? Sau poate o tastatura seriala cu butoane din alea?
 
Last edited:
Apas de mii de ori zilnic in ritm rapid, chiar mai repede decat tastez. Deci preferabil sa fie f. usor de apasat, fara feedback, cursa scurta si cu activare la capatul cursei. Adica genul de buton chior folosit de electronisti amatori, doar ca vreau un "capac" mare (gen 2x2cm) la el ca sa il pot nimeri usor fara sa ma uit. E preferabil sa fie etichetabil, dar nu tin neaparat. Din moment ce eu construiesc, evident ca o sa stiu pentru ce-i fiecare buton. Eticheta e strict pentru aspectul estetic.
 
Hmmm... nu stiu. Placa n-are USB. Ar insemna sa-l demontez si sa trag fire de undeva dinaintea partii electronice. N-am desfacut niciodata unul sa vad cum sunt legate butoanele. Din cate am vazut la tastaturi, sunt conectate gen matrice (randuri/coloane), ceea ce face ca partea aia cu IRQ sa fie si mai complicata.

Pe de alta parte, daca as fi vrut metoda super-super-extra-simpla, scriam un program in consola pentru RPi (C, PHP, python, orice), il puneam sa ruleze automat dupa bootare, si-i conectam direct keypad USB. In juma' de ora era gata. Dar eu sunt Marius '95. :fluier:
 
Am cumparat o tastatura cu 4x4 butone. Are 4 contacte pentru randuri si 4 contacte pentru coloane. Butoanele fac contactul electric intre rand si coloana.
Am conectat randurile la niste pini GPIO=1 si coloanele la cei 4 pini cu intreruperi externe. Am scris un program simplu care sa aprinda cate un LED ori de cate ori se activeaza o intrerupere, plus o bucla infinita in main() care sa alterneze alte doua LED-uri - sa vad ca ruleaza, nu-i blocat.
Rezultat: fail. Intreruperile clipocesc intr-o veselie fara sa apas vreun buton pe tastatura. Alea doua LED-uri din main() care ar trebui sa indice idle, abia daca apuca sa miste cate ceva.
Mai mult, pattern-ul dupa care clipesc LED-urile intreruperilor externe se modifica dupa cum misc mana pe deasupra placii. Asadar placa mea prinde transmisiuni radio extraterestre. :facepalm:
 
Pull down resistors. Ceea ce faci tu e să pui o antenă pe o intrare cu impedanță mare (adică pe care o să o "impresioneze" un curent foarte mic, rezultând fluctuații de tensiune văzute de tranzistorul de input). Poți s-o folosești ca input de entropie pentru seed-ul un random number generator. Așa că îți trebuie pe fiecare intrare câte un rezistor (mare, zeci de Kohm) către masă, ca să nu mai fâlfâie antena în vânt.
 
Back
Top