Arduino + grafisk display = my brain hurts :(

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
thewho
Inlägg: 1098
Blev medlem: 28 november 2008, 08:46:10
Ort: Finland, Åland

Arduino + grafisk display = my brain hurts :(

Inlägg av thewho »

Tjosan

Håller på (läs: försöker) göra en "instrumentpanel" till motorcykeln då org. inte passar längre :)
Jag har lekt en del med arduinos, mest enkla projekt dock. Kunskapen brister så snabbt när jag försöker göra något mer "avancerat"..
Hur som helst så har jag inte gjort något med grafiska displayer förrän nu. Så hur går man tillväga när man programmerar för dom?
Jag söker inte något jag kan copy & paste'a, utan jag vill lära mig tänket bakom det hela.
För att hålla intresset uppe så lägger jag in en bild. Jag har bara spenderat kvällen på den ännu så klaga inte ;)
Bild

Displayen är en sån här, men det är inte speciellt relevant.
Kort sagt är det en 128 x 64 pixlars monokrom display med seriell anslutning.

Jag vet hur jag skriver text till den, problemen kommer när jag vill "animera" grejer. Som till ex varvtalsvisaren.
Lånar ett par bilder för att illustrera vad jag försöker göra:
Bild
Bild

Jag har sökt och sökt men jag hittar inte någon vettig info om hur man går tillväga. Jag kanske inte använder rätt ord bara?
Någonting jag kommer att tänka på direkt är: Rensar man hela displayen i början av huvudloopen och sen skriver allt igen? (Verkar lite onödigt enligt min hjärna)
Eller rensar man bara relevanta delar av skärmen? (hur?)
Dom frågorna indikerar ju ganska bra på vilken nivå jag ligger på :P

Hoppas någon kan komma med lite tips till en nybörjare :)
Tekko
Inlägg: 9009
Blev medlem: 28 november 2004, 20:19:15

