Skip to the content
4 layers54 × 57 mmStealthKitty.kicad pro, the printed circuit board in 3D

Ce projet est réalisé dans le cadre de la dernière année de la filière électronique et systèmes embarqués (ESE) de l'ENSEA.

Size
54 × 57 mm
Copper layers
4
Thickness
1.6 mm
Parts
82
Nets
75
Pads
319
Tracks, vias
637, 197
Pours
13
Routed
Yes
KiCad
KiCad 8.0 (file 20240108)
Created
25 Sep 2024
Updated
15 Jan 2025

Overview

StealthKitty.kicad pro is an open-source printed circuit board by flexdrt, from the flexdrt/2425_ESE_Projet_StealthKitty repository on GitHub. It is a 4-layer board of 54 × 57 mm with 82 parts on 75 nets, routed with 637 tracks and 197 vias.

It is built around the STM32G431CBU6, ZXBM5210-SP and MP1475DJ-LF-P, with the ADXL343BCC and BU33SD5WG-TR among its other parts. Its parts include 30 capacitors, 14 resistors, 6 connectors, 5 ICs and 4 diodes. It belongs with the STM32 boards of this library.

Main components

5

README

README.md

🐱 StealthKitty - Projet Robot Chat

Logo ENSEA STM32
ENSEA Status


📜 Description

StealthKitty est un projet de système embarqué innovant basé sur un STM32.
🎯 Objectif : Développer plusieurs robots capables de se déplacer sur une table sans bordure.

  • 🐾 Un robot est désigné comme chat et doit attraper un autre robot, qui devient alors le nouveau chat.

Ce projet est réalisé dans le cadre de la dernière année de la filière électronique et systèmes embarqués (ESE) de l'ENSEA.

Les contributeurs :

  • 👨‍💻 Vincent LAKHMECHE
  • 👨‍💻 Mohamed Rafik CHAIR
  • 👨‍💻 Meziane Ameur
  • 👨‍💻 Karim JERJOUB

image


📚 Table des matières

  1. 📖 Contexte
  2. 📐 Architecture
  3. ✨ Fonctionnalités
  4. 📚 Explication Technique.
  5. 🔧 Matériel utilisé
  6. 🚀 Utilisation
  7. 📄 Licence

📖 Contexte

Ce projet s'inscrit dans le cadre de la formation 3A à l'ENSEA.
🎯 L'objectif est de concevoir un système embarqué complet, depuis la conception électronique jusqu'à l'implémentation logicielle.


📐 Architecture

Schéma architectural

image

Ce schéma ne détaille pas que chaque moteur a sa propre pwm et son driver propre également.

Explication du fonctionnement du système

  1. ⚡ Alimentation principale

    • La batterie NiMH 7.2V 1.3Ah alimente l'ensemble du système. Elle est connectée à des régulateurs de tension pour fournir les différentes tensions nécessaires aux composants :
      • MP1475S : Régulateur 5V pour alimenter les moteurs et certains capteurs.
      • BU33SD5WG-TR : Régulateur 3.3V pour alimenter le microcontrôleur STM32G431, l'accéléromètre et le LiDAR.
  2. 🖥️ Microcontrôleur principal - STM32G431

    • Le STM32G431 gère toute la logique du robot et communique avec les différents composants via des bus tels que SPI, UART, I2C.
    • Il est relié à un quartz 16 MHz pour la gestion de l'horloge système et dispose d'un connecteur SWD pour la programmation et le débogage.
  3. 🔍 Capteurs

    • Capteurs ToF : Utilisés pour détecter les bords ou les chutes du robot.
    • ADXL343 (Accéléromètre) : Détecte les impacts ou les tapotements, utilisé pour détecter les collisions avec d'autres robots, et connecté au bus SPI.
    • LiDAR YDLIDAR X4 : Permet de détecter les obstacles à l'aide de la communication UART pour transmettre les données de distance et d'angle.
  4. ⚙️ Contrôle des moteurs

    • ZXBM5210-SP-13 (Driver de moteur) : Utilisé pour contrôler la direction et la vitesse des moteurs à l'aide de signaux PWM. Le microcontrôleur STM32 contrôle les moteurs via le driver pour ajuster la vitesse et la direction du robot.
  5. 🌟 Indicateurs d'état (LEDs)

    • Les LEDs servent d'indicateurs pour visualiser l'état du robot, par exemple, lorsqu'il est en marche ou lorsqu'il détecte un obstacle.

Détails des principaux outils utilisés

  1. Communication avec l'accéléromètre (ADXL343)

    • Utilisation du protocole SPI pour lire les données des axes X, Y et Z.
    • Détection des chocs (taps) causés par des collisions avec d'autres robots.
  2. Contrôle des moteurs avec le driver ZXBM5210

    • Génération de signaux PWM pour réguler la vitesse des moteurs.
    • Implémentation des mouvements du robot : avancer, reculer, tourner à gauche ou à droite.
  3. Gestion des capteurs de bordure/détection de chute

    • Lecture des entrées des capteurs pour détecter les bords de la table.
    • Réaction immédiate pour stopper ou changer de direction afin d’éviter une chute.
  4. Interfaçage avec le LiDAR YDLIDAR X4

    • Communication via UART pour lire les données du LiDAR ainsi détecter les autres robots.
    • Extraction des valeurs d’angles et de distances pour cartographier l'environnement et éviter les obstacles.

✨ Fonctionnalités

  • 🛡️ Détection de bords via des capteurs ToF.
  • 🔄 Communication entre robots pour synchronisation.
  • 🎯 Algorithme de poursuite et d'évitement.
  • ⚙️ Gestion des moteurs

📚 Explication Technique

⚡Accéléromètre ADXL343 dans le robot chat

Détail sur l'utilisation de l'accéléromètre ADXL343

🎯 Objectifs principaux

  • ✨ Détecter les tapotements (Single Tap/Double Tap) pour changer de rôle entre le robot dans l'état "chat" et dans l'état "souris".
  • 📊 Lire les valeurs d'accélération sur les axes X, Y, Z (optionnel).

⚙️ Configuration

  • Plage d'accélération : ±2 g (précision pour petits mouvements).
  • Registres utilisés :
    • 🛠️ POWER_CTL : Activer le mode mesure.
    • 🎚️ THRESH_TAP, DUR, INT_ENABLE : Configurer les seuils et activer les interruptions pour les tapotements.
    • 🖥️ INT_SOURCE : Vérifier les événements de tapotements.

