Arduino robotprogrammering

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Arduino robotprogrammering

Inlägg av Magnus_K »

Hej!

Sitter med mitt och lillans projekt och vill göra så mycket kod klar som möjligt innan hårdvaran är klar.
Det som jag ser som den största utmaningen blir att få till den här delen av styrningen.

Vi har 4 st knappar, , , och X som inputs, samt en svartvit 128x64 0,96" I2C OLED som output.
Jag har inte testat klart än, men typsnittet kommer bli att varje symbol kommer vara ~20x20 pixlar. Tre rader blir det i alla fall.

Det vi vill göra är att om man tex trycker upp, upp, ner, ner, vä, hö, vä, hö så visas just detta i displayen. Trycker jag sedan en gång på X så raderas senast inmatade symbolen och man kan sedan fortsätta att trycka sekvensen.
Håller jag inne X länge så raderas hela sekvensen.
Det jag verkligen inte vet hur jag ska hantera är hur, och i vilket "format", jag sparar varje knapptryckning. Och hur gör jag rent programmeringstekniskt för att "radera senaste symbolen"?
Är väldigt tacksam för all slags input och orkar någon skriva ihop någon slags psuedo-kod för just det här så vore det kanon. Alltså inte vad som gäller grafiken, utan just hur man bör spara/radera.

20180504_230516.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: Arduino robotprogrammering

Inlägg av Krille Krokodil »

Strukturera det som en tillståndsmaskin så blir det enkelt, något i stil med:

Kod: Markera allt

