Arduino robotprogrammering

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Xyzzy
Inlägg: 1222
Blev medlem: 30 januari 2004, 22:31:07
Ort: Uppsala, Sweden

Re: Arduino robotprogrammering

Inlägg av Xyzzy »

Magnus, om det endast är så få tecken tror jag det är smidigare att rita de "i realtid" på rätt plats på skärmen (jag antar att ditt lib har stöd för tänd/släck specifik punkt, rita streck osv, annars kan du få det jag gjorde i höstas (fast då står det ju XYZZY över hela displayen :vissla: ))
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 »

@Icecap: Ja det där är ju klockrent. Tyvärr är det som hawkan säger att det är dom "övriga" bittarna jag inte får ihop.

@hawkan: Ska se hur jag kan manipulera ett färdigt typsnitt. Det sättet du beskriver är självklart det mest logiska och systematiska sättet, men jag tyckte att det var så lite filer inblandade så jag skulle våga mig på att skapa ett nytt typsnitt från grunden och bara lägga till det till biblioteket. Men det gick ju som vanligt.
Ska göra som du säger en dag när jag känner att jag har lite mer tur!

@Xyzzy: Tänkte på det här tidigare men har/hade en liten plan om att utgå från något färdigt för att enkelt kunna lägga in bitmaps. Skulle vara så roligt att kunna visa någon bild när roboten tex kör in i något, batterivarning eller tom inställningar.
Å andra sidan ser jag det här sistnämnda som lyxdetaljer men känns ändå som att det blir bäst förutsättningar om jag utgår från något färdigt 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 »

Ytterligare åtskilliga timmar lagt på något som var så enkelt...

Gjorde som hawkan påpekade och efter en bra tid var jag nere på exakt samma kod som jag tidigare testat. Dock så fick jag inga kompileringsfel denna gången.
Funderade länge på vad jag ställde till första gången, och det visade sig vara ett riktigt klanteri.
Då jag vid första tillfället inte hade som syfte att programmera någon MCU, så hade jag inte ställt inte rätt Arduino-kort i IDE:t. Nu kopplade jag upp allt för jag ville se varje liten förändring jag gjorde och ställde då om till rätt kort. Det var det som orsaka alla konstiga felmeddelanden om timers och annat.

Nu blir det betydligt lättare att göra min egna font... Testade med ett litet "test pattern" och nedan ser ni kod och bild på utskriften.
I programmet så skriver jag bara ut ett "<" vilket är 0x3C enligt ASCII.

Kod: Markera allt

#ifndef glcdfont_h
#define glcdfont_h

// standard ascii 5x7 font
// Restrict to 96 characters
GLCDFONTDECL(Gorbyfont) = {
  0x0, 0x0, // size of zero indicates fixed width font,
  0x10, // width
  0x10, // height
  0x3C, // first char
  0x3C, // char count
  0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
  0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,


};
#endif  // glcdfont_h
20180510_090608.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
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 sket sig som vanligt. Det gick inte bara att blåsa upp storleken till den jag ville. Det händer något vid sista raden.

Tycker det här är konstigt. Jag tar en font som dom redan har i biblioteket som ska vara 21 pixlar hög (koden nedan). Skriver jag sedan ut den 3 ggr så syns bara halva tredje tecknet på en 128x64-oled. Är inte det konstigt?

Kod: Markera allt

/*
 *
 * Cooper21
 * Cooper std black size20
 *
 * created with GLCDFontCreator
 * original framework by F. Maximilian Thiele
 * Modified By Siddharth Kaul
 *
 *
 * File Name           : cooper21.h
 * Date                : 10.11.2012
 * Font size in bytes  : 23979
 * Font width          : 10
 * Font height         : 21
 * Font first char     : 32
 * Font last char      : 128
 * Font used chars     : 96
 *
 * The font data are defined as
 *
 * struct _FONT_ {
 *     uint16_t   font_Size_in_Bytes_over_all_included_Size_it_self;
 *     uint8_t    font_Width_in_Pixel_for_fixed_drawing;
 *     uint8_t    font_Height_in_Pixel_for_all_characters;
 *     unit8_t    font_First_Char;
 *     uint8_t    font_Char_Count;
 *
 *     uint8_t    font_Char_Widths[font_Last_Char - font_First_Char +1];
 *                  // for each character the separate width in pixels,
 *                  // characters < 128 have an implicit virtual right empty row
 *
 *     uint8_t    font_data[];
 *                  // bit field of all characters
 */