Re: Arduino + gafisk display = my brain hurts :(

Inlägg av Tekko »

Att modifiera instrumentpanalen på bil/mc är så vitt jag vet olagligt, eller borde iaf va pga säkerhes-själ, och att ägaren kan programmera den till att visa annat än verklig hastighet.

Forumet allaboutcircuits.com har bannlyst prat om bla "automotive modifications and enhancements" just pga orolighet kring säkerhet då dess ägare inte vill råka ut för stämning och sånnt om någon medlem utför en mod och sen kör ihjäl sej å dylikt.

Dvs allt utöver att plugga in en mobilladdare i ciggtändaruttaget = låst tråd och en varning.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Arduino + gafisk display = my brain hurts :(

Inlägg av Micke_s »

Tekko: Stor skillnad mellan USA och sverige förvisso.

Det är upp till ägaren att se till att det är lagligt.
Kan även vara en MC för bankörning.

Sedan måste man vara lite trög om man inte uppfattar att hastighetsmätaren visar helt fel...

Åter till frågan:
Jag hade kollat på http://arduino.cc/en/Reference/TFTLibrary
Displayen kan ju beskrivas som en del linjer typ.


Edit: du får nog komplementera TFTlibet med några egna funktioner
ta en titt på:
http://members.chello.at/~easyfilter/bresenham.html
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4694
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Arduino + gafisk display = my brain hurts :(

Inlägg av Swech »

En skärmbild i 128 X 64 monokromt ->128*64 / 8 = 1024 bytes
Det lättaste och säkraste sättet är att ha en buffert på 1024 bytes
som man först suddar och därefter ritar upp bilden i, Då det är klart
skickar man över den till displayen och börjar om från början.

Processorer klagar sällan på repetitiva arbetsuppgifter så trots att det känns "fel" för oss så är det inga problem

Swech
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino + gafisk display = my brain hurts :(

Inlägg av Icecap »

Jag "lekar" med något liknande på jobbet, inte för LCD men för LED.

Likaväl är det som det beskrivs: Man reserverar ett minne med rätt antal pixlar och ritar där, när bilden är klart skickas den till LCD-modulen och den börjar om.

Jag brukar skapa en linjedragningsrutin, en placera-tecken-rutin osv. och när det är klart är det bara att placera rätt text på rätt placering samt att rita ramar osv.

Bågen får man skapa en funktion för också, det är inte så våldsamt svårt faktisk med en liten uppslagstabell att skapa en funktion som ritar en cirkelbåge.

Tecken har jag som bitmap-bilder i minnet, storleken beror på hur många pixlar som tecknet ska ta. Normalt är 5x7 men 9x15 använder jag också ibland, viktigast är att proportionerna är "snygga" och udda.
Senast redigerad av Icecap 19 juli 2014, 23:44:29, redigerad totalt 1 gång.
kodar-holger
EF Sponsor
Inlägg: 920
Blev medlem: 26 maj 2014, 12:54:35
Ort: Karlskoga

Re: Arduino + gafisk display = my brain hurts :(

Inlägg av kodar-holger »

Instämmer med föregående talare om bufferthanteringen. Vill bara tillägga att när du uppdaterar displayen från buffern skall du förmodligen INTE radera displayen först, utan låta buffern skriva över.

Om du raderar först kommer den förmodligen att flimra eftersom det tar en stund från det att du raderat skärmen tills nya innehållet från buffern tänder upp den igen.
thewho
Inlägg: 1098
Blev medlem: 28 november 2008, 08:46:10
Ort: Finland, Åland

Re: Arduino + gafisk display = my brain hurts :(

Inlägg av thewho »

Tekko:
Ingen har sagt något om att hojen i fråga ska gå på allmän väg.

Ang. buffert av bilden, jag kollade genom databladet men jag får känslan av att biblioteket har "dummats ner" lite?
Datablad
Vad jag kan förstå så skriver den alla kommandon direkt?

Men det här låter ju som det ni pratar om?
"clearScreen();"
"The module will
not execute this
command until
other command
received."

Så om jag vill göra tex. en "graf" säg 5pix bred i form av en halv cirkel så måste jag göra den av streck eller möjligtvis av andra geometriska funktioner som stöds?
Man kan tydligen göra egna bilder och konvertera dom till kod som sedan kan skickas till displayen. Är det något man kan utnyttja till det här? Eller skapar det fler problem än det löser?
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino + gafisk display = my brain hurts :(

Inlägg av sodjan »

> Ang. buffert av bilden...

...så var förslaget att det görs i Arduinon.
När en bild är klar, så skrivs den över till
displayen i helhet. Förslaget bryr sig så klart
inte om hurvida det finns tillräckligt med minne
i Arduinon för att göra detta...
ToPNoTCH
Inlägg: 4883
Blev medlem: 21 december 2009, 17:59:48

Re: Arduino + gafisk display = my brain hurts :(

Inlägg av ToPNoTCH »

Nu framgår det inte vilken MCU du avser använda (bara att du lekt med Arduino förut)

Med klena processorer så tror jag knappast att metoden att skriva om hela skärmen är att föredra.
Ändra bara på det som har ändrats tror jag är en smartare metod om proppen är begränsande. Principen är att aldrig försöka skriva något till displayen, som redan är rätt
Om displayen klarar SPI eller I2C så håll dig till det istället för UART, när det kommer till kommunikation.

Fast egentligen tror jag frågan är "hur animerar man grafik" ?
Jag skulle nog bygga en funktion för varje informationsobjekt.

Pseudo kod:
Om hastigheten ändrats -> Gå till rutinen "Rita om hastighet"
Om temperaturs -> Gå till rutinen "Rita om hastighet"
osv.

Rutinerna i sig blir mer "hardcore" typ dra "streck", skriv tecken med visst typsnitt osv.

Om man i slutändan skriver till buffert eller display direkt får nog avgöras av vilken framerate man klarar med aktuell MCU/Display.
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Arduino + grafisk display = my brain hurts :(

Inlägg av blueint »

Det första man bör kika på är om MCU:ns minne räcker. Därefter om den är snabb nog. Det är trots allt bitmappad grafik. Sedan kan man rita nytt och därefter rita "tomt" där man tidigare drog en linje eller cirkelbåge osv. Då slipper man blinkproblem (delvis). Dock måste man hålla rätt på om den gamla och nya linjen delar pixlar. Varvid detta med minne återkommer.

När det kommer till kritiska saker som hastighet bör man skriva mjukvaran så att den klarar fel utan att visa fel saker.
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino + grafisk display = my brain hurts :(

Inlägg av Icecap »

OK, lite mer erfarenhet från verkligheten:
Viktigaste rutin är såklart en som kan överföra "videominnet" till skärmen. Och här kommer det en grej: Det kan vara en del av skärmen - åt gången.

Näst viktigaste rutin är en som kan plotta en pixel i videominnet. När man har den klar kan man göra allt annat. Viktigt är att parameterna till den rutin kan gå utanför det befintliga videominnesområde. Detta görs med en if() sats som helt enkelt kolla om X & Y är inom ytan, är endera utanför sker det ingen plotning.

Om vi nu låtsas att det finns RAM för 1/4-del av det behövliga "videominne" ritar man hela bilden, överför den del som videominnet tillåter, ritar igen och överför nästa bit osv. många gångar nog till att en komplett uppdatering kan ske. I detta fall 4 gg.

Kod: Markera allt

void Pixel_Set(_SINT Pos_X, _SINT Pos_Y, _UBYTE Colour, _UWORD* Destination)
  {
  _UWORD Colour_Bit, Colour_Mask, Offset;
  if((Pos_X >= 0) && (Pos_X < 80) && (Pos_Y >= 0) && (Pos_Y < 8))
    {
    // (Pos_X % 4) + (Pos_X / 4)*16 + (3-(Pos_Y % 4))*4
    // Legal coordinates!
    if(Pos_Y > 3) Colour_Bit = 0x0010; else Colour_Bit = 0x0080; // For this exakt project
    Colour_Mask = ~Colour_Bit;
    if(!Colour) Colour_Bit = 0x0000;
    Offset = (Pos_X & 0x0003) + ((Pos_X >> 2) * 16) + ((3 - (Pos_Y & 0x0003)) * 4);
    *(Destination + Offset) = (*(Destination + Offset) & Colour_Mask) | Colour_Bit;
    }
  }
Denna kodsnudd är "live" från den nya generation av DU KÖR FÖR FORT-skylten som i högsta grad är en verklig produkt. Det viktiga är inte hur man i detta fall styr minnespixlarna (i detta fall anpassat till LED-moduler) men att pixlar utanför det arbetsområde som finns kastas.

Med pixel-set rutinen kan man utveckla en "rita linje"-rutin för att rita boxar osv. Tecken gör jag vid att ha en total teckentabell i ROM som pixelgrafik. Är en bit '1' när den scannas X och Y kallas Pixel_Set() med rätt X & Y. Teckentabellens storlek är såklart beroende på storleken på tecken i pixlar, för de vanliga 5x7 räcker det med bytes men jag har gjort tabeller med unsigned long, alltså 18x31 storlek också.

Så det är inte speciellt besvärligt - men vill man ha "live" uppdatering av mätvärden är det en del saker man ska fundera på.
* Minne nog för hela displayen är önskvärd - men man kan ju trixa.
* En total uppdatering ska kunde ske med 3 Hz hastighet för att ögat ska "gilla det" som "live uppdatering".
* Om man ritar nya skärmen i fler delar måste man använda samma värden fram till hela skärmen är uppdaterat komplett.

Så det kan - rent teknisk - lösas med en Arduino men om den kan hinna med att uppdatera snabbt nog och om det finns plats nog för teckentabeller osv är jag synnerligen tveksam till.

Ett mycket minimalt projekt av denna typ fyller i den 50MHz 32-bit µC jag använder runt 20,5kWord, alltså 82kB, då med en 16-bit teckentabell. I det projekt var det en tidtagningssystem med tecken som var 6x16 och teckentabellen hade enbart '0'-'9' (i 3 uppsättningar) med samt ':' och '-'. Så det var ett cut-to-the-bone projekt i minnesbehov.

Och dessa behov känns inte som att en Arduino är det rätta val - men Arduino är ju också tänkt som ett enkelt ingångssteg och till att lära sig att jobba med "riktiga" µC-system. Så det kanske är dags att ta steget uppåt? Vill man använda Atmel finns det ATmega med minne och pinnar nog för detta och man kan väl skrämma upp dom lite i hastighet också, då ska det nog fungera.
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 14850
Blev medlem: 16 april 2006, 17:04:10

Re: Arduino + grafisk display = my brain hurts :(

Inlägg av mrfrenzy »

Det finns många som driver vga-skärmar med arduino, självklart duger den till att driva en liten grafisk lcd om man tänker sig för lite.

Jag förstår att man gärna tar en rejäl 32-bit processor i företagsvärlden när det bara ska funka, är små serier och kompetensen redan finns.
För en nybörjare kanske man vill börja med en lite enklare plattform med färdiga bibliotek.

Den länkade displayen har ju en drivkrets med inbyggt videominne och färdigt arduinobibliotek med exempelkod för att rita och animera grafik.
Vilhelmsson
Inlägg: 381
Blev medlem: 21 mars 2012, 12:05:59
Ort: Malmö

Re: Arduino + grafisk display = my brain hurts :(

Inlägg av Vilhelmsson »

Om du inte nödvändigt vis vill använda Arduino så är Mychron 4 ett alternativ :)

http://www.aimsports.com/moto/

Ett annat alt är Teensy 3.1 Arduinoclone f 20$

https://www.pjrc.com/teensy/teensy31.html
thewho
Inlägg: 1098
Blev medlem: 28 november 2008, 08:46:10
Ort: Finland, Åland

Re: Arduino + grafisk display = my brain hurts :(

Inlägg av thewho »

Tack så mycket för alla svar! :)

Att uppgradera till "riktiga" processorer kommer inte vara aktuellt på länge. Arduino är redan avancerat nog för mig.
Och när jag kollar tex. Icecaps exempel så verkar arduino väldigt enkelt. :vissla:

Jag har testat lite mer med displayen nu och text raderas automatiskt om man skriver annan över den. Så det gör det lite enklare för mig :)
Gjorde en räknare (0-9) med variabelt intervall och ner till ca1/5dels sekund så ser man tydligt vad som visas.
Jag kan inte riktigt bestämma hur gui't ska se ut, måste balansera kunskap, intresse och hur jag skulle vilja ha det :P
Tex. "grafen" för varvtalet, helt horisontell eller vertikal vet jag hur man gör. Men jag skulle ju vilja ha den att gå i 90º eller halvcirkel. (som bilderna i första posten) men det har jag ingen aning om hur man gör.. :humm:

Vilhelmsson:
Och jag som tyckte att TraiTech Vapor var lite dyr :O Men den där var inte tokig alls :)
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino + grafisk display = my brain hurts :(

Inlägg av Icecap »

Cirkeln/cirkelbågen kan skapas med en tabell som i grunden håller sin/cos-värden och man kan sedan "dra" raka streck mellan punkterna.
Skriv svar