This is an old revision of the document!


Plug & Play ChatGPT

Student: Niculae Andrei

Grupa: 334CC

Introducere

Obiectivul principal al proiectului consta in integrarea unui API al unui AI precum ChatGPT in workflow-ul unui developer, intr-o maniera plug & play.

Concret, proiectul consta intr-un dispozitiv pe care il poti conecta la PC, care poate asculta si decoda pachetele USB trimise de o tastatura, se conecteaza la internet si poate face un API request pentru ChatGPT, iar raspunsul primit il tasteaza la PC, ca si cum ar fi tastat de o tastatura normala.

De asemenea, el poate functiona si in mod standalone, conectand doar tastatura, fiind alimentat de un acumulator, iar procesul este acelasi, insa raspunsul primit il afiseaza pe un display TFT.

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.

Descriere generală

Schema bloc - mod middleman

Schema bloc - mod standalone

Functionalitati:

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. 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:”.

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.

Hardware Design

În cadrul proiectului am folosit următoarele 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 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 a diferitelor comenzi dintr-un meniu.
  • 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ă circuitul, folosind acumulatorul, in mod standalone.
  • Acumulator 18650 Rakieta: cu capacitatea de 12000mAh (hehe, cum sa nu), 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 bateriei și să distrugă portul USB de pe PC. - inlocuita cu un P-MOSFET (asa cum este recomandat in sectiunea 3.6 din datasheet-ul de la pico, pentru a avea un voltage drop mai mic de la VBAT la VSYS)

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], ș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.

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.

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.

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).

Î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.

Rezultate Obţinute

Concluzii

Download

Jurnal

5.05.2023 – pagina ocw, documentatie initiala

10.05.2023 - prototip initial pe breadboard + functionalitati de baza

18.05.2023 - finalizare implementare hardware

26.05.2023 - finalizare implementare software

Bibliografie/Resurse

pm/prj2023/ncaroi/plug.1685300069.txt.gz · Last modified: 2023/05/28 21:54 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