Uporaba Osnovni grafični nadzor na serijskem zaslonu STONE lahko rišete črte, trikotnike, mnogokotnike, pravokotnike, kvadrate, kroge, loke, barve za polnjenje, izrežete in prilepite itd.
Zasnova zgodnjega učnega stroja z uporabo serijskega zaslona na dotik STVI056WT-01, za prepoznavanje oblik s pogledom na slike, za prepoznavanje besed glede na barve in za oblikovanje razvedrilnega formata za ugotavljanje pravilnih napak, točkovanje ali prehod ravni, da se otroci naučijo prepoznavati barve, razumeti osnovne oblike in se na sproščen in igriv način naučiti ustreznih besed.
Uradna video predstavitev ne daje dejanskega učinka osnovnega grafičnega nadzora, zato ga bo ta demo dopolnil. Navodila za risanje se prenašajo s komunikacijo med arduino nadzorna plošča in KAMNO serijsko meliščen.
Poleg tega ta opomba ne vključuje celotne funkcionalne vsebine osnovnega grafičnega nadzora, le funkcije, uporabljene pri uporabi izdelave, posneto so testirane na stroju OK, lahko neposredno prenesete demo zagon.
Okolje strojne opreme za demonstracijo je prikazano na sliki 1, sliki 2 in sliki 3.
STONE ima uradno 2 plošči, med katerimi je kvadratna plošča za prenos USB, dolga pa je plošča za serijsko komunikacijo USB (in DC12V napajalnik za serijski zaslon).
(Slika 1: Komunikacija in napajalna povezava serijskega zaslona STONE) (Slika 2: Diagram povezave za prenos osnovnih grafičnih kontrolnih datotek z zaslona STONE)
(Slika 3: TX, RX, GND povezava med STONE serijsko zaslonsko komunikacijsko ploščo in razvojno ploščo arduino)
(Slika 4: Osnovno grafično krmilno območje za risanje in spremenljiv naslov ter druge nastavitve parametrov)
Po izbiri krmilnika Basicgraphics v meniju STONE TOOLBox (programska oprema za načrtovanje GUI) Konfiguracija spremenljivke (D) in nastavitvi risalnega območja in parametrov spremenljivega naslova se uporabi navodilo 0x82 za zapisovanje na nastavljen naslov spremenljivega pomnilnika (tu je nastavljen 0x1000) Po nastavitvi parametrov območja risanja in spremenljivega naslova se z navodilom 0x82 zapiše CMD + Data_pack_Num_Max + Data v nastavljen naslov spremenljivega pomnilnika (v tem primeru 0x1000), da se dokonča izvajanje funkcij risanja. Posebna koda funkcije je prikazana na sliki 6, kjer je navodilo za risanje črte 0x0002, z uporabo naslednjega primera.
(Slika 5: Format ukaza za osnovni grafični nadzor)
(Slika 6: Ilustracija ukazov za risanje črte in pravokotnika za osnovni grafični nadzor)
Navodilo za risanje črt 0x0002, primer uporabe.
Za povezavo črne črte od koordinat (340, 200) do koordinat (585, 200) je navodilo
A5 5A 11 82 10 00 00 02 00 01 00 00 01 54 00 C8 02 49 00 C8
Nariši tri črne črte, zaprte v trikotnik s tremi oglišči v koordinatah (200, 200), (300, 200), (250, 100), in navodilo je
A5 5A 19 82 10 00 00 02 00 03 00 00 00 00 C8 00 C8 01 2C 00 C8 00 FA 00 64 00 C8 00 C8
Zgornji 0x1000 je spremenljiv naslov osnovnega grafičnega nadzora, 0x0002 je koda navodil, 0x0001 in 0x0003 sta 1 vrstica oziroma 3 vrstice, 0x0000 je barvna koda, vrednost 0000 je črna in vrednost ffff je svetlo bela. Druge trenutne koordinate XY vsake točke.
Primer risanja pravokotnika.
Koordinate zgornjega levega pravokotnika (340, 237), spodnje desne koordinate oglišča (585, 340) črna barva, ukaz je
A5 5A 11 82 10 00 00 03 00 01 01 54 00 ED 02 49 01 54 00 00
Istočasno nariši dva pravokotnika (340, 237) – (585, 340), (324, 221) – (601, 356), ukaz je
A5 5A 1B 82 10 00 00 03 00 02 01 54 00 ED 02 49 01 54 00 00 01 44 00 DD 02 59 01 64 FF FF
Zgornji 0x1000 je spremenljiv naslov osnovnega grafičnega nadzora, 0x0003 je koda ukaza pravokotnika, 0x0001, 0x0002 sta 1 pravokotnik, 2 pravokotnika, 0x0000, 0xffff je barvna koda, vrednost 0000 je svetlobna vrednost fff črna belo. Druge so koordinate XY zgornjega levega oglišča in spodnjega desnega oglišča vsakega pravokotnika.
(Slika 7: Ukazi za polnjenje pravokotnika in risanje kroga za osnovni grafični nadzor)
Primer polnjenja pravokotnika.
Ukaz za polnjenje črnega pravokotnika (470, 200) ~ (550, 255) je
A5 5A 11 82 10 00 00 04 00 01 01 D6 00 C8 02 26 00 FF 00 00 00
Primer risanja kroga.
Središče kroga (470, 200), R = 50 črno, navodilo je
A5 5A 0F 82 10 00 00 05 00 01 01 D6 00 C8 00 32 00 00
Če želite narisati dva kroga hkrati, središče A (470, 200) R=50 in središče B (256, 200) R=80, oba v črni barvi, je ukaz
A5 5A 17 82 10 00 00 05 00 02 01 D6 00 C8 00 32 00 00 01 00 00 C8 00 50 00 00
(Slika 8: Ukaz Arc za osnovni grafični nadzor)
Ločljivost loka je 0.5 stopinje, 360 stopinj ustreza 720, 0 stopinj pa je v navpični smeri navzgor.
Primer loka.
Zgornji lok 315 stopinj do začetka – 45 stopinj do konca, središče kroga (300, 200) R = 80, črno, ukaz je
A5 5A 13 82 10 00 00 0B 00 01 00 00 01 2C 00 C8 00 50 02 76 00 5A
Glede barv.
0x0000 je črna 0xffff je bela 0x00ff je modra 0xf000 je rdeča 0xfd60 je oranžna
0xff60 je rumena 0x2f60 je zelena
(Slika 9: Parametri in naslovi risalne plošče vmesnika osnovne grafične krmilne oblike)
(Slika 10: Parametri risalne plošče in naslovi barvnega vmesnika Basic Grafic Control)
Glede na naslov spremenljivke je ukaz za polnjenje zelene barve za (10, 80) ~ (630, 400)
A5 5A 11 82 60 00 00 04 00 01 00 0A 00 50 02 76 01 90 2f 60
Druge podobnosti, glejte programsko kodo za podrobnosti.
Koda, prikazana v videoposnetku, je naslednja.
/*
frank10
STONE in arduino COMM, osnovna grafika se igra v programu..
Vklopi LED za eno sekundo, nato pa za eno sekundo večkrat ugasne. LED nam pove, da je mehki tek v redu!
Vzorec ima dve strani. Stran1 je oblika, stran2 je barva!
Ta primer kode je v datoteki frank. 20210625
*/
// Pin 13 ima LED priključeno na večino Arduino plošč.
// daj mu ime:
int led = 13;
int iYePian = 0; //0x0020 za število YePian!
//int iGongLu = 0; //0x0180 za The GongLu!
//int iLiuLiang = 0; //0x0160 za zdaj LiuLiang!
int iJiao = 0; // 0x0260 za The JieJuJiao!
int iGongLuWater = 0; //0x0280 za The Water GongLu! vrednost je 0-50000!
int iLed = 1; //čas zakasnitve št.
int iLed2 = 1; //čas zakasnitve št. 50 ms naredi točko.
int iLed3 = 0; //čas zakasnitve št. 50 ms naredi točko.
int iLed4 = 0; //čas zakasnitve št. 50 ms naredi točko.
int iCurve0 = 0; //Vrednost krivulje0. 50 ms naredi točko.
int iCurve1 = 0; //Vrednost krivulje1,. 50 ms naredi točko.
int iFlag0 = 1; // Zastava krivulje0 + ali -; .1 je gor, 0 je dol.
int iFlag1 = 1; // Zastava krivulje1 + ali -; .1 je gor, 0 je dol.
int iNum = 0; //preberite v char num.
int iNum2 = 0; //preberite v char num2 za ShuiDianZhan!
//int iPower = 2; // kip ključa 0x0009
//int iMode = 2; // kip ključa 0x000A
int iPowerWater = 2; // kip ključa 0x0039
// nastavitvena rutina se enkrat zažene, ko pritisnete reset:
nična namestitev () {
// inicializiramo digitalni pin kot izhod.
pinMode (LED, IZHOD);
Serial.begin(115200); // Odprite funkcijo serijske komunikacije in počakajte, da se odprejo serijska vrata
medtem ko (!Serial) {
; // počakajte, da se serijska vrata povežejo. Potreben samo za Leonarda
}
}
// rutina zanke se vedno znova ponavlja:
void loop () {
int inChar;
/*———————————————————————————*/
če (iLed == 800) {
//——- preberi vrednost 0x0039———-
Serial.write(0xA5); //”A5″ je 165
Serial.write(0x5A); //"5A" je 90
Serial.write(0x04); //dolžina
Serial.write(0x83); // preberi!
Serial.write(0x00); // naslov ključa ShuiDianZhan Power!
Serial.write(0x39); // naslov ključa za vklop ShuiDianZhan!
Serial.write(0x01); // 0x0039 (tipka za vklop)
//———Vrnjena vrednost STONE bo "A5 5A 06 83 00 39 01 00 01 "——
}
// Preberite informacije, ki jih pošlje serijska vrata:
if (Serial.available() > 0) { inChar = Serial.read(); }
/*
prihrani bak.
ker lahko ima ključ za branje in ima delo ključa.
program je HMI, ki ključ za vnos opravlja delo peplose.
*/
//—————————————————————————————
//—————————-0x0039 začetek branja ključa—————————————
if (inChar == 0x39) { iNum2 = 1; }
if ((inChar == 0x01)&&(iNum2 == 1)) { iNum2 = 2 ; }
if ((inChar == 0x00)&&(iNum2 == 2)) { iNum2 = 3 ; }
če ((inChar == 0x01)&&(iNum2 == 3)) {
iNum2 = 0;
if(iPowerWater != 1){
iPowerWater = 1; //vklop!
iJiao = 0;
iGongLuWater = 0;
}
}
če ((inChar == 0x02)&&(iNum2 == 3)) {
iNum2 = 0;
iPowerWater = 2; //ugasniti!
}
//——————0x0039 ključ preberi v redu! iPowerWater v redu!——————————-
//—————————————————————————————
zakasnitev (1);
iLed += 1;
iLed2 += 1; // 50 ms naredi točko.
//————————————————————————————————
// ----------- 50ms to točko začne -------------
če (iLed2 == 50) {
iLed2 = 1;
iLed4 += 1; // 50 ms naredi točko.
if(iFlag0 == 1){
iCurve0 += 1; // 50 ms naredi točko.
if(iCurve0 >= 150){
iFlag0 = 0; // iCurve0 zavrti navzdol!.
}
}
if(iFlag0 == 0){
iCurve0 -= 1; // 50 ms naredi točko.
if(iCurve0 <= 1){
iFlag0 = 1; // Pojavi se iCurve0!.
}
}
if(iFlag1 == 1){
if(iLed4 >= 3){
iCurve1 += 1; // 50 ms naredi točko.
iLed4 = 0;
}
if(iCurve1 >= 50){
iFlag1 = 0; // iCurve1 zavrti navzdol!.
}
}
if(iFlag1 == 0){
if(iLed4 >= 3){
iLed4 = 0;
iCurve1 -= 1; // 50 ms naredi točko.
}
if(iCurve1 <= 1){
iFlag1 = 1; // Pojavi se iCurve1!.
}
}
Serial.write(0xA5); //”A5″ je 165
Serial.write(0x5A); //"5A" je 90
Serial.write(0x06);
Serial.write(0x84); // piši v krivuljo!
Serial.write(0x03); // Pot krivulje,
Serial.write(iCurve0); // N=1,
Serial.write(0x00);
Serial.write(iCurve1);
Serial.write(0x00);
}
//———————————-50ms do konca točke——————————————
//————————————————————————————————
če (iLed == 500) {
digitalWrite(led, HIGH); // vklopi LED (HIGH je nivo napetosti)
//zakasnitev (500); // počakajte sekundo, razpon: 200-2000
}
če (iLed >= 1000) {
digitalWrite(led, LOW); // ugasnite LED tako, da nastavite napetost NIZKA
//zakasnitev (500); // počakajte sekundo, razpon: 200-2000
iLed = 1;
if( iNum <= 6 ) iNum += 1; //obrni obliko!
if( iNum == 6 ) iNum = 0; //obrni obliko!
//—————————————Rdeča je začetek———————————————
if( iNum == 1){ // trikotnik! in rdeče!
Serial.write(0xA5); //”A5″ je 165
Serial.write(0x5A); //"5A" je 90
Serial.write(0x19);
Serial.write(0x82);
Serial.write(0x10); // naslovH osnovne grafike
Serial.write(0x00); // naslovL osnovne grafike
Serial.write(0x00); // Naredi vrstico CMD
Serial.write(0x02); // Naredi vrstico CMD
Serial.write(0x00); // številka vrstice
Serial.write(0x03); // Številka vrstice.
Serial.write(0x00); //barvaH črna
Serial.write(0x00); //barvaL
Serial.write(0x00); // točka X1H
Serial.write(0xc8); // točka X1L
Serial.write(0x00); // točka Y1H
Serial.write(0xc8); // točka Y1L
Serial.write(0x01); // točka X2H
Serial.write(0x2C); // točka X2L.
Serial.write(0x00); // točka Y2H
Serial.write(0xC8); // točka Y2L
Serial.write(0x00); // točka X3H
Serial.write(0xFA); // točka X3L
Serial.write(0x00); // točka Y3H
Serial.write(0x64); // točkaY3L
Serial.write(0x00); // točka X1H
Serial.write(0xc8); // točka X1L
Serial.write(0x00); // točka Y1H
Serial.write(0xc8); // točka Y1L
//napolni—–
Serial.write(0xA5); //”A5″ je 165
Serial.write(0x5A); //"5A" je 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x60); // naslovH osnovne grafične strani2
Serial.write(0x00); // naslovL osnovne grafike pabe2
Serial.write(0x00); // Izpolni pravokotnik CMD
Serial.write(0x04); // Izpolni pravokotnik CMD
Serial.write(0x00); // številka pravokotnika
Serial.write(0x01); // Številka pravokotnika
Serial.write(0x00); // točka X1H
Serial.write(0x0A); // točka X1L
Serial.write(0x00); // točka Y1H
Serial.write(0x50); // točkaY1L
Serial.write(0x02); // točka X2H
Serial.write(0x76); // točka X2L.
Serial.write(0x01); // točka Y2H
Serial.write(0x90); // točkaY2L
Serial.write(0xF0); // Rdeča barvaH
Serial.write(0x00); // Rdeča barvaL
}
//——————————————Rdeča je konec———————————————
//——————————————Rumena in lok se začne———————————————
if( iNum == 2){ // lok! in rumena!
Serial.write(0xA5); //”A5″ je 165
Serial.write(0x5A); //"5A" je 90
Serial.write(0x13);
Serial.write(0x82);
Serial.write(0x10); // naslovH osnovne grafične strani1
Serial.write(0x00); // naslovL osnovne grafike pabe1
Serial.write(0x00); // Naredi lok CMD
Serial.write(0x0B); // Naredi lok CMD
Serial.write(0x00); // številka loka
Serial.write(0x01); // Številka loka.
Serial.write(0x00); // barvaH črna
Serial.write(0x00); // barvaL prazna
Serial.write(0x01); // središče kroga XH
Serial.write(0x2c); // središče kroga XL
Serial.write(0x00); // središče kroga YH
Serial.write(0xc8); // središče kroga YL
Serial.write(0x00); // RH
Serial.write(0x50); // RL.
Serial.write(0x02); // Kot1H
Serial.write(0x76); // Kot1L
Serial.write(0x00); // Kot2H
Serial.write(0x5A); // Kot2L
//napolni—–
Serial.write(0xA5); //”A5″ je 165
Serial.write(0x5A); //"5A" je 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x60); // naslovH osnovne grafične strani2
Serial.write(0x00); // naslovL osnovne grafike pabe2
Serial.write(0x00); // Izpolni pravokotnik CMD
Serial.write(0x04); // Izpolni pravokotnik CMD
Serial.write(0x00); // številka pravokotnika
Serial.write(0x01); // Številka pravokotnika
Serial.write(0x00); // točka X1H
Serial.write(0x0A); // točka X1L
Serial.write(0x00); // točka Y1H
Serial.write(0x50); // točkaY1L
Serial.write(0x02); // točka X2H
Serial.write(0x76); // točka X2L.
Serial.write(0x01); // točka Y2H
Serial.write(0x90); // točkaY2L
Serial.write(0xFF); // Rumena barvaH
Serial.write(0x60); // Rumena barvaL
}
//——————————————Rumena in lok je konec———————————————
//————————————— Zelena in pravokotnik se začneta———————————————
if( iNum == 3){ // pravokotnik! in zeleno!
Serial.write(0xA5); //”A5″ je 165
Serial.write(0x5A); //"5A" je 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x10); // naslovH osnovne grafične strani1
Serial.write(0x00); // naslovL osnovne grafike pabe1
Serial.write(0x00); // Naredite pravokotnik CMD
Serial.write(0x03); // Naredite pravokotnik CMD
Serial.write(0x00); // številka pravokotnika
Serial.write(0x01); // Številka pravokotnika
Serial.write(0x01); // točka X1H
Serial.write(0x54); // točka X1L
Serial.write(0x00); // točka Y1H
Serial.write(0xED); // točka Y1L
Serial.write(0x02); // točka X2H
Serial.write(0x49); // točka X2L.
Serial.write(0x01); // točka Y2H
Serial.write(0x54); // točkaY2L
Serial.write(0x00); // barvaH črna
Serial.write(0x00); // barvaL prazna
//napolni—–
Serial.write(0xA5); //”A5″ je 165
Serial.write(0x5A); //"5A" je 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x60); // naslovH osnovne grafične strani2
Serial.write(0x00); // naslovL osnovne grafike pabe2
Serial.write(0x00); // Izpolni pravokotnik CMD
Serial.write(0x04); // Izpolni pravokotnik CMD
Serial.write(0x00); // številka pravokotnika
Serial.write(0x01); // Številka pravokotnika
Serial.write(0x00); // točka X1H
Serial.write(0x0A); // točka X1L
Serial.write(0x00); // točka Y1H
Serial.write(0x50); // točkaY1L
Serial.write(0x02); // točka X2H
Serial.write(0x76); // točka X2L.
Serial.write(0x01); // točka Y2H
Serial.write(0x90); // točkaY2L
Serial.write(0x2F); // Zelena barvaH
Serial.write(0x60); // Zelena barvaL
}
//————————————— Zelena in pravokotnik je konec———————————————
//——————————————Oranžna in kvadrat se začneta———————————————
if( iNum == 4){ // kvadrat! in oranžna!
Serial.write(0xA5); //”A5″ je 165
Serial.write(0x5A); //"5A" je 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x10); // naslovH osnovne grafične strani1
Serial.write(0x00); // naslovL osnovne grafike pabe1
Serial.write(0x00); // Naredite pravokotnik CMD
Serial.write(0x03); // Naredite pravokotnik CMD
Serial.write(0x00); // številka pravokotnika
Serial.write(0x01); // Številka pravokotnika
Serial.write(0x01); // točka X1H
Serial.write(0x54); // točka X1L
Serial.write(0x00); // točka Y1H
Serial.write(0x91); // točkaY1L
Serial.write(0x02); // točka X2H
Serial.write(0x49); // točka X2L.
Serial.write(0x01); // točka Y2H
Serial.write(0x86); // točkaY2L
Serial.write(0x00); // barvaH črna
Serial.write(0x00); // barvaL prazna
//napolni—–
Serial.write(0xA5); //”A5″ je 165
Serial.write(0x5A); //"5A" je 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x60); // naslovH osnovne grafične strani2
Serial.write(0x00); // naslovL osnovne grafike pabe2
Serial.write(0x00); // Izpolni pravokotnik CMD
Serial.write(0x04); // Izpolni pravokotnik CMD
Serial.write(0x00); // številka pravokotnika
Serial.write(0x01); // Številka pravokotnika
Serial.write(0x00); // točka X1H
Serial.write(0x0A); // točka X1L
Serial.write(0x00); // točka Y1H
Serial.write(0x50); // točkaY1L
Serial.write(0x02); // točka X2H
Serial.write(0x76); // točka X2L.
Serial.write(0x01); // točka Y2H
Serial.write(0x90); // točkaY2L
Serial.write(0xFD); // oranžna barvaH
Serial.write(0x60); // oranžna barvaL
}
//—————————————Oranžna in kvadrat je konec———————————————
//——————————————Modra in krog se začne———————————————
if( iNum == 5){ // krog! in modra!
Serial.write(0xA5); //”A5″ je 165
Serial.write(0x5A); //"5A" je 90
Serial.write(0x0F);
Serial.write(0x82);
Serial.write(0x10); // naslovH osnovne grafične strani1
Serial.write(0x00); // naslovL osnovne grafike pabe1
Serial.write(0x00); // Obkroži CMD
Serial.write(0x05); // Obkroži CMD
Serial.write(0x00); // številka kroga
Serial.write(0x01); // Številka kroga
Serial.write(0x01); // središče kroga XH
Serial.write(0xD6); // središče kroga XL
Serial.write(0x00); // središče kroga YH
Serial.write(0xc8); // središče kroga YL
Serial.write(0x00); // RH
Serial.write(0x32); // RL.
Serial.write(0x00); // barvaH črna
Serial.write(0x00); // barvaL prazna
//napolni—–
Serial.write(0xA5); //”A5″ je 165
Serial.write(0x5A); //"5A" je 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x60); // naslovH osnovne grafične strani2
Serial.write(0x00); // naslovL osnovne grafike pabe2
Serial.write(0x00); // Izpolni pravokotnik CMD
Serial.write(0x04); // Izpolni pravokotnik CMD
Serial.write(0x00); // številka pravokotnika
Serial.write(0x01); // Številka pravokotnika
Serial.write(0x00); // točka X1H
Serial.write(0x0A); // točka X1L
Serial.write(0x00); // točka Y1H
Serial.write(0x50); // točkaY1L
Serial.write(0x02); // točka X2H
Serial.write(0x76); // točka X2L.
Serial.write(0x01); // točka Y2H
Serial.write(0x90); // točkaY2L
Serial.write(0x00); // modra barvaH
Serial.write(0xFF); // modra barvaL
}
//——————————————Modra in krog je konec———————————————
Končno, spletno odpravljanje napak.
STONE TOOLBox (programska oprema za oblikovanje GUI) bo uredil prenos datoteke zaslona, nalaganje datoteke kode arduino, priključil napajalnik, komunikacijo, vklopil, da bo opazoval risbo slike in spremembo barve, da bi dosegel želeni učinek.
Koda, prikazana v videoposnetku, je naslednja.
(poskusi spletne nastavitve)
Vir: Plato Data Intelligence