while(true){
   waitseconds(0.1);

 switch(State){
  
  case WAIT_FOR_KEYPRESS:
   TimeCounter=0;
   switch(key){
    case X:
     State=X_PRESSED;
     break;

     case UP:
     State=UP_PRESSED;
     break;
   
    }
    break;

   case X_PRESSED:
    if(TimeCounter==0){
     EraseLast();
    }
    elseif(TimeCounter>10){
     EraseAll();
    }
    TimeCounter++;
    if(key==0){
     State=WAIT_FOR_KEYPRESS;
    }
   break;

   case UP_PRESSED:
     do_up();
     State=WAIT_FOR_KEY_REALEASE;
     break; 

    case WAIT_FOR_KEY_REALEASE:
     if(key==0){
      State=WAIT_FOR_KEYPRESS;
     }
     break;


}

       



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

Re: Arduino robotprogrammering

Inlägg av Icecap »

Jag anser att den sekvens av rörelse som ska exekveras i grunden är en byte som anger riktning.

Om du börjar med en byte som stegräknare och sedan kan spara den i adress 0 på EEPROM kan alla efterföljande steg sparas i EEPROM på adress 1 och vidare fram.

Det är sedan stegräknaren som styr antal steg och inmatningen.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino robotprogrammering

Inlägg av Magnus_K »

Det där ska jag nog kunna jobba ifrån Krille Krokodil, tack :tumupp:

Ok Icecap. Så alltså nyttja en byte som enbart räknar antal steg och sedan låta varje riktning sparas som en byte också.
Det känns som en bra väg att gå. Behöver göra en omvandlingstabell från dessa byte till grafiken också.

Finns det någon anledning till varför man borde spara i EEPROM? Kommer det ta på tok för mycket RAM om jag sparar det där istället? Det gör inget om sekvensen försvinner vid reset.
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino robotprogrammering

Inlägg av Icecap »

Självklart kan du använda RAM, det är ju bara att reservera en storlek om det antal steg som maximalt ska kunde läggas in.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino robotprogrammering

Inlägg av Magnus_K »

Perfekt. Det ska nog bli bra det här...

En relaterad fråga till er kunniga där ute:

Jag tog ner ett färdigt bibliotek till displayen (Biblioteket), och tänkte nyttja "grovarbetet". Dock med baktanken att lägga till ett eget typsnitt som enbart innehåller är våra symboler.
För att se lite vad för data som skickas över så kollade jag i SSD1306Ascii/src/fonts/TimesNewRoman13.h och ASCII 124, vilket borde vara ett "|". I filen består symbol 124 av två byte så här 0xFE, 0x78, // 124.

Min fråga är då, hur i hela friden blir 0xFE78 (1111111001111000) ett | ? Detta ska alltså ge tillräckligt med data för 10x13 pixlar??
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: Arduino robotprogrammering

Inlägg av hawkan »

Men tecknet är bara 1x13 stort. Titta på "width" som är 0x01 högre upp.
Det verkar som det är en tom pixel högst och lägst, | är alltså bara 11 pixlar högt.
Sen blir det tre bittt över.
Det kanske står nånstans hur det görs, eller titta på nåt annat tecken, för att se
exakt hur bitarna placeras i höjdled. Det kanske snarare är såhär
.xxxx---xxxxxxx.
där . är tom pixel, x är full pixel och --- är de tre som blev över 13.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino robotprogrammering

Inlägg av Magnus_K »

Ahaaa, Helt rätt! Fasen vad snyggt hawkan! :tumupp:
Hade helt missat "char width"-delen :doh: .
Ska gräva lite mer, men nu är vi på gång igen. Tack för att du tog dig tid och grottade bibliotek!
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino robotprogrammering

Inlägg av Magnus_K »

Eller ja, trodde det var enklare än vad det verkar vara. Testade med "+", men blir inte klok på hur symbolen laddas in. 7x13 pixlar. 20, 20, 20, FC, 20, 20, 20, 00, 00, 00, 08, 00, 00, 00.

Ritar jag upp det på papper så känns det som att man avrundar bredden till jämnt antal nedåt. Ritar upp rad för rad, upp till ner, och sen lägger till den vertikala avrundade delen.
Nej, ingen ro i skallen för sånt här nu.
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: Arduino robotprogrammering

Inlägg av hawkan »

Om jag bara tittar som hastigast så är det två grupper med 7 bytes. Den första gruppen är antingen övre eller undre delen av tecknet. Min gissning är att de sju första byten är undre delen av tecknet, med "1" längst ner. Den nästa sju byten använder bittar 4-8. Så om man ska forma en sextonbitars int för första kolumnen borde det bli byte1 + ((byte8 &0xf8) << 5). Ta det vertikala delen av '+' blir då byte4=0xfc och byte11=0x08. 0xfc + ((0x08 & 0xf8) << 5) = 0x1fc. I bittar blir det 0000111111100 tror jag som ju är den raka kolumnen i '+'. Det är "bara" att göra baklängers om du ska göra dina egna tecknen.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino robotprogrammering

Inlägg av Magnus_K »

Hmm. Hänger inte med.
Varför AND:ar du med F8 och sen skiftar 5grr till vänster?
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: Arduino robotprogrammering

Inlägg av hawkan »

För att bara fånga de högsta bittarna i övre byten.
Tecknet är är 13 bittar högt, 8 i undre byten och fem i övre byten. De i övre byten verkar ligga som bit 4-8.
Det är tre bittar 1-3 som du får kasta bort. Det finns olika sätt att göra det.
Uppskiftning med 5 för att 13-8=5

0x08 = 00001000
0x08 & 0xf8 = 00001000 & 11111000 = 00001000 (igen. Detta steget kan möjligen vara onödigt)
0x08 << 5 = 00000001 00000000
Plus undre byten
00000001 00000000 + 11111100 = |

Man kan ju tänka sej att nerskifta med 3 istället.
0x08 >> 3 = 00000001 och särbehandla denna som den övre byten.

Eller när man börjar jobba med bittarna i den övre byten så börjar man från de högsta bittarna,
och loopar från bit 8 till och med 4 i övre byten.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino robotprogrammering

Inlägg av Magnus_K »

Ah. Tror jag hänger med på vad du skriver men förstår fortfarande inte hur displayen laddas med bitarna. Och vad den gör för skillnader när man ändrar bredd och annat.

Testade att göra en egen font och inkludera denna i allfont.h, men får bara en massa felmeddelanden. Nej tvi vale för det här. Att det ska vara så svårt... :(
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino robotprogrammering

Inlägg av Icecap »

Nu är det på ett ganska annat sätt som jag skriver tecken till de klockor jag lekar med men jag skapar ett bitmönster för varje tecken.
.....
X...X
X...X
.X.X.
..X...
.X.X.
X...X
X...X

Detta ger 0x63, 0x14, 0x08, 0x14, 0x63.

Och det är likadan det fungerar i den teckentabell, bara med 16 bit och Big Endian.
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: Arduino robotprogrammering

Inlägg av hawkan »

Jo så verkar det vara här också. Fast för den övre delen av tecken, 13 högt,
används fem bittar (8+5) och det var väl isoleringen av dessa 5 bittar som var oklart.

Ett tips är att börja med en befintlig typsnitt/tabell och ändra en sak i taget.
Börja t ex med att byta ut bitmappen för ett tecken mot ett annat lika stort.
Och sen ändra t ex bredden. osv. Så borde det väl gå.
Skriv svar