📖 TamWolf : Le Gardien Sauvage DIY - Le Hurlement des Loups

Ce tuto, c’est pas un guide – c’est une traque. TamWolf détecte les proies, hurle comme un loup enragé, bouge dans l’ombre, et clignote comme un démon des ruelles. Fabriqué avec de la récup, zéro connexion, juste toi, ton squat, et une bête autonome qui déchire tout. Newbies, script kiddies, ici on apprend pas de chichi, que du brut. Prépare-toi à lâcher ton loup intérieur, c’est mon chaos.

Sommaire

1️⃣ Intro – Le Loup Invisible

TamWolf, c’est pas un gadget – c’est un gardien nomade. Il repère les intrus, hurle comme un loup des steppes, bouge seul, et te fixe avec des yeux rouges qui glacent le sang. Une bête autonome qui vit sur batterie et défend ton territoire. On le fabrique avec trois bouts de ferraille, un Pi. Ce tuto, c’est pour toi – newbie ou script kiddie – si t’as jamais touché un fer à souder, t’apprendras ici, dans le chaos.

Pourquoi ça ? Parce qu’on est des loups des squats, des ombres du bitume, et qu’on protège nos terres sans demander la permission.

AOUUUUUUH ! Le hurlement commence - lâche la bête !

2️⃣ Matériel – Récup’ Nomade

Pas de matos cher – tout vient de la rue ou d’un coin sombre. Voici ton arsenal :

Budget : 15-25 € si t’achètes, 0 € si t’es un vrai nomade de la récup’.

3️⃣ Base Physique – Forge la Bête

On commence par le corps – solide et prêt à bouger.

+---------------------+
|       TamWolf       |
|    [LEDs yeux]      |
|   [Capteur PIR]     |
|+-------------------+|
|| Boîte de conserve ||
||  [Pi Zero]       || 
||  [Batterie]      || 
|+-------------------+|
| [Moteur G] [Moteur D] |
|   [Roue]     [Roue]   |
+-----------------------+
                

Instructions – Pas à Pas

1. Coque : Prends une boîte de conserve vide, lave-la, coupe le haut avec un cutter (attention aux doigts).

2. Pi Zero : Colle-le dedans avec du ruban ou des vis de récup – pas besoin que ce soit beau.

3. Moteurs : Fixe les 2 moteurs DC en bas avec du chatterton ou colle. Ajoute des roues (capsules ou roulettes de jouet).

4. LEDs + PIR : Perce 3 trous en haut : 2 pour les LEDs (yeux), 1 pour le PIR (nez). Colle-les bien.

Résultat : Une boîte avec un Pi, des roues, et des yeux qui attendent de briller.

4️⃣ Câblage – Connecte le Loups

Branche tout au Pi – pas besoin d’être un génie, juste de suivre les fils.

[Pi Zero]
  | GPIO 18 ---- [PIR +]
  | GPIO 23 ---- [LEDs +] ---- [220Ω] ---- [GND]
  | GPIO 25 ---- [Transistor 2N2222 Base]
  |             [Collecteur] ---- [Haut-parleur +]
  |             [Émetteur] ---- [GND]
  | GPIO 17 ----+ 
  | GPIO 27 ----| [L298N IN1/IN2]
  |             +---- [Moteur G]
  |             +---- [Moteur D]
  | GPIO 22 ---- [HC-SR04 TRIG]
  | GPIO 24 ---- [HC-SR04 ECHO]
[MCP3008]
  | P0 ---- [LDR] ---- [10kΩ] ---- [GND]
  | P1 ---- [Batterie +] ---- [GND via TP4056]
  | CLK ---- GPIO 11
  | MISO --- GPIO 9
  | MOSI --- GPIO 10
  | CS ---- GPIO 8
[Batterie] ---- [TP4056] ---- [5V Pi] + [GND]
                

Instructions – Pour Newbies

1. PIR : VCC à 5V, GND à GND, OUT à GPIO 18 (regarde les étiquettes sur le capteur).

2. LEDs : Patte longue (+) à GPIO 23 via une résistance 220Ω, patte courte (-) à GND.

3. Haut-parleur : Transistor 2N2222 – Base à GPIO 25, Collecteur au +, Émetteur à GND.

