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

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.
TagBot is an open-source printed circuit board by exysta, from the exysta/2425_ESE_Projet_TagBot repository on GitHub, published under the MIT licence. It is a 4-layer board of 54 × 57 mm with 87 parts on 85 nets, routed with 635 tracks and 226 vias.
It is built around the ZXBM5210-SP, MP1475SGJ-P and ADXL343BCC, with the BU33SD5WG-TR among its other parts. Its parts include 27 capacitors, 20 resistors, 7 diodes, 6 ICs and 5 connectors. It belongs with the STM32 boards of this library.
Welcome to the TagBot project created by the amazing team consisted of Lucas Chapart, Charlotte Fricot and Marie Caronello. The following description is in french but you can find the english description there but it is not up to date for now :
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. Ces robots doivent pouvoir jouer au chat ensemble, avec un chat et des souris, sur une table sans bords.
Au terme de ce projet, notre chat robot doit pouvoir:
Nous avons plusieurs niveaux d'objectifs à atteindre :
Le projet doit être réalisé sur un semestre, du mois de septembre au mois de janvier, avec un certain nombre de livrables à fournir avant chaque étape clé. Les différentes étapes techniques incluent des phases de conception, de développement et de validation sur un système embarqué.
Les 10 premières séances sont consacrées à la création du PCB que l'on doit commander avant les vacances de la Toussaint.
Dans le même temps, nous avons débuté la partie informatique avec la création du projet sur CubeIDE. Nous avons configuré les pins et commencé la rédaction des librairies pour les différents composants.
Cette période est centrée sur le développement logiciel et l'intégration.
L'accent est mis sur les derniers ajustements et les tests finaux avant la présentation. En effet, les dernières séances consacrées à ce projet vont nous permettre de finaliser les algorithmes de stratégie et les comportements robotiques. Le challenge final aura lieu le vendredi 10 janvier, ce challenge consistera en un test et une présentation du projet où tous les robots chats de notre classe s'affronteront.
L'essentiel du matériel a été imposé, mais il restait à déterminer le moyen par lequel le robot détecterait les bords pour éviter de tomber de la table. Pour cela, des capteurs infrarouges (IR) ont été choisis. Placés sous le robot, ces capteur reçoivent une tension qui détermine la distance par rapport au sol. Lorsque ce signal diminue fortement (ce qui correspond à une augmentation de la distance), cela indique la présence d'un bord. Étant donné que les capteurs sont situés sous le robot, il est nécessaire de détecter de faibles distances, comme le permet le capteur Sharp GP2Y0A21SK0F.
Il est également envisagé d'ajouter une LED visible par l'utilisateur, permettant de connaître l'état du robot chat à tout moment.
La première étape de la conception du PCB a été de réaliser le schéma électronique de la carte. Voici une liste des composants utilisés :
Le microprocesseur STM32G431x6 est au cœur du robot. Il gère la logique du jeu et communique avec les autres composants. Le schéma de branchement du microprocesseur est disponible ici.
Les principaux branchements incluent :
Pour configurer les broches du microcontrôleur, le logiciel CubeIDE est utilisé. Une fois la configuration effectuée, la génération du fichier .ioc permet de documenter l'ensemble des options choisies pour chaque broche. Le fait d'utiliser l'ioc du microprocesseur permet de choisir au mieux chaque broche pour les entrée/sortie du microprocesseur.
Le robot comporte 7 LEDs connectées à des résistances de limitation de courant.
Le robot dispose de deux boutons :
Les drivers de moteurs permettent de contrôler les moteurs à courant continu utilisés pour déplacer le robot. Le driver ZXBM5210 est connecté selon le schéma de la documentation.
Le branchement des drivers inclut :
Deux régulateurs de tension sont utilisés pour convertir l'alimentation de la batterie :
L'oscillateur quartz est utilisé pour fournir une horloge stable au microprocesseur. Il est connecté selon le schéma standard, avec des condensateurs de découplage.
La ST Link est utilisée pour la programmation et le débogage du microprocesseur STM32. Elle permet de flasher le code sur le microprocesseur et d'assurer une communication série pour le débogage.
L'accéléromètre ADXL343 permet de mesurer les mouvements du robot. Il est connecté au microprocesseur via une communication SPI. La configuration SPI a été choisie car elle offre une communication plus rapide et fiable dans notre application. Le schéma de branchement est basé sur la documentation.
Le robot dispose de plusieurs connecteurs pour interfacer différents périphériques :
Le robot est alimenté par une batterie LiPo de 7.2V, qui fournit de l'énergie aux régulateurs de tension pour les différents composants du circuit, la documentation utilisé est ici. Pour vérifier la présence de la tension de 7.2V, une LED verte a été ajoutée et connectée à une résistance de limitation de courant.
Répartition des 4 couches du PCB :
Couche 1 (Front) : Couche sur laquelle sont placés tous nos composants, la plupart étant en CMS, à l'exception des connecteurs qui sont en traversants. La majoté des pistes de données se trouvent sur cette couche, tandis qu'une partie d'entre elles passent par la couche bottom. Cela permet de maintenir l'homogénéité des plans de masse (couche 2) et d'alimentation (couche 3), ce qui protège l'intégrité des signaux de données.
Couche 2 : Plan de masse. Il est important d'espacer nos vias pour ne pas couper le plan de masse.
Couche 3 : Couche d'alimentation. Elle contient les plans d'alimentations pour les composants à forte consommation de puissance. Cela permet une meilleure dissipation thermique.
Couche 4 (Bottom) : Une partie des pistes de données ainsi que les points de test se situent sur cette couche. Lors du routage des pistes sur cette couche, il faut essayer de ne pas faire passer les pistes par les discontinuités des plans d'alimentations présents sur la couche 3. En effet, cette discontinuité peut poser des problèmes de CEM pour les signaux de données les plus rapides tels que : UART, I2C, SPI et signaux de debug.
Éviter les angles droits ou inférieurs à 90° sur les pistes : Les pistes présentant des angles droits ou très aigus peuvent entraîner des discontinuités d’impédance, causant des réflexions de signal et des perturbations électromagnétiques, notamment dans les circuits haute fréquence. Ces angles peuvent également constituer des points de faiblesse thermique ou mécanique. Il est recommandé d’utiliser des angles de 45° ou des courbes douces pour maintenir la continuité du signal et réduire les effets de réflexion et d’interférence.
Position des vias par rapport aux pastilles de brasage: Sur l'image ci-dessous, les vias ne sont pas placés directement sur les pastilles de brasage. Cette configuration a été choisie pour éviter des problèmes de soudure et pour permettre une meilleure dissipation thermique.
Condensateurs de découplage à faible valeur : Les condensateurs de plus petite capacité (souvent des céramiques, typiquement dans les gammes de 100nF à 1µF) sont destinés à filtrer les hautes fréquences et doivent être placés aussi près que possible des pins d'alimentation des composants. Leur faible constante de temps leur permet de répondre rapidement aux fluctuations rapides de la tension causées par des commutations rapides dans les circuits numériques.
Condensateurs de plus grande valeur: Les condensateurs de plus grande capacité (souvent dans les gammes de 10µF à 100µF ou plus, et souvent des électrolytiques ou des tantales) servent à fournir une énergie plus conséquente pour des fluctuations de tension plus lentes, mais ne sont pas aussi efficaces pour les hautes fréquences. Ils peuvent être placés un peu plus loin des composants, mais idéalement, ils devraient rester dans le même plan d'alimentation. Leur rôle est de compléter les condensateurs de faible valeur, en offrant une stabilisation à des fréquences plus basses.
L'ajout de points de test accessibles facilite la vérification des tensions d'alimentation, des signaux critiques ou d'autres tests en cours de fabrication et de débogage.
Le détail des fonctions structures et autres peuvent être visualiser en utilisant la documentation Doxygen :
La documentation qui suit est un résumé du fonctionement et ne rentre pas trop dans les détails déjà couvert par la documentation DOxygen.
Dans le cadre du projet, nous devons utiliser plusieurs moyens de communications tels que le SPI pour l'accéléromètre, l'I2C pour l'écran OLED, l'UART pour le lidar et une lecture de tension avec un ADC pour les capteurs de distance.
Cette ordre de priorité nous permet de nous assurer un controle des moteurs prioritaire est assure une bonne détection d'un potententiel vide par notre tâche Distance sensor
/* USER CODE BEGIN Includes */
#include "stm32g4xx_hal.h"
#include "semphr.h"
#include "X4LIDAR_driver.h"
#include "DCMotor_driver.h"
#include "SSD1306.h"
#include "SSD1306_fonts.h"
#include "shell.h"
#include "RobotStrategy.h"
#include "distSensor_driver.h"
#include "ADXL343_driver.h"
/* USER CODE BEGIN PV */
X4LIDAR_handle_t X4LIDAR_handle;
DualDrive_handle_t DualDrive_handle;
__TARGET_HandleTypeDef Target_Handle;
int main(void)
{
...
printf(" _____________________________\r\n");
printf("| |\r\n");
printf("| |\r\n");Cette implémentation est un pilote pour le capteur X4 LIDAR, conçu pour fonctionner sur des systèmes embarqués utilisant FreeRTOS. Le pilote gère la communication avec le capteur LIDAR via UART et fournit des fonctionnalités pour la configuration du dispositif, le balayage et le traitement des données.
X4LIDAR_init: Initialise le pilote LIDAR et effectue la configuration initialeX4LIDAR_start_scan: Démarre le processus de balayage LIDARX4LIDAR_get_device_info: Récupère les informations du dispositifX4LIDAR_create_task: Crée une tâche FreeRTOS pour les opérations LIDARX4LIDAR_send_command: Gère la transmission des commandes au capteurmain.c:
// Initialisation de la structure LIDAR
X4LIDAR_handle_t lidar_handle;
UART_HandleTypeDef huart3; // Votre handle UART
// Création de la tâche LIDAR
X4LIDAR_create_task(&lidar_handle);
/* Start scheduler */
osKernelStart();
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
{
X4LIDAR_HAL_UART_RxHalfCpltCallback(huart,&X4LIDAR_handle);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
X4LIDAR_HAL_UART_RxCpltCallback(huart,&X4LIDAR_handle);
}X4LIDAR_driver.c:
//ensure the correct uart is used for the init
void X4LIDAR_task(void *argument)
{
// Retrieve the LiDAR handle passed as argument
X4LIDAR_handle_t *X4LIDAR_handle = (X4LIDAR_handle_t*) argument;
// Initialize the LiDAR hardware
X4LIDAR_init(X4LIDAR_handle, &huart3);
X4LIDAR_start_scan(X4LIDAR_handle);
...
}For the uart config :
For the DMA config :
Ce fichier a pour but de centraliser et synchroniser les différentes fonctionalitées du robot. C'est dans ce fichier que le traitement des donnés du Lidar est fait pour déterminer la cible la plus proche.On y gère également les états chat/souris.
Idéalement il aurait fallu tout centraliser sur cette tache mais par manque de temps et pour s'assurer que les actions critiques telles que le freinage des moteurs se faisaient à temps, une partie à des actions s'effectuent dans les autres taches.
Ce fichier contient des fonctions pour controler les pwm envoyer aux deux moteurs. Il contient également les fonctions pour les encodeurs des moteurs.
Une petie rampe pour les pwm a été utilisé et l'acquisition de la vitesse des moteurs se fait toutes les secondes via le callback d'un timer.
La shell est uniquement utilisé pour le debug étant donné que la connexion STLink n'est pas possible si le robot doit se déplacer. des fonctions peuvent y etre ajouté en appellant shell_add(). exemple d'utilisation :
shell_init(&h_shell);
shell_add(&h_shell, "print_dist", print_lidar_distances,
"print lidar buffer containing scanned distances");
shell_add(&h_shell, "print_motor_speed", print_motor_speed,
"print_motor_speed");
shell_createShellTask(&h_shell);
...
/* Start scheduler */
osKernelStart();L'écran est uniquement utilisé pour le fun afin d'avoir un moyen de visualiser si le robot est en mode chat ou sours. La librairie utilisé à été légérement adapté pour prendre en charge l'affichage d'images.
Nous allons à présent établir le code pour l'accéléromètre ADXL343, il va permettre de déteter un TAP et donc un changement d'état du robot, lorsque ce dernier entre en collision avec un autre robot. Pour pouvoir communiquer avec l'ADXL343 nous allons utiliser la communication SPI, ainsi on va définir deux fonctions principale pour lire et ecrire dans les registres.
Dans le header en plus de définir les différents registres qui seront utilisés dans le code, et les différents structures, on peut également définir des paramètres clés pour la détection du TAP tel que :
#define TAP_THRESHOLD 0x20
#define TAP_DURATION 0x10
#define TAP_LATENT 0xC8On définit alors le seuil de détection du tap ici 2g, la durée entre deux tap différents ici 10ms et la durée total d'un single TAP.
Pour pouvoir lire dans les registres on doit d'abord activer le NSS, ensuite on envoie l'adresse à laquelle on veut lire la donnée, puis on lit la donnée associée à l'adresse du registre et enfin on désactive le NSS.
void ADXL343_ReadRegister(uint8_t reg, int8_t* rx_data, size_t length)De la même manière pour écrire dans un registre on active le NSS ensuite on transmet les données que que l'on veut transmettre dans le registre qui nous intéresse et puis on désactive le NSS.
void ADXL343_WriteRegister(uint8_t reg, uint8_t data)Pour l'initialisation de l 'accéléromètre, on commence tout d'abord en vérifiant que la connexion est corréctement établit, pour cela on vérifie que la valeur du registre ADXL343_REG_DEVID est bien 0xE5. Ensuite on configure les différents registres pour mettre l'accéléromètre en mode veille, définir le format des données, et activer le mode mesure.
int ADXL343_Init(ADXL343_Handle_t* handle)Ensuite on va spécifiquement configurer les seuils, la durée, et les axes pour détecter les tapotements. On va également activer les interruptions pour les événements de tapotement simple sur n'importe quel axe.
void ADXL343_Configure(ADXL343_Handle_t* handle)Le but de l'accéléromètre est de détecter lorsque le robot entre en collision pour ensuite pouvoir changer d'état. Pour cela on va lire la valeur du registre ADXL343_REG_INT_SOURCE et lorsque le 6 eme bit est à 1 cela signifie que l'on a détecter un single TAP.
void ADXL343_DetectTap(ADXL343_Handle_t* handle)Avec l'activation de freeRTOS le fonctionnement est géré dans une tâche périodique permettant une exécution asynchrone et une intégration facile dans un système temps réel.
void ADXL343_TaskCreate(void * unused)Dans cette partie on va expliquer le code pour les capteurs de distance. Les capteurs de distance vont permettre de détecter le vide et ainsi d'arréter les moteurs pour éviter que le robot tombe de la table. On va donc utiliser 4 capteurs Nord, West, Sud, Est on utilisera deux canaux ADC1 et ADC2 sur la STM32. ADC1 lit les capteurs de distance situés à l'ouest (west) et au nord et ADC2 lit les capteurs de distance situés au sud et à l'est. Chaque capteur est représenté par une structure(DistSensor_handle_t) qui contient des informations telles que l'état du capteur et les valeurs mesurées. Les données des ADC sont transférées en mémoire via DMA pour améliorer les performances et réduire la charge du CPU.
Pour l'initialisation on va démarrer les conversions ADC en mode DMA pour ADC1 et ADC2 et activer le timer associé htim6 pour synchroniser les conversions. On initialise les capteurs avec les valeurs par défaut.
void distSensor_initADC_DMA(void)On va lire les valeurs de l'adc pour pouvoir déterminer si la distance qu'on évalue de l'objet le plus proche est le vide ou pas. On établit deux fonctions l'une en mode polling tel qu'on effectue la lecture manuelle d'une valeur ADC en mode blocant. Mais on établie aussi la focntion de lecture des données en mode DMA. La lecture des données des buffers DMA s'éffectue pour chaque capteur avec la mise à jour des états en fonction d'un seuil (VOID_TRESHOLD). On vérifie si le capteur détecte un sol ou du vide .
uint32_t distSensor_ReadADC(ADC_HandleTypeDef* hadc)HAL_StatusTypeDef distSensor_ReadADC_DMA(void)On appelle la fonction CallBack lorsque la conversion ADC est terminée.
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)On commence par créer une fonction exécutée en tâche FreeRTOS pour gérer les capteurs en continu, cette fonction va lit les données des capteurs via la fonction évoquée précédemment et on vavérifier si un ou plusieurs capteurs détectent du vide. Si oui, on déclenche une procédure d'arrêt d'urgence en activant le freinage des moteurs, et on réinitialise leur vitesse à 0 après un délai. L'arret d'ugence s'effectue directement ici pour éviter d'éventuels délais/préemption qui pourrait ralentir l'arret.
Attention, il faut penser à mettre le continuous conversion mode de l'adc en disable sinon le programme bloque.
Autre point important, les adc sont sur 12 bits, il est donc préférable de configurer le dma pour le transfert de half-word i.e 16 bits. Cependant, il faut alors penser à définir le buffer du DMA comme uint16_t adc1_dma_buffer[ADC1_CHANNEL_COUNT];.
En effet, si l'on défini le buffer avec des uint32_t, les valeurs de 2 channels sur 16 bits se retrouveront concaténées sur une valeur de 32 bits. Pour des raisons obsucre il y avait encore des bugs de cette facon.
En mettant les transferts du dma en format word avec uint32_t adc1_dma_buffer[ADC1_CHANNEL_COUNT] cela semble régler le problème.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 8 | 1u | Capacitor_SMD:C_0603_1608Metric | C102, C104, C105, C106, C201, C301, C501, C502 |
| 7 | LED | LED_SMD:LED_0603_1608Metric | D101, D401, D501, D601, D602, D603, D604 |
| 6 | TestPoint | TestPoint:TestPoint_Pad_D1.5mm | LEFT_REV, MISO, MOSI101, RIGHT_FWD, RIGHT_REV, TPLEFT_FWD |
| 5 | 100n | Capacitor_SMD:C_0402_1005Metric | C101, C108, C109, C110, C702 |
| 4 | 100 | Resistor_SMD:R_0402_1005Metric | R801, R802, R803, R804 |
| 4 | 300 | Resistor_SMD:R_0402_1005Metric | R501, R601, R602, R604 |
| 4 | MountingHole_Pad | MountingHole:MountingHole_3.2mm_M3_Pad_Via | H101, H102, H103, H104 |
| 3 | 0.1u | Capacitor_SMD:C_0402_1005Metric | C401, C403, C404 |
| 3 | 22u | Capacitor_SMD:C_0805_2012Metric | C402, C405, C406 |
| 3 | Conn_01x06 | Connector_JST:JST_XH_S6B-XH-A_1x06_P2.50mm_Horizontal | J1001, J1002, LIDAR |
| 3 | SolderJumper_2_Open | Jumper:SolderJumper-2_P1.3mm_Open_TrianglePad1.0x1.5mm | JP901, JP902, JP903 |
| 2 | 100k | Resistor_SMD:R_0402_1005Metric | R401, R402 |
| 2 | 10k | Resistor_SMD:R_0402_1005Metric | R701, R702 |
| 2 | 10n | Capacitor_SMD:C_0402_1005Metric | C103, C701 |
| 2 | 10p | Capacitor_SMD:C_0402_1005Metric | C111, C112 |
| 2 | 10u | Capacitor_SMD:C_0603_1608Metric | C202, C302 |
| 2 | SW_Push | Button_Switch_SMD:SW_Push_1P1T_NO_6x6mm_H9.5mm | CAT_MOUSE, NRST |
| 2 | ZXBM5210-SP | Package_SO:Diodes_SO-8EP | U201, U301 |
| 1 | 1.3k | Resistor_SMD:R_0402_1005Metric | R603 |
| 1 | 10 | Resistor_SMD:R_0402_1005Metric | R101 |
| 1 | 15p | Capacitor_SMD:C_0402_1005Metric | C407 |
| 1 | 16k | Resistor_SMD:R_0402_1005Metric | R404 |
| 1 | 20 | Resistor_SMD:R_0402_1005Metric | R403 |
| 1 | 39n | Inductor_SMD:L_0603_1608Metric | L101 |
| 1 | 3k | Resistor_SMD:R_0402_1005Metric | R407 |
| 1 | 4.7u | Library:Power Inductors - SMD WE-LQS 4.7uH | L401 |
| 1 | 4.7u | Capacitor_SMD:C_0603_1608Metric | C107 |
| 1 | 40.2k | Resistor_SMD:R_0402_1005Metric | R405 |
| 1 | 4k | Resistor_SMD:R_0402_1005Metric | R102 |
| 1 | 7.68k | Resistor_SMD:R_0402_1005Metric | R406 |
| 1 | ADXL343 | Package_LGA:LGA-14_3x5mm_P0.8mm_LayoutBorder1x6y | U102 |
| 1 | BU33SD5WG-TR | Package_TO_SOT_SMD:SOT-23-5 | U501 |
| 1 | Battery | Connector_JST:JST_XH_S2B-XH-A_1x02_P2.50mm_Horizontal | Batt |
| 1 | Conn_01x02 | Connector_JST:JST_XH_S2B-XH-A_1x02_P2.50mm_Horizontal | Charg |
| 1 | Conn_01x04 | Connector_JST:JST_XH_S4B-XH-A_1x04_P2.50mm_Horizontal | J1101 |
| 1 | Conn_01x08 | Connector_JST:JST_XH_S8B-XH-A_1x08_P2.50mm_Horizontal | J901 |
| 1 | Conn_ST_STDC14 | Connector_PinHeader_1.27mm:PinHeader_2x07_P1.27mm_Vertical_SMD | ST_LINK |
| 1 | Crystal | Crystal:Crystal_SMD_EuroQuartz_MT-4Pin_3.2x2.5mm | Y101 |
| 1 | MP1475S | Package_TO_SOT_SMD:TSOT-23-8 | U401 |
| 1 | STM32G431CBUx | Package_DFN_QFN:QFN-48-1EP_7x7mm_P0.5mm_EP5.6x5.6mm | U101 |
| 1 | switch | wurth_472121020311:472121020311 | charg |

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.

MohamedBenabdelhadi/2425_ESE_Projet_V-NOM
Mohamed Benabdelhadi_Nouhaila Faris_Oliver Belliard_Valerian Priou

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


flexdrt/2425_ESE_Projet_StealthKitty
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.

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.



mcbridejc/GaussSpeedway
PCB design for the Gauss Speedway. Designed in Kicad 6.
It measures 54 × 57 mm and has 4 copper layers, 1.6 mm thick.
87 parts, built around the ZXBM5210-SP, MP1475SGJ-P, ADXL343BCC and BU33SD5WG-TR. 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.
From the exysta/2425_ESE_Projet_TagBot repository on GitHub, at the commit this page was made from: the board is KiCad/TagBot/TagBot.kicad_pcb and its schematic KiCad/SensorConnector_PCB/SensorConnector_PCB.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).