🔧 Fonctionnalités implémentées

✅ Détection des tapotements

  • 🔄 Vérifie les interruptions via le registre INT_SOURCE.
  • 📍 Met à jour la variable globale tap_detected pour signaler un événement.

✅ Lecture des accélérations

  • 📥 Récupération des valeurs brutes : acc_rawX, acc_rawY, acc_rawZ.
  • 🔄 Conversion des valeurs en unités normalisées (g) via un facteur de calibration.

🔁 Réactions aux tapotements

  • ⚡ Interruptions activées pour permettre une réaction en temps réel.
  • 🔀 Chaque tapotement entraîne un changement de comportement des moteurs (ex. direction ou rôle).

🕒 FreeRTOS Task

  • Création d'une tâche principale vTaskADX pour :
    1️⃣ Lire les données d'accélération brutes et normalisées.
    2️⃣ Vérifier les événements de tapotement.
    3️⃣ Ajouter un délai pour réduire la charge CPU (vTaskDelay).

https://github.com/user-attachments/assets/b687c830-fabb-43c3-ac29-a924f9b9cf93

📡Capteur ToF VL53L1X pour détection des bords

Détail sur l'utilisation du capteur ToF VL53L1X pour la détection des bords

🌟 Caractéristiques techniques

  • 📡 Technologie : ToF (Time of Flight)
  • 🕐 Plage de mesure : 4 mm à 4 m (en mode longue distance)
  • ⏳ Budget temporel : Configurable entre 15 ms et 500 ms
    • 15 ms : mode court pour une réactivité accrue
    • 500 ms : mode long pour une meilleure précision
  • 🔄 Mode de distance :
    • Court (1,3 m max) : meilleure immunité au bruit ambiant
    • Long (4 m max) : portée étendue pour des environnements sombres
  • 🌌 Précision : ±1% dans des conditions optimales (100 mm cible, reflectance 17%)
  • 🔐 Interface : I²C (adresse par défaut : 0x52)
  • 🕒 Temps d'inter-mesure : Configurable selon le budget temporel

⚙️ Initialisation et communication

Interface

  • Communication via le port hi2c1.
  • Configuration par défaut :
    • Mode de distance : Long (VL53L1__DISTANCE_MODE = 2)
    • Budget temporel : 20 ms (VL53L1__TIMING_BUDGET = 20)
    • Période d'inter-mesure : 25 ms (budget + delta)

Fonction d'initialisation

c
uint8_t VL53L1__Init() {
    uint8_t status = 0;
    printf("Initialisation du capteur VL53L1X...\n");
    status |= VL53L1X_SensorInit(TOF_ADDR);
    if (status != 0) {
        printf("Erreur lors de l'initialisation du capteur !\n");
        return status;
    }
    status |= VL53L1X_SetDistanceMode(TOF_ADDR, VL53L1__DISTANCE_MODE);
    status |= VL53L1X_SetTimingBudgetInMs(TOF_ADDR, VL53L1__TIMING_BUDGET);
    status |= VL53L1X_SetInterMeasurementInMs(TOF_ADDR, VL53L1__INTERMEASUREMENT);
    printf("Capteur initialisé avec succès.\n");
    return status;
}

🔧 Traitement des données

  1. Acquisition des données :

    • Utilisation de VL53L1X_CheckForDataReady() pour vérifier la disponibilité.
    • Récupération des distances avec VL53L1X_GetDistance().
    • Mesure complétée en fonction du timing budget configuré.
  2. Filtrage et validation :

    • Contrôle de RangeStatus pour éliminer les mesures aberrantes.
    • Comparaison avec des seuils définis pour rejeter les valeurs hors plage.
  3. Analyse :

    • Calcul des distances moyennes et écart-type pour optimiser la précision.
    • Intégration avec les données des autres capteurs pour la prise de décision globale.

📊 Analyse et décisions

Détection d'obstacles

  • Un seuil critique est défini (é.g., 250 mm).
  • Si la distance mesurée dépasse ce seuil, une action est entreprise pour éviter la collision et la chute avec le bord.
  • Exemple de logique d'évitement : ralentir ou pivoter.

Exemple : Pivot automatique

c
if (distance > 250) {
    printf("Obstacle détecté : pivot en cours...\n");
    reverse_motors();  // Fonction pour inverser les moteurs
    vTaskDelay(pdMS_TO_TICKS(500)); // Pause pour effectuer le pivot
    forward_motors(); // Reprise de la trajectoire
}

💾 Structure de données

Paramètres de configuration

c
#define VL53L1__TIMING_BUDGET 20
#define VL53L1__DISTANCE_MODE 2
#define VL53L1__LOWER_THRESHOLD 0
#define VL53L1__UPPER_THRESHOLD 4000

Stockage des résultats

c
typedef struct {
    uint8_t Status;       // Statut de la mesure (erreurs incluses)
    uint16_t Distance;    // Distance mesurée en mm
    uint16_t SignalRate;  // Taux de signal en kcps
    uint16_t AmbientRate; // Taux de bruit ambiant
    uint16_t SpadNum;     // Nombre de SPADs actifs
} VL53L1X_Result_t;

↻ Cycle de fonctionnement

  1. Initialisation du capteur ToF avec les paramètres prédéfinis.
  2. Boucle d'acquisition des distances :
    • Vérification de l'état du capteur.
    • Lecture et validation des données mesurées.
    • Mise à jour des structures de données.
  3. Filtrage des mesures aberrantes et analyse des distances.
  4. Détection des obstacles et application des consignes aux moteurs.

🚀 FreeRTOS : Gestion du capteur ToF

Exemple de tâche FreeRTOS

c
void vTaskToF(void *argument) {
    uint16_t distance;
    uint8_t range_status;

    for (;;) {
        // Vérification de la disponibilité des données
        VL53L1X_CheckForDataReady(TOF_ADDR, &range_status);
        if (range_status == 0) {
            // Lecture de la distance
            VL53L1X_GetDistance(TOF_ADDR, &distance);
            printf("Distance mesurée : %d mm\n", distance);

            // Détection d'obstacle
            if (distance > 250) {
                printf("Obstacle détecté, exécution d'un pivot.\n");
                reverse_motors();
                vTaskDelay(pdMS_TO_TICKS(500));
                forward_motors();
            }
        }
        // Pause entre les mesures
        vTaskDelay(pdMS_TO_TICKS(100));
    }
}