4. Moteurs : L298N – IN1 à GPIO 17, IN2 à GPIO 27, OUT aux moteurs, VCC à 5V, GND à GND.

5. Ultrason : VCC à 5V, GND à GND, TRIG à GPIO 22, ECHO à GPIO 24.

6. LDR : 3.3V à une patte, l’autre à P0 du MCP3008, résistance 10 kΩ de P0 à GND.

7. Batterie : Batterie au TP4056, sortie 5V au Pi, + à P1 du MCP3008.

8. MCP3008 : VCC à 3.3V, GND à GND, CLK à GPIO 11, MISO à GPIO 9, MOSI à GPIO 10, CS à GPIO 8.

Astuce : Pas de fer à souder ? Tortille les fils et scotche-les bien. (Briquet si tu as de l'étain).

5️⃣ Logiciel – Prépare le Pi

Fais du Pi le cerveau de TamWolf – simple, même si t’as jamais codé.

Instructions – Pas à Pas

1. OS : Télécharge Raspberry Pi OS Lite (raspberrypi.org), flash sur microSD avec Balena Etcher.

2. Boot : Branche la carte au Pi, connecte un écran/clavier ou SSH (cherche "Pi SSH" sur Google).

3. Mise à jour : Terminal → sudo apt update && sudo apt upgrade -y

4. Libs : sudo apt install python3-pip python3-dev -y; pip3 install RPi.GPIO pygame adafruit-circuitpython-mcp3xxx

5. Script : nano tamwolf.py – copie le code suivant, sauvegarde (Ctrl+O, Enter, Ctrl+X).

6️⃣ Code – Le Cœur Sauvage


#!/usr/bin/env python3
import RPi.GPIO as GPIO
import pygame.mixer
import argparse
import json
import os
import busio
import digitalio
import board
import adafruit_mcp3xxx.mcp3008 as MCP
from adafruit_mcp3xxx.analog_in import AnalogIn
from time import sleep

# Broches (les "boutons" du Pi)
GPIO.setmode(GPIO.BCM)
PIR_PIN = 18  # Mouvement
LED_PIN = 23  # Yeux
SOUND_PIN = 25  # Hurlement
MOTOR1 = 17  # Moteur G
MOTOR2 = 27  # Moteur D
TRIG = 22  # Ultrason TRIG
ECHO = 24  # Ultrason ECHO
GPIO.setup(PIR_PIN, GPIO.IN)
GPIO.setup([LED_PIN, SOUND_PIN, MOTOR1, MOTOR2], GPIO.OUT)
GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)

# MCP3008 (lumière + batterie)
spi = busio.SPI(clock=board.SCK, MISO=board.MISO, MOSI=board.MOSI)
cs = digitalio.DigitalInOut(board.D8)
mcp = MCP.MCP3008(spi, cs)
ldr_channel = AnalogIn(mcp, MCP.P0)  # Lumière
battery_channel = AnalogIn(mcp, MCP.P1)  # Batterie

# Config (comme un carnet)
CONFIG_FILE = "tamwolf_config.json"
SOUNDS_DIR = "sounds/"

def load_config():
    if os.path.exists(CONFIG_FILE):
        with open(CONFIG_FILE, "r") as f:
            return json.load(f)
    return {
        "sound_file": "wolf_howl.wav",
        "sensitivity": 5,
        "howl_enabled": True,
        "led_enabled": True,
        "volume": 50
    }

def save_config(config):
    with open(CONFIG_FILE, "w") as f:
        json.dump(config, f)

CONFIG = load_config()

# Commandes (dis à TamWolf quoi faire)
parser = argparse.ArgumentParser(description="Configure ton TamWolf")
parser.add_argument("--sound", help="Chemin vers un son (ex: loup.wav)", default=CONFIG["sound_file"])
parser.add_argument("--sensitivity", type=int, help="Délai en secondes (1-30)", default=CONFIG["sensitivity"])
parser.add_argument("--no-howl", action="store_false", dest="howl_enabled", help="Pas de hurlement")
parser.add_argument("--no-led", action="store_false", dest="led_enabled", help="Pas de LEDs")
parser.add_argument("--volume", type=int, help="Volume (0-100)", default=CONFIG["volume"])
parser.add_argument("--silent", action="store_true", help="Mode silencieux")
args = parser.parse_args()

