Générer un QR code sur un PCB avec l'API Python de pcbnew

Publié le 14 septembre 2026 par leZ

Encodez un texte en QR code, puis gravez chaque module sur le cuivre ou la sérigraphie d'un PCB par script — avec pcbnew ou l'API IPC de KiCad.

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 :

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 appel de plus haut niveau pour créer directement un rectangle rempli :

from kicad.geometry import Vector2

module_mm = 0.5
for row, cols in enumerate(matrix):
    for col, dark in enumerate(cols):
        if not dark:
            continue
        shape = board.create_rectangle(
            start=Vector2.from_mm(col * module_mm, row * module_mm),
            end=Vector2.from_mm((col + 1) * module_mm, (row + 1) * module_mm),
            layer="F.SilkS",
            filled=True,
        )
        board.update_items(shape)

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.