Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2023:ncaroi:plug [2023/05/28 21:24]
andrei.niculae1004 [Bibliografie/Resurse]
pm:prj2023:ncaroi:plug [2023/05/28 22:48] (current)
andrei.niculae1004 [Concluzii]
Line 12: Line 12:
 Ideea mi s-a parut utila tocmai din perspectiva plug & play, in sensul ca nu ai avea nevoie de Ideea mi s-a parut utila tocmai din perspectiva plug & play, in sensul ca nu ai avea nevoie de
 un program specializat pe computer pentru a interactiona cu API-ul, ci ai un mic black box fizic care pur si simplu functioneaza. un program specializat pe computer pentru a interactiona cu API-ul, ci ai un mic black box fizic care pur si simplu functioneaza.
-===== Descriere ​generală ​=====+===== Descriere ​generala ​=====
  
 **Schema bloc - mod middleman** **Schema bloc - mod middleman**
Line 22: Line 22:
 {{pm:​prj2023:​ncaroi:​plug-n-play-chatgpt-mod-standalone.png}} {{pm:​prj2023:​ncaroi:​plug-n-play-chatgpt-mod-standalone.png}}
  
-În cadrul ​proiectului ​am folosit următoarele componente:  +Functionalitatea de baza a proiectului ​a fost de a avea un dispozitiv plug & play, care poate fi folosit ​pentru a accesa functionalitatile unui API precum ChatGPT, pe orice PC si in orice aplicatie ​de pe acesta - de exemplupentru a face refactoring/​documentare ​pe o bucata de cod, pentru a genera cod boilerplate,​ pentru a corecta/​reformula o sectiune ​dintr-un ​text, pentru ​a scrie un template de e-mailtraduceri de textsau pur si simplu pentru a afla o informatie nouaintr-un ​mod mai rapid decat daca am deschide browser-ulAcest lucru se face prin apasarea unui shortcut predefinittastarea interogarii ​care sa fie trimisa ​la API si apoi tastarea raspunsului ​de catre microcontroler. Atunci cand nu se asculta interogarea,​ controlerul pur si simplu redirectioneaza pachetele USB catre PC. In modul simplu, microcontrolerul poate primi doar date de la tastatura, insa putem extinde functionalitatile daca rulam un script batch pe PC, care ne lasa sa trimitem ​un text selectat pe calculator catre microcontroler,​ prin monitorul serial. 
-  * Raspberry pi pico: care rulează ​un program ​care folosește biblioteca TinyUSB ​pentru a recepționa pachetele USB de la tastatura +Folosind display-ului TFT, pentru a selecta diferite prompt-uri, care sa fie inserate inaintea textului scris de la tastatura, pentru a comenzi folosite des, spre exemplu: "​Translate this text to english:",​ "​Refactor this code, don't write any other comments: ", "​Correct any mistakes you find in this text:"​. 
-  * Raspberry pi pico w: care rulează un program scris in CircuitPython,​ decodează pachetele primite ​de la primul Pico prin UART, face API requests, afișează răspunsul ​pe display sau îl tasteaza la PC + 
-  * Display TFT 2.0": utilizat ​pentru ​afișarea răspunsurilor sau diferitelor comenzi ​dintr-un ​meniu. +Adaugarea display-ului a dus la crearea modului standalone: dispozitivul sa poata fi folosit si in cazul in care nu exista acces la un calculator, iar din cateva teste, am observat ca acesta are o autonomie de ~3 ore. 
-  * Encoder rotativ cu buton OKY3431-4: folosit ​pentru ​selectarea opțiunilor din meniu. +
-  * Modul încărcare acumulator OKY3404: încarcă acumulatorul atunci când dispozitivul este conectat la PCsau alimentează circuitulfolosind acumulatorulin mod standalone. +
-  * Acumulator 18650: cu capacitatea de 3800mAh3.7V +
-  * Modul port USB: prin care se poate conecta o tastatura ​la dispozitiv +
-  * <​del>​Dioda Schottky: plasată după modulul ​de încărcare,​ pentru a nu lăsa tensiunea ​de 5V de pe VSYS sa ajungă ​la pinii de out de pe modul și să distrugă acumulatorulîn cazul în care dispozitivul este conectat la PC.</​del>​ - inlocuita cu un P-MOSFET (asa cum este recomandat in sectiunea 3.6 din [[https://​datasheets.raspberrypi.com/​picow/​pico-w-datasheet.pdf|datasheet-ul ​de la pico]], pentru a avea un voltage drop mai mic de la VBAT la VSYS+
 ===== Hardware Design ===== ===== Hardware Design =====
-{{pm:​prj2023:​ncaroi:​schema_electrica_50_.png}}+{{pm:​prj2023:​ncaroi:​schema_electrica.png?700}}
  
-Lista de piese+In cadrul proiectului am folosit urmatoarele componente:  
-  * Raspberry pi pico +  * Raspberry pi pico: care ruleaza un program care foloseste biblioteca TinyUSB pentru a receptiona pachetele USB de la tastatura 
-  * Raspberry pi pico w +  * Raspberry pi pico w: care ruleaza un program scris in CircuitPython,​ decodeaza pachetele primite de la primul Pico prin UART, face API requests, afiseaza raspunsul pe display sau il tasteaza la PC 
-  * Display TFT 2.0" +  * Display TFT 2.0": utilizat pentru afisarea raspunsurilor sau a diferitelor comenzi dintr-un meniu. 
-  * Encoder rotativ cu buton OKY3431-4 +  * Encoder rotativ cu buton OKY3431-4: folosit pentru selectarea optiunilor din meniu. 
-  * Modul incarcare acumulator OKY3404 +  * Modul incarcare acumulator OKY3404: incarca acumulatorul atunci cand dispozitivul este conectat la PC, sau alimenteaza circuitul, folosind acumulatorul,​ in mod standalone. 
-  * Acumulator 18650 +  * Acumulator 18650 Rakieta: cu capacitatea de [[https://​www.emag.ro/​acumulator-rakieta-18650-3-7v-12000mah-li-ion-gold-1-18650-1g/​pd/​D2Q5C5MBM/​|12000mAh]] (hehe, cum sa nu), 3.7V 
-  * Suport ​acumulator +  * Modul port USB: prin care se poate conecta o tastatura la dispozitiv 
-  * Modul port USB +  * <​del>​Dioda Schottky: plasata dupa modulul ​de incarcare, pentru a nu lasa tensiunea de 5V de pe VSYS sa ajunga la pinii bateriei si sa distruga portul USB de pe PC.</​del>​ - inlocuita cu un P-MOSFET (asa cum este recomandat in sectiunea 3.6 din [[https://​datasheets.raspberrypi.com/​picow/​pico-w-datasheet.pdf|datasheet-ul de la pico]], pentru a avea un voltage drop mai mic de la VBAT la VSYS)
-  * 1 x dioda schottky +
-  * Fire de legatura +
-  * Cablaj ​de test+
 ===== Software Design ===== ===== Software Design =====
  
  
-Prima problemă ​care trebuie ​rezolvată ​este citirea pachetelor USB care sunt generate atunci ​când se apasă ​pe taste. Acest lucru nu este exact trivial, ​întrucât există ​diferite ​convenții ​folosite de diferite tastaturi pentru comunicarea prin USB. Există însă ​biblioteca TinyUSB [10],  +Prima problema ​care trebuie ​rezolvata ​este citirea pachetelor USB care sunt generate atunci ​cand se apasa pe taste. Acest lucru nu este exact trivial, ​intrucat exista ​diferite ​conventii ​folosite de diferite tastaturi pentru comunicarea prin USB. Exista insa biblioteca TinyUSB [10],  
-și implementarea sa pentru microcontrolerul RP2040 [11], care abstractizează ​din complexitatea protocolului. Astfel, se poate folosi capabilitatea de PIO (programmable I/O) a microcontrolerului pentru a adăuga și citi interfete USB suplimentare. Implementarea aceasta este scrisa in C, însă ​majoritatea bibliotecilor destinate microcontrolerului sunt scrise folosind limbajul CircuitPython,​ asa că am modificat exemplul capture_hid_report.c,​ pentru a trimite rapoartele USB printr-o conexiune UART catre un Raspberry pi pico w, programat folosind CircuitPython.+si implementarea sa pentru microcontrolerul RP2040 [11], care abstractizeaza ​din complexitatea protocolului. Astfel, se poate folosi capabilitatea de PIO (programmable I/O) a microcontrolerului pentru a adauga si citi interfete USB suplimentare. Implementarea aceasta este scrisa in C, insa majoritatea bibliotecilor destinate microcontrolerului sunt scrise folosind limbajul CircuitPython,​ asa ca am modificat exemplul capture_hid_report.c,​ pentru a trimite rapoartele USB printr-o conexiune UART catre un Raspberry pi pico w, programat folosind CircuitPython.
  
-Următorul ​pas este parsarea acestor pachete. Formatul pachetelor depinde de asemenea de tipul tastaturii ​și a functionalitatilor sale (5-key rollover vs n-key rollover, diferite taste cu roluri macro/mouse etc.). Implementarea din proiect ia în calcul cazul cel mai simplu: 1 byte care reprezinta tastele modifier (Shift, Alt, Win, Ctrl), ​și un range de bytes care reprezinta tastele ​apăsate ​(care sunt decodați ​folosind [[https://​github.com/​hathach/​tinyusb/​blob/​5e023fa2ca4c20f06b6e0dc12f6f044a7d4e14bd/​src/​class/​hid/​hid.h#​LL1016C19-L1016C19|acest tabel]]). ​Acești ​parametrii sunt specificați în cadrul ​funcției ​care parsează ​pachetele.+Urmatorul ​pas este parsarea acestor pachete. Formatul pachetelor depinde de asemenea de tipul tastaturii ​si a functionalitatilor sale (5-key rollover vs n-key rollover, diferite taste cu roluri macro/mouse etc.). Implementarea din proiect ia in calcul cazul cel mai simplu: 1 byte care reprezinta tastele modifier (Shift, Alt, Win, Ctrl), ​si un range de bytes care reprezinta tastele ​apasate ​(care sunt decodati ​folosind [[https://​github.com/​hathach/​tinyusb/​blob/​5e023fa2ca4c20f06b6e0dc12f6f044a7d4e14bd/​src/​class/​hid/​hid.h#​LL1016C19-L1016C19|acest tabel]]). ​Acesti ​parametrii sunt specificati in cadrul ​functiei ​care parseaza ​pachetele.
  
-Acum că putem citi un text de la tastatură, putem face un API request si recepționa răspunsul. Pentru a putea tasta răspunsul ​la un PC, există ​biblioteca adafruit_hid,​ prin care putem face microcontrolerul ​să se comporte ca o tastaturăRăspunsul ​este tastat pe măsura ​ce este primit de catre microcontroler.+Acum ca putem citi un text de la tastatura, putem face un API request si receptiona raspunsul. Pentru a putea tasta raspunsul ​la un PC, exista ​biblioteca adafruit_hid,​ prin care putem face microcontrolerul ​sa se comporte ca o tastaturaRaspunsul ​este tastat pe masura ​ce este primit de catre microcontroler.
  
-Dorim de asemenea sa afișăm ​textul ​recepționat ​pe un display TFT, pentru acesta ​existând ​bibliotecile displayio (pentru ​interfațarea ​prin SPI), adafruit_ili9341 (pentru ​câteva setări ​specifice display-ului ales), terminalio (pentru a afisa text).+Dorim de asemenea sa afisam ​textul ​receptionat ​pe un display TFT, pentru acesta ​existand ​bibliotecile displayio (pentru ​interfatarea ​prin SPI), adafruit_ili9341 (pentru ​cateva setari ​specifice display-ului ales), terminalio (pentru a afisa text).
  
-În final, pentru a interfața ​cu display-ul, pentru a selecta diferite template-uri (despre care voi vorbi in sectiunea ​funcționalități), vom folosi un encoder rotativ cu buton, care este controlat prin biblioteca rotaryio.+In final, pentru a interfata ​cu display-ul, pentru a selecta diferite template-uri (despre care voi vorbi in sectiunea ​functionalitati), vom folosi un encoder rotativ cu buton, care este controlat prin biblioteca rotaryio.
  
-===== Rezultate ​Obţinute ​=====+===== Rezultate ​Obtinute ​=====
  
 {{pm:​prj2023:​ncaroi:​demo-chatgpt-50.jpg?​500}} {{pm:​prj2023:​ncaroi:​demo-chatgpt-50.jpg?​500}}
Line 66: Line 59:
 {{:​pm:​prj2023:​ncaroi:​chatgpt_insides.jpg?​500|}} {{:​pm:​prj2023:​ncaroi:​chatgpt_insides.jpg?​500|}}
  
-DEMO: https://​youtu.be/​ocueh1Meev0+<​note>​DEMO: https://​youtu.be/​ocueh1Meev0</​note>​
 ===== Concluzii ===== ===== Concluzii =====
  
 +Initial, am plecat cu motivatia de a vedea daca un astfel de proiect este posibil, intrucat, desi partea hardware pare destul de simpla, partea software este relativ complexa si sunt multe puncte in care m-am blocat pe parcursul dezvoltarii,​ iar in final a fost foarte satisfacator sa vad ca proiectul chiar functioneaza.
 ===== Download ===== ===== Download =====
  
Line 76: Line 70:
 ===== Jurnal ===== ===== Jurnal =====
  
-<note tip> + 
-Puteți avea și o secțiune ​de jurnal în care să poată urmări asistentul de proiect progresul proiectului+5.05.2023 – pagina ocw, documentatie initiala 
-</​note>​+ 
 +10.05.2023 - prototip initial pe breadboard + functionalitati ​de baza 
 + 
 +18.05.2023 - finalizare implementare hardware 
 + 
 +26.05.2023 - finalizare implementare software 
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
pm/prj2023/ncaroi/plug.1685298259.txt.gz · Last modified: 2023/05/28 21:24 by andrei.niculae1004
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0