▧ NSI MAKERLE LABO NUMÉRIQUE → PHYSIQUELe défi ↗

🖨️ NSI MAKER / ATELIER 01

De Python
à l’objet réel.

Comment transformer quelques lignes de code en un véritable objet imprimé en 3D ?

Des variables, une boucle… et bientôt un objet entre tes mains. Construis pas à pas ton premier projet maker.

Entrer dans l’atelier ↓
🐍 Python⌘ OpenSCAD🖨 P1S
PROJET : TOURS DE HANOÏ
❯ python hanoi.py
5 disques. Une infinité de possibilités.▌

Terminale · Du chapitre S01 à l’objet réel
Trois tiges pour manipuler des piles, des disques pour le tri de crêpes, une file pour organiser des travaux. Explorer la passerelle piles & files →

01 Comprendre la machine02 Coder la forme03 Fabriquer ton projet

01 / DÉCOUVRIR

Une machine qui dessine en volume.

Notre Bambu Lab P1S utilise le procédé FDM/FFF : elle dépose du filament thermoplastique ramolli par la chaleur, qui se solidifie en refroidissant.

◎ Bobine→⚙ Extrudeur→▼ Buse→▱ Couche→▣ Objet

Alimenter & déposer

La bobine stocke le filament. L’extrudeur l’entraîne vers la buse chaude, qui dépose un cordon fin selon une trajectoire.

Construire sur le plateau

Le plateau soutient la pièce. Chaque couche repose sur les précédentes. Le volume nominal est de 256 × 256 × 256 mm ; l’espace réellement utilisable dépend de la préparation.

Accompagner l’impression

L’enceinte est fermée. Le nivellement automatique mesure les écarts du plateau pour les compenser ; un capteur détecte la fin du filament. Ces aides ne remplacent pas la vérification humaine.

🧠 À retenir

Une imprimante 3D ne « crée » pas un objet en une fois. Elle le construit couche après couche.

02 / ALIMENTER

🎨 AMS — Automatic Material System

P1S = imprimante. AMS = gestion de plusieurs bobines. L’AMS à quatre emplacements peut alimenter l’imprimante et changer automatiquement de filament pour des impressions multicolores ou des changements de matériaux compatibles.

◎1 · corail◎2 · jaune◎3 · vert◎4 · bleu→ 🖨 P1S

Plusieurs AMS peuvent être combinés dans certaines configurations avec les accessoires adaptés. Ici, quatre bobines suffisent à comprendre le principe.

⚠️ Tous les matériaux ne se combinent pas forcément

Température, adhérence entre couches et propriétés comptent. Vérifie aussi la compatibilité du filament avec l’AMS. Un changement de couleur peut produire des purges : plus de couleurs peut signifier plus de déchets.

03 / RELIER

De l’idée à l’objet : qui fait quoi ?

Clique sur une étape pour suivre le voyage.

Le slicer (« trancheur ») découpe virtuellement le modèle en couches et prépare les instructions de déplacement et de dépôt destinées à l’imprimante.

04 / COMPRENDRE LES FORMATS

Quatre extensions, quatre rôles.

FichierContientModifiable facilement ?Utilité
.pyProgramme PythonOuiCalcul et génération
.scadModèle paramétrique OpenSCADOuiModélisation
.stlMaillage triangulaire de la surfacePeuÉchange / impression
.3mfModèle / projet enrichiSelon logicielPréparation / impression

Le .py calcule les dimensions et génère une description. Le .scad décrit la géométrie avec des paramètres. Le .3mf peut conserver des objets, des unités, des couleurs, des matériaux ou des paramètres de projet : cela dépend du logiciel et du workflow, pas seulement de l’extension.

🧠 À retenir

Un STL contient essentiellement la géométrie. Il ne conserve pas le programme paramétrique qui l’a créée et ne définit pas explicitement les unités : vérifie l’échelle à l’importation.

05 / PRÉPARER

Bambu Studio : de la forme aux couches.

  1. Importer et placer le STL ou le 3MF, vérifier les dimensions, orienter et répartir les pièces sur le plateau.
  2. Choisir les réglages : profil P1S et buse installée, filament, couleurs, température du profil, hauteur de couche, parois et remplissage intérieur.
  3. Prévoir les supports pour les parties en surplomb si nécessaire ; une meilleure orientation peut en réduire le besoin.
  4. Trancher puis inspecter l’aperçu couche par couche, le temps estimé et la quantité de filament. Faire valider avant tout envoi à l’imprimante, selon l’environnement de l’établissement.

