Table of Contents

Wireless Presenter

Introducere

Wireless Presenter se dorește a fi exact ceea ce sugerează și numele: o telecomandă wireless ce poate interacționa cu software de susținere a prezentărilor (Google Slides, OpenOffice Impress, Microsoft Office PowerPoint, Keynote etc.) într-o manieră simplă și cu un cost al materialelor redus. Acesta va putea să realizeze acțiunile uzuale de control ale prezentărilor (next slide, previous slide, start slideshow), cât și mișcarea cursorului sistemului de calcul ce susține prezentarea. Suplimentar, telecomanda va avea un pointer cu care prezentatorul să poată indica audienței diferite elemente de pe slide-uri.

Ideea de la care am pornit pentru acest proiect a fost nevoia de a susține prezentări. Deoarece a cumpăra o soluție comercială nu avea sens din punct de vedere economic pentru mine la acel moment, am creat o versiune proprie a unui presenter, folosind un Arduino, un senzor infraroșu și o telecomandă de la un radio vechi, ce interacționau împreună cu un software de tip daemon, ce primea date prin USB de la Arduino și le traducea în apăsări de taste pe sistemul țintă.

Utilitatea abordării pe care o folosesc acum, spre deosebire de cea anterioară, este că, prin crearea propriului hardware al telecomenzii, pot fi adăugate/modificate funcționalități după bunul plac, astfel încât telecomanda ar putea deveni folositoare în mai multe scenarii, nu doar în susținerea prezentărilor.

Descriere generală

Schema bloc

Schema bloc

Hardware Design

Listă piese

Schema electrică

Detaliere hardware

Încă de la începutul implementării hardware a telecomenzii, design-ul final pe care l-am avut în minte a fost unul bazat pe împărțirea în două categorii a componentelor proiectului: cele ce au nevoie de alimentare cu 5V și/sau să fie în partea inferioară a telecomenzii și celelalte. Astfel, pot grupa toate componentele din prima categorie în partea inferioară. În practică, pe partea superioară au rămas doar butoanele de control, care pot fi utilizate fără alimentare prin utilizarea rezistențelor de pull-up.

 Hardware top & bottom

 Hardware asamblat

Componentele și utilizarea lor:

Software Design

Am dezvoltat proiectul în Visual Studio Code cu ajutorul PlatformIO, la fel ca în cadrul laboratoarelor. Codul de pe microcontrollere este scris aproape complet folosind regiștrii și laboratoarele relevante, întrucât implementările din acestea sunt foarte optimizate, ceea ce ajută în economisirea ciclilor de ceas și a energiei consumate din baterie. Cu toate acestea, am folosit și câteva biblioteci în proiect, acestea fiind:

Motivul alegerii acestor biblioteci este pentru că sunt simple și eficiente: cele oferite de AVR merg până la a implementa funcțiile în inline assembly, iar VirtualWire conține minimul necesar pentru a putea realiza transmisia cu o oarecare rezistență la erori rapid, fără a consuma cicli pe microcontroller inutil (alternativa ar fi fost biblioteca RadioHead, care are funcționalități suplimentare pentru asigurarea transmiterii mesajelor, dar aduce și complexitate suplimentară, pe care am dorit să o evit cât mai mult posibil).

Citirea butoanelor se realizează prin întreruperi de schimbare a pinilor la care butoanele sunt conectate, folosind rezistențele de pull-up interne ale microcontrollerului. Pentru a realiza debouncing pentru butoane, am implementat versiunea proprie a funcției millis(), similar cu varianta din laborator, folosind timer-ul 2, singurul care se poate utiliza ca sursă de întrerupere în modurile de sleep ale procesorului. Întrucât evitarea debouncing-ului nu are nevoie de o detecție foarte precisă a timpului trecut de la ultimul eveniment, am ales să generez o întrerupere odată la fiecare 4 milisecunde, astfel că voi scoate microcontrollerul din sleep de 4 ori mai rar, fără a dăuna preciziei butoanelor, ceea ce ajută la minimizarea consumului.

Cât despre modulul accelerometru-giroscop, am creat o micro-bibliotecă proprie de comunicare cu acesta, folosind datasheet-ul componentei. Aceasta implementează doar operațiile cele mai simple de configurare și de citire a datelor, întrucât modulul are multiple funcționalități avansate de care nu am avut nevoie în cadrul acestui proiect.

În ceea ce privește structurile implementate, am creat doar structura (practic clasa) Button, care memorează ultima oară când acesta a fost apăsat (pentru debouncing), memorează dacă a avut loc un eveniment cu acel buton și memorează codul (caracterul) ce se trimite către receiver când acel buton este apăsat.

Interfațarea dintre computer și receiver este realizată prin Serial over USB; pentru aceasta am implementat un software daemon în Python care să recepționeze comenzile și să le traducă în apeluri de sistem. Astfel, am utilizat următoarele biblioteci:

Rezultate Obţinute

 Produs final

Telecomanda rezultată este surprinzător de ușoară și are dimensiuni rezonabile, fiind capabilă să țină o prezentare la o distanță respectabilă de receptorul conectat la calculator. Deși ceva mai greu de controlat, controlul cursorului folosind giroscopul este destul de intuitiv după o scurtă perioadă de acomodare cu această schemă de control. Butoanele sunt tactile, ceea ce ajută la a avea încredere că acestea au fost apăsate, iar orientarea lor le face ușor de găsit și apăsat fără a te uita la ele.

Concluzii

Acest proiect a fost o oportunitate să mă apropii mai mult de hardware (este prima dată când fac un design atât de complicat și restricționat de spațiu - plus că mâinile mele tremurânde nu m-au avantajat) și să creez ceva ce voi utiliza cu siguranță la viitoarele prezentări pe care le voi ține în fața colegilor și nu numai. În plus, acum că am control total asupra software-ului ce rulează pe toate dispozitivele din acest lanț de control/comunicare, pot să particularizez oricând vreau telecomanda pentru a-mi servi și la alte scopuri decât doar susținerea de prezentări.

Download

Arhivă proiect: Alexander1752-wireless_presenter.zip

Daemon download - Windows 64-bit: daemon_v1.0.0_win64.zip

Arhivă proiect OCW: alexander1752-wireless_presenter.zip

Jurnal

Bibliografie/Resurse

Export to PDF