#ifndef _Cooper21_H
#define _Cooper21_H

#define Cooper21_WIDTH 10
#define Cooper21_HEIGHT 21

GLCDFONTDECL(Cooper21) = {
    0x5D, 0xAB, // size
    0x0A, // width
    0x15, // height
    0x20, // first char
    0x60, // char count
    
    // char widths
    0x05, 0x05, 0x0A, 0x09, 0x0B, 0x11, 0x12, 0x05, 0x0A, 0x09, 
    0x08, 0x0A, 0x05, 0x06, 0x05, 0x0A, 0x0C, 0x0B, 0x0C, 0x0C, 
    0x0C, 0x0B, 0x0D, 0x0C, 0x0C, 0x0C, 0x05, 0x05, 0x0A, 0x0A, 
    0x0A, 0x0A, 0x0F, 0x12, 0x0F, 0x0E, 0x10, 0x0F, 0x0E, 0x10, 
    0x10, 0x09, 0x0E, 0x12, 0x0D, 0x12, 0x12, 0x0F, 0x0E, 0x0F, 
    0x10, 0x0C, 0x0F, 0x11, 0x11, 0x16, 0x10, 0x10, 0x0E, 0x08, 
    0x0A, 0x08, 0x0A, 0x0A, 0x05, 0x0C, 0x0D, 0x0B, 0x0E, 0x0B, 
    0x09, 0x0C, 0x0E, 0x07, 0x06, 0x10, 0x08, 0x14, 0x0E, 0x0D, 
    0x0E, 0x0E, 0x0B, 0x09, 0x0A, 0x0E, 0x0D, 0x15, 0x0D, 0x0D, 
    0x0B, 0x08, 0x02, 0x08, 0x0A, 0x0A, 
    
    // font data
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 <space>
    0x78, 0xFC, 0xFC, 0xFC, 0x78, 0x60, 0xF1, 0xF3, 0xF1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, // 33
    0x78, 0xFC, 0xFC, 0xFC, 0x78, 0x78, 0xFC, 0xFC, 0xFC, 0x78, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 34
    0x00, 0x00, 0x00, 0xE0, 0x20, 0x00, 0xE0, 0x60, 0x00, 0x1B, 0xDB, 0xFF, 0x1F, 0x9B, 0xFF, 0x1F, 0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 35
    0xC0, 0xE0, 0xF0, 0xF0, 0xFC, 0xBC, 0x30, 0x70, 0x70, 0xF0, 0x40, 0x79, 0x77, 0xE7, 0xCF, 0xCF, 0xCF, 0xFF, 0xFF, 0x7E, 0x7E, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, // 36
    0x70, 0xF8, 0xF8, 0xCC, 0x9C, 0xFC, 0xF8, 0x70, 0x80, 0xC0, 0x70, 0x38, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x81, 0xC1, 0x71, 0x18, 0x0E, 0x03, 0x39, 0x7C, 0xFC, 0xE6, 0xCE, 0xFE, 0x7C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 37
    0x70, 0xF8, 0xF8, 0xFC, 0xFC, 0x8C, 0x8C, 0x1C, 0x18, 0x80, 0x80, 0xC0, 0xE8, 0xFC, 0xFC, 0xFC, 0x7C, 0x38, 0x0E, 0x3F, 0x7F, 0x7F, 0xFF, 0xF1, 0xE1, 0xCE, 0xCF, 0xC7, 0xE7, 0x7F, 0x7F, 0x7F, 0x3D, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 38
    0x78, 0xFC, 0xFC, 0xFC, 0x78, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 39

...
    
};

#endif
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 »

Ska göra ett sista försök att rita pilarna som bilder och spara som bitmaps.
Sen kan man tydligen göra omvandla bilden till hexkoden genom LCD Assistant.
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 »

Gjorde nu en pil som en bitmap och konverterade enligt ovan. Tog också ner u8g-libbet för visning.
Det fungerade skitbra men hur gör jag nu för att testa att skriva ut 3 pilar på höjd?

Ps. Förstår om ni gett upp... Ds
Ps2. Se EDIT nedan. Ds
20180517_173657.jpg

Kod: Markera allt

#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);	// Fast I2C / TWI 


