jules_verne

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision Les deux révisions suivantes
jules_verne [2016/02/18 22:38]
guiaum créée
jules_verne [2016/02/18 23:12]
guiaum
Ligne 10: Ligne 10:
  
 -> le script python: -> le script python:
 +
 +#​!/​usr/​bin/​env python ​
 +#​coding=utf-8
 +
 +import serial, struct, time
 +
 +# to read key on unix
 +import os
 +import sys
 +import termios
 +import tty
 +
 +# to print, ... ha ha ha
 +import Image, ImageDraw
 +
 +import os.path
 +
 +#​===========================================================#​
 +# RASPBERRY PI (tested with Raspbian Jan 2012):
 +# - Ensure that ttyAMA0 is not used for serial console access:
 +# edit /​boot/​cmdline.txt (remove all name-value pairs containing ​
 +# ttyAMA0) and comment out last line in /​etc/​inittab.
 +# - Fix user permissions with "sudo usermod -a -G dialout pi"
 +# - Reboot
 +# - Ensure that the SERIALPORT setting is correct below
 +#
 +# BEAGLE BONE: 
 +# Mux settings (Ängström 2012.05, also work on ubuntu 12.04):
 +# echo 1 > /​sys/​kernel/​debug/​omap_mux/​spi0_sclk
 +# echo 1 > /​sys/​kernel/​debug/​omap_mux/​spi0_d0 ​
 +#​===========================================================#​
 +
 +print "​Première ligne du script"​
 +    ​
 +class ThermalPrinter(object):​
 +    """ ​
 +        ​
 +        Thermal printing library that controls the "micro panel thermal printer"​ sold in
 +        shops like Adafruit and Sparkfun (e.g. http://​www.adafruit.com/​products/​597). ​
 +        Mostly ported from Ladyada'​s Arduino library ​
 +        (https://​github.com/​adafruit/​Adafruit-Thermal-Printer-Library) to run on
 +        BeagleBone and Raspberry Pi.
 +
 +        Currently handles printing image data and text, but the rest of the
 +        built-in functionality like underlining and barcodes are trivial
 +        to port to Python when needed.
 +
 +        If on BeagleBone or similar device, remember to set the mux settings
 +        or change the UART you are using. See the beginning of this file for
 +        default setup.
 +
 +        Thanks to Matt Richardson for the initial pointers on controlling the
 +        device via Python.
 +
 +        @author: Lauri Kainulainen ​
 +
 +    """​
 +
 +    # default serial port for the Beagle Bone
 +    #SERIALPORT = '/​dev/​ttyO2'​
 +    # this might work better on a Raspberry Pi
 +    SERIALPORT = '/​dev/​ttyAMA0'​
 +
 +    BAUDRATE = 19200
 +    TIMEOUT = 10
 +
 +    # pixels with more color value (average for multiple channels) are counted as white
 +    # tweak this if your images appear too black or too white
 +    black_threshold = 64
 +    # pixels with less alpha than this are counted as white
 +    alpha_threshold = 127
 +
 +    printer = None
 +
 +    _ESC = chr(27)
 +
 +    # These values (including printDensity and printBreaktime) are taken from 
 +    # lazyatom'​s Adafruit-Thermal-Library branch and seem to work nicely with bitmap ​
 +    # images. Changes here can cause symptoms like images printing out as random text. 
 +    # Play freely, but remember the working values.
 +    # https://​github.com/​adafruit/​Adafruit-Thermal-Printer-Library/​blob/​0cc508a9566240e5e5bac0fa28714722875cae69/​Thermal.cpp
 +    ​
 +    # Set "max heating dots", "​heating time", "​heating interval"​
 +    # n1 = 0-255 Max printing dots, Unit (8dots), Default: 7 (64 dots)
 +    # n2 = 3-255 Heating time, Unit (10us), Default: 80 (800us)
 +    # n3 = 0-255 Heating interval, Unit (10us), Default: 2 (20us)
 +    # The more max heating dots, the more peak current will cost
 +    # when printing, the faster printing speed. The max heating
 +    # dots is 8*(n1+1). The more heating time, the more density,
 +    # but the slower printing speed. If heating time is too short,
 +    # blank page may occur. The more heating interval, the more
 +    # clear, but the slower printing speed.
 +    ​
 +    def __init__(self,​ heatTime=80,​ heatInterval=2,​ heatingDots=7,​ serialport=SERIALPORT):​
 +        print "Init Started"​
 + self.printer = serial.Serial(serialport,​ self.BAUDRATE,​ timeout=self.TIMEOUT)
 +        self.printer.write(self._ESC) # ESC - command
 +        self.printer.write(chr(64)) # @   - initialize
 +        self.printer.write(self._ESC) # ESC - command
 +        self.printer.write(chr(55)) # 7   - print settings
 +        self.printer.write(chr(heatingDots)) ​ # Heating dots (20=balance of darkness vs no jams) default = 20
 +        self.printer.write(chr(heatTime)) # heatTime Library default = 255 (max)
 +        self.printer.write(chr(heatInterval)) # Heat interval (500 uS = slower, but darker) default = 250
 +
 +        # Description of print density from page 23 of the manual:
 +        # DC2 # n Set printing density
 +        # Decimal: 18 35 n
 +        # D4..D0 of n is used to set the printing density. Density is 50% + 5% * n(D4-D0) printing density.
 +        # D7..D5 of n is used to set the printing break time. Break time is n(D7-D5)*250us.
 +        printDensity = 15 # 120% (? can go higher, text is darker but fuzzy)
 +        printBreakTime = 15 # 500 uS
 +        self.printer.write(chr(18))
 +        self.printer.write(chr(35))
 +        self.printer.write(chr((printDensity << 4) | printBreakTime))
 +
 +    def offline(self):​
 +        # Take the printer offline. Print commands sent after this will be
 +        # ignored until '​online'​ is called.
 +        self.printer.write(self._ESC)
 +        self.printer.write(chr(61))
 +        self.printer.write(chr(0))
 +
 +    def online(self):​
 +        # Take the printer back online. Subsequent print commands will be obeyed.
 +        self.printer.write(self._ESC)
 +        self.printer.write(chr(61))
 +        self.printer.write(chr(1))
 +
 +    def sleep(self):​
 +        # Put the printer into a low-energy state immediately.
 +        self.sleep_after(1) ​ # Can't be 0, that means '​don'​t sleep'
 +
 +    def sleep_after(self,​ seconds):
 +        # Put the printer into a low-energy state after the given number
 +        # of seconds.
 +        if seconds:
 +            time.sleep(seconds)
 +            self.printer.write(self._ESC)
 +            self.printer.write(chr(56))
 +            self.printer.write(chr(seconds))
 +            self.printer.write(chr(seconds >> 8))
 +
 +    def wake(self):
 +        # Wake the printer from a low-energy state.
 +        self.printer.write(chr(255))
 +        time.sleep(0.05)
 +        self.printer.write(self._ESC)
 +        self.printer.write(chr(56))
 +        self.printer.write(chr(0))
 +        self.printer.write(chr(0))
 +
 +    def has_paper(self):​
 +        # Check the status of the paper using the printer'​s self reporting
 +        # ability. SerialTX _must_ be connected!
 +        self.printer.write(self._ESC)
 +        self.printer.write(chr(118))
 +        self.printer.write(chr(0))
 +        status = -1
 +        if self.printer.inWaiting() > 0:
 +            ret = self.printer.read()
 +            if ret:
 +                status = struct.unpack('​b',​ ret)[0]
 +        return bool(status & 0b00000100)
 +
 +    def reset(self):​
 +        self.printer.write(self._ESC)
 +        self.printer.write(chr(64))
 +
 +    def linefeed(self):​
 +        self.printer.write(chr(10))
 +
 +    def justify(self,​ align="​L"​):​
 +        pos = 0
 +        if align == "​L":​
 +            pos = 0
 +        elif align == "​C":​
 +            pos = 1
 +        elif align == "​R":​
 +            pos = 2
 +        self.printer.write(self._ESC)
 +        self.printer.write(chr(97))
 +        self.printer.write(chr(pos))
 +
 +    def bold_off(self):​
 +        self.printer.write(self._ESC)
 +        self.printer.write(chr(69))
 +        self.printer.write(chr(0))
 +
 +    def bold_on(self):​
 +        self.printer.write(self._ESC)
 +        self.printer.write(chr(69))
 +        self.printer.write(chr(1))
 +
 +    def font_b_off(self):​
 +        self.printer.write(self._ESC)
 +        self.printer.write(chr(33))
 +        self.printer.write(chr(0))
 +
 +    def font_b_on(self):​
 +        self.printer.write(self._ESC)
 +        self.printer.write(chr(33))
 +        self.printer.write(chr(1))
 +
 +    def underline_off(self):​
 +        self.printer.write(self._ESC)
 +        self.printer.write(chr(45))
 +        self.printer.write(chr(0))
 +
 +    def underline_on(self):​
 +        self.printer.write(self._ESC)
 +        self.printer.write(chr(45))
 +        self.printer.write(chr(1))
 +
 +    def inverse_off(self):​
 +        self.printer.write(chr(29))
 +        self.printer.write(chr(66))
 +        self.printer.write(chr(0))
 +
 +    def inverse_on(self):​
 +        self.printer.write(chr(29))
 +        self.printer.write(chr(66))
 +        self.printer.write(chr(1))
 +
 +    def upsidedown_off(self):​
 +        self.printer.write(self._ESC)
 +        self.printer.write(chr(123))
 +        self.printer.write(chr(0))
 +
 +    def upsidedown_on(self):​
 +        self.printer.write(self._ESC)
 +        self.printer.write(chr(123))
 +        self.printer.write(chr(1))
 +        ​
 +    def barcode_chr(self,​ msg):
 +        self.printer.write(chr(29)) # Leave
 +        self.printer.write(chr(72)) # Leave
 +        self.printer.write(msg) ​    # Print barcode # 1:​Abovebarcode 2:Below 3:Both 0:Not printed
 +        ​
 +    def barcode_height(self,​ msg):
 +        self.printer.write(chr(29)) ​ # Leave
 +        self.printer.write(chr(104)) # Leave
 +        self.printer.write(msg) ​     # Value 1-255 Default 50
 +        ​
 +    def barcode_height(self):​
 +        self.printer.write(chr(29)) ​ # Leave
 +        self.printer.write(chr(119)) # Leave
 +        self.printer.write(chr(2)) ​  # Value 2,3 Default 2
 +        ​
 +    def barcode(self,​ msg):
 +        """​ Please read http://​www.adafruit.com/​datasheets/​A2-user%20manual.pdf
 +            for information on how to use barcodes. """​
 +        # CODE SYSTEM, NUMBER OF CHARACTERS ​       ​
 +        # 65=UPC-A ​   11,12    #​71=CODEBAR ​   >1
 +        # 66=UPC-E ​   11,12    #​72=CODE93 ​   >1
 +        # 67=EAN13 ​   12,13    #​73=CODE128 ​   >1
 +        # 68=EAN8 ​   7,8    #​74=CODE11 ​   >1
 +        # 69=CODE39 ​   >1    #​75=MSI ​       >1
 +        # 70=I25 ​       >1 EVEN NUMBER ​          
 +        self.printer.write(chr(29)) ​ # LEAVE
 +        self.printer.write(chr(107)) # LEAVE
 +        self.printer.write(chr(65)) ​ # USE ABOVE CHART
 +        self.printer.write(chr(12)) ​ # USE CHART NUMBER OF CHAR 
 +        self.printer.write(msg)
 +        ​
 +    def print_text(self,​ msg, chars_per_line=None):​
 +        """​ Print some text defined by msg. If chars_per_line is defined, ​
 +            inserts newlines after the given amount. Use normal '​\n'​ line breaks for 
 +            empty lines. """ ​
 +        if chars_per_line == None:
 +            self.printer.write(msg)
 +        else:
 +            l = list(msg)
 +            le = len(msg)
 +            for i in xrange(chars_per_line + 1, le, chars_per_line + 1):
 +                l.insert(i, '​\n'​)
 +            self.printer.write(""​.join(l))
 +            print ""​.join(l)
 +
 +    def print_markup(self,​ markup):
 +        """​ Print text with markup for styling.
 +
 +        Keyword arguments:
 +        markup -- text with a left column of markup as follows:
 +        first character denotes style (n=normal, b=bold, u=underline,​ i=inverse, f=font B)
 +        second character denotes justification (l=left, c=centre, r=right)
 +        third character must be a space, followed by the text of the line.
 +        """​
 +        lines = markup.splitlines(True)
 +        for l in lines:
 +            style = l[0]
 +            justification = l[1].upper()
 +            text = l[3:]
 +
 +            if style == '​b':​
 +                self.bold_on()
 +            elif style == '​u':​
 +               ​self.underline_on()
 +            elif style == '​i':​
 +               ​self.inverse_on()
 +            elif style == '​f':​
 +                self.font_b_on()
 +
 +            self.justify(justification)
 +            self.print_text(text)
 +            if justification != '​L':​
 +                self.justify()
 +
 +            if style == '​b':​
 +                self.bold_off()
 +            elif style == '​u':​
 +               ​self.underline_off()
 +            elif style == '​i':​
 +               ​self.inverse_off()
 +            elif style == '​f':​
 +                self.font_b_off()
 +
 +    def convert_pixel_array_to_binary(self,​ pixels, w, h):
 +        """​ Convert the pixel array into a black and white plain list of 1's and 0's
 +            width is enforced to 384 and padded with white if needed. """​
 +        black_and_white_pixels = [1] * 384 * h
 +        if w > 384:
 +            print "​Bitmap width too large: %s. Needs to be under 384" % w
 +            return False
 +        elif w < 384:
 +            print "​Bitmap under 384 (%s), padding the rest with white" % w
 +
 +        print "​Bitmap size", w
 +
 +        if type(pixels[0]) == int: # single channel
 +            print " => single channel"​
 +            for i, p in enumerate(pixels):​
 +                if p < self.black_threshold:​
 +                    black_and_white_pixels[i % w + i / w * 384] = 0
 +                else:
 +                    black_and_white_pixels[i % w + i / w * 384] = 1
 +        elif type(pixels[0]) in (list, tuple) and len(pixels[0]) == 3: # RGB
 +            print " => RGB channel"​
 +            for i, p in enumerate(pixels):​
 +                if sum(p[0:2]) / 3.0 < self.black_threshold:​
 +                    black_and_white_pixels[i % w + i / w * 384] = 0
 +                else:
 +                    black_and_white_pixels[i % w + i / w * 384] = 1
 +        elif type(pixels[0]) in (list, tuple) and len(pixels[0]) == 4: # RGBA
 +            print " => RGBA channel"​
 +            for i, p in enumerate(pixels):​
 +                if sum(p[0:2]) / 3.0 < self.black_threshold and p[3] > self.alpha_threshold:​
 +                    black_and_white_pixels[i % w + i / w * 384] = 0
 +                else:
 +                    black_and_white_pixels[i % w + i / w * 384] = 1
 +        else:
 +            print "​Unsupported pixels array type. Please send plain list (single channel, RGB or RGBA)"
 +            print "Type pixels[0]",​ type(pixels[0]),​ "​haz",​ pixels[0]
 +            return False
 +
 +        return black_and_white_pixels
 +
 +
 +    def print_bitmap(self,​ pixels, w, h, output_png=False):​
 +        """​ Best to use images that have a pixel width of 384 as this corresponds
 +            to the printer row width. ​
 +            ​
 +            pixels = a pixel array. RGBA, RGB, or one channel plain list of values (ranging from 0-255).
 +            w = width of image
 +            h = height of image
 +            if "​output_png"​ is set, prints an "​print_bitmap_output.png"​ in the same folder using the same
 +            thresholds as the actual printing commands. Useful for seeing if there are problems with the 
 +            original image (this requires PIL).
 +
 +            Example code with PIL:
 +                import Image, ImageDraw
 +                i = Image.open("​lammas_grayscale-bw.png"​)
 +                data = list(i.getdata())
 +                w, h = i.size
 +                p.print_bitmap(data,​ w, h)
 +        """​
 +        counter = 0
 +        if output_png:
 +            import Image, ImageDraw
 +            test_img = Image.new('​RGB',​ (384, h))
 +            draw = ImageDraw.Draw(test_img)
 +
 +        self.linefeed()
 +        ​
 +        black_and_white_pixels = self.convert_pixel_array_to_binary(pixels,​ w, h)        ​
 +        print_bytes = []
 +
 +        # read the bytes into an array
 +        for rowStart in xrange(0, h, 256):
 +            chunkHeight = 255 if (h - rowStart) > 255 else h - rowStart
 +            print_bytes += (18, 42, chunkHeight,​ 48)
 +            ​
 +            for i in xrange(0, 48 * chunkHeight,​ 1):
 +                # read one byte in
 +                byt = 0
 +                for xx in xrange(8):
 +                    pixel_value = black_and_white_pixels[counter]
 +                    counter += 1
 +                    # check if this is black
 +                    if pixel_value == 0:
 +                        byt += 1 << (7 - xx)
 +                        if output_png: draw.point((counter % 384, round(counter / 384)), fill=(0, 0, 0))
 +                    # it's white
 +                    else:
 +                        if output_png: draw.point((counter % 384, round(counter / 384)), fill=(255, 255, 255))
 +                ​
 +                print_bytes.append(byt)
 +        ​
 +        # output the array all at once to the printer
 +        # might be better to send while printing when dealing with 
 +        # very large arrays...
 +        for b in print_bytes:​
 +            self.printer.write(chr(b)) ​  
 +        ​
 +        if output_png:
 +            test_print = open('​print-output.png',​ '​wb'​)
 +            test_img.save(test_print,​ '​PNG'​)
 +            print "​output saved to %s" % test_print.name
 +            test_print.close() ​          
 +
 +
 +
 +
 +def getKey():
 +   fd = sys.stdin.fileno()
 +   old = termios.tcgetattr(fd)
 +   new = termios.tcgetattr(fd)
 +   ​new[3] = new[3] & ~termios.ICANON & ~termios.ECHO
 +   ​new[6][termios.VMIN] = 1
 +   ​new[6][termios.VTIME] = 0
 +   ​termios.tcsetattr(fd,​ termios.TCSANOW,​ new)
 +   key = None
 +   try:
 +      key = os.read(fd, 3)
 +   ​finally:​
 +      termios.tcsetattr(fd,​ termios.TCSAFLUSH,​ old)
 +   ​return key
 +
 +def PrintImage( ImageName) :
 +    i = Image.open( ImageName)
 +    data = list(i.getdata())
 +    w, h = i.size
 +    p.print_bitmap(data,​ w, h, False)
 +    p.linefeed()
 +    p.linefeed()
 +    p.linefeed()
 +
 +if __name__ == '​__main__':​
 +    import sys, os
 +
 +   
 +
 +    if len(sys.argv) == 2:
 +        serialport = sys.argv[1]
 + print "point d'​arrêt n°1"
 +    else:
 +        serialport = ThermalPrinter.SERIALPORT
 + print "point d'​arrêt n°2"
 +    if not os.path.exists(serialport):​
 +        sys.exit("​ERROR:​ Serial port not found at: %s" % serialport)
 +
 +    print "​Testing printer on port %s" % serialport
 +    ​
 +    p = ThermalPrinter(serialport=serialport)
 +    ​
 +    p.print_text("​\nLes Voyages typo-graphiques\n"​)
 +    p.print_text("​\nde Jules Verne\n"​)
 +    ​
 +    # runtime dependency on Python Imaging Library
 +
 +    ImgArrays = {   '​A':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_A.png'​
 +                  , '​B':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_B.png'​
 +                  , '​C':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_C.png'​
 +                  , '​D':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_D.png'​
 +                  , '​E':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_E.png'​
 +                  , '​F':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_F.png'​
 +                  , '​G':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_G.png'​
 +                  , '​H':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_H.png'​
 +                  , '​I':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_I.png'​
 +                  , '​J':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_J.png'​
 +                  , '​K':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_K.png'​
 +                  , '​L':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_L.png'​
 +                  , '​M':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_M.png'​
 +                  , '​N':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_N.png'​
 +                  , '​O':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_O.png'​
 +                  , '​P':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_P.png'​
 +                  , '​Q':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_Q.png'​
 +                  , '​R':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_R.png'​
 +                  , '​S':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_S.png'​
 +                  , '​T':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_T.png'​
 +                  , '​U':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_U.png'​
 +                  , '​V':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_V.png'​
 +                  , '​W':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_W.png'​
 +                  , '​X':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_X.png'​
 +                  , '​Y':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_Y.png'​
 +                  , '​Z':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_Z.png'​
 +                  , '​0':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_0.png'​
 +                  , '​1':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_1.png'​
 +                  , '​2':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_2.png'​
 +                  , '​3':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_3.png'​
 +                  , '​4':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_4.png'​
 +                  , '​5':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_5.png'​
 +                  , '​6':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_6.png'​
 +                  , '​7':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_7.png'​
 +                  , '​8':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_8.png'​
 +                  , '​9':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_9.png'​
 +                  , ' ':'/​home/​pi/​git/​py-thermal-printer/​pics/​VT_Codex_Thermique_00_Espace.png'​
 +                  }
 +
 +    ch=''​
 +    Cnt=0;
 +    while ch != '&':​
 +
 +        ch = getKey()
 +        if(('​\n'​ == ch) or ('​\r'​ == ch)):
 +            Cnt = 0
 +            # return char won't print
 +        elif(0 == Cnt):
 +            Cnt = 1
 +            # will print, next will not
 +        else:
 +            Cnt = 0
 +            ch = '​\n'​
 +            # won't print next will print
 +        if ch in ImgArrays :
 +            ImageName = ImgArrays[ch]
 +            if os.path.isfile(ImageName):​
 +                # print('​for %s printing %s' % (ch, ImageName))
 +                 ​PrintImage( ImageName);
 +       # ​    else :
 +               # print('​for %s do not find %s' % (ch, ImageName))
 +       # else :
 +           # print('​ no pics defined for %s ... sniff'​% ch)
 +       
 +
 +    ​
 +
  
 -> dans le clavier en kapla, un arduino Leonardo: -> dans le clavier en kapla, un arduino Leonardo:
  • jules_verne.txt
  • Dernière modification: 2016/03/04 08:08
  • (modification externe)