Käyttäen Grafiikan perusohjaus STONE-sarjanäytöstä voit piirtää viivoja, kolmioita, polygoneja, suorakulmioita, neliöitä, ympyröitä, kaaria, täyttövärejä, leikata ja liittää ja niin edelleen.
Varhaisen oppimiskoneen suunnittelu sarjakosketusnäytöllä STVI056WT-01, muotojen tunnistaminen kuvia katsomalla, sanojen tunnistaminen värien mukaan ja viihdemuodon suunnittelu oikeiden virheiden määrittämiseksi, pisteytyksen tai tason läpäisemiseksi, jotta lapset oppivat tunnistamaan värejä, ymmärtämään perusmuotoja ja oppimaan niitä vastaavat sanat rennosti ja leikkisästi.
Virallinen videoesitys ei kerro Basic-grafiikkaohjaimen todellista vaikutusta, joten tämä demo täydentää sitä. Piirustusohjeet välitetään kommunikoinnin kautta arduino ohjauskortti ja STONE sarjatason.
Lisäksi tämä huomautus ei sisällä Basic-grafiikkaohjauksen täydellistä toiminnallista sisältöä, vain kehittelyn käytössä käytetyt toiminnot, tallennetut testataan koneella OK, voit ladata demoajon suoraan.
Demon laitteistoympäristö on esitetty kuvassa 1, kuva 2 ja kuva 3.
STONE:n mukana tulee virallisesti 2 korttia, joista neliönmuotoinen on USB-latauskortti ja pitkä on USB-sarjaviestintäkortti (ja DC12V-virtalähde sarjanäytölle).
(Kuva 1: STONE-sarjanäytön tiedonsiirto- ja virtaliitäntä) (Kuva 2: Kytkentäkaavio Basic Graphics -ohjaustiedostojen lataamiseen STONE-näytöstä)
(Kuva 3: TX, RX, GND-yhteys STONE-sarjanäytön viestintäkortin ja arduino-kehityskortin välillä)
(Kuva 4: Grafiikkaohjauksen peruspiirustusalue ja muuttuva osoite ja muut parametriasetukset)
Kun olet valinnut Basicgraphics-säätimen STONE TOOLBox(GUI Design software) -valikosta Variable Configuration (D) ja asettanut piirustusalueen ja muuttuvan osoitteen parametrit, 0x82-käskyä käytetään kirjoitettaessa asetettuun Variable-muistiosoitteeseen (0x1000 asetetaan tässä). Piirustusalueen ja muuttuvan osoitteen parametrien asettamisen jälkeen 0x82-käskyllä kirjoitetaan CMD + Data_pack_Num_Max + Data asetettuun muuttuvan muistin osoitteeseen (tässä tapauksessa 0x1000) piirustustoimintojen toteuttamiseksi. Tarkka toimintokoodi on esitetty kuvassa 6, jossa on viivapiirroskäsky 0x0002 seuraavan esimerkin avulla.
(Kuva 5: Perusgrafiikkaohjausdatan komentomuoto)
(Kuva 6: Kuva viiva- ja suorakaidekomennoista perusgraafista ohjausta varten)
Viivapiirrosohje 0x0002, käyttöesimerkki.
Mustan viivan yhdistämiseksi koordinaateista (340, 200) koordinaatteihin (585, 200), ohje on
A5 5A 11 82 10 00 00 02 00 01 00 00 01 54 00 C8 02 49 00 C8
Piirrä kolme mustaa viivaa, jotka on suljettu kolmioksi, jossa on kolme kärkeä koordinaateissa (200, 200), (300, 200), (250, 100), ja ohje on
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
Yllä oleva 0x1000 on perusgrafiikkaohjauksen muuttuva osoite, 0x0002 on ohjekoodi, 0x0001 ja 0x0003 ovat 1 rivi ja 3 riviä, 0x0000 on värikoodi, arvo 0000 on musta ja arvo ffff on kirkkaan valkoinen. Muut kunkin pisteen välittömät XY-koordinaatit.
Esimerkki suorakulmion piirtämisestä.
Suorakulmion vasemman yläpisteen koordinaatit (340, 237), oikean alakulman koordinaatit (585, 340) väri musta, komento on
A5 5A 11 82 10 00 00 03 00 01 01 54 00 ED 02 49 01 54 00 00
Piirrä samanaikaisesti kaksi suorakulmiota (340, 237) – (585, 340), (324, 221) – (601, 356), komento on
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
Yllä oleva 0x1000 on perusgrafiikkaohjauksen muuttujaosoite, 0x0003 on suorakulmion komentokoodi, 0x0001, 0x0002 on 1 suorakulmio, 2 suorakulmiota, 0x0000, 0xffff on värikoodi, arvo 0000 on musta, kirkas arvo on fff. valkoinen. Muut ovat kunkin suorakulmion vasemman yläpisteen ja oikean alakulman XY-koordinaatit.
(Kuva 7: Suorakulmion täyttö- ja piirrosympyräkomennot perusgrafiikkaohjaukseen)
Esimerkki suorakaiteen täytöstä.
Mustan suorakulmion täyttö (470, 200) ~ (550) -komento on
A5 5A 11 82 10 00 00 04 00 01 01 D6 00 C8 02 26 00 FF 00 00 00
Esimerkki ympyrän piirtämisestä.
Ympyrän keskipiste (470, 200), R = 50 musta, ohje on
A5 5A 0F 82 10 00 00 05 00 01 01 D6 00 C8 00 32 00 00
Piirrä kaksi ympyrää samanaikaisesti, keskipiste A (470, 200) R=50 ja keskipiste B (256, 200) R=80, molemmat mustalla, komento on
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
(Kuva 8: Kaarikomento perusnäytönohjaimelle)
Kaaren resoluutio on 0.5 astetta, 360 astetta vastaa 720:aa ja 0 astetta on pystysuorassa ylöspäin.
Kaari esimerkki.
Yläkaari 315 astetta alussa – 45 astetta loppuun, ympyrän keskipiste (300, 200) R = 80, musta, komento on
A5 5A 13 82 10 00 00 0B 00 01 00 00 01 2C 00 C8 00 50 02 76 00 5A
Värien suhteen.
0x0000 on musta 0xffff on valkoinen 0x00ff on sininen 0xf000 on punainen 0xfd60 on oranssi
0xff60 on keltainen 0x2f60 on vihreä
(Kuva 9: Grafiikkaohjauksen peruspiirustustaulun parametrit ja osoitteet)
(Kuva 10: Perusgrafiikkaohjaimen väriliitännän piirustustaulun parametrit ja osoitteet)
Muuttujan osoitteen mukaan komento täyttää vihreä väri kohteille (10, 80) ~ (630, 400) on
A5 5A 11 82 60 00 00 04 00 01 00 0A 00 50 02 76 01 90 2f 60
Muita yhtäläisyyksiä, katso lisätietoja ohjelmakoodista.
Videolla esitetty koodi on seuraava.
/*
frank10
STONE ja arduino COMM, perusgrafiikka pelaa ohjelmassa..
Sytyttää LEDin yhdeksi sekunniksi, sitten sammuu sekunniksi toistuvasti. LED kertoo, että pehmeä toiminta on ok!
Esimerkissä on kaksi sivua. Sivu1 on muotoinen, sivu2 on värillinen!
Tämä esimerkkikoodi on frank-tiedostossa. 20210625
*/
// Nastassa 13 on LED -valo, joka on kytketty useimpiin Arduino -levyihin.
// anna sille nimi:
int led = 13;
int iYePian = 0; //0x0020: The num of YePian!
//int iGongLu = 0; //0x0180 GongLulle!
//int iLiuLiang = 0; //0x0160 for The now LiuLiang!
int iJiao = 0; // 0x0260 for JieJuJiao!
int iGongLuWater = 0; //0x0280 The Water GongLulle! arvo on 0-50000!
int iLed = 1; //viiveaika num.
int iLed2 = 1; //viiveaika num. 50 ms tekee pisteen.
int iLed3 = 0; //viiveaika num. 50 ms tekee pisteen.
int iLed4 = 0; //viiveaika num. 50 ms tekee pisteen.
int iCurve0 = 0; //käyrän0 arvo. 50 ms tekee pisteen.
int iCurve1 = 0; //käyrän1 arvo,. 50 ms tekee pisteen.
int iFlag0 = 1; // Käyrän lippu0 + tai -; .1 on ylöspäin, 0 on alaspäin.
int iFlag1 = 1; // Käyrän lippu1 + tai -; .1 on ylöspäin, 0 on alaspäin.
int inNum = 0; //lue char num.
int iNum2 = 0; //lue char num2 ShuiDianZhanille!
//int iPower = 2; //avainpatsas 0x0009
//int iMode = 2; //avainpatsas 0x000A
int iPowerWater = 2; //avainpatsas 0x0039
// asennusohjelma suoritetaan kerran, kun painat nollauspainiketta:
tyhjä asennus () {
// alustetaan digitaalinen nasta lähtöön.
pinMode(led, OUTPUT);
Serial.begin(115200); // Avaa sarjaliikennetoiminto ja odota, että sarjaportti avautuu
while (!Serial) {
; // odota, että sarjaportti muodostaa yhteyden. Tarvitaan vain Leonardolle
}
}
// silmukkarutiini jatkuu yhä uudelleen ja uudelleen ikuisesti:
void loop () {
inChar;
/*———————————————————————————-*/
if (iLed == 800) {
//——- lue 0x0039 arvo———-
Serial.write(0xA5); //"A5" on 165
Serial.write(0x5A); //"5A" on 90
Serial.write(0x04); //pituus
Serial.write(0x83); // lukea!
Serial.write(0x00); // ShuiDianZhanin virtanäppäimen osoite!
Serial.write(0x39); // ShuiDianZhan-virtanäppäimen osoite!
Serial.write(0x01); // 0x0039 (virtapainike)
//———STONE-palautusarvo on "A5 5A 06 83 00 39 01 00 01"——
}
// Lue sarjaportin lähettämät tiedot:
if (Serial.available() > 0) { inChar = Serial.read(); }
/*
säästää bak.
koska sillä voi olla lukuavain ja avaimen työ.
Ohjelma on käyttöliittymä, jonka syötteen avain tekee peplose-työn.
*/
//—————————————————————————————
//—————————-0x0039 avaimen luku alkaa————————————–
if (inChar == 0x39) { inNum2 = 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; //virta päälle!
iJiao = 0;
iGongLuWater = 0;
}
}
if ((inChar == 0x02)&&(iNum2 == 3)) {
iNum2 = 0;
iPowerWater = 2; //virta pois!
}
//——————0x0039-avain lue ok! iPowerWater ok!—————————--
//—————————————————————————————
viive (1);
iLed += 1;
iLed2 += 1; // 50 ms tekee pisteen.
//———————————————————————————————–
//———————————50 ms aloittaa pisteen—————————————–
if (iLed2 == 50) {
iLed2 = 1;
iLed4 += 1; // 50 ms tekee pisteen.
if(iFlag0 == 1){
iCurve0 += 1; // 50 ms tekee pisteen.
if(iCurve0 >= 150){
iFlag0 = 0; // iCurve0 sammuu!.
}
}
if(iFlag0 == 0){
iCurve0 -= 1; // 50 ms tekee pisteen.
if(iCurve0 <= 1){
iFlag0 = 1; // iCurve0 ilmestyy!.
}
}
if(iFlag1 == 1){
if(iLed4 >= 3){
iCurve1 += 1; // 50 ms tekee pisteen.
iLed4 = 0;
}
if(iCurve1 >= 50){
iFlag1 = 0; // iCurve1 sammuu!.
}
}
if(iFlag1 == 0){
if(iLed4 >= 3){
iLed4 = 0;
iCurve1 -= 1; // 50 ms tekee pisteen.
}
if(iCurve1 <= 1){
iFlag1 = 1; // iCurve1 ilmestyy!.
}
}
Serial.write(0xA5); //"A5" on 165
Serial.write(0x5A); //"5A" on 90
Serial.write(0x06);
Serial.write(0x84); //kirjoita käyrälle!
Serial.write(0x03); // Kaareva polku,
Serial.write(iCurve0); // N=1,
Serial.write(0x00);
Serial.write(iCurve1);
Serial.write(0x00);
}
//——————————-50ms tekee pisteen loppuun——————————————
//———————————————————————————————--
if (iLed == 500) {
digitalWrite(led, HIGH); // laita LED päälle (HIGH on jännitetaso)
//viive(500); // odota hetki, Alue:200-2000
}
if (iLed >= 1000) {
digitalWrite(led, LOW); // sammuta LED asettamalla jännitteen LOW
//viive(500); // odota hetki, alue:200-2000
iLed = 1;
if( iNum <= 6 ) iNum += 1; //muodon käännös!
if(iNum == 6) iNum = 0; //muodon käännös!
//—————————————Punainen alkaa——————————————–
if( iNum == 1){ // kolmio! ja punainen!
Serial.write(0xA5); //"A5" on 165
Serial.write(0x5A); //"5A" on 90
Serial.write(0x19);
Serial.write(0x82);
Serial.write(0x10); // Perusgrafiikan osoiteH
Serial.write(0x00); // Perusgrafiikan osoiteL
Serial.write(0x00); // Tee rivi CMD
Serial.write(0x02); // Tee rivi CMD
Serial.write(0x00); // rivin numero
Serial.write(0x03); // Rivin numero.
Serial.write(0x00); //väriH musta
Serial.write(0x00); //väriL
Serial.write(0x00); // piste X1H
Serial.write(0xc8); // pisteX1L
Serial.write(0x00); // piste Y1H
Serial.write(0xc8); // pisteY1L
Serial.write(0x01); // piste X2H
Serial.write(0x2C); // pisteX2L.
Serial.write(0x00); // piste Y2H
Serial.write(0xC8); // pisteY2L
Serial.write(0x00); // piste X3H
Serial.write(0xFA); // pisteX3L
Serial.write(0x00); // piste Y3H
Serial.write(0x64); // pisteY3L
Serial.write(0x00); // piste X1H
Serial.write(0xc8); // pisteX1L
Serial.write(0x00); // piste Y1H
Serial.write(0xc8); // pisteY1L
//täyttää--
Serial.write(0xA5); //"A5" on 165
Serial.write(0x5A); //"5A" on 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x60); // Perusgrafiikkasivun osoiteH2
Serial.write(0x00); // Basic graphics pabe2:n osoiteL
Serial.write(0x00); // Älä täytä suorakulmio CMD
Serial.write(0x04); // Älä täytä suorakulmio CMD
Serial.write(0x00); // suorakulmion numero
Serial.write(0x01); // Suorakulmion numero
Serial.write(0x00); // piste X1H
Serial.write(0x0A); // pisteX1L
Serial.write(0x00); // piste Y1H
Serial.write(0x50); // pisteY1L
Serial.write(0x02); // piste X2H
Serial.write(0x76); // pisteX2L.
Serial.write(0x01); // piste Y2H
Serial.write(0x90); // pisteY2L
Serial.write(0xF0); // Punainen väriH
Serial.write(0x00); // Punainen väriL
}
//—————————————Punainen on loppu——————————————–
//—————————————Keltainen ja kaari alkaa——————————————–
if( iNum == 2){ // kaari! ja keltainen!
Serial.write(0xA5); //"A5" on 165
Serial.write(0x5A); //"5A" on 90
Serial.write(0x13);
Serial.write(0x82);
Serial.write(0x10); // Perusgrafiikkasivun osoiteH1
Serial.write(0x00); // Basic graphics pabe1:n osoiteL
Serial.write(0x00); // Tee kaari CMD
Serial.write(0x0B); // Tee kaari CMD
Serial.write(0x00); // kaaren numero
Serial.write(0x01); // Kaaren numero.
Serial.write(0x00); // väri H musta
Serial.write(0x00); // väriL tyhjä
Serial.write(0x01); // ympyrän XH keskus
Serial.write(0x2c); // XL ympyrän keskipiste
Serial.write(0x00); // ympyrän keskusta YH
Serial.write(0xc8); // ympyrän keskus YL
Serial.write(0x00); // RH
Serial.write(0x50); // RL.
Serial.write(0x02); // Kulma1H
Serial.write(0x76); // Kulma1L
Serial.write(0x00); // Kulma2H
Serial.write(0x5A); // Kulma2L
//täyttää--
Serial.write(0xA5); //"A5" on 165
Serial.write(0x5A); //"5A" on 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x60); // Perusgrafiikkasivun osoiteH2
Serial.write(0x00); // Basic graphics pabe2:n osoiteL
Serial.write(0x00); // Älä täytä suorakulmio CMD
Serial.write(0x04); // Älä täytä suorakulmio CMD
Serial.write(0x00); // suorakulmion numero
Serial.write(0x01); // Suorakulmion numero
Serial.write(0x00); // piste X1H
Serial.write(0x0A); // pisteX1L
Serial.write(0x00); // piste Y1H
Serial.write(0x50); // pisteY1L
Serial.write(0x02); // piste X2H
Serial.write(0x76); // pisteX2L.
Serial.write(0x01); // piste Y2H
Serial.write(0x90); // pisteY2L
Serial.write(0xFF); // Keltainen väriH
Serial.write(0x60); // Keltainen väriL
}
//—————————————Keltainen ja kaari on loppu——————————————–
//—————————————Vihreä ja suorakulmio alkavat——————————————–
if( iNum == 3){ // suorakulmio! ja vihreä!
Serial.write(0xA5); //"A5" on 165
Serial.write(0x5A); //"5A" on 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x10); // Perusgrafiikkasivun osoiteH1
Serial.write(0x00); // Basic graphics pabe1:n osoiteL
Serial.write(0x00); // Tee suorakulmio CMD
Serial.write(0x03); // Tee suorakulmio CMD
Serial.write(0x00); // suorakulmion numero
Serial.write(0x01); // Suorakulmion numero
Serial.write(0x01); // piste X1H
Serial.write(0x54); // pisteX1L
Serial.write(0x00); // piste Y1H
Serial.write(0xED); // pisteY1L
Serial.write(0x02); // piste X2H
Serial.write(0x49); // pisteX2L.
Serial.write(0x01); // piste Y2H
Serial.write(0x54); // pisteY2L
Serial.write(0x00); // väri H musta
Serial.write(0x00); // väriL tyhjä
//täyttää--
Serial.write(0xA5); //"A5" on 165
Serial.write(0x5A); //"5A" on 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x60); // Perusgrafiikkasivun osoiteH2
Serial.write(0x00); // Basic graphics pabe2:n osoiteL
Serial.write(0x00); // Älä täytä suorakulmio CMD
Serial.write(0x04); // Älä täytä suorakulmio CMD
Serial.write(0x00); // suorakulmion numero
Serial.write(0x01); // Suorakulmion numero
Serial.write(0x00); // piste X1H
Serial.write(0x0A); // pisteX1L
Serial.write(0x00); // piste Y1H
Serial.write(0x50); // pisteY1L
Serial.write(0x02); // piste X2H
Serial.write(0x76); // pisteX2L.
Serial.write(0x01); // piste Y2H
Serial.write(0x90); // pisteY2L
Serial.write(0x2F); // Vihreä väriH
Serial.write(0x60); // Vihreä väriL
}
//————————————— Vihreä ja suorakulmio on loppu——————————————–
//—————————————Oranssi ja neliö alkavat——————————————–
if( iNum == 4){ // neliö! ja oranssi!
Serial.write(0xA5); //"A5" on 165
Serial.write(0x5A); //"5A" on 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x10); // Perusgrafiikkasivun osoiteH1
Serial.write(0x00); // Basic graphics pabe1:n osoiteL
Serial.write(0x00); // Tee suorakulmio CMD
Serial.write(0x03); // Tee suorakulmio CMD
Serial.write(0x00); // suorakulmion numero
Serial.write(0x01); // Suorakulmion numero
Serial.write(0x01); // piste X1H
Serial.write(0x54); // pisteX1L
Serial.write(0x00); // piste Y1H
Serial.write(0x91); // pisteY1L
Serial.write(0x02); // piste X2H
Serial.write(0x49); // pisteX2L.
Serial.write(0x01); // piste Y2H
Serial.write(0x86); // pisteY2L
Serial.write(0x00); // väri H musta
Serial.write(0x00); // väriL tyhjä
//täyttää--
Serial.write(0xA5); //"A5" on 165
Serial.write(0x5A); //"5A" on 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x60); // Perusgrafiikkasivun osoiteH2
Serial.write(0x00); // Basic graphics pabe2:n osoiteL
Serial.write(0x00); // Älä täytä suorakulmio CMD
Serial.write(0x04); // Älä täytä suorakulmio CMD
Serial.write(0x00); // suorakulmion numero
Serial.write(0x01); // Suorakulmion numero
Serial.write(0x00); // piste X1H
Serial.write(0x0A); // pisteX1L
Serial.write(0x00); // piste Y1H
Serial.write(0x50); // pisteY1L
Serial.write(0x02); // piste X2H
Serial.write(0x76); // pisteX2L.
Serial.write(0x01); // piste Y2H
Serial.write(0x90); // pisteY2L
Serial.write(0xFD); // oranssi väriH
Serial.write(0x60); // oranssi väriL
}
//—————————————Oranssi ja neliö on loppu——————————————–
//————————————– Sininen ja ympyrä alkaa——————————————–
if( iNum == 5){ // ympyrä! ja sininen!
Serial.write(0xA5); //"A5" on 165
Serial.write(0x5A); //"5A" on 90
Serial.write(0x0F);
Serial.write(0x82);
Serial.write(0x10); // Perusgrafiikkasivun osoiteH1
Serial.write(0x00); // Basic graphics pabe1:n osoiteL
Serial.write(0x00); // Ympyröi CMD
Serial.write(0x05); // Ympyröi CMD
Serial.write(0x00); // ympyrän numero
Serial.write(0x01); // Ympyrän numero
Serial.write(0x01); // ympyrän XH keskus
Serial.write(0xD6); // XL ympyrän keskipiste
Serial.write(0x00); // ympyrän keskusta YH
Serial.write(0xc8); // ympyrän keskus YL
Serial.write(0x00); // RH
Serial.write(0x32); // RL.
Serial.write(0x00); // väri H musta
Serial.write(0x00); // väriL tyhjä
//täyttää--
Serial.write(0xA5); //"A5" on 165
Serial.write(0x5A); //"5A" on 90
Serial.write(0x11);
Serial.write(0x82);
Serial.write(0x60); // Perusgrafiikkasivun osoiteH2
Serial.write(0x00); // Basic graphics pabe2:n osoiteL
Serial.write(0x00); // Älä täytä suorakulmio CMD
Serial.write(0x04); // Älä täytä suorakulmio CMD
Serial.write(0x00); // suorakulmion numero
Serial.write(0x01); // Suorakulmion numero
Serial.write(0x00); // piste X1H
Serial.write(0x0A); // pisteX1L
Serial.write(0x00); // piste Y1H
Serial.write(0x50); // pisteY1L
Serial.write(0x02); // piste X2H
Serial.write(0x76); // pisteX2L.
Serial.write(0x01); // piste Y2H
Serial.write(0x90); // pisteY2L
Serial.write(0x00); // sininen väriH
Serial.write(0xFF); // sininen väriL
}
//————————————— Sininen ja ympyrä on loppu——————————————–
Lopuksi verkkovirheenkorjaus.
STONE TOOLBox (GUI Design -ohjelmisto) muokkaa näytön tiedostojen latausta, arduino-kooditiedostojen latausta, kytkee virtalähteen, yhteyden, virran päälle tarkkailemaan kuvan piirustusta ja värin muutosta halutun vaikutuksen saavuttamiseksi.
Videolla esitetty koodi on seuraava.
(verkkoviritysyritykset)
Lähde: Platon Data Intelligence