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:55]
andrei.niculae1004
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}}
  
-Funcționalitatea ​de bază a proiectului a fost de a avea un dispozitiv plug & play, care poate fi folosit pentru a accesa ​funcționalitățile ​unui API precum ChatGPT, pe orice PC și in orice aplicație ​de pe acesta - de exemplu, pentru a face refactoring/​documentare pe o bucată ​de cod, pentru a genera cod boilerplate,​ pentru a corecta/​reformula o secțiune ​dintr-un text, pentru a scrie un template de e-mail, traduceri de text, sau pur si simplu pentru a afla o informație nouăîntr-un mod mai rapid decât dacă am deschide browser-ul. Acest lucru se face prin apăsarea ​unui shortcut predefinit, tastarea ​interogării ​care sa fie trimisă ​la API și apoi tastarea ​răspunsului ​de către ​microcontroler. Atunci ​când nu se ascultă ​interogarea,​ controlerul pur și simplu ​redirecționează ​pachetele USB către ​PC. In modul simplu, microcontrolerul poate primi doar date de la tastatura, ​însă ​putem extinde ​funcționalitațile ​daca rulăm ​un script batch pe PC, care ne lasă sa trimitem un text selectat pe calculator ​către ​microcontroler,​ prin monitorul serial. +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 exemplu, pentru 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-mail, traduceri de text, sau pur si simplu pentru a afla o informatie nouaintr-un mod mai rapid decat daca am deschide browser-ul. Acest lucru se face prin apasarea ​unui shortcut predefinit, tastarea ​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. 
-Folosind display-ului TFT, pentru a selecta diferite prompt-uri, care să fie inserate ​înaintea ​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:"​.+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:"​.
  
-Adaugarea display-ului a dus la crearea modului standalone: dispozitivul ​să poată ​fi folosit ​și în cazul în care nu există ​acces la un calculator, iar din câteva ​teste, am observat ​că acesta are o autonomie de ~3 ore.+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.
  
 ===== Hardware Design ===== ===== Hardware Design =====
 {{pm:​prj2023:​ncaroi:​schema_electrica.png?​700}} {{pm:​prj2023:​ncaroi:​schema_electrica.png?​700}}
  
-În cadrul proiectului am folosit ​următoarele ​componente:  +In cadrul proiectului am folosit ​urmatoarele ​componente:  
-  * Raspberry pi pico: care rulează ​un program care folosește ​biblioteca TinyUSB pentru a recepționa ​pachetele USB de la tastatura +  * Raspberry pi pico: care ruleaza ​un program care foloseste ​biblioteca TinyUSB pentru a receptiona ​pachetele USB de la tastatura 
-  * 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 +  * 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": utilizat pentru ​afișarea răspunsurilor ​sau a diferitelor comenzi dintr-un meniu. +  * Display TFT 2.0": utilizat pentru ​afisarea raspunsurilor ​sau a diferitelor comenzi dintr-un meniu. 
-  * Encoder rotativ cu buton OKY3431-4: folosit pentru selectarea ​opțiunilor ​din meniu. +  * Encoder rotativ cu buton OKY3431-4: folosit pentru selectarea ​optiunilor ​din meniu. 
-  * Modul încărcare ​acumulator OKY3404: ​încarcă ​acumulatorul atunci ​când dispozitivul este conectat la PC, sau alimentează ​circuitul, folosind acumulatorul,​ in mod standalone.+  * Modul incarcare ​acumulator OKY3404: ​incarca ​acumulatorul atunci ​cand dispozitivul este conectat la PC, sau alimenteaza ​circuitul, folosind acumulatorul,​ in mod standalone.
   * 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   * 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
   * Modul port USB: prin care se poate conecta o tastatura la dispozitiv   * 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 bateriei ​și să distrugă ​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)+  * <​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)
 ===== 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 59: 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 =====
  
pm/prj2023/ncaroi/plug.1685300112.txt.gz · Last modified: 2023/05/28 21:55 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