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:05]
andrei.niculae1004 [Software Design]
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-mail, traduceri de text, sau 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 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. 
-  * 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 tastaturapentru 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 requestsafiș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 PC, sau alimentează circuitulfolosind acumulatorul,​ in mod standalone. +
-  * Acumulator 18650: cu capacitatea de 3800mAh, 3.7V +
-  * Modul port USB: prin care se poate conecta o tastatura ​la dispozitiv +
-  * 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.+
 ===== 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 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 =====
 +
 +https://​datasheets.raspberrypi.com/​picow/​pico-w-datasheet.pdf
  
  ​https://​github.com/​hathach/​tinyusb ​  ​https://​github.com/​hathach/​tinyusb ​
Line 87: Line 89:
  
  ​https://​github.com/​hathach/​tinyusb/​blob/​5e023fa2ca4c20f06b6e0dc12f6f044a7d4e14bd/​src/​class/​hid/​hid.h#​LL1016C19-L1016C19  ​https://​github.com/​hathach/​tinyusb/​blob/​5e023fa2ca4c20f06b6e0dc12f6f044a7d4e14bd/​src/​class/​hid/​hid.h#​LL1016C19-L1016C19
 +
 +https://​www.youtube.com/​watch?​v=wdgULBpRoXk
 +
 +https://​stackoverflow.com/​questions/​74711107/​openai-api-continuing-conversation
 +
 +https://​blog.smittytone.net/​2022/​02/​16/​pico-usb-serial-communications-with-circuitpython/​
  
 <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​ <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​
pm/prj2023/ncaroi/plug.1685297150.txt.gz · Last modified: 2023/05/28 21:05 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