Affichage publicitaire avec Arduino (2)
Affichage publicitaire vertical
Vous répondez à :
Merci Jean-Claude pour ce partage : j’incite les lecteurs à aller voir ton site en ligne et à récupérer les fichiers STL du socle car c’est un peu ce qui manque à LOCODUINO : l’intégration d’un montage dans un décor à l’échelle pour que ce soit beau. Et ton socle est vraiment super.
Oui, l’utilisation d’un PI pico, ou bien de l’écran Adafruit, permet d’avoir le lecteur SD incorporé : au final, le prix ne doit pas être très supérieur au matériel asiatique pour une qualité bien supérieure. A méditer si on doit acheter tous les composants pour réaliser ce montage.
11 Messages
-
Affichage publicitaire avec Arduino (2) 1er octobre 2022 16:07, par Jean-claude
Bonjour
J’utilise un raspberry pi pico, ce qui permet de se passer du lecteur SD.
Avec un Teensy4.0 l’affichage est instantané (mais c est plus cher)Merci à locoduino qui m’a fait découvrir de DIY pour le DCC
Voir en ligne : Letraindejc
-
Merci Jean-Claude pour ce partage : j’incite les lecteurs à aller voir ton site en ligne et à récupérer les fichiers STL du socle car c’est un peu ce qui manque à LOCODUINO : l’intégration d’un montage dans un décor à l’échelle pour que ce soit beau. Et ton socle est vraiment super.
Oui, l’utilisation d’un PI pico, ou bien de l’écran Adafruit, permet d’avoir le lecteur SD incorporé : au final, le prix ne doit pas être très supérieur au matériel asiatique pour une qualité bien supérieure. A méditer si on doit acheter tous les composants pour réaliser ce montage.-
Le Pi PICO a beaucoup de mémoire et les images peuvent être stockées en variable.
Il faut cependant convertir en JPG en string... des logiciels le font.Avec un Teensy 4.0 (qui est très rapide) on peut même faire des "transitions"
Quand j’ai fait ma maquette je ne connaissais pas l’arduino.. encore merci à votre site que se soient les projets que la vulgarisation.
ps j’ai découvert le pico dans une de vos rubriques.
Jean-Claude
-
-
-
Affichage publicitaire avec Arduino (2) 7 mars 12:15, par Besseyre Guy
bonjour à tous
je possède un écran ips TFT de 1.14 " de marque Greatzt, ré
solution 135X240 controleur ST 7789
puis-je l’utiliser dans cette appli ?
merci-
Cet article est écrit pour un écran qui fait 80 x 160 et qui utilise un contrôleur ST7785. Il risque d’y avoir pas mal d’adaptation à faire si vous utilisez un écran qui a une résolution différente et un contrôleur différent. Mais tout est possible pour quelqu’un qui a déjà un peu d’expérience et qui est capable de chercher des solutions sur le net.
Vous ne dites rien de votre niveau d’expertise : si vous êtes débutant, je vous déconseille d’utiliser un autre écran, surtout au prix où on trouve l’écran cité dans l’article.
-
-
Affichage publicitaire avec Arduino (2) 20 mars 21:41, par Besseyre Guy
bonsoir
je ne trouve pas la référence de la carte lecteur de micro SD
utilisée dans l’application (dans aliexpress)
merci pour l’info
bonne soirée-
C’est exact, dans le premier article, nous n’avons simplement dit que "le montage utilise un lecteur de carte SD relié également au bus SPI" mais nous n’avons donné aucune référence. Vous pouvez utiliser n’importe quelle carte lecteur de SD ou de micro-SD. Pour en trouver une, il suffit de taper dans le moteur de recherche de votre navigateur carte micro-SD SPI Arduino : tout ce qui compte, c’est de pouvoir la relier à la carte Arduino via le bus SPI.
-
-
Affichage publicitaire avec Arduino (2) 28 avril 18:50, par Besseyre guy
bonjour Christian
J’ai réalisé l’application décrite dans l’article (figure 7), après avoir approvisionné l’écran chez
Aliexpress ,conforme a la photo n°5, ainsi que le lecteur de micro-sd, pilotage par Arduino Nano ;
l’écran s’allume mais aucune image n’apparait ; essai sur un deuxième montage ,même chose
je ne vois pas ou est l’erreur, ci-joint le sketch ;
bon week-end
// Diaporama_demo_80x160.ino
// -------------------------#include <Adafruit_GFX.h> // Bibliotheque graphique - Core graphics library
#include <Adafruit_ST7735.h> // Bibliotheque specifique ST7735 - Hardware-specific library for ST7735
#include <SPI.h>
#include <SD.h>#define dureeAffichage 7500 // Duree d’affichage
#define TFT_RST 9 // Ligne de Reset - Reset line for TFT
#define TFT_CS 10 // Selection de l’ecran - Chip select line for TFT display
#define TFT_DC 8 // Commande donnees pour ecran - Data/command line for TFT
#define SD_CS 4 // Selection du lecteur carte SD - Chip select line for SD card
//D11 -> MOSI SD + SDA TFT
//D12 -> MISO SD
//D13 -> SCK SD + SCL TFT// Ecran 0.96" controleur ST7735 - For 0.96" TFT with ST7735 use
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST) ;void setup(void)
Serial.begin(9600) ;while (!Serial)
delay(10) ; // wait for serial consolepinMode(TFT_CS, OUTPUT) ;
digitalWrite(TFT_CS, HIGH) ;
pinMode(SD_CS, OUTPUT) ;
digitalWrite(SD_CS, HIGH) ;// Initialisation de l’ecran 0.96" 160x80 TFT
tft.initR(INITR_MINI160x80) ;tft.fillScreen(ST77XX_RED) ; // En fait, affichera jaune
delay(3000) ;Serial.print("Initializing SD card...") ;
if (!SD.begin(SD_CS))
Serial.println("failed !") ;
return ;
Serial.println("OK !") ;File root = SD.open("/") ;
printDirectory(root, 0) ;
root.close() ;void loop()
// Affichage
// Changer les noms des fichiers - change the names here !
bmpDraw("RN80x160.BMP", 0, 0) ;
delay(dureeAffichage) ;
bmpDraw("Defense.BMP", 0, 0) ;
delay(dureeAffichage) ;
bmpDraw("AirFranc.BMP", 0, 0) ;
delay(dureeAffichage) ;
bmpDraw("Locoduin.BMP", 0, 0) ;
delay(dureeAffichage) ;// This function opens a Windows Bitmap (BMP) file and
// displays it at the given coordinates. It’s sped up
// by reading many pixels worth of data at a time
// (rather than pixel by pixel). Increasing the buffer
// size takes more of the Arduino’s precious RAM but
// makes loading a little faster. 20 pixels seems a
// good balance.#define BUFFPIXEL 20
void bmpDraw(char *filename, uint8_t x, uint16_t y)
File bmpFile ;
int bmpWidth, bmpHeight ; // W+H in pixels
uint8_t bmpDepth ; // Bit depth (currently must be 24)
uint32_t bmpImageoffset ; // Start of image data in file
uint32_t rowSize ; // Not always = bmpWidth ; may have padding
uint8_t sdbuffer[3*BUFFPIXEL] ; // pixel buffer (R+G+B per pixel)
uint8_t buffidx = sizeof(sdbuffer) ; // Current position in sdbuffer
boolean goodBmp = false ; // Set to true on valid header parse
boolean flip = true ; // BMP is stored bottom-to-top
int w, h, row, col ;
uint8_t r, g, b ;
uint32_t pos = 0, startTime = millis() ;if((x >= tft.width()) || (y >= tft.height())) return ;
Serial.println() ;
Serial.print(F("Loading image ’")) ;
Serial.print(filename) ;
Serial.println(’\’’) ;// Open requested file on SD card
if ((bmpFile = SD.open(filename)) == NULL)
Serial.print(F("File not found")) ;
return ;// Parse BMP header
if(read16(bmpFile) == 0x4D42) // BMP signature
Serial.print(F("File size : ")) ; Serial.println(read32(bmpFile)) ;
(void)read32(bmpFile) ; // Read & ignore creator bytes
bmpImageoffset = read32(bmpFile) ; // Start of image data
Serial.print(F("Image Offset : ")) ; Serial.println(bmpImageoffset, DEC) ;
// Read DIB header
Serial.print(F("Header size : ")) ; Serial.println(read32(bmpFile)) ;
bmpWidth = read32(bmpFile) ;
bmpHeight = read32(bmpFile) ;
if(read16(bmpFile) == 1) // # planes — must be ’1’
bmpDepth = read16(bmpFile) ; // bits per pixel
Serial.print(F("Bit Depth : ")) ; Serial.println(bmpDepth) ;
if((bmpDepth == 24) && (read32(bmpFile) == 0)) // 0 = uncompressedgoodBmp = true ; // Supported BMP format — proceed !
Serial.print(F("Image size : ")) ;
Serial.print(bmpWidth) ;
Serial.print(’x’) ;
Serial.println(bmpHeight) ;// BMP rows are padded (if needed) to 4-byte boundary
rowSize = (bmpWidth * 3 + 3) & 3 ;// If bmpHeight is negative, image is in top-down order.
// This is not canon but has been observed in the wild.
if(bmpHeight < 0)
bmpHeight = -bmpHeight ;
flip = false ;// Crop area to be loaded
w = bmpWidth ;
h = bmpHeight ;
if((x+w-1) >= tft.width()) w = tft.width() - x ;
if((y+h-1) >= tft.height()) h = tft.height() - y ;// Set TFT address window to clipped image bounds
tft.setAddrWindow(x, y, x+w-1, y+h-1) ;for (row=0 ; row<h ; row++) // For each scanline...
// Seek to start of scan line. It might seem labor-
// intensive to be doing this on every line, but this
// method covers a lot of gritty details like cropping
// and scanline padding. Also, the seek only takes
// place if the file position actually needs to change
// (avoids a lot of cluster math in SD library).
if(flip) // Bitmap is stored bottom-to-top order (normal BMP)
pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize ;
else // Bitmap is stored top-to-bottom
pos = bmpImageoffset + row * rowSize ;
if(bmpFile.position() != pos) // Need seek ?
bmpFile.seek(pos) ;
buffidx = sizeof(sdbuffer) ; // Force buffer reloadfor (col=0 ; col<w; col++) { // For each pixel...
// Time to read more pixel data?
if (buffidx >= sizeof(sdbuffer)) // Indeed
bmpFile.read(sdbuffer, sizeof(sdbuffer)) ;
buffidx = 0 ; // Set index to beginning// Convert pixel from BMP to TFT format, push to display
b = sdbuffer[buffidx++] ;
g = sdbuffer[buffidx++] ;
r = sdbuffer[buffidx++] ;
// La ligne suivante a ete modifiee car probleme affichage de couleurs.
// (A l’origine, la ligne etait : tft.pushColor(tft.color565(r,g,b)) ;)
tft.pushColor(tft.color565( b, g, r)) ;
// end pixel
// end scanline
Serial.print(F("Loaded in ")) ;
Serial.print(millis() - startTime) ;
Serial.println(" ms") ;
// end goodBmpbmpFile.close() ;
if(!goodBmp) Serial.println(F("BMP format not recognized.")) ;// These read 16- and 32-bit types from the SD card file.
// BMP data is stored little-endian, Arduino is little-endian too.
// May need to reverse subscript order if porting elsewhere.uint16_t read16(File f)
uint16_t result ;
((uint8_t *)&result)[0] = f.read() ; // LSB
((uint8_t *)&result)[1] = f.read() ; // MSB
return result ;uint32_t read32(File f)
uint32_t result ;
((uint8_t *)&result)[0] = f.read() ; // LSB
((uint8_t *)&result)[1] = f.read() ;
((uint8_t *)&result)[2] = f.read() ;
((uint8_t *)&result)[3] = f.read() ; // MSB
return result ;void printDirectory(File dir, int numTabs)
while (true)File entry = dir.openNextFile() ;
if (! entry)
// no more files
break ;
for (uint8_t i = 0 ; i < numTabs ; i++)
Serial.print(’\t’) ;
Serial.print(entry.name()) ;
if (entry.isDirectory())
Serial.println("/") ;
printDirectory(entry, numTabs + 1) ;
else
// files have sizes, directories do not
Serial.print("\t\t") ;
Serial.println(entry.size(), DEC) ;
entry.close() ;-
Inutile de remettre un programme si vous ne l’avez pas modifié et dans ce cas, ne mettez que ce que vous avez modifié !
Je constate tout de même qu’il manque deux accolades fermantes en fin de programme.
La première question est donc : êtes-vous certain que votre carte Nano soit bien programmée ?
La deuxième question est : êtes-vous certain que votre écran comporte un contrôleur ST7735 ? En effet, il y a pléthore d’écrans vendus sur le marché asiatique et ce n’est pas parce qu’il ressemble à la photo 5 que c’est le même. Sa résolution est-elle bien 80 x 160 ?
Enfin, êtes-vous certain d’avoir enregistré les fichiers images sur votre carte SD ? Et d’avoir bien installé la carte SD dans le lecteur ?
Bref, trop peu d’informations pour que je puisse vous répondre alors que vous mettez un programme qui ne me sert à rien (et qui est difficilement exploitable vu le format d’édition).
Avez-vous observé quelque chose qui soit écrit dans le moniteur de l’IDE ? Ce serait déjà une indication intéressante pour savoir ce qu’il se passe.
Dernière question : avez-vous modifié la bibliothèque comme nous l’avons préconisé dans l’article ? Si oui, êtes-vous certain de ne rien avoir modifié d’autre que ce qui est écrit ?
Une fois de plus, il n’y a aucune raison que cela marche chez le ou les auteurs, et pas chez vous : vous avez sans doute oublié une étape. Recommencez tout en prenant votre temps et en vérifiant les points que je viens de mentionner.
Enfin, l’aide sur un montage se fait via le forum : relisez l’article https://www.locoduino.org/spip.php?...
Cdlt.-
bonjour Christian
bien reçu le message pour le forum, je vais donc aller y voir.
désolé pour les informations incomplètes ,j’y veillerais a l’avenir.
donc :- le programme "diaporama publicitaire " a bien été chargé sur le NANO (et sur un UNO), sans modif
- l’écran est bien strictement celui de la photo, avec ST7735
les diapos ont été chargées sur carte micro SD et c’est là OU EST LE PROBLEME ! selon la marque des
cartes , ça fonctionne ou pas !exemple : transcend OK Sandisk NON
merci pour l’aide-
Peut-être essayer de changer le lecteur de carte SD.
Est-ce que les fichiers sur la carte SD peuvent être relus avec un ordinateur ?
Sinon, l’aide du forum permettra sans doute de trouver une solution.
Cdlt.
-
-