MANIPULATION / UN MINI SLICER

Monte couche après couche.

Simulation pédagogique d’un bloc de 10 mm à 0,2 mm par couche. Aucun véritable tranchage n’est effectué.

🧠 À retenir

Le STL décrit la forme. Bambu Studio décide comment cette forme sera imprimée.

06 / MODÉLISER

OpenSCAD : le code prend forme.

OpenSCAD est un logiciel gratuit et open source de modélisation 3D par le code. Dans cet atelier, nos dimensions sont en millimètres. Crée un fichier, saisis le code et lance l’aperçu (F5).

cube([30, 30, 10]);

Un pavé de 30 × 30 × 10 mm : les trois valeurs sont les dimensions selon x, y et z.

difference() conserve la première forme, puis lui soustrait les suivantes. Un cylindre retiré d’un autre crée un trou. Ces schémas sont simplifiés : le navigateur n’exécute pas OpenSCAD.

07 / EXPÉRIMENTER

Ton premier objet : un disque percé.

Modifie les trois paramètres. Observe la forme et le code évoluer ensemble.

🧠 Pourquoi dépasser ?

Le cylindre soustrait commence à z = −1 et mesure epaisseur + 2 : il dépasse donc de 1 mm de chaque côté. Cela évite les faces exactement confondues et garantit un trou traversant.

08 / LE DÉCLIC

Et si Python écrivait le modèle pour toi ?

Python peut fabriquer automatiquement le fichier OpenSCAD.

diametre = 50
epaisseur = 6
trou = 10

code_scad = f'''
difference() {{
    cylinder(h={epaisseur}, d={diametre});
    translate([0, 0, -1])
        cylinder(h={epaisseur + 2}, d={trou});
}}
'''

with open("disque.scad", "w", encoding="utf-8") as fichier:
    fichier.write(code_scad)
  1. Python stocke les dimensions dans des variables.
  2. La chaîne f'''…''' insère leurs valeurs. Les doubles accolades {{ et }} produisent des accolades littérales dans le code OpenSCAD.
  3. with open écrit puis ferme disque.scad dans le dossier de travail (un fichier du même nom serait remplacé).
  4. Ouvre ce fichier dans OpenSCAD.
  5. Lance l’aperçu : ton modèle apparaît.
disque.py → Python → disque.scad → OpenSCAD → modèle 3D

Enregistre ce programme dans disque.py et exécute-le avec Python 3 sur le poste de travail. Ici, les visualisations tournent en JavaScript ; elles n’exécutent pas Python.

09 / PROGRAMMER

Une boucle. Toute une série de disques.

Complète ce programme pour produire hanoi.scad. Les disques doivent rester séparés.

nb_disques = 5
diametre_min = 30
pas = 8
epaisseur = 6
trou = 10
espacement = 10

for i in range(nb_disques):
    diametre = diametre_min + i * pas
    # TODO : calculer la position du disque
    # TODO : générer son code OpenSCAD
🤔 À toi de réfléchir

Un déplacement constant de 30 mm suffirait-il lorsque les disques deviennent plus grands ? Dessine leurs centres et leurs bords.

10 / GÉNÉRALISER

Paramétrique : change la règle, pas le dessin.

Un modèle est paramétrique lorsque sa géométrie dépend de paramètres modifiables sans reconstruire manuellement l’objet.

🤔 À toi de réfléchir

Remplace seulement nb_disques = 5 par nb_disques = 8. Pourquoi est-ce plus intéressant que de dessiner huit disques à la main ? Quels tests faut-il refaire ?

Comparer ton raisonnement

La boucle reproduit la même règle, limite les oublis et permet de régénérer toutes les pièces. Il faut cependant vérifier le diamètre maximal, le placement, la hauteur des tiges et le volume d’impression. Automatiser n’efface pas les contraintes physiques.

11 / AUTOMATISER

Python peut aussi demander l’export.

À la main

Python → .scad → OpenSCAD → rendu (F6) → Fichier / Exporter / STL.

Automatiquement

Python → .scad → OpenSCAD en ligne de commande → .stl.

import subprocess

try:
    subprocess.run([
        "openscad",
        "-o",
        "hanoi.stl",
        "hanoi.scad"
    ], check=True)
