<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wiki-se.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lkachour</id>
	<title>wiki-se.plil.fr - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-se.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lkachour"/>
	<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Lkachour"/>
	<updated>2026-08-08T03:15:30Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=13006</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=13006"/>
		<updated>2026-05-28T08:10:27Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : /* Nouveau code ajouté */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Etapes clés du projet :&lt;br /&gt;
&lt;br /&gt;
'''HARDWARE :'''&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
'''SOFTWARE :'''&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs bloc.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
===  Informations en vrac : ===&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD &lt;br /&gt;
&lt;br /&gt;
https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
[[Fichier:Photo1.png|centré|634x634px]].&lt;br /&gt;
&lt;br /&gt;
=== HARDWARE : ===&lt;br /&gt;
&lt;br /&gt;
===== '''''06/03/26:''''' =====&lt;br /&gt;
- Ebauche du schéma électrique &lt;br /&gt;
&lt;br /&gt;
* ajout des symboles des principaux composants (Arduino Nano, Lecteurs micro SD)&lt;br /&gt;
* étiquettes des liaisons principales.&lt;br /&gt;
&lt;br /&gt;
- Création d'un Git sur Gitea pour futur dépot de l'avancement du projet&lt;br /&gt;
[[Fichier:Capture_d’écran_n1_kicad.png|centré|633x633px|V1 schéma électrique]]&lt;br /&gt;
&lt;br /&gt;
=====  '''''15/03 -&amp;gt; 18/03''''' =====&lt;br /&gt;
- Schema électrique   &lt;br /&gt;
&lt;br /&gt;
* Ajout des résistances et des capacités nécessaires.&lt;br /&gt;
* Adaptation des alimentations en 3V3 des composants.&lt;br /&gt;
* Vérification et correction de la première version&lt;br /&gt;
&lt;br /&gt;
- démarrage du routage PCB et ajout des empreintes sur les composants.  &lt;br /&gt;
[[Fichier:V2 Schéma élec.png|centré|sans_cadre|639x639px|version 2 Schéma Electrique]].&lt;br /&gt;
&lt;br /&gt;
===== '''Schéma électrique Final :''' =====&lt;br /&gt;
(insérer capture d'écran)        &lt;br /&gt;
&lt;br /&gt;
.        &lt;br /&gt;
&lt;br /&gt;
===== '''PCB Final :''' =====&lt;br /&gt;
* Minimisation des dimensions de la carte. Carte la plus compacte possible.&lt;br /&gt;
* Masse GND en double face&lt;br /&gt;
* Double face, passage de certaines pistes en dessous en utilisant des via.&lt;br /&gt;
* Passage du 3V3 en couche inférieure (recommandé par M. Redon).&lt;br /&gt;
* Piste 3V3 plus épaisse que les pistes classique (4mm)&lt;br /&gt;
* Ajout de plusieurs Via sur le plan de masse afin de bien connecter les deux couches.&lt;br /&gt;
&lt;br /&gt;
''Difficultés rencontrées :'' &lt;br /&gt;
&lt;br /&gt;
* Connecter les deux lecteurs micro SD ensemble était compliqué, car les pin étaient inversée les unes par rapport aux autres (en miroir). Donc toutes les pistes se croisaient.&lt;br /&gt;
* Réussir à connecter le GND partout était difficile, en raison de zones isolées qui se créaient (solutionné par le passage en couche inférieur du 3V3).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture_d’écran_ec4.png|centré|sans_cadre|553x553px]]&lt;br /&gt;
&lt;br /&gt;
Carte envoyée en impression en même temps que les projets PSE (13/04).&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
===  '''SOFTWARE :''' ===&lt;br /&gt;
&lt;br /&gt;
===== (13/04 -&amp;gt; 18/04) =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Actuellement, mon programme ne réalise pas encore la copie complète bloc par bloc de toute la micro-SD comme demandé dans l’objectif final.&lt;br /&gt;
&lt;br /&gt;
Pour l’instant, j’ai développé une première version qui fonctionne au niveau du système de fichiers : le programme initialise deux cartes micro-SD sur le même bus SPI avec deux broches CS différentes, puis parcourt la carte source afin de copier les dossiers et les fichiers vers la carte destination. &lt;br /&gt;
&lt;br /&gt;
La copie se fait fichier par fichier, en lisant une petite quantité de données en mémoire grâce à un buffer, puis en l’écrivant sur la deuxième carte. Cette version m’a surtout permis de mettre en place la logique générale du projet. C'est à dire : &lt;br /&gt;
&lt;br /&gt;
- initialisation des deux cartes&lt;br /&gt;
&lt;br /&gt;
- distinction entre la source et la destination&lt;br /&gt;
&lt;br /&gt;
- parcours récursif des dossiers, reconstruction des chemins de fichiers&lt;br /&gt;
&lt;br /&gt;
- gestion des erreurs d’ouverture, de lecture et d’écriture&lt;br /&gt;
&lt;br /&gt;
- affichage d’informations avec &amp;lt;code&amp;gt;Serial.print()&amp;lt;/code&amp;gt; pour préparer le débogage. &lt;br /&gt;
&lt;br /&gt;
Il reste donc à adapter le programme pour respecter exactement le cahier des charges final, c’est-à-dire effectuer une copie brute bloc par bloc de la première carte vers la seconde, ajouter l’indication par la LED Arduino après chaque bloc copié avec succès. Peut être prévoir un code d’erreur par LED en cas de problème si j'ai encore du temps.&lt;br /&gt;
&lt;br /&gt;
===== Problèmes rencontrés : =====&lt;br /&gt;
Pendant l'écriture du programme, j’ai rencontré quelques problèmes techniques liés principalement aux contraintes matérielles et à la gestion des fichiers.&lt;br /&gt;
&lt;br /&gt;
Le premier problème important concernait la gestion de la mémoire de l’Arduino. Au départ, j’avais défini un buffer de copie assez grand pour améliorer la vitesse de transfert. Cependant, lors de la compilation, j’obtenais une erreur indiquant que la mémoire disponible était dépassée (“data section exceeds available space in board”).&lt;br /&gt;
&lt;br /&gt;
Grâce à mes recherches, j’ai compris que la combinaison de la bibliothèque SdFat, des variables globales et du buffer dépassait la RAM disponibles sur l’arduino. Du coup, j’ai progressivement réduit la taille du buffer (jusqu’à 32 octets), ce qui a permis de faire rentrer le programme en mémoire, au prix d’une vitesse de copie plus faible.&lt;br /&gt;
&lt;br /&gt;
J’ai eu un problème de gestion des chemins de fichiers lors de la copie. En effet, pour parcourir récursivement les dossiers, il était nécessaire de reconstruire correctement les chemins complets. La fonction joinPath a permit d'eviter les erreurs liées à la taille des buffers. J’ai intégré des vérifications supplémentaires pour gérer les cas d’erreur potentiels (échec d’ouverture de fichier, chemin trop long, erreur de lecture/écriture), afin d'être plus sur du programme même avant le test sur matériel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme je ne peux pas encore tester physiquement les cartes, j’ai ajouté des messages Serial.print() pour que, lors du premier test matériel, je puisse identifier rapidement où le programme bloque.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enfin, j’ai rencontré des obstacles liées à la limitation matérielle de l’Arduino, notamment en termes de mémoire et de gestion simultanée de deux cartes SD sur le même bus SPI. Cela m’a obligé à optimiser le code et à bien comprendre l'utilisation de deux broches CS distinctes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vous trouverez la version actuelle de mon programme dans les Documents Rendus et sur le Git.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Git : https://gitea.plil.fr/lkachour/EC4.git&lt;br /&gt;
&lt;br /&gt;
premier code (finalement trop lourd)&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SdFat.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const uint8_t SRC_CS = 10;   // CS carte source&lt;br /&gt;
const uint8_t DST_CS = 9;    // CS carte destination&lt;br /&gt;
&lt;br /&gt;
const size_t COPY_BUFFER_SIZE = 32;&lt;br /&gt;
uint8_t copyBuffer[COPY_BUFFER_SIZE];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SdFs sdSrc;&lt;br /&gt;
SdFs sdDst;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bool joinPath(const char* parent, const char* name, char* out, size_t outSize) {&lt;br /&gt;
  int written;&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(parent, &amp;quot;/&amp;quot;) == 0) {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;/%s&amp;quot;, name);&lt;br /&gt;
  } else {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;%s/%s&amp;quot;, parent, name);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return (written &amp;gt; 0 &amp;amp;&amp;amp; (size_t)written &amp;lt; outSize);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyFile(const char* path) {&lt;br /&gt;
  FsFile srcFile = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!srcFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile dstFile = sdDst.open(path, O_WRONLY | O_CREAT | O_TRUNC);&lt;br /&gt;
  if (!dstFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture destination : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    srcFile.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;Copie fichier : &amp;quot;);&lt;br /&gt;
  Serial.println(path);&lt;br /&gt;
&lt;br /&gt;
  while (true) {&lt;br /&gt;
    int32_t n = srcFile.read(copyBuffer, sizeof(copyBuffer));&lt;br /&gt;
&lt;br /&gt;
    if (n &amp;lt; 0) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur lecture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (n == 0) {&lt;br /&gt;
      break; // fin du fichier&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (dstFile.write(copyBuffer, n) != n) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur ecriture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  srcFile.close();&lt;br /&gt;
  dstFile.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyDirectory(const char* path) {&lt;br /&gt;
  FsFile dir = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!dir || !dir.isDir()) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture dossier source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    dir.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(path, &amp;quot;/&amp;quot;) != 0) {&lt;br /&gt;
    if (!sdDst.exists(path)) {&lt;br /&gt;
      if (!sdDst.mkdir(path, true)) {&lt;br /&gt;
        Serial.print(&amp;quot;Erreur creation dossier destination : &amp;quot;);&lt;br /&gt;
        Serial.println(path);&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile entry;&lt;br /&gt;
&lt;br /&gt;
  while (entry.openNext(&amp;amp;dir, O_RDONLY)) {&lt;br /&gt;
    char name[64];&lt;br /&gt;
    char childPath[128];&lt;br /&gt;
&lt;br /&gt;
    if (!entry.getName(name, sizeof(name))) {&lt;br /&gt;
      Serial.println(&amp;quot;Nom de fichier trop long ou erreur getName&amp;quot;);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      dir.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (strcmp(name, &amp;quot;.&amp;quot;) == 0 || strcmp(name, &amp;quot;..&amp;quot;) == 0) {&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!joinPath(path, name, childPath, sizeof(childPath))) {&lt;br /&gt;
      Serial.print(&amp;quot;Chemin trop long, ignore : &amp;quot;);&lt;br /&gt;
      Serial.println(name);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    bool isDir = entry.isDir();&lt;br /&gt;
    entry.close();&lt;br /&gt;
&lt;br /&gt;
    if (isDir) {&lt;br /&gt;
      Serial.print(&amp;quot;Entre dans dossier : &amp;quot;);&lt;br /&gt;
      Serial.println(childPath);&lt;br /&gt;
&lt;br /&gt;
      if (!copyDirectory(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      if (!copyFile(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  dir.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while (!Serial) {&lt;br /&gt;
    ;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  Serial.println(&amp;quot;=== Debut copie SD -&amp;gt; SD ===&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  //Met les 2 à l'état haut par défaut&lt;br /&gt;
  pinMode(SRC_CS, OUTPUT);&lt;br /&gt;
  pinMode(DST_CS, OUTPUT);&lt;br /&gt;
  digitalWrite(SRC_CS, HIGH);&lt;br /&gt;
  digitalWrite(DST_CS, HIGH);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte source&lt;br /&gt;
  if (!sdSrc.begin(SdSpiConfig(SRC_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte SOURCE&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte SOURCE OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte destination&lt;br /&gt;
  if (!sdDst.begin(SdSpiConfig(DST_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte DESTINATION&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte DESTINATION OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Lancement de la copie...&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if (copyDirectory(&amp;quot;/&amp;quot;)) {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie terminee avec succes ===&amp;quot;);&lt;br /&gt;
  } else {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie arretee sur erreur ===&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Version du 27/05 :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;include &amp;lt;SdFat.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const uint8_t SRC_CS = 10;  // CS carte source&lt;br /&gt;
&lt;br /&gt;
const uint8_t DST_CS = 9;   // CS carte destination&lt;br /&gt;
&lt;br /&gt;
const size_t COPY_BUFFER_SIZE = 32;&lt;br /&gt;
&lt;br /&gt;
uint8_t copyBuffer[COPY_BUFFER_SIZE];&lt;br /&gt;
&lt;br /&gt;
// SdFat est plus leger que SdFs sur Arduino Nano.&lt;br /&gt;
&lt;br /&gt;
// Cette version vise FAT/FAT32.&lt;br /&gt;
&lt;br /&gt;
SdFat sdSrc;&lt;br /&gt;
&lt;br /&gt;
SdFat sdDst;&lt;br /&gt;
&lt;br /&gt;
bool joinPath(const char* parent, const char* name, char* out, size_t outSize) {&lt;br /&gt;
&lt;br /&gt;
  int written;&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(parent, &amp;quot;/&amp;quot;) == 0) {&lt;br /&gt;
&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;/%s&amp;quot;, name);&lt;br /&gt;
&lt;br /&gt;
  } else {&lt;br /&gt;
&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;%s/%s&amp;quot;, parent, name);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return (written &amp;gt; 0 &amp;amp;&amp;amp; (size_t)written &amp;lt; outSize);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyFile(const char* path) {&lt;br /&gt;
&lt;br /&gt;
  File srcFile = sdSrc.open(path, FILE_READ);&lt;br /&gt;
&lt;br /&gt;
  if (!srcFile) {&lt;br /&gt;
&lt;br /&gt;
    Serial.print(F(&amp;quot;Erreur ouverture source : &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
&lt;br /&gt;
    return false;&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // O_TRUNC est important : il vide le fichier destination avant d'ecrire.&lt;br /&gt;
&lt;br /&gt;
  // Sans ca, chaque reset peut ajouter le texte a la fin du fichier.&lt;br /&gt;
&lt;br /&gt;
  File dstFile = sdDst.open(path, O_WRITE | O_CREAT | O_TRUNC);&lt;br /&gt;
&lt;br /&gt;
  if (!dstFile) {&lt;br /&gt;
&lt;br /&gt;
    Serial.print(F(&amp;quot;Erreur ouverture destination : &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
&lt;br /&gt;
    srcFile.close();&lt;br /&gt;
&lt;br /&gt;
    return false;&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.print(F(&amp;quot;Copie fichier : &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
  Serial.println(path);&lt;br /&gt;
&lt;br /&gt;
  while (true) {&lt;br /&gt;
&lt;br /&gt;
    int n = srcFile.read(copyBuffer, sizeof(copyBuffer));&lt;br /&gt;
&lt;br /&gt;
    if (n &amp;lt; 0) {&lt;br /&gt;
&lt;br /&gt;
      Serial.print(F(&amp;quot;Erreur lecture : &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
&lt;br /&gt;
      return false;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (n == 0) {&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (dstFile.write(copyBuffer, n) != n) {&lt;br /&gt;
&lt;br /&gt;
      Serial.print(F(&amp;quot;Erreur ecriture : &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
&lt;br /&gt;
      return false;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_BUILTIN, HIGH);&lt;br /&gt;
&lt;br /&gt;
    delay(20);&lt;br /&gt;
&lt;br /&gt;
    digitalWrite(LED_BUILTIN, LOW);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  srcFile.close();&lt;br /&gt;
&lt;br /&gt;
  dstFile.close();&lt;br /&gt;
&lt;br /&gt;
  return true;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyDirectory(const char* path) {&lt;br /&gt;
&lt;br /&gt;
  File dir = sdSrc.open(path, FILE_READ);&lt;br /&gt;
&lt;br /&gt;
  if (!dir || !dir.isDir()) {&lt;br /&gt;
&lt;br /&gt;
    Serial.print(F(&amp;quot;Erreur ouverture dossier source : &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
&lt;br /&gt;
    dir.close();&lt;br /&gt;
&lt;br /&gt;
    return false;&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(path, &amp;quot;/&amp;quot;) != 0) {&lt;br /&gt;
&lt;br /&gt;
    if (!sdDst.exists(path)) {&lt;br /&gt;
&lt;br /&gt;
      if (!sdDst.mkdir(path)) {&lt;br /&gt;
&lt;br /&gt;
        Serial.print(F(&amp;quot;Erreur creation dossier destination : &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
        Serial.println(path);&lt;br /&gt;
&lt;br /&gt;
        dir.close();&lt;br /&gt;
&lt;br /&gt;
        return false;&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  File entry;&lt;br /&gt;
&lt;br /&gt;
  while (entry.openNext(&amp;amp;dir, O_RDONLY)) {&lt;br /&gt;
&lt;br /&gt;
    char name[32];&lt;br /&gt;
&lt;br /&gt;
    char childPath[80];&lt;br /&gt;
&lt;br /&gt;
    if (!entry.getName(name, sizeof(name))) {&lt;br /&gt;
&lt;br /&gt;
      Serial.println(F(&amp;quot;Erreur nom fichier&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
      entry.close();&lt;br /&gt;
&lt;br /&gt;
      dir.close();&lt;br /&gt;
&lt;br /&gt;
      return false;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (strcmp(name, &amp;quot;System Volume Information&amp;quot;) == 0) {&lt;br /&gt;
&lt;br /&gt;
      entry.close();&lt;br /&gt;
&lt;br /&gt;
      continue;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!joinPath(path, name, childPath, sizeof(childPath))) {&lt;br /&gt;
&lt;br /&gt;
      Serial.print(F(&amp;quot;Chemin trop long : &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
      Serial.println(name);&lt;br /&gt;
&lt;br /&gt;
      entry.close();&lt;br /&gt;
&lt;br /&gt;
      continue;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    bool isDir = entry.isDir();&lt;br /&gt;
&lt;br /&gt;
    entry.close();&lt;br /&gt;
&lt;br /&gt;
    if (isDir) {&lt;br /&gt;
&lt;br /&gt;
      Serial.print(F(&amp;quot;Dossier : &amp;quot;));&lt;br /&gt;
&lt;br /&gt;
      Serial.println(childPath);&lt;br /&gt;
&lt;br /&gt;
      if (!copyDirectory(childPath)) {&lt;br /&gt;
&lt;br /&gt;
        dir.close();&lt;br /&gt;
&lt;br /&gt;
        return false;&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
&lt;br /&gt;
      if (!copyFile(childPath)) {&lt;br /&gt;
&lt;br /&gt;
        dir.close();&lt;br /&gt;
&lt;br /&gt;
        return false;&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  dir.close();&lt;br /&gt;
&lt;br /&gt;
  return true;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  pinMode(LED_BUILTIN, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(LED_BUILTIN, LOW);&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
&lt;br /&gt;
  delay(1000);&lt;br /&gt;
&lt;br /&gt;
  Serial.println();&lt;br /&gt;
&lt;br /&gt;
  Serial.println(F(&amp;quot;=== Debut copie SD -&amp;gt; SD ===&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
  pinMode(SRC_CS, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(DST_CS, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(SRC_CS, HIGH);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(DST_CS, HIGH);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(F(&amp;quot;Init source&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
  if (!sdSrc.begin(SRC_CS, SD_SCK_MHZ(1))) {&lt;br /&gt;
&lt;br /&gt;
    Serial.println(F(&amp;quot;Echec init carte SOURCE&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println(F(&amp;quot;Carte SOURCE OK&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
  Serial.println(F(&amp;quot;Init destination&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
  if (!sdDst.begin(DST_CS, SD_SCK_MHZ(1))) {&lt;br /&gt;
&lt;br /&gt;
    Serial.println(F(&amp;quot;Echec init carte DESTINATION&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println(F(&amp;quot;Carte DESTINATION OK&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
  Serial.println(F(&amp;quot;Lancement copie&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
  if (copyDirectory(&amp;quot;/&amp;quot;)) {&lt;br /&gt;
&lt;br /&gt;
    Serial.println(F(&amp;quot;=== Copie terminee ===&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
  } else {&lt;br /&gt;
&lt;br /&gt;
    Serial.println(F(&amp;quot;=== Copie arretee ===&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12995</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12995"/>
		<updated>2026-04-28T10:55:07Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : /* 15/03 -&amp;gt; 18/03 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Etapes clés du projet :&lt;br /&gt;
&lt;br /&gt;
'''HARDWARE :'''&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
'''SOFTWARE :'''&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs bloc.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
===  Informations en vrac : ===&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD &lt;br /&gt;
&lt;br /&gt;
https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
[[Fichier:Photo1.png|centré|634x634px]].&lt;br /&gt;
&lt;br /&gt;
=== HARDWARE : ===&lt;br /&gt;
&lt;br /&gt;
===== '''''06/03/26:''''' =====&lt;br /&gt;
- Ebauche du schéma électrique &lt;br /&gt;
&lt;br /&gt;
* ajout des symboles des principaux composants (Arduino Nano, Lecteurs micro SD)&lt;br /&gt;
* étiquettes des liaisons principales.&lt;br /&gt;
&lt;br /&gt;
- Création d'un Git sur Gitea pour futur dépot de l'avancement du projet&lt;br /&gt;
[[Fichier:Capture_d’écran_n1_kicad.png|centré|633x633px|V1 schéma électrique]]&lt;br /&gt;
&lt;br /&gt;
=====  '''''15/03 -&amp;gt; 18/03''''' =====&lt;br /&gt;
- Schema électrique   &lt;br /&gt;
&lt;br /&gt;
* Ajout des résistances et des capacités nécessaires.&lt;br /&gt;
* Adaptation des alimentations en 3V3 des composants.&lt;br /&gt;
* Vérification et correction de la première version&lt;br /&gt;
&lt;br /&gt;
- démarrage du routage PCB et ajout des empreintes sur les composants.  &lt;br /&gt;
[[Fichier:V2 Schéma élec.png|centré|sans_cadre|639x639px|version 2 Schéma Electrique]].&lt;br /&gt;
&lt;br /&gt;
===== '''Schéma électrique Final :''' =====&lt;br /&gt;
(insérer capture d'écran)        &lt;br /&gt;
&lt;br /&gt;
.        &lt;br /&gt;
&lt;br /&gt;
===== '''PCB Final :''' =====&lt;br /&gt;
* Minimisation des dimensions de la carte. Carte la plus compacte possible.&lt;br /&gt;
* Masse GND en double face&lt;br /&gt;
* Double face, passage de certaines pistes en dessous en utilisant des via.&lt;br /&gt;
* Passage du 3V3 en couche inférieure (recommandé par M. Redon).&lt;br /&gt;
* Piste 3V3 plus épaisse que les pistes classique (4mm)&lt;br /&gt;
* Ajout de plusieurs Via sur le plan de masse afin de bien connecter les deux couches.&lt;br /&gt;
&lt;br /&gt;
''Difficultés rencontrées :'' &lt;br /&gt;
&lt;br /&gt;
* Connecter les deux lecteurs micro SD ensemble était compliqué, car les pin étaient inversée les unes par rapport aux autres (en miroir). Donc toutes les pistes se croisaient.&lt;br /&gt;
* Réussir à connecter le GND partout était difficile, en raison de zones isolées qui se créaient (solutionné par le passage en couche inférieur du 3V3).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture_d’écran_ec4.png|centré|sans_cadre|553x553px]]&lt;br /&gt;
&lt;br /&gt;
Carte envoyée en impression en même temps que les projets PSE (13/04).&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
===  '''SOFTWARE :''' ===&lt;br /&gt;
&lt;br /&gt;
===== (13/04 -&amp;gt; 18/04) =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Actuellement, mon programme ne réalise pas encore la copie complète bloc par bloc de toute la micro-SD comme demandé dans l’objectif final.&lt;br /&gt;
&lt;br /&gt;
Pour l’instant, j’ai développé une première version qui fonctionne au niveau du système de fichiers : le programme initialise deux cartes micro-SD sur le même bus SPI avec deux broches CS différentes, puis parcourt la carte source afin de copier les dossiers et les fichiers vers la carte destination. &lt;br /&gt;
&lt;br /&gt;
La copie se fait fichier par fichier, en lisant une petite quantité de données en mémoire grâce à un buffer, puis en l’écrivant sur la deuxième carte. Cette version m’a surtout permis de mettre en place la logique générale du projet. C'est à dire : &lt;br /&gt;
&lt;br /&gt;
- initialisation des deux cartes&lt;br /&gt;
&lt;br /&gt;
- distinction entre la source et la destination&lt;br /&gt;
&lt;br /&gt;
- parcours récursif des dossiers, reconstruction des chemins de fichiers&lt;br /&gt;
&lt;br /&gt;
- gestion des erreurs d’ouverture, de lecture et d’écriture&lt;br /&gt;
&lt;br /&gt;
- affichage d’informations avec &amp;lt;code&amp;gt;Serial.print()&amp;lt;/code&amp;gt; pour préparer le débogage. &lt;br /&gt;
&lt;br /&gt;
Il reste donc à adapter le programme pour respecter exactement le cahier des charges final, c’est-à-dire effectuer une copie brute bloc par bloc de la première carte vers la seconde, ajouter l’indication par la LED Arduino après chaque bloc copié avec succès. Peut être prévoir un code d’erreur par LED en cas de problème si j'ai encore du temps.&lt;br /&gt;
&lt;br /&gt;
===== Problèmes rencontrés : =====&lt;br /&gt;
Pendant l'écriture du programme, j’ai rencontré quelques problèmes techniques liés principalement aux contraintes matérielles et à la gestion des fichiers.&lt;br /&gt;
&lt;br /&gt;
Le premier problème important concernait la gestion de la mémoire de l’Arduino. Au départ, j’avais défini un buffer de copie assez grand pour améliorer la vitesse de transfert. Cependant, lors de la compilation, j’obtenais une erreur indiquant que la mémoire disponible était dépassée (“data section exceeds available space in board”).&lt;br /&gt;
&lt;br /&gt;
Grâce à mes recherches, j’ai compris que la combinaison de la bibliothèque SdFat, des variables globales et du buffer dépassait la RAM disponibles sur l’arduino. Du coup, j’ai progressivement réduit la taille du buffer (jusqu’à 32 octets), ce qui a permis de faire rentrer le programme en mémoire, au prix d’une vitesse de copie plus faible.&lt;br /&gt;
&lt;br /&gt;
J’ai eu un problème de gestion des chemins de fichiers lors de la copie. En effet, pour parcourir récursivement les dossiers, il était nécessaire de reconstruire correctement les chemins complets. La fonction joinPath a permit d'eviter les erreurs liées à la taille des buffers. J’ai intégré des vérifications supplémentaires pour gérer les cas d’erreur potentiels (échec d’ouverture de fichier, chemin trop long, erreur de lecture/écriture), afin d'être plus sur du programme même avant le test sur matériel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme je ne peux pas encore tester physiquement les cartes, j’ai ajouté des messages Serial.print() pour que, lors du premier test matériel, je puisse identifier rapidement où le programme bloque.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enfin, j’ai rencontré des obstacles liées à la limitation matérielle de l’Arduino, notamment en termes de mémoire et de gestion simultanée de deux cartes SD sur le même bus SPI. Cela m’a obligé à optimiser le code et à bien comprendre l'utilisation de deux broches CS distinctes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vous trouverez la version actuelle de mon programme dans les Documents Rendus et sur le Git.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Git : https://gitea.plil.fr/lkachour/EC4.git&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SdFat.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const uint8_t SRC_CS = 10;   // CS carte source&lt;br /&gt;
const uint8_t DST_CS = 9;    // CS carte destination&lt;br /&gt;
&lt;br /&gt;
const size_t COPY_BUFFER_SIZE = 32;&lt;br /&gt;
uint8_t copyBuffer[COPY_BUFFER_SIZE];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SdFs sdSrc;&lt;br /&gt;
SdFs sdDst;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bool joinPath(const char* parent, const char* name, char* out, size_t outSize) {&lt;br /&gt;
  int written;&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(parent, &amp;quot;/&amp;quot;) == 0) {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;/%s&amp;quot;, name);&lt;br /&gt;
  } else {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;%s/%s&amp;quot;, parent, name);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return (written &amp;gt; 0 &amp;amp;&amp;amp; (size_t)written &amp;lt; outSize);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyFile(const char* path) {&lt;br /&gt;
  FsFile srcFile = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!srcFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile dstFile = sdDst.open(path, O_WRONLY | O_CREAT | O_TRUNC);&lt;br /&gt;
  if (!dstFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture destination : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    srcFile.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;Copie fichier : &amp;quot;);&lt;br /&gt;
  Serial.println(path);&lt;br /&gt;
&lt;br /&gt;
  while (true) {&lt;br /&gt;
    int32_t n = srcFile.read(copyBuffer, sizeof(copyBuffer));&lt;br /&gt;
&lt;br /&gt;
    if (n &amp;lt; 0) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur lecture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (n == 0) {&lt;br /&gt;
      break; // fin du fichier&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (dstFile.write(copyBuffer, n) != n) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur ecriture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  srcFile.close();&lt;br /&gt;
  dstFile.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyDirectory(const char* path) {&lt;br /&gt;
  FsFile dir = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!dir || !dir.isDir()) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture dossier source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    dir.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(path, &amp;quot;/&amp;quot;) != 0) {&lt;br /&gt;
    if (!sdDst.exists(path)) {&lt;br /&gt;
      if (!sdDst.mkdir(path, true)) {&lt;br /&gt;
        Serial.print(&amp;quot;Erreur creation dossier destination : &amp;quot;);&lt;br /&gt;
        Serial.println(path);&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile entry;&lt;br /&gt;
&lt;br /&gt;
  while (entry.openNext(&amp;amp;dir, O_RDONLY)) {&lt;br /&gt;
    char name[64];&lt;br /&gt;
    char childPath[128];&lt;br /&gt;
&lt;br /&gt;
    if (!entry.getName(name, sizeof(name))) {&lt;br /&gt;
      Serial.println(&amp;quot;Nom de fichier trop long ou erreur getName&amp;quot;);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      dir.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (strcmp(name, &amp;quot;.&amp;quot;) == 0 || strcmp(name, &amp;quot;..&amp;quot;) == 0) {&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!joinPath(path, name, childPath, sizeof(childPath))) {&lt;br /&gt;
      Serial.print(&amp;quot;Chemin trop long, ignore : &amp;quot;);&lt;br /&gt;
      Serial.println(name);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    bool isDir = entry.isDir();&lt;br /&gt;
    entry.close();&lt;br /&gt;
&lt;br /&gt;
    if (isDir) {&lt;br /&gt;
      Serial.print(&amp;quot;Entre dans dossier : &amp;quot;);&lt;br /&gt;
      Serial.println(childPath);&lt;br /&gt;
&lt;br /&gt;
      if (!copyDirectory(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      if (!copyFile(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  dir.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while (!Serial) {&lt;br /&gt;
    ;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  Serial.println(&amp;quot;=== Debut copie SD -&amp;gt; SD ===&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  //Met les 2 à l'état haut par défaut&lt;br /&gt;
  pinMode(SRC_CS, OUTPUT);&lt;br /&gt;
  pinMode(DST_CS, OUTPUT);&lt;br /&gt;
  digitalWrite(SRC_CS, HIGH);&lt;br /&gt;
  digitalWrite(DST_CS, HIGH);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte source&lt;br /&gt;
  if (!sdSrc.begin(SdSpiConfig(SRC_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte SOURCE&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte SOURCE OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte destination&lt;br /&gt;
  if (!sdDst.begin(SdSpiConfig(DST_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte DESTINATION&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte DESTINATION OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Lancement de la copie...&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if (copyDirectory(&amp;quot;/&amp;quot;)) {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie terminee avec succes ===&amp;quot;);&lt;br /&gt;
  } else {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie arretee sur erreur ===&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12994</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12994"/>
		<updated>2026-04-28T10:25:39Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : /* SOFTWARE : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Etapes clés du projet :&lt;br /&gt;
&lt;br /&gt;
'''HARDWARE :'''&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
'''SOFTWARE :'''&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs bloc.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
===  Informations en vrac : ===&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD &lt;br /&gt;
&lt;br /&gt;
https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
[[Fichier:Photo1.png|centré|634x634px]].&lt;br /&gt;
&lt;br /&gt;
=== HARDWARE : ===&lt;br /&gt;
&lt;br /&gt;
===== '''''06/03/26:''''' =====&lt;br /&gt;
- Ebauche du schéma électrique &lt;br /&gt;
&lt;br /&gt;
* ajout des symboles des principaux composants (Arduino Nano, Lecteurs micro SD)&lt;br /&gt;
* étiquettes des liaisons principales.&lt;br /&gt;
&lt;br /&gt;
- Création d'un Git sur Gitea pour futur dépot de l'avancement du projet&lt;br /&gt;
[[Fichier:Capture_d’écran_n1_kicad.png|centré|633x633px|V1 schéma électrique]]&lt;br /&gt;
&lt;br /&gt;
=====  '''''15/03 -&amp;gt; 18/03''''' =====&lt;br /&gt;
- Schema électrique   &lt;br /&gt;
&lt;br /&gt;
* Ajout des résistances et des capacités nécessaires.&lt;br /&gt;
* Adaptation des alimentations en 3V3 des composants.&lt;br /&gt;
* Vérification et correction de la première version&lt;br /&gt;
&lt;br /&gt;
- démarrage du routage PCB et ajout des empreintes sur les composants.  &lt;br /&gt;
[[Fichier:V2 Schéma élec.png|centré|sans_cadre|639x639px|version 2 Schéma Electrique]].&lt;br /&gt;
&lt;br /&gt;
===== '''- Schéma électrique Final :''' =====&lt;br /&gt;
(insérer capture d'écran)        &lt;br /&gt;
&lt;br /&gt;
.        &lt;br /&gt;
&lt;br /&gt;
===== '''- PCB Final :''' =====&lt;br /&gt;
* Minimisation des dimensions de la carte. Carte la plus compacte possible.&lt;br /&gt;
* Masse GND en double face&lt;br /&gt;
* Double face, passage de certaines pistes en dessous en utilisant des via.&lt;br /&gt;
* Passage du 3V3 en couche inférieure (recommandé par M. Redon).&lt;br /&gt;
* Piste 3V3 plus épaisse que les pistes classique (4mm)&lt;br /&gt;
* Ajout de plusieurs Via sur le plan de masse afin de bien connecter les deux couches.&lt;br /&gt;
&lt;br /&gt;
''Difficultés rencontrées :'' &lt;br /&gt;
&lt;br /&gt;
* Connecter les deux lecteurs micro SD ensemble était compliqué, car les pin étaient inversée les unes par rapport aux autres (en miroir). Donc toutes les pistes se croisaient.&lt;br /&gt;
* Réussir à connecter le GND partout était difficile, en raison de zones isolées qui se créaient (solutionné par le passage en couche inférieur du 3V3).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture_d’écran_ec4.png|centré|sans_cadre|553x553px]]&lt;br /&gt;
&lt;br /&gt;
Carte envoyée en impression en même temps que les projets PSE (13/04).&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
===  '''SOFTWARE :''' ===&lt;br /&gt;
&lt;br /&gt;
===== (13/04 -&amp;gt; 18/04) =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Actuellement, mon programme ne réalise pas encore la copie complète bloc par bloc de toute la micro-SD comme demandé dans l’objectif final.&lt;br /&gt;
&lt;br /&gt;
Pour l’instant, j’ai développé une première version qui fonctionne au niveau du système de fichiers : le programme initialise deux cartes micro-SD sur le même bus SPI avec deux broches CS différentes, puis parcourt la carte source afin de copier les dossiers et les fichiers vers la carte destination. &lt;br /&gt;
&lt;br /&gt;
La copie se fait fichier par fichier, en lisant une petite quantité de données en mémoire grâce à un buffer, puis en l’écrivant sur la deuxième carte. Cette version m’a surtout permis de mettre en place la logique générale du projet. C'est à dire : &lt;br /&gt;
&lt;br /&gt;
- initialisation des deux cartes&lt;br /&gt;
&lt;br /&gt;
- distinction entre la source et la destination&lt;br /&gt;
&lt;br /&gt;
- parcours récursif des dossiers, reconstruction des chemins de fichiers&lt;br /&gt;
&lt;br /&gt;
- gestion des erreurs d’ouverture, de lecture et d’écriture&lt;br /&gt;
&lt;br /&gt;
- affichage d’informations avec &amp;lt;code&amp;gt;Serial.print()&amp;lt;/code&amp;gt; pour préparer le débogage. &lt;br /&gt;
&lt;br /&gt;
Il reste donc à adapter le programme pour respecter exactement le cahier des charges final, c’est-à-dire effectuer une copie brute bloc par bloc de la première carte vers la seconde, ajouter l’indication par la LED Arduino après chaque bloc copié avec succès. Peut être prévoir un code d’erreur par LED en cas de problème si j'ai encore du temps.&lt;br /&gt;
&lt;br /&gt;
===== Problèmes rencontrés : =====&lt;br /&gt;
Pendant l'écriture du programme, j’ai rencontré quelques problèmes techniques liés principalement aux contraintes matérielles et à la gestion des fichiers.&lt;br /&gt;
&lt;br /&gt;
Le premier problème important concernait la gestion de la mémoire de l’Arduino. Au départ, j’avais défini un buffer de copie assez grand pour améliorer la vitesse de transfert. Cependant, lors de la compilation, j’obtenais une erreur indiquant que la mémoire disponible était dépassée (“data section exceeds available space in board”).&lt;br /&gt;
&lt;br /&gt;
Grâce à mes recherches, j’ai compris que la combinaison de la bibliothèque SdFat, des variables globales et du buffer dépassait la RAM disponibles sur l’arduino. Du coup, j’ai progressivement réduit la taille du buffer (jusqu’à 32 octets), ce qui a permis de faire rentrer le programme en mémoire, au prix d’une vitesse de copie plus faible.&lt;br /&gt;
&lt;br /&gt;
J’ai eu un problème de gestion des chemins de fichiers lors de la copie. En effet, pour parcourir récursivement les dossiers, il était nécessaire de reconstruire correctement les chemins complets. La fonction joinPath a permit d'eviter les erreurs liées à la taille des buffers. J’ai intégré des vérifications supplémentaires pour gérer les cas d’erreur potentiels (échec d’ouverture de fichier, chemin trop long, erreur de lecture/écriture), afin d'être plus sur du programme même avant le test sur matériel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme je ne peux pas encore tester physiquement les cartes, j’ai ajouté des messages Serial.print() pour que, lors du premier test matériel, je puisse identifier rapidement où le programme bloque.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enfin, j’ai rencontré des obstacles liées à la limitation matérielle de l’Arduino, notamment en termes de mémoire et de gestion simultanée de deux cartes SD sur le même bus SPI. Cela m’a obligé à optimiser le code et à bien comprendre l'utilisation de deux broches CS distinctes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vous trouverez la version actuelle de mon programme dans les Documents Rendus et sur le Git.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Git : https://gitea.plil.fr/lkachour/EC4.git&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SdFat.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const uint8_t SRC_CS = 10;   // CS carte source&lt;br /&gt;
const uint8_t DST_CS = 9;    // CS carte destination&lt;br /&gt;
&lt;br /&gt;
const size_t COPY_BUFFER_SIZE = 32;&lt;br /&gt;
uint8_t copyBuffer[COPY_BUFFER_SIZE];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SdFs sdSrc;&lt;br /&gt;
SdFs sdDst;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bool joinPath(const char* parent, const char* name, char* out, size_t outSize) {&lt;br /&gt;
  int written;&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(parent, &amp;quot;/&amp;quot;) == 0) {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;/%s&amp;quot;, name);&lt;br /&gt;
  } else {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;%s/%s&amp;quot;, parent, name);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return (written &amp;gt; 0 &amp;amp;&amp;amp; (size_t)written &amp;lt; outSize);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyFile(const char* path) {&lt;br /&gt;
  FsFile srcFile = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!srcFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile dstFile = sdDst.open(path, O_WRONLY | O_CREAT | O_TRUNC);&lt;br /&gt;
  if (!dstFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture destination : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    srcFile.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;Copie fichier : &amp;quot;);&lt;br /&gt;
  Serial.println(path);&lt;br /&gt;
&lt;br /&gt;
  while (true) {&lt;br /&gt;
    int32_t n = srcFile.read(copyBuffer, sizeof(copyBuffer));&lt;br /&gt;
&lt;br /&gt;
    if (n &amp;lt; 0) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur lecture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (n == 0) {&lt;br /&gt;
      break; // fin du fichier&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (dstFile.write(copyBuffer, n) != n) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur ecriture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  srcFile.close();&lt;br /&gt;
  dstFile.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyDirectory(const char* path) {&lt;br /&gt;
  FsFile dir = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!dir || !dir.isDir()) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture dossier source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    dir.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(path, &amp;quot;/&amp;quot;) != 0) {&lt;br /&gt;
    if (!sdDst.exists(path)) {&lt;br /&gt;
      if (!sdDst.mkdir(path, true)) {&lt;br /&gt;
        Serial.print(&amp;quot;Erreur creation dossier destination : &amp;quot;);&lt;br /&gt;
        Serial.println(path);&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile entry;&lt;br /&gt;
&lt;br /&gt;
  while (entry.openNext(&amp;amp;dir, O_RDONLY)) {&lt;br /&gt;
    char name[64];&lt;br /&gt;
    char childPath[128];&lt;br /&gt;
&lt;br /&gt;
    if (!entry.getName(name, sizeof(name))) {&lt;br /&gt;
      Serial.println(&amp;quot;Nom de fichier trop long ou erreur getName&amp;quot;);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      dir.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (strcmp(name, &amp;quot;.&amp;quot;) == 0 || strcmp(name, &amp;quot;..&amp;quot;) == 0) {&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!joinPath(path, name, childPath, sizeof(childPath))) {&lt;br /&gt;
      Serial.print(&amp;quot;Chemin trop long, ignore : &amp;quot;);&lt;br /&gt;
      Serial.println(name);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    bool isDir = entry.isDir();&lt;br /&gt;
    entry.close();&lt;br /&gt;
&lt;br /&gt;
    if (isDir) {&lt;br /&gt;
      Serial.print(&amp;quot;Entre dans dossier : &amp;quot;);&lt;br /&gt;
      Serial.println(childPath);&lt;br /&gt;
&lt;br /&gt;
      if (!copyDirectory(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      if (!copyFile(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  dir.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while (!Serial) {&lt;br /&gt;
    ;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  Serial.println(&amp;quot;=== Debut copie SD -&amp;gt; SD ===&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  //Met les 2 à l'état haut par défaut&lt;br /&gt;
  pinMode(SRC_CS, OUTPUT);&lt;br /&gt;
  pinMode(DST_CS, OUTPUT);&lt;br /&gt;
  digitalWrite(SRC_CS, HIGH);&lt;br /&gt;
  digitalWrite(DST_CS, HIGH);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte source&lt;br /&gt;
  if (!sdSrc.begin(SdSpiConfig(SRC_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte SOURCE&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte SOURCE OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte destination&lt;br /&gt;
  if (!sdDst.begin(SdSpiConfig(DST_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte DESTINATION&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte DESTINATION OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Lancement de la copie...&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if (copyDirectory(&amp;quot;/&amp;quot;)) {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie terminee avec succes ===&amp;quot;);&lt;br /&gt;
  } else {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie arretee sur erreur ===&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12993</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12993"/>
		<updated>2026-04-28T10:24:50Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : /* SOFTWARE : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Etapes clés du projet :&lt;br /&gt;
&lt;br /&gt;
'''HARDWARE :'''&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
'''SOFTWARE :'''&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs bloc.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
===  Informations en vrac : ===&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD &lt;br /&gt;
&lt;br /&gt;
https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
[[Fichier:Photo1.png|centré|634x634px]].&lt;br /&gt;
&lt;br /&gt;
=== HARDWARE : ===&lt;br /&gt;
&lt;br /&gt;
===== '''''06/03/26:''''' =====&lt;br /&gt;
- Ebauche du schéma électrique &lt;br /&gt;
&lt;br /&gt;
* ajout des symboles des principaux composants (Arduino Nano, Lecteurs micro SD)&lt;br /&gt;
* étiquettes des liaisons principales.&lt;br /&gt;
&lt;br /&gt;
- Création d'un Git sur Gitea pour futur dépot de l'avancement du projet&lt;br /&gt;
[[Fichier:Capture_d’écran_n1_kicad.png|centré|633x633px|V1 schéma électrique]]&lt;br /&gt;
&lt;br /&gt;
=====  '''''15/03 -&amp;gt; 18/03''''' =====&lt;br /&gt;
- Schema électrique   &lt;br /&gt;
&lt;br /&gt;
* Ajout des résistances et des capacités nécessaires.&lt;br /&gt;
* Adaptation des alimentations en 3V3 des composants.&lt;br /&gt;
* Vérification et correction de la première version&lt;br /&gt;
&lt;br /&gt;
- démarrage du routage PCB et ajout des empreintes sur les composants.  &lt;br /&gt;
[[Fichier:V2 Schéma élec.png|centré|sans_cadre|639x639px|version 2 Schéma Electrique]].&lt;br /&gt;
&lt;br /&gt;
===== '''- Schéma électrique Final :''' =====&lt;br /&gt;
(insérer capture d'écran)        &lt;br /&gt;
&lt;br /&gt;
.        &lt;br /&gt;
&lt;br /&gt;
===== '''- PCB Final :''' =====&lt;br /&gt;
* Minimisation des dimensions de la carte. Carte la plus compacte possible.&lt;br /&gt;
* Masse GND en double face&lt;br /&gt;
* Double face, passage de certaines pistes en dessous en utilisant des via.&lt;br /&gt;
* Passage du 3V3 en couche inférieure (recommandé par M. Redon).&lt;br /&gt;
* Piste 3V3 plus épaisse que les pistes classique (4mm)&lt;br /&gt;
* Ajout de plusieurs Via sur le plan de masse afin de bien connecter les deux couches.&lt;br /&gt;
&lt;br /&gt;
''Difficultés rencontrées :'' &lt;br /&gt;
&lt;br /&gt;
* Connecter les deux lecteurs micro SD ensemble était compliqué, car les pin étaient inversée les unes par rapport aux autres (en miroir). Donc toutes les pistes se croisaient.&lt;br /&gt;
* Réussir à connecter le GND partout était difficile, en raison de zones isolées qui se créaient (solutionné par le passage en couche inférieur du 3V3).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture_d’écran_ec4.png|centré|sans_cadre|553x553px]]&lt;br /&gt;
&lt;br /&gt;
Carte envoyée en impression en même temps que les projets PSE (13/04).&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
===  '''SOFTWARE :''' ===&lt;br /&gt;
&lt;br /&gt;
===== (13/04 -&amp;gt; 18/04) =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Actuellement, mon programme ne réalise pas encore la copie complète bloc par bloc de toute la micro-SD comme demandé dans l’objectif final.&lt;br /&gt;
&lt;br /&gt;
Pour l’instant, j’ai développé une première version qui fonctionne au niveau du système de fichiers : le programme initialise deux cartes micro-SD sur le même bus SPI avec deux broches CS différentes, puis parcourt la carte source afin de copier les dossiers et les fichiers vers la carte destination. &lt;br /&gt;
&lt;br /&gt;
La copie se fait fichier par fichier, en lisant une petite quantité de données en mémoire grâce à un buffer, puis en l’écrivant sur la deuxième carte. Cette version m’a surtout permis de mettre en place la logique générale du projet. C'est à dire : &lt;br /&gt;
&lt;br /&gt;
- initialisation des deux cartes&lt;br /&gt;
&lt;br /&gt;
- distinction entre la source et la destination&lt;br /&gt;
&lt;br /&gt;
- parcours récursif des dossiers, reconstruction des chemins de fichiers&lt;br /&gt;
&lt;br /&gt;
- gestion des erreurs d’ouverture, de lecture et d’écriture&lt;br /&gt;
&lt;br /&gt;
- affichage d’informations avec &amp;lt;code&amp;gt;Serial.print()&amp;lt;/code&amp;gt; pour préparer le débogage. &lt;br /&gt;
&lt;br /&gt;
Il reste donc à adapter le programme pour respecter exactement le cahier des charges final, c’est-à-dire effectuer une copie brute bloc par bloc de la première carte vers la seconde, ajouter l’indication par la LED Arduino après chaque bloc copié avec succès. Peut être prévoir un code d’erreur par LED en cas de problème si j'ai encore du temps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pendant l'écriture du programme, j’ai rencontré quelques problèmes techniques liés principalement aux contraintes matérielles et à la gestion des fichiers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le premier problème important concernait la gestion de la mémoire de l’Arduino. Au départ, j’avais défini un buffer de copie assez grand pour améliorer la vitesse de transfert. Cependant, lors de la compilation, j’obtenais une erreur indiquant que la mémoire disponible était dépassée (“data section exceeds available space in board”).&lt;br /&gt;
&lt;br /&gt;
Grâce à mes recherches, j’ai compris que la combinaison de la bibliothèque SdFat, des variables globales et du buffer dépassait la RAM disponibles sur l’arduino. Du coup, j’ai progressivement réduit la taille du buffer (jusqu’à 32 octets), ce qui a permis de faire rentrer le programme en mémoire, au prix d’une vitesse de copie plus faible.&lt;br /&gt;
&lt;br /&gt;
J’ai eu un problème de gestion des chemins de fichiers lors de la copie. En effet, pour parcourir récursivement les dossiers, il était nécessaire de reconstruire correctement les chemins complets. La fonction joinPath a permit d'eviter les erreurs liées à la taille des buffers. J’ai intégré des vérifications supplémentaires pour gérer les cas d’erreur potentiels (échec d’ouverture de fichier, chemin trop long, erreur de lecture/écriture), afin d'être plus sur du programme même avant le test sur matériel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme je ne peux pas encore tester physiquement les cartes, j’ai ajouté des messages Serial.print() pour que, lors du premier test matériel, je puisse identifier rapidement où le programme bloque.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enfin, j’ai rencontré des obstacles liées à la limitation matérielle de l’Arduino, notamment en termes de mémoire et de gestion simultanée de deux cartes SD sur le même bus SPI. Cela m’a obligé à optimiser le code et à bien comprendre l'utilisation de deux broches CS distinctes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vous trouverez la version actuelle de mon programme dans les Documents Rendus et sur le Git.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Git : https://gitea.plil.fr/lkachour/EC4.git&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SdFat.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const uint8_t SRC_CS = 10;   // CS carte source&lt;br /&gt;
const uint8_t DST_CS = 9;    // CS carte destination&lt;br /&gt;
&lt;br /&gt;
const size_t COPY_BUFFER_SIZE = 32;&lt;br /&gt;
uint8_t copyBuffer[COPY_BUFFER_SIZE];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SdFs sdSrc;&lt;br /&gt;
SdFs sdDst;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bool joinPath(const char* parent, const char* name, char* out, size_t outSize) {&lt;br /&gt;
  int written;&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(parent, &amp;quot;/&amp;quot;) == 0) {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;/%s&amp;quot;, name);&lt;br /&gt;
  } else {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;%s/%s&amp;quot;, parent, name);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return (written &amp;gt; 0 &amp;amp;&amp;amp; (size_t)written &amp;lt; outSize);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyFile(const char* path) {&lt;br /&gt;
  FsFile srcFile = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!srcFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile dstFile = sdDst.open(path, O_WRONLY | O_CREAT | O_TRUNC);&lt;br /&gt;
  if (!dstFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture destination : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    srcFile.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;Copie fichier : &amp;quot;);&lt;br /&gt;
  Serial.println(path);&lt;br /&gt;
&lt;br /&gt;
  while (true) {&lt;br /&gt;
    int32_t n = srcFile.read(copyBuffer, sizeof(copyBuffer));&lt;br /&gt;
&lt;br /&gt;
    if (n &amp;lt; 0) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur lecture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (n == 0) {&lt;br /&gt;
      break; // fin du fichier&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (dstFile.write(copyBuffer, n) != n) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur ecriture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  srcFile.close();&lt;br /&gt;
  dstFile.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyDirectory(const char* path) {&lt;br /&gt;
  FsFile dir = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!dir || !dir.isDir()) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture dossier source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    dir.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(path, &amp;quot;/&amp;quot;) != 0) {&lt;br /&gt;
    if (!sdDst.exists(path)) {&lt;br /&gt;
      if (!sdDst.mkdir(path, true)) {&lt;br /&gt;
        Serial.print(&amp;quot;Erreur creation dossier destination : &amp;quot;);&lt;br /&gt;
        Serial.println(path);&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile entry;&lt;br /&gt;
&lt;br /&gt;
  while (entry.openNext(&amp;amp;dir, O_RDONLY)) {&lt;br /&gt;
    char name[64];&lt;br /&gt;
    char childPath[128];&lt;br /&gt;
&lt;br /&gt;
    if (!entry.getName(name, sizeof(name))) {&lt;br /&gt;
      Serial.println(&amp;quot;Nom de fichier trop long ou erreur getName&amp;quot;);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      dir.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (strcmp(name, &amp;quot;.&amp;quot;) == 0 || strcmp(name, &amp;quot;..&amp;quot;) == 0) {&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!joinPath(path, name, childPath, sizeof(childPath))) {&lt;br /&gt;
      Serial.print(&amp;quot;Chemin trop long, ignore : &amp;quot;);&lt;br /&gt;
      Serial.println(name);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    bool isDir = entry.isDir();&lt;br /&gt;
    entry.close();&lt;br /&gt;
&lt;br /&gt;
    if (isDir) {&lt;br /&gt;
      Serial.print(&amp;quot;Entre dans dossier : &amp;quot;);&lt;br /&gt;
      Serial.println(childPath);&lt;br /&gt;
&lt;br /&gt;
      if (!copyDirectory(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      if (!copyFile(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  dir.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while (!Serial) {&lt;br /&gt;
    ;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  Serial.println(&amp;quot;=== Debut copie SD -&amp;gt; SD ===&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  //Met les 2 à l'état haut par défaut&lt;br /&gt;
  pinMode(SRC_CS, OUTPUT);&lt;br /&gt;
  pinMode(DST_CS, OUTPUT);&lt;br /&gt;
  digitalWrite(SRC_CS, HIGH);&lt;br /&gt;
  digitalWrite(DST_CS, HIGH);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte source&lt;br /&gt;
  if (!sdSrc.begin(SdSpiConfig(SRC_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte SOURCE&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte SOURCE OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte destination&lt;br /&gt;
  if (!sdDst.begin(SdSpiConfig(DST_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte DESTINATION&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte DESTINATION OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Lancement de la copie...&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if (copyDirectory(&amp;quot;/&amp;quot;)) {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie terminee avec succes ===&amp;quot;);&lt;br /&gt;
  } else {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie arretee sur erreur ===&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12992</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12992"/>
		<updated>2026-04-28T10:22:56Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : Explication de l'avancement du code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Etapes clés du projet :&lt;br /&gt;
&lt;br /&gt;
'''HARDWARE :'''&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
'''SOFTWARE :'''&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs bloc.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
===  Informations en vrac : ===&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD &lt;br /&gt;
&lt;br /&gt;
https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
[[Fichier:Photo1.png|centré|634x634px]].&lt;br /&gt;
&lt;br /&gt;
=== HARDWARE : ===&lt;br /&gt;
&lt;br /&gt;
===== '''''06/03/26:''''' =====&lt;br /&gt;
- Ebauche du schéma électrique &lt;br /&gt;
&lt;br /&gt;
* ajout des symboles des principaux composants (Arduino Nano, Lecteurs micro SD)&lt;br /&gt;
* étiquettes des liaisons principales.&lt;br /&gt;
&lt;br /&gt;
- Création d'un Git sur Gitea pour futur dépot de l'avancement du projet&lt;br /&gt;
[[Fichier:Capture_d’écran_n1_kicad.png|centré|633x633px|V1 schéma électrique]]&lt;br /&gt;
&lt;br /&gt;
=====  '''''15/03 -&amp;gt; 18/03''''' =====&lt;br /&gt;
- Schema électrique   &lt;br /&gt;
&lt;br /&gt;
* Ajout des résistances et des capacités nécessaires.&lt;br /&gt;
* Adaptation des alimentations en 3V3 des composants.&lt;br /&gt;
* Vérification et correction de la première version&lt;br /&gt;
&lt;br /&gt;
- démarrage du routage PCB et ajout des empreintes sur les composants.  &lt;br /&gt;
[[Fichier:V2 Schéma élec.png|centré|sans_cadre|639x639px|version 2 Schéma Electrique]].&lt;br /&gt;
&lt;br /&gt;
===== '''- Schéma électrique Final :''' =====&lt;br /&gt;
(insérer capture d'écran)        &lt;br /&gt;
&lt;br /&gt;
.        &lt;br /&gt;
&lt;br /&gt;
===== '''- PCB Final :''' =====&lt;br /&gt;
* Minimisation des dimensions de la carte. Carte la plus compacte possible.&lt;br /&gt;
* Masse GND en double face&lt;br /&gt;
* Double face, passage de certaines pistes en dessous en utilisant des via.&lt;br /&gt;
* Passage du 3V3 en couche inférieure (recommandé par M. Redon).&lt;br /&gt;
* Piste 3V3 plus épaisse que les pistes classique (4mm)&lt;br /&gt;
* Ajout de plusieurs Via sur le plan de masse afin de bien connecter les deux couches.&lt;br /&gt;
&lt;br /&gt;
''Difficultés rencontrées :'' &lt;br /&gt;
&lt;br /&gt;
* Connecter les deux lecteurs micro SD ensemble était compliqué, car les pin étaient inversée les unes par rapport aux autres (en miroir). Donc toutes les pistes se croisaient.&lt;br /&gt;
* Réussir à connecter le GND partout était difficile, en raison de zones isolées qui se créaient (solutionné par le passage en couche inférieur du 3V3).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture_d’écran_ec4.png|centré|sans_cadre|553x553px]]&lt;br /&gt;
&lt;br /&gt;
Carte envoyée en impression en même temps que les projets PSE (13/04).&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
===  '''SOFTWARE :''' ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pendant l'écriture du programme( du 13/04 au 18/04), j’ai rencontré quelques problèmes techniques liés principalement aux contraintes matérielles et à la gestion des fichiers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le premier problème important concernait la gestion de la mémoire de l’Arduino. Au départ, j’avais défini un buffer de copie assez grand pour améliorer la vitesse de transfert. Cependant, lors de la compilation, j’obtenais une erreur indiquant que la mémoire disponible était dépassée (“data section exceeds available space in board”).&lt;br /&gt;
&lt;br /&gt;
Grâce à mes recherches, j’ai compris que la combinaison de la bibliothèque SdFat, des variables globales et du buffer dépassait la RAM disponibles sur l’arduino. Du coup, j’ai progressivement réduit la taille du buffer (jusqu’à 32 octets), ce qui a permis de faire rentrer le programme en mémoire, au prix d’une vitesse de copie plus faible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
J’ai eu un problème de gestion des chemins de fichiers lors de la copie. En effet, pour parcourir récursivement les dossiers, il était nécessaire de reconstruire correctement les chemins complets. La fonction joinPath a permit d'eviter les erreurs liées à la taille des buffers. J’ai intégré des vérifications supplémentaires pour gérer les cas d’erreur potentiels (échec d’ouverture de fichier, chemin trop long, erreur de lecture/écriture), afin d'être plus sur du programme même avant le test sur matériel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme je ne peux pas encore tester physiquement les cartes, j’ai ajouté des messages Serial.print() pour que, lors du premier test matériel, je puisse identifier rapidement où le programme bloque.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enfin, j’ai rencontré des obstacles liées à la limitation matérielle de l’Arduino, notamment en termes de mémoire et de gestion simultanée de deux cartes SD sur le même bus SPI. Cela m’a obligé à optimiser le code et à bien comprendre l'utilisation de deux broches CS distinctes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vous trouverez la version actuelle de mon programme dans les Documents Rendus et sur le Git.&lt;br /&gt;
&lt;br /&gt;
Actuellement, mon programme ne réalise pas encore la copie complète bloc par bloc de toute la micro-SD comme demandé dans l’objectif final. &lt;br /&gt;
&lt;br /&gt;
Pour l’instant, j’ai développé une première version qui fonctionne au niveau du système de fichiers : le programme initialise deux cartes micro-SD sur le même bus SPI avec deux broches CS différentes, puis parcourt la carte source afin de copier les dossiers et les fichiers vers la carte destination. &lt;br /&gt;
&lt;br /&gt;
La copie se fait fichier par fichier, en lisant une petite quantité de données en mémoire grâce à un buffer, puis en l’écrivant sur la deuxième carte. Cette version m’a surtout permis de mettre en place la logique générale du projet : &lt;br /&gt;
&lt;br /&gt;
- initialisation des deux cartes&lt;br /&gt;
&lt;br /&gt;
- distinction entre la source et la destination&lt;br /&gt;
&lt;br /&gt;
- parcours récursif des dossiers, reconstruction des chemins de fichiers&lt;br /&gt;
&lt;br /&gt;
- gestion des erreurs d’ouverture, de lecture et d’écriture&lt;br /&gt;
&lt;br /&gt;
- affichage d’informations avec &amp;lt;code&amp;gt;Serial.print()&amp;lt;/code&amp;gt; pour préparer le débogage. &lt;br /&gt;
&lt;br /&gt;
Il reste donc à adapter le programme pour respecter exactement le cahier des charges final, c’est-à-dire effectuer une copie brute bloc par bloc de la première carte vers la seconde, ajouter l’indication par la LED Arduino après chaque bloc copié avec succès. Peut être prévoir un code d’erreur par LED en cas de problème si j'ai encore du temps.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Git : https://gitea.plil.fr/lkachour/EC4.git&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SdFat.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const uint8_t SRC_CS = 10;   // CS carte source&lt;br /&gt;
const uint8_t DST_CS = 9;    // CS carte destination&lt;br /&gt;
&lt;br /&gt;
const size_t COPY_BUFFER_SIZE = 32;&lt;br /&gt;
uint8_t copyBuffer[COPY_BUFFER_SIZE];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SdFs sdSrc;&lt;br /&gt;
SdFs sdDst;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bool joinPath(const char* parent, const char* name, char* out, size_t outSize) {&lt;br /&gt;
  int written;&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(parent, &amp;quot;/&amp;quot;) == 0) {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;/%s&amp;quot;, name);&lt;br /&gt;
  } else {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;%s/%s&amp;quot;, parent, name);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return (written &amp;gt; 0 &amp;amp;&amp;amp; (size_t)written &amp;lt; outSize);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyFile(const char* path) {&lt;br /&gt;
  FsFile srcFile = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!srcFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile dstFile = sdDst.open(path, O_WRONLY | O_CREAT | O_TRUNC);&lt;br /&gt;
  if (!dstFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture destination : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    srcFile.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;Copie fichier : &amp;quot;);&lt;br /&gt;
  Serial.println(path);&lt;br /&gt;
&lt;br /&gt;
  while (true) {&lt;br /&gt;
    int32_t n = srcFile.read(copyBuffer, sizeof(copyBuffer));&lt;br /&gt;
&lt;br /&gt;
    if (n &amp;lt; 0) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur lecture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (n == 0) {&lt;br /&gt;
      break; // fin du fichier&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (dstFile.write(copyBuffer, n) != n) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur ecriture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  srcFile.close();&lt;br /&gt;
  dstFile.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyDirectory(const char* path) {&lt;br /&gt;
  FsFile dir = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!dir || !dir.isDir()) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture dossier source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    dir.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(path, &amp;quot;/&amp;quot;) != 0) {&lt;br /&gt;
    if (!sdDst.exists(path)) {&lt;br /&gt;
      if (!sdDst.mkdir(path, true)) {&lt;br /&gt;
        Serial.print(&amp;quot;Erreur creation dossier destination : &amp;quot;);&lt;br /&gt;
        Serial.println(path);&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile entry;&lt;br /&gt;
&lt;br /&gt;
  while (entry.openNext(&amp;amp;dir, O_RDONLY)) {&lt;br /&gt;
    char name[64];&lt;br /&gt;
    char childPath[128];&lt;br /&gt;
&lt;br /&gt;
    if (!entry.getName(name, sizeof(name))) {&lt;br /&gt;
      Serial.println(&amp;quot;Nom de fichier trop long ou erreur getName&amp;quot;);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      dir.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (strcmp(name, &amp;quot;.&amp;quot;) == 0 || strcmp(name, &amp;quot;..&amp;quot;) == 0) {&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!joinPath(path, name, childPath, sizeof(childPath))) {&lt;br /&gt;
      Serial.print(&amp;quot;Chemin trop long, ignore : &amp;quot;);&lt;br /&gt;
      Serial.println(name);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    bool isDir = entry.isDir();&lt;br /&gt;
    entry.close();&lt;br /&gt;
&lt;br /&gt;
    if (isDir) {&lt;br /&gt;
      Serial.print(&amp;quot;Entre dans dossier : &amp;quot;);&lt;br /&gt;
      Serial.println(childPath);&lt;br /&gt;
&lt;br /&gt;
      if (!copyDirectory(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      if (!copyFile(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  dir.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while (!Serial) {&lt;br /&gt;
    ;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  Serial.println(&amp;quot;=== Debut copie SD -&amp;gt; SD ===&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  //Met les 2 à l'état haut par défaut&lt;br /&gt;
  pinMode(SRC_CS, OUTPUT);&lt;br /&gt;
  pinMode(DST_CS, OUTPUT);&lt;br /&gt;
  digitalWrite(SRC_CS, HIGH);&lt;br /&gt;
  digitalWrite(DST_CS, HIGH);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte source&lt;br /&gt;
  if (!sdSrc.begin(SdSpiConfig(SRC_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte SOURCE&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte SOURCE OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte destination&lt;br /&gt;
  if (!sdDst.begin(SdSpiConfig(DST_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte DESTINATION&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte DESTINATION OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Lancement de la copie...&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if (copyDirectory(&amp;quot;/&amp;quot;)) {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie terminee avec succes ===&amp;quot;);&lt;br /&gt;
  } else {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie arretee sur erreur ===&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12991</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12991"/>
		<updated>2026-04-28T10:10:05Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : modif&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Etapes clés du projet :&lt;br /&gt;
&lt;br /&gt;
'''HARDWARE :'''&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
'''SOFTWARE :'''&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs bloc.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
===  Informations en vrac : ===&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD &lt;br /&gt;
&lt;br /&gt;
https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
[[Fichier:Photo1.png|centré|634x634px]].&lt;br /&gt;
&lt;br /&gt;
=== HARDWARE : ===&lt;br /&gt;
&lt;br /&gt;
===== '''''06/03/26:''''' =====&lt;br /&gt;
- Ebauche du schéma électrique &lt;br /&gt;
&lt;br /&gt;
* ajout des symboles des principaux composants (Arduino Nano, Lecteurs micro SD)&lt;br /&gt;
* étiquettes des liaisons principales.&lt;br /&gt;
&lt;br /&gt;
- Création d'un Git sur Gitea pour futur dépot de l'avancement du projet&lt;br /&gt;
[[Fichier:Capture_d’écran_n1_kicad.png|centré|633x633px|V1 schéma électrique]]&lt;br /&gt;
&lt;br /&gt;
=====  '''''15/03 -&amp;gt; 18/03''''' =====&lt;br /&gt;
- Schema électrique   &lt;br /&gt;
&lt;br /&gt;
* Ajout des résistances et des capacités nécessaires.&lt;br /&gt;
* Adaptation des alimentations en 3V3 des composants.&lt;br /&gt;
* Vérification et correction de la première version&lt;br /&gt;
&lt;br /&gt;
- démarrage du routage PCB et ajout des empreintes sur les composants.  &lt;br /&gt;
[[Fichier:V2 Schéma élec.png|centré|sans_cadre|639x639px|version 2 Schéma Electrique]].&lt;br /&gt;
&lt;br /&gt;
===== '''- Schéma électrique Final :''' =====&lt;br /&gt;
(insérer capture d'écran)        &lt;br /&gt;
&lt;br /&gt;
.        &lt;br /&gt;
&lt;br /&gt;
===== '''- PCB Final :''' =====&lt;br /&gt;
* Minimisation des dimensions de la carte. Carte la plus compacte possible.&lt;br /&gt;
* Masse GND en double face&lt;br /&gt;
* Double face, passage de certaines pistes en dessous en utilisant des via.&lt;br /&gt;
* Passage du 3V3 en couche inférieure (recommandé par M. Redon).&lt;br /&gt;
* Piste 3V3 plus épaisse que les pistes classique (4mm)&lt;br /&gt;
* Ajout de plusieurs Via sur le plan de masse afin de bien connecter les deux couches.&lt;br /&gt;
&lt;br /&gt;
''Difficultés rencontrées :'' &lt;br /&gt;
&lt;br /&gt;
* Connecter les deux lecteurs micro SD ensemble était compliqué, car les pin étaient inversée les unes par rapport aux autres (en miroir). Donc toutes les pistes se croisaient.&lt;br /&gt;
* Réussir à connecter le GND partout était difficile, en raison de zones isolées qui se créaient (solutionné par le passage en couche inférieur du 3V3).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture_d’écran_ec4.png|centré|sans_cadre|553x553px]]&lt;br /&gt;
&lt;br /&gt;
Carte envoyée en impression en même temps que les projets PSE (13/04).&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
===  '''SOFTWARE :''' ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pendant l'écriture du programme( du 13/04 au 18/04), j’ai rencontré quelques problèmes techniques liés principalement aux contraintes matérielles et à la gestion des fichiers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le premier problème important concernait la gestion de la mémoire de l’Arduino. Au départ, j’avais défini un buffer de copie assez grand pour améliorer la vitesse de transfert. Cependant, lors de la compilation, j’obtenais une erreur indiquant que la mémoire disponible était dépassée (“data section exceeds available space in board”).&lt;br /&gt;
&lt;br /&gt;
Grâce à mes recherches, j’ai compris que la combinaison de la bibliothèque SdFat, des variables globales et du buffer dépassait la RAM disponibles sur l’arduino. Du coup, j’ai progressivement réduit la taille du buffer (jusqu’à 32 octets), ce qui a permis de faire rentrer le programme en mémoire, au prix d’une vitesse de copie plus faible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
J’ai eu un problème de gestion des chemins de fichiers lors de la copie. En effet, pour parcourir récursivement les dossiers, il était nécessaire de reconstruire correctement les chemins complets. La fonction joinPath a permit d'eviter les erreurs liées à la taille des buffers. J’ai intégré des vérifications supplémentaires pour gérer les cas d’erreur potentiels (échec d’ouverture de fichier, chemin trop long, erreur de lecture/écriture), afin d'être plus sur du programme même avant le test sur matériel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme je ne peux pas encore tester physiquement les cartes, j’ai ajouté des messages Serial.print() pour que, lors du premier test matériel, je puisse identifier rapidement où le programme bloque.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enfin, j’ai rencontré des obstacles liées à la limitation matérielle de l’Arduino, notamment en termes de mémoire et de gestion simultanée de deux cartes SD sur le même bus SPI. Cela m’a obligé à optimiser le code et à bien comprendre l'utilisation de deux broches CS distinctes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vous trouverez la version actuelle de mon programme dans les Documents Rendus et sur le Git.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Git : https://gitea.plil.fr/lkachour/EC4.git&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SdFat.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const uint8_t SRC_CS = 10;   // CS carte source&lt;br /&gt;
const uint8_t DST_CS = 9;    // CS carte destination&lt;br /&gt;
&lt;br /&gt;
const size_t COPY_BUFFER_SIZE = 32;&lt;br /&gt;
uint8_t copyBuffer[COPY_BUFFER_SIZE];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SdFs sdSrc;&lt;br /&gt;
SdFs sdDst;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bool joinPath(const char* parent, const char* name, char* out, size_t outSize) {&lt;br /&gt;
  int written;&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(parent, &amp;quot;/&amp;quot;) == 0) {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;/%s&amp;quot;, name);&lt;br /&gt;
  } else {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;%s/%s&amp;quot;, parent, name);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return (written &amp;gt; 0 &amp;amp;&amp;amp; (size_t)written &amp;lt; outSize);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyFile(const char* path) {&lt;br /&gt;
  FsFile srcFile = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!srcFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile dstFile = sdDst.open(path, O_WRONLY | O_CREAT | O_TRUNC);&lt;br /&gt;
  if (!dstFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture destination : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    srcFile.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;Copie fichier : &amp;quot;);&lt;br /&gt;
  Serial.println(path);&lt;br /&gt;
&lt;br /&gt;
  while (true) {&lt;br /&gt;
    int32_t n = srcFile.read(copyBuffer, sizeof(copyBuffer));&lt;br /&gt;
&lt;br /&gt;
    if (n &amp;lt; 0) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur lecture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (n == 0) {&lt;br /&gt;
      break; // fin du fichier&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (dstFile.write(copyBuffer, n) != n) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur ecriture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  srcFile.close();&lt;br /&gt;
  dstFile.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyDirectory(const char* path) {&lt;br /&gt;
  FsFile dir = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!dir || !dir.isDir()) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture dossier source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    dir.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(path, &amp;quot;/&amp;quot;) != 0) {&lt;br /&gt;
    if (!sdDst.exists(path)) {&lt;br /&gt;
      if (!sdDst.mkdir(path, true)) {&lt;br /&gt;
        Serial.print(&amp;quot;Erreur creation dossier destination : &amp;quot;);&lt;br /&gt;
        Serial.println(path);&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile entry;&lt;br /&gt;
&lt;br /&gt;
  while (entry.openNext(&amp;amp;dir, O_RDONLY)) {&lt;br /&gt;
    char name[64];&lt;br /&gt;
    char childPath[128];&lt;br /&gt;
&lt;br /&gt;
    if (!entry.getName(name, sizeof(name))) {&lt;br /&gt;
      Serial.println(&amp;quot;Nom de fichier trop long ou erreur getName&amp;quot;);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      dir.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (strcmp(name, &amp;quot;.&amp;quot;) == 0 || strcmp(name, &amp;quot;..&amp;quot;) == 0) {&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!joinPath(path, name, childPath, sizeof(childPath))) {&lt;br /&gt;
      Serial.print(&amp;quot;Chemin trop long, ignore : &amp;quot;);&lt;br /&gt;
      Serial.println(name);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    bool isDir = entry.isDir();&lt;br /&gt;
    entry.close();&lt;br /&gt;
&lt;br /&gt;
    if (isDir) {&lt;br /&gt;
      Serial.print(&amp;quot;Entre dans dossier : &amp;quot;);&lt;br /&gt;
      Serial.println(childPath);&lt;br /&gt;
&lt;br /&gt;
      if (!copyDirectory(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      if (!copyFile(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  dir.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while (!Serial) {&lt;br /&gt;
    ;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  Serial.println(&amp;quot;=== Debut copie SD -&amp;gt; SD ===&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  //Met les 2 à l'état haut par défaut&lt;br /&gt;
  pinMode(SRC_CS, OUTPUT);&lt;br /&gt;
  pinMode(DST_CS, OUTPUT);&lt;br /&gt;
  digitalWrite(SRC_CS, HIGH);&lt;br /&gt;
  digitalWrite(DST_CS, HIGH);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte source&lt;br /&gt;
  if (!sdSrc.begin(SdSpiConfig(SRC_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte SOURCE&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte SOURCE OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte destination&lt;br /&gt;
  if (!sdDst.begin(SdSpiConfig(DST_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte DESTINATION&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte DESTINATION OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Lancement de la copie...&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if (copyDirectory(&amp;quot;/&amp;quot;)) {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie terminee avec succes ===&amp;quot;);&lt;br /&gt;
  } else {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie arretee sur erreur ===&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12990</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12990"/>
		<updated>2026-04-28T10:07:44Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : Ajout d'informations&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Etapes clés du projet :&lt;br /&gt;
&lt;br /&gt;
'''HARDWARE :'''&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
'''SOFTWARE :'''&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs blocs&lt;br /&gt;
&lt;br /&gt;
===  Informations en vrac : ===&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD &lt;br /&gt;
&lt;br /&gt;
https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
[[Fichier:Photo1.png|centré|634x634px]]&lt;br /&gt;
&lt;br /&gt;
=== HARDWARE : ===&lt;br /&gt;
'''''06/03/26:''''' &lt;br /&gt;
&lt;br /&gt;
- Ebauche du schéma électrique &lt;br /&gt;
&lt;br /&gt;
* ajout des symboles des principaux composants (Arduino Nano, Lecteurs micro SD)&lt;br /&gt;
* étiquettes des liaisons principales.&lt;br /&gt;
&lt;br /&gt;
- Création d'un Git sur Gitea pour futur dépot de l'avancement du projet&lt;br /&gt;
[[Fichier:Capture_d’écran_n1_kicad.png|centré|633x633px|V1 schéma électrique]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''15/03 -&amp;gt; 8/03'''''&lt;br /&gt;
&lt;br /&gt;
- Schema electrique   &lt;br /&gt;
&lt;br /&gt;
* Ajout des résistances et des capacités nécessaires.&lt;br /&gt;
* Adaptation des alimentations en 3V3 des composants.&lt;br /&gt;
* Vérification et correction de la première version&lt;br /&gt;
&lt;br /&gt;
- démarrage du routage PCB et ajout des empreintes sur les composants.  &lt;br /&gt;
[[Fichier:V2 Schéma élec.png|centré|sans_cadre|639x639px|version 2 Schéma Electrique]]  &lt;br /&gt;
&lt;br /&gt;
'''- Schéma électrique Final :'''   &lt;br /&gt;
&lt;br /&gt;
(insérer capture d'écran)        &lt;br /&gt;
&lt;br /&gt;
'''- PCB Final :'''&lt;br /&gt;
&lt;br /&gt;
* Minimisation des dimensions de la carte. Carte la plus compacte possible.&lt;br /&gt;
* Masse GND en double face&lt;br /&gt;
* Double face, passage de certaines pistes en dessous en utilisant des via.&lt;br /&gt;
* Passage du 3V3 en couche inférieure (recommandé par M. Redon).&lt;br /&gt;
* Piste 3V3 plus épaisse que les pistes classique (4mm)&lt;br /&gt;
* Ajout de plusieurs Via sur le plan de masse afin de bien connecter les deux couches.&lt;br /&gt;
&lt;br /&gt;
''Difficultés rencontrées :'' &lt;br /&gt;
&lt;br /&gt;
* Connecter les deux lecteurs micro SD ensemble était compliqué, car les pin étaient inversée les unes par rapport aux autres (en miroir). Donc toutes les pistes se croisaient.&lt;br /&gt;
* Réussir à connecter le GND partout était difficile, en raison de zones isolées qui se créaient (solutionné par le passage en couche inférieur du 3V3).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture_d’écran_ec4.png|centré|sans_cadre|553x553px]]&lt;br /&gt;
&lt;br /&gt;
Carte envoyée en impression en même temps que les projets PSE (13/04).&lt;br /&gt;
===  '''SOFTWARE :''' ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pendant l'écriture du programme( du 13/04 au 18/04), j’ai rencontré quelques problèmes techniques liés principalement aux contraintes matérielles et à la gestion des fichiers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le premier problème important concernait la gestion de la mémoire de l’Arduino. Au départ, j’avais défini un buffer de copie assez grand pour améliorer la vitesse de transfert. Cependant, lors de la compilation, j’obtenais une erreur indiquant que la mémoire disponible était dépassée (“data section exceeds available space in board”).&lt;br /&gt;
&lt;br /&gt;
Grâce à mes recherches, j’ai compris que la combinaison de la bibliothèque SdFat, des variables globales et du buffer dépassait la RAM disponibles sur l’arduino. Du coup, j’ai progressivement réduit la taille du buffer (jusqu’à 32 octets), ce qui a permis de faire rentrer le programme en mémoire, au prix d’une vitesse de copie plus faible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
J’ai eu un problème de gestion des chemins de fichiers lors de la copie. En effet, pour parcourir récursivement les dossiers, il était nécessaire de reconstruire correctement les chemins complets. La fonction joinPath a permit d'eviter les erreurs liées à la taille des buffers. J’ai intégré des vérifications supplémentaires pour gérer les cas d’erreur potentiels (échec d’ouverture de fichier, chemin trop long, erreur de lecture/écriture), afin d'être plus sur du programme même avant le test sur matériel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme je ne peux pas encore tester physiquement les cartes, j’ai ajouté des messages Serial.print() pour que, lors du premier test matériel, je puisse identifier rapidement où le programme bloque.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enfin, j’ai rencontré des obstacles liées à la limitation matérielle de l’Arduino, notamment en termes de mémoire et de gestion simultanée de deux cartes SD sur le même bus SPI. Cela m’a obligé à optimiser le code et à bien comprendre l'utilisation de deux broches CS distinctes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vous trouverez la version actuelle de mon programme dans les Documents Rendus et sur le Git.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Git : https://gitea.plil.fr/lkachour/EC4.git&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SdFat.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const uint8_t SRC_CS = 10;   // CS carte source&lt;br /&gt;
const uint8_t DST_CS = 9;    // CS carte destination&lt;br /&gt;
&lt;br /&gt;
const size_t COPY_BUFFER_SIZE = 32;&lt;br /&gt;
uint8_t copyBuffer[COPY_BUFFER_SIZE];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SdFs sdSrc;&lt;br /&gt;
SdFs sdDst;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bool joinPath(const char* parent, const char* name, char* out, size_t outSize) {&lt;br /&gt;
  int written;&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(parent, &amp;quot;/&amp;quot;) == 0) {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;/%s&amp;quot;, name);&lt;br /&gt;
  } else {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;%s/%s&amp;quot;, parent, name);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return (written &amp;gt; 0 &amp;amp;&amp;amp; (size_t)written &amp;lt; outSize);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyFile(const char* path) {&lt;br /&gt;
  FsFile srcFile = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!srcFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile dstFile = sdDst.open(path, O_WRONLY | O_CREAT | O_TRUNC);&lt;br /&gt;
  if (!dstFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture destination : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    srcFile.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;Copie fichier : &amp;quot;);&lt;br /&gt;
  Serial.println(path);&lt;br /&gt;
&lt;br /&gt;
  while (true) {&lt;br /&gt;
    int32_t n = srcFile.read(copyBuffer, sizeof(copyBuffer));&lt;br /&gt;
&lt;br /&gt;
    if (n &amp;lt; 0) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur lecture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (n == 0) {&lt;br /&gt;
      break; // fin du fichier&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (dstFile.write(copyBuffer, n) != n) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur ecriture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  srcFile.close();&lt;br /&gt;
  dstFile.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyDirectory(const char* path) {&lt;br /&gt;
  FsFile dir = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!dir || !dir.isDir()) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture dossier source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    dir.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(path, &amp;quot;/&amp;quot;) != 0) {&lt;br /&gt;
    if (!sdDst.exists(path)) {&lt;br /&gt;
      if (!sdDst.mkdir(path, true)) {&lt;br /&gt;
        Serial.print(&amp;quot;Erreur creation dossier destination : &amp;quot;);&lt;br /&gt;
        Serial.println(path);&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile entry;&lt;br /&gt;
&lt;br /&gt;
  while (entry.openNext(&amp;amp;dir, O_RDONLY)) {&lt;br /&gt;
    char name[64];&lt;br /&gt;
    char childPath[128];&lt;br /&gt;
&lt;br /&gt;
    if (!entry.getName(name, sizeof(name))) {&lt;br /&gt;
      Serial.println(&amp;quot;Nom de fichier trop long ou erreur getName&amp;quot;);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      dir.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (strcmp(name, &amp;quot;.&amp;quot;) == 0 || strcmp(name, &amp;quot;..&amp;quot;) == 0) {&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!joinPath(path, name, childPath, sizeof(childPath))) {&lt;br /&gt;
      Serial.print(&amp;quot;Chemin trop long, ignore : &amp;quot;);&lt;br /&gt;
      Serial.println(name);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    bool isDir = entry.isDir();&lt;br /&gt;
    entry.close();&lt;br /&gt;
&lt;br /&gt;
    if (isDir) {&lt;br /&gt;
      Serial.print(&amp;quot;Entre dans dossier : &amp;quot;);&lt;br /&gt;
      Serial.println(childPath);&lt;br /&gt;
&lt;br /&gt;
      if (!copyDirectory(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      if (!copyFile(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  dir.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while (!Serial) {&lt;br /&gt;
    ;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  Serial.println(&amp;quot;=== Debut copie SD -&amp;gt; SD ===&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  //Met les 2 à l'état haut par défaut&lt;br /&gt;
  pinMode(SRC_CS, OUTPUT);&lt;br /&gt;
  pinMode(DST_CS, OUTPUT);&lt;br /&gt;
  digitalWrite(SRC_CS, HIGH);&lt;br /&gt;
  digitalWrite(DST_CS, HIGH);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte source&lt;br /&gt;
  if (!sdSrc.begin(SdSpiConfig(SRC_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte SOURCE&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte SOURCE OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte destination&lt;br /&gt;
  if (!sdDst.begin(SdSpiConfig(DST_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte DESTINATION&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte DESTINATION OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Lancement de la copie...&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if (copyDirectory(&amp;quot;/&amp;quot;)) {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie terminee avec succes ===&amp;quot;);&lt;br /&gt;
  } else {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie arretee sur erreur ===&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12989</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12989"/>
		<updated>2026-04-28T09:49:16Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : remise au propre du wiki&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Etapes clés du projet :&lt;br /&gt;
&lt;br /&gt;
'''HARDWARE :'''&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
'''SOFTWARE :'''&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs blocs&lt;br /&gt;
&lt;br /&gt;
===  Informations en vrac : ===&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD &lt;br /&gt;
&lt;br /&gt;
https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
[[Fichier:Photo1.png|centré|634x634px]]&lt;br /&gt;
&lt;br /&gt;
=== HARDWARE : ===&lt;br /&gt;
'''''06/03/26:''''' &lt;br /&gt;
&lt;br /&gt;
- Ebauche du schéma électrique&lt;br /&gt;
&lt;br /&gt;
- Création d'un Git sur Gitea pour futur dépot de l'avancement du projet&lt;br /&gt;
[[Fichier:Capture_d’écran_n1_kicad.png|centré|633x633px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''15/03 -&amp;gt; 8/03'''''&lt;br /&gt;
&lt;br /&gt;
- Schema electrique + démarrage du routage PCB  &lt;br /&gt;
[[Fichier:V2 Schéma élec.png|centré|sans_cadre|639x639px|version 2 Schéma Electrique]]  &lt;br /&gt;
&lt;br /&gt;
'''- Schéma électrique Final :'''   &lt;br /&gt;
&lt;br /&gt;
(insérer capture d'écran)    &lt;br /&gt;
&lt;br /&gt;
'''- PCB Final :'''&lt;br /&gt;
[[Fichier:Capture_d’écran_ec4.png|centré|sans_cadre|553x553px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  '''SOFTWARE :''' ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pendant l'écriture du programme(13/04-&amp;gt;18/04), j’ai rencontré quelques problèmes techniques liés principalement aux contraintes matérielles et à la gestion des fichiers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le premier problème important concernait la gestion de la mémoire de l’Arduino. Au départ, j’avais défini un buffer de copie assez grand pour améliorer la vitesse de transfert. Cependant, lors de la compilation, j’obtenais une erreur indiquant que la mémoire disponible était dépassée (“data section exceeds available space in board”).&lt;br /&gt;
&lt;br /&gt;
Après reflexion, j’ai compris que la combinaison de la bibliothèque SdFat, des variables globales et du buffer dépassait la RAM disponibles sur l’arduino. Du coup, j’ai progressivement réduit la taille du buffer (jusqu’à 32 octets), ce qui a permis de faire rentrer le programme en mémoire, au prix d’une vitesse de copie plus faible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
J’ai eu un probleme de gestion des chemins de fichiers lors de la copie. En effet, pour parcourir récursivement les dossiers, il était nécessaire de reconstruire correctement les chemins complets. La fonction joinPath a permit d'eviter les erreurs liées à la taille des buffers. J’ai intégré des vérifications supplémentaires pour gérer les cas d’erreur potentiels (échec d’ouverture de fichier, chemin trop long, erreur de lecture/écriture), afin d'être plus sur du programme même avant le test sur matériel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme je ne peux pas encore tester physiquement les cartes, j’ai ajouté des messages Serial.print() pour que, lors du premier test matériel, je puisse identifier rapidement où le programme bloque.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enfin, j’ai rencontré des obstacles liées à la limitation matérielle de l’Arduino, notamment en termes de mémoire et de gestion simultanée de deux cartes SD sur le même bus SPI. Cela m’a obligé à optimiser le code et à bien comprendre l'utilisation de deux broches CS distinctes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vous trouverez la version actuelle de mon programme dans les Documents Rendus et sur le Git.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Git : https://gitea.plil.fr/lkachour/EC4.git&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SdFat.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const uint8_t SRC_CS = 10;   // CS carte source&lt;br /&gt;
const uint8_t DST_CS = 9;    // CS carte destination&lt;br /&gt;
&lt;br /&gt;
const size_t COPY_BUFFER_SIZE = 32;&lt;br /&gt;
uint8_t copyBuffer[COPY_BUFFER_SIZE];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SdFs sdSrc;&lt;br /&gt;
SdFs sdDst;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bool joinPath(const char* parent, const char* name, char* out, size_t outSize) {&lt;br /&gt;
  int written;&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(parent, &amp;quot;/&amp;quot;) == 0) {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;/%s&amp;quot;, name);&lt;br /&gt;
  } else {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;%s/%s&amp;quot;, parent, name);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return (written &amp;gt; 0 &amp;amp;&amp;amp; (size_t)written &amp;lt; outSize);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyFile(const char* path) {&lt;br /&gt;
  FsFile srcFile = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!srcFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile dstFile = sdDst.open(path, O_WRONLY | O_CREAT | O_TRUNC);&lt;br /&gt;
  if (!dstFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture destination : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    srcFile.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;Copie fichier : &amp;quot;);&lt;br /&gt;
  Serial.println(path);&lt;br /&gt;
&lt;br /&gt;
  while (true) {&lt;br /&gt;
    int32_t n = srcFile.read(copyBuffer, sizeof(copyBuffer));&lt;br /&gt;
&lt;br /&gt;
    if (n &amp;lt; 0) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur lecture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (n == 0) {&lt;br /&gt;
      break; // fin du fichier&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (dstFile.write(copyBuffer, n) != n) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur ecriture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  srcFile.close();&lt;br /&gt;
  dstFile.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyDirectory(const char* path) {&lt;br /&gt;
  FsFile dir = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!dir || !dir.isDir()) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture dossier source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    dir.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(path, &amp;quot;/&amp;quot;) != 0) {&lt;br /&gt;
    if (!sdDst.exists(path)) {&lt;br /&gt;
      if (!sdDst.mkdir(path, true)) {&lt;br /&gt;
        Serial.print(&amp;quot;Erreur creation dossier destination : &amp;quot;);&lt;br /&gt;
        Serial.println(path);&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile entry;&lt;br /&gt;
&lt;br /&gt;
  while (entry.openNext(&amp;amp;dir, O_RDONLY)) {&lt;br /&gt;
    char name[64];&lt;br /&gt;
    char childPath[128];&lt;br /&gt;
&lt;br /&gt;
    if (!entry.getName(name, sizeof(name))) {&lt;br /&gt;
      Serial.println(&amp;quot;Nom de fichier trop long ou erreur getName&amp;quot;);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      dir.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (strcmp(name, &amp;quot;.&amp;quot;) == 0 || strcmp(name, &amp;quot;..&amp;quot;) == 0) {&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!joinPath(path, name, childPath, sizeof(childPath))) {&lt;br /&gt;
      Serial.print(&amp;quot;Chemin trop long, ignore : &amp;quot;);&lt;br /&gt;
      Serial.println(name);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    bool isDir = entry.isDir();&lt;br /&gt;
    entry.close();&lt;br /&gt;
&lt;br /&gt;
    if (isDir) {&lt;br /&gt;
      Serial.print(&amp;quot;Entre dans dossier : &amp;quot;);&lt;br /&gt;
      Serial.println(childPath);&lt;br /&gt;
&lt;br /&gt;
      if (!copyDirectory(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      if (!copyFile(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  dir.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while (!Serial) {&lt;br /&gt;
    ;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  Serial.println(&amp;quot;=== Debut copie SD -&amp;gt; SD ===&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  //Met les 2 à l'état haut par défaut&lt;br /&gt;
  pinMode(SRC_CS, OUTPUT);&lt;br /&gt;
  pinMode(DST_CS, OUTPUT);&lt;br /&gt;
  digitalWrite(SRC_CS, HIGH);&lt;br /&gt;
  digitalWrite(DST_CS, HIGH);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte source&lt;br /&gt;
  if (!sdSrc.begin(SdSpiConfig(SRC_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte SOURCE&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte SOURCE OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte destination&lt;br /&gt;
  if (!sdDst.begin(SdSpiConfig(DST_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte DESTINATION&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte DESTINATION OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Lancement de la copie...&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if (copyDirectory(&amp;quot;/&amp;quot;)) {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie terminee avec succes ===&amp;quot;);&lt;br /&gt;
  } else {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie arretee sur erreur ===&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12988</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12988"/>
		<updated>2026-04-28T09:44:37Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Différentes étapes :&lt;br /&gt;
&lt;br /&gt;
'''HARDWARE :'''&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
'''SOFTWARE :'''&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs blocs&lt;br /&gt;
&lt;br /&gt;
===  Informations en vrac : ===&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD &lt;br /&gt;
&lt;br /&gt;
https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
[[Fichier:Photo1.png|centré|634x634px]]&lt;br /&gt;
&lt;br /&gt;
=== HARDWARE : ===&lt;br /&gt;
'''''06/03/26:''''' &lt;br /&gt;
&lt;br /&gt;
- Ebauche du schéma electrique&lt;br /&gt;
&lt;br /&gt;
- Création d'un Git sur Gitea pour futur dépot de l'avancement du projet&lt;br /&gt;
[[Fichier:Capture_d’écran_n1_kicad.png|centré|633x633px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''15/03 -&amp;gt; 8/03'''''&lt;br /&gt;
&lt;br /&gt;
- Schema electrique + PCB  &lt;br /&gt;
&lt;br /&gt;
- PCB Corrigé:&lt;br /&gt;
[[Fichier:Capture_d’écran_ec4.png|centré|sans_cadre|344x344px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  '''SOFTWARE :''' ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pendant l'écriture du programme(13/04-&amp;gt;18/04), j’ai rencontré quelques problèmes techniques liés principalement aux contraintes matérielles et à la gestion des fichiers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le premier problème important concernait la gestion de la mémoire de l’Arduino. Au départ, j’avais défini un buffer de copie assez grand pour améliorer la vitesse de transfert. Cependant, lors de la compilation, j’obtenais une erreur indiquant que la mémoire disponible était dépassée (“data section exceeds available space in board”).&lt;br /&gt;
&lt;br /&gt;
Après reflexion, j’ai compris que la combinaison de la bibliothèque SdFat, des variables globales et du buffer dépassait la RAM disponibles sur l’arduino. Du coup, j’ai progressivement réduit la taille du buffer (jusqu’à 32 octets), ce qui a permis de faire rentrer le programme en mémoire, au prix d’une vitesse de copie plus faible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
J’ai eu un probleme de gestion des chemins de fichiers lors de la copie. En effet, pour parcourir récursivement les dossiers, il était nécessaire de reconstruire correctement les chemins complets. La fonction joinPath a permit d'eviter les erreurs liées à la taille des buffers. J’ai intégré des vérifications supplémentaires pour gérer les cas d’erreur potentiels (échec d’ouverture de fichier, chemin trop long, erreur de lecture/écriture), afin d'être plus sur du programme même avant le test sur matériel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme je ne peux pas encore tester physiquement les cartes, j’ai ajouté des messages Serial.print() pour que, lors du premier test matériel, je puisse identifier rapidement où le programme bloque.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enfin, j’ai rencontré des obstacles liées à la limitation matérielle de l’Arduino, notamment en termes de mémoire et de gestion simultanée de deux cartes SD sur le même bus SPI. Cela m’a obligé à optimiser le code et à bien comprendre l'utilisation de deux broches CS distinctes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vous trouverez la version actuelle de mon programme dans les Documents Rendus et sur le Git.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Git : https://gitea.plil.fr/lkachour/EC4.git&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SdFat.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const uint8_t SRC_CS = 10;   // CS carte source&lt;br /&gt;
const uint8_t DST_CS = 9;    // CS carte destination&lt;br /&gt;
&lt;br /&gt;
const size_t COPY_BUFFER_SIZE = 32;&lt;br /&gt;
uint8_t copyBuffer[COPY_BUFFER_SIZE];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SdFs sdSrc;&lt;br /&gt;
SdFs sdDst;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bool joinPath(const char* parent, const char* name, char* out, size_t outSize) {&lt;br /&gt;
  int written;&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(parent, &amp;quot;/&amp;quot;) == 0) {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;/%s&amp;quot;, name);&lt;br /&gt;
  } else {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;%s/%s&amp;quot;, parent, name);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return (written &amp;gt; 0 &amp;amp;&amp;amp; (size_t)written &amp;lt; outSize);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyFile(const char* path) {&lt;br /&gt;
  FsFile srcFile = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!srcFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile dstFile = sdDst.open(path, O_WRONLY | O_CREAT | O_TRUNC);&lt;br /&gt;
  if (!dstFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture destination : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    srcFile.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;Copie fichier : &amp;quot;);&lt;br /&gt;
  Serial.println(path);&lt;br /&gt;
&lt;br /&gt;
  while (true) {&lt;br /&gt;
    int32_t n = srcFile.read(copyBuffer, sizeof(copyBuffer));&lt;br /&gt;
&lt;br /&gt;
    if (n &amp;lt; 0) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur lecture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (n == 0) {&lt;br /&gt;
      break; // fin du fichier&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (dstFile.write(copyBuffer, n) != n) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur ecriture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  srcFile.close();&lt;br /&gt;
  dstFile.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyDirectory(const char* path) {&lt;br /&gt;
  FsFile dir = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!dir || !dir.isDir()) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture dossier source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    dir.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(path, &amp;quot;/&amp;quot;) != 0) {&lt;br /&gt;
    if (!sdDst.exists(path)) {&lt;br /&gt;
      if (!sdDst.mkdir(path, true)) {&lt;br /&gt;
        Serial.print(&amp;quot;Erreur creation dossier destination : &amp;quot;);&lt;br /&gt;
        Serial.println(path);&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile entry;&lt;br /&gt;
&lt;br /&gt;
  while (entry.openNext(&amp;amp;dir, O_RDONLY)) {&lt;br /&gt;
    char name[64];&lt;br /&gt;
    char childPath[128];&lt;br /&gt;
&lt;br /&gt;
    if (!entry.getName(name, sizeof(name))) {&lt;br /&gt;
      Serial.println(&amp;quot;Nom de fichier trop long ou erreur getName&amp;quot;);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      dir.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (strcmp(name, &amp;quot;.&amp;quot;) == 0 || strcmp(name, &amp;quot;..&amp;quot;) == 0) {&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!joinPath(path, name, childPath, sizeof(childPath))) {&lt;br /&gt;
      Serial.print(&amp;quot;Chemin trop long, ignore : &amp;quot;);&lt;br /&gt;
      Serial.println(name);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    bool isDir = entry.isDir();&lt;br /&gt;
    entry.close();&lt;br /&gt;
&lt;br /&gt;
    if (isDir) {&lt;br /&gt;
      Serial.print(&amp;quot;Entre dans dossier : &amp;quot;);&lt;br /&gt;
      Serial.println(childPath);&lt;br /&gt;
&lt;br /&gt;
      if (!copyDirectory(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      if (!copyFile(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  dir.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while (!Serial) {&lt;br /&gt;
    ;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  Serial.println(&amp;quot;=== Debut copie SD -&amp;gt; SD ===&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  //Met les 2 à l'état haut par défaut&lt;br /&gt;
  pinMode(SRC_CS, OUTPUT);&lt;br /&gt;
  pinMode(DST_CS, OUTPUT);&lt;br /&gt;
  digitalWrite(SRC_CS, HIGH);&lt;br /&gt;
  digitalWrite(DST_CS, HIGH);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte source&lt;br /&gt;
  if (!sdSrc.begin(SdSpiConfig(SRC_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte SOURCE&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte SOURCE OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte destination&lt;br /&gt;
  if (!sdDst.begin(SdSpiConfig(DST_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte DESTINATION&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte DESTINATION OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Lancement de la copie...&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if (copyDirectory(&amp;quot;/&amp;quot;)) {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie terminee avec succes ===&amp;quot;);&lt;br /&gt;
  } else {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie arretee sur erreur ===&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:V2_Sch%C3%A9ma_%C3%A9lec.png&amp;diff=12987</id>
		<title>Fichier:V2 Schéma élec.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:V2_Sch%C3%A9ma_%C3%A9lec.png&amp;diff=12987"/>
		<updated>2026-04-28T09:42:18Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;schéma électrique version 2&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12986</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12986"/>
		<updated>2026-04-28T09:24:19Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : modif&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Différentes étapes :&lt;br /&gt;
&lt;br /&gt;
HARDWARE :&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
SOFTWARE :&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs blocs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Informations en vrac :&lt;br /&gt;
&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD &lt;br /&gt;
&lt;br /&gt;
https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo1.png]]&lt;br /&gt;
&lt;br /&gt;
06/03/26: &lt;br /&gt;
&lt;br /&gt;
- Ebauche du schéma electrique&lt;br /&gt;
&lt;br /&gt;
- Création d'un Git sur Gitea pour futur dépot de l'avancement du projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d’écran n1 kicad.png]]&lt;br /&gt;
&lt;br /&gt;
15/03 -&amp;gt; 8/03&lt;br /&gt;
&lt;br /&gt;
- Schema electrique + PCB &lt;br /&gt;
&lt;br /&gt;
- PCB Corrigé:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d’écran ec4.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SOFTWARE :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pendant l'écriture du programme(13/04-&amp;gt;18/04), j’ai rencontré quelques problèmes techniques liés principalement aux contraintes matérielles et à la gestion des fichiers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le premier problème important concernait la gestion de la mémoire de l’Arduino. Au départ, j’avais défini un buffer de copie assez grand pour améliorer la vitesse de transfert. Cependant, lors de la compilation, j’obtenais une erreur indiquant que la mémoire disponible était dépassée (“data section exceeds available space in board”).&lt;br /&gt;
&lt;br /&gt;
Après reflexion, j’ai compris que la combinaison de la bibliothèque SdFat, des variables globales et du buffer dépassait la RAM disponibles sur l’arduino. Du coup, j’ai progressivement réduit la taille du buffer (jusqu’à 32 octets), ce qui a permis de faire rentrer le programme en mémoire, au prix d’une vitesse de copie plus faible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
J’ai eu un probleme de gestion des chemins de fichiers lors de la copie. En effet, pour parcourir récursivement les dossiers, il était nécessaire de reconstruire correctement les chemins complets. La fonction joinPath a permit d'eviter les erreurs liées à la taille des buffers. J’ai intégré des vérifications supplémentaires pour gérer les cas d’erreur potentiels (échec d’ouverture de fichier, chemin trop long, erreur de lecture/écriture), afin d'être plus sur du programme même avant le test sur matériel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme je ne peux pas encore tester physiquement les cartes, j’ai ajouté des messages Serial.print() pour que, lors du premier test matériel, je puisse identifier rapidement où le programme bloque.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enfin, j’ai rencontré des obstacles liées à la limitation matérielle de l’Arduino, notamment en termes de mémoire et de gestion simultanée de deux cartes SD sur le même bus SPI. Cela m’a obligé à optimiser le code et à bien comprendre l'utilisation de deux broches CS distinctes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vous trouverez la version actuelle de mon programme dans les Documents Rendus et sur le Git.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Git : https://gitea.plil.fr/lkachour/EC4.git&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SdFat.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const uint8_t SRC_CS = 10;   // CS carte source&lt;br /&gt;
const uint8_t DST_CS = 9;    // CS carte destination&lt;br /&gt;
&lt;br /&gt;
const size_t COPY_BUFFER_SIZE = 32;&lt;br /&gt;
uint8_t copyBuffer[COPY_BUFFER_SIZE];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SdFs sdSrc;&lt;br /&gt;
SdFs sdDst;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bool joinPath(const char* parent, const char* name, char* out, size_t outSize) {&lt;br /&gt;
  int written;&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(parent, &amp;quot;/&amp;quot;) == 0) {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;/%s&amp;quot;, name);&lt;br /&gt;
  } else {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;%s/%s&amp;quot;, parent, name);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return (written &amp;gt; 0 &amp;amp;&amp;amp; (size_t)written &amp;lt; outSize);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyFile(const char* path) {&lt;br /&gt;
  FsFile srcFile = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!srcFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile dstFile = sdDst.open(path, O_WRONLY | O_CREAT | O_TRUNC);&lt;br /&gt;
  if (!dstFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture destination : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    srcFile.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;Copie fichier : &amp;quot;);&lt;br /&gt;
  Serial.println(path);&lt;br /&gt;
&lt;br /&gt;
  while (true) {&lt;br /&gt;
    int32_t n = srcFile.read(copyBuffer, sizeof(copyBuffer));&lt;br /&gt;
&lt;br /&gt;
    if (n &amp;lt; 0) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur lecture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (n == 0) {&lt;br /&gt;
      break; // fin du fichier&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (dstFile.write(copyBuffer, n) != n) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur ecriture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  srcFile.close();&lt;br /&gt;
  dstFile.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyDirectory(const char* path) {&lt;br /&gt;
  FsFile dir = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!dir || !dir.isDir()) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture dossier source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    dir.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(path, &amp;quot;/&amp;quot;) != 0) {&lt;br /&gt;
    if (!sdDst.exists(path)) {&lt;br /&gt;
      if (!sdDst.mkdir(path, true)) {&lt;br /&gt;
        Serial.print(&amp;quot;Erreur creation dossier destination : &amp;quot;);&lt;br /&gt;
        Serial.println(path);&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile entry;&lt;br /&gt;
&lt;br /&gt;
  while (entry.openNext(&amp;amp;dir, O_RDONLY)) {&lt;br /&gt;
    char name[64];&lt;br /&gt;
    char childPath[128];&lt;br /&gt;
&lt;br /&gt;
    if (!entry.getName(name, sizeof(name))) {&lt;br /&gt;
      Serial.println(&amp;quot;Nom de fichier trop long ou erreur getName&amp;quot;);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      dir.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (strcmp(name, &amp;quot;.&amp;quot;) == 0 || strcmp(name, &amp;quot;..&amp;quot;) == 0) {&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!joinPath(path, name, childPath, sizeof(childPath))) {&lt;br /&gt;
      Serial.print(&amp;quot;Chemin trop long, ignore : &amp;quot;);&lt;br /&gt;
      Serial.println(name);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    bool isDir = entry.isDir();&lt;br /&gt;
    entry.close();&lt;br /&gt;
&lt;br /&gt;
    if (isDir) {&lt;br /&gt;
      Serial.print(&amp;quot;Entre dans dossier : &amp;quot;);&lt;br /&gt;
      Serial.println(childPath);&lt;br /&gt;
&lt;br /&gt;
      if (!copyDirectory(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      if (!copyFile(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  dir.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while (!Serial) {&lt;br /&gt;
    ;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  Serial.println(&amp;quot;=== Debut copie SD -&amp;gt; SD ===&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  //Met les 2 à l'état haut par défaut&lt;br /&gt;
  pinMode(SRC_CS, OUTPUT);&lt;br /&gt;
  pinMode(DST_CS, OUTPUT);&lt;br /&gt;
  digitalWrite(SRC_CS, HIGH);&lt;br /&gt;
  digitalWrite(DST_CS, HIGH);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte source&lt;br /&gt;
  if (!sdSrc.begin(SdSpiConfig(SRC_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte SOURCE&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte SOURCE OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte destination&lt;br /&gt;
  if (!sdDst.begin(SdSpiConfig(DST_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte DESTINATION&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte DESTINATION OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Lancement de la copie...&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if (copyDirectory(&amp;quot;/&amp;quot;)) {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie terminee avec succes ===&amp;quot;);&lt;br /&gt;
  } else {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie arretee sur erreur ===&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12985</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12985"/>
		<updated>2026-04-28T09:20:57Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : Ajout du travail effectué pendant la pause pédagogique&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Différentes étapes :&lt;br /&gt;
&lt;br /&gt;
HARDWARE :&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
SOFTWARE :&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs blocs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Informations en vrac :&lt;br /&gt;
&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD &lt;br /&gt;
&lt;br /&gt;
https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo1.png]]&lt;br /&gt;
&lt;br /&gt;
06/03/26: &lt;br /&gt;
&lt;br /&gt;
- Ebauche du schéma electrique&lt;br /&gt;
&lt;br /&gt;
- Création d'un Git sur Gitea pour futur dépot de l'avancement du projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d’écran n1 kicad.png]]&lt;br /&gt;
&lt;br /&gt;
15/03 -&amp;gt; 8/03&lt;br /&gt;
&lt;br /&gt;
- Schema electrique + PCB &lt;br /&gt;
&lt;br /&gt;
- PCB Corrigé:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d’écran ec4.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SOFTWARE :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pendant l'écriture du programme(13/04-&amp;gt;18/04), j’ai rencontré quelques problèmes techniques liés principalement aux contraintes matérielles et à la gestion des fichiers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le premier problème important concernait la gestion de la mémoire de l’Arduino. Au départ, j’avais défini un buffer de copie assez grand pour améliorer la vitesse de transfert. Cependant, lors de la compilation, j’obtenais une erreur indiquant que la mémoire disponible était dépassée (“data section exceeds available space in board”).&lt;br /&gt;
&lt;br /&gt;
Après reflexion, j’ai compris que la combinaison de la bibliothèque SdFat, des variables globales et du buffer dépassait la RAM disponibles sur l’arduino. Du coup, j’ai progressivement réduit la taille du buffer (jusqu’à 32 octets), ce qui a permis de faire rentrer le programme en mémoire, au prix d’une vitesse de copie plus faible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
J’ai eu un probleme de gestion des chemins de fichiers lors de la copie. En effet, pour parcourir récursivement les dossiers, il était nécessaire de reconstruire correctement les chemins complets. La fonction joinPath a permit d'eviter les erreurs liées à la taille des buffers. J’ai intégré des vérifications supplémentaires pour gérer les cas d’erreur potentiels (échec d’ouverture de fichier, chemin trop long, erreur de lecture/écriture), afin d'être plus sur du programme même avant le test sur matériel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme je ne peux pas encore tester physiquement les cartes, j’ai ajouté des messages Serial.print() pour que, lors du premier test matériel, je puisse identifier rapidement où le programme bloque.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Enfin, j’ai rencontré des obstacles liées à la limitation matérielle de l’Arduino, notamment en termes de mémoire et de gestion simultanée de deux cartes SD sur le même bus SPI. Cela m’a obligé à optimiser le code et à bien comprendre l'utilisation de deux broches CS distinctes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vous trouverez la version actuelle de mon programme dans les Documents Rendus.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Git : https://gitea.plil.fr/lkachour/EC4.git&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SdFat.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const uint8_t SRC_CS = 10;   // CS carte source&lt;br /&gt;
const uint8_t DST_CS = 9;    // CS carte destination&lt;br /&gt;
&lt;br /&gt;
const size_t COPY_BUFFER_SIZE = 32;&lt;br /&gt;
uint8_t copyBuffer[COPY_BUFFER_SIZE];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SdFs sdSrc;&lt;br /&gt;
SdFs sdDst;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bool joinPath(const char* parent, const char* name, char* out, size_t outSize) {&lt;br /&gt;
  int written;&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(parent, &amp;quot;/&amp;quot;) == 0) {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;/%s&amp;quot;, name);&lt;br /&gt;
  } else {&lt;br /&gt;
    written = snprintf(out, outSize, &amp;quot;%s/%s&amp;quot;, parent, name);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return (written &amp;gt; 0 &amp;amp;&amp;amp; (size_t)written &amp;lt; outSize);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyFile(const char* path) {&lt;br /&gt;
  FsFile srcFile = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!srcFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile dstFile = sdDst.open(path, O_WRONLY | O_CREAT | O_TRUNC);&lt;br /&gt;
  if (!dstFile) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture destination : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    srcFile.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;Copie fichier : &amp;quot;);&lt;br /&gt;
  Serial.println(path);&lt;br /&gt;
&lt;br /&gt;
  while (true) {&lt;br /&gt;
    int32_t n = srcFile.read(copyBuffer, sizeof(copyBuffer));&lt;br /&gt;
&lt;br /&gt;
    if (n &amp;lt; 0) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur lecture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (n == 0) {&lt;br /&gt;
      break; // fin du fichier&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (dstFile.write(copyBuffer, n) != n) {&lt;br /&gt;
      Serial.print(&amp;quot;Erreur ecriture : &amp;quot;);&lt;br /&gt;
      Serial.println(path);&lt;br /&gt;
      srcFile.close();&lt;br /&gt;
      dstFile.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  srcFile.close();&lt;br /&gt;
  dstFile.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool copyDirectory(const char* path) {&lt;br /&gt;
  FsFile dir = sdSrc.open(path, O_RDONLY);&lt;br /&gt;
  if (!dir || !dir.isDir()) {&lt;br /&gt;
    Serial.print(&amp;quot;Erreur ouverture dossier source : &amp;quot;);&lt;br /&gt;
    Serial.println(path);&lt;br /&gt;
    dir.close();&lt;br /&gt;
    return false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (strcmp(path, &amp;quot;/&amp;quot;) != 0) {&lt;br /&gt;
    if (!sdDst.exists(path)) {&lt;br /&gt;
      if (!sdDst.mkdir(path, true)) {&lt;br /&gt;
        Serial.print(&amp;quot;Erreur creation dossier destination : &amp;quot;);&lt;br /&gt;
        Serial.println(path);&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  FsFile entry;&lt;br /&gt;
&lt;br /&gt;
  while (entry.openNext(&amp;amp;dir, O_RDONLY)) {&lt;br /&gt;
    char name[64];&lt;br /&gt;
    char childPath[128];&lt;br /&gt;
&lt;br /&gt;
    if (!entry.getName(name, sizeof(name))) {&lt;br /&gt;
      Serial.println(&amp;quot;Nom de fichier trop long ou erreur getName&amp;quot;);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      dir.close();&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (strcmp(name, &amp;quot;.&amp;quot;) == 0 || strcmp(name, &amp;quot;..&amp;quot;) == 0) {&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!joinPath(path, name, childPath, sizeof(childPath))) {&lt;br /&gt;
      Serial.print(&amp;quot;Chemin trop long, ignore : &amp;quot;);&lt;br /&gt;
      Serial.println(name);&lt;br /&gt;
      entry.close();&lt;br /&gt;
      continue;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    bool isDir = entry.isDir();&lt;br /&gt;
    entry.close();&lt;br /&gt;
&lt;br /&gt;
    if (isDir) {&lt;br /&gt;
      Serial.print(&amp;quot;Entre dans dossier : &amp;quot;);&lt;br /&gt;
      Serial.println(childPath);&lt;br /&gt;
&lt;br /&gt;
      if (!copyDirectory(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      if (!copyFile(childPath)) {&lt;br /&gt;
        dir.close();&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  dir.close();&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while (!Serial) {&lt;br /&gt;
    ;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  Serial.println(&amp;quot;=== Debut copie SD -&amp;gt; SD ===&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  //Met les 2 à l'état haut par défaut&lt;br /&gt;
  pinMode(SRC_CS, OUTPUT);&lt;br /&gt;
  pinMode(DST_CS, OUTPUT);&lt;br /&gt;
  digitalWrite(SRC_CS, HIGH);&lt;br /&gt;
  digitalWrite(DST_CS, HIGH);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte source&lt;br /&gt;
  if (!sdSrc.begin(SdSpiConfig(SRC_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte SOURCE&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte SOURCE OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // Initialisation de la carte destination&lt;br /&gt;
  if (!sdDst.begin(SdSpiConfig(DST_CS, SHARED_SPI, SD_SCK_MHZ(8)))) {&lt;br /&gt;
    Serial.println(&amp;quot;Echec init carte DESTINATION&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Carte DESTINATION OK&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Lancement de la copie...&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if (copyDirectory(&amp;quot;/&amp;quot;)) {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie terminee avec succes ===&amp;quot;);&lt;br /&gt;
  } else {&lt;br /&gt;
    Serial.println(&amp;quot;=== Copie arretee sur erreur ===&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12917</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12917"/>
		<updated>2026-04-13T10:19:16Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Différentes étapes :&lt;br /&gt;
&lt;br /&gt;
HARDWARE :&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
SOFTWARE :&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs blocs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Informations en vrac :&lt;br /&gt;
&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD &lt;br /&gt;
&lt;br /&gt;
https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo1.png]]&lt;br /&gt;
&lt;br /&gt;
06/03/26: &lt;br /&gt;
&lt;br /&gt;
- Ebauche du schéma electrique&lt;br /&gt;
&lt;br /&gt;
- Création d'un Git sur Gitea pour futur dépot de l'avancement du projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d’écran n1 kicad.png]]&lt;br /&gt;
&lt;br /&gt;
15/03 -&amp;gt; 8/03&lt;br /&gt;
&lt;br /&gt;
- Schema electrique + PCB &lt;br /&gt;
&lt;br /&gt;
- PCB Corrigé:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d’écran ec4.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Git : https://gitea.plil.fr/lkachour/EC4.git&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12916</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12916"/>
		<updated>2026-04-13T10:16:42Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Différentes étapes :&lt;br /&gt;
&lt;br /&gt;
HARDWARE :&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
SOFTWARE :&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs blocs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Informations en vrac :&lt;br /&gt;
&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD &lt;br /&gt;
&lt;br /&gt;
https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo1.png]]&lt;br /&gt;
&lt;br /&gt;
06/03/26: &lt;br /&gt;
&lt;br /&gt;
- Ebauche du schéma electrique&lt;br /&gt;
&lt;br /&gt;
- Création d'un Git sur Gitea pour futur dépot de l'avancement du projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d’écran n1 kicad.png]]&lt;br /&gt;
&lt;br /&gt;
15/03 -&amp;gt; 8/03&lt;br /&gt;
&lt;br /&gt;
- Schema electrique + PCB &lt;br /&gt;
&lt;br /&gt;
- PCB Corrigé:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture_d'écran_ec4|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Git : https://gitea.plil.fr/lkachour/EC4.git&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Capture_d%E2%80%99%C3%A9cran_ec4.png&amp;diff=12915</id>
		<title>Fichier:Capture d’écran ec4.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Capture_d%E2%80%99%C3%A9cran_ec4.png&amp;diff=12915"/>
		<updated>2026-04-13T10:12:41Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PCB ec4&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12914</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12914"/>
		<updated>2026-04-13T10:11:14Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : /* Ajout PCB corrigé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Différentes étapes :&lt;br /&gt;
&lt;br /&gt;
HARDWARE :&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
SOFTWARE :&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs blocs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Informations en vrac :&lt;br /&gt;
&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD &lt;br /&gt;
&lt;br /&gt;
https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo1.png]]&lt;br /&gt;
&lt;br /&gt;
06/03/26: &lt;br /&gt;
&lt;br /&gt;
- Ebauche du schéma electrique&lt;br /&gt;
&lt;br /&gt;
- Création d'un Git sur Gitea pour futur dépot de l'avancement du projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d’écran n1 kicad.png]]&lt;br /&gt;
&lt;br /&gt;
15/03 -&amp;gt; 8/03&lt;br /&gt;
&lt;br /&gt;
- Schema electrique + PCB &lt;br /&gt;
&lt;br /&gt;
- PCB Corrigé:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d'écran ec4|vignette]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Git : https://gitea.plil.fr/lkachour/EC4.git&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12773</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12773"/>
		<updated>2026-03-06T11:10:31Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Différentes étapes :&lt;br /&gt;
&lt;br /&gt;
HARDWARE :&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
SOFTWARE :&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs blocs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Informations en vrac :&lt;br /&gt;
&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD &lt;br /&gt;
&lt;br /&gt;
https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo1.png]]&lt;br /&gt;
&lt;br /&gt;
06/03/26: &lt;br /&gt;
&lt;br /&gt;
- Ebauche du schéma electrique&lt;br /&gt;
&lt;br /&gt;
- Création d'un Git sur Gitea pour futur dépot de l'avancement du projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d’écran n1 kicad.png]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Git : https://gitea.plil.fr/lkachour/EC4.git&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12772</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12772"/>
		<updated>2026-03-06T11:10:22Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Différentes étapes :&lt;br /&gt;
&lt;br /&gt;
HARDWARE :&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
SOFTWARE :&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs blocs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Informations en vrac :&lt;br /&gt;
&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD &lt;br /&gt;
&lt;br /&gt;
https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo1.png]]&lt;br /&gt;
&lt;br /&gt;
06/03/26: &lt;br /&gt;
&lt;br /&gt;
- Ebauche du schéma electrique&lt;br /&gt;
&lt;br /&gt;
- Création d'un Git sur Gitea pour futur dépot de l'avancement du projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d’écran n1 kicad.png]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Git :https://gitea.plil.fr/lkachour/EC4.git&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12771</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12771"/>
		<updated>2026-03-06T11:08:09Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Différentes étapes :&lt;br /&gt;
&lt;br /&gt;
HARDWARE :&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
SOFTWARE :&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs blocs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Informations en vrac :&lt;br /&gt;
&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD &lt;br /&gt;
&lt;br /&gt;
https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo1.png]]&lt;br /&gt;
&lt;br /&gt;
06/03/26: &lt;br /&gt;
&lt;br /&gt;
- Ebauche du schéma electrique&lt;br /&gt;
&lt;br /&gt;
- Création d'un Git sur Gitea pour futur dépot de l'avancement du projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d’écran n1 kicad.png]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12770</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12770"/>
		<updated>2026-03-06T11:07:50Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Différentes étapes :&lt;br /&gt;
&lt;br /&gt;
HARDWARE :&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
SOFTWARE :&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs blocs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Informations en vrac :&lt;br /&gt;
&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD &lt;br /&gt;
&lt;br /&gt;
https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo1.png]]&lt;br /&gt;
&lt;br /&gt;
06/03/26: &lt;br /&gt;
- Ebauche du schéma electrique&lt;br /&gt;
- Création d'un Git sur Gitea pour futur dépot de l'avancement du projet&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Capture d’écran n1 kicad.png]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Capture_d%E2%80%99%C3%A9cran_n1_kicad.png&amp;diff=12769</id>
		<title>Fichier:Capture d’écran n1 kicad.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Capture_d%E2%80%99%C3%A9cran_n1_kicad.png&amp;diff=12769"/>
		<updated>2026-03-06T11:06:05Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Début du schéma elec&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12728</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12728"/>
		<updated>2026-03-02T15:43:30Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Différentes étapes :&lt;br /&gt;
&lt;br /&gt;
HARDWARE :&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
SOFTWARE :&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs blocs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Informations en vrac :&lt;br /&gt;
&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo1.png]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
= Bibliographie =&lt;br /&gt;
https://www.circuitstate.com/tutorials/interfacing-catalex-micro-sd-card-module-with-arduino/&lt;br /&gt;
https://www.electronicwings.com/arduino/microsd-card-interfacing-with-arduino&lt;br /&gt;
https://randomnerdtutorials.com/guide-to-sd-card-module-with-arduino/&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12727</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12727"/>
		<updated>2026-03-02T15:41:30Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Différentes étapes :&lt;br /&gt;
&lt;br /&gt;
HARDWARE :&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
SOFTWARE :&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs blocs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Informations en vrac :&lt;br /&gt;
&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo1.png]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12726</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12726"/>
		<updated>2026-03-02T15:40:44Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Différentes étapes :&lt;br /&gt;
&lt;br /&gt;
HARDWARE :&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
SOFTWARE :&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs blocs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Informations en vrac :&lt;br /&gt;
&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo1.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Photo1.png&amp;diff=12725</id>
		<title>Fichier:Photo1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Photo1.png&amp;diff=12725"/>
		<updated>2026-03-02T15:40:36Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Branchement de la carte SD.&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12724</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12724"/>
		<updated>2026-03-02T15:35:34Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
Différentes étapes :&lt;br /&gt;
&lt;br /&gt;
HARDWARE&lt;br /&gt;
-Identification des composants nécessaires&lt;br /&gt;
-Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
-Routage Kicad&lt;br /&gt;
-Impression de la carte&lt;br /&gt;
-Soudure des composants&lt;br /&gt;
&lt;br /&gt;
SOFTWARE&lt;br /&gt;
-Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
-Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
-Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
-Vérifier la copie&lt;br /&gt;
-avertir utilisateur via LED&lt;br /&gt;
-Copier plusieurs blocs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Informations en vrac :&lt;br /&gt;
&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12723</id>
		<title>SE3 2025/2026 EC4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC4&amp;diff=12723"/>
		<updated>2026-03-02T15:32:45Z</updated>

		<summary type="html">&lt;p&gt;Lkachour : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser, en C, un copieur de carte micro-SD avec un Arduino Nano :&lt;br /&gt;
&lt;br /&gt;
* commencez par concevoir une carte électronique pour connecter deux connecteurs de carte micro-SD à l'Arduino ;&lt;br /&gt;
* les deux connecteurs de cartes micro-SD doivent être connectées sur le bus SPI avec deux CS différents ;&lt;br /&gt;
* réalisez la carte, i.e. soudez les connecteurs pour l'Arduino Nano et les connecteurs micro-SD ;&lt;br /&gt;
* écrivez un programme pour effectuer la copie complète de la première micro-SD sur la seconde :&lt;br /&gt;
** lisez un bloc de la première carte en mémoire ;&lt;br /&gt;
** écrivez le bloc sur la second carte ;&lt;br /&gt;
** indiquez avec la LED de l'Arduino qu'un bloc a été copié avec succès ;&lt;br /&gt;
** passez au bloc suivant ;&lt;br /&gt;
** en cas d'erreur indiquez sa nature avec la LED de l'Arduino.&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Nano avec adaptateur USB/série et câble USB ;&lt;br /&gt;
* connecteurs femelles pour PCB ;&lt;br /&gt;
* 2 connecteurs pour carte micro-SD ;&lt;br /&gt;
* 2 carte micro-SD pour les tests.&lt;br /&gt;
&lt;br /&gt;
Un programme C pour la gestion d'une carte micro-SD avec un ATmega328p est donné : [[File:2025-EC4-SD.zip]].&lt;br /&gt;
 &lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
Différentes étapes :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
HARDWARE&lt;br /&gt;
    •    Identification des composants nécessaires&lt;br /&gt;
    •    Schéma élec Kicad (trouver les bonnes empreintes + branchements)&lt;br /&gt;
    •    Routage Kicad&lt;br /&gt;
    •    Impression de la carte&lt;br /&gt;
    •    Soudure des composants&lt;br /&gt;
&lt;br /&gt;
SOFTWARE&lt;br /&gt;
    •    Faire fonctionner UNE seule carte (initialisation / lire un seul bloc / afficher via UART pour debug)&lt;br /&gt;
    •    Gestion des deux cartes simultanément (lecture simultanée)&lt;br /&gt;
    •    Copier un bloc (lire sur carte A / écrire sur carte B)&lt;br /&gt;
    •    Vérifier la copie&lt;br /&gt;
    •    avertir utilisateur via LED&lt;br /&gt;
    •    Copier plusieurs blocs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Informations en vrac :&lt;br /&gt;
&lt;br /&gt;
Arduino Nano : 5V&lt;br /&gt;
Carte SD : 3.3V&lt;br /&gt;
donc probablement besoin d'un diviseur de tension.&lt;br /&gt;
&lt;br /&gt;
Informations trouvées sur la lecture de carte SD https://passionelectronique.fr/carte-sd-arduino/#branchement-et-cablage-dune-micro-sd-card-a-un-arduino-uno-nano-ou-mega-port-spi&lt;br /&gt;
CS inactif = HIGH&lt;br /&gt;
un seul CS LOW à la fois&lt;br /&gt;
côté câblage : prévoir pull-up léger sur CS (ex 47k ou 10k) pour éviter une sélection aléatoire au reset.&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Lkachour</name></author>
	</entry>
</feed>