Gestion des ressources

  • Synchronisation avec des sémaphores pour la gestion des interruptions.
  • Utilisation de timers FreeRTOS pour des mesures périodiques précises.

Points clés

  • Priorité des tâches : la tâche de mesure ToF doit avoir une priorité suffisante pour garantir des mises à jour régulières.
  • Gestion des erreurs : surveiller les RangeStatus pour éviter des comportements inattendus.

🛠️ Fonctions clés du driver

  • VL53L1X_SensorInit() : Initialise le capteur avec les valeurs par défaut.
  • VL53L1X_GetDistance() : Récupère la distance mesurée (mm).
  • VL53L1X_SetTimingBudgetInMs() : Configure le budget temporel des mesures.
  • VL53L1X_ClearInterrupt() : Réinitialise les interruptions après une mesure.
  • VL53L1X_SetDistanceMode() : Change le mode de mesure (écourté ou étendu).

⚠️ Points critiques

  • Gestion des interruptions I²C et des erreurs de communication.
    • Implémentation robuste pour minimiser les échecs de transfert.
  • Calibration régulière pour minimiser les erreurs systématiques.
    • Offset et cross-talk à recalibrer selon l'environnement.
  • Ajustement des seuils selon les conditions environnementales :
    • Température ambiante et réflectance des surfaces peuvent affecter les mesures.

https://github.com/user-attachments/assets/b8a1714b-683e-4680-be36-7b728edb92a1

🛠️Contrôle des Moteurs et Encodeurs

Détail sur le contrôle des Moteurs et sur les Encodeurs

🛠️ Composants utilisés

Les moteurs utilisés sont des motoréducteurs de la marque DFRobot, les modèles FIT 052X équipés d'un encodeur à quadrature.

Nos moteurs ont une vitesse différentes pour un même rapport cyclique, cependant la différence de vitesse varie en fonction des rapports cycliques choisis, nous n'avons pas pu compenser cette erreur de manière durable et fiable. Cela a aussi rendu plus complexe l'implémentation des asservisssements en vitesse et en angle qui devaient prendre en compte ce problème.

🚗 Moteurs

Le contrôle des moteurs est effectué à l'aide d'un driver. Ce driver contient plusieurs fonctions pour contrôler la direction et la vitesse des moteurs du robot.

Fonctionnalités du driver :

  • void init_motors(void); : Initialisation des moteurs.
  • void forward_r(uint16_t alpha); : Faire avancer le moteur droit.
  • void forward_l(uint16_t alpha); : Faire avancer le moteur gauche.
  • void reverse_r(uint16_t alpha); : Faire reculer le moteur droit.
  • void reverse_l(uint16_t alpha); : Faire reculer le moteur gauche.
  • void stop_r(void); : Arrêter le moteur droit.
  • void stop_l(void); : Arrêter le moteur gauche.

🔧 Considérations mécaniques

chassis Image 2025-01-13 à 14 57 42_cc206d9a

Le robot utilise deux moteurs, un pour chaque roue :

  • La roue droite est en rouge et la roue gauche est en bleue.
  • Les roues tournent dans des directions opposées pour permettre au robot de se déplacer en avant ou en arrière.

🔄 Sens de marche

aaa

Moteur GaucheSens de marche RobotMoteur Droit
Sens reverseSens forwardSens forward

Pour avoir le sens de marche du robot en arrière, le tableau est le même sauf que l'on change le sens de chaque moteur.


🚀 Fonctionnement des moteurs

Mise en mouvement

  • Avancer :

    • forward_r(uint16_t alpha) : Configure le moteur droit pour avancer en réglant le rapport cyclique PWM sur la valeur spécifiée par alpha. Cela contrôle la vitesse de rotation du moteur droit. Point critique : Assurez-vous que alpha reste dans les limites de la plage autorisée pour éviter de surcharger le moteur.
    • forward_l(uint16_t alpha) : Configure le moteur gauche pour avancer avec un fonctionnement similaire au moteur droit.
  • Reculer :

    • reverse_r(uint16_t alpha) : Inverse la polarité pour le moteur droit afin qu'il recule. Le rapport cyclique PWM alpha détermine la vitesse en mode reverse. Point critique : La synchronisation entre les moteurs est essentielle pour un déplacement précis.
    • reverse_l(uint16_t alpha) : Applique le même principe pour le moteur gauche.

Arrêt

  • stop_r() : Arrête le moteur droit en mettant le signal PWM à zéro et en désactivant le canal PWM correspondant. Point critique : Un arrêt brusque peut endommager le système mécanique si des forces importantes sont en jeu.
  • stop_l() : Arrête le moteur gauche de manière similaire pour immobiliser le robot.

🔧 Encodeurs

Les encodeurs mesurent la rotation des moteurs pour calculer leur position et leur vitesse. Ces données sont essentielles pour un contrôle précis. Un test en vidéo des encodeurs est visible plus haut dans ce document, dans la partie "Détail sur l'utilisation de l'accéléromètre ADXL343" (on peut voir la vitesse du moteur droit et gauche).

Fonctions principales

  1. Position :

    • get_encoder_position(uint8_t motor) : Retourne la position actuelle en impulsions pour le moteur spécifié (gauche ou droit). Cette valeur est obtenue en lisant le compteur du timer associé à l'encodeur. Point critique : Une dérive dans les valeurs peut indiquer un problème de calibration ou de bruit.
  2. Réinitialisation :

    • reset_encoder(uint8_t motor) : Réinitialise la valeur du compteur de l'encodeur à zéro, permettant de redémarrer les mesures à partir d'une référence claire. Point critique : Réinitialisez uniquement lorsque les moteurs sont à l'arrêt pour éviter des erreurs de mesure.
  3. Vitesse :

    • calculate_motor_speed(uint8_t motor, uint32_t delta_time_ms, uint16_t encoder_resolution) : Calcule la vitesse en tours par seconde à partir des différences de positions mesurées par l'encodeur sur une durée spécifiée. La résolution de l'encodeur (en impulsions par tour) est utilisée pour la conversion. Point critique : Le choix d'un intervalle de temps trop court peut amplifier le bruit dans les calculs de vitesse.

🛠 Contrôle PID