const unsigned char arrow_up [] PROGMEM = {
0x00, 0x00, 0x01, 0x00, 0x03, 0x80, 0x07, 0xC0, 0x0F, 0xE0, 0x1F, 0xF0, 0x3F, 0xF8, 0x7B, 0xBC,
0x73, 0x9C, 0x63, 0x8C, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80,
0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  
};

void draw(void) {
  // graphic commands to redraw the complete screen should be placed here  
  u8g.drawBitmapP( 0, 0, 2, 20, arrow_up);
}

void setup(void) {
}

void loop(void) {
  // picture loop
  u8g.firstPage();  
  do {
    draw();
  } while( u8g.nextPage() );
  
  // rebuild the picture after some delay
  delay(1000);
}
EDIT: Gjorde om loopen så här och resultatet är perfekt. Mina 3 pilar på rad vertikalt i skärmen.
Dock är detta rent manuellt. Hur kan jag påverka argumenten i u8g.drawBitmapP rent kodmässigt?

Kod: Markera allt

void loop(void) {
  // picture loop
  u8g.firstPage();  
  do {
    //draw();
    u8g.drawBitmapP( 0, 0, 2, 20, arrow_up);
    u8g.drawBitmapP( 0, 21, 2, 20, arrow_up);
    u8g.drawBitmapP( 0, 42, 2, 20, arrow_up);
  } while( u8g.nextPage() );
  
  // rebuild the picture after some delay
  delay(1000);
}
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
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 »

Fortsätter.

Kan jag skriva in ett argumentvärde i stil med det här?
Eller ja, förstår att inte just det här går men förstår ni vad jag menar? Hur jag kan påverka argumenten som jag skickar till funktionen (tror jag det kallas).

function(0, 0, 2, 20) = (function(0, 0, 2, 20) & 0, 21, 2, 20);

Vet inte ens vad jag ska söka efter. Terminologi är viktigt.
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 »

Enklast är nog att lagra varje kommando som ett tecken i en global sträng och göra en print-funktion för det strängformatet.
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 »

Är rädd för att jag inte riktigt förstår vad du menar.

Jag kommer nu få plats med 24 tecken (pilar) i hela skärmen. Menar du att jag ska lägga in alla 3 pilar (vänster, upp, höger) i samtliga 24 positioner i en tabell, och sen kan man "slå upp" därifrån?
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 »

Kod: Markera allt

char kommando[24] = "VUHHVUUHH";

for(int i=0; i < 24; i++){
 switch(kommando[i]){
  case 'U':
    u8g.drawBitmapP( X, Y, 2, 20, arrow_up); 
    X=+20;
    break; 
  case 'L':
    u8g.drawBitmapP( X, Y, 2, 20, arrow_left);
    X=+20;
    break;
  ... 
 }

 // Hantera radbyte
 if(X>160){
   X=0;
   Y=+20;
  }
}
Användarvisningsbild
ffredrik
Inlägg: 340
Blev medlem: 20 oktober 2009, 17:52:18
Ort: Göinge

Re: Arduino robotprogrammering

Inlägg av ffredrik »

Du menar naturligtvis
x += 20;
och motsv för y.
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 »

Du är ju helt klockren. Vad smart!
Ska knåpa lite. Återkommer. :tumupp:
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 »

Jobbar vidare med Krille Krokodil's kod och har lagt in en enum. Ser ut så här:

Kod: Markera allt

enum StatusOfButtons : uint8_t {WAIT_FOR_KEYPRESS, WAIT_FOR_KEYRELEASE};
Väl i koden så försöker jag ge StatusOfButtons det värde den ska ha genom tex StatusOfButtons = WAIT_FOR_KEYPRESS; men då får jag kompileringsfel som lyder i stil med:

Kod: Markera allt

Gorby_brain:170: error: expected unqualified-id before '=' token

           StatusOfButtons = WAIT_FOR_KEYPRESS;

                           ^

Gorby_brain:179: error: expected primary-expression before '}' token

   }

   ^

exit status 1
expected unqualified-id before '=' token
Någon som har lust att hjälpa mig på traven?
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Arduino robotprogrammering

Inlägg av Mr Andersson »

StatusOfButtons är en typ. Du måste deklarera en variabel av den, t.ex. StatusOfButtons status;
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 »

Tack. Nu fungerar det bättre :tumupp:
Skriv svar