# Vérifie tout
if not os.path.exists(args.sound) and args.sound != CONFIG["sound_file"]:
    print(f"Oops, {args.sound} n’existe pas, je garde {CONFIG['sound_file']}")
    args.sound = CONFIG["sound_file"]
if args.sensitivity < 1 or args.sensitivity > 30:
    print("Délai entre 1 et 30, je mets 5")
    args.sensitivity = 5
if args.volume < 0 or args.volume > 100:
    print("Volume entre 0 et 100, j’ajuste")
    args.volume = max(0, min(100, args.volume))
if args.silent:
    args.howl_enabled = False

CONFIG.update(vars(args))
save_config(CONFIG)

# Son + volume
GPIO.setup(SOUND_PIN, GPIO.OUT)
pwm = GPIO.PWM(SOUND_PIN, 1000)
pwm.start(CONFIG["volume"])
pygame.mixer.init()

# Fonctions (ce que fait TamWolf)
def get_random_sound():
    if os.path.isdir(SOUNDS_DIR):
        sounds = [f for f in os.listdir(SOUNDS_DIR) if f.endswith((".wav", ".mp3"))]
        if sounds:
            return os.path.join(SOUNDS_DIR, random.choice(sounds))
    return CONFIG["sound_file"]

def howl():
    if CONFIG["howl_enabled"]:
        sound_file = CONFIG["sound_file"] if CONFIG["sound_file"] else get_random_sound()
        pygame.mixer.music.load(sound_file)
        volume = CONFIG["volume"] * 1.5 if is_night() else CONFIG["volume"]
        pwm.ChangeDutyCycle(min(100, volume))
        pygame.mixer.music.play()
        while pygame.mixer.music.get_busy():
            sleep(0.1)
    pwm.ChangeDutyCycle(0)

def is_night():
    return ldr_channel.value < 30000

def check_battery():
    voltage = battery_channel.value * 3.3 / 65535
    if voltage < 3.0:
        print("Batterie faible, recharge-moi !")
        return False
    return True

def distance():
    GPIO.output(TRIG, True)
    sleep(0.00001)
    GPIO.output(TRIG, False)
    start = time.time()
    stop = time.time()
    while GPIO.input(ECHO) == 0:
        start = time.time()
    while GPIO.input(ECHO) == 1:
        stop = time.time()
    return ((stop - start) * 34300) / 2

def move_forward():
    GPIO.output(MOTOR1, GPIO.HIGH)
    GPIO.output(MOTOR2, GPIO.LOW)
    sleep(0.5)
    GPIO.output(MOTOR1, GPIO.LOW)

# Boucle (TamWolf vit !)
try:
    while True:
        if check_battery() and GPIO.input(PIR_PIN):
            if CONFIG["led_enabled"]:
                GPIO.output(LED_PIN, GPIO.HIGH)
            howl()
            sleep(CONFIG["sensitivity"])
            if CONFIG["led_enabled"]:
                GPIO.output(LED_PIN, GPIO.LOW)
        dist = distance()
        if dist > 20:
            move_forward()
        sleep(0.1)
except KeyboardInterrupt:
    GPIO.cleanup()
    print("TamWolf s’arrête, à plus !")
                

Explications : Pas de connexion, tout offline. Bouge devant, il hurle et clignote. Mets un mur, il s’arrête. Personnalise avec --sound, --volume, --silent.

7️⃣ Test – Fais Hurler TamWolf

Lance la bête et vois si elle grogne !

Instructions

1. Démarre : Branche la batterie, allume le Pi, tape python3 tamwolf.py.

2. Teste : Bouge devant le PIR – LEDs allumées ? Hurlement ? Il avance et s’arrête devant un obstacle ?

3. Personnalise : python3 tamwolf.py --sound grognement.mp3 --volume 75 --silent – teste sans bruit.

⚠️ Si ça marche pas : check les fils, batterie, ou fichier son.

8️⃣ Pimp – Domine ton Loup

Rends TamWolf unique et encore plus sauvage :

9️⃣ Dépannage – Répare ou Hurle

Pas de hurlement : Vérifie le haut-parleur, fichier son existe ?

Pas de mouvement : Moteurs branchés ? Batterie chargée ?

Pi mort : Carte SD bien flashée ? Batterie à plat ?

Pro Tip : Teste chaque bout – LEDs, son, moteurs – un par un.