except FileNotFoundError:
    print("OpenSCAD n'est pas accessible depuis la ligne de commande.")
except subprocess.CalledProcessError as erreur:
    print("L'export a échoué : vérifier le fichier SCAD.", erreur)

Python ne fabrique pas lui-même le maillage. Il lance OpenSCAD, qui calcule le rendu et l’export. OpenSCAD doit être installé ; le nom de la commande ou le chemin de l’exécutable dépend de l’installation. Demande le chemin configuré sur les PC de l’établissement. check=True signale un code de sortie en erreur.

Le fichier source doit exister dans le dossier de travail ; on peut aussi employer des chemins explicites. L’option -o choisit la sortie, et l’extension choisit le format : .stl ou .3mf, notamment. Un 3MF exporté par OpenSCAD n’est pas automatiquement un projet Bambu Studio configuré.

⚠️ Exporté ne veut pas dire prêt à imprimer

Le STL de la rangée complète peut être trop large. Préfère les exports des disques séparés, puis organise les plateaux dans Bambu Studio.

12 / PASSER AU RÉEL

Tu connais maintenant toute la chaîne.

🐍 Python↓📄 .SCAD↓🔷 OpenSCAD↓📦 .STL / .3MF↓🍕 Bambu Studio↓🧵 Tranchage↓🖨️ Bambu Lab P1S↓🗼 Tours de Hanoï

Dans Bambu Studio, vérifie l’échelle, sélectionne le profil adapté, organise les pièces, tranche et inspecte l’aperçu. L’enseignant valide les réglages et autorise l’impression. L’envoi dépend du réseau et de la configuration de l’établissement.

13 / À TOI DE FABRIQUER

🏆 Défi Maker : Tours de Hanoï

Conçois un jeu fonctionnel, destiné à notre P1S.

Ta mission

  • Une base stable et trois tiges.
  • Au moins cinq disques de diamètres différents.
  • Un trou dans chaque disque pour passer sur les tiges.
  • Des pièces organisées sur des plateaux imprimables.

Ton contrat de programmeur

Le modèle dépend de nb_disques, diametre_min, pas, epaisseur et diametre_trou. Aucun redessin manuel quand ces valeurs changent.

Le nom trou des premiers exemples devient diametre_trou dans ton projet.

Espace les tiges en fonction du plus grand disque. Prévois une hauteur utile supérieure à la pile de tous les disques et réfléchis à l’assemblage des tiges sur la base.

⚠️ Prévoir du jeu

Un trou exactement égal au diamètre théorique de la tige risque de mal s’emboîter après impression. Il n’existe pas une tolérance universelle : teste plusieurs jeux avant la fabrication finale.

↗ Relier ce jeu au chapitre S01 : piles, files et tri de crêpes

À rendre

  • Le programme Python commenté et les sources SCAD.
  • Les modèles exportés et un projet Bambu Studio vérifié.
  • Un relevé du test de tolérance et une justification de l’orientation.
  • Deux générations réussies : cinq puis huit disques.
Rappel des règles du jeu

Déplace toute la pile vers une autre tige, un disque à la fois, sans jamais poser un grand disque sur un plus petit. Extension NSI : écris la résolution récursive ; le minimum est 2ⁿ − 1 déplacements pour n disques.

PASSERELLE TERMINALE / S01 · STRUCTURES DE DONNÉES

Des piles et des files que tu peux manipuler.

Les disques que tu programmes deviennent le matériel de ton cours.

Dans le chapitre S01, une pile suit l’ordre LIFO (dernier entré, premier sorti) ; une file suit l’ordre FIFO (premier entré, premier sorti). L’impression fabrique les pièces ; les structures de données organisent les valeurs et les actions de notre programme.

Dans tes documents S01Dans l’atelier Maker
Cours, §3–4, p. 4–5 ; activités 2 à 5Suivre un sommet de pile et une sortie de file, opération par opération.
Cours, §5, p. 5–7 ; activités 7–8 ; exercices 4–5Distinguer le type abstrait de son implémentation avec list ou deque.
Exercice 6, p. 2–4Réutiliser les disques pour hauteur_pile, max_pile, retourner et le tri de crêpes.
Mes documents S01 — consultables hors ligne

Les corrigés ont servi à préparer cette passerelle ; ils ne sont pas ajoutés aux téléchargements élèves.

