Générer un QR code en cuivre ou en sérigraphie sur un PCB avec pcbnew

Publié le 14 septembre 2026 par leZ

Gravez un QR code en cuivre ou en sérigraphie sur un PCB par script Python : matrice générée, puis un carré par module, avec pcbnew ou l'API IPC.

QR code de 25 × 25 modules dessiné en sérigraphie par script Python pcbnew, encodant https://scriptedpcb.com
Le QR code en sérigraphie (il pointe vers scriptedpcb.com).

Un QR code sur un PCB — pour pointer vers une documentation, un numéro de série, ou juste par style — n’a rien de sorcier une fois qu’on a la matrice du code : il suffit de reproduire chaque module sombre par une forme sur le board. Ce projet combine l’encodage QR (une librairie Python classique, indépendante de KiCad) avec la double boucle déjà vue dans le tuto grille de footprints.

Encoder le texte en QR code

Cette étape est la même quelle que soit l’API KiCad utilisée ensuite : la librairie qrcode construit une matrice de booléens, indépendamment de pcbnew.

import qrcode

qr = qrcode.QRCode(box_size=1, border=0)
qr.add_data("https://scriptedpcb.com")
qr.make()
matrix = qr.get_matrix()  # grille de booléens : True = module sombre

Dessiner chaque module sur le PCB

On boucle sur la matrice et on ajoute un rectangle plein par module sombre :

import pcbnew

board = pcbnew.GetBoard()
from pcbnew import PCB_SHAPE, SHAPE_T_RECT, VECTOR2I, FromMM, F_SilkS

module_mm = 0.5
for row, cols in enumerate(matrix):
    for col, dark in enumerate(cols):
        if not dark:
            continue
        shape = PCB_SHAPE(board)
        shape.SetShape(SHAPE_T_RECT)
        x0, y0 = FromMM(col * module_mm), FromMM(row * module_mm)
        shape.SetStart(VECTOR2I(x0, y0))
        shape.SetEnd(VECTOR2I(x0 + FromMM(module_mm), y0 + FromMM(module_mm)))
        shape.SetFilled(True)
        shape.SetLayer(F_SilkS)
        board.Add(shape)

Même boucle, avec un objet BoardRectangle neuf par module — sans oublier .attributes.fill.filled, sans quoi le rectangle reste juste un contour :

from kipy import KiCad
from kipy.board_types import BoardRectangle
from kipy.geometry import Vector2

board = KiCad().get_board()
silkscreen = board.get_layer_by_name("F.SilkS")

module_mm = 0.5
shapes = []
for row, cols in enumerate(matrix):
    for col, dark in enumerate(cols):
        if not dark:
            continue
        shape = BoardRectangle()
        shape.layer = silkscreen
        shape.top_left = Vector2.from_xy_mm(col * module_mm, row * module_mm)
        shape.bottom_right = Vector2.from_xy_mm((col + 1) * module_mm, (row + 1) * module_mm)
        shape.attributes.fill.filled = True
        shapes.append(shape)

board.create_items(shapes)

Essayez ci-dessous : ajustez la taille de module et la marge pour voir la taille totale nécessaire sur le PCB.

module_mm = 0.5
margin = 2  # modules

for row, cols in enumerate(matrix):
    for col, dark in enumerate(cols):
        if dark:
            place_module(row, col, module_mm)
0.50
2

Taille totale : 14.7 × 14.7 mm

Pour aller plus loin

Graver le QR code sur le cuivre (F_Cu/F.Cu) plutôt que sur la sérigraphie en fait un identifiant résistant à l’usure et à la lumière. Gardez toujours une marge (“quiet zone”) d’au moins 2 modules blancs tout autour du code pour qu’il reste scannable — un scanner de QR code a besoin de cette zone vide pour repérer les motifs d’angle.