az Alapvető grafikus vezérlés A STONE soros képernyőn vonalakat, háromszögeket, sokszögeket, téglalapokat, négyzeteket, köröket, íveket rajzolhat, színeket tölthet ki, kivághat és beilleszthet stb.
Korai tanuló gép tervezése az STVI056WT-01 soros érintőképernyővel, alakzatok azonosítására a képek alapján, szavak színek szerinti felismerésére, valamint szórakoztató formátum tervezésére a helyes hibák meghatározásához, pontozáshoz vagy szint eléréséhez, hogy a gyerekek lazán, játékosan megtanulják felismerni a színeket, megértsék az alapvető formákat és megtanulják a megfelelő szavakat.
A hivatalos videóbemutató nem adja meg a Basic grafikus vezérlés tényleges hatását, ezért ez a bemutató kiegészíti azt. A rajzoláshoz szükséges utasítások a következő kommunikáción keresztül kerülnek továbbításra arduino vezérlőpanel és a STONE soros esztrichn.
Ezen túlmenően ez a megjegyzés nem tartalmazza a Basic grafikus vezérlő teljes funkcionális tartalmát, csak a kidolgozás használatánál használt funkciókat, a rögzítetteket a gépen teszteljük OK, közvetlenül letölthető a demo futtatás.
A demó hardverkörnyezete az 1., 2. és 3. ábrán látható.
A STONE hivatalosan 2 kártyával érkezik, amelyek közül a négyzetes egy USB letöltőkártya, a hosszú pedig egy USB-soros kommunikációs kártya (és DC12V tápegység a soros képernyőhöz).
(1. ábra: STONE soros képernyő kommunikációja és tápcsatlakozása) (2. ábra: Csatlakozási rajz Basic Graphics vezérlőfájlok letöltéséhez a STONE képernyőről)
(3. ábra: TX, RX, GND kapcsolat a STONE soros képernyős kommunikációs kártya és az arduino fejlesztőkártya között)
(4. ábra: Alapvető grafikus vezérlő rajzterület és változó cím és egyéb paraméterbeállítások)
Miután a STONE TOOLBox (GUI Design szoftver) menü Variable Configuration (D) menüjében kiválasztotta a Basicgraphics vezérlőt, és beállította a rajzterületet és a változó cím paramétereit, a 0x82 utasítással ír a beállított Változó memóriacímre (itt 0x1000 van beállítva). A rajzterület és a változó cím paramétereinek beállítása után a 0x82 utasítással a CMD + Data_pack_Num_Max + Data a beállított Változó memóriacímre (ebben az esetben 0x1000) írható a rajzi funkciók megvalósításának befejezéséhez. A konkrét funkciókód a 6. ábrán látható, ahol van egy 0x0002 vonalrajzi utasítás, a következő példával.
(5. ábra: Alapvető grafikus vezérlőadat-parancsformátum)
(6. ábra: A vonal és a téglalap rajzolási parancsainak illusztrációja az alapvető grafikus vezérléshez)
Vonalrajzolási utasítás 0x0002, használati példa.
A koordináták (340, 200) és a koordináták (585, 200) fekete vonalának összekapcsolásához az utasítás:
A5 5A 11 82 10 00 00 02 00 01 00 00 01 54 00 C8 02 49 00 C8
Rajzoljon három fekete vonalat háromszögbe zárva, amelynek három csúcsa a koordinátákon (200, 200), (300, 200), (250, 100), és az utasítás:
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
A fenti 0x1000 a Basic grafikus vezérlés változó címe, 0x0002 az utasításkód, 0x0001 és 0x0003 1 sor, illetve 3 sor, 0x0000 a színkód, a 0000 fekete, az ffff érték pedig élénk fehér. Az egyes pontok további azonnali XY koordinátái.
Példa téglalap rajzolására.
Téglalap bal felső csúcskoordinátái (340, 237), jobb alsó csúcskoordinátái (585, 340) fekete színűek, a parancs
A5 5A 11 82 10 00 00 03 00 01 01 54 00 ED 02 49 01 54 00 00
Egyszerre rajzoljon két téglalapot (340, 237) – (585, 340), (324, 221) – (601, 356), a parancs:
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
A fenti 0x1000 a Basic grafikus vezérlés változó címe, 0x0003 a téglalap parancskód, 0x0001, 0x0002 1 téglalap, 2 téglalap, 0x0000, 0xffff a színkód, 0000 fff értéke fekete, fényes értéke fff fehér. A többi az egyes téglalapok bal felső és jobb alsó csúcsának XY koordinátái.
(7. ábra: Téglalap kitöltési és körrajzolási parancsok az alapvető grafikus vezérléshez)
Példa a téglalap kitöltésére.
A fekete téglalap kitöltése (470, 200) ~ (550) parancs
A5 5A 11 82 10 00 00 04 00 01 01 D6 00 C8 02 26 00 FF 00 00 00
Példa kör rajzolására.
A kör középpontja (470, 200), R = 50 fekete, az utasítás az
A5 5A 0F 82 10 00 00 05 00 01 01 D6 00 C8 00 32 00 00
Két kör egyidejű megrajzolásához az A középpont (470, 200) R=50 és a B középpont (256, 200) R=80, mindkettő feketével, a parancs:
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
(8. ábra: Ív parancs az alapvető grafikus vezérléshez)
Az ívfelbontás 0.5 fok, a 360 fok 720-nak felel meg, a 0 fok pedig függőleges felfelé mutató.
Ív példa.
A felső ív 315 fok az elejétől – 45 fok a végéig, a kör közepe (300, 200) R = 80, fekete, a parancs
A5 5A 13 82 10 00 00 0B 00 01 00 00 01 2C 00 C8 00 50 02 76 00 5A
A színekkel kapcsolatban.
0x0000 fekete 0xffff fehér 0x00ff kék 0xf000 piros 0xfd60 narancs
A 0xff60 sárga, a 0x2f60 pedig zöld
(9. ábra: Alapvető grafikus vezérlő alakzat interfész rajztábla paraméterei és címei)
(10. ábra: A Basic grafikus vezérlő színfelületének rajztábla paraméterei és címei)
A változó címének megfelelően a zöld szín kitöltésének parancsa (10, 80) ~ (630, 400)
A5 5A 11 82 60 00 00 04 00 01 00 0A 00 50 02 76 01 90 2f 60
Egyéb hasonlóságok, részletekért lásd a programkódot.
A videóban bemutatott kód a következő.
/*
frank10
A STONE és az arduino COMM, az alap grafikus játék a programban.
Egy LED-et egy másodpercre felkapcsol, majd egy másodpercre többször is kikapcsol. A LED jelzi, hogy a lágy futás rendben van!
A mintának két oldala van. Az 1. oldal alak, a 2. oldal szín!
Ez a példakód a frank fájlban található. 20210625
*/
// A 13. érintkező LED-je a legtöbb Arduino táblára csatlakozik.
// adjon nevet:
int led = 13;
int iYePian = 0; //0x0020 a The num of YePian!
//int iGongLu = 0; //0x0180 a The GongLu!
//int iLiuLiang = 0; //0x0160 a The now LiuLiang!
int iJiao = 0; // 0x0260 a The JieJuJiao!
int iGongLuWater = 0; //0x0280 – The Water GongLu! értéke 0-50000!
int iLed = 1; //késleltetési idő sz.
int iLed2 = 1; //késleltetési idő sz. Az 50 ms egy jót tesz.
int iLed3 = 0; //késleltetési idő sz. Az 50 ms egy jót tesz.
int iLed4 = 0; //késleltetési idő sz. Az 50 ms egy jót tesz.
int iGörbe0 = 0; //A görbe0 értéke. Az 50 ms egy jót tesz.
int iGörbe1 = 0; //A görbe1 értéke,. Az 50 ms egy jót tesz.
int iFlag0 = 1; // A görbe zászlója0 + vagy -; .1 felfelé, 0 lefelé.
int iFlag1 = 1; // A görbe zászlója1 + vagy -; .1 felfelé, 0 lefelé.
int iNum = 0 ; //olvasd be a char num.
int iNum2 = 0; //olvassa el a char num2-ben a ShuiDianZhan számára!
//int iPower = 2; //kulcs szobor 0x0009
//int iMode = 2; //kulcs szobor 0x000A
int iPowerWater = 2; //kulcs szobor 0x0039
// a beállítási rutin egyszer fut, amikor megnyomja a reset gombot:
void setup () {
// inicializálja a digitális tűt kimenetként.
pinMode(led, OUTPUT);
Serial.begin(115200); // Nyissa meg a soros kommunikációs funkciót, és várja meg, amíg megnyílik a soros port
while (!Serial) {
; // várja meg a soros port csatlakozását. Csak Leonardonak kell
}
}
// a ciklus rutin örökké újra és újra fut:
void loop () {
int inChar;
/*——————————————————————————-*/
if (iLed == 800) {
//——- 0x0039 érték beolvasása———-
Serial.write(0xA5); //"A5" a 165
Serial.write(0x5A); //"5A" a 90
Serial.write(0x04); //hosszúság
Serial.write(0x83); // olvas!
Serial.write(0x00); // a ShuiDianZhan bekapcsológomb címe!
Serial.write(0x39); // a ShuiDianZhan bekapcsológomb címe!
Serial.write(0x01); // 0x0039 (bekapcsológomb)
//———A STONE visszatérési értéke „A5 5A 06 83 00 39 01 00 01”——
}
// Olvassa el a soros port által küldött információkat:
if (Serial.available() > 0) { inChar = Serial.read(); }
/*
ments meg egy bakot.
mert lehet olvasási kulcsa és kulcsműve.
a program egy HMI, amelynek beviteli kulcsa peplose munkát végez.
*/
//————————————————————————————
//—————————-0x0039 kulcs olvasás kezdete————————————–
if (inChar == 0x39) { iNum2 = 1 ; }
if ((inChar == 0x01)&&(iNum2 == 1)) { iNum2 = 2 ; }
if ((inChar == 0x00)&&(iNum2 == 2)) { iNum2 = 3 ; }
if ((inChar == 0x01)&&(iNum2 == 3)) {
iNum2 = 0;
if(iPowerWater != 1){
iPowerWater = 1; //bekapcsolás!
iJiao = 0;
iGongLuWater = 0 ;
}
}
if ((inChar == 0x02)&&(iNum2 == 3)) {
iNum2 = 0;
iPowerWater = 2; //kikapcsolni!
}
//——————0x0039 kulcs olvasható rendben! iPowerWater rendben!—————————--
//————————————————————————————
késleltetés (1);
iLed += 1;
iLed2 += 1; // Az 50 ms jót tesz.
//——————————————————————————————–
//———————————50 ms pont kezdődik—————————————–
if (iLed2 == 50) {
iLed2 = 1;
iLed4 += 1; // Az 50 ms jót tesz.
if(iFlag0 == 1){
iGörbe0 += 1; // Az 50 ms jót tesz.
if(iGörbe0 >= 150){
iFlag0 = 0; // Az iCurve0 lefelé!.
}
}
if(iFlag0 == 0){
iGörbe0 -= 1; // Az 50 ms jót tesz.
if(iGörbe0 <= 1){
iFlag0 = 1; // Az iCurve0 felbukkan!.
}
}
if(iFlag1 == 1){
if(iLed4 >= 3){
iGörbe1 += 1; // Az 50 ms jót tesz.
iLed4 = 0;
}
if(iGörbe1 >= 50){
iFlag1 = 0; // Az iCurve1 lefelé!.
}
}
if(iFlag1 == 0){
if(iLed4 >= 3){
iLed4 = 0;
iGörbe1 -= 1; // Az 50 ms jót tesz.
}
if(iGörbe1 <= 1){
iFlag1 = 1; // Az iCurve1 felbukkan!.
}
}
Serial.write(0xA5); //"A5" a 165
Serial.write(0x5A); //"5A" a 90
Serial.write(0x06);
Serial.write(0x84); //görbére írd!
Serial.write(0x03); // A görbe útja,
Serial.write(iCurve0); N=1,
Serial.write(0x00);
Serial.write(iCurve1);
Serial.write(0x00);
}
//——————————-50 ms a pont végén——————————————
//——————————————————————————————--
if (iLed == 500) {
digitalWrite(led, HIGH); // bekapcsolja a LED-et (HIGH a feszültségszint)
//delay(500); // várjon egy másodpercet, Tartomány: 200-2000
}
if (iLed >= 1000) {
digitalWrite(led, LOW); // kapcsolja ki a LED-et azáltal, hogy a feszültséget LOW
//delay(500); // várjon egy másodpercet, tartomány: 200-2000
iLed = 1;
if( iNum <= 6 ) iNum += 1; //forma fordulat!
if( iNum == 6 ) iNum = 0; //forma fordulat!
//————————————– Kezdődik a piros——————————————–
if( iNum == 1){ // háromszög! és piros!
Serial.write(0xA5); //"A5" a 165
Serial.write(0x5A); //"5A" a 90
Serial.write(0x19);
Serial.write(0x82);
Serial.write(0x10); // Basic grafika címe
Serial.write(0x00); // Basic grafika címe
Serial.write(0x00); // Végezze el a CMD sort
Serial.write(0x02); // Végezze el a CMD sort
Serial.write(0x00); // a sor száma
Serial.write(0x03); // A sor száma.
Serial.write(0x00); //színH fekete
Serial.write(0x00); //színL
Serial.write(0x00); // X1H pont
Serial.write(0xc8); // pontX1L
Serial.write(0x00); // Y1H pont
Serial.write(0xc8); // pontY1L
Serial.write(0x01); // X2H pont
Serial.write(0x2C); // pontX2L.
Serial.write(0x00); // Y2H pont
Serial.write(0xC8); // pontY2L
Serial.write(0x00); // X3H pont
Serial.write(0xFA); // pontX3L
Serial.write(0x00); // Y3H pont
Serial.write(0x64); // pontY3L
Serial.write(0x00); // X1H pont
Serial.write(0xc8); // pontX1L
Serial.write(0x00); // Y1H pont
Serial.write(0xc8); // pontY1L
//tölt--
Serial.write(0xA5); //"A5" a 165
Serial.write(0x5A); //"5A" a 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x60); // Az alapvető grafikai oldal 2. címe
Serial.write(0x00); // Az alapgrafika pabe2 címeL
Serial.write(0x00); // CMD téglalap kitöltése
Serial.write(0x04); // CMD téglalap kitöltése
Serial.write(0x00); // a téglalap száma
Serial.write(0x01); // A téglalap száma
Serial.write(0x00); // X1H pont
Serial.write(0x0A); // pontX1L
Serial.write(0x00); // Y1H pont
Serial.write(0x50); // pontY1L
Serial.write(0x02); // X2H pont
Serial.write(0x76); // pontX2L.
Serial.write(0x01); // Y2H pont
Serial.write(0x90); // pontY2L
Serial.write(0xF0); // Piros színH
Serial.write(0x00); // Piros színL
}
//————————————–A vörösnek vége——————————————–
//—————————————Kezdődik a sárga és az ív——————————————–
if( iNum == 2){ // ív! és sárga!
Serial.write(0xA5); //"A5" a 165
Serial.write(0x5A); //"5A" a 90
Serial.write(0x13);
Serial.write(0x82);
Serial.write(0x10); // Az alapvető grafikai oldal 1. címe
Serial.write(0x00); // Az alapgrafika pabe1 címeL
Serial.write(0x00); // Do arc CMD
Serial.write(0x0B); // Do arc CMD
Serial.write(0x00); // az ív száma
Serial.write(0x01); // Az ív száma.
Serial.write(0x00); // színH fekete
Serial.write(0x00); // colorL üres
Serial.write(0x01); // az XH kör középpontja
Serial.write(0x2c); // XL kör középpontja
Serial.write(0x00); // YH kör középpontja
Serial.write(0xc8); // YL kör középpontja
Serial.write(0x00); RH
Serial.write(0x50); // RL.
Serial.write(0x02); Szög1H
Serial.write(0x76); // Szög1L
Serial.write(0x00); Szög2H
Serial.write(0x5A); // Szög2L
//tölt--
Serial.write(0xA5); //"A5" a 165
Serial.write(0x5A); //"5A" a 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x60); // Az alapvető grafikai oldal 2. címe
Serial.write(0x00); // Az alapgrafika pabe2 címeL
Serial.write(0x00); // CMD téglalap kitöltése
Serial.write(0x04); // CMD téglalap kitöltése
Serial.write(0x00); // a téglalap száma
Serial.write(0x01); // A téglalap száma
Serial.write(0x00); // X1H pont
Serial.write(0x0A); // pontX1L
Serial.write(0x00); // Y1H pont
Serial.write(0x50); // pontY1L
Serial.write(0x02); // X2H pont
Serial.write(0x76); // pontX2L.
Serial.write(0x01); // Y2H pont
Serial.write(0x90); // pontY2L
Serial.write(0xFF); // Sárga színH
Serial.write(0x60); // Sárga színL
}
//—————————————A sárga és az ív vége——————————————–
//————————————— Kezdődik a zöld és a téglalap——————————————–
if( iNum == 3){ // téglalap! és zöld!
Serial.write(0xA5); //"A5" a 165
Serial.write(0x5A); //"5A" a 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x10); // Az alapvető grafikai oldal 1. címe
Serial.write(0x00); // Az alapgrafika pabe1 címeL
Serial.write(0x00); // Téglalap CMD
Serial.write(0x03); // Téglalap CMD
Serial.write(0x00); // a téglalap száma
Serial.write(0x01); // A téglalap száma
Serial.write(0x01); // X1H pont
Serial.write(0x54); // pontX1L
Serial.write(0x00); // Y1H pont
Serial.write(0xED); // pontY1L
Serial.write(0x02); // X2H pont
Serial.write(0x49); // pontX2L.
Serial.write(0x01); // Y2H pont
Serial.write(0x54); // pontY2L
Serial.write(0x00); // színH fekete
Serial.write(0x00); // colorL üres
//tölt--
Serial.write(0xA5); //"A5" a 165
Serial.write(0x5A); //"5A" a 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x60); // Az alapvető grafikai oldal 2. címe
Serial.write(0x00); // Az alapgrafika pabe2 címeL
Serial.write(0x00); // CMD téglalap kitöltése
Serial.write(0x04); // CMD téglalap kitöltése
Serial.write(0x00); // a téglalap száma
Serial.write(0x01); // A téglalap száma
Serial.write(0x00); // X1H pont
Serial.write(0x0A); // pontX1L
Serial.write(0x00); // Y1H pont
Serial.write(0x50); // pontY1L
Serial.write(0x02); // X2H pont
Serial.write(0x76); // pontX2L.
Serial.write(0x01); // Y2H pont
Serial.write(0x90); // pontY2L
Serial.write(0x2F); // Zöld színH
Serial.write(0x60); // Zöld színL
}
//—————————————A zöld és a téglalap vége——————————————–
//—————————————Kezdődik a narancs és a négyzet——————————————–
if( iNum == 4){ // négyzet! és narancs!
Serial.write(0xA5); //"A5" a 165
Serial.write(0x5A); //"5A" a 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x10); // Az alapvető grafikai oldal 1. címe
Serial.write(0x00); // Az alapgrafika pabe1 címeL
Serial.write(0x00); // Téglalap CMD
Serial.write(0x03); // Téglalap CMD
Serial.write(0x00); // a téglalap száma
Serial.write(0x01); // A téglalap száma
Serial.write(0x01); // X1H pont
Serial.write(0x54); // pontX1L
Serial.write(0x00); // Y1H pont
Serial.write(0x91); // pontY1L
Serial.write(0x02); // X2H pont
Serial.write(0x49); // pontX2L.
Serial.write(0x01); // Y2H pont
Serial.write(0x86); // pontY2L
Serial.write(0x00); // színH fekete
Serial.write(0x00); // colorL üres
//tölt--
Serial.write(0xA5); //"A5" a 165
Serial.write(0x5A); //"5A" a 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x60); // Az alapvető grafikai oldal 2. címe
Serial.write(0x00); // Az alapgrafika pabe2 címeL
Serial.write(0x00); // CMD téglalap kitöltése
Serial.write(0x04); // CMD téglalap kitöltése
Serial.write(0x00); // a téglalap száma
Serial.write(0x01); // A téglalap száma
Serial.write(0x00); // X1H pont
Serial.write(0x0A); // pontX1L
Serial.write(0x00); // Y1H pont
Serial.write(0x50); // pontY1L
Serial.write(0x02); // X2H pont
Serial.write(0x76); // pontX2L.
Serial.write(0x01); // Y2H pont
Serial.write(0x90); // pontY2L
Serial.write(0xFD); // narancssárga színH
Serial.write(0x60); // narancssárga színL
}
//—————————————A narancs és a négyzet vége——————————————–
//————————————— Kezdődik a kék és a kör——————————————–
if( iNum == 5){ // kör! és kék!
Serial.write(0xA5); //"A5" a 165
Serial.write(0x5A); //"5A" a 90
Serial.write(0x0F);
Serial.write(0x82);
Serial.write(0x10); // Az alapvető grafikai oldal 1. címe
Serial.write(0x00); // Az alapgrafika pabe1 címeL
Serial.write(0x00); // Karikázd be a CMD-t
Serial.write(0x05); // Karikázd be a CMD-t
Serial.write(0x00); // a kör száma
Serial.write(0x01); // A kör száma
Serial.write(0x01); // az XH kör középpontja
Serial.write(0xD6); // XL kör középpontja
Serial.write(0x00); // YH kör középpontja
Serial.write(0xc8); // YL kör középpontja
Serial.write(0x00); RH
Serial.write(0x32); // RL.
Serial.write(0x00); // színH fekete
Serial.write(0x00); // colorL üres
//tölt--
Serial.write(0xA5); //"A5" a 165
Serial.write(0x5A); //"5A" a 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x60); // Az alapvető grafikai oldal 2. címe
Serial.write(0x00); // Az alapgrafika pabe2 címeL
Serial.write(0x00); // CMD téglalap kitöltése
Serial.write(0x04); // CMD téglalap kitöltése
Serial.write(0x00); // a téglalap száma
Serial.write(0x01); // A téglalap száma
Serial.write(0x00); // X1H pont
Serial.write(0x0A); // pontX1L
Serial.write(0x00); // Y1H pont
Serial.write(0x50); // pontY1L
Serial.write(0x02); // X2H pont
Serial.write(0x76); // pontX2L.
Serial.write(0x01); // Y2H pont
Serial.write(0x90); // pontY2L
Serial.write(0x00); // kék színH
Serial.write(0xFF); // kék színL
}
//—————————————A kék és a kör vége——————————————–
Végül online hibakeresés.
A STONE TOOLBox (GUI Design szoftver) szerkeszti a képernyőfájl letöltését, az arduino kódfájl feltöltését, csatlakoztatja a tápegységet, a kommunikációt, bekapcsolja a képrajzot és a színváltozást a kívánt hatás elérése érdekében.
A videóban bemutatott kód a következő.
(online tuning próbálkozások)
Forrás: Plato Data Intelligence