Du vocabulaire du cours au code Python

Nous fixons une convention pour tous les exemples ci-dessous : sommet de pile à droite ; sortie de file à gauche. Une autre orientation de dessin est possible : c’est l’ordre des opérations qui définit LIFO ou FIFO.

Type abstrait S01Implémentation choisieEffet
push(P, x) / empiler(P, x)P.append(x)Ajouter au sommet
pop(P) / depiler(P)P.pop()Retirer et renvoyer le sommet
enqueue(F, x)F.append(x)Ajouter à l’entrée
dequeue(F)F.popleft()Retirer et renvoyer le plus ancien
estVide(S) / taille(S)len(S) == 0 / len(S)Tester / compter sans retirer

On choisit une liste Python pour une pile et collections.deque pour une file, comme dans les activités 7 et 8. Les noms abstraits ne sont pas tous des fonctions Python prédéfinies. Avant de retirer un élément, il faut vérifier que la structure n’est pas vide.

🗼 Hanoï : trois tiges, trois piles

Un entier représente le rang d’un disque : 1 est le plus petit. On peut seulement retirer le sommet d’une tige. Hanoï ajoute une contrainte : aucun grand disque sur un plus petit. Cette contrainte n’appartient pas à la définition générale d’une pile.

Transfère les cinq disques de A vers C.

A = [5, 4, 3, 2, 1]  # sommet à droite
B = []
C = []
def deplacer(source, destination):
    if source is destination or not source:
        return False
    if destination and source[-1] > destination[-1]:
        return False
    disque = source.pop()
    destination.append(disque)
    return True
🤔 Comme dans les activités 2–3

Après A → B puis A → C, quel est le sommet de A ? Pourquoi le mouvement C → B est-il interdit ? Justifie avec les valeurs, puis teste.

🧵 Une file d’attente pour l’atelier

Modélisons des travaux validés qui attendent leur tour : le plus ancien sort le premier. C’est une simulation FIFO choisie pour le cours, pas une description du fonctionnement interne de Bambu Studio ou de l’AMS. Aucun bouton ne commande l’imprimante.

← Sortie : le plus ancien Entrée : le plus récent ←

La file est vide : estVide(F) vaut True.

from collections import deque
F = deque()
from collections import deque

F = deque()
F.append("test")       # enqueue(F, "test")
F.append("disques")
if F:                  # pas de retrait sur une file vide
    prochain = F.popleft()  # dequeue(F) renvoie "test"
🤔 Rejoue les activités 4–5 et 8

Ajoute « Test de tolérance », puis « Disques », puis « Base ». Prédis le premier travail retiré et la taille restante. Que changerait pop() à la place de popleft() ?

🥞 Tes disques deviennent les crêpes de l’exercice 6

Retire les disques des tiges et pose-les sur la table. Dans cet exercice, les entiers représentent les diamètres : on retourne un bloc de disques du sommet. On peut poser un grand sur un petit pendant le tri : les règles de Hanoï ne s’appliquent plus.

Exemple de la fiche, p. 4 : [5, 9, 3, 6], du bas vers le sommet.

Trouve le plus grand disque, puis amène-le en bas en deux retournements.

  1. hauteur_pile(P) : compter avec une pile auxiliaire puis restaurer P. La hauteur abstraite est un nombre de disques ; la hauteur physique vaut ce nombre × l’épaisseur.
  2. max_pile(P, i) : chercher la position du maximum parmi les i disques du sommet, en comptant le sommet comme position 1, puis restaurer P.
  3. retourner(P, j) : inverser les j disques du sommet avec deux piles auxiliaires, comme demandé dans la fiche.
  4. tri_crepes(P) : placer le plus grand disque restant au sommet, puis le retourner jusqu’au bas de la partie non triée.
⚠️ Deux contrats différents

hauteur_pile et max_pile doivent préserver la pile. retourner et tri_crepes doivent la modifier. Pour ces exercices, respecte l’interface fournie : un tri direct avec sort() ne répond pas au problème.

Pour fabriquer l’exemple, choisis par exemple diametre_mm = 10 * valeur : 5 devient 50 mm. Cette conversion garde l’ordre des tailles. Ici, la simulation reprend les valeurs du document ; les diamètres réels restent des paramètres de fabrication.

🏆 À rendre avec ton projet Maker