Le contrôle PID ajuste dynamiquement la commande des moteurs pour maintenir une vitesse cible.

  • compute_pid(float target_speed, float measured_speed, float *integral_error, float *previous_error, float kp, float ki, float kd) :
    • Entrées :
      • target_speed : La vitesse souhaitée pour le moteur.
      • measured_speed : La vitesse réelle mesurée par l'encodeur.
      • integral_error : Accumulation des erreurs précédentes pour l'effet intégral.
      • previous_error : Dernière erreur enregistrée pour l'effet dérivé.
      • kp, ki, kd : Gains proportionnel, intégral et dérivé.
    • Sortie :
      • Une commande ajustée à appliquer au moteur pour corriger l'écart entre la vitesse cible et mesurée. Point critique : Un mauvais réglage des gains PID peut entraîner des oscillations ou une réponse lente.

🛠 Modes de fonctionnement

Mode "Souris"

  • Objectif : Déplacement à vitesse modérée.
  • Les fonctions forward_r() et forward_l() configurent les moteurs pour avancer avec un rapport cyclique moyen (environ 40%).
  • La vitesse et la position de chaque moteur sont mesurées et affichées périodiquement.
  • Ce mode est conçu pour une navigation fluide et contrôlée. Point critique : Surveiller les variations de vitesse pour éviter les dérapages.

Mode "Prédateur"

  • Objectif : Déplacement rapide pour des actions dynamiques.
  • Les moteurs fonctionnent à un rapport cyclique plus élevé (environ 70-80%).
  • Ce mode est idéal pour des courses ou des approches agressives nécessitant une réponse rapide. Point critique : Les moteurs peuvent surchauffer si le mode est utilisé trop longtemps sans pauses.

Pivot Arrière

  • Objectif : Éviter les obstacles en pivotant.
  • Les moteurs sont commandés pour reculer à des vitesses différentes, créant une rotation du robot.
  • Exemple : Le moteur droit recule rapidement tandis que le gauche recule lentement, produisant une rotation autour d'un axe.
  • Après le pivot, les moteurs reprennent leur fonctionnement normal. Point critique : Assurez-vous que le sol offre suffisamment d'adhérence pour un pivot efficace.

💡 Notes Techniques

  • Timers :

    • TIM1 : Gère les signaux PWM pour le contrôle des moteurs.
    • TIM3 : Utilisé pour l'encodeur du moteur droit.
    • TIM4 : Utilisé pour l'encodeur du moteur gauche.
  • Résolution :

    • Les encodeurs ont une résolution de 1024 impulsions par tour, ce qui offre une précision élevée pour les mesures de position et de vitesse.
  • Rapports Cycliques :

    • La valeur alpha utilisée dans les fonctions correspond au rapport cyclique du signal PWM. Un rapport plus élevé entraîne une vitesse de rotation plus importante. Point critique : Vérifiez que le matériel supporte la plage de fonctionnement du PWM pour éviter des dommages.

🚀YDLIDAR X4 dans le robot

Détail sur l'utilisation du YDLIDAR X4 dans le robot

🎯 Caractéristiques techniques

  • 📡 Range Frequency : 5000Hz
  • 📏 Range Distance : 0.12-10m
  • 📐 Angle Resolution : 0.43-0.86°
  • 🔄 Scan Frequency : 6-12Hz
  • 🌟 Scan Angle : 360°
  • 📦 Size : Φ65.6 * 58.39 * 101.7mm

⚙️ Communication et trames

  • 🔌 Interface : UART (DMA)
  • 📦 Structure des trames :
    • 🏁 Start Sign : 0xA5 0x5A
    • 📊 Package Length
    • 🔍 Mode & Type Code
    • 📐 FSA (First Scan Angle)
    • 📐 LSA (Last Scan Angle)
    • ✅ CS (Checksum)
    • 📝 Packet Data

🔧 Traitement des données

  • Parser de trames : Le parsing suit la datasheet du Lidar et est détaillé au sein de la tache TaskLidar.

📊 Analyse des données

  • 🔍 Détection d'objets :
    • Filtrage des distances (0-2000mm)
    • Calcul des centres de masse (assimilable à du clustering de points par paquets)
    • Identification des clusters
  • 🎯 Tracking :
    • Suivi de l'objet le plus proche
    • Calcul angle moyen et distance

⚡ Performances

  • 🔄 Temps réel : Acquisition et traitement via DMA pour ne pas saturé la RAM
  • 📊 Résolution : ~0.5° en rotation
  • 📏 Précision distance : ±1% sur plage optimale
  • ⏱️ Latence : <100ms pour détection et réaction(idéalement)

🔁 Cycle de fonctionnement

  1. 📡 Réception trame DMA
  2. 🔍 Validation checksum et headers
  3. 📊 Parsing des données
  4. 🎯 Détection objets et calcul distances
  5. 🎮 Application asservissement moteurs vu ultérieurement

🛠️ Fonctions clés du driver

c
sns_begin()        // Démarrage acquisition
sns_parse_data()   // Traitement trame
smooth_data()      // Filtrage données
detect_objects()   // Détection objets

⚠️ Points critiques

  • Gestion buffer circulaire DMA
  • Validation intégrité trames
  • Filtrage données aberrantes
  • Asservissement progressif détaillé ultérieurement

🕒 FreeRTOS Task du LIDAR

​

  • 📦 Détection et Validation En-tête (i==0)

    • Vérification séquence 7 octets :

      • 0xA5 0x5A (Start Sign)
      • 0x05 0x00
      • 0x00 0x40
      • 0x81

    📝 Parsing de Trame (Machine à États)

    • frame_start : Package Header bas
    • frame_start+1 : Package Header haut
    • frame_start+2 : Type de paquet
    • frame_start+3 : Nombre d'échantillons
    • frame_start+4/5 : Angle de début (FSA)
    • frame_start+6/7 : Angle de fin (LSA)
    • frame_start+8/9 : Checksum

    🎯 Traitement des Données

    • Si fin de trame (i==frame_end) :

      • Stockage dernière donnée
      • Parse des données brutes
      • Lissage des données
      • Détection des objets
      • Reset des index pour trame suivante

    📊 Analyse Finale

    • Recherche de l'objet le plus proche :

      • Distance minimale non nulle
      • Mise à jour dist_min et idx_min

image

  • Affichage données :

    • Pour chaque objet : angle et distance
    • Détails de l'objet le plus proche

⚙️ Gestion des Indices

  • Ajustement frame_start et frame_end
  • Gestion du buffer circulaire
  • Maintien de la synchronisation des trames

