Każdy chyba słyszał już o ChatGPT, ale czy słyszeliście o ChatPDF? ChatPDF to narzędzie pozwalające na odbycie tytułowej "pogawędki" z plikiem PDF. W tym temacie spróbuję wykorzystać je do wyszukania informacji w nocie katalogowej pewnego expandera portów, zobaczymy jaki będzie tego skutek. Czyżby nadchodziła epoka w której elektronicy nie będą czytali not katalogowych, bo AI to zrobi za nich? Przekonajmy się!
Eksperyment - nota katalogowa MCP23017
Zatem wrzucamy PDF i rozmawiamy - zobaczymy, co te AI potrafi. Na pierwszy ogień poszedł expander portów z interfejsem I2C, MCP23017.
Po wczytaniu dokumentu AI od razu opisuje czym ten dokument jest:
Chat napisał:
Hello and welcome to the MCP23017/MCP23S17 PDF file! This document provides detailed information about the features and specifications of these 16-bit remote bidirectional I/O ports. With high-speed I/O interfaces, configurable interrupt output pins, and low standby current, these devices offer versatile and efficient solutions for your project needs.
Example questions:
What are the different package types available for the MCP23017/MCP23S17 devices?
How can the interrupt output pins be configured on these I/O ports?
What is the operating voltage range for the MCP23017/MCP23S17 devices in different temperature conditions?
Pora na pierwsze pytanie. Może zapytamy o sekcję adresową:
Czy AI jest w stanie "zrozumieć" jak tworzy się te adresy?
p.kaczmarek2 napisał:
Which I2C addresses can have this chip?
Chat napisał:
The MCP23017/MCP23S17 devices support 7-bit slave addressing for I2C communication. The slave address consists of four fixed bits and three user-defined hardware address bits (pins A2, A1, and A0). Therefore, with these three address pins, you can configure up to eight different I2C addresses for the chip.
By setting the states of pins A2, A1, and A0, you can select one of the following I2C addresses for the MCP23017/MCP23S17 devices:
0b0100000 (A2=0, A1=0, A0=0)
0b0100001 (A2=0, A1=0, A0=1)
0b0100010 (A2=0, A1=1, A0=0)
0b0100011 (A2=0, A1=1, A0=1)
0b0100100 (A2=1, A1=0, A0=0)
0b0100101 (A2=1, A1=0, A0=1)
0b0100110 (A2=1, A1=1, A0=0)
0b0100111 (A2=1, A1=1, A0=1)
These addresses allow you to communicate with multiple MCP23017/MCP23S17 devices on the same I2C bus by assigning unique addresses to each device .
W odpowiedzi pojawił się też link do strony 15:
Dla czytelności, sam dodałem spacje:
0b010 0000 (A2=0, A1=0, A0=0)
0b010 0001 (A2=0, A1=0, A0=1)
0b010 0010 (A2=0, A1=1, A0=0)
0b010 0011 (A2=0, A1=1, A0=1)
0b010 0100 (A2=1, A1=0, A0=0)
0b010 0101 (A2=1, A1=0, A0=1)
0b010 0110 (A2=1, A1=1, A0=0)
0b010 0111 (A2=1, A1=1, A0=1)
Odpowiedź jest całkiem niezła. AI poprawnie podało adresy 7-bitowe, ciekawe, czy też pamięta o bicie Read/Write?
p.kaczmarek2 napisał:
Assume that I want to write data to this chip via I2C with A2, A1 and A0 high. Which byte would I need to send first?
Oczekuję odpowiedzi z rozpiską bitów, a co otrzymam?
Chat napisał:
If you want to write data to the MCP23017/MCP23S17 chip via I2C with A2, A1, and A0 set to high, you would need to send the control byte first. The control byte consists of the 7-bit slave address (including the R/W bit) followed by the register address you want to write to.
For the MCP23017/MCP23S17 devices with A2, A1, and A0 set to high, the slave address in binary form would be 0b0100111 (A2=1, A1=1, A0=1). Since this is a write operation, the R/W bit would be 0.
Therefore, the control byte you would need to send first for writing data to the MCP23017/MCP23S17 chip with A2, A1, and A0 high would be:
Slave Address: 0b01001110 (R/W = 0)
After sending this control byte, you can proceed with sending the data bytes to write to the desired registers on the MCP23017/MCP23S17 chip
Całkiem nieźle! Rozdzielmy sobie:
0b010 0111 (A2=1, A1=1, A0=1).
Tu AI poprawnie dopisało bit R/W, w tym przypadku zerowy:
Slave Address: 0b0100 1110 (R/W = 0)
To teraz zapytajmy o połączenia. Przekonajmy się, czy AI wie np. o rezystorach pull-up:
p.kaczmarek2 napisał:
Ok, can you specify how can I connect MCP23017 via I2C to Arduino UNO? Which signals do I need to connect, do I need to connect anything else?
Odpowiedź (w formie obrazka ze względu na formatowanie):
Czyli AI pamiętało o:
- zasilaniu i masie
- SDA i SCL (poprawnie podało piny A4 i A5 Arduino)
- o pinach adresowych A0, A1, A2
- a nawet o rezystorach pull-up
- dodatkowo powtórzyło o zasilaniu
Może dopytajmy o zasilanie:
p.kaczmarek2 napisał:
How to power this circuit, do I need any extra components?
Odpowiedź:
AI pamięta, że jest mowa o Arduino i niejawnie sobie założyło, że chodzi o Arduino UNO, co jest raczej poprawnym założeniem. AI też pamięta o kondensatorach odsprzęgających.
Ciekawe co AI zrobi, jak zmienię zdanie.
p.kaczmarek2 napisał:
I changed my mind. I want to use Arduino Mega instead. How can I connect MCP23017 to Arduino Mega?
Oczekuję odpowiedzi zgodnej z tym:
No i taką dostałem:
To świadczy o tym, że ten model językowy po prostu zna wyprowadzenia Arduino Mega.
p.kaczmarek2 napisał:
Ok, on Arduino Mega, can you show a sample code that will set MCP23017 GPA1 to high state and all other port A pins to low state?
Odpowiedź:
Kod jako tekst:
Kod: C / C++
Nie mam takiej konfiguracji sprzętu by to odpalić, ale co my tu mamy... do IOCON AI nic nie wpisało, ale ustawia rejestry odpowiedzialne za PORT A. Nie ustawia rezystorów pull up (trzeci rejestr), ale adresy się zgadzają, też patrzę na biblioteki obsługi MCP z Github:
Wygląda ok...
To sprawdźmy jeszcze, czy AI wie jak ustawić rezystor pull up:
Wygląda ok.
To może coś trudniejszego - spróbujmy przerzucić kod na platformę mikroC dla PIC. Tu jest dokumentacja tamtejszej biblioteki I2C:
https://download.mikroe.com/documents/compilers/mikroc/pic/help/i2c_library.htm
Zobaczmy, co AI wygenerowało:
No i tu jest problem. Nie wydaje mi się, by można było to zrobić wszystko w jednej transakcji I2C. Jeszcze gdyby kolejne bajty miały być umieszczane na kolejne rejestry w pamięci (poprzez autoinkrementacje wskaźnika), to by to przeszło, ale przecież tu chcemy pisać do osobnych rejestrów. Zresztą, nawet ten tryb trzeba by włączyć:
No nie przekonuje mnie ten kod. Obawiam się, że to tak nie zadziała, a jak Wy myślicie?
Podsumowanie
Zasadniczo mam dwa wnioski:
- ten model językowy rzeczywiście jest w stanie znaleźć informacje w PDF
- ten model językowy posiada też dość pokaźny zbiór wiedzy spoza podanego PDF, wie np. które piny Arduino to I2C, itd, zna mniej więcej biblioteki Arduino
Natomiast model nie jest idealny i jak to zwykle bywa "halucynuje" bądź "zmyśla", w przypadku mniej znanych języków bądź problemów może tworzyć odpowiedzi wyglądające na poprawne ale w rzeczywistości nie działające.
Mimo wszystko, ciekawe jak to będzie wyglądać za rok czy tam za 10 lat, zapraszam do komentowania. Czy widzicie potencjał w takim "AI pomocniku" do czytania not katalogowych?
Fajne? Ranking DIY Pomogłem? Kup mi kawę.