Une trace de trois déplacements de Hanoï ; une trace d’enfilements/défilements avec la valeur retirée ; les tests de hauteur_pile, max_pile et retourner ; puis une photo des disques utilisés pour vérifier le tri de crêpes. Compare toujours l’état avant et après.

🧩 Et le labyrinthe ?

En prolongement, DFS itératif utilise une pile de cases à explorer ; BFS utilise une file. Pour un labyrinthe où chaque déplacement a le même coût, BFS trouve un chemin avec un nombre minimal de déplacements. DFS ne garantit pas ce minimum. Dans les deux cas, marque les cases déjà découvertes pour éviter les cycles. La matrice produit les murs imprimés ; la pile ou la file organise l’exploration.

Auto-évaluation S01 — prédire avant de déplier

1. On empile 34, 76, 43. Que renvoie un dépilement ?
2. On enfile 67, 34, 78. Que renvoie un défilement ?
3. retourner([5, 9, 3, 6], 3) donne quoi, sommet à droite ?

Comparer avec les réponses

1. 43 (LIFO). 2. 67 (FIFO). 3. [5, 6, 3, 9] : les trois éléments du sommet ont été inversés, le disque du bas n’a pas bougé.

14 / CONFRONTER AU RÉEL

🧪 Le petit test qui évite un grand raté.

Crée une barrette avec quatre trous de diamètres tige + 0,1 ; + 0,2 ; + 0,3 ; + 0,4 mm. Ce sont des écarts de diamètre à expérimenter, pas des recommandations universelles.

diametre_tige = 8;
jeux = [0.1, 0.2, 0.3, 0.4];
difference() {
    cube([60, 20, 4]);
    for (i = [0:3])
        translate([9 + i * 14, 10, -1])
            cylinder(h=6, d=diametre_tige + jeux[i], $fn=80);
}

Pour cette barrette d’exemple, conserve la tige de 8 mm ; si tu changes son diamètre, adapte aussi les distances et les marges. Repère les trous de gauche à droite. Fais valider puis imprimer le test dans des conditions proches du projet (matière, orientation et réglages).

Jeu diamétralTrou pour tige de 8 mmÀ relever sur papier
+ 0,1 mm8,1 mmBloqué / serré / glissant / trop libre
+ 0,2 mm8,2 mmBloqué / serré / glissant / trop libre
+ 0,3 mm8,3 mmBloqué / serré / glissant / trop libre
+ 0,4 mm8,4 mmBloqué / serré / glissant / trop libre
🤔 Quel jeu fonctionne le mieux ?

Décide avec notre imprimante, notre filament et nos paramètres. Si aucun trou ne convient, élargis la série de tests. Le monde réel fait partie du débogage.

15 / BONUS AVANCÉ · FACULTATIF

🧩 Une matrice, un labyrinthe en 3D.

labyrinthe = [
    "#########",
    "#S......#",
    "#.###.#.#",
    "#...#.#E#",
    "#########"
]

for ligne in range(len(labyrinthe)):
    for colonne in range(len(labyrinthe[ligne])):
        if labyrinthe[ligne][colonne] == "#":
            # TODO : générer un mur
            pass

# = mur · S = départ · E = arrivée

La même matrice peut afficher le labyrinthe, le résoudre avec BFS/DFS, générer son modèle 3D puis permettre de l’imprimer. Pour un mur, place un cube en [colonne * taille, ligne * taille, hauteur_base] et ajoute un socle sous l’ensemble.

🏆 Défi Maker

Génère les murs avec deux boucles imbriquées. Puis retrouve le chemin avec BFS (parcours en largeur) ou DFS (parcours en profondeur) avant de fabriquer le labyrinthe.

16 / FABRIQUER RESPONSABLEMENT

Avant d’appuyer sur « imprimer ».

  • Ne touche ni la buse chaude ni le plateau chaud.
  • N’interviens pas sur une impression sans autorisation.
  • Fais valider le modèle et les réglages par l’enseignant.
  • Vérifie les dimensions, l’orientation et les supports nécessaires.
  • Limite le gaspillage de filament et les supports inutiles.
  • Teste une petite pièce avant une très longue impression.
  • Respecte les consignes de l’établissement, notamment de supervision et de ventilation.

17 / VÉRIFIER LE DÉCLIC

Ton programme peut-il devenir un objet ?

Huit questions pour vérifier que tu maîtrises la chaîne. Choisis une réponse par question.