Dans la vidéo suivante un test est réalisé avec un script python pour mieux visualiser les donnés reçus, on remarque une légère latence pour que les données soient affichés et des outliers.

https://github.com/user-attachments/assets/c904982a-7dda-46ab-8d87-f73b21fb672f

🎯Théorie de l'asservissement angulaire du robot

Détail sur la théorie de l'asservissement angulaire du robot

1. Définition du système

Variables d'état

  • θ_mesure : Angle mesuré par le LIDAR du cluster le plus proche (en degrés)
  • θ_consigne : Angle désiré (0° dans notre cas)
  • e(t) : Erreur en angle
  • u(t) : Signal de commande (correction)
  • v_g : Vitesse du moteur gauche
  • v_d : Vitesse du moteur droit

Équations fondamentales

  1. Calcul de l'erreur :
text
e(t) = θ_consigne - θ_mesure
  1. Loi de commande proportionnelle :
text
u(t) = Kp × e(t)

où Kp est le gain proportionnel

  1. Vitesses des moteurs :
text
v_g = v_base + u(t)
v_d = v_base - u(t)

où v_base est la vitesse nominale

2. Normalisation de l'angle

Pour avoir un comportement symétrique, l'angle mesuré est normalisé dans l'intervalle [-180°, 180°] :

text
Si θ_mesure > 180° :
    θ_normalisé = θ_mesure - 360°
Sinon :
    θ_normalisé = θ_mesure

3. Fonction de transfert

Dans le domaine de Laplace, la fonction de transfert du système peut être approximée par :

text
G(s) = K / (1 + τs)

où :

  • K est le gain statique du système
  • τ est la constante de temps du système
  • s est la variable de Laplace

4. Stabilité du système

Le système en boucle fermée a une fonction de transfert :

text
H(s) = (K × Kp) / (1 + τs + K × Kp)

La stabilité est assurée si :

text
0 < Kp < 1/(K × τ)

5. Considérations de mise en œuvre

  1. Choix du gain Kp :
  • Trop faible : réponse lente
  • Trop élevé : oscillations
  • Optimal : compromis entre rapidité et stabilité

Conversion en commandes moteurs (alpha1 et alpha2) :

  • Si la cible est à droite :

    • On augmente la vitesse du moteur gauche (alpha1)

    • On diminue la vitesse du moteur droit (alpha2)

      → Le robot tourne à droite

  • Si la cible est à gauche :

    • On augmente la vitesse du moteur droit (alpha2)

    • On diminue la vitesse du moteur gauche (alpha1)

      → Le robot tourne à gauche

A défaut d'un fonctionnement asservi en vitesse de nos moteurs, nous n'avons pas pu tester cet asservissement angulaire sur notre robot bien qu'une ébauche du code soit implémentée dans la tache du Lidar TaskLIDAR.

🔧 Matériel utilisé

  • STM32G431CBU6 : Microcontrôleur principal.
  • Capteurs ToF : Détection des bordures.
  • LiDAR : Cartographie et détection d'autres robots.
  • Accéléromètre (ADXL343) : Détection des chocs pour changer de rôle (Chat/Souris).
  • Environnement de développement : STM32CubeIDE.

🚀 Réalisation matérielle

La partie matérielle a été conçue avec KiCad 8.0 et comprend :

  • 📜 Schéma électronique
Détail sur le schéma électronique

Pour construire notre carte électronique, il nous a fallut commencer par designer sous KiCad le schéma électrique de notre système électronique, ce que l'on appelle schematic dans KiCad. Nous allons maintenant détaillé les différentes parties du schematic (les sheets du projet KiCad).

Schéma électronique

Capteurs du robot

Le robot contient plusieurs capteurs, un capteur Time Of Flight TOF, un capteur LIDAR, et un capteur accéléromètre.

Le capteur TOF est un capteur de distance qui communique en I2C avec le cerveau du robot qu'est le stm32. L'avantage de cette communication est qu'elle permet une évolutivité si le besoin d'ajouter d'autres composants matériel par la suite se fait sentir (c'est pourquoi on a prévu des résistances de pull-up pour le bus I2C). Ce n'était pas notre cas, un seul capteur a suffit finalement.

Ces signaux sont représentés sur le connecteur JST de la figure ci-dessous.

image-20250113151649896

Le capteur Accéléromètre est le seul capteur qui communique en SPI.

image-20250114095447270

Comme on peut le voir, pour des raisons CEM nous avons placé une capacité de 1µF et une capacité de 0.1 µF pour découpler les deux alimentations en +3.3V.

Afin de pouvoir débugger le capteur, nous avons également placé des points de test TestPoint.

Le capteur LIDAR est un capteur qui communique par liason série UART dont les signaux sont les suivants :

image-20250114095520915

  • M_EN
  • DEV_EN
  • M_SCTR
  • RX_lidar
  • TX_lidar
  • +5V
  • GND
Motorisation du robot

Les composants qui s'assure déplacer le robot sont les moteurs qui sont des mcc FIT 0520.

Pour commander ces moteurs nous avons besoin de driver, ce sont eux qui vont envoyer les signaux de commande au moteur (des PWM).

Les drivers utilisés sont les ZXBM5210-S-13.

image-driver20250114113650516

Voici le schéma du composant. Les sorties out 1 et out 2 sont connectés au moteur par Motor1+ et Motor 1-.

Comme ce sont les signaux de commande PWM, nous avons découplé ces signaux avec des capacités de 100nF.

Quant aux signaux d'alimentation, nous découplons la tension de la batterie avec une capacité de 10 µF pour le signal Vm et une capacité de 1µF pour la tension VBAT.

Le signal PWM_MOT1_CH1 est le signal PWM généré par le STM32 en direction du pin FWD du composant. Le signal PWM_MOT1_CH2 est le signal PWM généré par le STM32 en direction du pin REV du composant.

D'après le tableau de la datasheet, si on envoie un signal PWM pour contrôler le driver en mode "PWM control mode".

Il faut alors envoyer un signal PWM en entré sur un des pins FWD ou REV. Ce qui donnera naissance à un signal PWM en sortie de fréquence égale à celle en entrée du pin qui reçoit le signal PWM.
Comme nous avons deux moteurs, il faut deux drivers, voici le schéma du deuxième driver : driver2

Pour obtenir la vitesse des roues, nous utilisons les encodeurs des moteurs. Pour cela il faut préparer, l'alimentation et les signaux dont ils ont besoin dans un connecteur (jst en l'occurrence).

