IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

script pour afficher image sur un ecran


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Avril 2017
    Messages : 6
    Points : 6
    Points
    6
    Par défaut script pour afficher image sur un ecran
    Hello à toutes et tous,
    Je travaille actuellement sur une Raspberry pi 4,
    à laquelle j'ai installé un écran sur gpio ( gfx hat)

    Après des nuits de recherches,
    j'ai réussi à afficher du texte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #!/usr/bin/env python
    import time
    from gfxhat import lcd, backlight, fonts
    from PIL import Image, ImageFont, ImageDraw
     
    print("""Message de demarrage""")
     
    backlight.set_all(240,240,240)
    backlight.show()
     
    lcd.clear()
     
    width, height = lcd.dimensions()
     
    image = Image.new('P', (width, height))
    draw = ImageDraw.Draw(image)
     
    text = "| SSid Wifi : Diagbox |\n|eth0=DHCP |\n| @ ip Wifi : http://diagbox |"
     
    font = ImageFont.truetype("/diagbox/ttf/OpenSans-Regular.ttf", 10)
     
    x = 00 
    y = 00
     
    draw.text((x, y), text, 1, font)
     
    for x in range(50):
        for y in range(50):
            pixel = image.getpixel((x, y))
            lcd.set_pixel(x, y, pixel)
     
    lcd.show()
    Maintenant, j'aimerais afficher un petit logo.
    J'ai essayé ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #!/usr/bin/env python
    import time
    from gfxhat import lcd, backlight, fonts
    from PIL import Image, ImageFont, ImageDraw
     
    print("""Message de demarrage""")
     
    backlight.set_all(240,240,240)
    backlight.show()
     
    lcd.clear()
     
    width, height = lcd.dimensions()
     
    image = Image.open("/tmp/aa.jpg")
     
    x = 00 
    y = 00
     
    for x in range(128):
        for y in range(64):
    		pixel = image.getpixel((x, y))
            lcd.set_pixel(x, y, pixel)
     
    lcd.show()
    Mais ça me renvoie cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    root@diagbox:/tmp# python test.py
      File "test.py", line 23
        lcd.set_pixel(x, y, pixel)
    Voici le lien qui m'aide pour les modules de l'écran : http://docs.pimoroni.com/gfxhat/

    Je débute en Python et j'essaie de trouver les infos sur le net, dans les forum
    Mais la ça fait 1 semaine que je bloque.

    Help me please

    Merci par avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par domoticity Voir le message
    Je débute en Python et j'essaie de trouver les infos sur le net, dans les forum
    Mais la ça fait 1 semaine que je bloque.
    Dans le message on ne voit pas le libellé de l'erreur mais vu le code, on peut imaginer qu'il s'agit d'IndentationError.
    Et si c'est le cas, ouvrir un tuto. et apprendre les bases du langage vous permettrait de gagner du temps.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Avril 2017
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Dans le message on ne voit pas le libellé de l'erreur mais vu le code, on peut imaginer qu'il s'agit d'IndentationError.
    Et si c'est le cas, ouvrir un tuto. et apprendre les bases du langage vous permettrait de gagner du temps.

    - W
    Hello 😀
    Merci d'avoir pris du temps pour me répondre.
    En effet j'ai cette erreur.
    J'ouvre des tutos et j'ai même pris le bouquin
    "Python pour les Nuls" ^^
    J'avance petit a petit mais cette erreur je ne vois pas a quoi elle est due.
    Du coups je n'arrive pas a voir ma grosse erreur 😀.

    J'ai oublié de dire que ma Raspberry n'a pas de mode desktops, que l'os est la version Razpbian light.

    Après si j'ai bien compris le fonctionnement du script, au lieu d'ouvrir le texte ou l'image en dur sur la Raspberry, ça envoie les pixels sur l'écran via le module fourni.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par domoticity Voir le message
    J'avance petit a petit mais cette erreur je ne vois pas a quoi elle est due.
    Du coups je n'arrive pas a voir ma grosse erreur 😀.
    Si vous n'avez pas encore compris qu'un script Python était une suite de blocks délimités par l'indentation... soit vous n'avez pas essayé de faire les exercices, soit votre tuto. est franchement mauvais.
    Peut être que jeter un oeil dans le chapitre qui va bien du Swinnen vous serait utile?
    En tous cas, potasser un tuto. vous appliquer à faire des exercices, histoire de voir comment çà fonctionne, les différents messages d'erreurs,... est le minimum d'apprentissage qu'on ne peut pas faire à votre place.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Avril 2017
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Si vous n'avez pas encore compris qu'un script Python était une suite de blocks délimités par l'indentation... soit vous n'avez pas essayé de faire les exercices, soit votre tuto. est franchement mauvais.
    Peut être que jeter un oeil dans le chapitre qui va bien du Swinnen vous serait utile?
    En tous cas, potasser un tuto. vous appliquer à faire des exercices, histoire de voir comment çà fonctionne, les différents messages d'erreurs,... est le minimum d'apprentissage qu'on ne peut pas faire à votre place.

    - W
    Je te remercie encore de me répondre

    En effet, je n'avais pas compris "Python était une suite de blocks délimités par l'indentation".
    Le lien que tu as mis est tip top, je vais le dévorer en plus de mon bouquin.
    Je n'ai pas fait beaucoup d'exercices, je passais directement à ce que j'ai besoin.

    J'ai corrigé mon script et j'ai une nouvelle erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    root@diagbox:/tmp# python test.py
    Message de demarrage
    Traceback (most recent call last):
      File "test.py", line 24, in <module>
        lcd.set_pixel(x, y, pixel)
      File "/usr/local/lib/python2.7/dist-packages/gfxhat/st7567.py", line 137, in set_pixel
        self.buf[offset] |= (value & 1) << bit
    TypeError: unsupported operand type(s) for &: 'tuple' and 'int'
    /usr/local/lib/python2.7/dist-packages/gfxhat/st7567.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    import RPi.GPIO as GPIO
    import spidev
    import time
    import random
     
    SPI_SPEED_HZ = 1000000
     
    WIDTH = 128
    HEIGHT = 64
     
    PIN_CS = 8
    PIN_RST = 5
    PIN_DC = 6
     
    ST7567_PAGESIZE          = 128
     
    ST7567_DISPOFF           = 0xae # 0xae: Display OFF (sleep mode) */
    ST7567_DISPON            = 0xaf # 0xaf: Display ON in normal mode */
     
    ST7567_SETSTARTLINE      = 0x40 # 0x40-7f: Set display start line */
    ST7567_STARTLINE_MASK    = 0x3f
     
    ST7567_REG_RATIO         = 0x20
     
    ST7567_SETPAGESTART      = 0xb0 # 0xb0-b7: Set page start address */
    ST7567_PAGESTART_MASK    = 0x07
     
    ST7567_SETCOLL           = 0x00 # 0x00-0x0f: Set lower column address */
    ST7567_COLL_MASK         = 0x0f
    ST7567_SETCOLH           = 0x10 # 0x10-0x1f: Set higher column address */
    ST7567_COLH_MASK         = 0x0f
     
    ST7567_SEG_DIR_NORMAL    = 0xa0 # 0xa0: Column address 0 is mapped to SEG0 */
    ST7567_SEG_DIR_REV       = 0xa1 # 0xa1: Column address 128 is mapped to SEG0 */
     
    ST7567_DISPNORMAL        = 0xa6 # 0xa6: Normal display */
    ST7567_DISPINVERSE       = 0xa7 # 0xa7: Inverse display */
     
    ST7567_DISPRAM           = 0xa4 # 0xa4: Resume to RAM content display */
    ST7567_DISPENTIRE        = 0xa5 # 0xa5: Entire display ON */
     
    ST7567_BIAS_1_9          = 0xa2 # 0xa2: Select BIAS setting 1/9 */
    ST7567_BIAS_1_7          = 0xa3 # 0xa3: Select BIAS setting 1/7 */
     
    ST7567_ENTER_RMWMODE     = 0xe0 # 0xe0: Enter the Read Modify Write mode */
    ST7567_EXIT_RMWMODE      = 0xee # 0xee: Leave the Read Modify Write mode */
    ST7567_EXIT_SOFTRST      = 0xe2 # 0xe2: Software RESET */
     
    ST7567_SETCOMNORMAL      = 0xc0 # 0xc0: Set COM output direction, normal mode */
    ST7567_SETCOMREVERSE     = 0xc8 # 0xc8: Set COM output direction, reverse mode */
     
    ST7567_POWERCTRL_VF      = 0x29 # 0x29: Control built-in power circuit */
    ST7567_POWERCTRL_VR      = 0x2a # 0x2a: Control built-in power circuit */
    ST7567_POWERCTRL_VB      = 0x2c # 0x2c: Control built-in power circuit */
    ST7567_POWERCTRL         = 0x2f # 0x2c: Control built-in power circuit */
     
    ST7567_REG_RES_RR0       = 0x21 # 0x21: Regulation Resistior ratio */
    ST7567_REG_RES_RR1       = 0x22 # 0x22: Regulation Resistior ratio */
    ST7567_REG_RES_RR2       = 0x24 # 0x24: Regulation Resistior ratio */
     
    ST7567_SETCONTRAST       = 0x81 # 0x81: Set contrast control */
     
    ST7567_SETBOOSTER        = 0xf8 # Set booster level */
    ST7567_SETBOOSTER4X      = 0x00 # Set booster level */
    ST7567_SETBOOSTER5X      = 0x01 # Set booster level */
     
    ST7567_NOP               = 0xe3 # 0xe3: NOP Command for no operation */
     
    ST7565_STARTBYTES        = 0
     
    class ST7567:
        def __init__(self, pin_rst=PIN_RST, pin_dc=PIN_DC, spi_bus=0, spi_cs=0, spi_speed=SPI_SPEED_HZ):
            self._is_setup = False
            self.pin_rst = pin_rst
            self.pin_dc = pin_dc
            self.spi_bus = spi_bus
            self.spi_cs = spi_cs
            self.spi_speed = spi_speed
            self.clear()
     
        def setup(self):
            if self._is_setup:
                return True
     
            GPIO.setmode(GPIO.BCM)
            GPIO.setwarnings(False)
            GPIO.setup(self.pin_rst, GPIO.OUT)
            GPIO.setup(self.pin_dc, GPIO.OUT)
     
            self.spi = spidev.SpiDev()
            self.spi.open(self.spi_bus, self.spi_cs)
            self.spi.max_speed_hz = self.spi_speed
     
            self._reset()
            self._init()
     
            self._is_setup = True
     
        def dimensions(self):
            return (WIDTH, HEIGHT)
     
        def clear(self):
            self.buf = [0 for _ in range(128*64//8)]
     
        def _command(self, data):
            GPIO.output(self.pin_dc, 0)
            self.spi.writebytes(data)
     
        def _data(self, data):
            GPIO.output(self.pin_dc, 1)
            self.spi.writebytes(data)
     
        def _reset(self):
            GPIO.output(self.pin_rst, 0 )
            time.sleep(0.01)
            GPIO.output(self.pin_rst, 1 )
            time.sleep(0.1)
     
        def _init(self):
            self._command([
                ST7567_BIAS_1_7, # Bais 1/7 (0xA2 = Bias 1/9)
                ST7567_SEG_DIR_NORMAL,
                ST7567_SETCOMREVERSE, # Reverse COM - vertical flip
                ST7567_DISPNORMAL, # Inverse display (0xA6 normal)
                ST7567_SETSTARTLINE | 0, # Start at line 0
                ST7567_POWERCTRL,
                ST7567_REG_RATIO|2,
                ST7567_DISPON,
                ST7567_SETCONTRAST, # Set contrast
                58 # Contrast value
            ])
     
        def set_pixel(self, x, y, value):
            offset = ((y//8) * WIDTH) + x
            bit = y % 8
            self.buf[offset] &= ~(1 << bit)
            self.buf[offset] |= (value & 1) << bit
     
        def show(self):
            self.setup()
            self._command([ST7567_ENTER_RMWMODE])
            for page in range(8):
                offset = page * ST7567_PAGESIZE
                self._command([ST7567_SETPAGESTART | page, ST7567_SETCOLL, ST7567_SETCOLH])
                self._data(self.buf[offset:offset+ST7567_PAGESIZE])
            self._command([ST7567_EXIT_RMWMODE])
     
    if __name__ == "__main__": 
        st7567 = ST7567()
        st7567.setup()
     
        for x in range(64):
            st7567.set_pixel(x, x, 1)
            st7567.set_pixel(64-x, x, 1)
            st7567.set_pixel(x+2, x, 1)
        st7567.show()
     
        time.sleep(2.0)
     
        try:
            while True:
                for x in range(128):
                    for y in range(64):
                        st7567.set_pixel(x, y, random.randint(0,1))
                st7567.show()
        except KeyboardInterrupt:
            pass
    Voici le code modifié ::
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #!/usr/bin/env python
    import time
    from gfxhat import lcd, backlight, fonts
    from PIL import Image, ImageFont, ImageDraw
     
    print("""Message de demarrage""")
     
    backlight.set_all(240,240,240)
    backlight.show()
     
    lcd.clear()
     
    width, height = lcd.dimensions()
     
    image = Image.open("/tmp/aa.jpg")
    draw = ImageDraw.Draw(image)
     
    x = 00 
    y = 00
     
    for x in range(100):
        for y in range(54):
    		pixel = image.getpixel((x, y))
    		lcd.set_pixel(x, y, pixel)
     
    lcd.show()
    Si je ne me trompe pas, il y a un problème de "format".
    Si je ne me trompe pas le module fourni par le constructeur attend un buffer et moi je renvois un int,

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Avril 2017
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #!/usr/bin/env python
    import time
    from gfxhat import lcd, backlight, fonts
    from PIL import Image, ImageFont, ImageDraw
     
    print("""Message de demarrage""")
     
    backlight.set_all(240,240,240)
    backlight.show()
     
    lcd.clear()
     
    image = Image.open("/tmp/aa.jpg")
     
    for x in range(124):
        for y in range(64):
    		pixel = int(image.getpixel((x, y))[0])
    		print(pixel)
    		lcd.set_pixel(x, y, pixel)
     
    lcd.show()

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Script pour afficher des appels SIP sur une page web
    Par gachetg35 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 17/07/2015, 10h15
  2. [JavaScript] Petit script pour afficher les tweets de Twitter sur votre site
    Par Immobilis dans le forum Contribuez
    Réponses: 0
    Dernier message: 20/08/2011, 18h24
  3. Réponses: 4
    Dernier message: 07/07/2006, 12h41
  4. [C# 2.0]Panel ou UserControl pour afficher != pages sur form
    Par frechy dans le forum Windows Forms
    Réponses: 11
    Dernier message: 22/02/2006, 10h04
  5. Script pour afficher la popup "Fermeture de session Win
    Par Childerik dans le forum VBScript
    Réponses: 1
    Dernier message: 28/12/2005, 20h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo