Skyduino:~#
Articles
arduino, programmation, python

[Arduino/Python/GLCD] Chargement d’image depuis carte SD

Salut à tous !

Dans le cadre de mon mini oscilloscope sur une base arduino (arduinoscillo), j’ai été contraint de chargé des images depuis une carte SD à cause du manque de place en flash/ram.

Dans la version 2 de mon arduinoscillo (qui n’est pour le moment qu’au stade du GUI) j’ai supprimé ce chargement depuis la carte sd pour une génération des graphismes à la volé (via un système d’équations).

Cependant le code précédant reste intéressant c’est pourquoi j’ai décidé de le publier !

Le principe est simple, l’image est tout d’abord converti via un script python en une série de 3 byte représentatif des canaux Rouge, Vert et Bleu.
Le fichier converti porte l’extension .skr (SKywodd Region) ce fichier est alors placé sur la carte SD puis chargé par le code arduino.

Le script python :

import Image
import sys
im = Image.open(sys.argv[1])
im = im.rotate(270)
data = list(im.getdata())
output = open(sys.argv[1][:-4] + ".skr", 'wb')
for pixel in data:
    output.write("%c%c%c" % (pixel[0],pixel[1],pixel[2]))
output.close()

Le code arduino pour l’afficheur TFT de watterott :

#include <MI0283QT2.h>
#include <SD.h>

File myFile;
MI0283QT2 lcd;

void setup()
{
  lcd.init(2);
  lcd.clear(COLOR_BLACK);
  appendTextLcd(PSTR("Starting ..."));

  appendTextLcd(PSTR("Mounting SD card ..."));
  if (!SD.begin(4)) {
    appendTextLcd(PSTR("Mounting Failed !"));
    while(1);
  }

  appendTextLcd(PSTR("Loading skr ..."));
  delay(1000);
  loadSkScreen("screen.skr");

}

void loop()
{
	
}

inline void loadSkScreen(char* skFilename){
  loadSkRegion(skFilename,0,0,320,240);
}

void loadSkRegion(char* skFilename, int startx, int starty, int lenx, int leny){
  myFile = SD.open(skFilename);
  if(!myFile){   
    appendTextLcd(PSTR("File not found !"));
    while(1);
  }
  
  uint16_t buffer[320];

  for(int d=0;d<leny;d++){
    lcd.setArea(startx, starty +d, startx + lenx -1, starty +d);

    for(int i=startx; i<lenx; i++)
      buffer[i] = RGB(myFile.read(),myFile.read(),myFile.read());

    lcd.drawStart();
    for(int i=startx; i<lenx; i++)
      lcd.draw(buffer[i]);
    lcd.drawStop();

  }

  myFile.close(); 
}

int index = 0;
void appendTextLcd(PGM_P text){
  if(index >= 240)
    index =0;
  lcd.drawTextPGM(5, index + 5, text, 1, COLOR_WHITE, COLOR_BLACK);
  index += 15;
}

Et comme je suis sympa je vous fourni une image de test :
ICI

Comme vous pouvez le voir il y a 3 fonctions fourni par mon code :
"loadSkScreen" qui charge une image converti de 320×240,
"loadSkRegion" qui charge une image de taille spécifié au coordonné défini,
et "appendTextLcd" qui affiche du texte avec une effet "console".

A+ pour de nouvelle aventure dans le monde de l’arduino !

About these ads

Discussion

Pas encore de commentaire.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Archives

Wow. Dogecoin. Amaze.

Laissez un tip en Dogecoin

DMMNFk6WBVTpx2Wu1Z35GL61QXSd6r6WQx

Suivre

Recevez les nouvelles publications par mail.

Rejoignez 730 autres abonnés