D'après la documentation des moteur/encodeurs, les signaux sont placés de la façon suivante sur le brochage :

signaux encodeurs

On peut lire sur cette image que les signaux de l'encodeur sont les suivants :

  • +3V3
  • GND
  • codeurX_PH1 [pour la phase A]
  • codeurX_PH2 [pour la phase B]

Nous avons placé ces signaux, entre les deux signaux destinés au moteurs, et conservé l'ordre d'affectation des broches de la documention, ce qui donne ce schéma de connecteur :

encodeurs

Le Cerveau du robot : le STM32 & cie

Dans cette feuille, nous avons connecté les composants suivants, le STM32, la STlink, le quartz, des leds, un bouton pour changer d'état et un bouton NRST pour reset le STM32. brain_sheet

Le STM32
Explications assignations des signaux aux pins du STM32

Pour assigner les pins du STM32, nous avons positionné d'abord les signaux PWM sur le timer 1, puis ceux des encodeurs. Les encodeurs, qui fonctionnent à une fréquence plus basse que les signaux PWM, ont besoin de leurs propre timer (le timer 3) configurés en mode "encoder mode".
Ensuite nous avons connecté les signaux restant :

  • l'USART4 du LIDAR (et ses connectiques)
  • l'USART2 du STLINK.
  • les signaux SPI pour l'accéléromètre
  • les signaux I2C du capteur TOF.

Nous avons ajouté une résistance de pull-up sur le signal SDA et SCL respectivement de 3.3 kOhms et 2.2 kOhms

Découplage du STM32

Lors des transitions rapides des circuits internes du microcontrôleur, comme celles générées par les horloges et les commutations d’état des broches, des variations soudaines de courant peuvent se produire. Ces fluctuations génèrent des perturbations haute fréquence qui risquent de déstabiliser l'alimentation. Les condensateurs de 100 nF, placés aussi près que possible des broches d'alimentation (VDD, VDDA), jouent un rôle important en filtrant ces perturbations haute fréquence, agissant ainsi comme un réservoir d'énergie pour combler les besoins instantanés.

Pour stabiliser davantage l’alimentation, un condensateur de capacité plus élevée, comme un 4,7 µF, est ajouté. Celui-ci répond aux variations de courant plus lentes et de plus grande amplitude. Par ailleurs, des broches spécifiques comme VDDA et VREF+, utilisées pour des fonctions sensibles telles que les convertisseurs analogiques-numériques (ADC), exigent une alimentation particulièrement propre. Un condensateur de 1 µF y est ajouté pour découpler VREF+ tandis qu'un condensateur de 10 nF découple VDDA.

Ainsi, la combinaison de condensateurs de différentes valeurs, placés stratégiquement près des broches concernées, permet de garantir la stabilité et la fiabilité du microcontrôleur STM32 tout en réduisant les effets des perturbations électriques.

🕒 Le quartz

Le quartz fonctionne avec des niveaux de signaux très précis pour maintenir une oscillation stable. Sans découplage capacitif, les variations de tension peuvent causer des décalages de phase ou des changements de fréquence. Le condensateur agit comme un filtre passif, en éliminant les hautes fréquences parasites et en assurant une meilleure stabilité du signal.

Les signaux électriques OSC_In et OSC_OUT peuvent parfois inclure des pics de tension ou des variations transitoires. Un découplage capacitif agit comme une barrière, protégeant le quartz de ces stress électriques, augmentant ainsi sa durée de vie. La valeur de la capacité de découplage est 10 pF pour l'entrée et 10pF pour la sortie du quartz. En résumé, le découplage par une capacité assure une meilleure isolation, stabilité, et performance du circuit oscillateur.

🔗 Le STLink

La ST-Link est un outil nécessaire pour la gestion et le développement des microprocesseurs STM32. Elle remplit deux fonctions principales : la programmation du microprocesseur, en permettant de flasher le code directement sur celui-ci, et le débogage, grâce à une interface de communication série dédiée.

En bref, la ST-Link établit un lien direct entre l’environnement de développement et le STM32, simplifiant le processus de programmation et assurant une prise en charge efficace du débogage.

Les boutons

Le PCB est consituté de deux boutons : le premier NRST sert à reset le code qui a été téléversé sur la carte. Le deuxième permet au robot de changer d'état entre souris et chat.

boutons

💡 Les LEDS

Les leds servent d'indicateurs pour visualiser l'état du robot, il y a une led bleue et une led rouge.

leds

Alimentation et Gestion d'Énergie :

  • Le système est alimenté par une batterie avec un switch ON/OFF qui permet deux modes :
    1. Mode charge : Lorsque le chargeur est connecté, la batterie se recharge
    2. Mode fonctionnement : Alimentation du robot
  • Un circuit de conversion de tension à plusieurs étages :
    • 7,2V (batterie) → 5V/3A via MP1475DJ-LF-P
    • 5V → 3.3V/150mA via BU33SD5WG-TR

Capture d'écran 2025-01-14 161015

Capture d'écran 2025-01-14 161147

Capture d'écran 2025-01-14 161208

Points d'Attention :

  1. Pour la partie alimentation :
  • Respecter la polarité de la batterie
  • Les condensateurs de filtrage sont essentiels pour stabiliser l'alimentation
  • Les soudures du switch, point critique de fiabilité
  1. Pour le convertisseur 7,2V→5V :
  • La self 4.7µH doit supporter le courant nominal de 3A
  • Le placement des condensateurs doit être proche du régulateur
  • Le réseau de feedback doit être précis pour maintenir la tension de sortie
  1. Pour le convertisseur 5V→3.3V :
  • Les condensateurs C504 et C506 sont critiques pour la stabilité
  • Le pin STBY doit être correctement connecté pour le fonctionnement
  • 🧩 PCB routé

image-20250114141624020

Détail sur le routage du PCB

Le PCB à été conçu afin de respecter le cahier des charges en termes de dimension afin de pouvoir l'intégrer facilement au robot.

Capture d'écran 2025-01-15 002802


