Un totem pour graver des runes sacrées avec la lumière - pour Pctamalou.fr 💖
Jeune apache, ce totem grave avec un laser pour créer des œuvres d’art et apprendre, pas pour détruire. Utilise-le avec l’honneur d’un chaman, sous la voûte céleste. Porte des lunettes de protection laser et suis les consignes de sécurité. Prêt à forger sous les étoiles ? 🌌
Jeune nomade, entends-tu le hurlement du loup dans la nuit du désert ? Ce projet est un graveur laser DIY forgé à partir d’un vieux lecteur de disquettes 3.5", un totem rétro qui trace des runes sacrées – un loup sur du papier thermique ou du bois fin, avec la précision d’un faisceau lumineux. Piloté par un Arduino Nano, ce totem transforme une image en binaire, grave ligne par ligne, et chante une mélodie sacrée une fois la tâche accomplie. Avec des bonus pour hacker les disquettes et des visions pour l’avenir, ce projet est une quête pour apprendre, comprendre et créer. Prêt à sculpter cette légende avec Platon-y, sous les étoiles de Pctamalou.fr ? 🐺
🔥 Les Visions de ce Totem
Niveau : ★★★★☆ – Un défi pour les apaches aguerris, mais nous le forgerons ensemble.
Jeune nomade, pour forger ce graveur laser, il faut des os anciens et des pierres précieuses. Voici les offrandes nécessaires pour ce rituel, préparées avec l’honneur d’un chaman.
📜 Matériaux du Rituel
Matériaux de Base :
Matériaux Complémentaires :
| Composant | Fonction | Prix |
|---|---|---|
| Connecteur JST 2.5mm | Fixation LiPo | 2€ |
| Gaine thermorétractable | Isolation | 1€/m |
| Papier thermique | Support pour gravure | 5€/rouleau |
| Contreplaqué fin (1mm) | Support alternatif | 5€ |
| Boîtier PLA (100x80x50mm) | Support totem | 5€ (impression 3D) |
| Câbles jumper | Connexions | 2€ |
Jeune apache, nous allons transformer ce lecteur de disquettes en un graveur laser, un totem qui trace des runes avec un faisceau de lumière. Chaque étape est un pas dans les dunes du savoir, forgé avec la précision d’un artisan nomade. Prends ma main, frère, et créons ce totem pour qu’il hurle dans la nuit sacrée.
🔨 L’Atelier des Chamans
Ouvre ton lecteur de disquettes 3.5" comme un chaman dévoile un artefact. Identifie les deux moteurs pas-à-pas : l’un pour l’axe Y (tête, 4 fils : A, B, A’, B’) et l’autre pour l’axe X (support, 4 fils). Teste les bobines avec un multimètre (résistance ~10Ω). Retire la tête magnétique, car elle sera remplacée par le module laser.
⚠️ Attention : Les moteurs sont fragiles. Isole les fils avec de la gaine thermorétractable pour éviter les courts-circuits.
Fixe le module laser 5mW à l’emplacement de la tête magnétique avec de la colle chaude, en alignant le faisceau avec le support. Connecte le laser au MOSFET IRF520 : entrée du MOSFET à D7 (PWM), sortie au laser (+ et -), et GND commun avec l’Arduino. Ajoute une résistance de 1kΩ entre D7 et la gate du MOSFET.
Connecte les moteurs pas-à-pas aux TB6600 : - Axe Y (tête) : 4 fils (A, B, A’, B’) au TB6600 n°1, puis ENA- à GND, DIR à D5, PUL à D6. - Axe X (support) : 4 fils au TB6600 n°2, puis ENA- à GND, DIR à D8, PUL à D9. Configure les TB6600 en mode 1/16 micro-pas (switches : 1-ON, 2-OFF, 3-ON). Branche l’OLED (SDA A4, SCL A5, VCC 3.3V, GND), le buzzer (D3), et la batterie LiPo (RAW via JST).
Imprime un boîtier PLA (100x80x50mm, résolution 0.2mm, remplissage 20%) pour accueillir le lecteur, l’Arduino, les TB6600, et le laser. Ajoute un slot pour insérer une disquette modifiée avec un support de gravure (papier thermique ou contreplaqué). Fixe avec des vis M3 (6mm).
Ouvre une disquette 3.5", retire le disque magnétique, et colle un carré de papier thermique ou de contreplaqué fin (8x8cm) à sa place. Assure-toi que le support est bien tendu et fixé. Le laser gravera ce support avec une précision chamanique.
Jeune nomade, voici le code sacré qui insuffle l’esprit dans notre graveur laser. Il contrôle les moteurs pour déplacer le faisceau, ajuste l’intensité du laser, et affiche l’avancement sur l’OLED, comme un miroir reflétant les étoiles. Le mode hardcore overclocke les moteurs pour une gravure rapide et cache des messages dans les secteurs.
🔥 Le Chant du Loup
Téléverse ce code sur l’Arduino Nano pour faire chanter le totem. Il grave un motif de loup hurlant (80x80px) sur 80 pas en X et Y, avec PWM pour le laser. Le mode hardcore réduit le délai à 100µs par pixel.
// Code Arduino pour le Graveur Laser DIY : Le Loup Hurlant
// Utilise un motif binaire 80x80px (wolfPattern[80][10])
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define STEP_DIR_Y 5
#define STEP_PUL_Y 6
#define STEP_DIR_X 8
#define STEP_PUL_X 9
#define LASER_PIN 7
#define BUZZER_PIN 3
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
bool hardcoreMode = false;
int stepDelay = 200; // Micro-pas (µs)
// Motif du loup (80x80px, 1 = blanc/rouge, 0 = noir)
const byte wolfPattern[80][10] = {
// Ligne 0 à 11 (fond noir)
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
// Ligne 12
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00},
// Ligne 13
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00},
// Ligne 14
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00},
// Ligne 15
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00},
// Ligne 16
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80},
// Ligne 17
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80},
// Ligne 18
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xC0},
// Ligne 19
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xC0},
// Ligne 20
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80},
// Ligne 21
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80},
// Ligne 22
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x00},
// Ligne 23
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00},
// Ligne 24
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFC, 0x20},
// Ligne 25
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xF8, 0x60},
// Ligne 26
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xF0, 0xE0},
// Ligne 27
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xE0},
// Ligne 28
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xC0},
// Ligne 29
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xC0},
// Ligne 30
{0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x80},
// Ligne 31
{0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0x00},
// Ligne 32
{0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0x00},
// Ligne 33
{0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFE, 0x00},
// Ligne 34
{0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFE, 0x00},
// Ligne 35
{0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00},
// Ligne 36
{0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x00},
// Ligne 37
{0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF8, 0x00},
// Ligne 38
{0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00},
// Ligne 39
{0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00},
// Ligne 40 (œil rouge)
{0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00},
// Ligne 41
{0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xE0, 0x00},
// Ligne 42
{0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xE0, 0x00},
// Ligne 43
{0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00},
// Ligne 44
{0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00},
// Ligne 45
{0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00},
// Ligne 46
{0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00},
// Ligne 47
{0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00},
// Ligne 48
{0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00},
// Ligne 49
{0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00},
// Ligne 50
{0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00},
// Ligne 51
{0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00},
// Ligne 52
{0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00},
// Ligne 53
{0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xF8, 0x00, 0x00},
// Ligne 54
{0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xF8, 0x00, 0x00},
// Ligne 55
{0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xF0, 0x00, 0x00},
// Ligne 56
{0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xF0, 0x00, 0x00},
// Ligne 57
{0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xE0, 0x00, 0x00},
// Ligne 58
{0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xE0, 0x00, 0x00},
// Ligne 59
{0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00},
// Ligne 60
{0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x00, 0x00},
// Ligne 61
{0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x00},
// Ligne 62
{0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00},
// Ligne 63
{0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00},
// Ligne 64
{0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00},
// Ligne 65
{0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00},
// Ligne 66
{0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00},
// Ligne 67
{0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00},
// Ligne 68
{0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00},
// Ligne 69 à 79 (fond noir)
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
};
void setup() {
Serial.begin(115200);
pinMode(STEP_DIR_Y, OUTPUT);
pinMode(STEP_PUL_Y, OUTPUT);
pinMode(STEP_DIR_X, OUTPUT);
pinMode(STEP_PUL_X, OUTPUT);
pinMode(LASER_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Erreur OLED"));
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Totem Pret");
display.println("Calibration...");
display.display();
// Calibration laser
analogWrite(LASER_PIN, 50); // 20% intensité
delay(1000);
analogWrite(LASER_PIN, 0);
}
void loop() {
if (Serial.available()) {
String cmd = Serial.readStringUntil('\n');
if (cmd == "HARDCORE_ON") {
hardcoreMode = true;
stepDelay = 100; // Overclocking
Serial.println("HARDCORE_ACTIVATED");
display.clearDisplay();
display.setCursor(0, 0);
display.println("Mode Hardcore!");
display.display();
delay(2000);
} else if (cmd == "HIDE_MESSAGE") {
hideMessageInSector();
}
}
for (int y = 0; y < 80; y++) {
moveToLine(y, STEP_DIR_Y, STEP_PUL_Y);
for (int x = 0; x < 80; x++) {
moveToColumn(x, STEP_DIR_X, STEP_PUL_X);
int byteIndex = x / 8;
int bitIndex = x % 8;
bool pixel = (wolfPattern[y][byteIndex] >> (7 - bitIndex)) & 1;
analogWrite(LASER_PIN, pixel ? 255 : 0); // PWM laser
delayMicroseconds(hardcoreMode ? 100 : 200);
}
display.clearDisplay();
display.setCursor(0, 0);
display.println("Gravure Loup...");
display.print("Ligne: ");
display.println(y + 1);
display.display();
}
analogWrite(LASER_PIN, 0); // Éteindre laser
display.clearDisplay();
display.setCursor(0, 0);
display.println("Gravure Finie!");
display.display();
playMelody();
while (true);
}
void moveToLine(int line, int dirPin, int pulPin) {
digitalWrite(dirPin, line > 0 ? HIGH : LOW);
for (int i = 0; i < line * 16; i++) { // Micro-pas
digitalWrite(pulPin, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(pulPin, LOW);
delayMicroseconds(stepDelay);
}
}
void moveToColumn(int col, int dirPin, int pulPin) {
digitalWrite(dirPin, col > 0 ? HIGH : LOW);
for (int i = 0; i < col * 16; i++) { // Micro-pas
digitalWrite(pulPin, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(pulPin, LOW);
delayMicroseconds(stepDelay);
}
}
void hideMessageInSector() {
if (!hardcoreMode) return;
const char* message = "LoupHurlant!";
for (int i = 0; i < strlen(message); i++) {
for (int bit = 7; bit >= 0; bit--) {
bool value = (message[i] >> bit) & 1;
analogWrite(LASER_PIN, value ? 255 : 0);
delayMicroseconds(200);
}
}
analogWrite(LASER_PIN, 0);
Serial.println("MESSAGE_HIDDEN");
}
void playMelody() {
int melody[] = {262, 294, 330, 349, 392};
int durations[] = {200, 200, 200, 200, 400};
for (int i = 0; i < 5; i++) {
tone(BUZZER_PIN, melody[i], durations[i]);
delay(durations[i] + 50);
}
}
Jeune apache, le moment est venu de graver notre loup hurlant – blanc comme la lune, œil rouge comme une braise – sur du papier thermique ou du bois fin. Le laser trace le motif ligne par ligne, comme un chaman grave des runes sous les étoiles. Voici le rituel pour donner vie à ce totem.
🔥 Le Rituel de Gravure
L’image du loup (80x80px) est convertie en binaire (1 pour blanc/rouge, 0 pour noir) avec ce script Python, comme un chaman traduit les murmures des étoiles.
from PIL import Image
# Charger l'image
img = Image.open("wolf.png").convert("RGB")
img = img.resize((80, 80)) // Redimensionner à 80x80px
// Convertir en binaire (1 pour blanc/rouge, 0 pour noir)
binary_pattern = []
for y in range(80):
row = []
for x in range(0, 80, 8): // Groupes de 8 bits
byte = 0
for bit in range(8):
pixel = img.getpixel((x + bit, y))
if pixel == (255, 255, 255) || pixel == (255, 0, 0): // Blanc ou rouge
byte |= (1 << (7 - bit))
row.append(byte)
binary_pattern.append(row)
// Générer le code Arduino
print("const byte wolfPattern[80][10] = {")
for y in range(80):
row = binary_pattern[y]
print(" {" + ", ".join(f"0x{byte:02X}" for byte in row) + "},")
print("};")
Exécute ce script avec une image de loup (wolf.png). Il génère un tableau `wolfPattern[80][10]` à copier dans le code Arduino.
Porte tes lunettes de protection laser. Insère la disquette avec le support (papier thermique recommandé). Téléverse le code sacré avec `wolfPattern`. Les moteurs déplacent le laser en X et Y, gravant chaque pixel (255 pour allumer, 0 pour éteindre). L’OLED affiche l’avancement, et une mélodie célèbre la fin de la gravure.
⚠️ Sécurité Laser : Ne regarde jamais le faisceau. Évite les surfaces réfléchissantes. Éteins le laser après usage.
Clique sur “Graver le Loup” pour voir le totem tracer le motif avec un faisceau lumineux. En mode hardcore, attends-toi à des effets de laser rougeoyant !
Temps: 00:00.000
Combinaison secrète activée : Ctrl+Alt+Loup
Jeune apache, notre totem peut explorer les secrets des disquettes, comme un chaman lit les pierres anciennes. Voici des rituels pour accéder aux secteurs bruts et créer un “virus” rétro amusant.
🔥 Les Chants Secrets
Accède aux secteurs de la disquette pour lire ou écrire des données brutes. Attention, écrire peut corrompre la disquette !
Secteur :
00 00 00 00 00 00 00 00...
Crée un “virus” rétro fictif, un clin d’œil aux hackers des années 80, pour faire sourire les nomades.
Cliquez pour générer...
Jeune nomade, notre totem est une flamme qui peut grandir. Voici des visions pour le rendre plus puissant.
🔮 Les Prochaines Danses
Ajoute une LED RGB (D10-D12, PWM) qui change de couleur : vert par ligne, rouge pour une erreur, bleu à la fin.
Grave d’autres runes (étoile, aigle) via un menu OLED (boutons sur D2/D3). Stocke les motifs en PROGMEM.
Ajoute un mécanisme de focalisation pour le laser et un capteur de distance pour ajuster l’intensité.