Générer un QR code en cuivre ou en sérigraphie sur un PCB avec pcbnew
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.

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.
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.