Répartition des couches du PCB

  1. Couche 1 (Front) : Support de tous nos composants, majoritairement CMS, avec des connecteurs traversants. La majorité des pistes y sont tracées également sur cette couche, tandis qu’une partie passe par la couche 4 (bottom) pour préserver l’homogénéité des plans de masse (couche 2) et d’alimentation (couche 3).
  2. Couche 2 : Plan de masse, avec des vias espacés pour éviter les coupures.
  3. Couche 3 : Plan d’alimentation pour les composants à forte consommation, optimisant la dissipation thermique.
  4. Couche 4 (Bottom) : On retrouve les pistes de données issues principalement de la couche 1 pour garder l'intégrité des signaux. Nous avons également évité de croiser les discontinuités des plans d'alimentation (couche 3).

Optimisations de routage

1. Positionnement des Vias

Les vias ont été placés aussi proches que possible des pastilles des composants.

via tout prés possible des pastille

Cela minimise la longueur des connexions, réduisant ainsi les résistances parasites et améliorant la qualité des signaux.


2. Protection du Quartz

Un mur de vias entoure l’oscillateur externe pour le protéger des interférences électromagnétiques.

protection du quartz par des via

Cette isolation réduit le risque de perturbations provenant des autres composants de la carte.


3. Réduction des Problèmes d’Antenne

Des vias ont été placés dans les zones où des antennes indésirables pourraient se former.

probleme antenne

Cela aide à minimiser les effets d’induction et les émissions parasites.


4. Zones pour Signaux Importants

Des plans dédiés ont été créés pour les signaux importants.

zone de plan signaux important

Exemple pour le signal Motor+ qui a son propre plan pour assurer une transmission stable et fiable, réduisant les pertes et les perturbations.


5. Plans d’Alimentation
a. Plan 5V
plan 5v
b. Plan VBAT
plan vbat

Les plans d’alimentation, tels que 5V et VBAT, ont été placés dans la couche 3 de la carte. Cela permet une meilleure répartition du courant et une connexion optimale aux composants qui nécessitent ces alimentations.


6. Dissipation Thermique

Des vias thermiques ont été ajoutés pour améliorer la dissipation thermique.

des via pour des composant avec grande surface pour une meilleur dissipation

Cette pratique concerne des composants contenant des pads thermiques tels que le STM32 et les drivers des moteurs. Ces vias facilitent le transfert de chaleur vers d’autres couches, améliorant la dissipation thermique et empêchant les surchauffes.


7. Condensateurs de Découplage

Les condensateurs de découplage ont été positionnés au plus près des broches d’alimentation (ex. STM32, drivers).

capa decouplage a coté des alim

Cela réduit les parasites haute fréquence et stabilise l’alimentation.


8. Adaptation des Pistes

La largeur des pistes a été ajustée pour correspondre aux pastilles des composants.

piste a la largeur des

Cela améliore la transmission des signaux et réduit les impédances parasites.


9. Points de Test

Des points de test accessibles ont été placés pour faciliter le débogage.

de points de tests pour edbuggage
  • 🛠️ BOM (Bill of Materials)
  • 🗂️ Fichiers GERBER pour fabrication chez JLCPCB.

🔑 Accédez aux fichiers hardware ici.


🛠️ Développement logiciel

Le logiciel embarqué a été développé avec STM32CubeIDE et inclut :

  • 🔧 Configuration des périphériques (SPI, UART, PWM, etc.).
  • 📦 Modules logiciels pour capteurs et moteurs.
  • 🤖 Algorithmes embarqués pour les comportements du robot (poursuite, évitement, etc.).

📂 Accédez au code source ici.

📂 Accédez à la documentation Doxygen ici.


🎯 État des Fonctionnalités du Robot StealthKitty

🚗 Déplacement de Base

  • ✅ Déplacement avant/arrière

  • ✅ Rotation sur place

  • ✅ Contrôle indépendant des moteurs

  • ✅ Lecture des encodeurs

  • 🟡 Asservissement en vitesse des moteurs

    Fonctionnel mais nécessite des optimisations pour plus de précision

🛡️ Sécurité Anti-Chute

  • ✅ Détection des bords via capteur ToF

  • ✅ Arrêt automatique en cas de détection de vide

  • ✅ Pivot arrière automatique(manœuvre d'évitement)

    Testé et validé sur table sans bordure comme visible sur vidéo

👁️ Détection et Tracking

  • ✅ Scan LIDAR

  • ✅ Détection des autres robots

  • 🟡 Suivi de cible

    Asservissement angulaire pas terminé et lecture du Lidar à améliorer

🎮 Modes de Jeu

  • ✅ Changement de rôle via accéléromètre

  • ✅ Mode "Chat" (prédateur), avec une vitesse augmentée

  • ✅ Mode "Souris" (proie)

  • 🟡 Algorithme de poursuite

    Base implémentée, work in progress

⚡ Gestion Énergie

  • ✅ Alimentation par batterie
  • ✅ Protection contre la décharge
  • ✅ LED d'état batterie

🏁 Conclusion

Pour conclure, ce projet nous a permis de mettre en pratique et d'approfondir nos connaissances en électronique et systèmes embarqués.

La réalisation de StealthKitty, de la conception du PCB à l'implémentation du firmware, nous a confrontés aux défis concrets de l'ingénierie : optimisation CEM, conception de cartes multicouches, intégration de capteurs et développement d'algorithmes de contrôle en temps réel.

Cette expérience pratique a été formatrice, a renforcé notre compréhension des systèmes embarqués et nous a préparés aux futures exigences du monde professionnel.

WhatsApp Image 2025-01-15 at 17 13 14


📄 Licence

📝 Ce projet est sous licence MIT.
Pour plus d’informations, consultez le fichier LICENSE.

Parts

82
QtyValueFootprintReferences
81uFCapacitor_SMD:C_0603_1608MetricC201, C202, C207, C208, C402, C504, C506, Cs301
6TestPointTestPoint:TestPoint_Pad_D1.5mmTP301, TP302, TP307, TP308, TP309, TP310
5100 nFCapacitor_SMD:C_0402_1005MetricC401, C403, C404, C405, C406
40.1uFCapacitor_SMD:C_0402_1005MetricC502, C503, C505, Cio301
41kResistor_SMD:R_0402_1005MetricR403, R404, R405, R507
4Conn_01x06Connector_JST:JST_XH_S6B-XH-A_1x06_P2.50mm_HorizontalJ201, J202, J301, J302
4~MountingHole:MountingHole_3.2mm_M3_Pad_ViaH401, H402, H403, H404
322uFCapacitor_SMD:C_0805_2012MetricC501, C507, C509
210 pFCapacitor_SMD:C_0402_1005MetricC409, C411
2100kResistor_SMD:R_0402_1005MetricR501, R502
2100nCapacitor_SMD:C_0402_1005MetricC204, C205
210uFCapacitor_SMD:C_0603_1608MetricC203, C206
2SW_PushButton_Switch_SMD:SW_Push_1P1T_NO_6x6mm_H9.5mmSW401, SW402
2ZXBM5210-SPPackage_SO:Diodes_SO-8EPU1, U2
110 nFCapacitor_SMD:C_0402_1005MetricC408
1100nFCapacitor_SMD:C_0402_1005MetricC412
110KResistor_SMD:R_0402_1005MetricR407
110kResistor_SMD:R_0402_1005MetricR406
115pFCapacitor_SMD:C_0402_1005MetricC508
116kResistor_SMD:R_0402_1005MetricR504
12.2kResistor_SMD:R_0402_1005MetricR402
120Resistor_SMD:R_0402_1005MetricR503
13.3kResistor_SMD:R_0402_1005MetricR401
14.7 uFCapacitor_SMD:C_0603_1608MetricC407
14.7uHLibrary:INDPM5050X200NL501
140.2kResistor_SMD:R_0402_1005MetricR506
17.68kResistor_SMD:R_0402_1005MetricR505
1ADXL343Package_LGA:LGA-14_3x5mm_P0.8mm_LayoutBorder1x6yU301
1BU33SD5WG-TRLibrary:SOT95P280X125-5NPS501
1Battery_CellConnector_JST:JST_XH_S2B-XH-A-1_1x02_P2.50mm_HorizontalBT501
1Conn_01x02Connector_JST:JST_XH_S2B-XH-A-1_1x02_P2.50mm_HorizontalAlim_charger501
1Conn_01x08Connector_JST:JST_XH_S8B-XH-A_1x08_P2.50mm_HorizontalJ303
1Conn_ST_STDC14Connector_PinHeader_1.27mm:PinHeader_2x07_P1.27mm_Vertical_SMDJ401
1Crystal_GND24_SmallCrystal:Crystal_SMD_3225-4Pin_3.2x2.5mmY401
1LED_ONLED_SMD:LED_0603_1608Metric_Pad1.05x0.95mm_HandSolderD501
1LED_purpleLED_SMD:LED_0603_1608Metric_Pad1.05x0.95mm_HandSolderD402
1LED_status_LiDARLED_SMD:LED_0603_1608Metric_Pad1.05x0.95mm_HandSolderD403
1LED_status_orangeLED_SMD:LED_0603_1608Metric_Pad1.05x0.95mm_HandSolderD401
1LOGOLibrary:LOGOG***
1M1_PWM_FWDTestPoint:TestPoint_Pad_D1.5mmTP201
1M1_PWM_REVTestPoint:TestPoint_Pad_D1.5mmTP202
1M2_PWM_FWDTestPoint:TestPoint_Pad_D1.5mmTP203
1M2_PWM_REVTestPoint:TestPoint_Pad_D1.5mmTP204
1MP1475DJ-LF-PLibrary:SOT65P280X100-8NIC501
1STM32G431CBU6Package_DFN_QFN:QFN-48-1EP_7x7mm_P0.5mm_EP5.6x5.6mmU401
1SwitchConnector_JST:JST_XH_S3B-XH-A-1_1x03_P2.50mm_HorizontalSW501

Similar boards

  • 4 layers57 × 54 mmPojet V NOM KiCAD, the printed circuit board in 3D

    Pojet V NOM KiCAD

    MohamedBenabdelhadi/2425_ESE_Projet_V-NOM

    Mohamed Benabdelhadi_Nouhaila Faris_Oliver Belliard_Valerian Priou

    78 parts2
  • 4 layers54.1 × 57 mmProjet Robot, the printed circuit board in 3D

    Projet Robot

    ezer-soltani/HellKitty-Autonomous-Robot

    Professional firmware and hardware design for an autonomous mobile robot using STM32G431 and FreeRTOS. Features Lidar perception, ToF safety algorithms, and PID motor control.

    88 partsMIT
  • 8 layers45 × 45 mmPCB Projet ESE v2, the printed circuit board in 3D

    PCB Projet ESE v2

    FernandesVincent/Projet-ESE-chat-robot

    Création d'un robot jouant à chat.

    218 parts
  • 4 layers54 × 57 mmTagBot, the printed circuit board in 3D

    TagBot

    exysta/2425_ESE_Projet_TagBot

    Vous vous trouvez actuellement dans le projet TagBot (ou robot chat), qui s'intègre à un projet de classe où chaque équipe doit concevoir un robot.

    87 parts3MIT
  • 4 layers54 × 57 mmProjet torero, the printed circuit board in 3D

    Projet torero

    Manassehalt/2425_ESE_Projet_Torero

    Projet de 3ème année d'ESE réalisé par : - JACQUOT Nolan - GUIFFAULT Gabriel - BOULOT Paul - THOMAR Jean-Philippe

    82 parts
  • 4 layers90 × 72 mmRobot, the printed circuit board in 3D

    Robot

    Dorian12000/Projet

    robot chat

    62 parts1
  • 4 layers90 × 72 mmRobot chat, the printed circuit board in 3D

    Robot chat

    HOSTEER/ESE2024

    Activer doxygen dans les propriétés du projet -> général C/C++, tuto doxygen https://www.youtube.com/watch?v=GC9Xy7nLxyw

    112 parts
  • 4 layers88 × 68 mmGc STM32G491CET6, the printed circuit board in 3D

    Gc STM32G491CET6

    lfiack/gCollector

    Garbage collector robot for FreeRTOS Labs

    83 parts

Questions

How big is the StealthKitty.kicad pro PCB?

It measures 54 × 57 mm and has 4 copper layers, 1.6 mm thick.

What parts does the StealthKitty.kicad pro use?

82 parts, built around the STM32G431CBU6, ZXBM5210-SP, MP1475DJ-LF-P and ADXL343BCC. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the StealthKitty.kicad pro KiCad files?

From the flexdrt/2425_ESE_Projet_StealthKitty repository on GitHub, at the commit this page was made from: the board is hardware/StealthKitty.kicad_pro/StealthKitty.kicad_pro.kicad_pcb and its schematic annexes/logic center stm32/meziane_part/1_0/Block STM32.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the StealthKitty.kicad pro design in my own project?

Its repository states no licence, so its author keeps all rights: ask flexdrt before reusing the design.