<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://projets-se.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alecomt1</id>
	<title>projets-se.plil.fr - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://projets-se.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alecomt1"/>
	<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Alecomt1"/>
	<updated>2026-05-14T03:43:04Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=7223</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=7223"/>
		<updated>2025-01-21T12:46:37Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine.&lt;br /&gt;
&lt;br /&gt;
Lors de ce projet nous allons réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur une carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===Modification Shield===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de notre shield]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===Assemblage et test du Shield===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur le shield puis testé les leds et un afficheur 7 segments connecté (en ISP) sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===Test de la carte SD===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|left|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour notre ordonnanceur il est important d'initialiser les taches, notamment leur pointeur de pile. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int t){&lt;br /&gt;
    uint16_t oldSP = SP;&lt;br /&gt;
    SP = Taches[t].stack;&lt;br /&gt;
    uint16_t adresse = (uint16_t)Taches[t].start;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff));&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00) &amp;gt;&amp;gt; 8));&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[t].stack = SP;&lt;br /&gt;
    SP = oldSP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque interruption de l'ISR (toutes les 20ms) on sauvegarde le contexte de la tache en cours, l'ordonnanceur passe à la tache suivante et on restaure le contexte de cette tache.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){&lt;br /&gt;
    /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[courant].stack = SP;&lt;br /&gt;
    /* Appel à l'ordonnanceur */&lt;br /&gt;
    ordonnanceur();&lt;br /&gt;
    /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
    SP = Taches[courant].stack;&lt;br /&gt;
    portRESTORE_Registers();&lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tâche série===&lt;br /&gt;
&lt;br /&gt;
Une fois l’ordonnanceur capable de lancer deux tâches en parallèle, nous nous sommes attaqués à la communication série de la carte par USB. Pour ce faire, nous utilisons l’application minicom coté PC qui permet une connexion série. Il faut initialiser les paramètres de la connexion, notre carte renvoie le message reçu dans le terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Ci joint les deux taches responsables de l'envoi et de la reception de données par le protocole série, &amp;lt;code&amp;gt;serial_buffer&amp;lt;/code&amp;gt; est une variable globale utilisée pour stocker les messages reçus et à envoyer. Les fonctions &amp;lt;code&amp;gt;Serial_Transmit()&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;Serial_Receive()&amp;lt;/code&amp;gt; sont déclarées dans &amp;lt;code&amp;gt;pico_serial.h&amp;lt;/code&amp;gt; et proviennent de la documentation AVR.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SerialWrite(){&lt;br /&gt;
    while (1){&lt;br /&gt;
        Serial_Transmit('\r\n');&lt;br /&gt;
        Serial_Transmit(serial_buffer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SerialRead(){&lt;br /&gt;
    while(1){&lt;br /&gt;
        serial_buffer = Serial_Receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SerialSetup.png|thumb|right|400px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|left|400px|Message reçu par le port série]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Lors de ce test notre atmega envoi &amp;quot;LOULOUTOINE&amp;quot; en boucle sur le port série.&lt;br /&gt;
&lt;br /&gt;
===Tâche 7 segments===&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons maintenant une tâche permettant de communiquer avec l'écran 7 segments par la communication SPI (toujours en parallèle des autres tâches).&lt;br /&gt;
Voici par exemple deux des fonctions SPI, il faut préalablement initialiser la communication SPI avec les registres SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SPI_send(uint8_t data) {&lt;br /&gt;
    DISPLAY_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_PIN); //On met le pin CS de l'écran à l'état bas pour l'activer&lt;br /&gt;
    SPDR = data;&lt;br /&gt;
    while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
    DISPLAY_PORT |= (1&amp;lt;&amp;lt;DISPLAY_PIN); // On relache l'écran &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clearDisplaySPI() {&lt;br /&gt;
    SPI_send(0x76); // Commande pour effacer l'écran et remettre le curseur a gauche&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour afficher un caractère sur l'écran il suffit donc d'appeler &amp;lt;code&amp;gt;SPI_send()&amp;lt;/code&amp;gt; en passant en paramètre le caractère à envoyer.&lt;br /&gt;
[[File:Pico2024_B8_ordos7s_video.mp4|thumb|center|600px|Les 5 tâches en parallèle]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Etat endormi===&lt;br /&gt;
&lt;br /&gt;
Une fois que les tâches ont été correctement séparées, il a fallu ajuster notre ordonnanceur pour garantir que les délais de chaque tâche soient respectés. En effet, avec notre méthode actuelle qui repose sur l'utilisation de la fonction &amp;lt;code&amp;gt;_delays_ms()&amp;lt;/code&amp;gt;  à chaque ajout de tâche, le temps total d'exécution augmente de manière cumulative. Par exemple, avec deux tâches, un délai de 200 ms prendrait 400 ms, et avec trois tâches 600 ms. Pour résoudre ce problème, nous avons décidé d'ajouter un état à chaque tâche, permettant de les &amp;quot;endormir&amp;quot; lorsqu'elles ne sont pas appelées, et de les &amp;quot;réveiller&amp;quot; lorsqu'elles le sont. Grâce à ce système, chaque fois qu'une tâche endormie est exécutée, on décrémente son timer de 20 millisecondes à chaque cycle. Ainsi chaque tâche respecte son délai sans interférer avec l'exécution des autres tâches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void Sleeping(){&lt;br /&gt;
  for (int i = 0; i &amp;lt; NB_TASKS;i++){&lt;br /&gt;
    if (Taches[i].etat.sit == ENDORMI) Taches[i].etat.time.tempsendormi -= 20;&lt;br /&gt;
    if (Taches[i].etat.time.tempsendormi &amp;lt;= 0) {&lt;br /&gt;
      Taches[i].etat.time.tempsendormi = 0;&lt;br /&gt;
      Taches[i].etat.sit = ACTIF;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre nouvel ordonnanceur qui appelle &amp;lt;code&amp;gt;Sleeping()&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void ordonnanceur(){&lt;br /&gt;
    PORTC ^= 0x01; // On fait clignoter une des led (J1) à chaque fois que l'ordonnanceur est appelé&lt;br /&gt;
    Sleeping();&lt;br /&gt;
    do{&lt;br /&gt;
       courant ++;&lt;br /&gt;
       if (courant == NB_TASKS) courant = 0;&lt;br /&gt;
    } while (Taches[courant].etat.sit == ENDORMI);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction endors la tâche pendant la durée t (en millisecondes).&lt;br /&gt;
On remet ensuite le timer à 0 et on lance l'interruption manuellement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void makeSleep(int t){&lt;br /&gt;
  Taches[courant].etat.sit = ENDORMI;&lt;br /&gt;
  Taches[courant].etat.time.tempsendormi = t;&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
  TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici notre struture modifiée pour ajouter l'état endormi&lt;br /&gt;
On utilise une union pour representer le temps d'endormissement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define ENDORMI 1&lt;br /&gt;
#define ACTIF 0&lt;br /&gt;
&lt;br /&gt;
typedef union{&lt;br /&gt;
  int tempsendormi;&lt;br /&gt;
} Time;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
  int situation;  //1 pour endormi, 0 pour éveillé &lt;br /&gt;
  Time time;&lt;br /&gt;
} Etat;&lt;br /&gt;
&lt;br /&gt;
typedef struct task{&lt;br /&gt;
  void (*start)(void);&lt;br /&gt;
  uint16_t stack;&lt;br /&gt;
  Etat etat;&lt;br /&gt;
} task;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmi notre groupe, nous sommes le binôme en charge de la carte mère. &lt;br /&gt;
Nous avons décidé d'utiliser un Atmega 328p qui sera programmé avec &amp;lt;code&amp;gt;avr-dude&amp;lt;/code&amp;gt; pour cela notre carte mère comportera également un Atmega8u2 qui servira de programmateur et d'interface serie/USB. &lt;br /&gt;
&lt;br /&gt;
Nous avons prévu une alimentation par un port USB C, ayant connecté les pins CC1 et CC2 à des resistances de 5.1k nous obtenons 5v et 3A max. Il sera donc simple d'alimenter notre carte avec un câble USB, chargeur de téléphone ou alimentation de Raspberry Pi par exemple et d'obtenir jusqu'à 15w ce qui est largement suffisant pour notre carte mère et les cartes filles des autres binômes.&lt;br /&gt;
&lt;br /&gt;
Notre PCB est terminé, voici le schéma et un rendu du PCB final. &lt;br /&gt;
[[File:Pico2024_B8_sch_PCB.pdf|thumb|left|469x469px|Le schéma final (en 3 pages)]]&lt;br /&gt;
[[File:Pico2024_B8_rendu_PCB.png|thumb|right|588x588px|Le PCB final]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Les fichiers GERBER sont disponibles dans notre dépot [https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT]&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre PCB, pour commencer nous assemblons les composants minimums pour faire clignoter une LED avec le 328p.&lt;br /&gt;
[[File:Pico2024_B8_PCB_recu.jpeg|thumb|left|500px|Le naked PCB]]&lt;br /&gt;
[[File:Pico2024_B8_PC1.jpeg|thumb|right|500px|Ca fonctionne]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
En programmant par le port ISP avec une Arduino as ISP on arrive à faire clignoter la LED reliée sur PC1 du 328p. On soude ensuite le minimum pour tester l'AtMega8u2, on arrive à faire clignoter deux led reliées a ses broches. &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_8U2.jpeg|thumb|left|412x412px|Les atmega sont soudés]]&lt;br /&gt;
[[File:Pico2024_B8_double_blinking.mp4|thumb|right|500px|Blinking lights]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_erreur.png|thumb|left|364x364px|D- et D+ inversés]]Nous installons maintenant le firmware dans le 8u2 et le bootloader dans le 328p afin de pouvoir programmer le 328p en utilisant la connexion USB du 8u2. &amp;lt;br&amp;gt;Pour cela il faut d'abord effacer le 8u2 avec les commandes suivantes : &amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -t&amp;lt;/code&amp;gt;, Il faut ensuite envoyer la commande &amp;lt;code&amp;gt;erase&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;quit&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
On peux maintenant modifier les fuses pour notre crystal externe à 16MHz : &amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xde:m -U hfuse:w:0xd9:m -U efuse:w:0xf4:m&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Puis flasher le firmware 8u2 provenant d'une Arduino UNO : &amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U flash:w:8u2_firmware.hex&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la programmation du Bootloader du 328p on utilise directement la fonction &amp;quot;burn bootloader&amp;quot; de l'IDE Arduino. &lt;br /&gt;
&lt;br /&gt;
Malheureusement notre carte n'est pas reconnue par l'ordinateur avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt;. Avec &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt; nous voyons qu'un périphérique USB est détecté mais avec des erreurs, nous essayons de ressouder notre connecteur USB-C à l'air chaud et vérifions au multimètre que les pins sont bien soudés mais nous avons toujours les mêmes erreurs. Après vérification de notre schéma une erreur s'est glissée lors du commit 181625dc05 fait par monsieur Redon, les pins D+ et D- sont inversés. Nous modifions notre carte pour corriger cette inversion. Succès !! notre carte est maintenant bien visible en USB. [[File:Pico2024_B8_lsusb.png|thumb|right|500px|Reconnue (comme une Arduino UNO)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après soudure des connecteurs HE10, des leds et de leurs résistances correspondantes, nous avons téleversé notre code pour l'ordonnanceur. Les leds clignotent bien et l'écran 7 segments connecté à la PicoMother fonctionne parfaitement et simultanément.[[File:Pico2024_B8_mother_soudee.png|thumb|left|500px|Carte soudée]]&lt;br /&gt;
[[File:Pico2024_B8_mother_ordonnanceur.mp4|thumb|right|500px|Ordonnanceur sur notre carte]]&lt;br /&gt;
&lt;br /&gt;
Nous testons également que la carte SD est détectable par notre carte mère et c'est bien le cas.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Système de fichier=&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_secteur0.jpg|thumb|right|500px|Le contenu du secteur 0]]&lt;br /&gt;
Nous passons maintenant à la dernière partie du projet, le système de fichiers. Pour cela nous commençons par essayer de lire et d'écrire un secteur de la carte SD (en mode SPI une carte SD et accessible par blocs (secteurs) de 512 octets), nous utilisons la bibliothèque suivante pour faciliter la gestion de la carte SD :[https://github.com/ryanj1234/SD_TUTORIAL_PART4 Bibliothèque SD]. En modifiant cette bibliothèque on arrive à lire et écrire un secteur de la carte SD. Sur cette photo on lit le secteur 0 de la carte SD, 0x55AA  à la fin du secteur signifie que la carte est actuellement formatée avec un système de fichier MBR.&lt;br /&gt;
&lt;br /&gt;
Après avoir confirmé que nous pouvons lire le bloc 0 nous avons essayé de lire les blocs suivants, or nous obtenions une erreur &amp;lt;code&amp;gt;Address out of range&amp;lt;/code&amp;gt;. Le problème vient du fait qu'on utilise une carte SD standard (pas SDHC) et qu'il faut multiplier le numéro de bloc par 512. En effet les cartes SDHC et SDXC sont block-addressed, le bloc 0 est à l'adresse 0, le bloc 1 à l'adresse 1 mais les cartes SD (comme la notre) sont bytes-addressed, le bloc 0 est à l'adresse 0, le bloc 1 à l'adresse 512... Nous avons donc créé une fonction intermédiaire qui multiplie le numero de bloc voulu par 512 (décalage de 9 bits) pour obtenir l'adresse du bloc. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void lecture_block(uint32_t block){&lt;br /&gt;
    uint8_t res, token;&lt;br /&gt;
    uint32_t addr = block &amp;lt;&amp;lt; 9; //Multiplication par 512&lt;br /&gt;
    // Lecture du bloc (secteur)&lt;br /&gt;
    res = SD_readSingleBlock(addr, buffer, &amp;amp;token); //res reçoit un octet décrivant l'état de la carte SD (pas utilisé dans notre code)&lt;br /&gt;
    // Impression en cas d'erreur&lt;br /&gt;
    if(!(token &amp;amp; 0xF0)){&lt;br /&gt;
        UART_pputs(&amp;quot;Erreur :\r\n&amp;quot;);&lt;br /&gt;
        SD_printDataErrToken(token);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Comme on ne peut lire ou écrire qu'un bloc complet, nous avons implémenté un buffer d'une taille de 512 octets que l'on modifie puis écris dans un bloc de la carte SD ou qui reçoit un bloc complet de celle-ci, ce buffer utilise un quart de la mémoire vive de notre atmega (2ko sur un atmega328p). &lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois les fonctions de lecture et d'écriture de blocs sur la carte SD adaptées à notre carte mère et carte SD nous avons commencé à créer notre pico système de fichiers.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
[[File:Pico2024_B8_schema_sysfich.png|thumb|center|800px|Schéma de notre système de fichiers]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt; &lt;br /&gt;
Nous avons utilisé deux blocs de la carte comme superblocs (table of content) qui contiennent des &amp;quot;descripteurs&amp;quot; de fichiers et pointent vers le premier bloc au sont stockées les données (4 blocs consécutifs). Nous avons choisi de que nos fichiers doivent avoir un nom de 14 caractères maximum, ainsi notre structure Fichier à une taille de 16 octets et on peut en mettre 32 par superbloc (32*16 = 512), deux superblocs suffiront donc pour accéder à 64 fichiers. En tout notre système de fichiers utilise 132096 octets sur la carte SD (4*64*512 + 2*512).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct Fichier{&lt;br /&gt;
    uint8_t available;&lt;br /&gt;
    uint8_t starting_block;&lt;br /&gt;
    char name[FILE_NAME];&lt;br /&gt;
}typedef Fichier; //Taille 16 octets&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons donc commencé par implémenter la fonction format qui efface tout les blocs de données et rempli les superblocs de structures Fichier disponibles, avec le starting_block adéquat et un nom vide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void FORMAT(){&lt;br /&gt;
    UART_pputs(&amp;quot;Formatage...\r\n&amp;quot;);&lt;br /&gt;
    //On rempli le buffer de 0x00&lt;br /&gt;
    clear_buffer();&lt;br /&gt;
    for(int i = 0; i &amp;lt; TOC_BLOCKS + (BLOCK_PAR_FILE * MAX_FILE); i++){&lt;br /&gt;
        ecriture_block(i); //on remplit tous les blocs de données et la TOC avec les 0x00&lt;br /&gt;
    }&lt;br /&gt;
    Fichier fichier; //Création d'une struct Fichier&lt;br /&gt;
    fichier.available = 0x01; //Le fichier est disponible &lt;br /&gt;
    memset(fichier.name, 0x00, FILE_NAME); //nom vide (charactere 00 en hex)&lt;br /&gt;
    //On écrit la TOC dans le buffer (on place des structs Fichier avec available -&amp;gt; 0x01)&lt;br /&gt;
    for (int toc = 0; toc &amp;lt; TOC_BLOCKS; toc++) {&lt;br /&gt;
        for (int j = 0; j &amp;lt; MAX_FILE; j++) {&lt;br /&gt;
            fichier.starting_block = TOC_BLOCKS + (j * BLOCK_PAR_FILE) + (toc * FILE_PAR_TOC);&lt;br /&gt;
            int start_index = j * sizeof(Fichier);&lt;br /&gt;
            memcpy(&amp;amp;buffer[start_index], &amp;amp;fichier, sizeof(Fichier)); // Copie de la structure&lt;br /&gt;
        }&lt;br /&gt;
        ecriture_block(toc); // Écriture du buffer dans le superbloc correspondant&lt;br /&gt;
    }&lt;br /&gt;
    UART_pputs(&amp;quot;Formatage terminé\r\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la commande LS() on parcours les deux superblocs et on envoie sur le port série le noms des fichiers présents sur la carte SD.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void LS(){&lt;br /&gt;
    UART_pputs(&amp;quot;Fichier(s) sur la carte SD :\r\n&amp;quot;);&lt;br /&gt;
    for (int toc = 0; toc &amp;lt; TOC_BLOCKS; toc++){ // On boucle sur les differents blocs de TOC&lt;br /&gt;
        lecture_block(toc);&lt;br /&gt;
        for (int i = 0; i &amp;lt; FILE_PAR_TOC; i++){&lt;br /&gt;
            // Création d'un struct fichier&lt;br /&gt;
            Fichier fichier;&lt;br /&gt;
            // On rempli Fichier avec les infos du buffer&lt;br /&gt;
            memcpy(&amp;amp;fichier, &amp;amp;buffer[i * sizeof(Fichier)], sizeof(Fichier));&lt;br /&gt;
            // Fichier non dispo donc un fichier est stocké sur la carte&lt;br /&gt;
            if (fichier.available == 0x00) {&lt;br /&gt;
                UART_puts(fichier.name); //Affichage du nom du fichier trouvé&lt;br /&gt;
                UART_pputs(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite implémenté les fonctions suivantes:&lt;br /&gt;
* APPEND() : crée un fichier sur la carte SD, si il existe déjà les données passées en paramètre sont ajoutées à la fin du fichier existant&lt;br /&gt;
* READ() : renvoie sur le port série le contenu du fichier demandé&lt;br /&gt;
* REMOVE() : supprime le fichier demandé, on &amp;quot;vide&amp;quot; son descripteur dans le superbloc puis on rempli les 4 blocs de données de 0x00&lt;br /&gt;
* RENAME() : permet de renommer un fichier, on remplace simplement sont nom dans son descripteur (pas de modification des blocs de données)&lt;br /&gt;
* COPY() : copie d'un fichier source vers un nouveau fichier destination&lt;br /&gt;
&lt;br /&gt;
Toutes ces fonctions et les fonctions intermédiaires sont dans le fichier &amp;lt;code&amp;gt;SysFich/sys_fichier.c&amp;lt;/code&amp;gt; dans notre dépot GIT.&lt;br /&gt;
&lt;br /&gt;
Pour finir nous avons créé une interface en série pour envoyer les commandes à la carte mère et recevoir le contenu des fichiers. &lt;br /&gt;
[[File:Pico2024_B8_sysfich.mp4|thumb|center|800px|Utilisation de notre système de fichiers]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la vidéo on peut bien constater que la carte SD crée bien les fichiers comme on le demande, on arrive à les lire (&amp;lt;code&amp;gt;63 6F 75 63 6F 75 20 63 27 65 73 74 20 6C 6F 75 69 73&amp;lt;/code&amp;gt; en hexa donne bien le message &amp;lt;code&amp;gt;coucou c'est louis&amp;lt;/code&amp;gt;), à concaténer du texte à la fin d'un fichier, de regarder les différents fichiers, de les copier et également les supprimer à volonté.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ce projet était très intéressant et très complet sur beaucoup d'aspect différent de la formation, que ce soit pour la conception de la carte, la partie programmation avec l'ordonnanceur et la partie système de fichiers. Mais bien que le commencement fut très satisfaisant et que notre progression était plutôt rapide pour un projet de cette envergure, nous avons eu pas mal de soucis pour la partie gestion des fichiers sur la carte SD. Que ce soit les recherches pour comprendre le fonctionnement de la mémoire d'une carte SD ou encore réussir à communiquer avec par SPI, notre avancement fut fortement ralenti pendant plusieurs séances. Nous n'avons malheureusement pas pu finir ce projet totalement, nous aurions par la suite dû gérer les connexions des différentes cartes filles. C'est à dire que celles-ci puissent utiliser le système de fichiers pour pouvoir enregistrer et lire sur la carte SD (envoie de commandes par SPI plutôt que UART).&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=7222</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=7222"/>
		<updated>2025-01-21T12:35:04Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Système de fichier */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine.&lt;br /&gt;
&lt;br /&gt;
Lors de ce projet nous allons réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur une carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===Modification Shield===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de notre shield]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===Assemblage et test du Shield===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur le shield puis testé les leds et un afficheur 7 segments connecté (en ISP) sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===Test de la carte SD===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|left|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour notre ordonnanceur il est important d'initialiser les taches, notamment leur pointeur de pile. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int t){&lt;br /&gt;
    uint16_t oldSP = SP;&lt;br /&gt;
    SP = Taches[t].stack;&lt;br /&gt;
    uint16_t adresse = (uint16_t)Taches[t].start;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff));&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00) &amp;gt;&amp;gt; 8));&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[t].stack = SP;&lt;br /&gt;
    SP = oldSP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque interruption de l'ISR (toutes les 20ms) on sauvegarde le contexte de la tache en cours, l'ordonnanceur passe à la tache suivante et on restaure le contexte de cette tache.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){&lt;br /&gt;
    /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[courant].stack = SP;&lt;br /&gt;
    /* Appel à l'ordonnanceur */&lt;br /&gt;
    ordonnanceur();&lt;br /&gt;
    /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
    SP = Taches[courant].stack;&lt;br /&gt;
    portRESTORE_Registers();&lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tâche série===&lt;br /&gt;
&lt;br /&gt;
Une fois l’ordonnanceur capable de lancer deux tâches en parallèle, nous nous sommes attaqués à la communication série de la carte par USB. Pour ce faire, nous utilisons l’application minicom coté PC qui permet une connexion série. Il faut initialiser les paramètres de la connexion, notre carte renvoie le message reçu dans le terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Ci joint les deux taches responsables de l'envoi et de la reception de données par le protocole série, &amp;lt;code&amp;gt;serial_buffer&amp;lt;/code&amp;gt; est une variable globale utilisée pour stocker les messages reçus et à envoyer. Les fonctions &amp;lt;code&amp;gt;Serial_Transmit()&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;Serial_Receive()&amp;lt;/code&amp;gt; sont déclarées dans &amp;lt;code&amp;gt;pico_serial.h&amp;lt;/code&amp;gt; et proviennent de la documentation AVR.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SerialWrite(){&lt;br /&gt;
    while (1){&lt;br /&gt;
        Serial_Transmit('\r\n');&lt;br /&gt;
        Serial_Transmit(serial_buffer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SerialRead(){&lt;br /&gt;
    while(1){&lt;br /&gt;
        serial_buffer = Serial_Receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SerialSetup.png|thumb|right|400px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|left|400px|Message reçu par le port série]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Lors de ce test notre atmega envoi &amp;quot;LOULOUTOINE&amp;quot; en boucle sur le port série.&lt;br /&gt;
&lt;br /&gt;
===Tâche 7 segments===&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons maintenant une tâche permettant de communiquer avec l'écran 7 segments par la communication SPI (toujours en parallèle des autres tâches).&lt;br /&gt;
Voici par exemple deux des fonctions SPI, il faut préalablement initialiser la communication SPI avec les registres SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SPI_send(uint8_t data) {&lt;br /&gt;
    DISPLAY_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_PIN); //On met le pin CS de l'écran à l'état bas pour l'activer&lt;br /&gt;
    SPDR = data;&lt;br /&gt;
    while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
    DISPLAY_PORT |= (1&amp;lt;&amp;lt;DISPLAY_PIN); // On relache l'écran &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clearDisplaySPI() {&lt;br /&gt;
    SPI_send(0x76); // Commande pour effacer l'écran et remettre le curseur a gauche&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour afficher un caractère sur l'écran il suffit donc d'appeler &amp;lt;code&amp;gt;SPI_send()&amp;lt;/code&amp;gt; en passant en paramètre le caractère à envoyer.&lt;br /&gt;
[[File:Pico2024_B8_ordos7s_video.mp4|thumb|center|600px|Les 5 tâches en parallèle]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Etat endormi===&lt;br /&gt;
&lt;br /&gt;
Une fois que les tâches ont été correctement séparées, il a fallu ajuster notre ordonnanceur pour garantir que les délais de chaque tâche soient respectés. En effet, avec notre méthode actuelle qui repose sur l'utilisation de la fonction &amp;lt;code&amp;gt;_delays_ms()&amp;lt;/code&amp;gt;  à chaque ajout de tâche, le temps total d'exécution augmente de manière cumulative. Par exemple, avec deux tâches, un délai de 200 ms prendrait 400 ms, et avec trois tâches 600 ms. Pour résoudre ce problème, nous avons décidé d'ajouter un état à chaque tâche, permettant de les &amp;quot;endormir&amp;quot; lorsqu'elles ne sont pas appelées, et de les &amp;quot;réveiller&amp;quot; lorsqu'elles le sont. Grâce à ce système, chaque fois qu'une tâche endormie est exécutée, on décrémente son timer de 20 millisecondes à chaque cycle. Ainsi chaque tâche respecte son délai sans interférer avec l'exécution des autres tâches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void Sleeping(){&lt;br /&gt;
  for (int i = 0; i &amp;lt; NB_TASKS;i++){&lt;br /&gt;
    if (Taches[i].etat.sit == ENDORMI) Taches[i].etat.time.tempsendormi -= 20;&lt;br /&gt;
    if (Taches[i].etat.time.tempsendormi &amp;lt;= 0) {&lt;br /&gt;
      Taches[i].etat.time.tempsendormi = 0;&lt;br /&gt;
      Taches[i].etat.sit = ACTIF;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre nouvel ordonnanceur qui appelle &amp;lt;code&amp;gt;Sleeping()&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void ordonnanceur(){&lt;br /&gt;
    PORTC ^= 0x01; // On fait clignoter une des led (J1) à chaque fois que l'ordonnanceur est appelé&lt;br /&gt;
    Sleeping();&lt;br /&gt;
    do{&lt;br /&gt;
       courant ++;&lt;br /&gt;
       if (courant == NB_TASKS) courant = 0;&lt;br /&gt;
    } while (Taches[courant].etat.sit == ENDORMI);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction endors la tâche pendant la durée t (en millisecondes).&lt;br /&gt;
On remet ensuite le timer à 0 et on lance l'interruption manuellement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void makeSleep(int t){&lt;br /&gt;
  Taches[courant].etat.sit = ENDORMI;&lt;br /&gt;
  Taches[courant].etat.time.tempsendormi = t;&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
  TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici notre struture modifiée pour ajouter l'état endormi&lt;br /&gt;
On utilise une union pour representer le temps d'endormissement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define ENDORMI 1&lt;br /&gt;
#define ACTIF 0&lt;br /&gt;
&lt;br /&gt;
typedef union{&lt;br /&gt;
  int tempsendormi;&lt;br /&gt;
} Time;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
  int situation;  //1 pour endormi, 0 pour éveillé &lt;br /&gt;
  Time time;&lt;br /&gt;
} Etat;&lt;br /&gt;
&lt;br /&gt;
typedef struct task{&lt;br /&gt;
  void (*start)(void);&lt;br /&gt;
  uint16_t stack;&lt;br /&gt;
  Etat etat;&lt;br /&gt;
} task;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmi notre groupe, nous sommes le binôme en charge de la carte mère. &lt;br /&gt;
Nous avons décidé d'utiliser un Atmega 328p qui sera programmé avec &amp;lt;code&amp;gt;avr-dude&amp;lt;/code&amp;gt; pour cela notre carte mère comportera également un Atmega8u2 qui servira de programmateur et d'interface serie/USB. &lt;br /&gt;
&lt;br /&gt;
Nous avons prévu une alimentation par un port USB C, ayant connecté les pins CC1 et CC2 à des resistances de 5.1k nous obtenons 5v et 3A max. Il sera donc simple d'alimenter notre carte avec un câble USB, chargeur de téléphone ou alimentation de Raspberry Pi par exemple et d'obtenir jusqu'à 15w ce qui est largement suffisant pour notre carte mère et les cartes filles des autres binômes.&lt;br /&gt;
&lt;br /&gt;
Notre PCB est terminé, voici le schéma et un rendu du PCB final. &lt;br /&gt;
[[File:Pico2024_B8_sch_PCB.pdf|thumb|left|469x469px|Le schéma final (en 3 pages)]]&lt;br /&gt;
[[File:Pico2024_B8_rendu_PCB.png|thumb|right|588x588px|Le PCB final]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Les fichiers GERBER sont disponibles dans notre dépot [https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT]&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre PCB, pour commencer nous assemblons les composants minimums pour faire clignoter une LED avec le 328p.&lt;br /&gt;
[[File:Pico2024_B8_PCB_recu.jpeg|thumb|left|500px|Le naked PCB]]&lt;br /&gt;
[[File:Pico2024_B8_PC1.jpeg|thumb|right|500px|Ca fonctionne]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
En programmant par le port ISP avec une Arduino as ISP on arrive à faire clignoter la LED reliée sur PC1 du 328p. On soude ensuite le minimum pour tester l'AtMega8u2, on arrive à faire clignoter deux led reliées a ses broches. &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_8U2.jpeg|thumb|left|412x412px|Les atmega sont soudés]]&lt;br /&gt;
[[File:Pico2024_B8_double_blinking.mp4|thumb|right|500px|Blinking lights]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_erreur.png|thumb|left|364x364px|D- et D+ inversés]]Nous installons maintenant le firmware dans le 8u2 et le bootloader dans le 328p afin de pouvoir programmer le 328p en utilisant la connexion USB du 8u2. &amp;lt;br&amp;gt;Pour cela il faut d'abord effacer le 8u2 avec les commandes suivantes : &amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -t&amp;lt;/code&amp;gt;, Il faut ensuite envoyer la commande &amp;lt;code&amp;gt;erase&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;quit&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
On peux maintenant modifier les fuses pour notre crystal externe à 16MHz : &amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xde:m -U hfuse:w:0xd9:m -U efuse:w:0xf4:m&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Puis flasher le firmware 8u2 provenant d'une Arduino UNO : &amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U flash:w:8u2_firmware.hex&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la programmation du Bootloader du 328p on utilise directement la fonction &amp;quot;burn bootloader&amp;quot; de l'IDE Arduino. &lt;br /&gt;
&lt;br /&gt;
Malheureusement notre carte n'est pas reconnue par l'ordinateur avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt;. Avec &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt; nous voyons qu'un périphérique USB est détecté mais avec des erreurs, nous essayons de ressouder notre connecteur USB-C à l'air chaud et vérifions au multimètre que les pins sont bien soudés mais nous avons toujours les mêmes erreurs. Après vérification de notre schéma une erreur s'est glissée lors du commit 181625dc05 fait par monsieur Redon, les pins D+ et D- sont inversés. Nous modifions notre carte pour corriger cette inversion. Succès !! notre carte est maintenant bien visible en USB. [[File:Pico2024_B8_lsusb.png|thumb|right|500px|Reconnue (comme une Arduino UNO)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après soudure des connecteurs HE10, des leds et de leurs résistances correspondantes, nous avons téleversé notre code pour l'ordonnanceur. Les leds clignotent bien et l'écran 7 segments connecté à la PicoMother fonctionne parfaitement et simultanément.[[File:Pico2024_B8_mother_soudee.png|thumb|left|500px|Carte soudée]]&lt;br /&gt;
[[File:Pico2024_B8_mother_ordonnanceur.mp4|thumb|right|500px|Ordonnanceur sur notre carte]]&lt;br /&gt;
&lt;br /&gt;
Nous testons également que la carte SD est détectable par notre carte mère et c'est bien le cas.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Système de fichier=&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_secteur0.jpg|thumb|right|500px|Le contenu du secteur 0]]&lt;br /&gt;
Nous passons maintenant à la dernière partie du projet, le système de fichiers. Pour cela nous commençons par essayer de lire et d'écrire un secteur de la carte SD (en mode SPI une carte SD et accessible par blocs (secteurs) de 512 octets), nous utilisons la bibliothèque suivante pour faciliter la gestion de la carte SD :[https://github.com/ryanj1234/SD_TUTORIAL_PART4 Bibliothèque SD]. En modifiant cette bibliothèque on arrive à lire et écrire un secteur de la carte SD. Sur cette photo on lit le secteur 0 de la carte SD, 0x55AA  à la fin du secteur signifie que la carte est actuellement formatée avec un système de fichier MBR.&lt;br /&gt;
&lt;br /&gt;
Après avoir confirmé que nous pouvons lire le bloc 0 nous avons essayé de lire les blocs suivants, or nous obtenions une erreur &amp;lt;code&amp;gt;Address out of range&amp;lt;/code&amp;gt;. Le problème vient du fait qu'on utilise une carte SD standard (pas SDHC) et qu'il faut multiplier le numéro de bloc par 512. En effet les cartes SDHC et SDXC sont block-addressed, le bloc 0 est à l'adresse 0, le bloc 1 à l'adresse 1 mais les cartes SD (comme la notre) sont bytes-addressed, le bloc 0 est à l'adresse 0, le bloc 1 à l'adresse 512... Nous avons donc créé une fonction intermédiaire qui multiplie le numero de bloc voulu par 512 (décalage de 9 bits) pour obtenir l'adresse du bloc. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void lecture_block(uint32_t block){&lt;br /&gt;
    uint8_t res, token;&lt;br /&gt;
    uint32_t addr = block &amp;lt;&amp;lt; 9; //Multiplication par 512&lt;br /&gt;
    // Lecture du bloc (secteur)&lt;br /&gt;
    res = SD_readSingleBlock(addr, buffer, &amp;amp;token); //res reçoit un octet décrivant l'état de la carte SD (pas utilisé dans notre code)&lt;br /&gt;
    // Impression en cas d'erreur&lt;br /&gt;
    if(!(token &amp;amp; 0xF0)){&lt;br /&gt;
        UART_pputs(&amp;quot;Erreur :\r\n&amp;quot;);&lt;br /&gt;
        SD_printDataErrToken(token);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Comme on ne peut lire ou écrire qu'un bloc complet, nous avons implémenté un buffer d'une taille de 512 octets que l'on modifie puis écris dans un bloc de la carte SD ou qui reçoit un bloc complet de celle-ci, ce buffer utilise un quart de la mémoire vive de notre atmega (2ko sur un atmega328p). &lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois les fonctions de lecture et d'écriture de blocs sur la carte SD adaptées à notre carte mère et carte SD nous avons commencé à créer notre pico système de fichiers.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
[[File:Pico2024_B8_schema_sysfich.png|thumb|center|800px|Schéma de notre système de fichiers]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt; &lt;br /&gt;
Nous avons utilisé deux blocs de la carte comme superblocs (table of content) qui contiennent des &amp;quot;descripteurs&amp;quot; de fichiers et pointent vers le premier bloc au sont stockées les données (4 blocs consécutifs). Nous avons choisi de que nos fichiers doivent avoir un nom de 14 caractères maximum, ainsi notre structure Fichier à une taille de 16 octets et on peut en mettre 32 par superbloc (32*16 = 512), deux superblocs suffiront donc pour accéder à 64 fichiers. En tout notre système de fichiers utilise 132096 octets sur la carte SD (4*64*512 + 2*512).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct Fichier{&lt;br /&gt;
    uint8_t available;&lt;br /&gt;
    uint8_t starting_block;&lt;br /&gt;
    char name[FILE_NAME];&lt;br /&gt;
}typedef Fichier; //Taille 16 octets&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons donc commencé par implémenter la fonction format qui efface tout les blocs de données et rempli les superblocs de structures Fichier disponibles, avec le starting_block adéquat et un nom vide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void FORMAT(){&lt;br /&gt;
    UART_pputs(&amp;quot;Formatage...\r\n&amp;quot;);&lt;br /&gt;
    //On rempli le buffer de 0x00&lt;br /&gt;
    clear_buffer();&lt;br /&gt;
    for(int i = 0; i &amp;lt; TOC_BLOCKS + (BLOCK_PAR_FILE * MAX_FILE); i++){&lt;br /&gt;
        ecriture_block(i); //on remplit tous les blocs de données et la TOC avec les 0x00&lt;br /&gt;
    }&lt;br /&gt;
    Fichier fichier; //Création d'une struct Fichier&lt;br /&gt;
    fichier.available = 0x01; //Le fichier est disponible &lt;br /&gt;
    memset(fichier.name, 0x00, FILE_NAME); //nom vide (charactere 00 en hex)&lt;br /&gt;
    //On écrit la TOC dans le buffer (on place des structs Fichier avec available -&amp;gt; 0x01)&lt;br /&gt;
    for (int toc = 0; toc &amp;lt; TOC_BLOCKS; toc++) {&lt;br /&gt;
        for (int j = 0; j &amp;lt; MAX_FILE; j++) {&lt;br /&gt;
            fichier.starting_block = TOC_BLOCKS + (j * BLOCK_PAR_FILE) + (toc * FILE_PAR_TOC);&lt;br /&gt;
            int start_index = j * sizeof(Fichier);&lt;br /&gt;
            memcpy(&amp;amp;buffer[start_index], &amp;amp;fichier, sizeof(Fichier)); // Copie de la structure&lt;br /&gt;
        }&lt;br /&gt;
        ecriture_block(toc); // Écriture du buffer dans le superbloc correspondant&lt;br /&gt;
    }&lt;br /&gt;
    UART_pputs(&amp;quot;Formatage terminé\r\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la commande LS() on parcours les deux superblocs et on envoie sur le port série le noms des fichiers présents sur la carte SD.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void LS(){&lt;br /&gt;
    UART_pputs(&amp;quot;Fichier(s) sur la carte SD :\r\n&amp;quot;);&lt;br /&gt;
    for (int toc = 0; toc &amp;lt; TOC_BLOCKS; toc++){ // On boucle sur les differents blocs de TOC&lt;br /&gt;
        lecture_block(toc);&lt;br /&gt;
        for (int i = 0; i &amp;lt; FILE_PAR_TOC; i++){&lt;br /&gt;
            // Création d'un struct fichier&lt;br /&gt;
            Fichier fichier;&lt;br /&gt;
            // On rempli Fichier avec les infos du buffer&lt;br /&gt;
            memcpy(&amp;amp;fichier, &amp;amp;buffer[i * sizeof(Fichier)], sizeof(Fichier));&lt;br /&gt;
            // Fichier non dispo donc un fichier est stocké sur la carte&lt;br /&gt;
            if (fichier.available == 0x00) {&lt;br /&gt;
                UART_puts(fichier.name); //Affichage du nom du fichier trouvé&lt;br /&gt;
                UART_pputs(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite implémenté les fonctions suivantes:&lt;br /&gt;
* APPEND() : crée un fichier sur la carte SD, si il existe déjà les données passées en paramètre sont ajoutées à la fin du fichier existant&lt;br /&gt;
* READ() : renvoie sur le port série le contenu du fichier demandé&lt;br /&gt;
* REMOVE() : supprime le fichier demandé, on &amp;quot;vide&amp;quot; son descripteur dans le superbloc puis on rempli les 4 blocs de données de 0x00&lt;br /&gt;
* RENAME() : permet de renommer un fichier, on remplace simplement sont nom dans son descripteur (pas de modification des blocs de données)&lt;br /&gt;
* COPY() : copie d'un fichier source vers un nouveau fichier destination&lt;br /&gt;
&lt;br /&gt;
Toutes ces fonctions et les fonctions intermédiaires sont dans le fichier &amp;lt;code&amp;gt;SysFich/sys_fichier.c&amp;lt;/code&amp;gt; dans notre dépot GIT.&lt;br /&gt;
&lt;br /&gt;
Pour finir nous avons créé une interface en série pour envoyer les commandes à la carte mère et recevoir le contenu des fichiers. &lt;br /&gt;
[[File:Pico2024_B8_sysfich.mp4|thumb|center|800px|Utilisation de notre système de fichiers]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la vidéo on peut bien constater que la carte SD crée bien les fichiers comme on le demande, on arrive à les lire (&amp;lt;code&amp;gt;63 6F 75 63 6F 75 20 63 27 65 73 74 20 6C 6F 75 69 73&amp;lt;/code&amp;gt; en hexa donne bien le message &amp;lt;code&amp;gt;coucou c'est louis&amp;lt;/code&amp;gt;), à concaténer du texte à la fin d'un fichier, de regarder les différents fichiers, de les copier et également les supprimer à volonté.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=7221</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=7221"/>
		<updated>2025-01-21T12:29:11Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Système de fichier */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine.&lt;br /&gt;
&lt;br /&gt;
Lors de ce projet nous allons réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur une carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===Modification Shield===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de notre shield]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===Assemblage et test du Shield===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur le shield puis testé les leds et un afficheur 7 segments connecté (en ISP) sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===Test de la carte SD===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|left|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour notre ordonnanceur il est important d'initialiser les taches, notamment leur pointeur de pile. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int t){&lt;br /&gt;
    uint16_t oldSP = SP;&lt;br /&gt;
    SP = Taches[t].stack;&lt;br /&gt;
    uint16_t adresse = (uint16_t)Taches[t].start;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff));&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00) &amp;gt;&amp;gt; 8));&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[t].stack = SP;&lt;br /&gt;
    SP = oldSP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque interruption de l'ISR (toutes les 20ms) on sauvegarde le contexte de la tache en cours, l'ordonnanceur passe à la tache suivante et on restaure le contexte de cette tache.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){&lt;br /&gt;
    /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[courant].stack = SP;&lt;br /&gt;
    /* Appel à l'ordonnanceur */&lt;br /&gt;
    ordonnanceur();&lt;br /&gt;
    /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
    SP = Taches[courant].stack;&lt;br /&gt;
    portRESTORE_Registers();&lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tâche série===&lt;br /&gt;
&lt;br /&gt;
Une fois l’ordonnanceur capable de lancer deux tâches en parallèle, nous nous sommes attaqués à la communication série de la carte par USB. Pour ce faire, nous utilisons l’application minicom coté PC qui permet une connexion série. Il faut initialiser les paramètres de la connexion, notre carte renvoie le message reçu dans le terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Ci joint les deux taches responsables de l'envoi et de la reception de données par le protocole série, &amp;lt;code&amp;gt;serial_buffer&amp;lt;/code&amp;gt; est une variable globale utilisée pour stocker les messages reçus et à envoyer. Les fonctions &amp;lt;code&amp;gt;Serial_Transmit()&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;Serial_Receive()&amp;lt;/code&amp;gt; sont déclarées dans &amp;lt;code&amp;gt;pico_serial.h&amp;lt;/code&amp;gt; et proviennent de la documentation AVR.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SerialWrite(){&lt;br /&gt;
    while (1){&lt;br /&gt;
        Serial_Transmit('\r\n');&lt;br /&gt;
        Serial_Transmit(serial_buffer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SerialRead(){&lt;br /&gt;
    while(1){&lt;br /&gt;
        serial_buffer = Serial_Receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SerialSetup.png|thumb|right|400px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|left|400px|Message reçu par le port série]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Lors de ce test notre atmega envoi &amp;quot;LOULOUTOINE&amp;quot; en boucle sur le port série.&lt;br /&gt;
&lt;br /&gt;
===Tâche 7 segments===&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons maintenant une tâche permettant de communiquer avec l'écran 7 segments par la communication SPI (toujours en parallèle des autres tâches).&lt;br /&gt;
Voici par exemple deux des fonctions SPI, il faut préalablement initialiser la communication SPI avec les registres SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SPI_send(uint8_t data) {&lt;br /&gt;
    DISPLAY_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_PIN); //On met le pin CS de l'écran à l'état bas pour l'activer&lt;br /&gt;
    SPDR = data;&lt;br /&gt;
    while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
    DISPLAY_PORT |= (1&amp;lt;&amp;lt;DISPLAY_PIN); // On relache l'écran &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clearDisplaySPI() {&lt;br /&gt;
    SPI_send(0x76); // Commande pour effacer l'écran et remettre le curseur a gauche&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour afficher un caractère sur l'écran il suffit donc d'appeler &amp;lt;code&amp;gt;SPI_send()&amp;lt;/code&amp;gt; en passant en paramètre le caractère à envoyer.&lt;br /&gt;
[[File:Pico2024_B8_ordos7s_video.mp4|thumb|center|600px|Les 5 tâches en parallèle]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Etat endormi===&lt;br /&gt;
&lt;br /&gt;
Une fois que les tâches ont été correctement séparées, il a fallu ajuster notre ordonnanceur pour garantir que les délais de chaque tâche soient respectés. En effet, avec notre méthode actuelle qui repose sur l'utilisation de la fonction &amp;lt;code&amp;gt;_delays_ms()&amp;lt;/code&amp;gt;  à chaque ajout de tâche, le temps total d'exécution augmente de manière cumulative. Par exemple, avec deux tâches, un délai de 200 ms prendrait 400 ms, et avec trois tâches 600 ms. Pour résoudre ce problème, nous avons décidé d'ajouter un état à chaque tâche, permettant de les &amp;quot;endormir&amp;quot; lorsqu'elles ne sont pas appelées, et de les &amp;quot;réveiller&amp;quot; lorsqu'elles le sont. Grâce à ce système, chaque fois qu'une tâche endormie est exécutée, on décrémente son timer de 20 millisecondes à chaque cycle. Ainsi chaque tâche respecte son délai sans interférer avec l'exécution des autres tâches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void Sleeping(){&lt;br /&gt;
  for (int i = 0; i &amp;lt; NB_TASKS;i++){&lt;br /&gt;
    if (Taches[i].etat.sit == ENDORMI) Taches[i].etat.time.tempsendormi -= 20;&lt;br /&gt;
    if (Taches[i].etat.time.tempsendormi &amp;lt;= 0) {&lt;br /&gt;
      Taches[i].etat.time.tempsendormi = 0;&lt;br /&gt;
      Taches[i].etat.sit = ACTIF;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre nouvel ordonnanceur qui appelle &amp;lt;code&amp;gt;Sleeping()&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void ordonnanceur(){&lt;br /&gt;
    PORTC ^= 0x01; // On fait clignoter une des led (J1) à chaque fois que l'ordonnanceur est appelé&lt;br /&gt;
    Sleeping();&lt;br /&gt;
    do{&lt;br /&gt;
       courant ++;&lt;br /&gt;
       if (courant == NB_TASKS) courant = 0;&lt;br /&gt;
    } while (Taches[courant].etat.sit == ENDORMI);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction endors la tâche pendant la durée t (en millisecondes).&lt;br /&gt;
On remet ensuite le timer à 0 et on lance l'interruption manuellement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void makeSleep(int t){&lt;br /&gt;
  Taches[courant].etat.sit = ENDORMI;&lt;br /&gt;
  Taches[courant].etat.time.tempsendormi = t;&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
  TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici notre struture modifiée pour ajouter l'état endormi&lt;br /&gt;
On utilise une union pour representer le temps d'endormissement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define ENDORMI 1&lt;br /&gt;
#define ACTIF 0&lt;br /&gt;
&lt;br /&gt;
typedef union{&lt;br /&gt;
  int tempsendormi;&lt;br /&gt;
} Time;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
  int situation;  //1 pour endormi, 0 pour éveillé &lt;br /&gt;
  Time time;&lt;br /&gt;
} Etat;&lt;br /&gt;
&lt;br /&gt;
typedef struct task{&lt;br /&gt;
  void (*start)(void);&lt;br /&gt;
  uint16_t stack;&lt;br /&gt;
  Etat etat;&lt;br /&gt;
} task;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmi notre groupe, nous sommes le binôme en charge de la carte mère. &lt;br /&gt;
Nous avons décidé d'utiliser un Atmega 328p qui sera programmé avec &amp;lt;code&amp;gt;avr-dude&amp;lt;/code&amp;gt; pour cela notre carte mère comportera également un Atmega8u2 qui servira de programmateur et d'interface serie/USB. &lt;br /&gt;
&lt;br /&gt;
Nous avons prévu une alimentation par un port USB C, ayant connecté les pins CC1 et CC2 à des resistances de 5.1k nous obtenons 5v et 3A max. Il sera donc simple d'alimenter notre carte avec un câble USB, chargeur de téléphone ou alimentation de Raspberry Pi par exemple et d'obtenir jusqu'à 15w ce qui est largement suffisant pour notre carte mère et les cartes filles des autres binômes.&lt;br /&gt;
&lt;br /&gt;
Notre PCB est terminé, voici le schéma et un rendu du PCB final. &lt;br /&gt;
[[File:Pico2024_B8_sch_PCB.pdf|thumb|left|469x469px|Le schéma final (en 3 pages)]]&lt;br /&gt;
[[File:Pico2024_B8_rendu_PCB.png|thumb|right|588x588px|Le PCB final]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Les fichiers GERBER sont disponibles dans notre dépot [https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT]&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre PCB, pour commencer nous assemblons les composants minimums pour faire clignoter une LED avec le 328p.&lt;br /&gt;
[[File:Pico2024_B8_PCB_recu.jpeg|thumb|left|500px|Le naked PCB]]&lt;br /&gt;
[[File:Pico2024_B8_PC1.jpeg|thumb|right|500px|Ca fonctionne]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
En programmant par le port ISP avec une Arduino as ISP on arrive à faire clignoter la LED reliée sur PC1 du 328p. On soude ensuite le minimum pour tester l'AtMega8u2, on arrive à faire clignoter deux led reliées a ses broches. &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_8U2.jpeg|thumb|left|412x412px|Les atmega sont soudés]]&lt;br /&gt;
[[File:Pico2024_B8_double_blinking.mp4|thumb|right|500px|Blinking lights]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_erreur.png|thumb|left|364x364px|D- et D+ inversés]]Nous installons maintenant le firmware dans le 8u2 et le bootloader dans le 328p afin de pouvoir programmer le 328p en utilisant la connexion USB du 8u2. &amp;lt;br&amp;gt;Pour cela il faut d'abord effacer le 8u2 avec les commandes suivantes : &amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -t&amp;lt;/code&amp;gt;, Il faut ensuite envoyer la commande &amp;lt;code&amp;gt;erase&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;quit&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
On peux maintenant modifier les fuses pour notre crystal externe à 16MHz : &amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xde:m -U hfuse:w:0xd9:m -U efuse:w:0xf4:m&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Puis flasher le firmware 8u2 provenant d'une Arduino UNO : &amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U flash:w:8u2_firmware.hex&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la programmation du Bootloader du 328p on utilise directement la fonction &amp;quot;burn bootloader&amp;quot; de l'IDE Arduino. &lt;br /&gt;
&lt;br /&gt;
Malheureusement notre carte n'est pas reconnue par l'ordinateur avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt;. Avec &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt; nous voyons qu'un périphérique USB est détecté mais avec des erreurs, nous essayons de ressouder notre connecteur USB-C à l'air chaud et vérifions au multimètre que les pins sont bien soudés mais nous avons toujours les mêmes erreurs. Après vérification de notre schéma une erreur s'est glissée lors du commit 181625dc05 fait par monsieur Redon, les pins D+ et D- sont inversés. Nous modifions notre carte pour corriger cette inversion. Succès !! notre carte est maintenant bien visible en USB. [[File:Pico2024_B8_lsusb.png|thumb|right|500px|Reconnue (comme une Arduino UNO)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après soudure des connecteurs HE10, des leds et de leurs résistances correspondantes, nous avons téleversé notre code pour l'ordonnanceur. Les leds clignotent bien et l'écran 7 segments connecté à la PicoMother fonctionne parfaitement et simultanément.[[File:Pico2024_B8_mother_soudee.png|thumb|left|500px|Carte soudée]]&lt;br /&gt;
[[File:Pico2024_B8_mother_ordonnanceur.mp4|thumb|right|500px|Ordonnanceur sur notre carte]]&lt;br /&gt;
&lt;br /&gt;
Nous testons également que la carte SD est détectable par notre carte mère et c'est bien le cas.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Système de fichier=&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_secteur0.jpg|thumb|right|500px|Le contenu du secteur 0]]&lt;br /&gt;
Nous passons maintenant à la dernière partie du projet, le système de fichiers. Pour cela nous commençons par essayer de lire et d'écrire un secteur de la carte SD (en mode SPI une carte SD et accessible par blocs (secteurs) de 512 octets), nous utilisons la bibliothèque suivante pour faciliter la gestion de la carte SD :[https://github.com/ryanj1234/SD_TUTORIAL_PART4 Bibliothèque SD]. En modifiant cette bibliothèque on arrive à lire et écrire un secteur de la carte SD. Sur cette photo on lit le secteur 0 de la carte SD, 0x55AA  à la fin du secteur signifie que la carte est actuellement formatée avec un système de fichier MBR.&lt;br /&gt;
&lt;br /&gt;
Après avoir confirmé que nous pouvons lire le bloc 0 nous avons essayé de lire les blocs suivants, or nous obtenions une erreur &amp;lt;code&amp;gt;Address out of range&amp;lt;/code&amp;gt;. Le problème vient du fait qu'on utilise une carte SD standard (pas SDHC) et qu'il faut multiplier le numéro de bloc par 512. En effet les cartes SDHC et SDXC sont block-addressed, le bloc 0 est à l'adresse 0, le bloc 1 à l'adresse 1 mais les cartes SD (comme la notre) sont bytes-addressed, le bloc 0 est à l'adresse 0, le bloc 1 à l'adresse 512... Nous avons donc créé une fonction intermédiaire qui multiplie le numero de bloc voulu par 512 (décalage de 9 bits) pour obtenir l'adresse du bloc. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void lecture_block(uint32_t block){&lt;br /&gt;
    uint8_t res, token;&lt;br /&gt;
    uint32_t addr = block &amp;lt;&amp;lt; 9; //Multiplication par 512&lt;br /&gt;
    // Lecture du bloc (secteur)&lt;br /&gt;
    res = SD_readSingleBlock(addr, buffer, &amp;amp;token); //res reçoit un octet décrivant l'état de la carte SD (pas utilisé dans notre code)&lt;br /&gt;
    // Impression en cas d'erreur&lt;br /&gt;
    if(!(token &amp;amp; 0xF0)){&lt;br /&gt;
        UART_pputs(&amp;quot;Erreur :\r\n&amp;quot;);&lt;br /&gt;
        SD_printDataErrToken(token);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois les fonctions de lecture et d'écriture de blocs sur la carte SD adaptées à notre carte mère et carte SD nous avons commencé à créer notre pico système de fichiers.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
[[File:Pico2024_B8_schema_sysfich.png|thumb|center|800px|Schéma de notre système de fichiers]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt; &lt;br /&gt;
Nous avons utilisé deux blocs de la carte comme superblocs (table of content) qui contiennent des &amp;quot;descripteurs&amp;quot; de fichiers et pointent vers le premier bloc au sont stockées les données (4 blocs consécutifs). Nous avons choisi de que nos fichiers doivent avoir un nom de 14 caractères maximum, ainsi notre structure Fichier à une taille de 16 octets et on peut en mettre 32 par superbloc (32*16 = 512), deux superblocs suffiront donc pour accéder à 64 fichiers. En tout notre système de fichiers utilise 132096 octets sur la carte SD (4*64*512 + 2*512).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct Fichier{&lt;br /&gt;
    uint8_t available;&lt;br /&gt;
    uint8_t starting_block;&lt;br /&gt;
    char name[FILE_NAME];&lt;br /&gt;
}typedef Fichier; //Taille 16 octets&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons donc commencé par implémenter la fonction format qui efface tout les blocs de données et rempli les superblocs de structures Fichier disponibles, avec le starting_block adéquat et un nom vide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void FORMAT(){&lt;br /&gt;
    UART_pputs(&amp;quot;Formatage...\r\n&amp;quot;);&lt;br /&gt;
    //On rempli le buffer de 0x00&lt;br /&gt;
    clear_buffer();&lt;br /&gt;
    for(int i = 0; i &amp;lt; TOC_BLOCKS + (BLOCK_PAR_FILE * MAX_FILE); i++){&lt;br /&gt;
        ecriture_block(i); //on remplit tous les blocs de données et la TOC avec les 0x00&lt;br /&gt;
    }&lt;br /&gt;
    Fichier fichier; //Création d'une struct Fichier&lt;br /&gt;
    fichier.available = 0x01; //Le fichier est disponible &lt;br /&gt;
    memset(fichier.name, 0x00, FILE_NAME); //nom vide (charactere 00 en hex)&lt;br /&gt;
    //On écrit la TOC dans le buffer (on place des structs Fichier avec available -&amp;gt; 0x01)&lt;br /&gt;
    for (int toc = 0; toc &amp;lt; TOC_BLOCKS; toc++) {&lt;br /&gt;
        for (int j = 0; j &amp;lt; MAX_FILE; j++) {&lt;br /&gt;
            fichier.starting_block = TOC_BLOCKS + (j * BLOCK_PAR_FILE) + (toc * FILE_PAR_TOC);&lt;br /&gt;
            int start_index = j * sizeof(Fichier);&lt;br /&gt;
            memcpy(&amp;amp;buffer[start_index], &amp;amp;fichier, sizeof(Fichier)); // Copie de la structure&lt;br /&gt;
        }&lt;br /&gt;
        ecriture_block(toc); // Écriture du buffer dans le superbloc correspondant&lt;br /&gt;
    }&lt;br /&gt;
    UART_pputs(&amp;quot;Formatage terminé\r\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la commande LS() on parcours les deux superblocs et on envoie sur le port série le noms des fichiers présents sur la carte SD.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void LS(){&lt;br /&gt;
    UART_pputs(&amp;quot;Fichier(s) sur la carte SD :\r\n&amp;quot;);&lt;br /&gt;
    for (int toc = 0; toc &amp;lt; TOC_BLOCKS; toc++){ // On boucle sur les differents blocs de TOC&lt;br /&gt;
        lecture_block(toc);&lt;br /&gt;
        for (int i = 0; i &amp;lt; FILE_PAR_TOC; i++){&lt;br /&gt;
            // Création d'un struct fichier&lt;br /&gt;
            Fichier fichier;&lt;br /&gt;
            // On rempli Fichier avec les infos du buffer&lt;br /&gt;
            memcpy(&amp;amp;fichier, &amp;amp;buffer[i * sizeof(Fichier)], sizeof(Fichier));&lt;br /&gt;
            // Fichier non dispo donc un fichier est stocké sur la carte&lt;br /&gt;
            if (fichier.available == 0x00) {&lt;br /&gt;
                UART_puts(fichier.name); //Affichage du nom du fichier trouvé&lt;br /&gt;
                UART_pputs(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite implémenté les fonctions suivantes:&lt;br /&gt;
* APPEND() : crée un fichier sur la carte SD, si il existe déjà les données passées en paramètre sont ajoutées à la fin du fichier existant&lt;br /&gt;
* READ() : renvoie sur le port série le contenu du fichier demandé&lt;br /&gt;
* REMOVE() : supprime le fichier demandé, on &amp;quot;vide&amp;quot; son descripteur dans le superbloc puis on rempli les 4 blocs de données de 0x00&lt;br /&gt;
* RENAME() : permet de renommer un fichier, on remplace simplement sont nom dans son descripteur (pas de modification des blocs de données)&lt;br /&gt;
* COPY() : copie d'un fichier source vers un nouveau fichier destination&lt;br /&gt;
&lt;br /&gt;
Toutes ces fonctions et les fonctions intermédiaires sont dans le fichier &amp;lt;code&amp;gt;SysFich/sys_fichier.c&amp;lt;/code&amp;gt; dans notre dépot GIT.&lt;br /&gt;
&lt;br /&gt;
Pour finir nous avons créé une interface en série pour envoyer les commandes à la carte mère et recevoir le contenu des fichiers. &lt;br /&gt;
[[File:Pico2024_B8_sysfich.mp4|thumb|center|800px|Utilisation de notre système de fichiers]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la vidéo on peut bien constater que la carte SD crée bien les fichiers comme on le demande, on arrive à les lire (&amp;lt;code&amp;gt;63 6F 75 63 6F 75 20 63 27 65 73 74 20 6C 6F 75 69 73&amp;lt;/code&amp;gt; en hexa donne bien le message &amp;lt;code&amp;gt;coucou c'est louis&amp;lt;/code&amp;gt;), à concaténer du texte à la fin d'un fichier, de regarder les différents fichiers, de les copier et également les supprimer à volonté.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=7220</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=7220"/>
		<updated>2025-01-21T12:24:17Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Système de fichier */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine.&lt;br /&gt;
&lt;br /&gt;
Lors de ce projet nous allons réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur une carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===Modification Shield===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de notre shield]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===Assemblage et test du Shield===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur le shield puis testé les leds et un afficheur 7 segments connecté (en ISP) sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===Test de la carte SD===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|left|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour notre ordonnanceur il est important d'initialiser les taches, notamment leur pointeur de pile. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int t){&lt;br /&gt;
    uint16_t oldSP = SP;&lt;br /&gt;
    SP = Taches[t].stack;&lt;br /&gt;
    uint16_t adresse = (uint16_t)Taches[t].start;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff));&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00) &amp;gt;&amp;gt; 8));&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[t].stack = SP;&lt;br /&gt;
    SP = oldSP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque interruption de l'ISR (toutes les 20ms) on sauvegarde le contexte de la tache en cours, l'ordonnanceur passe à la tache suivante et on restaure le contexte de cette tache.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){&lt;br /&gt;
    /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[courant].stack = SP;&lt;br /&gt;
    /* Appel à l'ordonnanceur */&lt;br /&gt;
    ordonnanceur();&lt;br /&gt;
    /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
    SP = Taches[courant].stack;&lt;br /&gt;
    portRESTORE_Registers();&lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tâche série===&lt;br /&gt;
&lt;br /&gt;
Une fois l’ordonnanceur capable de lancer deux tâches en parallèle, nous nous sommes attaqués à la communication série de la carte par USB. Pour ce faire, nous utilisons l’application minicom coté PC qui permet une connexion série. Il faut initialiser les paramètres de la connexion, notre carte renvoie le message reçu dans le terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Ci joint les deux taches responsables de l'envoi et de la reception de données par le protocole série, &amp;lt;code&amp;gt;serial_buffer&amp;lt;/code&amp;gt; est une variable globale utilisée pour stocker les messages reçus et à envoyer. Les fonctions &amp;lt;code&amp;gt;Serial_Transmit()&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;Serial_Receive()&amp;lt;/code&amp;gt; sont déclarées dans &amp;lt;code&amp;gt;pico_serial.h&amp;lt;/code&amp;gt; et proviennent de la documentation AVR.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SerialWrite(){&lt;br /&gt;
    while (1){&lt;br /&gt;
        Serial_Transmit('\r\n');&lt;br /&gt;
        Serial_Transmit(serial_buffer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SerialRead(){&lt;br /&gt;
    while(1){&lt;br /&gt;
        serial_buffer = Serial_Receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SerialSetup.png|thumb|right|400px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|left|400px|Message reçu par le port série]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Lors de ce test notre atmega envoi &amp;quot;LOULOUTOINE&amp;quot; en boucle sur le port série.&lt;br /&gt;
&lt;br /&gt;
===Tâche 7 segments===&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons maintenant une tâche permettant de communiquer avec l'écran 7 segments par la communication SPI (toujours en parallèle des autres tâches).&lt;br /&gt;
Voici par exemple deux des fonctions SPI, il faut préalablement initialiser la communication SPI avec les registres SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SPI_send(uint8_t data) {&lt;br /&gt;
    DISPLAY_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_PIN); //On met le pin CS de l'écran à l'état bas pour l'activer&lt;br /&gt;
    SPDR = data;&lt;br /&gt;
    while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
    DISPLAY_PORT |= (1&amp;lt;&amp;lt;DISPLAY_PIN); // On relache l'écran &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clearDisplaySPI() {&lt;br /&gt;
    SPI_send(0x76); // Commande pour effacer l'écran et remettre le curseur a gauche&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour afficher un caractère sur l'écran il suffit donc d'appeler &amp;lt;code&amp;gt;SPI_send()&amp;lt;/code&amp;gt; en passant en paramètre le caractère à envoyer.&lt;br /&gt;
[[File:Pico2024_B8_ordos7s_video.mp4|thumb|center|600px|Les 5 tâches en parallèle]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Etat endormi===&lt;br /&gt;
&lt;br /&gt;
Une fois que les tâches ont été correctement séparées, il a fallu ajuster notre ordonnanceur pour garantir que les délais de chaque tâche soient respectés. En effet, avec notre méthode actuelle qui repose sur l'utilisation de la fonction &amp;lt;code&amp;gt;_delays_ms()&amp;lt;/code&amp;gt;  à chaque ajout de tâche, le temps total d'exécution augmente de manière cumulative. Par exemple, avec deux tâches, un délai de 200 ms prendrait 400 ms, et avec trois tâches 600 ms. Pour résoudre ce problème, nous avons décidé d'ajouter un état à chaque tâche, permettant de les &amp;quot;endormir&amp;quot; lorsqu'elles ne sont pas appelées, et de les &amp;quot;réveiller&amp;quot; lorsqu'elles le sont. Grâce à ce système, chaque fois qu'une tâche endormie est exécutée, on décrémente son timer de 20 millisecondes à chaque cycle. Ainsi chaque tâche respecte son délai sans interférer avec l'exécution des autres tâches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void Sleeping(){&lt;br /&gt;
  for (int i = 0; i &amp;lt; NB_TASKS;i++){&lt;br /&gt;
    if (Taches[i].etat.sit == ENDORMI) Taches[i].etat.time.tempsendormi -= 20;&lt;br /&gt;
    if (Taches[i].etat.time.tempsendormi &amp;lt;= 0) {&lt;br /&gt;
      Taches[i].etat.time.tempsendormi = 0;&lt;br /&gt;
      Taches[i].etat.sit = ACTIF;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre nouvel ordonnanceur qui appelle &amp;lt;code&amp;gt;Sleeping()&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void ordonnanceur(){&lt;br /&gt;
    PORTC ^= 0x01; // On fait clignoter une des led (J1) à chaque fois que l'ordonnanceur est appelé&lt;br /&gt;
    Sleeping();&lt;br /&gt;
    do{&lt;br /&gt;
       courant ++;&lt;br /&gt;
       if (courant == NB_TASKS) courant = 0;&lt;br /&gt;
    } while (Taches[courant].etat.sit == ENDORMI);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction endors la tâche pendant la durée t (en millisecondes).&lt;br /&gt;
On remet ensuite le timer à 0 et on lance l'interruption manuellement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void makeSleep(int t){&lt;br /&gt;
  Taches[courant].etat.sit = ENDORMI;&lt;br /&gt;
  Taches[courant].etat.time.tempsendormi = t;&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
  TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici notre struture modifiée pour ajouter l'état endormi&lt;br /&gt;
On utilise une union pour representer le temps d'endormissement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define ENDORMI 1&lt;br /&gt;
#define ACTIF 0&lt;br /&gt;
&lt;br /&gt;
typedef union{&lt;br /&gt;
  int tempsendormi;&lt;br /&gt;
} Time;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
  int situation;  //1 pour endormi, 0 pour éveillé &lt;br /&gt;
  Time time;&lt;br /&gt;
} Etat;&lt;br /&gt;
&lt;br /&gt;
typedef struct task{&lt;br /&gt;
  void (*start)(void);&lt;br /&gt;
  uint16_t stack;&lt;br /&gt;
  Etat etat;&lt;br /&gt;
} task;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmi notre groupe, nous sommes le binôme en charge de la carte mère. &lt;br /&gt;
Nous avons décidé d'utiliser un Atmega 328p qui sera programmé avec &amp;lt;code&amp;gt;avr-dude&amp;lt;/code&amp;gt; pour cela notre carte mère comportera également un Atmega8u2 qui servira de programmateur et d'interface serie/USB. &lt;br /&gt;
&lt;br /&gt;
Nous avons prévu une alimentation par un port USB C, ayant connecté les pins CC1 et CC2 à des resistances de 5.1k nous obtenons 5v et 3A max. Il sera donc simple d'alimenter notre carte avec un câble USB, chargeur de téléphone ou alimentation de Raspberry Pi par exemple et d'obtenir jusqu'à 15w ce qui est largement suffisant pour notre carte mère et les cartes filles des autres binômes.&lt;br /&gt;
&lt;br /&gt;
Notre PCB est terminé, voici le schéma et un rendu du PCB final. &lt;br /&gt;
[[File:Pico2024_B8_sch_PCB.pdf|thumb|left|469x469px|Le schéma final (en 3 pages)]]&lt;br /&gt;
[[File:Pico2024_B8_rendu_PCB.png|thumb|right|588x588px|Le PCB final]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Les fichiers GERBER sont disponibles dans notre dépot [https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT]&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre PCB, pour commencer nous assemblons les composants minimums pour faire clignoter une LED avec le 328p.&lt;br /&gt;
[[File:Pico2024_B8_PCB_recu.jpeg|thumb|left|500px|Le naked PCB]]&lt;br /&gt;
[[File:Pico2024_B8_PC1.jpeg|thumb|right|500px|Ca fonctionne]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
En programmant par le port ISP avec une Arduino as ISP on arrive à faire clignoter la LED reliée sur PC1 du 328p. On soude ensuite le minimum pour tester l'AtMega8u2, on arrive à faire clignoter deux led reliées a ses broches. &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_8U2.jpeg|thumb|left|412x412px|Les atmega sont soudés]]&lt;br /&gt;
[[File:Pico2024_B8_double_blinking.mp4|thumb|right|500px|Blinking lights]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_erreur.png|thumb|left|364x364px|D- et D+ inversés]]Nous installons maintenant le firmware dans le 8u2 et le bootloader dans le 328p afin de pouvoir programmer le 328p en utilisant la connexion USB du 8u2. &amp;lt;br&amp;gt;Pour cela il faut d'abord effacer le 8u2 avec les commandes suivantes : &amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -t&amp;lt;/code&amp;gt;, Il faut ensuite envoyer la commande &amp;lt;code&amp;gt;erase&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;quit&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
On peux maintenant modifier les fuses pour notre crystal externe à 16MHz : &amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xde:m -U hfuse:w:0xd9:m -U efuse:w:0xf4:m&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Puis flasher le firmware 8u2 provenant d'une Arduino UNO : &amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U flash:w:8u2_firmware.hex&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la programmation du Bootloader du 328p on utilise directement la fonction &amp;quot;burn bootloader&amp;quot; de l'IDE Arduino. &lt;br /&gt;
&lt;br /&gt;
Malheureusement notre carte n'est pas reconnue par l'ordinateur avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt;. Avec &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt; nous voyons qu'un périphérique USB est détecté mais avec des erreurs, nous essayons de ressouder notre connecteur USB-C à l'air chaud et vérifions au multimètre que les pins sont bien soudés mais nous avons toujours les mêmes erreurs. Après vérification de notre schéma une erreur s'est glissée lors du commit 181625dc05 fait par monsieur Redon, les pins D+ et D- sont inversés. Nous modifions notre carte pour corriger cette inversion. Succès !! notre carte est maintenant bien visible en USB. [[File:Pico2024_B8_lsusb.png|thumb|right|500px|Reconnue (comme une Arduino UNO)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après soudure des connecteurs HE10, des leds et de leurs résistances correspondantes, nous avons téleversé notre code pour l'ordonnanceur. Les leds clignotent bien et l'écran 7 segments connecté à la PicoMother fonctionne parfaitement et simultanément.[[File:Pico2024_B8_mother_soudee.png|thumb|left|500px|Carte soudée]]&lt;br /&gt;
[[File:Pico2024_B8_mother_ordonnanceur.mp4|thumb|right|500px|Ordonnanceur sur notre carte]]&lt;br /&gt;
&lt;br /&gt;
Nous testons également que la carte SD est détectable par notre carte mère et c'est bien le cas.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Système de fichier=&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_secteur0.jpg|thumb|right|500px|Le contenu du secteur 0]]&lt;br /&gt;
Nous passons maintenant à la dernière partie du projet, le système de fichiers. Pour cela nous commençons par essayer de lire et d'écrire un secteur de la carte SD (en mode SPI une carte SD et accessible par blocs (secteurs) de 512 octets), nous utilisons la bibliothèque suivante pour faciliter la gestion de la carte SD :[https://github.com/ryanj1234/SD_TUTORIAL_PART4 Bibliothèque SD]. En modifiant cette bibliothèque on arrive à lire et écrire un secteur de la carte SD. Sur cette photo on lit le secteur 0 de la carte SD, 0x55AA  à la fin du secteur signifie que la carte est actuellement formatée avec un système de fichier MBR.&lt;br /&gt;
&lt;br /&gt;
Après avoir confirmé que nous pouvons lire le bloc 0 nous avons essayé de lire les blocs suivants, or nous obtenions une erreur &amp;lt;code&amp;gt;Address out of range&amp;lt;/code&amp;gt;. Le problème vient du fait qu'on utilise une carte SD standard (pas SDHC) et qu'il faut multiplier le numéro de bloc par 512. En effet les cartes SDHC et SDXC sont block-addressed, le bloc 0 est à l'adresse 0, le bloc 1 à l'adresse 1 mais les cartes SD (comme la notre) sont bytes-addressed, le bloc 0 est à l'adresse 0, le bloc 1 à l'adresse 512... Nous avons donc créé une fonction intermédiaire qui multiplie le numero de bloc voulu par 512 (décalage de 9 bits) pour obtenir l'adresse du bloc. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void lecture_block(uint32_t block){&lt;br /&gt;
    uint8_t res, token;&lt;br /&gt;
    uint32_t addr = block &amp;lt;&amp;lt; 9; //Multiplication par 512&lt;br /&gt;
    // Lecture du bloc (secteur)&lt;br /&gt;
    res = SD_readSingleBlock(addr, buffer, &amp;amp;token); //res reçoit un octet décrivant l'état de la carte SD (pas utilisé dans notre code)&lt;br /&gt;
    // Impression en cas d'erreur&lt;br /&gt;
    if(!(token &amp;amp; 0xF0)){&lt;br /&gt;
        UART_pputs(&amp;quot;Erreur :\r\n&amp;quot;);&lt;br /&gt;
        SD_printDataErrToken(token);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois les fonctions de lecture et d'écriture de blocs sur la carte SD adaptées à notre carte mère et carte SD nous avons commencé à créer notre pico système de fichiers.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
[[File:Pico2024_B8_schema_sysfich.png|thumb|center|800px|Schéma de notre système de fichiers]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt; &lt;br /&gt;
Nous avons utilisé deux blocs de la carte comme superblocs (table of content) qui contiennent des &amp;quot;descripteurs&amp;quot; de fichiers et pointent vers le premier bloc au sont stockées les données (4 blocs consécutifs). Nous avons choisi de que nos fichiers doivent avoir un nom de 14 caractères maximum, ainsi notre structure Fichier à une taille de 16 octets et on peut en mettre 32 par superbloc (32*16 = 512), deux superblocs suffiront donc pour accéder à 64 fichiers.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct Fichier{&lt;br /&gt;
    uint8_t available;&lt;br /&gt;
    uint8_t starting_block;&lt;br /&gt;
    char name[FILE_NAME];&lt;br /&gt;
}typedef Fichier; //Taille 16 octets&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons donc commencé par implementer la fonction format qui efface tout les blocs de données et rempli les superblocs de structures Fichier disponibles, avec le starting_block adéquat et un nom vide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void FORMAT(){&lt;br /&gt;
    UART_pputs(&amp;quot;Formatage...\r\n&amp;quot;);&lt;br /&gt;
    //On rempli le buffer de 0x00&lt;br /&gt;
    clear_buffer();&lt;br /&gt;
    for(int i = 0; i &amp;lt; TOC_BLOCKS + (BLOCK_PAR_FILE * MAX_FILE); i++){&lt;br /&gt;
        ecriture_block(i); //on remplit tous les blocs de données et la TOC avec les 0x00&lt;br /&gt;
    }&lt;br /&gt;
    Fichier fichier; //Création d'une struct Fichier&lt;br /&gt;
    fichier.available = 0x01; //Le fichier est disponible &lt;br /&gt;
    memset(fichier.name, 0x00, FILE_NAME); //nom vide (charactere 00 en hex)&lt;br /&gt;
    //On écrit la TOC dans le buffer (on place des structs Fichier avec available -&amp;gt; 0x01)&lt;br /&gt;
    for (int toc = 0; toc &amp;lt; TOC_BLOCKS; toc++) {&lt;br /&gt;
        for (int j = 0; j &amp;lt; MAX_FILE; j++) {&lt;br /&gt;
            fichier.starting_block = TOC_BLOCKS + (j * BLOCK_PAR_FILE) + (toc * FILE_PAR_TOC);&lt;br /&gt;
            int start_index = j * sizeof(Fichier);&lt;br /&gt;
            memcpy(&amp;amp;buffer[start_index], &amp;amp;fichier, sizeof(Fichier)); // Copie de la structure&lt;br /&gt;
        }&lt;br /&gt;
        ecriture_block(toc); // Écriture du buffer dans le superbloc correspondant&lt;br /&gt;
    }&lt;br /&gt;
    UART_pputs(&amp;quot;Formatage terminé\r\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la commande LS() on parcours les deux superblocs et on envoie sur le port série le noms des fichiers présents sur la carte SD.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void LS(){&lt;br /&gt;
    UART_pputs(&amp;quot;Fichier(s) sur la carte SD :\r\n&amp;quot;);&lt;br /&gt;
    for (int toc = 0; toc &amp;lt; TOC_BLOCKS; toc++){ // On boucle sur les differents blocs de TOC&lt;br /&gt;
        lecture_block(toc);&lt;br /&gt;
        for (int i = 0; i &amp;lt; FILE_PAR_TOC; i++){&lt;br /&gt;
            // Création d'un struct fichier&lt;br /&gt;
            Fichier fichier;&lt;br /&gt;
            // On rempli Fichier avec les infos du buffer&lt;br /&gt;
            memcpy(&amp;amp;fichier, &amp;amp;buffer[i * sizeof(Fichier)], sizeof(Fichier));&lt;br /&gt;
            // Fichier non dispo donc un fichier est stocké sur la carte&lt;br /&gt;
            if (fichier.available == 0x00) {&lt;br /&gt;
                UART_puts(fichier.name); //Affichage du nom du fichier trouvé&lt;br /&gt;
                UART_pputs(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite implémenté les fonctions suivantes:&lt;br /&gt;
* APPEND() : crée un fichier sur la carte SD, si il existe déjà les données passées en paramètre sont ajoutées à la fin du fichier existant&lt;br /&gt;
* READ() : renvoie sur le port série le contenu du fichier demandé&lt;br /&gt;
* REMOVE() : supprime le fichier demandé, on &amp;quot;vide&amp;quot; son descripteur dans le superbloc puis on rempli les 4 blocs de données de 0x00&lt;br /&gt;
* RENAME() : permet de renommer un fichier, on remplace simplement sont nom dans son descripteur (pas de modification des blocs de données)&lt;br /&gt;
* COPY() : copie d'un fichier source vers un nouveau fichier destination&lt;br /&gt;
&lt;br /&gt;
Toutes ces fonctions et les fonctions intermédiaires sont dans le fichier &amp;lt;code&amp;gt;SysFich/sys_fichier.c&amp;lt;/code&amp;gt; dans notre dépot GIT.&lt;br /&gt;
&lt;br /&gt;
Pour finir nous avons créé une interface en série pour envoyer les commandes à la carte mère et recevoir le contenu des fichiers. &lt;br /&gt;
[[File:Pico2024_B8_sysfich.mp4|thumb|center|800px|Utilisation de notre système de fichiers]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la vidéo on peut bien constater que la carte SD crée bien les fichiers comme on le demande, on arrive à les lire (&amp;lt;code&amp;gt;63 6F 75 63 6F 75 20 63 27 65 73 74 20 6C 6F 75 69 73&amp;lt;/code&amp;gt; en hexa donne bien le message &amp;lt;code&amp;gt;coucou c'est louis &amp;lt;/code&amp;gt;, à concaténer du texte à la fin d'un fichier, de regarder les différents fichiers et également les supprimer à volonté.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=7219</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=7219"/>
		<updated>2025-01-21T12:19:43Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Système de fichier */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine.&lt;br /&gt;
&lt;br /&gt;
Lors de ce projet nous allons réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur une carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===Modification Shield===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de notre shield]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===Assemblage et test du Shield===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur le shield puis testé les leds et un afficheur 7 segments connecté (en ISP) sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===Test de la carte SD===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|left|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour notre ordonnanceur il est important d'initialiser les taches, notamment leur pointeur de pile. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int t){&lt;br /&gt;
    uint16_t oldSP = SP;&lt;br /&gt;
    SP = Taches[t].stack;&lt;br /&gt;
    uint16_t adresse = (uint16_t)Taches[t].start;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff));&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00) &amp;gt;&amp;gt; 8));&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[t].stack = SP;&lt;br /&gt;
    SP = oldSP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque interruption de l'ISR (toutes les 20ms) on sauvegarde le contexte de la tache en cours, l'ordonnanceur passe à la tache suivante et on restaure le contexte de cette tache.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){&lt;br /&gt;
    /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[courant].stack = SP;&lt;br /&gt;
    /* Appel à l'ordonnanceur */&lt;br /&gt;
    ordonnanceur();&lt;br /&gt;
    /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
    SP = Taches[courant].stack;&lt;br /&gt;
    portRESTORE_Registers();&lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tâche série===&lt;br /&gt;
&lt;br /&gt;
Une fois l’ordonnanceur capable de lancer deux tâches en parallèle, nous nous sommes attaqués à la communication série de la carte par USB. Pour ce faire, nous utilisons l’application minicom coté PC qui permet une connexion série. Il faut initialiser les paramètres de la connexion, notre carte renvoie le message reçu dans le terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Ci joint les deux taches responsables de l'envoi et de la reception de données par le protocole série, &amp;lt;code&amp;gt;serial_buffer&amp;lt;/code&amp;gt; est une variable globale utilisée pour stocker les messages reçus et à envoyer. Les fonctions &amp;lt;code&amp;gt;Serial_Transmit()&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;Serial_Receive()&amp;lt;/code&amp;gt; sont déclarées dans &amp;lt;code&amp;gt;pico_serial.h&amp;lt;/code&amp;gt; et proviennent de la documentation AVR.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SerialWrite(){&lt;br /&gt;
    while (1){&lt;br /&gt;
        Serial_Transmit('\r\n');&lt;br /&gt;
        Serial_Transmit(serial_buffer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SerialRead(){&lt;br /&gt;
    while(1){&lt;br /&gt;
        serial_buffer = Serial_Receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SerialSetup.png|thumb|right|400px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|left|400px|Message reçu par le port série]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Lors de ce test notre atmega envoi &amp;quot;LOULOUTOINE&amp;quot; en boucle sur le port série.&lt;br /&gt;
&lt;br /&gt;
===Tâche 7 segments===&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons maintenant une tâche permettant de communiquer avec l'écran 7 segments par la communication SPI (toujours en parallèle des autres tâches).&lt;br /&gt;
Voici par exemple deux des fonctions SPI, il faut préalablement initialiser la communication SPI avec les registres SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SPI_send(uint8_t data) {&lt;br /&gt;
    DISPLAY_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_PIN); //On met le pin CS de l'écran à l'état bas pour l'activer&lt;br /&gt;
    SPDR = data;&lt;br /&gt;
    while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
    DISPLAY_PORT |= (1&amp;lt;&amp;lt;DISPLAY_PIN); // On relache l'écran &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clearDisplaySPI() {&lt;br /&gt;
    SPI_send(0x76); // Commande pour effacer l'écran et remettre le curseur a gauche&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour afficher un caractère sur l'écran il suffit donc d'appeler &amp;lt;code&amp;gt;SPI_send()&amp;lt;/code&amp;gt; en passant en paramètre le caractère à envoyer.&lt;br /&gt;
[[File:Pico2024_B8_ordos7s_video.mp4|thumb|center|600px|Les 5 tâches en parallèle]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Etat endormi===&lt;br /&gt;
&lt;br /&gt;
Une fois que les tâches ont été correctement séparées, il a fallu ajuster notre ordonnanceur pour garantir que les délais de chaque tâche soient respectés. En effet, avec notre méthode actuelle qui repose sur l'utilisation de la fonction &amp;lt;code&amp;gt;_delays_ms()&amp;lt;/code&amp;gt;  à chaque ajout de tâche, le temps total d'exécution augmente de manière cumulative. Par exemple, avec deux tâches, un délai de 200 ms prendrait 400 ms, et avec trois tâches 600 ms. Pour résoudre ce problème, nous avons décidé d'ajouter un état à chaque tâche, permettant de les &amp;quot;endormir&amp;quot; lorsqu'elles ne sont pas appelées, et de les &amp;quot;réveiller&amp;quot; lorsqu'elles le sont. Grâce à ce système, chaque fois qu'une tâche endormie est exécutée, on décrémente son timer de 20 millisecondes à chaque cycle. Ainsi chaque tâche respecte son délai sans interférer avec l'exécution des autres tâches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void Sleeping(){&lt;br /&gt;
  for (int i = 0; i &amp;lt; NB_TASKS;i++){&lt;br /&gt;
    if (Taches[i].etat.sit == ENDORMI) Taches[i].etat.time.tempsendormi -= 20;&lt;br /&gt;
    if (Taches[i].etat.time.tempsendormi &amp;lt;= 0) {&lt;br /&gt;
      Taches[i].etat.time.tempsendormi = 0;&lt;br /&gt;
      Taches[i].etat.sit = ACTIF;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre nouvel ordonnanceur qui appelle &amp;lt;code&amp;gt;Sleeping()&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void ordonnanceur(){&lt;br /&gt;
    PORTC ^= 0x01; // On fait clignoter une des led (J1) à chaque fois que l'ordonnanceur est appelé&lt;br /&gt;
    Sleeping();&lt;br /&gt;
    do{&lt;br /&gt;
       courant ++;&lt;br /&gt;
       if (courant == NB_TASKS) courant = 0;&lt;br /&gt;
    } while (Taches[courant].etat.sit == ENDORMI);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction endors la tâche pendant la durée t (en millisecondes).&lt;br /&gt;
On remet ensuite le timer à 0 et on lance l'interruption manuellement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void makeSleep(int t){&lt;br /&gt;
  Taches[courant].etat.sit = ENDORMI;&lt;br /&gt;
  Taches[courant].etat.time.tempsendormi = t;&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
  TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici notre struture modifiée pour ajouter l'état endormi&lt;br /&gt;
On utilise une union pour representer le temps d'endormissement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define ENDORMI 1&lt;br /&gt;
#define ACTIF 0&lt;br /&gt;
&lt;br /&gt;
typedef union{&lt;br /&gt;
  int tempsendormi;&lt;br /&gt;
} Time;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
  int situation;  //1 pour endormi, 0 pour éveillé &lt;br /&gt;
  Time time;&lt;br /&gt;
} Etat;&lt;br /&gt;
&lt;br /&gt;
typedef struct task{&lt;br /&gt;
  void (*start)(void);&lt;br /&gt;
  uint16_t stack;&lt;br /&gt;
  Etat etat;&lt;br /&gt;
} task;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmi notre groupe, nous sommes le binôme en charge de la carte mère. &lt;br /&gt;
Nous avons décidé d'utiliser un Atmega 328p qui sera programmé avec &amp;lt;code&amp;gt;avr-dude&amp;lt;/code&amp;gt; pour cela notre carte mère comportera également un Atmega8u2 qui servira de programmateur et d'interface serie/USB. &lt;br /&gt;
&lt;br /&gt;
Nous avons prévu une alimentation par un port USB C, ayant connecté les pins CC1 et CC2 à des resistances de 5.1k nous obtenons 5v et 3A max. Il sera donc simple d'alimenter notre carte avec un câble USB, chargeur de téléphone ou alimentation de Raspberry Pi par exemple et d'obtenir jusqu'à 15w ce qui est largement suffisant pour notre carte mère et les cartes filles des autres binômes.&lt;br /&gt;
&lt;br /&gt;
Notre PCB est terminé, voici le schéma et un rendu du PCB final. &lt;br /&gt;
[[File:Pico2024_B8_sch_PCB.pdf|thumb|left|469x469px|Le schéma final (en 3 pages)]]&lt;br /&gt;
[[File:Pico2024_B8_rendu_PCB.png|thumb|right|588x588px|Le PCB final]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Les fichiers GERBER sont disponibles dans notre dépot [https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT]&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre PCB, pour commencer nous assemblons les composants minimums pour faire clignoter une LED avec le 328p.&lt;br /&gt;
[[File:Pico2024_B8_PCB_recu.jpeg|thumb|left|500px|Le naked PCB]]&lt;br /&gt;
[[File:Pico2024_B8_PC1.jpeg|thumb|right|500px|Ca fonctionne]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
En programmant par le port ISP avec une Arduino as ISP on arrive à faire clignoter la LED reliée sur PC1 du 328p. On soude ensuite le minimum pour tester l'AtMega8u2, on arrive à faire clignoter deux led reliées a ses broches. &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_8U2.jpeg|thumb|left|412x412px|Les atmega sont soudés]]&lt;br /&gt;
[[File:Pico2024_B8_double_blinking.mp4|thumb|right|500px|Blinking lights]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_erreur.png|thumb|left|364x364px|D- et D+ inversés]]Nous installons maintenant le firmware dans le 8u2 et le bootloader dans le 328p afin de pouvoir programmer le 328p en utilisant la connexion USB du 8u2. &amp;lt;br&amp;gt;Pour cela il faut d'abord effacer le 8u2 avec les commandes suivantes : &amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -t&amp;lt;/code&amp;gt;, Il faut ensuite envoyer la commande &amp;lt;code&amp;gt;erase&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;quit&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
On peux maintenant modifier les fuses pour notre crystal externe à 16MHz : &amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xde:m -U hfuse:w:0xd9:m -U efuse:w:0xf4:m&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Puis flasher le firmware 8u2 provenant d'une Arduino UNO : &amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U flash:w:8u2_firmware.hex&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la programmation du Bootloader du 328p on utilise directement la fonction &amp;quot;burn bootloader&amp;quot; de l'IDE Arduino. &lt;br /&gt;
&lt;br /&gt;
Malheureusement notre carte n'est pas reconnue par l'ordinateur avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt;. Avec &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt; nous voyons qu'un périphérique USB est détecté mais avec des erreurs, nous essayons de ressouder notre connecteur USB-C à l'air chaud et vérifions au multimètre que les pins sont bien soudés mais nous avons toujours les mêmes erreurs. Après vérification de notre schéma une erreur s'est glissée lors du commit 181625dc05 fait par monsieur Redon, les pins D+ et D- sont inversés. Nous modifions notre carte pour corriger cette inversion. Succès !! notre carte est maintenant bien visible en USB. [[File:Pico2024_B8_lsusb.png|thumb|right|500px|Reconnue (comme une Arduino UNO)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après soudure des connecteurs HE10, des leds et de leurs résistances correspondantes, nous avons téleversé notre code pour l'ordonnanceur. Les leds clignotent bien et l'écran 7 segments connecté à la PicoMother fonctionne parfaitement et simultanément.[[File:Pico2024_B8_mother_soudee.png|thumb|left|500px|Carte soudée]]&lt;br /&gt;
[[File:Pico2024_B8_mother_ordonnanceur.mp4|thumb|right|500px|Ordonnanceur sur notre carte]]&lt;br /&gt;
&lt;br /&gt;
Nous testons également que la carte SD est détectable par notre carte mère et c'est bien le cas.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Système de fichier=&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_secteur0.jpg|thumb|right|500px|Le contenu du secteur 0]]&lt;br /&gt;
Nous passons maintenant à la dernière partie du projet, le système de fichiers. Pour cela nous commençons par essayer de lire et d'écrire un secteur de la carte SD (en mode SPI une carte SD et accessible par blocs (secteurs) de 512 octets), nous utilisons la bibliothèque suivante pour faciliter la gestion de la carte SD :[https://github.com/ryanj1234/SD_TUTORIAL_PART4 Bibliothèque SD]. En modifiant cette bibliothèque on arrive à lire et écrire un secteur de la carte SD. Sur cette photo on lit le secteur 0 de la carte SD, 0x55AA  à la fin du secteur signifie que la carte est actuellement formatée avec un système de fichier MBR.&lt;br /&gt;
&lt;br /&gt;
Après avoir confirmé que nous pouvons lire le bloc 0 nous avons essayé de lire les blocs suivants, or nous obtenions une erreur &amp;lt;code&amp;gt;Address out of range&amp;lt;/code&amp;gt;. Le problème vient du fait qu'on utilise une carte SD standard (pas SDHC) et qu'il faut multiplier le numéro de bloc par 512. En effet les cartes SDHC et SDXC sont block-addressed, le bloc 0 est à l'adresse 0, le bloc 1 à l'adresse 1 mais les cartes SD (comme la notre) sont bytes-addressed, le bloc 0 est à l'adresse 0, le bloc 1 à l'adresse 512... Nous avons donc créé une fonction intermédiaire qui multiplie le numero de bloc voulu par 512 (décalage de 9 bits) pour obtenir l'adresse du bloc. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void lecture_block(uint32_t block){&lt;br /&gt;
    uint8_t res, token;&lt;br /&gt;
    uint32_t addr = block &amp;lt;&amp;lt; 9; //Multiplication par 512&lt;br /&gt;
    // Lecture du bloc (secteur)&lt;br /&gt;
    res = SD_readSingleBlock(addr, buffer, &amp;amp;token); //res reçoit un octet décrivant l'état de la carte SD (pas utilisé dans notre code)&lt;br /&gt;
    // Impression en cas d'erreur&lt;br /&gt;
    if(!(token &amp;amp; 0xF0)){&lt;br /&gt;
        UART_pputs(&amp;quot;Erreur :\r\n&amp;quot;);&lt;br /&gt;
        SD_printDataErrToken(token);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois les fonctions de lecture et d'écriture de blocs sur la carte SD adaptées à notre carte mère et carte SD nous avons commencé à créer notre pico système de fichiers.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
[[File:Pico2024_B8_schema_sysfich.png|thumb|center|800px|Schéma de notre système de fichiers]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt; &lt;br /&gt;
Nous avons utilisé deux blocs de la carte comme superblocs (table of content) qui contiennent des &amp;quot;descripteurs&amp;quot; de fichiers et pointent vers le premier bloc au sont stockées les données (4 blocs consécutifs). Nous avons choisi de que nos fichiers doivent avoir un nom de 14 caractères maximum, ainsi notre structure Fichier à une taille de 16 octets et on peut en mettre 32 par superbloc (32*16 = 512), deux superblocs suffiront donc pour accéder à 64 fichiers.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct Fichier{&lt;br /&gt;
    uint8_t available;&lt;br /&gt;
    uint8_t starting_block;&lt;br /&gt;
    char name[FILE_NAME];&lt;br /&gt;
}typedef Fichier; //Taille 16 octets&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons donc commencé par implementer la fonction format qui efface tout les blocs de données et rempli les superblocs de structures Fichier disponibles, avec le starting_block adéquat et un nom vide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void FORMAT(){&lt;br /&gt;
    UART_pputs(&amp;quot;Formatage...\r\n&amp;quot;);&lt;br /&gt;
    //On rempli le buffer de 0x00&lt;br /&gt;
    clear_buffer();&lt;br /&gt;
    for(int i = 0; i &amp;lt; TOC_BLOCKS + (BLOCK_PAR_FILE * MAX_FILE); i++){&lt;br /&gt;
        ecriture_block(i); //on remplit tous les blocs de données et la TOC avec les 0x00&lt;br /&gt;
    }&lt;br /&gt;
    Fichier fichier; //Création d'une struct Fichier&lt;br /&gt;
    fichier.available = 0x01; //Le fichier est disponible &lt;br /&gt;
    memset(fichier.name, 0x00, FILE_NAME); //nom vide (charactere 00 en hex)&lt;br /&gt;
    //On écrit la TOC dans le buffer (on place des structs Fichier avec available -&amp;gt; 0x01)&lt;br /&gt;
    for (int toc = 0; toc &amp;lt; TOC_BLOCKS; toc++) {&lt;br /&gt;
        for (int j = 0; j &amp;lt; MAX_FILE; j++) {&lt;br /&gt;
            fichier.starting_block = TOC_BLOCKS + (j * BLOCK_PAR_FILE) + (toc * FILE_PAR_TOC);&lt;br /&gt;
            int start_index = j * sizeof(Fichier);&lt;br /&gt;
            memcpy(&amp;amp;buffer[start_index], &amp;amp;fichier, sizeof(Fichier)); // Copie de la structure&lt;br /&gt;
        }&lt;br /&gt;
        ecriture_block(toc); // Écriture du buffer dans le superbloc correspondant&lt;br /&gt;
    }&lt;br /&gt;
    UART_pputs(&amp;quot;Formatage terminé\r\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la commande LS() on parcours les deux superblocs et on envoie sur le port série le noms des fichiers présents sur la carte SD.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void LS(){&lt;br /&gt;
    UART_pputs(&amp;quot;Fichier(s) sur la carte SD :\r\n&amp;quot;);&lt;br /&gt;
    for (int toc = 0; toc &amp;lt; TOC_BLOCKS; toc++){ // On boucle sur les differents blocs de TOC&lt;br /&gt;
        lecture_block(toc);&lt;br /&gt;
        for (int i = 0; i &amp;lt; FILE_PAR_TOC; i++){&lt;br /&gt;
            // Création d'un struct fichier&lt;br /&gt;
            Fichier fichier;&lt;br /&gt;
            // On rempli Fichier avec les infos du buffer&lt;br /&gt;
            memcpy(&amp;amp;fichier, &amp;amp;buffer[i * sizeof(Fichier)], sizeof(Fichier));&lt;br /&gt;
            // Fichier non dispo donc un fichier est stocké sur la carte&lt;br /&gt;
            if (fichier.available == 0x00) {&lt;br /&gt;
                UART_puts(fichier.name); //Affichage du nom du fichier trouvé&lt;br /&gt;
                UART_pputs(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite implémenté les fonctions suivantes:&lt;br /&gt;
* APPEND() : crée un fichier sur la carte SD, si il existe déjà les données passées en paramètre sont ajoutées à la fin du fichier existant&lt;br /&gt;
* READ() : renvoie sur le port série le contenu du fichier demandé&lt;br /&gt;
* REMOVE() : supprime le fichier demandé, on &amp;quot;vide&amp;quot; son descripteur dans le superbloc puis on rempli les 4 blocs de données de 0x00&lt;br /&gt;
* RENAME() : permet de renommer un fichier, on remplace simplement sont nom dans son descripteur (pas de modification des blocs de données)&lt;br /&gt;
* COPY() : copie d'un fichier source vers un nouveau fichier destination&lt;br /&gt;
&lt;br /&gt;
Toutes ces fonctions et les fonctions intermédiaires sont dans le fichier &amp;lt;code&amp;gt;SysFich/sys_fichier.c&amp;lt;/code&amp;gt; dans notre dépot GIT.&lt;br /&gt;
&lt;br /&gt;
Pour finir nous avons créé une interface en série pour envoyer les commandes à la carte mère et recevoir le contenu des fichiers. &lt;br /&gt;
[[File:Pico2024_B8_sysfich.mp4|thumb|center|800px|Utilisation de notre système de fichiers]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6932</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6932"/>
		<updated>2024-12-04T11:07:47Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Carte mère */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine.&lt;br /&gt;
&lt;br /&gt;
Lors de ce projet nous allons réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur une carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===23 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===30 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===1 octobre 2024===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|left|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour notre ordonnanceur il est important d'initialiser les taches, notamment leur pointeur de pile. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int t){&lt;br /&gt;
    uint16_t oldSP = SP;&lt;br /&gt;
    SP = Taches[t].stack;&lt;br /&gt;
    uint16_t adresse = (uint16_t)Taches[t].start;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff));&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00) &amp;gt;&amp;gt; 8));&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[t].stack = SP;&lt;br /&gt;
    SP = oldSP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque interruption de l'ISR (toutes les 20ms) on sauvegarde le contexte de la tache en cours, l'ordonnanceur passe à la tache suivante et on restaure le contexte de cette tache.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){&lt;br /&gt;
    /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[courant].stack = SP;&lt;br /&gt;
    /* Appel à l'ordonnanceur */&lt;br /&gt;
    ordonnanceur();&lt;br /&gt;
    /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
    SP = Taches[courant].stack;&lt;br /&gt;
    portRESTORE_Registers();&lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tâche série===&lt;br /&gt;
&lt;br /&gt;
Une fois l’ordonnanceur capable de lancer deux tâches en parallèle, nous nous sommes attaqués à la communication série de la carte par USB. Pour ce faire, nous utilisons l’application minicom coté PC qui permet une connexion série. Il faut initialiser les paramètres de la connexion, notre carte renvoie le message reçu dans le terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Ci joint les deux taches responsables de l'envoi et de la reception de données par le protocole série, &amp;lt;code&amp;gt;serial_buffer&amp;lt;/code&amp;gt; est une variable globale utilisée pour stocker les messages reçus et à envoyer. Les fonctions &amp;lt;code&amp;gt;Serial_Transmit()&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;Serial_Receive()&amp;lt;/code&amp;gt; sont déclarées dans &amp;lt;code&amp;gt;pico_serial.h&amp;lt;/code&amp;gt; et proviennent de la documentation AVR.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SerialWrite(){&lt;br /&gt;
    while (1){&lt;br /&gt;
        Serial_Transmit('\r\n');&lt;br /&gt;
        Serial_Transmit(serial_buffer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SerialRead(){&lt;br /&gt;
    while(1){&lt;br /&gt;
        serial_buffer = Serial_Receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SerialSetup.png|thumb|right|400px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|left|400px|Message reçu par le port série]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Lors de ce test notre atmega envoi &amp;quot;LOULOUTOINE&amp;quot; en boucle sur le port série.&lt;br /&gt;
&lt;br /&gt;
===Tâche 7 segments===&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons maintenant une tâche permettant de communiquer avec l'écran 7 segments par la communication SPI (toujours en parallèle des autres tâches).&lt;br /&gt;
Voici par exemple deux des fonctions SPI, il faut préalablement initialiser la communication SPI avec les registres SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SPI_send(uint8_t data) {&lt;br /&gt;
    DISPLAY_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_PIN); //On met le pin CS de l'écran à l'état bas pour l'activer&lt;br /&gt;
    SPDR = data;&lt;br /&gt;
    while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
    DISPLAY_PORT |= (1&amp;lt;&amp;lt;DISPLAY_PIN); // On relache l'écran &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clearDisplaySPI() {&lt;br /&gt;
    SPI_send(0x76); // Commande pour effacer l'écran et remettre le curseur a gauche&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour afficher un caractère sur l'écran il suffit donc d'appeler &amp;lt;code&amp;gt;SPI_send()&amp;lt;/code&amp;gt; en passant en paramètre le caractère à envoyer.&lt;br /&gt;
[[File:Pico2024_B8_ordos7s_video.mp4|thumb|center|600px|Les 5 tâches en parallèle]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Etat endormi===&lt;br /&gt;
&lt;br /&gt;
Une fois que les tâches ont été correctement séparées, il a fallu ajuster notre ordonnanceur pour garantir que les délais de chaque tâche soient respectés. En effet, avec notre méthode actuelle qui repose sur l'utilisation de la fonction &amp;lt;code&amp;gt;_delays_ms()&amp;lt;/code&amp;gt;  à chaque ajout de tâche, le temps total d'exécution augmente de manière cumulative. Par exemple, avec deux tâches, un délai de 200 ms prendrait 400 ms, et avec trois tâches 600 ms. Pour résoudre ce problème, nous avons décidé d'ajouter un état à chaque tâche, permettant de les &amp;quot;endormir&amp;quot; lorsqu'elles ne sont pas appelées, et de les &amp;quot;réveiller&amp;quot; lorsqu'elles le sont. Grâce à ce système, chaque fois qu'une tâche endormie est exécutée, on décrémente son timer de 20 millisecondes à chaque cycle. Ainsi chaque tâche respecte son délai sans interférer avec l'exécution des autres tâches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void Sleeping(){&lt;br /&gt;
  for (int i = 0; i &amp;lt; NB_TASKS;i++){&lt;br /&gt;
    if (Taches[i].etat.sit == ENDORMI) Taches[i].etat.time.tempsendormi -= 20;&lt;br /&gt;
    if (Taches[i].etat.time.tempsendormi &amp;lt;= 0) {&lt;br /&gt;
      Taches[i].etat.time.tempsendormi = 0;&lt;br /&gt;
      Taches[i].etat.sit = ACTIF;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre nouvel ordonnanceur qui appelle &amp;lt;code&amp;gt;Sleeping()&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void ordonnanceur(){&lt;br /&gt;
    PORTC ^= 0x01; // On fait clignoter une des led (J1) à chaque fois que l'ordonnanceur est appelé&lt;br /&gt;
    Sleeping();&lt;br /&gt;
    do{&lt;br /&gt;
       courant ++;&lt;br /&gt;
       if (courant == NB_TASKS) courant = 0;&lt;br /&gt;
    } while (Taches[courant].etat.sit == ENDORMI);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction endors la tâche pendant la durée t (en millisecondes).&lt;br /&gt;
On remet ensuite le timer à 0 et on lance l'interruption manuellement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void makeSleep(int t){&lt;br /&gt;
  Taches[courant].etat.sit = ENDORMI;&lt;br /&gt;
  Taches[courant].etat.time.tempsendormi = t;&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
  TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici notre struture modifiée pour ajouter l'état endormi&lt;br /&gt;
On utilise une union pour representer le temps d'endormissement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define ENDORMI 1&lt;br /&gt;
#define ACTIF 0&lt;br /&gt;
&lt;br /&gt;
typedef union{&lt;br /&gt;
  int tempsendormi;&lt;br /&gt;
} Time;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
  int situation;  //1 pour endormi, 0 pour éveillé &lt;br /&gt;
  Time time;&lt;br /&gt;
} Etat;&lt;br /&gt;
&lt;br /&gt;
typedef struct task{&lt;br /&gt;
  void (*start)(void);&lt;br /&gt;
  uint16_t stack;&lt;br /&gt;
  Etat etat;&lt;br /&gt;
} task;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmi notre groupe, nous sommes le binôme en charge de la carte mère. &lt;br /&gt;
Nous avons décidé d'utiliser un Atmega 328p qui sera programmé avec &amp;lt;code&amp;gt;avr-dude&amp;lt;/code&amp;gt; pour cela notre carte mère comportera également un Atmega8u2 qui servira de programmateur et d'interface serie/USB. &lt;br /&gt;
&lt;br /&gt;
Notre carte étant similaire à une Arduino UNO avec le shield intégré nous mesurerons lors de la prochaine séance la consommation de celle ci afin d'estimer la conso de la future carte mère. Avec cette mesure et les estimations de consommation des différentes cartes filles nous réaliserons un bilan de puissance détaillé.&lt;br /&gt;
&lt;br /&gt;
Pour l'instant nous avons prévu une alimentation par un port USB C, ayant connecté les pins CC1 et CC2 à des resistances de 5.1k nous obtenons 5v et 3A max. Il sera donc simple d'alimenter notre carte avec un câble USB, chargeur de téléphone ou alimentation de Raspberry par exemple et d'obtenir jusqu'à 15w ce qui semble largement suffisant.&lt;br /&gt;
&lt;br /&gt;
Notre PCB est terminé, voici le schéma et un rendu du PCB final. &lt;br /&gt;
[[File:Pico2024_B8_sch_PCB.pdf|thumb|left|500px|Le schéma final (en 3 pages)]]&lt;br /&gt;
[[File:Pico2024_B8_rendu_PCB.png|thumb|right|500px|Le PCB final]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Les fichiers GERBER sont disponibles dans notre dépot [https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT]&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre PCB, pour commencer nous assemblons les composants minimums pour faire clignoter une LED avec le 328p.&lt;br /&gt;
[[File:Pico2024_B8_PCB_recu.jpeg|thumb|left|500px|Le naked PCB]]&lt;br /&gt;
[[File:Pico2024_B8_PC1.jpeg|thumb|right|500px|Ca fonctionne]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
En programmant par le port ISP avec une Arduino as ISP on arrive à faire clignoter la LED reliée sur PC1 du 328p. On soude ensuite le minimum pour tester l'AtMega8u2, on arrive à faire clignoter deux led reliées a ses broches. &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_8U2.jpeg|thumb|left|500px|Les atmega sont soudés]]&lt;br /&gt;
[[File:Pico2024_B8_double_blinking.mp4|thumb|right|500px|Blinking lights]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous installons maintenant le firmware dans le 8u2 et le bootloader dans le 328p afin de pouvoir programmer le 328p en utilisant la connexion USB du 8u2.&lt;br /&gt;
Pour cela il faut effacer le 8u2, modifier les fuses pour notre crystal externe à 16MHz, puis flashez le firmware 8u2 provenant d'une Arduino UNO.&lt;br /&gt;
&amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -t&amp;lt;/code&amp;gt;Il faut ensuite envoyer la commande &amp;lt;code&amp;gt;erase&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;quit&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xde:m -U hfuse:w:0xd9:m -U efuse:w:0xf4:m&amp;lt;/code&amp;gt; commande pour la modification des fuses&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U flash:w:8u2_firmware.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_erreur.jpeg|thumb|left|400px|D- et D+ inversés]]&lt;br /&gt;
Malheureusement notre carte n'est pas reconnue par l'ordinateur avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt;. Avec &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt; on voit bien un périphérique USB mais avec des erreurs, nous avons essayé de ressouder notre connecteur USB-C et vérifions au multimètre que les pins sont bien soudés mais nous avons toujours les mêmes erreurs. Après vérification de notre schéma une erreur s'est glissée lors du commit 181625dc05 fait par monsieur Redon, les pins D+ et D- sont inversés. Nous modifions notre carte pour corriger cette erreur, notre carte est bien reconnue par l'ordinateur.&lt;br /&gt;
Après soudure des connecteurs HE10 et des leds et résistances correspondantes, nous avons téleverser notre code pour l'ordonnanceur, l'écran sept segments écrivant bien et les leds clignotent donc notre carte est fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_mother_soudee.jpeg|thumb|left|500px|Carte soudée]]&lt;br /&gt;
[[File:Pico2024_B8_lsusb.png|thumb|right|500px|Reconnue (comme une Arduino UNO)]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
[[File:Pico2024_B8_mother_ordonnanceur.mp4|thumb|left|500px|Ordonnanceur sur notre carte]]&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6931</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6931"/>
		<updated>2024-12-04T11:05:53Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Carte mère */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine.&lt;br /&gt;
&lt;br /&gt;
Lors de ce projet nous allons réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur une carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===23 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===30 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===1 octobre 2024===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|left|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour notre ordonnanceur il est important d'initialiser les taches, notamment leur pointeur de pile. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int t){&lt;br /&gt;
    uint16_t oldSP = SP;&lt;br /&gt;
    SP = Taches[t].stack;&lt;br /&gt;
    uint16_t adresse = (uint16_t)Taches[t].start;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff));&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00) &amp;gt;&amp;gt; 8));&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[t].stack = SP;&lt;br /&gt;
    SP = oldSP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque interruption de l'ISR (toutes les 20ms) on sauvegarde le contexte de la tache en cours, l'ordonnanceur passe à la tache suivante et on restaure le contexte de cette tache.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){&lt;br /&gt;
    /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[courant].stack = SP;&lt;br /&gt;
    /* Appel à l'ordonnanceur */&lt;br /&gt;
    ordonnanceur();&lt;br /&gt;
    /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
    SP = Taches[courant].stack;&lt;br /&gt;
    portRESTORE_Registers();&lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tâche série===&lt;br /&gt;
&lt;br /&gt;
Une fois l’ordonnanceur capable de lancer deux tâches en parallèle, nous nous sommes attaqués à la communication série de la carte par USB. Pour ce faire, nous utilisons l’application minicom coté PC qui permet une connexion série. Il faut initialiser les paramètres de la connexion, notre carte renvoie le message reçu dans le terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Ci joint les deux taches responsables de l'envoi et de la reception de données par le protocole série, &amp;lt;code&amp;gt;serial_buffer&amp;lt;/code&amp;gt; est une variable globale utilisée pour stocker les messages reçus et à envoyer. Les fonctions &amp;lt;code&amp;gt;Serial_Transmit()&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;Serial_Receive()&amp;lt;/code&amp;gt; sont déclarées dans &amp;lt;code&amp;gt;pico_serial.h&amp;lt;/code&amp;gt; et proviennent de la documentation AVR.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SerialWrite(){&lt;br /&gt;
    while (1){&lt;br /&gt;
        Serial_Transmit('\r\n');&lt;br /&gt;
        Serial_Transmit(serial_buffer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SerialRead(){&lt;br /&gt;
    while(1){&lt;br /&gt;
        serial_buffer = Serial_Receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SerialSetup.png|thumb|right|400px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|left|400px|Message reçu par le port série]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Lors de ce test notre atmega envoi &amp;quot;LOULOUTOINE&amp;quot; en boucle sur le port série.&lt;br /&gt;
&lt;br /&gt;
===Tâche 7 segments===&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons maintenant une tâche permettant de communiquer avec l'écran 7 segments par la communication SPI (toujours en parallèle des autres tâches).&lt;br /&gt;
Voici par exemple deux des fonctions SPI, il faut préalablement initialiser la communication SPI avec les registres SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SPI_send(uint8_t data) {&lt;br /&gt;
    DISPLAY_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_PIN); //On met le pin CS de l'écran à l'état bas pour l'activer&lt;br /&gt;
    SPDR = data;&lt;br /&gt;
    while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
    DISPLAY_PORT |= (1&amp;lt;&amp;lt;DISPLAY_PIN); // On relache l'écran &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clearDisplaySPI() {&lt;br /&gt;
    SPI_send(0x76); // Commande pour effacer l'écran et remettre le curseur a gauche&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour afficher un caractère sur l'écran il suffit donc d'appeler &amp;lt;code&amp;gt;SPI_send()&amp;lt;/code&amp;gt; en passant en paramètre le caractère à envoyer.&lt;br /&gt;
[[File:Pico2024_B8_ordos7s_video.mp4|thumb|center|600px|Les 5 tâches en parallèle]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Etat endormi===&lt;br /&gt;
&lt;br /&gt;
Une fois que les tâches ont été correctement séparées, il a fallu ajuster notre ordonnanceur pour garantir que les délais de chaque tâche soient respectés. En effet, avec notre méthode actuelle qui repose sur l'utilisation de la fonction &amp;lt;code&amp;gt;_delays_ms()&amp;lt;/code&amp;gt;  à chaque ajout de tâche, le temps total d'exécution augmente de manière cumulative. Par exemple, avec deux tâches, un délai de 200 ms prendrait 400 ms, et avec trois tâches 600 ms. Pour résoudre ce problème, nous avons décidé d'ajouter un état à chaque tâche, permettant de les &amp;quot;endormir&amp;quot; lorsqu'elles ne sont pas appelées, et de les &amp;quot;réveiller&amp;quot; lorsqu'elles le sont. Grâce à ce système, chaque fois qu'une tâche endormie est exécutée, on décrémente son timer de 20 millisecondes à chaque cycle. Ainsi chaque tâche respecte son délai sans interférer avec l'exécution des autres tâches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void Sleeping(){&lt;br /&gt;
  for (int i = 0; i &amp;lt; NB_TASKS;i++){&lt;br /&gt;
    if (Taches[i].etat.sit == ENDORMI) Taches[i].etat.time.tempsendormi -= 20;&lt;br /&gt;
    if (Taches[i].etat.time.tempsendormi &amp;lt;= 0) {&lt;br /&gt;
      Taches[i].etat.time.tempsendormi = 0;&lt;br /&gt;
      Taches[i].etat.sit = ACTIF;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre nouvel ordonnanceur qui appelle &amp;lt;code&amp;gt;Sleeping()&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void ordonnanceur(){&lt;br /&gt;
    PORTC ^= 0x01; // On fait clignoter une des led (J1) à chaque fois que l'ordonnanceur est appelé&lt;br /&gt;
    Sleeping();&lt;br /&gt;
    do{&lt;br /&gt;
       courant ++;&lt;br /&gt;
       if (courant == NB_TASKS) courant = 0;&lt;br /&gt;
    } while (Taches[courant].etat.sit == ENDORMI);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction endors la tâche pendant la durée t (en millisecondes).&lt;br /&gt;
On remet ensuite le timer à 0 et on lance l'interruption manuellement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void makeSleep(int t){&lt;br /&gt;
  Taches[courant].etat.sit = ENDORMI;&lt;br /&gt;
  Taches[courant].etat.time.tempsendormi = t;&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
  TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici notre struture modifiée pour ajouter l'état endormi&lt;br /&gt;
On utilise une union pour representer le temps d'endormissement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define ENDORMI 1&lt;br /&gt;
#define ACTIF 0&lt;br /&gt;
&lt;br /&gt;
typedef union{&lt;br /&gt;
  int tempsendormi;&lt;br /&gt;
} Time;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
  int situation;  //1 pour endormi, 0 pour éveillé &lt;br /&gt;
  Time time;&lt;br /&gt;
} Etat;&lt;br /&gt;
&lt;br /&gt;
typedef struct task{&lt;br /&gt;
  void (*start)(void);&lt;br /&gt;
  uint16_t stack;&lt;br /&gt;
  Etat etat;&lt;br /&gt;
} task;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmi notre groupe, nous sommes le binôme en charge de la carte mère. &lt;br /&gt;
Nous avons décidé d'utiliser un Atmega 328p qui sera programmé avec &amp;lt;code&amp;gt;avr-dude&amp;lt;/code&amp;gt; pour cela notre carte mère comportera également un Atmega8u2 qui servira de programmateur et d'interface serie/USB. &lt;br /&gt;
&lt;br /&gt;
Notre carte étant similaire à une Arduino UNO avec le shield intégré nous mesurerons lors de la prochaine séance la consommation de celle ci afin d'estimer la conso de la future carte mère. Avec cette mesure et les estimations de consommation des différentes cartes filles nous réaliserons un bilan de puissance détaillé.&lt;br /&gt;
&lt;br /&gt;
Pour l'instant nous avons prévu une alimentation par un port USB C, ayant connecté les pins CC1 et CC2 à des resistances de 5.1k nous obtenons 5v et 3A max. Il sera donc simple d'alimenter notre carte avec un câble USB, chargeur de téléphone ou alimentation de Raspberry par exemple et d'obtenir jusqu'à 15w ce qui semble largement suffisant.&lt;br /&gt;
&lt;br /&gt;
Notre PCB est terminé, voici le schéma et un rendu du PCB final. &lt;br /&gt;
[[File:Pico2024_B8_sch_PCB.pdf|thumb|left|500px|Le schéma final (en 3 pages)]]&lt;br /&gt;
[[File:Pico2024_B8_rendu_PCB.png|thumb|right|500px|Le PCB final]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Les fichiers GERBER sont disponibles dans notre dépot [https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT]&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre PCB, pour commencer nous assemblons les composants minimums pour faire clignoter une LED avec le 328p.&lt;br /&gt;
[[File:Pico2024_B8_PCB_recu.jpeg|thumb|left|500px|Le naked PCB]]&lt;br /&gt;
[[File:Pico2024_B8_PC1.jpeg|thumb|right|500px|Ca fonctionne]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
En programmant par le port ISP avec une Arduino as ISP on arrive à faire clignoter la LED reliée sur PC1 du 328p. On soude ensuite le minimum pour tester l'AtMega8u2, on arrive à faire clignoter deux led reliées a ses broches. &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_8U2.jpeg|thumb|left|500px|Les atmega sont soudés]]&lt;br /&gt;
[[File:Pico2024_B8_double_blinking.mp4|thumb|right|500px|Blinking lights]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous installons maintenant le firmware dans le 8u2 et le bootloader dans le 328p afin de pouvoir programmer le 328p en utilisant la connexion USB du 8u2.&lt;br /&gt;
Pour cela il faut effacer le 8u2, modifier les fuses pour notre crystal externe à 16MHz, puis flashez le firmware 8u2 provenant d'une Arduino UNO.&lt;br /&gt;
&amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -t&amp;lt;/code&amp;gt;Il faut ensuite envoyer la commande &amp;lt;code&amp;gt;erase&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;quit&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xde:m -U hfuse:w:0xd9:m -U efuse:w:0xf4:m&amp;lt;/code&amp;gt; commande pour la modification des fuses&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U flash:w:8u2_firmware.hex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_erreur.jpeg|thumb|left|400px|D- et D+ inversés]]&lt;br /&gt;
Malheureusement notre carte n'est pas reconnue par l'ordinateur avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt;. Avec &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt; on voit bien un périphérique USB mais avec des erreurs, nous avons essayé de ressouder notre connecteur USB-C et vérifions au multimètre que les pins sont bien soudés mais nous avons toujours les mêmes erreurs. Après vérification de notre schéma une erreur s'est glissée lors du commit 181625dc05 fait par monsieur Redon, les pins D+ et D- sont inversés. Nous modifions notre carte pour corriger cette erreur, notre carte est bien reconnue par l'ordinateur.&lt;br /&gt;
Après soudure des connecteurs HE10 et des leds et résistances correspondantes, nous avons téleverser notre code pour l'ordonnanceur, l'écran sept segments écrivant bien et les leds clignotent donc notre carte est fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_mother_soudee.jpeg|thumb|left|500px|Carte soudée]]&lt;br /&gt;
[[File:Pico2024_B8_lsusb.jpeg|thumb|right|500px|Reconnue (comme une Arduino UNO)]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
[[File:Pico2024_B8_mother_ordonnanceur|thumb|left|500px|Ordonnanceur sur notre carte]]&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Pico2024_B8_lsusb.png&amp;diff=6928</id>
		<title>Fichier:Pico2024 B8 lsusb.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Pico2024_B8_lsusb.png&amp;diff=6928"/>
		<updated>2024-12-04T09:43:50Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6914</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6914"/>
		<updated>2024-12-02T10:35:09Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Carte mère */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine.&lt;br /&gt;
&lt;br /&gt;
Lors de ce projet nous allons réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur une carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===23 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===30 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===1 octobre 2024===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|left|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour notre ordonnanceur il est important d'initialiser les taches, notamment leur pointeur de pile. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int t){&lt;br /&gt;
    uint16_t oldSP = SP;&lt;br /&gt;
    SP = Taches[t].stack;&lt;br /&gt;
    uint16_t adresse = (uint16_t)Taches[t].start;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff));&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00) &amp;gt;&amp;gt; 8));&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[t].stack = SP;&lt;br /&gt;
    SP = oldSP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque interruption de l'ISR (toutes les 20ms) on sauvegarde le contexte de la tache en cours, l'ordonnanceur passe à la tache suivante et on restaure le contexte de cette tache.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){&lt;br /&gt;
    /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[courant].stack = SP;&lt;br /&gt;
    /* Appel à l'ordonnanceur */&lt;br /&gt;
    ordonnanceur();&lt;br /&gt;
    /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
    SP = Taches[courant].stack;&lt;br /&gt;
    portRESTORE_Registers();&lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tâche série===&lt;br /&gt;
&lt;br /&gt;
Une fois l’ordonnanceur capable de lancer deux tâches en parallèle, nous nous sommes attaqués à la communication série de la carte par USB. Pour ce faire, nous utilisons l’application minicom coté PC qui permet une connexion série. Il faut initialiser les paramètres de la connexion, notre carte renvoie le message reçu dans le terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Ci joint les deux taches responsables de l'envoi et de la reception de données par le protocole série, &amp;lt;code&amp;gt;serial_buffer&amp;lt;/code&amp;gt; est une variable globale utilisée pour stocker les messages reçus et à envoyer. Les fonctions &amp;lt;code&amp;gt;Serial_Transmit()&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;Serial_Receive()&amp;lt;/code&amp;gt; sont déclarées dans &amp;lt;code&amp;gt;pico_serial.h&amp;lt;/code&amp;gt; et proviennent de la documentation AVR.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SerialWrite(){&lt;br /&gt;
    while (1){&lt;br /&gt;
        Serial_Transmit('\r\n');&lt;br /&gt;
        Serial_Transmit(serial_buffer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SerialRead(){&lt;br /&gt;
    while(1){&lt;br /&gt;
        serial_buffer = Serial_Receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SerialSetup.png|thumb|right|400px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|left|400px|Message reçu par le port série]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Lors de ce test notre atmega envoi &amp;quot;LOULOUTOINE&amp;quot; en boucle sur le port série.&lt;br /&gt;
&lt;br /&gt;
===Tâche 7 segments===&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons maintenant une tâche permettant de communiquer avec l'écran 7 segments par la communication SPI (toujours en parallèle des autres tâches).&lt;br /&gt;
Voici par exemple deux des fonctions SPI, il faut préalablement initialiser la communication SPI avec les registres SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SPI_send(uint8_t data) {&lt;br /&gt;
    DISPLAY_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_PIN); //On met le pin CS de l'écran à l'état bas pour l'activer&lt;br /&gt;
    SPDR = data;&lt;br /&gt;
    while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
    DISPLAY_PORT |= (1&amp;lt;&amp;lt;DISPLAY_PIN); // On relache l'écran &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clearDisplaySPI() {&lt;br /&gt;
    SPI_send(0x76); // Commande pour effacer l'écran et remettre le curseur a gauche&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour afficher un caractère sur l'écran il suffit donc d'appeler &amp;lt;code&amp;gt;SPI_send()&amp;lt;/code&amp;gt; en passant en paramètre le caractère à envoyer.&lt;br /&gt;
[[File:Pico2024_B8_ordos7s_video.mp4|thumb|center|600px|Les 5 tâches en parallèle]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Etat endormi===&lt;br /&gt;
&lt;br /&gt;
Une fois que les tâches ont été correctement séparées, il a fallu ajuster notre ordonnanceur pour garantir que les délais de chaque tâche soient respectés. En effet, avec notre méthode actuelle qui repose sur l'utilisation de la fonction &amp;lt;code&amp;gt;_delays_ms()&amp;lt;/code&amp;gt;  à chaque ajout de tâche, le temps total d'exécution augmente de manière cumulative. Par exemple, avec deux tâches, un délai de 200 ms prendrait 400 ms, et avec trois tâches 600 ms. Pour résoudre ce problème, nous avons décidé d'ajouter un état à chaque tâche, permettant de les &amp;quot;endormir&amp;quot; lorsqu'elles ne sont pas appelées, et de les &amp;quot;réveiller&amp;quot; lorsqu'elles le sont. Grâce à ce système, chaque fois qu'une tâche endormie est exécutée, on décrémente son timer de 20 millisecondes à chaque cycle. Ainsi chaque tâche respecte son délai sans interférer avec l'exécution des autres tâches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void Sleeping(){&lt;br /&gt;
  for (int i = 0; i &amp;lt; NB_TASKS;i++){&lt;br /&gt;
    if (Taches[i].etat.sit == ENDORMI) Taches[i].etat.time.tempsendormi -= 20;&lt;br /&gt;
    if (Taches[i].etat.time.tempsendormi &amp;lt;= 0) {&lt;br /&gt;
      Taches[i].etat.time.tempsendormi = 0;&lt;br /&gt;
      Taches[i].etat.sit = ACTIF;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre nouvel ordonnanceur qui appelle &amp;lt;code&amp;gt;Sleeping()&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void ordonnanceur(){&lt;br /&gt;
    PORTC ^= 0x01; // On fait clignoter une des led (J1) à chaque fois que l'ordonnanceur est appelé&lt;br /&gt;
    Sleeping();&lt;br /&gt;
    do{&lt;br /&gt;
       courant ++;&lt;br /&gt;
       if (courant == NB_TASKS) courant = 0;&lt;br /&gt;
    } while (Taches[courant].etat.sit == ENDORMI);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction endors la tâche pendant la durée t (en millisecondes).&lt;br /&gt;
On remet ensuite le timer à 0 et on lance l'interruption manuellement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void makeSleep(int t){&lt;br /&gt;
  Taches[courant].etat.sit = ENDORMI;&lt;br /&gt;
  Taches[courant].etat.time.tempsendormi = t;&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
  TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici notre struture modifiée pour ajouter l'état endormi&lt;br /&gt;
On utilise une union pour representer le temps d'endormissement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define ENDORMI 1&lt;br /&gt;
#define ACTIF 0&lt;br /&gt;
&lt;br /&gt;
typedef union{&lt;br /&gt;
  int tempsendormi;&lt;br /&gt;
} Time;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
  int situation;  //1 pour endormi, 0 pour éveillé &lt;br /&gt;
  Time time;&lt;br /&gt;
} Etat;&lt;br /&gt;
&lt;br /&gt;
typedef struct task{&lt;br /&gt;
  void (*start)(void);&lt;br /&gt;
  uint16_t stack;&lt;br /&gt;
  Etat etat;&lt;br /&gt;
} task;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmi notre groupe, nous sommes le binôme en charge de la carte mère. &lt;br /&gt;
Nous avons décidé d'utiliser un Atmega 328p qui sera programmé avec &amp;lt;code&amp;gt;avr-dude&amp;lt;/code&amp;gt; pour cela notre carte mère comportera également un Atmega8u2 qui servira de programmateur et d'interface serie/USB. &lt;br /&gt;
&lt;br /&gt;
Notre carte étant similaire à une Arduino UNO avec le shield intégré nous mesurerons lors de la prochaine séance la consommation de celle ci afin d'estimer la conso de la future carte mère. Avec cette mesure et les estimations de consommation des différentes cartes filles nous réaliserons un bilan de puissance détaillé.&lt;br /&gt;
&lt;br /&gt;
Pour l'instant nous avons prévu une alimentation par un port USB C, ayant connecté les pins CC1 et CC2 à des resistances de 5.1k nous obtenons 5v et 3A max. Il sera donc simple d'alimenter notre carte avec un câble USB, chargeur de téléphone ou alimentation de Raspberry par exemple et d'obtenir jusqu'à 15w ce qui semble largement suffisant.&lt;br /&gt;
&lt;br /&gt;
Notre PCB est terminé, voici le schéma et un rendu du PCB final. &lt;br /&gt;
[[File:Pico2024_B8_sch_PCB.pdf|thumb|left|500px|Le schéma final (en 3 pages)]]&lt;br /&gt;
[[File:Pico2024_B8_rendu_PCB.png|thumb|right|500px|Le PCB final]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Les fichiers GERBER sont disponibles dans notre dépot [https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT]&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre PCB, pour commencer nous assemblons les composants minimums pour faire clignoter une LED avec le 328p.&lt;br /&gt;
[[File:Pico2024_B8_PCB_recu.jpeg|thumb|left|500px|Le naked PCB]]&lt;br /&gt;
[[File:Pico2024_B8_PC1.jpeg|thumb|right|500px|Ca fonctionne]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
En programmant par le port ISP avec une Arduino as ISP on arrive à faire clignoter la LED reliée sur PC1 du 328p. On soude ensuite le minimum pour tester l'AtMega8u2, on arrive à faire clignoter deux led reliées a ses broches. &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_8U2.jpeg|thumb|left|700px|Les atmega sont soudés]]&lt;br /&gt;
[[File:Pico2024_B8_double_blinking.mp4|thumb|right|500px|Blinking lights]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -t&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
cela nous emmène dans un termial dans lequel nous pouvous débloquer la modification des fuses grâce à la commande&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
avrdude&amp;gt; erase&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xde:m -U hfuse:w:0xd9:m -U efuse:w:0xf4:m&lt;br /&gt;
avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U flash:w:at90usb82-bl-usb-1_0_5.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
problème de dtr, pas de resest possible sur le 8u2 car pas de boutons, ne démarre pas sur le bootloader donc pas possible de le voir grâce à &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6913</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6913"/>
		<updated>2024-12-02T10:33:13Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Carte mère */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine.&lt;br /&gt;
&lt;br /&gt;
Lors de ce projet nous allons réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur une carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===23 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===30 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===1 octobre 2024===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|left|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour notre ordonnanceur il est important d'initialiser les taches, notamment leur pointeur de pile. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int t){&lt;br /&gt;
    uint16_t oldSP = SP;&lt;br /&gt;
    SP = Taches[t].stack;&lt;br /&gt;
    uint16_t adresse = (uint16_t)Taches[t].start;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff));&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00) &amp;gt;&amp;gt; 8));&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[t].stack = SP;&lt;br /&gt;
    SP = oldSP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque interruption de l'ISR (toutes les 20ms) on sauvegarde le contexte de la tache en cours, l'ordonnanceur passe à la tache suivante et on restaure le contexte de cette tache.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){&lt;br /&gt;
    /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[courant].stack = SP;&lt;br /&gt;
    /* Appel à l'ordonnanceur */&lt;br /&gt;
    ordonnanceur();&lt;br /&gt;
    /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
    SP = Taches[courant].stack;&lt;br /&gt;
    portRESTORE_Registers();&lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tâche série===&lt;br /&gt;
&lt;br /&gt;
Une fois l’ordonnanceur capable de lancer deux tâches en parallèle, nous nous sommes attaqués à la communication série de la carte par USB. Pour ce faire, nous utilisons l’application minicom coté PC qui permet une connexion série. Il faut initialiser les paramètres de la connexion, notre carte renvoie le message reçu dans le terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Ci joint les deux taches responsables de l'envoi et de la reception de données par le protocole série, &amp;lt;code&amp;gt;serial_buffer&amp;lt;/code&amp;gt; est une variable globale utilisée pour stocker les messages reçus et à envoyer. Les fonctions &amp;lt;code&amp;gt;Serial_Transmit()&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;Serial_Receive()&amp;lt;/code&amp;gt; sont déclarées dans &amp;lt;code&amp;gt;pico_serial.h&amp;lt;/code&amp;gt; et proviennent de la documentation AVR.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SerialWrite(){&lt;br /&gt;
    while (1){&lt;br /&gt;
        Serial_Transmit('\r\n');&lt;br /&gt;
        Serial_Transmit(serial_buffer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SerialRead(){&lt;br /&gt;
    while(1){&lt;br /&gt;
        serial_buffer = Serial_Receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SerialSetup.png|thumb|right|400px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|left|400px|Message reçu par le port série]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Lors de ce test notre atmega envoi &amp;quot;LOULOUTOINE&amp;quot; en boucle sur le port série.&lt;br /&gt;
&lt;br /&gt;
===Tâche 7 segments===&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons maintenant une tâche permettant de communiquer avec l'écran 7 segments par la communication SPI (toujours en parallèle des autres tâches).&lt;br /&gt;
Voici par exemple deux des fonctions SPI, il faut préalablement initialiser la communication SPI avec les registres SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SPI_send(uint8_t data) {&lt;br /&gt;
    DISPLAY_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_PIN); //On met le pin CS de l'écran à l'état bas pour l'activer&lt;br /&gt;
    SPDR = data;&lt;br /&gt;
    while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
    DISPLAY_PORT |= (1&amp;lt;&amp;lt;DISPLAY_PIN); // On relache l'écran &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clearDisplaySPI() {&lt;br /&gt;
    SPI_send(0x76); // Commande pour effacer l'écran et remettre le curseur a gauche&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour afficher un caractère sur l'écran il suffit donc d'appeler &amp;lt;code&amp;gt;SPI_send()&amp;lt;/code&amp;gt; en passant en paramètre le caractère à envoyer.&lt;br /&gt;
[[File:Pico2024_B8_ordos7s_video.mp4|thumb|center|600px|Les 5 tâches en parallèle]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Etat endormi===&lt;br /&gt;
&lt;br /&gt;
Une fois que les tâches ont été correctement séparées, il a fallu ajuster notre ordonnanceur pour garantir que les délais de chaque tâche soient respectés. En effet, avec notre méthode actuelle qui repose sur l'utilisation de la fonction &amp;lt;code&amp;gt;_delays_ms()&amp;lt;/code&amp;gt;  à chaque ajout de tâche, le temps total d'exécution augmente de manière cumulative. Par exemple, avec deux tâches, un délai de 200 ms prendrait 400 ms, et avec trois tâches 600 ms. Pour résoudre ce problème, nous avons décidé d'ajouter un état à chaque tâche, permettant de les &amp;quot;endormir&amp;quot; lorsqu'elles ne sont pas appelées, et de les &amp;quot;réveiller&amp;quot; lorsqu'elles le sont. Grâce à ce système, chaque fois qu'une tâche endormie est exécutée, on décrémente son timer de 20 millisecondes à chaque cycle. Ainsi chaque tâche respecte son délai sans interférer avec l'exécution des autres tâches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void Sleeping(){&lt;br /&gt;
  for (int i = 0; i &amp;lt; NB_TASKS;i++){&lt;br /&gt;
    if (Taches[i].etat.sit == ENDORMI) Taches[i].etat.time.tempsendormi -= 20;&lt;br /&gt;
    if (Taches[i].etat.time.tempsendormi &amp;lt;= 0) {&lt;br /&gt;
      Taches[i].etat.time.tempsendormi = 0;&lt;br /&gt;
      Taches[i].etat.sit = ACTIF;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre nouvel ordonnanceur qui appelle &amp;lt;code&amp;gt;Sleeping()&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void ordonnanceur(){&lt;br /&gt;
    PORTC ^= 0x01; // On fait clignoter une des led (J1) à chaque fois que l'ordonnanceur est appelé&lt;br /&gt;
    Sleeping();&lt;br /&gt;
    do{&lt;br /&gt;
       courant ++;&lt;br /&gt;
       if (courant == NB_TASKS) courant = 0;&lt;br /&gt;
    } while (Taches[courant].etat.sit == ENDORMI);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction endors la tâche pendant la durée t (en millisecondes).&lt;br /&gt;
On remet ensuite le timer à 0 et on lance l'interruption manuellement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void makeSleep(int t){&lt;br /&gt;
  Taches[courant].etat.sit = ENDORMI;&lt;br /&gt;
  Taches[courant].etat.time.tempsendormi = t;&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
  TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici notre struture modifiée pour ajouter l'état endormi&lt;br /&gt;
On utilise une union pour representer le temps d'endormissement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define ENDORMI 1&lt;br /&gt;
#define ACTIF 0&lt;br /&gt;
&lt;br /&gt;
typedef union{&lt;br /&gt;
  int tempsendormi;&lt;br /&gt;
} Time;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
  int situation;  //1 pour endormi, 0 pour éveillé &lt;br /&gt;
  Time time;&lt;br /&gt;
} Etat;&lt;br /&gt;
&lt;br /&gt;
typedef struct task{&lt;br /&gt;
  void (*start)(void);&lt;br /&gt;
  uint16_t stack;&lt;br /&gt;
  Etat etat;&lt;br /&gt;
} task;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmi notre groupe, nous sommes le binôme en charge de la carte mère. &lt;br /&gt;
Nous avons décidé d'utiliser un Atmega 328p qui sera programmé avec &amp;lt;code&amp;gt;avr-dude&amp;lt;/code&amp;gt; pour cela notre carte mère comportera également un Atmega8u2 qui servira de programmateur et d'interface serie/USB. &lt;br /&gt;
&lt;br /&gt;
Notre carte étant similaire à une Arduino UNO avec le shield intégré nous mesurerons lors de la prochaine séance la consommation de celle ci afin d'estimer la conso de la future carte mère. Avec cette mesure et les estimations de consommation des différentes cartes filles nous réaliserons un bilan de puissance détaillé.&lt;br /&gt;
&lt;br /&gt;
Pour l'instant nous avons prévu une alimentation par un port USB C, ayant connecté les pins CC1 et CC2 à des resistances de 5.1k nous obtenons 5v et 3A max. Il sera donc simple d'alimenter notre carte avec un câble USB, chargeur de téléphone ou alimentation de Raspberry par exemple et d'obtenir jusqu'à 15w ce qui semble largement suffisant.&lt;br /&gt;
&lt;br /&gt;
Notre PCB est terminé, voici le schéma et un rendu du PCB final. &lt;br /&gt;
[[File:Pico2024_B8_sch_PCB.pdf|thumb|left|500px|Le schéma final (en 3 pages)]]&lt;br /&gt;
[[File:Pico2024_B8_rendu_PCB.png|thumb|right|500px|Le PCB final]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Les fichiers GERBER sont disponibles dans notre dépot [https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT]&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre PCB, pour commencer nous assemblons les composants minimums pour faire clignoter une LED avec le 328p.&lt;br /&gt;
[[File:Pico2024_B8_PCB_recu.jpeg|thumb|left|500px|Le naked PCB]]&lt;br /&gt;
[[File:Pico2024_B8_PC1.jpeg|thumb|right|500px|Ca fonctionne]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
En programmant par le port ISP avec une Arduino as ISP on arrive à faire clignoter la LED reliée sur PC1 du 328p. On soude ensuite le minimum pour tester l'AtMega8u2, on arrive à faire clignoter deux led reliées a ses broches. &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_8U2.jpeg|thumb|left|700px|Les atmega sont soudés]]&lt;br /&gt;
[[File:Pico2024_B8_double_blinking.mp4|thumb|right|500px|Blinking lights]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -t&lt;br /&gt;
avrdude&amp;gt; erase&lt;br /&gt;
&lt;br /&gt;
avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xde:m -U hfuse:w:0xd9:m -U efuse:w:0xf4:m&lt;br /&gt;
avrdude -c stk500v1 -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U flash:w:at90usb82-bl-usb-1_0_5.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
problème de dtr, pas de resest possible sur le 8u2 car pas de boutons, ne démarre pas sur le bootloader donc pas possible de le voir grâce à &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6912</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6912"/>
		<updated>2024-12-02T10:14:29Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Carte mère */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine.&lt;br /&gt;
&lt;br /&gt;
Lors de ce projet nous allons réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur une carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===23 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===30 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===1 octobre 2024===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|left|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour notre ordonnanceur il est important d'initialiser les taches, notamment leur pointeur de pile. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int t){&lt;br /&gt;
    uint16_t oldSP = SP;&lt;br /&gt;
    SP = Taches[t].stack;&lt;br /&gt;
    uint16_t adresse = (uint16_t)Taches[t].start;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff));&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00) &amp;gt;&amp;gt; 8));&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[t].stack = SP;&lt;br /&gt;
    SP = oldSP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque interruption de l'ISR (toutes les 20ms) on sauvegarde le contexte de la tache en cours, l'ordonnanceur passe à la tache suivante et on restaure le contexte de cette tache.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){&lt;br /&gt;
    /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[courant].stack = SP;&lt;br /&gt;
    /* Appel à l'ordonnanceur */&lt;br /&gt;
    ordonnanceur();&lt;br /&gt;
    /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
    SP = Taches[courant].stack;&lt;br /&gt;
    portRESTORE_Registers();&lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tâche série===&lt;br /&gt;
&lt;br /&gt;
Une fois l’ordonnanceur capable de lancer deux tâches en parallèle, nous nous sommes attaqués à la communication série de la carte par USB. Pour ce faire, nous utilisons l’application minicom coté PC qui permet une connexion série. Il faut initialiser les paramètres de la connexion, notre carte renvoie le message reçu dans le terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Ci joint les deux taches responsables de l'envoi et de la reception de données par le protocole série, &amp;lt;code&amp;gt;serial_buffer&amp;lt;/code&amp;gt; est une variable globale utilisée pour stocker les messages reçus et à envoyer. Les fonctions &amp;lt;code&amp;gt;Serial_Transmit()&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;Serial_Receive()&amp;lt;/code&amp;gt; sont déclarées dans &amp;lt;code&amp;gt;pico_serial.h&amp;lt;/code&amp;gt; et proviennent de la documentation AVR.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SerialWrite(){&lt;br /&gt;
    while (1){&lt;br /&gt;
        Serial_Transmit('\r\n');&lt;br /&gt;
        Serial_Transmit(serial_buffer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SerialRead(){&lt;br /&gt;
    while(1){&lt;br /&gt;
        serial_buffer = Serial_Receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SerialSetup.png|thumb|right|400px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|left|400px|Message reçu par le port série]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Lors de ce test notre atmega envoi &amp;quot;LOULOUTOINE&amp;quot; en boucle sur le port série.&lt;br /&gt;
&lt;br /&gt;
===Tâche 7 segments===&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons maintenant une tâche permettant de communiquer avec l'écran 7 segments par la communication SPI (toujours en parallèle des autres tâches).&lt;br /&gt;
Voici par exemple deux des fonctions SPI, il faut préalablement initialiser la communication SPI avec les registres SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SPI_send(uint8_t data) {&lt;br /&gt;
    DISPLAY_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_PIN); //On met le pin CS de l'écran à l'état bas pour l'activer&lt;br /&gt;
    SPDR = data;&lt;br /&gt;
    while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
    DISPLAY_PORT |= (1&amp;lt;&amp;lt;DISPLAY_PIN); // On relache l'écran &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clearDisplaySPI() {&lt;br /&gt;
    SPI_send(0x76); // Commande pour effacer l'écran et remettre le curseur a gauche&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour afficher un caractère sur l'écran il suffit donc d'appeler &amp;lt;code&amp;gt;SPI_send()&amp;lt;/code&amp;gt; en passant en paramètre le caractère à envoyer.&lt;br /&gt;
[[File:Pico2024_B8_ordos7s_video.mp4|thumb|center|600px|Les 5 tâches en parallèle]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Etat endormi===&lt;br /&gt;
&lt;br /&gt;
Une fois que les tâches ont été correctement séparées, il a fallu ajuster notre ordonnanceur pour garantir que les délais de chaque tâche soient respectés. En effet, avec notre méthode actuelle qui repose sur l'utilisation de la fonction &amp;lt;code&amp;gt;_delays_ms()&amp;lt;/code&amp;gt;  à chaque ajout de tâche, le temps total d'exécution augmente de manière cumulative. Par exemple, avec deux tâches, un délai de 200 ms prendrait 400 ms, et avec trois tâches 600 ms. Pour résoudre ce problème, nous avons décidé d'ajouter un état à chaque tâche, permettant de les &amp;quot;endormir&amp;quot; lorsqu'elles ne sont pas appelées, et de les &amp;quot;réveiller&amp;quot; lorsqu'elles le sont. Grâce à ce système, chaque fois qu'une tâche endormie est exécutée, on décrémente son timer de 20 millisecondes à chaque cycle. Ainsi chaque tâche respecte son délai sans interférer avec l'exécution des autres tâches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void Sleeping(){&lt;br /&gt;
  for (int i = 0; i &amp;lt; NB_TASKS;i++){&lt;br /&gt;
    if (Taches[i].etat.sit == ENDORMI) Taches[i].etat.time.tempsendormi -= 20;&lt;br /&gt;
    if (Taches[i].etat.time.tempsendormi &amp;lt;= 0) {&lt;br /&gt;
      Taches[i].etat.time.tempsendormi = 0;&lt;br /&gt;
      Taches[i].etat.sit = ACTIF;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre nouvel ordonnanceur qui appelle &amp;lt;code&amp;gt;Sleeping()&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void ordonnanceur(){&lt;br /&gt;
    PORTC ^= 0x01; // On fait clignoter une des led (J1) à chaque fois que l'ordonnanceur est appelé&lt;br /&gt;
    Sleeping();&lt;br /&gt;
    do{&lt;br /&gt;
       courant ++;&lt;br /&gt;
       if (courant == NB_TASKS) courant = 0;&lt;br /&gt;
    } while (Taches[courant].etat.sit == ENDORMI);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction endors la tâche pendant la durée t (en millisecondes).&lt;br /&gt;
On remet ensuite le timer à 0 et on lance l'interruption manuellement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void makeSleep(int t){&lt;br /&gt;
  Taches[courant].etat.sit = ENDORMI;&lt;br /&gt;
  Taches[courant].etat.time.tempsendormi = t;&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
  TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici notre struture modifiée pour ajouter l'état endormi&lt;br /&gt;
On utilise une union pour representer le temps d'endormissement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define ENDORMI 1&lt;br /&gt;
#define ACTIF 0&lt;br /&gt;
&lt;br /&gt;
typedef union{&lt;br /&gt;
  int tempsendormi;&lt;br /&gt;
} Time;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
  int situation;  //1 pour endormi, 0 pour éveillé &lt;br /&gt;
  Time time;&lt;br /&gt;
} Etat;&lt;br /&gt;
&lt;br /&gt;
typedef struct task{&lt;br /&gt;
  void (*start)(void);&lt;br /&gt;
  uint16_t stack;&lt;br /&gt;
  Etat etat;&lt;br /&gt;
} task;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmi notre groupe, nous sommes le binôme en charge de la carte mère. &lt;br /&gt;
Nous avons décidé d'utiliser un Atmega 328p qui sera programmé avec &amp;lt;code&amp;gt;avr-dude&amp;lt;/code&amp;gt; pour cela notre carte mère comportera également un Atmega8u2 qui servira de programmateur et d'interface serie/USB. &lt;br /&gt;
&lt;br /&gt;
Notre carte étant similaire à une Arduino UNO avec le shield intégré nous mesurerons lors de la prochaine séance la consommation de celle ci afin d'estimer la conso de la future carte mère. Avec cette mesure et les estimations de consommation des différentes cartes filles nous réaliserons un bilan de puissance détaillé.&lt;br /&gt;
&lt;br /&gt;
Pour l'instant nous avons prévu une alimentation par un port USB C, ayant connecté les pins CC1 et CC2 à des resistances de 5.1k nous obtenons 5v et 3A max. Il sera donc simple d'alimenter notre carte avec un câble USB, chargeur de téléphone ou alimentation de Raspberry par exemple et d'obtenir jusqu'à 15w ce qui semble largement suffisant.&lt;br /&gt;
&lt;br /&gt;
Notre PCB est terminé, voici le schéma et un rendu du PCB final. &lt;br /&gt;
[[File:Pico2024_B8_sch_PCB.pdf|thumb|left|500px|Le schéma final (en 3 pages)]]&lt;br /&gt;
[[File:Pico2024_B8_rendu_PCB.png|thumb|right|500px|Le PCB final]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Les fichiers GERBER sont disponibles dans notre dépot [https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT]&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre PCB, pour commencer nous assemblons les composants minimums pour faire clignoter une LED avec le 328p.&lt;br /&gt;
[[File:Pico2024_B8_PCB_recu.jpeg|thumb|left|500px|Le naked PCB]]&lt;br /&gt;
[[File:Pico2024_B8_PC1.jpeg|thumb|right|500px|Ca fonctionne]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
En programmant par le port ISP avec une Arduino as ISP on arrive à faire clignoter la LED reliée sur PC1 du 328p. On soude ensuite le minimum pour tester l'AtMega8u2, on arrive à faire clignoter deux led reliées a ses broches. &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_8U2.jpeg|thumb|left|700px|Les atmega sont soudés]]&lt;br /&gt;
[[File:Pico2024_B8_double_blinking.mp4|thumb|right|500px|Blinking lights]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
avrdude -c avrisp -p atmega8u2 -P /dev/ttyACM0 -b 19200 -t&lt;br /&gt;
avrdude&amp;gt; erase&lt;br /&gt;
&lt;br /&gt;
avrdude -c avrisp -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U flash:w:at90usb82-bl-usb-1_0_5.hex&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
problème de dtr, pas de resest possible sur le 8u2 car pas de boutons, ne démarre pas sur le bootloader donc pas possible de le voir grâce à &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6911</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6911"/>
		<updated>2024-12-02T10:13:59Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Carte mère */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine.&lt;br /&gt;
&lt;br /&gt;
Lors de ce projet nous allons réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur une carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===23 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===30 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===1 octobre 2024===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|left|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour notre ordonnanceur il est important d'initialiser les taches, notamment leur pointeur de pile. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int t){&lt;br /&gt;
    uint16_t oldSP = SP;&lt;br /&gt;
    SP = Taches[t].stack;&lt;br /&gt;
    uint16_t adresse = (uint16_t)Taches[t].start;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff));&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00) &amp;gt;&amp;gt; 8));&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[t].stack = SP;&lt;br /&gt;
    SP = oldSP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque interruption de l'ISR (toutes les 20ms) on sauvegarde le contexte de la tache en cours, l'ordonnanceur passe à la tache suivante et on restaure le contexte de cette tache.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){&lt;br /&gt;
    /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[courant].stack = SP;&lt;br /&gt;
    /* Appel à l'ordonnanceur */&lt;br /&gt;
    ordonnanceur();&lt;br /&gt;
    /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
    SP = Taches[courant].stack;&lt;br /&gt;
    portRESTORE_Registers();&lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tâche série===&lt;br /&gt;
&lt;br /&gt;
Une fois l’ordonnanceur capable de lancer deux tâches en parallèle, nous nous sommes attaqués à la communication série de la carte par USB. Pour ce faire, nous utilisons l’application minicom coté PC qui permet une connexion série. Il faut initialiser les paramètres de la connexion, notre carte renvoie le message reçu dans le terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Ci joint les deux taches responsables de l'envoi et de la reception de données par le protocole série, &amp;lt;code&amp;gt;serial_buffer&amp;lt;/code&amp;gt; est une variable globale utilisée pour stocker les messages reçus et à envoyer. Les fonctions &amp;lt;code&amp;gt;Serial_Transmit()&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;Serial_Receive()&amp;lt;/code&amp;gt; sont déclarées dans &amp;lt;code&amp;gt;pico_serial.h&amp;lt;/code&amp;gt; et proviennent de la documentation AVR.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SerialWrite(){&lt;br /&gt;
    while (1){&lt;br /&gt;
        Serial_Transmit('\r\n');&lt;br /&gt;
        Serial_Transmit(serial_buffer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SerialRead(){&lt;br /&gt;
    while(1){&lt;br /&gt;
        serial_buffer = Serial_Receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SerialSetup.png|thumb|right|400px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|left|400px|Message reçu par le port série]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Lors de ce test notre atmega envoi &amp;quot;LOULOUTOINE&amp;quot; en boucle sur le port série.&lt;br /&gt;
&lt;br /&gt;
===Tâche 7 segments===&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons maintenant une tâche permettant de communiquer avec l'écran 7 segments par la communication SPI (toujours en parallèle des autres tâches).&lt;br /&gt;
Voici par exemple deux des fonctions SPI, il faut préalablement initialiser la communication SPI avec les registres SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SPI_send(uint8_t data) {&lt;br /&gt;
    DISPLAY_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_PIN); //On met le pin CS de l'écran à l'état bas pour l'activer&lt;br /&gt;
    SPDR = data;&lt;br /&gt;
    while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
    DISPLAY_PORT |= (1&amp;lt;&amp;lt;DISPLAY_PIN); // On relache l'écran &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clearDisplaySPI() {&lt;br /&gt;
    SPI_send(0x76); // Commande pour effacer l'écran et remettre le curseur a gauche&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour afficher un caractère sur l'écran il suffit donc d'appeler &amp;lt;code&amp;gt;SPI_send()&amp;lt;/code&amp;gt; en passant en paramètre le caractère à envoyer.&lt;br /&gt;
[[File:Pico2024_B8_ordos7s_video.mp4|thumb|center|600px|Les 5 tâches en parallèle]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Etat endormi===&lt;br /&gt;
&lt;br /&gt;
Une fois que les tâches ont été correctement séparées, il a fallu ajuster notre ordonnanceur pour garantir que les délais de chaque tâche soient respectés. En effet, avec notre méthode actuelle qui repose sur l'utilisation de la fonction &amp;lt;code&amp;gt;_delays_ms()&amp;lt;/code&amp;gt;  à chaque ajout de tâche, le temps total d'exécution augmente de manière cumulative. Par exemple, avec deux tâches, un délai de 200 ms prendrait 400 ms, et avec trois tâches 600 ms. Pour résoudre ce problème, nous avons décidé d'ajouter un état à chaque tâche, permettant de les &amp;quot;endormir&amp;quot; lorsqu'elles ne sont pas appelées, et de les &amp;quot;réveiller&amp;quot; lorsqu'elles le sont. Grâce à ce système, chaque fois qu'une tâche endormie est exécutée, on décrémente son timer de 20 millisecondes à chaque cycle. Ainsi chaque tâche respecte son délai sans interférer avec l'exécution des autres tâches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void Sleeping(){&lt;br /&gt;
  for (int i = 0; i &amp;lt; NB_TASKS;i++){&lt;br /&gt;
    if (Taches[i].etat.sit == ENDORMI) Taches[i].etat.time.tempsendormi -= 20;&lt;br /&gt;
    if (Taches[i].etat.time.tempsendormi &amp;lt;= 0) {&lt;br /&gt;
      Taches[i].etat.time.tempsendormi = 0;&lt;br /&gt;
      Taches[i].etat.sit = ACTIF;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre nouvel ordonnanceur qui appelle &amp;lt;code&amp;gt;Sleeping()&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void ordonnanceur(){&lt;br /&gt;
    PORTC ^= 0x01; // On fait clignoter une des led (J1) à chaque fois que l'ordonnanceur est appelé&lt;br /&gt;
    Sleeping();&lt;br /&gt;
    do{&lt;br /&gt;
       courant ++;&lt;br /&gt;
       if (courant == NB_TASKS) courant = 0;&lt;br /&gt;
    } while (Taches[courant].etat.sit == ENDORMI);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction endors la tâche pendant la durée t (en millisecondes).&lt;br /&gt;
On remet ensuite le timer à 0 et on lance l'interruption manuellement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void makeSleep(int t){&lt;br /&gt;
  Taches[courant].etat.sit = ENDORMI;&lt;br /&gt;
  Taches[courant].etat.time.tempsendormi = t;&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
  TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici notre struture modifiée pour ajouter l'état endormi&lt;br /&gt;
On utilise une union pour representer le temps d'endormissement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define ENDORMI 1&lt;br /&gt;
#define ACTIF 0&lt;br /&gt;
&lt;br /&gt;
typedef union{&lt;br /&gt;
  int tempsendormi;&lt;br /&gt;
} Time;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
  int situation;  //1 pour endormi, 0 pour éveillé &lt;br /&gt;
  Time time;&lt;br /&gt;
} Etat;&lt;br /&gt;
&lt;br /&gt;
typedef struct task{&lt;br /&gt;
  void (*start)(void);&lt;br /&gt;
  uint16_t stack;&lt;br /&gt;
  Etat etat;&lt;br /&gt;
} task;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmi notre groupe, nous sommes le binôme en charge de la carte mère. &lt;br /&gt;
Nous avons décidé d'utiliser un Atmega 328p qui sera programmé avec &amp;lt;code&amp;gt;avr-dude&amp;lt;/code&amp;gt; pour cela notre carte mère comportera également un Atmega8u2 qui servira de programmateur et d'interface serie/USB. &lt;br /&gt;
&lt;br /&gt;
Notre carte étant similaire à une Arduino UNO avec le shield intégré nous mesurerons lors de la prochaine séance la consommation de celle ci afin d'estimer la conso de la future carte mère. Avec cette mesure et les estimations de consommation des différentes cartes filles nous réaliserons un bilan de puissance détaillé.&lt;br /&gt;
&lt;br /&gt;
Pour l'instant nous avons prévu une alimentation par un port USB C, ayant connecté les pins CC1 et CC2 à des resistances de 5.1k nous obtenons 5v et 3A max. Il sera donc simple d'alimenter notre carte avec un câble USB, chargeur de téléphone ou alimentation de Raspberry par exemple et d'obtenir jusqu'à 15w ce qui semble largement suffisant.&lt;br /&gt;
&lt;br /&gt;
Notre PCB est terminé, voici le schéma et un rendu du PCB final. &lt;br /&gt;
[[File:Pico2024_B8_sch_PCB.pdf|thumb|left|500px|Le schéma final (en 3 pages)]]&lt;br /&gt;
[[File:Pico2024_B8_rendu_PCB.png|thumb|right|500px|Le PCB final]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Les fichiers GERBER sont disponibles dans notre dépot [https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT]&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre PCB, pour commencer nous assemblons les composants minimums pour faire clignoter une LED avec le 328p.&lt;br /&gt;
[[File:Pico2024_B8_PCB_recu.jpeg|thumb|left|500px|Le naked PCB]]&lt;br /&gt;
[[File:Pico2024_B8_PC1.jpeg|thumb|right|500px|Ca fonctionne]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
En programmant par le port ISP avec une Arduino as ISP on arrive à faire clignoter la LED reliée sur PC1 du 328p. On soude ensuite le minimum pour tester l'AtMega8u2, on arrive à faire clignoter deux led reliées a ses broches. &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_8U2.jpeg|thumb|left|700px|Les atmega sont soudés]]&lt;br /&gt;
[[File:Pico2024_B8_double_blinking.mp4|thumb|right|500px|Blinking lights]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
avrdude -c avrisp -p atmega8u2 -P /dev/ttyACM0 -b 19200 -t&lt;br /&gt;
avrdude&amp;gt; erase&lt;br /&gt;
&lt;br /&gt;
avrdude -c avrisp -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U flash:w:at90usb82-bl-usb-1_0_5.hex&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
problème de dtr, pas de resest possible sur le 8u2 car pas de boutons, ne démarre pas sur le bootloader donc pas possible de le voir grâce à &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;lsusb&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6910</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6910"/>
		<updated>2024-12-02T10:12:26Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine.&lt;br /&gt;
&lt;br /&gt;
Lors de ce projet nous allons réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur une carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===23 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===30 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===1 octobre 2024===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|left|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour notre ordonnanceur il est important d'initialiser les taches, notamment leur pointeur de pile. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int t){&lt;br /&gt;
    uint16_t oldSP = SP;&lt;br /&gt;
    SP = Taches[t].stack;&lt;br /&gt;
    uint16_t adresse = (uint16_t)Taches[t].start;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff));&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00) &amp;gt;&amp;gt; 8));&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[t].stack = SP;&lt;br /&gt;
    SP = oldSP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque interruption de l'ISR (toutes les 20ms) on sauvegarde le contexte de la tache en cours, l'ordonnanceur passe à la tache suivante et on restaure le contexte de cette tache.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){&lt;br /&gt;
    /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[courant].stack = SP;&lt;br /&gt;
    /* Appel à l'ordonnanceur */&lt;br /&gt;
    ordonnanceur();&lt;br /&gt;
    /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
    SP = Taches[courant].stack;&lt;br /&gt;
    portRESTORE_Registers();&lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tâche série===&lt;br /&gt;
&lt;br /&gt;
Une fois l’ordonnanceur capable de lancer deux tâches en parallèle, nous nous sommes attaqués à la communication série de la carte par USB. Pour ce faire, nous utilisons l’application minicom coté PC qui permet une connexion série. Il faut initialiser les paramètres de la connexion, notre carte renvoie le message reçu dans le terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Ci joint les deux taches responsables de l'envoi et de la reception de données par le protocole série, &amp;lt;code&amp;gt;serial_buffer&amp;lt;/code&amp;gt; est une variable globale utilisée pour stocker les messages reçus et à envoyer. Les fonctions &amp;lt;code&amp;gt;Serial_Transmit()&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;Serial_Receive()&amp;lt;/code&amp;gt; sont déclarées dans &amp;lt;code&amp;gt;pico_serial.h&amp;lt;/code&amp;gt; et proviennent de la documentation AVR.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SerialWrite(){&lt;br /&gt;
    while (1){&lt;br /&gt;
        Serial_Transmit('\r\n');&lt;br /&gt;
        Serial_Transmit(serial_buffer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SerialRead(){&lt;br /&gt;
    while(1){&lt;br /&gt;
        serial_buffer = Serial_Receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SerialSetup.png|thumb|right|400px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|left|400px|Message reçu par le port série]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Lors de ce test notre atmega envoi &amp;quot;LOULOUTOINE&amp;quot; en boucle sur le port série.&lt;br /&gt;
&lt;br /&gt;
===Tâche 7 segments===&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons maintenant une tâche permettant de communiquer avec l'écran 7 segments par la communication SPI (toujours en parallèle des autres tâches).&lt;br /&gt;
Voici par exemple deux des fonctions SPI, il faut préalablement initialiser la communication SPI avec les registres SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SPI_send(uint8_t data) {&lt;br /&gt;
    DISPLAY_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_PIN); //On met le pin CS de l'écran à l'état bas pour l'activer&lt;br /&gt;
    SPDR = data;&lt;br /&gt;
    while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
    DISPLAY_PORT |= (1&amp;lt;&amp;lt;DISPLAY_PIN); // On relache l'écran &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clearDisplaySPI() {&lt;br /&gt;
    SPI_send(0x76); // Commande pour effacer l'écran et remettre le curseur a gauche&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour afficher un caractère sur l'écran il suffit donc d'appeler &amp;lt;code&amp;gt;SPI_send()&amp;lt;/code&amp;gt; en passant en paramètre le caractère à envoyer.&lt;br /&gt;
[[File:Pico2024_B8_ordos7s_video.mp4|thumb|center|600px|Les 5 tâches en parallèle]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Etat endormi===&lt;br /&gt;
&lt;br /&gt;
Une fois que les tâches ont été correctement séparées, il a fallu ajuster notre ordonnanceur pour garantir que les délais de chaque tâche soient respectés. En effet, avec notre méthode actuelle qui repose sur l'utilisation de la fonction &amp;lt;code&amp;gt;_delays_ms()&amp;lt;/code&amp;gt;  à chaque ajout de tâche, le temps total d'exécution augmente de manière cumulative. Par exemple, avec deux tâches, un délai de 200 ms prendrait 400 ms, et avec trois tâches 600 ms. Pour résoudre ce problème, nous avons décidé d'ajouter un état à chaque tâche, permettant de les &amp;quot;endormir&amp;quot; lorsqu'elles ne sont pas appelées, et de les &amp;quot;réveiller&amp;quot; lorsqu'elles le sont. Grâce à ce système, chaque fois qu'une tâche endormie est exécutée, on décrémente son timer de 20 millisecondes à chaque cycle. Ainsi chaque tâche respecte son délai sans interférer avec l'exécution des autres tâches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void Sleeping(){&lt;br /&gt;
  for (int i = 0; i &amp;lt; NB_TASKS;i++){&lt;br /&gt;
    if (Taches[i].etat.sit == ENDORMI) Taches[i].etat.time.tempsendormi -= 20;&lt;br /&gt;
    if (Taches[i].etat.time.tempsendormi &amp;lt;= 0) {&lt;br /&gt;
      Taches[i].etat.time.tempsendormi = 0;&lt;br /&gt;
      Taches[i].etat.sit = ACTIF;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre nouvel ordonnanceur qui appelle &amp;lt;code&amp;gt;Sleeping()&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void ordonnanceur(){&lt;br /&gt;
    PORTC ^= 0x01; // On fait clignoter une des led (J1) à chaque fois que l'ordonnanceur est appelé&lt;br /&gt;
    Sleeping();&lt;br /&gt;
    do{&lt;br /&gt;
       courant ++;&lt;br /&gt;
       if (courant == NB_TASKS) courant = 0;&lt;br /&gt;
    } while (Taches[courant].etat.sit == ENDORMI);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction endors la tâche pendant la durée t (en millisecondes).&lt;br /&gt;
On remet ensuite le timer à 0 et on lance l'interruption manuellement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void makeSleep(int t){&lt;br /&gt;
  Taches[courant].etat.sit = ENDORMI;&lt;br /&gt;
  Taches[courant].etat.time.tempsendormi = t;&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
  TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici notre struture modifiée pour ajouter l'état endormi&lt;br /&gt;
On utilise une union pour representer le temps d'endormissement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define ENDORMI 1&lt;br /&gt;
#define ACTIF 0&lt;br /&gt;
&lt;br /&gt;
typedef union{&lt;br /&gt;
  int tempsendormi;&lt;br /&gt;
} Time;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
  int situation;  //1 pour endormi, 0 pour éveillé &lt;br /&gt;
  Time time;&lt;br /&gt;
} Etat;&lt;br /&gt;
&lt;br /&gt;
typedef struct task{&lt;br /&gt;
  void (*start)(void);&lt;br /&gt;
  uint16_t stack;&lt;br /&gt;
  Etat etat;&lt;br /&gt;
} task;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmi notre groupe, nous sommes le binôme en charge de la carte mère. &lt;br /&gt;
Nous avons décidé d'utiliser un Atmega 328p qui sera programmé avec &amp;lt;code&amp;gt;avr-dude&amp;lt;/code&amp;gt; pour cela notre carte mère comportera également un Atmega8u2 qui servira de programmateur et d'interface serie/USB. &lt;br /&gt;
&lt;br /&gt;
Notre carte étant similaire à une Arduino UNO avec le shield intégré nous mesurerons lors de la prochaine séance la consommation de celle ci afin d'estimer la conso de la future carte mère. Avec cette mesure et les estimations de consommation des différentes cartes filles nous réaliserons un bilan de puissance détaillé.&lt;br /&gt;
&lt;br /&gt;
Pour l'instant nous avons prévu une alimentation par un port USB C, ayant connecté les pins CC1 et CC2 à des resistances de 5.1k nous obtenons 5v et 3A max. Il sera donc simple d'alimenter notre carte avec un câble USB, chargeur de téléphone ou alimentation de Raspberry par exemple et d'obtenir jusqu'à 15w ce qui semble largement suffisant.&lt;br /&gt;
&lt;br /&gt;
Notre PCB est terminé, voici le schéma et un rendu du PCB final. &lt;br /&gt;
[[File:Pico2024_B8_sch_PCB.pdf|thumb|left|500px|Le schéma final (en 3 pages)]]&lt;br /&gt;
[[File:Pico2024_B8_rendu_PCB.png|thumb|right|500px|Le PCB final]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Les fichiers GERBER sont disponibles dans notre dépot [https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT]&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre PCB, pour commencer nous assemblons les composants minimums pour faire clignoter une LED avec le 328p.&lt;br /&gt;
[[File:Pico2024_B8_PCB_recu.jpeg|thumb|left|500px|Le naked PCB]]&lt;br /&gt;
[[File:Pico2024_B8_PC1.jpeg|thumb|right|500px|Ca fonctionne]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
En programmant par le port ISP avec une Arduino as ISP on arrive à faire clignoter la LED reliée sur PC1 du 328p. On soude ensuite le minimum pour tester l'AtMega8u2, on arrive à faire clignoter deux led reliées a ses broches. &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_8U2.jpeg|thumb|left|700px|Les atmega sont soudés]]&lt;br /&gt;
[[File:Pico2024_B8_double_blinking.mp4|thumb|right|500px|Blinking lights]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
avrdude -c avrisp -p atmega8u2 -P /dev/ttyACM0 -b 19200 -t&lt;br /&gt;
avrdude&amp;gt; erase&lt;br /&gt;
&lt;br /&gt;
avrdude -c avrisp -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U flash:w:at90usb82-bl-usb-1_0_5.hex&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
problème de dtr, pas de resest possible sur le 8u2 car pas de boutons, ne démarre pas sur le bootloader donc pas possible de le voir grâce à &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;lsusb&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6857</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6857"/>
		<updated>2024-11-20T10:55:47Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Carte mère */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine.&lt;br /&gt;
&lt;br /&gt;
Lors de ce projet nous allons réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur une carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===23 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===30 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===1 octobre 2024===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|left|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour notre ordonnanceur il est important d'initialiser les taches, notamment leur pointeur de pile. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int t){&lt;br /&gt;
    uint16_t oldSP = SP;&lt;br /&gt;
    SP = Taches[t].stack;&lt;br /&gt;
    uint16_t adresse = (uint16_t)Taches[t].start;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff));&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00) &amp;gt;&amp;gt; 8));&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[t].stack = SP;&lt;br /&gt;
    SP = oldSP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque interruption de l'ISR (toutes les 20ms) on sauvegarde le contexte de la tache en cours, l'ordonnanceur passe à la tache suivante et on restaure le contexte de cette tache.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){&lt;br /&gt;
    /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[courant].stack = SP;&lt;br /&gt;
    /* Appel à l'ordonnanceur */&lt;br /&gt;
    ordonnanceur();&lt;br /&gt;
    /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
    SP = Taches[courant].stack;&lt;br /&gt;
    portRESTORE_Registers();&lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tâche série===&lt;br /&gt;
&lt;br /&gt;
Une fois l’ordonnanceur capable de lancer deux tâches en parallèle, nous nous sommes attaqués à la communication série de la carte par USB. Pour ce faire, nous utilisons l’application minicom coté PC qui permet une connexion série. Il faut initialiser les paramètres de la connexion, notre carte renvoie le message reçu dans le terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Ci joint les deux taches responsables de l'envoi et de la reception de données par le protocole série, &amp;lt;code&amp;gt;serial_buffer&amp;lt;/code&amp;gt; est une variable globale utilisée pour stocker les messages reçus et à envoyer. Les fonctions &amp;lt;code&amp;gt;Serial_Transmit()&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;Serial_Receive()&amp;lt;/code&amp;gt; sont déclarées dans &amp;lt;code&amp;gt;pico_serial.h&amp;lt;/code&amp;gt; et proviennent de la documentation AVR.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SerialWrite(){&lt;br /&gt;
    while (1){&lt;br /&gt;
        Serial_Transmit('\r\n');&lt;br /&gt;
        Serial_Transmit(serial_buffer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SerialRead(){&lt;br /&gt;
    while(1){&lt;br /&gt;
        serial_buffer = Serial_Receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SerialSetup.png|thumb|right|400px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|left|400px|Message reçu par le port série]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Lors de ce test notre atmega envoi &amp;quot;LOULOUTOINE&amp;quot; en boucle sur le port série.&lt;br /&gt;
&lt;br /&gt;
===Tâche 7 segments===&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons maintenant une tâche permettant de communiquer avec l'écran 7 segments par la communication SPI (toujours en parallèle des autres tâches).&lt;br /&gt;
Voici par exemple deux des fonctions SPI, il faut préalablement initialiser la communication SPI avec les registres SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SPI_send(uint8_t data) {&lt;br /&gt;
    DISPLAY_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_PIN); //On met le pin CS de l'écran à l'état bas pour l'activer&lt;br /&gt;
    SPDR = data;&lt;br /&gt;
    while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
    DISPLAY_PORT |= (1&amp;lt;&amp;lt;DISPLAY_PIN); // On relache l'écran &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clearDisplaySPI() {&lt;br /&gt;
    SPI_send(0x76); // Commande pour effacer l'écran et remettre le curseur a gauche&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour afficher un caractère sur l'écran il suffit donc d'appeler &amp;lt;code&amp;gt;SPI_send()&amp;lt;/code&amp;gt; en passant en paramètre le caractère à envoyer.&lt;br /&gt;
[[File:Pico2024_B8_ordos7s_video.mp4|thumb|center|600px|Les 5 tâches en parallèle]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Etat endormi===&lt;br /&gt;
&lt;br /&gt;
Une fois que les tâches ont été correctement séparées, il a fallu ajuster notre ordonnanceur pour garantir que les délais de chaque tâche soient respectés. En effet, avec notre méthode actuelle qui repose sur l'utilisation de la fonction &amp;lt;code&amp;gt;_delays_ms()&amp;lt;/code&amp;gt;  à chaque ajout de tâche, le temps total d'exécution augmente de manière cumulative. Par exemple, avec deux tâches, un délai de 200 ms prendrait 400 ms, et avec trois tâches 600 ms. Pour résoudre ce problème, nous avons décidé d'ajouter un état à chaque tâche, permettant de les &amp;quot;endormir&amp;quot; lorsqu'elles ne sont pas appelées, et de les &amp;quot;réveiller&amp;quot; lorsqu'elles le sont. Grâce à ce système, chaque fois qu'une tâche endormie est exécutée, on décrémente son timer de 20 millisecondes à chaque cycle. Ainsi chaque tâche respecte son délai sans interférer avec l'exécution des autres tâches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void Sleeping(){&lt;br /&gt;
  for (int i = 0; i &amp;lt; NB_TASKS;i++){&lt;br /&gt;
    if (Taches[i].etat.sit == ENDORMI) Taches[i].etat.time.tempsendormi -= 20;&lt;br /&gt;
    if (Taches[i].etat.time.tempsendormi &amp;lt;= 0) {&lt;br /&gt;
      Taches[i].etat.time.tempsendormi = 0;&lt;br /&gt;
      Taches[i].etat.sit = ACTIF;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre nouvel ordonnanceur qui appelle &amp;lt;code&amp;gt;Sleeping()&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void ordonnanceur(){&lt;br /&gt;
    PORTC ^= 0x01; // On fait clignoter une des led (J1) à chaque fois que l'ordonnanceur est appelé&lt;br /&gt;
    Sleeping();&lt;br /&gt;
    do{&lt;br /&gt;
       courant ++;&lt;br /&gt;
       if (courant == NB_TASKS) courant = 0;&lt;br /&gt;
    } while (Taches[courant].etat.sit == ENDORMI);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction endors la tâche pendant la durée t (en millisecondes).&lt;br /&gt;
On remet ensuite le timer à 0 et on lance l'interruption manuellement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void makeSleep(int t){&lt;br /&gt;
  Taches[courant].etat.sit = ENDORMI;&lt;br /&gt;
  Taches[courant].etat.time.tempsendormi = t;&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
  TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici notre struture modifiée pour ajouter l'état endormi&lt;br /&gt;
On utilise une union pour representer le temps d'endormissement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define ENDORMI 1&lt;br /&gt;
#define ACTIF 0&lt;br /&gt;
&lt;br /&gt;
typedef union{&lt;br /&gt;
  int tempsendormi;&lt;br /&gt;
} Time;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
  int situation;  //1 pour endormi, 0 pour éveillé &lt;br /&gt;
  Time time;&lt;br /&gt;
} Etat;&lt;br /&gt;
&lt;br /&gt;
typedef struct task{&lt;br /&gt;
  void (*start)(void);&lt;br /&gt;
  uint16_t stack;&lt;br /&gt;
  Etat etat;&lt;br /&gt;
} task;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmi notre groupe, nous sommes le binôme en charge de la carte mère. &lt;br /&gt;
Nous avons décidé d'utiliser un Atmega 328p qui sera programmé avec &amp;lt;code&amp;gt;avr-dude&amp;lt;/code&amp;gt; pour cela notre carte mère comportera également un Atmega8u2 qui servira de programmateur et d'interface serie/USB. &lt;br /&gt;
&lt;br /&gt;
Notre carte étant similaire à une Arduino UNO avec le shield intégré nous mesurerons lors de la prochaine séance la consommation de celle ci afin d'estimer la conso de la future carte mère. Avec cette mesure et les estimations de consommation des différentes cartes filles nous réaliserons un bilan de puissance détaillé.&lt;br /&gt;
&lt;br /&gt;
Pour l'instant nous avons prévu une alimentation par un port USB C, ayant connecté les pins CC1 et CC2 à des resistances de 5.1k nous obtenons 5v et 3A max. Il sera donc simple d'alimenter notre carte avec un câble USB, chargeur de téléphone ou alimentation de Raspberry par exemple et d'obtenir jusqu'à 15w ce qui semble largement suffisant.&lt;br /&gt;
&lt;br /&gt;
Notre PCB est terminé, voici le schéma et un rendu du PCB final. &lt;br /&gt;
[[File:Pico2024_B8_sch_PCB.pdf|thumb|left|500px|Le schéma final (en 3 pages)]]&lt;br /&gt;
[[File:Pico2024_B8_rendu_PCB.png|thumb|right|500px|Le PCB final]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Les fichiers GERBER sont disponibles dans notre dépot [https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT]&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre PCB, pour commencer nous assemblons les composants minimums pour faire clignoter une LED avec le 328p.&lt;br /&gt;
[[File:Pico2024_B8_PCB_recu.jpeg|thumb|left|500px|Le naked PCB]]&lt;br /&gt;
[[File:Pico2024_B8_PC1.jpeg|thumb|right|500px|Ca fonctionne]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
En programmant par le port ISP avec une Arduino as ISP on arrive à faire clignoter la LED reliée sur PC1 du 328p. On soude ensuite le minimum pour tester l'AtMega8u2, on arrive à faire clignoter deux led reliées a ses broches. &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_8U2.jpeg|thumb|left|700px|Les atmega sont soudés]]&lt;br /&gt;
[[File:Pico2024_B8_double_blinking.mp4|thumb|right|500px|Blinking lights]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6856</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6856"/>
		<updated>2024-11-20T10:55:23Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Carte mère */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine.&lt;br /&gt;
&lt;br /&gt;
Lors de ce projet nous allons réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur une carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===23 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===30 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===1 octobre 2024===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|left|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour notre ordonnanceur il est important d'initialiser les taches, notamment leur pointeur de pile. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int t){&lt;br /&gt;
    uint16_t oldSP = SP;&lt;br /&gt;
    SP = Taches[t].stack;&lt;br /&gt;
    uint16_t adresse = (uint16_t)Taches[t].start;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff));&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00) &amp;gt;&amp;gt; 8));&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[t].stack = SP;&lt;br /&gt;
    SP = oldSP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque interruption de l'ISR (toutes les 20ms) on sauvegarde le contexte de la tache en cours, l'ordonnanceur passe à la tache suivante et on restaure le contexte de cette tache.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){&lt;br /&gt;
    /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[courant].stack = SP;&lt;br /&gt;
    /* Appel à l'ordonnanceur */&lt;br /&gt;
    ordonnanceur();&lt;br /&gt;
    /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
    SP = Taches[courant].stack;&lt;br /&gt;
    portRESTORE_Registers();&lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tâche série===&lt;br /&gt;
&lt;br /&gt;
Une fois l’ordonnanceur capable de lancer deux tâches en parallèle, nous nous sommes attaqués à la communication série de la carte par USB. Pour ce faire, nous utilisons l’application minicom coté PC qui permet une connexion série. Il faut initialiser les paramètres de la connexion, notre carte renvoie le message reçu dans le terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Ci joint les deux taches responsables de l'envoi et de la reception de données par le protocole série, &amp;lt;code&amp;gt;serial_buffer&amp;lt;/code&amp;gt; est une variable globale utilisée pour stocker les messages reçus et à envoyer. Les fonctions &amp;lt;code&amp;gt;Serial_Transmit()&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;Serial_Receive()&amp;lt;/code&amp;gt; sont déclarées dans &amp;lt;code&amp;gt;pico_serial.h&amp;lt;/code&amp;gt; et proviennent de la documentation AVR.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SerialWrite(){&lt;br /&gt;
    while (1){&lt;br /&gt;
        Serial_Transmit('\r\n');&lt;br /&gt;
        Serial_Transmit(serial_buffer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SerialRead(){&lt;br /&gt;
    while(1){&lt;br /&gt;
        serial_buffer = Serial_Receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SerialSetup.png|thumb|right|400px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|left|400px|Message reçu par le port série]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Lors de ce test notre atmega envoi &amp;quot;LOULOUTOINE&amp;quot; en boucle sur le port série.&lt;br /&gt;
&lt;br /&gt;
===Tâche 7 segments===&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons maintenant une tâche permettant de communiquer avec l'écran 7 segments par la communication SPI (toujours en parallèle des autres tâches).&lt;br /&gt;
Voici par exemple deux des fonctions SPI, il faut préalablement initialiser la communication SPI avec les registres SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SPI_send(uint8_t data) {&lt;br /&gt;
    DISPLAY_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_PIN); //On met le pin CS de l'écran à l'état bas pour l'activer&lt;br /&gt;
    SPDR = data;&lt;br /&gt;
    while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
    DISPLAY_PORT |= (1&amp;lt;&amp;lt;DISPLAY_PIN); // On relache l'écran &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clearDisplaySPI() {&lt;br /&gt;
    SPI_send(0x76); // Commande pour effacer l'écran et remettre le curseur a gauche&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour afficher un caractère sur l'écran il suffit donc d'appeler &amp;lt;code&amp;gt;SPI_send()&amp;lt;/code&amp;gt; en passant en paramètre le caractère à envoyer.&lt;br /&gt;
[[File:Pico2024_B8_ordos7s_video.mp4|thumb|center|600px|Les 5 tâches en parallèle]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Etat endormi===&lt;br /&gt;
&lt;br /&gt;
Une fois que les tâches ont été correctement séparées, il a fallu ajuster notre ordonnanceur pour garantir que les délais de chaque tâche soient respectés. En effet, avec notre méthode actuelle qui repose sur l'utilisation de la fonction &amp;lt;code&amp;gt;_delays_ms()&amp;lt;/code&amp;gt;  à chaque ajout de tâche, le temps total d'exécution augmente de manière cumulative. Par exemple, avec deux tâches, un délai de 200 ms prendrait 400 ms, et avec trois tâches 600 ms. Pour résoudre ce problème, nous avons décidé d'ajouter un état à chaque tâche, permettant de les &amp;quot;endormir&amp;quot; lorsqu'elles ne sont pas appelées, et de les &amp;quot;réveiller&amp;quot; lorsqu'elles le sont. Grâce à ce système, chaque fois qu'une tâche endormie est exécutée, on décrémente son timer de 20 millisecondes à chaque cycle. Ainsi chaque tâche respecte son délai sans interférer avec l'exécution des autres tâches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void Sleeping(){&lt;br /&gt;
  for (int i = 0; i &amp;lt; NB_TASKS;i++){&lt;br /&gt;
    if (Taches[i].etat.sit == ENDORMI) Taches[i].etat.time.tempsendormi -= 20;&lt;br /&gt;
    if (Taches[i].etat.time.tempsendormi &amp;lt;= 0) {&lt;br /&gt;
      Taches[i].etat.time.tempsendormi = 0;&lt;br /&gt;
      Taches[i].etat.sit = ACTIF;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre nouvel ordonnanceur qui appelle &amp;lt;code&amp;gt;Sleeping()&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void ordonnanceur(){&lt;br /&gt;
    PORTC ^= 0x01; // On fait clignoter une des led (J1) à chaque fois que l'ordonnanceur est appelé&lt;br /&gt;
    Sleeping();&lt;br /&gt;
    do{&lt;br /&gt;
       courant ++;&lt;br /&gt;
       if (courant == NB_TASKS) courant = 0;&lt;br /&gt;
    } while (Taches[courant].etat.sit == ENDORMI);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction endors la tâche pendant la durée t (en millisecondes).&lt;br /&gt;
On remet ensuite le timer à 0 et on lance l'interruption manuellement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void makeSleep(int t){&lt;br /&gt;
  Taches[courant].etat.sit = ENDORMI;&lt;br /&gt;
  Taches[courant].etat.time.tempsendormi = t;&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
  TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici notre struture modifiée pour ajouter l'état endormi&lt;br /&gt;
On utilise une union pour representer le temps d'endormissement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define ENDORMI 1&lt;br /&gt;
#define ACTIF 0&lt;br /&gt;
&lt;br /&gt;
typedef union{&lt;br /&gt;
  int tempsendormi;&lt;br /&gt;
} Time;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
  int situation;  //1 pour endormi, 0 pour éveillé &lt;br /&gt;
  Time time;&lt;br /&gt;
} Etat;&lt;br /&gt;
&lt;br /&gt;
typedef struct task{&lt;br /&gt;
  void (*start)(void);&lt;br /&gt;
  uint16_t stack;&lt;br /&gt;
  Etat etat;&lt;br /&gt;
} task;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmi notre groupe, nous sommes le binôme en charge de la carte mère. &lt;br /&gt;
Nous avons décidé d'utiliser un Atmega 328p qui sera programmé avec &amp;lt;code&amp;gt;avr-dude&amp;lt;/code&amp;gt; pour cela notre carte mère comportera également un Atmega8u2 qui servira de programmateur et d'interface serie/USB. &lt;br /&gt;
&lt;br /&gt;
Notre carte étant similaire à une Arduino UNO avec le shield intégré nous mesurerons lors de la prochaine séance la consommation de celle ci afin d'estimer la conso de la future carte mère. Avec cette mesure et les estimations de consommation des différentes cartes filles nous réaliserons un bilan de puissance détaillé.&lt;br /&gt;
&lt;br /&gt;
Pour l'instant nous avons prévu une alimentation par un port USB C, ayant connecté les pins CC1 et CC2 à des resistances de 5.1k nous obtenons 5v et 3A max. Il sera donc simple d'alimenter notre carte avec un câble USB, chargeur de téléphone ou alimentation de Raspberry par exemple et d'obtenir jusqu'à 15w ce qui semble largement suffisant.&lt;br /&gt;
&lt;br /&gt;
Notre PCB est terminé, voici le schéma et un rendu du PCB final. &lt;br /&gt;
[[File:Pico2024_B8_sch_PCB.pdf|thumb|left|500px|Le schéma final (en 3 pages)]]&lt;br /&gt;
[[File:Pico2024_B8_rendu_PCB.png|thumb|right|500px|Le PCB final]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Les fichiers GERBER sont disponibles dans notre dépot [https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT]&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre PCB, pour commencer nous assemblons les composants minimums pour faire clignoter une LED avec le 328p.&lt;br /&gt;
[[File:Pico2024_B8_PCB_recu.jpeg|thumb|left|75%|Le naked PCB]]&lt;br /&gt;
[[File:Pico2024_B8_PC1.jpeg|thumb|right|500px|Ca fonctionne]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
En programmant par le port ISP avec une Arduino as ISP on arrive à faire clignoter la LED reliée sur PC1 du 328p. On soude ensuite le minimum pour tester l'AtMega8u2, on arrive à faire clignoter deux led reliées a ses broches. &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_8U2.jpeg|thumb|left|40%|Les atmega sont soudés]]&lt;br /&gt;
[[File:Pico2024_B8_double_blinking.mp4|thumb|right|500px|Blinking lights]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6855</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6855"/>
		<updated>2024-11-20T10:55:02Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Carte mère */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine.&lt;br /&gt;
&lt;br /&gt;
Lors de ce projet nous allons réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur une carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===23 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===30 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===1 octobre 2024===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|left|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour notre ordonnanceur il est important d'initialiser les taches, notamment leur pointeur de pile. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int t){&lt;br /&gt;
    uint16_t oldSP = SP;&lt;br /&gt;
    SP = Taches[t].stack;&lt;br /&gt;
    uint16_t adresse = (uint16_t)Taches[t].start;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff));&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00) &amp;gt;&amp;gt; 8));&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[t].stack = SP;&lt;br /&gt;
    SP = oldSP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque interruption de l'ISR (toutes les 20ms) on sauvegarde le contexte de la tache en cours, l'ordonnanceur passe à la tache suivante et on restaure le contexte de cette tache.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){&lt;br /&gt;
    /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[courant].stack = SP;&lt;br /&gt;
    /* Appel à l'ordonnanceur */&lt;br /&gt;
    ordonnanceur();&lt;br /&gt;
    /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
    SP = Taches[courant].stack;&lt;br /&gt;
    portRESTORE_Registers();&lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tâche série===&lt;br /&gt;
&lt;br /&gt;
Une fois l’ordonnanceur capable de lancer deux tâches en parallèle, nous nous sommes attaqués à la communication série de la carte par USB. Pour ce faire, nous utilisons l’application minicom coté PC qui permet une connexion série. Il faut initialiser les paramètres de la connexion, notre carte renvoie le message reçu dans le terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Ci joint les deux taches responsables de l'envoi et de la reception de données par le protocole série, &amp;lt;code&amp;gt;serial_buffer&amp;lt;/code&amp;gt; est une variable globale utilisée pour stocker les messages reçus et à envoyer. Les fonctions &amp;lt;code&amp;gt;Serial_Transmit()&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;Serial_Receive()&amp;lt;/code&amp;gt; sont déclarées dans &amp;lt;code&amp;gt;pico_serial.h&amp;lt;/code&amp;gt; et proviennent de la documentation AVR.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SerialWrite(){&lt;br /&gt;
    while (1){&lt;br /&gt;
        Serial_Transmit('\r\n');&lt;br /&gt;
        Serial_Transmit(serial_buffer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SerialRead(){&lt;br /&gt;
    while(1){&lt;br /&gt;
        serial_buffer = Serial_Receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SerialSetup.png|thumb|right|400px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|left|400px|Message reçu par le port série]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Lors de ce test notre atmega envoi &amp;quot;LOULOUTOINE&amp;quot; en boucle sur le port série.&lt;br /&gt;
&lt;br /&gt;
===Tâche 7 segments===&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons maintenant une tâche permettant de communiquer avec l'écran 7 segments par la communication SPI (toujours en parallèle des autres tâches).&lt;br /&gt;
Voici par exemple deux des fonctions SPI, il faut préalablement initialiser la communication SPI avec les registres SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SPI_send(uint8_t data) {&lt;br /&gt;
    DISPLAY_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_PIN); //On met le pin CS de l'écran à l'état bas pour l'activer&lt;br /&gt;
    SPDR = data;&lt;br /&gt;
    while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
    DISPLAY_PORT |= (1&amp;lt;&amp;lt;DISPLAY_PIN); // On relache l'écran &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clearDisplaySPI() {&lt;br /&gt;
    SPI_send(0x76); // Commande pour effacer l'écran et remettre le curseur a gauche&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour afficher un caractère sur l'écran il suffit donc d'appeler &amp;lt;code&amp;gt;SPI_send()&amp;lt;/code&amp;gt; en passant en paramètre le caractère à envoyer.&lt;br /&gt;
[[File:Pico2024_B8_ordos7s_video.mp4|thumb|center|600px|Les 5 tâches en parallèle]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Etat endormi===&lt;br /&gt;
&lt;br /&gt;
Une fois que les tâches ont été correctement séparées, il a fallu ajuster notre ordonnanceur pour garantir que les délais de chaque tâche soient respectés. En effet, avec notre méthode actuelle qui repose sur l'utilisation de la fonction &amp;lt;code&amp;gt;_delays_ms()&amp;lt;/code&amp;gt;  à chaque ajout de tâche, le temps total d'exécution augmente de manière cumulative. Par exemple, avec deux tâches, un délai de 200 ms prendrait 400 ms, et avec trois tâches 600 ms. Pour résoudre ce problème, nous avons décidé d'ajouter un état à chaque tâche, permettant de les &amp;quot;endormir&amp;quot; lorsqu'elles ne sont pas appelées, et de les &amp;quot;réveiller&amp;quot; lorsqu'elles le sont. Grâce à ce système, chaque fois qu'une tâche endormie est exécutée, on décrémente son timer de 20 millisecondes à chaque cycle. Ainsi chaque tâche respecte son délai sans interférer avec l'exécution des autres tâches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void Sleeping(){&lt;br /&gt;
  for (int i = 0; i &amp;lt; NB_TASKS;i++){&lt;br /&gt;
    if (Taches[i].etat.sit == ENDORMI) Taches[i].etat.time.tempsendormi -= 20;&lt;br /&gt;
    if (Taches[i].etat.time.tempsendormi &amp;lt;= 0) {&lt;br /&gt;
      Taches[i].etat.time.tempsendormi = 0;&lt;br /&gt;
      Taches[i].etat.sit = ACTIF;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre nouvel ordonnanceur qui appelle &amp;lt;code&amp;gt;Sleeping()&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void ordonnanceur(){&lt;br /&gt;
    PORTC ^= 0x01; // On fait clignoter une des led (J1) à chaque fois que l'ordonnanceur est appelé&lt;br /&gt;
    Sleeping();&lt;br /&gt;
    do{&lt;br /&gt;
       courant ++;&lt;br /&gt;
       if (courant == NB_TASKS) courant = 0;&lt;br /&gt;
    } while (Taches[courant].etat.sit == ENDORMI);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction endors la tâche pendant la durée t (en millisecondes).&lt;br /&gt;
On remet ensuite le timer à 0 et on lance l'interruption manuellement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void makeSleep(int t){&lt;br /&gt;
  Taches[courant].etat.sit = ENDORMI;&lt;br /&gt;
  Taches[courant].etat.time.tempsendormi = t;&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
  TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici notre struture modifiée pour ajouter l'état endormi&lt;br /&gt;
On utilise une union pour representer le temps d'endormissement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define ENDORMI 1&lt;br /&gt;
#define ACTIF 0&lt;br /&gt;
&lt;br /&gt;
typedef union{&lt;br /&gt;
  int tempsendormi;&lt;br /&gt;
} Time;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
  int situation;  //1 pour endormi, 0 pour éveillé &lt;br /&gt;
  Time time;&lt;br /&gt;
} Etat;&lt;br /&gt;
&lt;br /&gt;
typedef struct task{&lt;br /&gt;
  void (*start)(void);&lt;br /&gt;
  uint16_t stack;&lt;br /&gt;
  Etat etat;&lt;br /&gt;
} task;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmi notre groupe, nous sommes le binôme en charge de la carte mère. &lt;br /&gt;
Nous avons décidé d'utiliser un Atmega 328p qui sera programmé avec &amp;lt;code&amp;gt;avr-dude&amp;lt;/code&amp;gt; pour cela notre carte mère comportera également un Atmega8u2 qui servira de programmateur et d'interface serie/USB. &lt;br /&gt;
&lt;br /&gt;
Notre carte étant similaire à une Arduino UNO avec le shield intégré nous mesurerons lors de la prochaine séance la consommation de celle ci afin d'estimer la conso de la future carte mère. Avec cette mesure et les estimations de consommation des différentes cartes filles nous réaliserons un bilan de puissance détaillé.&lt;br /&gt;
&lt;br /&gt;
Pour l'instant nous avons prévu une alimentation par un port USB C, ayant connecté les pins CC1 et CC2 à des resistances de 5.1k nous obtenons 5v et 3A max. Il sera donc simple d'alimenter notre carte avec un câble USB, chargeur de téléphone ou alimentation de Raspberry par exemple et d'obtenir jusqu'à 15w ce qui semble largement suffisant.&lt;br /&gt;
&lt;br /&gt;
Notre PCB est terminé, voici le schéma et un rendu du PCB final. &lt;br /&gt;
[[File:Pico2024_B8_sch_PCB.pdf|thumb|left|500px|Le schéma final (en 3 pages)]]&lt;br /&gt;
[[File:Pico2024_B8_rendu_PCB.png|thumb|right|500px|Le PCB final]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Les fichiers GERBER sont disponibles dans notre dépot [https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT]&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre PCB, pour commencer nous assemblons les composants minimums pour faire clignoter une LED avec le 328p.&lt;br /&gt;
[[File:Pico2024_B8_PCB_recu.jpeg|thumb|left|500px|Le naked PCB]]&lt;br /&gt;
[[File:Pico2024_B8_PC1.jpeg|thumb|right|500px|Ca fonctionne]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
En programmant par le port ISP avec une Arduino as ISP on arrive à faire clignoter la LED reliée sur PC1 du 328p. On soude ensuite le minimum pour tester l'AtMega8u2, on arrive à faire clignoter deux led reliées a ses broches. &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_8U2.jpeg|thumb|left|40%|Les atmega sont soudés]]&lt;br /&gt;
[[File:Pico2024_B8_double_blinking.mp4|thumb|right|500px|Blinking lights]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6854</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6854"/>
		<updated>2024-11-20T10:53:31Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Carte mère */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine.&lt;br /&gt;
&lt;br /&gt;
Lors de ce projet nous allons réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur une carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===23 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===30 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===1 octobre 2024===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|left|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour notre ordonnanceur il est important d'initialiser les taches, notamment leur pointeur de pile. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int t){&lt;br /&gt;
    uint16_t oldSP = SP;&lt;br /&gt;
    SP = Taches[t].stack;&lt;br /&gt;
    uint16_t adresse = (uint16_t)Taches[t].start;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff));&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00) &amp;gt;&amp;gt; 8));&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[t].stack = SP;&lt;br /&gt;
    SP = oldSP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque interruption de l'ISR (toutes les 20ms) on sauvegarde le contexte de la tache en cours, l'ordonnanceur passe à la tache suivante et on restaure le contexte de cette tache.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){&lt;br /&gt;
    /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[courant].stack = SP;&lt;br /&gt;
    /* Appel à l'ordonnanceur */&lt;br /&gt;
    ordonnanceur();&lt;br /&gt;
    /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
    SP = Taches[courant].stack;&lt;br /&gt;
    portRESTORE_Registers();&lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tâche série===&lt;br /&gt;
&lt;br /&gt;
Une fois l’ordonnanceur capable de lancer deux tâches en parallèle, nous nous sommes attaqués à la communication série de la carte par USB. Pour ce faire, nous utilisons l’application minicom coté PC qui permet une connexion série. Il faut initialiser les paramètres de la connexion, notre carte renvoie le message reçu dans le terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Ci joint les deux taches responsables de l'envoi et de la reception de données par le protocole série, &amp;lt;code&amp;gt;serial_buffer&amp;lt;/code&amp;gt; est une variable globale utilisée pour stocker les messages reçus et à envoyer. Les fonctions &amp;lt;code&amp;gt;Serial_Transmit()&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;Serial_Receive()&amp;lt;/code&amp;gt; sont déclarées dans &amp;lt;code&amp;gt;pico_serial.h&amp;lt;/code&amp;gt; et proviennent de la documentation AVR.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SerialWrite(){&lt;br /&gt;
    while (1){&lt;br /&gt;
        Serial_Transmit('\r\n');&lt;br /&gt;
        Serial_Transmit(serial_buffer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SerialRead(){&lt;br /&gt;
    while(1){&lt;br /&gt;
        serial_buffer = Serial_Receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SerialSetup.png|thumb|right|400px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|left|400px|Message reçu par le port série]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Lors de ce test notre atmega envoi &amp;quot;LOULOUTOINE&amp;quot; en boucle sur le port série.&lt;br /&gt;
&lt;br /&gt;
===Tâche 7 segments===&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons maintenant une tâche permettant de communiquer avec l'écran 7 segments par la communication SPI (toujours en parallèle des autres tâches).&lt;br /&gt;
Voici par exemple deux des fonctions SPI, il faut préalablement initialiser la communication SPI avec les registres SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SPI_send(uint8_t data) {&lt;br /&gt;
    DISPLAY_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_PIN); //On met le pin CS de l'écran à l'état bas pour l'activer&lt;br /&gt;
    SPDR = data;&lt;br /&gt;
    while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
    DISPLAY_PORT |= (1&amp;lt;&amp;lt;DISPLAY_PIN); // On relache l'écran &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clearDisplaySPI() {&lt;br /&gt;
    SPI_send(0x76); // Commande pour effacer l'écran et remettre le curseur a gauche&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour afficher un caractère sur l'écran il suffit donc d'appeler &amp;lt;code&amp;gt;SPI_send()&amp;lt;/code&amp;gt; en passant en paramètre le caractère à envoyer.&lt;br /&gt;
[[File:Pico2024_B8_ordos7s_video.mp4|thumb|center|600px|Les 5 tâches en parallèle]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Etat endormi===&lt;br /&gt;
&lt;br /&gt;
Une fois que les tâches ont été correctement séparées, il a fallu ajuster notre ordonnanceur pour garantir que les délais de chaque tâche soient respectés. En effet, avec notre méthode actuelle qui repose sur l'utilisation de la fonction &amp;lt;code&amp;gt;_delays_ms()&amp;lt;/code&amp;gt;  à chaque ajout de tâche, le temps total d'exécution augmente de manière cumulative. Par exemple, avec deux tâches, un délai de 200 ms prendrait 400 ms, et avec trois tâches 600 ms. Pour résoudre ce problème, nous avons décidé d'ajouter un état à chaque tâche, permettant de les &amp;quot;endormir&amp;quot; lorsqu'elles ne sont pas appelées, et de les &amp;quot;réveiller&amp;quot; lorsqu'elles le sont. Grâce à ce système, chaque fois qu'une tâche endormie est exécutée, on décrémente son timer de 20 millisecondes à chaque cycle. Ainsi chaque tâche respecte son délai sans interférer avec l'exécution des autres tâches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void Sleeping(){&lt;br /&gt;
  for (int i = 0; i &amp;lt; NB_TASKS;i++){&lt;br /&gt;
    if (Taches[i].etat.sit == ENDORMI) Taches[i].etat.time.tempsendormi -= 20;&lt;br /&gt;
    if (Taches[i].etat.time.tempsendormi &amp;lt;= 0) {&lt;br /&gt;
      Taches[i].etat.time.tempsendormi = 0;&lt;br /&gt;
      Taches[i].etat.sit = ACTIF;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre nouvel ordonnanceur qui appelle &amp;lt;code&amp;gt;Sleeping()&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void ordonnanceur(){&lt;br /&gt;
    PORTC ^= 0x01; // On fait clignoter une des led (J1) à chaque fois que l'ordonnanceur est appelé&lt;br /&gt;
    Sleeping();&lt;br /&gt;
    do{&lt;br /&gt;
       courant ++;&lt;br /&gt;
       if (courant == NB_TASKS) courant = 0;&lt;br /&gt;
    } while (Taches[courant].etat.sit == ENDORMI);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction endors la tâche pendant la durée t (en millisecondes).&lt;br /&gt;
On remet ensuite le timer à 0 et on lance l'interruption manuellement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void makeSleep(int t){&lt;br /&gt;
  Taches[courant].etat.sit = ENDORMI;&lt;br /&gt;
  Taches[courant].etat.time.tempsendormi = t;&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
  TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici notre struture modifiée pour ajouter l'état endormi&lt;br /&gt;
On utilise une union pour representer le temps d'endormissement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define ENDORMI 1&lt;br /&gt;
#define ACTIF 0&lt;br /&gt;
&lt;br /&gt;
typedef union{&lt;br /&gt;
  int tempsendormi;&lt;br /&gt;
} Time;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
  int situation;  //1 pour endormi, 0 pour éveillé &lt;br /&gt;
  Time time;&lt;br /&gt;
} Etat;&lt;br /&gt;
&lt;br /&gt;
typedef struct task{&lt;br /&gt;
  void (*start)(void);&lt;br /&gt;
  uint16_t stack;&lt;br /&gt;
  Etat etat;&lt;br /&gt;
} task;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmi notre groupe, nous sommes le binôme en charge de la carte mère. &lt;br /&gt;
Nous avons décidé d'utiliser un Atmega 328p qui sera programmé avec &amp;lt;code&amp;gt;avr-dude&amp;lt;/code&amp;gt; pour cela notre carte mère comportera également un Atmega8u2 qui servira de programmateur et d'interface serie/USB. &lt;br /&gt;
&lt;br /&gt;
Notre carte étant similaire à une Arduino UNO avec le shield intégré nous mesurerons lors de la prochaine séance la consommation de celle ci afin d'estimer la conso de la future carte mère. Avec cette mesure et les estimations de consommation des différentes cartes filles nous réaliserons un bilan de puissance détaillé.&lt;br /&gt;
&lt;br /&gt;
Pour l'instant nous avons prévu une alimentation par un port USB C, ayant connecté les pins CC1 et CC2 à des resistances de 5.1k nous obtenons 5v et 3A max. Il sera donc simple d'alimenter notre carte avec un câble USB, chargeur de téléphone ou alimentation de Raspberry par exemple et d'obtenir jusqu'à 15w ce qui semble largement suffisant.&lt;br /&gt;
&lt;br /&gt;
Notre PCB est terminé, voici le schéma et un rendu du PCB final. &lt;br /&gt;
[[File:Pico2024_B8_sch_PCB.pdf|thumb|left|500px|Le schéma final (en 3 pages)]]&lt;br /&gt;
[[File:Pico2024_B8_rendu_PCB.png|thumb|right|500px|Le PCB final]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Les fichiers GERBER sont disponibles dans notre dépot [https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT]&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre PCB, pour commencer nous assemblons les composants minimums pour faire clignoter une LED avec le 328p.&lt;br /&gt;
[[File:Pico2024_B8_PCB_recu.jpeg|thumb|left|500px|Le naked PCB]]&lt;br /&gt;
[[File:Pico2024_B8_PC1.jpeg|thumb|right|500px|Ca fonctionne]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
En programmant par le port ISP avec une Arduino as ISP on arrive à faire clignoter la LED reliée sur PC1 du 328p. On soude ensuite le minimum pour tester l'AtMega8u2, on arrive à faire clignoter deux led reliées a ses broches. &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_8U2.jpeg|thumb|left|500px|Les atmega sont soudés]]&lt;br /&gt;
[[File:Pico2024_B8_double_blinking.mp4|thumb|right|500px|Blinking lights]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6628</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6628"/>
		<updated>2024-11-13T10:31:50Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Ordonnanceur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine.&lt;br /&gt;
&lt;br /&gt;
Lors de ce projet nous allons réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur une carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===23 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===30 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===1 octobre 2024===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|left|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour notre ordonnanceur il est important d'initialiser les taches, notamment leur pointeur de pile. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int t){&lt;br /&gt;
    uint16_t oldSP = SP;&lt;br /&gt;
    SP = Taches[t].stack;&lt;br /&gt;
    uint16_t adresse = (uint16_t)Taches[t].start;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff));&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00) &amp;gt;&amp;gt; 8));&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[t].stack = SP;&lt;br /&gt;
    SP = oldSP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque interruption de l'ISR (toutes les 20ms) on sauvegarde le contexte de la tache en cours, l'ordonnanceur passe à la tache suivante et on restaure le contexte de cette tache.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){&lt;br /&gt;
    /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[courant].stack = SP;&lt;br /&gt;
    /* Appel à l'ordonnanceur */&lt;br /&gt;
    ordonnanceur();&lt;br /&gt;
    /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
    SP = Taches[courant].stack;&lt;br /&gt;
    portRESTORE_Registers();&lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois l’ordonnanceur capable de lancer deux tâches en parallèle, nous nous sommes attaqués à la communication série de la carte par USB. Pour ce faire, nous utilisons l’application minicom coté PC qui permet une connexion série. Il faut initialiser les paramètres de la connexion, notre carte renvoie le message reçu dans le terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Ci joint les deux taches responsables de l'envoi et de la reception de données par le protocole série, &amp;lt;code&amp;gt;serial_buffer&amp;lt;/code&amp;gt; est une variable globale utilisée pour stocker les messages reçus et à envoyer. Les fonctions &amp;lt;code&amp;gt;Serial_Transmit()&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;Serial_Receive()&amp;lt;/code&amp;gt; sont déclarées dans &amp;lt;code&amp;gt;pico_serial.h&amp;lt;/code&amp;gt; et proviennent de la documentation AVR.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SerialWrite(){&lt;br /&gt;
    while (1){&lt;br /&gt;
        Serial_Transmit('\r\n');&lt;br /&gt;
        Serial_Transmit(serial_buffer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SerialRead(){&lt;br /&gt;
    while(1){&lt;br /&gt;
        serial_buffer = Serial_Receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SerialSetup.png|thumb|right|400px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|left|400px|Message reçu par le port série]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Lors de ce test notre atmega envoi &amp;quot;LOULOUTOINE&amp;quot; en boucle sur le port série.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons maintenant une tâche permettant de communiquer avec l'écran 7 segments par la communication SPI (toujours en parallèle des autres tâches).&lt;br /&gt;
Voici par exemple deux des fonctions SPI, il faut préalablement initialiser la communication SPI avec les registres SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SPI_send(uint8_t data) {&lt;br /&gt;
    DISPLAY_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_PIN); //On met le pin CS de l'écran à l'état bas pour l'activer&lt;br /&gt;
    SPDR = data;&lt;br /&gt;
    while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
    DISPLAY_PORT |= (1&amp;lt;&amp;lt;DISPLAY_PIN); // On relache l'écran &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clearDisplaySPI() {&lt;br /&gt;
    SPI_send(0x76); // Commande pour effacer l'écran et remettre le curseur a gauche&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour afficher un caractère sur l'écran il suffit donc d'appeler &amp;lt;code&amp;gt;SPI_send()&amp;lt;/code&amp;gt; en passant en paramètre le caractère à envoyer.&lt;br /&gt;
[[File:Pico2024_B8_ordos7s_video.mp4|thumb|center|600px|Les 5 tâches en parallèle]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que les tâches ont été correctement séparées, il a fallu ajuster notre ordonnanceur pour garantir que les délais de chaque tâche soient respectés. En effet, avec notre méthode actuelle qui repose sur l'utilisation de la fonction _delays_ms() à chaque ajout de tâche, le temps total d'exécution augmente de manière cumulative. Par exemple, avec deux tâches, un délai de 200 ms prendrait 400 ms, et avec trois tâches, cela atteindrait 600 ms. Pour résoudre ce problème, nous avons décidé d'ajouter un état à chaque tâche, permettant de les &amp;quot;endormir&amp;quot; lorsqu'elles ne sont pas appelées, et de les &amp;quot;réveiller&amp;quot; lorsqu'elles le sont. Grâce à ce système, chaque fois qu'une tâche est exécutée, on décrémente son timer de 20 millisecondes à chaque cycle, et ce processus continue jusqu'à son prochain appel. Ainsi, nous garantissons que chaque tâche respecte son délai sans interférer avec l'exécution des autres tâches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void Sleeping(){&lt;br /&gt;
  for (int i = 0; i &amp;lt; NB_TASKS;i++){&lt;br /&gt;
    if (Taches[i].etat.sit == ENDORMI) Taches[i].etat.time.tempsendormi -= 20;&lt;br /&gt;
    if (Taches[i].etat.time.tempsendormi &amp;lt;= 0) {&lt;br /&gt;
      Taches[i].etat.time.tempsendormi = 0;&lt;br /&gt;
      Taches[i].etat.sit = ACTIF;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void ordonnanceur(){&lt;br /&gt;
    PORTC ^= 0x01; // On fait clignoter une des led (J1) à chaque fois que l'ordonnanceur est appelé&lt;br /&gt;
    Sleeping();&lt;br /&gt;
    do{&lt;br /&gt;
    courant ++;&lt;br /&gt;
    if (courant == NB_TASKS) courant = 0;&lt;br /&gt;
    }while (Taches[courant].etat.sit == ENDORMI);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void makeSleep(int t){&lt;br /&gt;
  Taches[courant].etat.sit = ENDORMI;&lt;br /&gt;
  Taches[courant].etat.time.tempsendormi = t;&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
  TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define ENDORMI 1&lt;br /&gt;
#define ACTIF 0&lt;br /&gt;
&lt;br /&gt;
typedef union{&lt;br /&gt;
  int tempsendormi;&lt;br /&gt;
} Time;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
  int sit;&lt;br /&gt;
  Time time;&lt;br /&gt;
} Etat;&lt;br /&gt;
&lt;br /&gt;
typedef struct task{&lt;br /&gt;
  void (*start)(void);&lt;br /&gt;
  uint16_t stack;&lt;br /&gt;
  Etat etat;&lt;br /&gt;
} task;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmi notre groupe, nous sommes le binôme en charge de la carte mère. &lt;br /&gt;
Nous avons décidé d'utiliser un Atmega 328p qui sera programmé avec &amp;lt;code&amp;gt;avr-dude&amp;lt;/code&amp;gt; pour cela notre carte mère comportera également un Atmega8u2 qui servira de programmateur et d'interface serie/USB. &lt;br /&gt;
&lt;br /&gt;
Notre carte étant similaire à une Arduino UNO avec le shield intégré nous mesurerons lors de la prochaine séance la consommation de celle ci afin d'estimer la conso de la future carte mère. Avec cette mesure et les estimations de consommation des différentes cartes filles nous réaliserons un bilan de puissance détaillé.&lt;br /&gt;
&lt;br /&gt;
Pour l'instant nous avons prévu une alimentation par un port USB C, ayant connecté les pins CC1 et CC2 à des resistances de 5.1k nous obtenons 5v et 3A max. Il sera donc simple d'alimenter notre carte avec un câble USB, chargeur de téléphone ou alimentation de Raspberry par exemple et d'obtenir jusqu'à 15w ce qui semble largement suffisant.&lt;br /&gt;
&lt;br /&gt;
Notre PCB est terminé, voici le schéma et un rendu du PCB final. &lt;br /&gt;
[[File:Pico2024_B8_sch_PCB.pdf|thumb|left|500px|Le schéma final (en 3 pages)]]&lt;br /&gt;
[[File:Pico2024_B8_rendu_PCB.png|thumb|right|500px|Le PCB final]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Les fichiers GERBER sont disponibles dans notre dépot [https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT]&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6624</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6624"/>
		<updated>2024-11-13T10:29:07Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Ordonnanceur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine.&lt;br /&gt;
&lt;br /&gt;
Lors de ce projet nous allons réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur une carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===23 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===30 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===1 octobre 2024===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|left|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour notre ordonnanceur il est important d'initialiser les taches, notamment leur pointeur de pile. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int t){&lt;br /&gt;
    uint16_t oldSP = SP;&lt;br /&gt;
    SP = Taches[t].stack;&lt;br /&gt;
    uint16_t adresse = (uint16_t)Taches[t].start;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff));&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00) &amp;gt;&amp;gt; 8));&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[t].stack = SP;&lt;br /&gt;
    SP = oldSP;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque interruption de l'ISR (toutes les 20ms) on sauvegarde le contexte de la tache en cours, l'ordonnanceur passe à la tache suivante et on restaure le contexte de cette tache.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){&lt;br /&gt;
    /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
    portSAVE_Registers();&lt;br /&gt;
    Taches[courant].stack = SP;&lt;br /&gt;
    /* Appel à l'ordonnanceur */&lt;br /&gt;
    ordonnanceur();&lt;br /&gt;
    /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
    SP = Taches[courant].stack;&lt;br /&gt;
    portRESTORE_Registers();&lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois l’ordonnanceur capable de lancer deux tâches en parallèle, nous nous sommes attaqués à la communication série de la carte par USB. Pour ce faire, nous utilisons l’application minicom coté PC qui permet une connexion série. Il faut initialiser les paramètres de la connexion, notre carte renvoie le message reçu dans le terminal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Ci joint les deux taches responsables de l'envoi et de la reception de données par le protocole série, &amp;lt;code&amp;gt;serial_buffer&amp;lt;/code&amp;gt; est une variable globale utilisée pour stocker les messages reçus et à envoyer. Les fonctions &amp;lt;code&amp;gt;Serial_Transmit()&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;Serial_Receive()&amp;lt;/code&amp;gt; sont déclarées dans &amp;lt;code&amp;gt;pico_serial.h&amp;lt;/code&amp;gt; et proviennent de la documentation AVR.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SerialWrite(){&lt;br /&gt;
    while (1){&lt;br /&gt;
        Serial_Transmit('\r\n');&lt;br /&gt;
        Serial_Transmit(serial_buffer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SerialRead(){&lt;br /&gt;
    while(1){&lt;br /&gt;
        serial_buffer = Serial_Receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SerialSetup.png|thumb|right|400px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|left|400px|Message reçu par le port série]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Lors de ce test notre atmega envoi &amp;quot;LOULOUTOINE&amp;quot; en boucle sur le port série.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons maintenant une tâche permettant de communiquer avec l'écran 7 segments par la communication SPI (toujours en parallèle des autres tâches).&lt;br /&gt;
Voici par exemple deux des fonctions SPI, il faut préalablement initialiser la communication SPI avec les registres SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void SPI_send(uint8_t data) {&lt;br /&gt;
    DISPLAY_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;DISPLAY_PIN); //On met le pin CS de l'écran à l'état bas pour l'activer&lt;br /&gt;
    SPDR = data;&lt;br /&gt;
    while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
    DISPLAY_PORT |= (1&amp;lt;&amp;lt;DISPLAY_PIN); // On relache l'écran &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void clearDisplaySPI() {&lt;br /&gt;
    SPI_send(0x76); // Commande pour effacer l'écran et remettre le curseur a gauche&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour afficher un caractère sur l'écran il suffit donc d'appeler &amp;lt;code&amp;gt;SPI_send()&amp;lt;/code&amp;gt; en passant en paramètre le caractère à envoyer.&lt;br /&gt;
[[File:Pico2024_B8_ordos7s_video.mp4|thumb|center|600px|Les 5 tâches en parallèle]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois les tâches séparées correctement, il fallait modifier notre ordonanceur pour que les délais de chaque tâches soit respectés. En effet avec notre méthode actuel qui utilise le &amp;quot;_delays_ms()&amp;quot; à chaque ajout de tâches, celles ci prennent de plus en plus de temps. Par exemple avec deux tâches, un delay de 200ms prendrais 400ms et avec 3 tâches 600ms. Pour palier ce problème, il nous faut rajouter un état à chaque tâches pour pouvoir les endormir quand elles ne sont pas appellés et les reveillés sinon. Avec ce système, chqua fois qu'une tâche est appellée on décompte 20 millisecondes de son timer et on fait ceci jusqu'à son prochain appel. Ceci assure que les tâches durent bien la durée pour laquelle on les appel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void Sleeping(){&lt;br /&gt;
  for (int i = 0; i &amp;lt; NB_TASKS;i++){&lt;br /&gt;
    if (Taches[i].etat.sit == ENDORMI) Taches[i].etat.time.tempsendormi -= 20;&lt;br /&gt;
    if (Taches[i].etat.time.tempsendormi &amp;lt;= 0) {&lt;br /&gt;
      Taches[i].etat.time.tempsendormi = 0;&lt;br /&gt;
      Taches[i].etat.sit = ACTIF;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void ordonnanceur(){&lt;br /&gt;
    PORTC ^= 0x01; // On fait clignoter une des led (J1) à chaque fois que l'ordonnanceur est appelé&lt;br /&gt;
    Sleeping();&lt;br /&gt;
    do{&lt;br /&gt;
    courant ++;&lt;br /&gt;
    if (courant == NB_TASKS) courant = 0;&lt;br /&gt;
    }while (Taches[courant].etat.sit == ENDORMI);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void makeSleep(int t){&lt;br /&gt;
  Taches[courant].etat.sit = ENDORMI;&lt;br /&gt;
  Taches[courant].etat.time.tempsendormi = t;&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
  TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define ENDORMI 1&lt;br /&gt;
#define ACTIF 0&lt;br /&gt;
&lt;br /&gt;
typedef union{&lt;br /&gt;
  int tempsendormi;&lt;br /&gt;
} Time;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
  int sit;&lt;br /&gt;
  Time time;&lt;br /&gt;
} Etat;&lt;br /&gt;
&lt;br /&gt;
typedef struct task{&lt;br /&gt;
  void (*start)(void);&lt;br /&gt;
  uint16_t stack;&lt;br /&gt;
  Etat etat;&lt;br /&gt;
} task;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmi notre groupe, nous sommes le binôme en charge de la carte mère. &lt;br /&gt;
Nous avons décidé d'utiliser un Atmega 328p qui sera programmé avec &amp;lt;code&amp;gt;avr-dude&amp;lt;/code&amp;gt; pour cela notre carte mère comportera également un Atmega8u2 qui servira de programmateur et d'interface serie/USB. &lt;br /&gt;
&lt;br /&gt;
Notre carte étant similaire à une Arduino UNO avec le shield intégré nous mesurerons lors de la prochaine séance la consommation de celle ci afin d'estimer la conso de la future carte mère. Avec cette mesure et les estimations de consommation des différentes cartes filles nous réaliserons un bilan de puissance détaillé.&lt;br /&gt;
&lt;br /&gt;
Pour l'instant nous avons prévu une alimentation par un port USB C, ayant connecté les pins CC1 et CC2 à des resistances de 5.1k nous obtenons 5v et 3A max. Il sera donc simple d'alimenter notre carte avec un câble USB, chargeur de téléphone ou alimentation de Raspberry par exemple et d'obtenir jusqu'à 15w ce qui semble largement suffisant.&lt;br /&gt;
&lt;br /&gt;
Notre PCB est terminé, voici le schéma et un rendu du PCB final. &lt;br /&gt;
[[File:Pico2024_B8_sch_PCB.pdf|thumb|left|500px|Le schéma final (en 3 pages)]]&lt;br /&gt;
[[File:Pico2024_B8_rendu_PCB.png|thumb|right|500px|Le PCB final]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Les fichiers GERBER sont disponibles dans notre dépot [https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT]&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6240</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6240"/>
		<updated>2024-10-14T10:15:39Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Ordonnanceur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine&lt;br /&gt;
Ce projet est le principal de notre semestre, il s'agit de réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur la carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===23 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===30 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===1 octobre 2024===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|right|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois l'ordonnanceur capable de lancer deux tâches en parallèles, nous nous sommes attaqués à la communication série de la cart par USB. Pour se faire nous utilisons l'application minicom qui utilise le terminal pour émuler une connexion Série. Il faut initialiser les paramètres de la connexion et le terminal renvoie directement ce que notre carte envoie comme message.&lt;br /&gt;
&lt;br /&gt;
[[File:Minicom.png|thumb|left|300px|Interface de départ du Minicom]]&lt;br /&gt;
[[File:SerialSetup.png|thumb|center|300px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|right|300px|Message reçu par le port série]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut maintenant que nous faisions la partie reçeption de la carte.&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmis notre groupe, nous somme le binome en charge de la carte mère.&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6239</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6239"/>
		<updated>2024-10-14T10:14:11Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Ordonnanceur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine&lt;br /&gt;
Ce projet est le principal de notre semestre, il s'agit de réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur la carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===23 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===30 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===1 octobre 2024===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|right|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois l'ordonnanceur capable de lancer deux tâches en parallèles, nous nous sommes attaqués à la communication série de la cart par USB. Pour se faire nous utilisons l'application minicom qui utilise le terminal pour émuler une connexion Série. Il faut initialiser les paramètres de la connexion et le terminal renvoie directement ce que la connexion reçoit.&lt;br /&gt;
&lt;br /&gt;
[[File:Minicom.png|thumb|left|300px|Interface de départ du Minicom]]&lt;br /&gt;
[[File:SerialSetup.png|thumb|center|300px|Paramètres du Minicom]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|right|300px|Message reçu par le port série]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmis notre groupe, nous somme le binome en charge de la carte mère.&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6238</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6238"/>
		<updated>2024-10-14T10:13:07Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Ordonnanceur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine&lt;br /&gt;
Ce projet est le principal de notre semestre, il s'agit de réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur la carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===23 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===30 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===1 octobre 2024===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|right|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois l'ordonnanceur capable de lancer deux tâches en parallèles, nous nous sommes attaqués à la communication série de la cart par USB. Pour se faire nous utilisons l'application minicom qui utilise le terminal pour émuler une connexion Série. Il faut initialiser les paramètres de la connexion et le terminal renvoie directement ce que la connexion reçoit.&lt;br /&gt;
&lt;br /&gt;
[[File:Minicom.png|thumb|left|300px|Les LEDs clignotent]]&lt;br /&gt;
[[File:SerialSetup.png|thumb|center|300px|Les LEDs clignotent]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|right|300px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmis notre groupe, nous somme le binome en charge de la carte mère.&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:TestWriteSerial.png&amp;diff=6237</id>
		<title>Fichier:TestWriteSerial.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:TestWriteSerial.png&amp;diff=6237"/>
		<updated>2024-10-14T10:12:44Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:SerialSetup.png&amp;diff=6236</id>
		<title>Fichier:SerialSetup.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:SerialSetup.png&amp;diff=6236"/>
		<updated>2024-10-14T10:12:35Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Minicom.png&amp;diff=6235</id>
		<title>Fichier:Minicom.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Minicom.png&amp;diff=6235"/>
		<updated>2024-10-14T10:12:21Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6234</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6234"/>
		<updated>2024-10-14T10:12:09Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Ordonnanceur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine&lt;br /&gt;
Ce projet est le principal de notre semestre, il s'agit de réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur la carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
===23 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===30 septembre 2024===&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
===1 octobre 2024===&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h'. La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|right|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur=&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par réaliser un ordonnanceur simple pour effectuer deux taches simples (clignotement de deux LEDs).&lt;br /&gt;
Comme visible sur la vidéo, la LED bleue et la LED orange clignotent bien à des fréquences différentes, la LED rouge clignote à chaque appel de l'ordonnanceur.&lt;br /&gt;
[[File:Pico2024_B8_ordo_video.mp4|thumb|center|600px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois l'ordonnanceur capable de lancer deux tâches en parallèles, nous nous sommes attaqués à la communication série de la cart par USB. Pour se faire nous utilisons l'application minicom qui utilise le terminal pour émuler une connexion Série. Il faut initialiser les paramètres de la connexion et le terminal renvoie directement ce que la connexion reçoit.&lt;br /&gt;
&lt;br /&gt;
[[File:Minicom.png|thumb|left|400px|Les LEDs clignotent]]&lt;br /&gt;
[[File:SerialSetup.png|thumb|center|400px|Les LEDs clignotent]]&lt;br /&gt;
[[File:TestWriteSerial.png|thumb|right|400px|Les LEDs clignotent]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
&lt;br /&gt;
Parmis notre groupe, nous somme le binome en charge de la carte mère.&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6074</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6074"/>
		<updated>2024-10-01T13:31:21Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine&lt;br /&gt;
Ce projet est le principal de notre semestre, il s'agit de réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur la carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
==23 septembre 2024==&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
==30 septembre 2024==&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
==1 octobre 2024==&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h' &lt;br /&gt;
La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|right|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;br /&gt;
==1 octobre 2024==&lt;br /&gt;
Parmis notre groupe, nous somme le binome en charge de la carte mère.&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6067</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6067"/>
		<updated>2024-10-01T12:35:11Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine&lt;br /&gt;
Ce projet est le principal de notre semestre, il s'agit de réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur la carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
==23 septembre 2024==&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
==30 septembre 2024==&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
==1 octobre 2024==&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h' &lt;br /&gt;
La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|right|400px|Lecture de la carte SD]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Pico2024_B8_SD.png&amp;diff=6066</id>
		<title>Fichier:Pico2024 B8 SD.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Pico2024_B8_SD.png&amp;diff=6066"/>
		<updated>2024-10-01T12:34:34Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6065</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6065"/>
		<updated>2024-10-01T12:33:59Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine&lt;br /&gt;
Ce projet est le principal de notre semestre, il s'agit de réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur la carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PicoShield=&lt;br /&gt;
Pour débuter cet ordinateur, nous allons tester les fonctionnalités de base grâce à un shield que nous connectons à une carte arduino.&lt;br /&gt;
==23 septembre 2024==&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|400px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|400px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
==30 septembre 2024==&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|400px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|400px|L'afficheur externe]]&lt;br /&gt;
&lt;br /&gt;
==1 octobre 2024==&lt;br /&gt;
Nous avons testé le connecteur de carte SD, à l'aide de la bibliothèque arduino 'SD.h' &lt;br /&gt;
La carte est bien reconnue, nous pouvons voir la taille mémoire de la carte et les fichiers présents dessus.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_SD.png|thumb|right|400px|Lecture de la carte SD]]&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
Nous avons testé toutes les fonctionnalités de base avec le PicoShield, nous pouvons donc passer à la suite.&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte mère=&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6064</id>
		<title>SE4Binome2024-8</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-8&amp;diff=6064"/>
		<updated>2024-10-01T12:23:13Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wiki du projet Pico BONNINGRE Louis LECOMTE Antoine&lt;br /&gt;
Ce projet est le principal de notre semestre, il s'agit de réaliser un pico-ordinateur qui comporte plusieurs fonctionnalités qui sont implémentées grâce à des cartes filles que l'on vient brancher sur la carte mère.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitea.plil.fr/lbonning/pico-se4_binome8 GIT du projet]&lt;br /&gt;
&lt;br /&gt;
=PIcoShield=&lt;br /&gt;
==23 septembre 2024==&lt;br /&gt;
&lt;br /&gt;
Modification du PCB du shield, ajout d'une puce mémoire dans le cas ou la connexion à la carte SD ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_sch_motherboard.pdf|thumb|left|600px|Le schéma de la carte mère]]&lt;br /&gt;
[[File:Pico2024_B8_pcb_motherboard.png|thumb|right|600px|Le PCB de la carte mère]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
=30 septembre 2024=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé les composants sur la carte puis testé les led et un afficheur 7 segments connecté sur un des ports pour carte fille &lt;br /&gt;
&lt;br /&gt;
[[File:Pico2024_B8_led.png|thumb|left|600px|Les LEDs fonctionnent]]&lt;br /&gt;
[[File:Pico2024_B8_7seg.png|thumb|right|600px|L'afficheur externe]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5624</id>
		<title>SE3Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5624"/>
		<updated>2024-06-11T14:31:15Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* GIT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet Groupe 5 : Voiture Programmable =&lt;br /&gt;
Cette page est consacrée à la présentation du projet SE3 réalisé par BOURSAULT Rémi &amp;amp; LECOMTE Antoine, qui est porté sur la création d'une voiture contrôlé par programmation.&lt;br /&gt;
&lt;br /&gt;
== Présentation : ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
Les objectifs du projets sont : &lt;br /&gt;
&lt;br /&gt;
* Concevoir une voiture fonctionnant sur batterie, avec un ATMega.&lt;br /&gt;
* Intégrer des clignotants fonctionnels.&lt;br /&gt;
* Permettre à la voiture d'avancer ou reculer, toujours en utilisant l'ATMega.&lt;br /&gt;
* Ajout d'un gyrophare.&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Pour atteindre ces différents objectifs, nous aurons besoins des ressources suivantes :&lt;br /&gt;
&lt;br /&gt;
* Un microcontrôleur ATMega16U4/ATMega32U4&lt;br /&gt;
* Des LEDS&lt;br /&gt;
* Deux moteurs à courant continu&lt;br /&gt;
* Un châssis &lt;br /&gt;
* Des dipôles classiques&lt;br /&gt;
* Un gyrophare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir choisi notre projet et nos différents objectifs pour ce projet, nous avons commencé à travailler sur le schéma de montage sur KiCAD afin de pouvoir ensuite faire le PCB et le routage qui sera envoyé à une usine pour imprimer nos cartes. Les fonctions et composants principaux de notre projet sont les suivants.&lt;br /&gt;
&lt;br /&gt;
== Fonction sur le schéma : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Microcontrôleur ===&lt;br /&gt;
La partie indispensable de tous montages électroniques, le cerveau de la voiture. Sans le microcontrôleur rien dans ce projet n'est possible, il permet de gérer les informations. qui sont transmises dans toutes la carte. C'est un microcontrôleur ATMega32u4, ce n'est pas le plus puissant, mais pour la taille du projet que nous faisons c'est bien assez. Il possède assez d'entrées/sorties pour ce que nous voulons en faire.[[Fichier:Microcontroleu.png||thumb|left|300px|Schéma du microcontrôleur]]&lt;br /&gt;
[[Fichier:Pin configuration atmega.png||thumb|center|300px|Configuration des pins sur l'atmega]]&lt;br /&gt;
&lt;br /&gt;
=== Commande Moteur ===&lt;br /&gt;
Ce bloc est celui qui actionne les moteurs et leur dit quand s'arrêter. Celui-ci est composé d'un TB6612FNG, un driver pour moteur qui ne sert qu'à ça. Il prend sept signaux en entrée trois pour gérer chaque moteur et un signal de standby. Nous avons utilisé la datasheet pour savoir comment le schématiser et quels composants utilisé pour que celui-ci fonctionne dans des conditions optimales. &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'ajouter ce composant, car les signaux de sortie délivrés par l'ATMega sont trop faibles pour alimenter un moteur. Ce driver vient, à partir d'une tension d'alimentation Vcc amplifier le signal de commande délivré par l'ATMega pour que les moteurs aient l'alimentation adéquate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datasheet TB6612.png||thumb|left|300px|PCB routé de la carte]]&lt;br /&gt;
[[Fichier:Commande Moteur.png||thumb|center|300px|Schéma du bloc de commande des moteurs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chargeur LI-PO ===&lt;br /&gt;
Comme notre voiture fonctionnera sur batterie, il faut un moyen de la recharger, ceci se faisant par l'intermédiaire d'un port USB, il faut un bloc pour adapter le courant que reçoit l'USB pour que cela corresponde aux caractéristiques de notre batterie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Chargeur lipo.png||thumb|center|300px|Schéma du chargeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la Batterie ===&lt;br /&gt;
Ce bloc permet de séparer l'alimentation en USB et sur batterie. Lorsqu'un cavalier est présent sur J6, VBAT est directement relié à Vcc et ainsi la batterie sert d'alimentation pour  la carte. Il est impératif de débrancher l'USB avant de mettre le cavalier, pour éviter tout court-circuit. Lorsqu'on enlève le cavalier, on peut brancher l'USB et la carte fonctionne en filaire.[[Fichier:Utilisation baterie.png||thumb|center|300px|Schéma du switch batterie]]&lt;br /&gt;
=== Connecteur USB ===&lt;br /&gt;
On dispose de deux connecteurs USB, un pour recharger la batterie, et un autre pour transmettre les données, qui servira à implanter un programme dans notre microcontrôleur.[[Fichier:Connecteur USBs.png||thumb|center|300px|Schéma des connecteur USB]]&lt;br /&gt;
=== Connecteur ISP ===&lt;br /&gt;
Pour charger le bootloader sur le microcontrôleur si besoin.[[Fichier:Connecteur ISP.png||thumb|center|300px|Schéma du connecteur ISP]]&lt;br /&gt;
=== Diodes Électroluminescentes ===&lt;br /&gt;
[[Fichier:LED voiture.png||thumb|center|300px|Schéma des LEDS]]&lt;br /&gt;
&lt;br /&gt;
== PCB et routage : ==&lt;br /&gt;
Après avoir fini toutes nos fonctions et le schéma, nous nous sommes attaqué au PCB de la carte, il nous a fallu quelque essais pour obtenir une disposition qui nous convienne et qui facilite le routage.[[Fichier:Vue3D.png||thumb|left|300px|Vue 3D de la carte]]&lt;br /&gt;
[[Fichier:PCB voiture.png||thumb|center|300px|PCB routé de la carte]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brasage des composants ==&lt;br /&gt;
Une fois les cartes reçues, nous nous sommes attaqués à la brasure des différents composants. Nous avons commencé par le microcontrôleur, le cristal et les résistances et capacités associées. Dès le départ nous avons eu des problèmes avec le brasage, des pattes soudées entre elles, le cristal mal posé. Mais notre plus gros problème a été l'allocation des pins du microcontrôleur. Nous ne le savions pas au moment de la création de notre PCB et nous n'y avons pas fait attention, mais des pins sont spécialement attribuées au MISO, MOSI et SOCKET. Pins que nous devons utilisés pour envoyer le bootloader sur la microcontrôleur via le programmateur ISP (en orange sur le schéma).  Nous avons donc dû improviser une solution. Nous avons coupé les pistes et relié par des fils les broches de l'ISP aux pins correspondantes. A cause de cette erreur nos LEDs D2 et D3 ne sont plus utilisables.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Atmega pin mosi.png|thumb|center|800x|Pins de l'atmega utilisés pour l'ISP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois ce problème réglé, nous avons pu passer à la suite, la gestion des moteurs. Pour ce faire il n'y a pas eu autant de problèmes que sur la partie microcontrôleur, nous avons simplement soudé le contrôleur de moteurs, un TB6612FNG, puis les broches sur lesquelles nous allons venir brancher les moteurs, et enfin les fils directement sur les broches des moteurs. Nous avons également utilisé du plastique thermo rétractable pour que les fils soient protégés et restent soudés aux moteurs durant toute la durée du projet. Les moteurs étant prêt à l'emploi, nous les avons testé pour savoir si tout était fonctionnelle. Une fois confirmé, nous avons pris des bouchons de bouteilles comme roues et mis des élastiques autour pour avoir de la traction lors de nos différents essais.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Moteur et roues.jpg|thumb|center|300px|Moteurs et roues]]&lt;br /&gt;
&lt;br /&gt;
Pour tester toute notre carte, nous avons crée un code sous le nom de helloworld.c qui rempli différente fonction, allumer ou faire clignoter les LEDs en fonction du déplacement de la voiture et, bien évidemment, déplacer la voiture. La voiture réagissant comme nous le souhaitons, nous décidons donc de passer à l'étape suivante, le fonctionnement sur batterie. Ce n'est pas la partie la plus compliquée, il suffit de brasé les broches permettant d'accueillir la batterie puis celles destinées au cavalier. Une fois le tout installé sur notre carte, nous la testons et tout fonctionne normalement. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:LED allumée sur batterie.jpg|thumb|left|150px|LED allumée en fonctionnement sur batterie]]&lt;br /&gt;
[[Fichier:Voiture appui bouton.mp4|thumb|center|Voiture fonctionnant sur batterie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il nous reste encore un peu de temps, nous décidons de nous attaqués à la dernière partie, la recharge de la batterie. Comme pour la partie de fonctionnement sur batterie, il n'y a aucune partie de code, il suffit de soudé des composants en plus sur la carte pour que la nouvelle fonctionnalité soit active. Donc nous nous y sommes mis et encore une fois il n'y a aucun problème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture déchargée.mp4|thumb|left|500px|Voiture déchargée]]&lt;br /&gt;
[[Fichier:Voiture en charge.mp4|thumb|center|500px|Voiture en charge]]&lt;br /&gt;
[[Fichier:Voiture après recharge.mp4|thumb|left|500px|Voiture après recharge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
Vous trouverez dans le lien [https://archives.plil.fr/rboursau/premier-systeme-embarque.git GIT] de notre projet, tous les fichiers de création de la carte se trouvent dans le dossier projet_voiture, le code envoyé pour tester la voiture dans le dossier cod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 erase&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 flash helloworld.hex&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 reset&lt;br /&gt;
&lt;br /&gt;
puis débranché et rebranché la voiture&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton HWB puis RESET, relaché RESET puis HWB pour que la voiture repasse en mode DFU bootloader&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton reset pour arreter le cycle de la voiture au milieu&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5623</id>
		<title>SE3Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5623"/>
		<updated>2024-06-11T14:31:05Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Brasage des composants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet Groupe 5 : Voiture Programmable =&lt;br /&gt;
Cette page est consacrée à la présentation du projet SE3 réalisé par BOURSAULT Rémi &amp;amp; LECOMTE Antoine, qui est porté sur la création d'une voiture contrôlé par programmation.&lt;br /&gt;
&lt;br /&gt;
== Présentation : ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
Les objectifs du projets sont : &lt;br /&gt;
&lt;br /&gt;
* Concevoir une voiture fonctionnant sur batterie, avec un ATMega.&lt;br /&gt;
* Intégrer des clignotants fonctionnels.&lt;br /&gt;
* Permettre à la voiture d'avancer ou reculer, toujours en utilisant l'ATMega.&lt;br /&gt;
* Ajout d'un gyrophare.&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Pour atteindre ces différents objectifs, nous aurons besoins des ressources suivantes :&lt;br /&gt;
&lt;br /&gt;
* Un microcontrôleur ATMega16U4/ATMega32U4&lt;br /&gt;
* Des LEDS&lt;br /&gt;
* Deux moteurs à courant continu&lt;br /&gt;
* Un châssis &lt;br /&gt;
* Des dipôles classiques&lt;br /&gt;
* Un gyrophare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir choisi notre projet et nos différents objectifs pour ce projet, nous avons commencé à travailler sur le schéma de montage sur KiCAD afin de pouvoir ensuite faire le PCB et le routage qui sera envoyé à une usine pour imprimer nos cartes. Les fonctions et composants principaux de notre projet sont les suivants.&lt;br /&gt;
&lt;br /&gt;
== Fonction sur le schéma : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Microcontrôleur ===&lt;br /&gt;
La partie indispensable de tous montages électroniques, le cerveau de la voiture. Sans le microcontrôleur rien dans ce projet n'est possible, il permet de gérer les informations. qui sont transmises dans toutes la carte. C'est un microcontrôleur ATMega32u4, ce n'est pas le plus puissant, mais pour la taille du projet que nous faisons c'est bien assez. Il possède assez d'entrées/sorties pour ce que nous voulons en faire.[[Fichier:Microcontroleu.png||thumb|left|300px|Schéma du microcontrôleur]]&lt;br /&gt;
[[Fichier:Pin configuration atmega.png||thumb|center|300px|Configuration des pins sur l'atmega]]&lt;br /&gt;
&lt;br /&gt;
=== Commande Moteur ===&lt;br /&gt;
Ce bloc est celui qui actionne les moteurs et leur dit quand s'arrêter. Celui-ci est composé d'un TB6612FNG, un driver pour moteur qui ne sert qu'à ça. Il prend sept signaux en entrée trois pour gérer chaque moteur et un signal de standby. Nous avons utilisé la datasheet pour savoir comment le schématiser et quels composants utilisé pour que celui-ci fonctionne dans des conditions optimales. &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'ajouter ce composant, car les signaux de sortie délivrés par l'ATMega sont trop faibles pour alimenter un moteur. Ce driver vient, à partir d'une tension d'alimentation Vcc amplifier le signal de commande délivré par l'ATMega pour que les moteurs aient l'alimentation adéquate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datasheet TB6612.png||thumb|left|300px|PCB routé de la carte]]&lt;br /&gt;
[[Fichier:Commande Moteur.png||thumb|center|300px|Schéma du bloc de commande des moteurs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chargeur LI-PO ===&lt;br /&gt;
Comme notre voiture fonctionnera sur batterie, il faut un moyen de la recharger, ceci se faisant par l'intermédiaire d'un port USB, il faut un bloc pour adapter le courant que reçoit l'USB pour que cela corresponde aux caractéristiques de notre batterie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Chargeur lipo.png||thumb|center|300px|Schéma du chargeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la Batterie ===&lt;br /&gt;
Ce bloc permet de séparer l'alimentation en USB et sur batterie. Lorsqu'un cavalier est présent sur J6, VBAT est directement relié à Vcc et ainsi la batterie sert d'alimentation pour  la carte. Il est impératif de débrancher l'USB avant de mettre le cavalier, pour éviter tout court-circuit. Lorsqu'on enlève le cavalier, on peut brancher l'USB et la carte fonctionne en filaire.[[Fichier:Utilisation baterie.png||thumb|center|300px|Schéma du switch batterie]]&lt;br /&gt;
=== Connecteur USB ===&lt;br /&gt;
On dispose de deux connecteurs USB, un pour recharger la batterie, et un autre pour transmettre les données, qui servira à implanter un programme dans notre microcontrôleur.[[Fichier:Connecteur USBs.png||thumb|center|300px|Schéma des connecteur USB]]&lt;br /&gt;
=== Connecteur ISP ===&lt;br /&gt;
Pour charger le bootloader sur le microcontrôleur si besoin.[[Fichier:Connecteur ISP.png||thumb|center|300px|Schéma du connecteur ISP]]&lt;br /&gt;
=== Diodes Électroluminescentes ===&lt;br /&gt;
[[Fichier:LED voiture.png||thumb|center|300px|Schéma des LEDS]]&lt;br /&gt;
&lt;br /&gt;
== PCB et routage : ==&lt;br /&gt;
Après avoir fini toutes nos fonctions et le schéma, nous nous sommes attaqué au PCB de la carte, il nous a fallu quelque essais pour obtenir une disposition qui nous convienne et qui facilite le routage.[[Fichier:Vue3D.png||thumb|left|300px|Vue 3D de la carte]]&lt;br /&gt;
[[Fichier:PCB voiture.png||thumb|center|300px|PCB routé de la carte]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brasage des composants ==&lt;br /&gt;
Une fois les cartes reçues, nous nous sommes attaqués à la brasure des différents composants. Nous avons commencé par le microcontrôleur, le cristal et les résistances et capacités associées. Dès le départ nous avons eu des problèmes avec le brasage, des pattes soudées entre elles, le cristal mal posé. Mais notre plus gros problème a été l'allocation des pins du microcontrôleur. Nous ne le savions pas au moment de la création de notre PCB et nous n'y avons pas fait attention, mais des pins sont spécialement attribuées au MISO, MOSI et SOCKET. Pins que nous devons utilisés pour envoyer le bootloader sur la microcontrôleur via le programmateur ISP (en orange sur le schéma).  Nous avons donc dû improviser une solution. Nous avons coupé les pistes et relié par des fils les broches de l'ISP aux pins correspondantes. A cause de cette erreur nos LEDs D2 et D3 ne sont plus utilisables.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Atmega pin mosi.png|thumb|center|800x|Pins de l'atmega utilisés pour l'ISP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois ce problème réglé, nous avons pu passer à la suite, la gestion des moteurs. Pour ce faire il n'y a pas eu autant de problèmes que sur la partie microcontrôleur, nous avons simplement soudé le contrôleur de moteurs, un TB6612FNG, puis les broches sur lesquelles nous allons venir brancher les moteurs, et enfin les fils directement sur les broches des moteurs. Nous avons également utilisé du plastique thermo rétractable pour que les fils soient protégés et restent soudés aux moteurs durant toute la durée du projet. Les moteurs étant prêt à l'emploi, nous les avons testé pour savoir si tout était fonctionnelle. Une fois confirmé, nous avons pris des bouchons de bouteilles comme roues et mis des élastiques autour pour avoir de la traction lors de nos différents essais.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Moteur et roues.jpg|thumb|center|300px|Moteurs et roues]]&lt;br /&gt;
&lt;br /&gt;
Pour tester toute notre carte, nous avons crée un code sous le nom de helloworld.c qui rempli différente fonction, allumer ou faire clignoter les LEDs en fonction du déplacement de la voiture et, bien évidemment, déplacer la voiture. La voiture réagissant comme nous le souhaitons, nous décidons donc de passer à l'étape suivante, le fonctionnement sur batterie. Ce n'est pas la partie la plus compliquée, il suffit de brasé les broches permettant d'accueillir la batterie puis celles destinées au cavalier. Une fois le tout installé sur notre carte, nous la testons et tout fonctionne normalement. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:LED allumée sur batterie.jpg|thumb|left|150px|LED allumée en fonctionnement sur batterie]]&lt;br /&gt;
[[Fichier:Voiture appui bouton.mp4|thumb|center|Voiture fonctionnant sur batterie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il nous reste encore un peu de temps, nous décidons de nous attaqués à la dernière partie, la recharge de la batterie. Comme pour la partie de fonctionnement sur batterie, il n'y a aucune partie de code, il suffit de soudé des composants en plus sur la carte pour que la nouvelle fonctionnalité soit active. Donc nous nous y sommes mis et encore une fois il n'y a aucun problème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture déchargée.mp4|thumb|left|500px|Voiture déchargée]]&lt;br /&gt;
[[Fichier:Voiture en charge.mp4|thumb|center|500px|Voiture en charge]]&lt;br /&gt;
[[Fichier:Voiture après recharge.mp4|thumb|left|500px|Voiture après recharge]]&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
Vous trouverez dans le lien [https://archives.plil.fr/rboursau/premier-systeme-embarque.git GIT] de notre projet, tous les fichiers de création de la carte se trouvent dans le dossier projet_voiture, le code envoyé pour tester la voiture dans le dossier cod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 erase&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 flash helloworld.hex&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 reset&lt;br /&gt;
&lt;br /&gt;
puis débranché et rebranché la voiture&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton HWB puis RESET, relaché RESET puis HWB pour que la voiture repasse en mode DFU bootloader&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton reset pour arreter le cycle de la voiture au milieu&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5622</id>
		<title>SE3Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5622"/>
		<updated>2024-06-11T14:30:53Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Brasage des composants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet Groupe 5 : Voiture Programmable =&lt;br /&gt;
Cette page est consacrée à la présentation du projet SE3 réalisé par BOURSAULT Rémi &amp;amp; LECOMTE Antoine, qui est porté sur la création d'une voiture contrôlé par programmation.&lt;br /&gt;
&lt;br /&gt;
== Présentation : ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
Les objectifs du projets sont : &lt;br /&gt;
&lt;br /&gt;
* Concevoir une voiture fonctionnant sur batterie, avec un ATMega.&lt;br /&gt;
* Intégrer des clignotants fonctionnels.&lt;br /&gt;
* Permettre à la voiture d'avancer ou reculer, toujours en utilisant l'ATMega.&lt;br /&gt;
* Ajout d'un gyrophare.&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Pour atteindre ces différents objectifs, nous aurons besoins des ressources suivantes :&lt;br /&gt;
&lt;br /&gt;
* Un microcontrôleur ATMega16U4/ATMega32U4&lt;br /&gt;
* Des LEDS&lt;br /&gt;
* Deux moteurs à courant continu&lt;br /&gt;
* Un châssis &lt;br /&gt;
* Des dipôles classiques&lt;br /&gt;
* Un gyrophare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir choisi notre projet et nos différents objectifs pour ce projet, nous avons commencé à travailler sur le schéma de montage sur KiCAD afin de pouvoir ensuite faire le PCB et le routage qui sera envoyé à une usine pour imprimer nos cartes. Les fonctions et composants principaux de notre projet sont les suivants.&lt;br /&gt;
&lt;br /&gt;
== Fonction sur le schéma : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Microcontrôleur ===&lt;br /&gt;
La partie indispensable de tous montages électroniques, le cerveau de la voiture. Sans le microcontrôleur rien dans ce projet n'est possible, il permet de gérer les informations. qui sont transmises dans toutes la carte. C'est un microcontrôleur ATMega32u4, ce n'est pas le plus puissant, mais pour la taille du projet que nous faisons c'est bien assez. Il possède assez d'entrées/sorties pour ce que nous voulons en faire.[[Fichier:Microcontroleu.png||thumb|left|300px|Schéma du microcontrôleur]]&lt;br /&gt;
[[Fichier:Pin configuration atmega.png||thumb|center|300px|Configuration des pins sur l'atmega]]&lt;br /&gt;
&lt;br /&gt;
=== Commande Moteur ===&lt;br /&gt;
Ce bloc est celui qui actionne les moteurs et leur dit quand s'arrêter. Celui-ci est composé d'un TB6612FNG, un driver pour moteur qui ne sert qu'à ça. Il prend sept signaux en entrée trois pour gérer chaque moteur et un signal de standby. Nous avons utilisé la datasheet pour savoir comment le schématiser et quels composants utilisé pour que celui-ci fonctionne dans des conditions optimales. &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'ajouter ce composant, car les signaux de sortie délivrés par l'ATMega sont trop faibles pour alimenter un moteur. Ce driver vient, à partir d'une tension d'alimentation Vcc amplifier le signal de commande délivré par l'ATMega pour que les moteurs aient l'alimentation adéquate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datasheet TB6612.png||thumb|left|300px|PCB routé de la carte]]&lt;br /&gt;
[[Fichier:Commande Moteur.png||thumb|center|300px|Schéma du bloc de commande des moteurs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chargeur LI-PO ===&lt;br /&gt;
Comme notre voiture fonctionnera sur batterie, il faut un moyen de la recharger, ceci se faisant par l'intermédiaire d'un port USB, il faut un bloc pour adapter le courant que reçoit l'USB pour que cela corresponde aux caractéristiques de notre batterie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Chargeur lipo.png||thumb|center|300px|Schéma du chargeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la Batterie ===&lt;br /&gt;
Ce bloc permet de séparer l'alimentation en USB et sur batterie. Lorsqu'un cavalier est présent sur J6, VBAT est directement relié à Vcc et ainsi la batterie sert d'alimentation pour  la carte. Il est impératif de débrancher l'USB avant de mettre le cavalier, pour éviter tout court-circuit. Lorsqu'on enlève le cavalier, on peut brancher l'USB et la carte fonctionne en filaire.[[Fichier:Utilisation baterie.png||thumb|center|300px|Schéma du switch batterie]]&lt;br /&gt;
=== Connecteur USB ===&lt;br /&gt;
On dispose de deux connecteurs USB, un pour recharger la batterie, et un autre pour transmettre les données, qui servira à implanter un programme dans notre microcontrôleur.[[Fichier:Connecteur USBs.png||thumb|center|300px|Schéma des connecteur USB]]&lt;br /&gt;
=== Connecteur ISP ===&lt;br /&gt;
Pour charger le bootloader sur le microcontrôleur si besoin.[[Fichier:Connecteur ISP.png||thumb|center|300px|Schéma du connecteur ISP]]&lt;br /&gt;
=== Diodes Électroluminescentes ===&lt;br /&gt;
[[Fichier:LED voiture.png||thumb|center|300px|Schéma des LEDS]]&lt;br /&gt;
&lt;br /&gt;
== PCB et routage : ==&lt;br /&gt;
Après avoir fini toutes nos fonctions et le schéma, nous nous sommes attaqué au PCB de la carte, il nous a fallu quelque essais pour obtenir une disposition qui nous convienne et qui facilite le routage.[[Fichier:Vue3D.png||thumb|left|300px|Vue 3D de la carte]]&lt;br /&gt;
[[Fichier:PCB voiture.png||thumb|center|300px|PCB routé de la carte]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brasage des composants ==&lt;br /&gt;
Une fois les cartes reçues, nous nous sommes attaqués à la brasure des différents composants. Nous avons commencé par le microcontrôleur, le cristal et les résistances et capacités associées. Dès le départ nous avons eu des problèmes avec le brasage, des pattes soudées entre elles, le cristal mal posé. Mais notre plus gros problème a été l'allocation des pins du microcontrôleur. Nous ne le savions pas au moment de la création de notre PCB et nous n'y avons pas fait attention, mais des pins sont spécialement attribuées au MISO, MOSI et SOCKET. Pins que nous devons utilisés pour envoyer le bootloader sur la microcontrôleur via le programmateur ISP (en orange sur le schéma).  Nous avons donc dû improviser une solution. Nous avons coupé les pistes et relié par des fils les broches de l'ISP aux pins correspondantes. A cause de cette erreur nos LEDs D2 et D3 ne sont plus utilisables.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Atmega pin mosi.png|thumb|center|800x|Pins de l'atmega utilisés pour l'ISP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois ce problème réglé, nous avons pu passer à la suite, la gestion des moteurs. Pour ce faire il n'y a pas eu autant de problèmes que sur la partie microcontrôleur, nous avons simplement soudé le contrôleur de moteurs, un TB6612FNG, puis les broches sur lesquelles nous allons venir brancher les moteurs, et enfin les fils directement sur les broches des moteurs. Nous avons également utilisé du plastique thermo rétractable pour que les fils soient protégés et restent soudés aux moteurs durant toute la durée du projet. Les moteurs étant prêt à l'emploi, nous les avons testé pour savoir si tout était fonctionnelle. Une fois confirmé, nous avons pris des bouchons de bouteilles comme roues et mis des élastiques autour pour avoir de la traction lors de nos différents essais.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Moteur et roues.jpg|thumb|center|300px|Moteurs et roues]]&lt;br /&gt;
&lt;br /&gt;
Pour tester toute notre carte, nous avons crée un code sous le nom de helloworld.c qui rempli différente fonction, allumer ou faire clignoter les LEDs en fonction du déplacement de la voiture et, bien évidemment, déplacer la voiture. La voiture réagissant comme nous le souhaitons, nous décidons donc de passer à l'étape suivante, le fonctionnement sur batterie. Ce n'est pas la partie la plus compliquée, il suffit de brasé les broches permettant d'accueillir la batterie puis celles destinées au cavalier. Une fois le tout installé sur notre carte, nous la testons et tout fonctionne normalement. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:LED allumée sur batterie.jpg|thumb|left|150px|LED allumée en fonctionnement sur batterie]]&lt;br /&gt;
[[Fichier:Voiture appui bouton.mp4|thumb|center|Voiture fonctionnant sur batterie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il nous reste encore un peu de temps, nous décidons de nous attaqués à la dernière partie, la recharge de la batterie. Comme pour la partie de fonctionnement sur batterie, il n'y a aucune partie de code, il suffit de soudé des composants en plus sur la carte pour que la nouvelle fonctionnalité soit active. Donc nous nous y sommes mis et encore une fois il n'y a aucun problème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture déchargée.mp4|thumb|left|500px|Voiture déchargée]]&lt;br /&gt;
[[Fichier:Voiture en charge.mp4|thumb|center|500px|Voiture en charge]]&lt;br /&gt;
[[Fichier:Voiture après recharge.mp4|thumb|left|500px|Voiture après recharge]]&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
Vous trouverez dans le lien [https://archives.plil.fr/rboursau/premier-systeme-embarque.git GIT] de notre projet, tous les fichiers de création de la carte se trouvent dans le dossier projet_voiture, le code envoyé pour tester la voiture dans le dossier cod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 erase&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 flash helloworld.hex&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 reset&lt;br /&gt;
&lt;br /&gt;
puis débranché et rebranché la voiture&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton HWB puis RESET, relaché RESET puis HWB pour que la voiture repasse en mode DFU bootloader&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton reset pour arreter le cycle de la voiture au milieu&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5621</id>
		<title>SE3Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5621"/>
		<updated>2024-06-11T14:30:40Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Brasage des composants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet Groupe 5 : Voiture Programmable =&lt;br /&gt;
Cette page est consacrée à la présentation du projet SE3 réalisé par BOURSAULT Rémi &amp;amp; LECOMTE Antoine, qui est porté sur la création d'une voiture contrôlé par programmation.&lt;br /&gt;
&lt;br /&gt;
== Présentation : ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
Les objectifs du projets sont : &lt;br /&gt;
&lt;br /&gt;
* Concevoir une voiture fonctionnant sur batterie, avec un ATMega.&lt;br /&gt;
* Intégrer des clignotants fonctionnels.&lt;br /&gt;
* Permettre à la voiture d'avancer ou reculer, toujours en utilisant l'ATMega.&lt;br /&gt;
* Ajout d'un gyrophare.&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Pour atteindre ces différents objectifs, nous aurons besoins des ressources suivantes :&lt;br /&gt;
&lt;br /&gt;
* Un microcontrôleur ATMega16U4/ATMega32U4&lt;br /&gt;
* Des LEDS&lt;br /&gt;
* Deux moteurs à courant continu&lt;br /&gt;
* Un châssis &lt;br /&gt;
* Des dipôles classiques&lt;br /&gt;
* Un gyrophare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir choisi notre projet et nos différents objectifs pour ce projet, nous avons commencé à travailler sur le schéma de montage sur KiCAD afin de pouvoir ensuite faire le PCB et le routage qui sera envoyé à une usine pour imprimer nos cartes. Les fonctions et composants principaux de notre projet sont les suivants.&lt;br /&gt;
&lt;br /&gt;
== Fonction sur le schéma : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Microcontrôleur ===&lt;br /&gt;
La partie indispensable de tous montages électroniques, le cerveau de la voiture. Sans le microcontrôleur rien dans ce projet n'est possible, il permet de gérer les informations. qui sont transmises dans toutes la carte. C'est un microcontrôleur ATMega32u4, ce n'est pas le plus puissant, mais pour la taille du projet que nous faisons c'est bien assez. Il possède assez d'entrées/sorties pour ce que nous voulons en faire.[[Fichier:Microcontroleu.png||thumb|left|300px|Schéma du microcontrôleur]]&lt;br /&gt;
[[Fichier:Pin configuration atmega.png||thumb|center|300px|Configuration des pins sur l'atmega]]&lt;br /&gt;
&lt;br /&gt;
=== Commande Moteur ===&lt;br /&gt;
Ce bloc est celui qui actionne les moteurs et leur dit quand s'arrêter. Celui-ci est composé d'un TB6612FNG, un driver pour moteur qui ne sert qu'à ça. Il prend sept signaux en entrée trois pour gérer chaque moteur et un signal de standby. Nous avons utilisé la datasheet pour savoir comment le schématiser et quels composants utilisé pour que celui-ci fonctionne dans des conditions optimales. &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'ajouter ce composant, car les signaux de sortie délivrés par l'ATMega sont trop faibles pour alimenter un moteur. Ce driver vient, à partir d'une tension d'alimentation Vcc amplifier le signal de commande délivré par l'ATMega pour que les moteurs aient l'alimentation adéquate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datasheet TB6612.png||thumb|left|300px|PCB routé de la carte]]&lt;br /&gt;
[[Fichier:Commande Moteur.png||thumb|center|300px|Schéma du bloc de commande des moteurs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chargeur LI-PO ===&lt;br /&gt;
Comme notre voiture fonctionnera sur batterie, il faut un moyen de la recharger, ceci se faisant par l'intermédiaire d'un port USB, il faut un bloc pour adapter le courant que reçoit l'USB pour que cela corresponde aux caractéristiques de notre batterie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Chargeur lipo.png||thumb|center|300px|Schéma du chargeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la Batterie ===&lt;br /&gt;
Ce bloc permet de séparer l'alimentation en USB et sur batterie. Lorsqu'un cavalier est présent sur J6, VBAT est directement relié à Vcc et ainsi la batterie sert d'alimentation pour  la carte. Il est impératif de débrancher l'USB avant de mettre le cavalier, pour éviter tout court-circuit. Lorsqu'on enlève le cavalier, on peut brancher l'USB et la carte fonctionne en filaire.[[Fichier:Utilisation baterie.png||thumb|center|300px|Schéma du switch batterie]]&lt;br /&gt;
=== Connecteur USB ===&lt;br /&gt;
On dispose de deux connecteurs USB, un pour recharger la batterie, et un autre pour transmettre les données, qui servira à implanter un programme dans notre microcontrôleur.[[Fichier:Connecteur USBs.png||thumb|center|300px|Schéma des connecteur USB]]&lt;br /&gt;
=== Connecteur ISP ===&lt;br /&gt;
Pour charger le bootloader sur le microcontrôleur si besoin.[[Fichier:Connecteur ISP.png||thumb|center|300px|Schéma du connecteur ISP]]&lt;br /&gt;
=== Diodes Électroluminescentes ===&lt;br /&gt;
[[Fichier:LED voiture.png||thumb|center|300px|Schéma des LEDS]]&lt;br /&gt;
&lt;br /&gt;
== PCB et routage : ==&lt;br /&gt;
Après avoir fini toutes nos fonctions et le schéma, nous nous sommes attaqué au PCB de la carte, il nous a fallu quelque essais pour obtenir une disposition qui nous convienne et qui facilite le routage.[[Fichier:Vue3D.png||thumb|left|300px|Vue 3D de la carte]]&lt;br /&gt;
[[Fichier:PCB voiture.png||thumb|center|300px|PCB routé de la carte]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brasage des composants ==&lt;br /&gt;
Une fois les cartes reçues, nous nous sommes attaqués à la brasure des différents composants. Nous avons commencé par le microcontrôleur, le cristal et les résistances et capacités associées. Dès le départ nous avons eu des problèmes avec le brasage, des pattes soudées entre elles, le cristal mal posé. Mais notre plus gros problème a été l'allocation des pins du microcontrôleur. Nous ne le savions pas au moment de la création de notre PCB et nous n'y avons pas fait attention, mais des pins sont spécialement attribuées au MISO, MOSI et SOCKET. Pins que nous devons utilisés pour envoyer le bootloader sur la microcontrôleur via le programmateur ISP (en orange sur le schéma).  Nous avons donc dû improviser une solution. Nous avons coupé les pistes et relié par des fils les broches de l'ISP aux pins correspondantes. A cause de cette erreur nos LEDs D2 et D3 ne sont plus utilisables.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Atmega pin mosi.png|thumb|center|800x|Pins de l'atmega utilisés pour l'ISP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois ce problème réglé, nous avons pu passer à la suite, la gestion des moteurs. Pour ce faire il n'y a pas eu autant de problèmes que sur la partie microcontrôleur, nous avons simplement soudé le contrôleur de moteurs, un TB6612FNG, puis les broches sur lesquelles nous allons venir brancher les moteurs, et enfin les fils directement sur les broches des moteurs. Nous avons également utilisé du plastique thermo rétractable pour que les fils soient protégés et restent soudés aux moteurs durant toute la durée du projet. Les moteurs étant prêt à l'emploi, nous les avons testé pour savoir si tout était fonctionnelle. Une fois confirmé, nous avons pris des bouchons de bouteilles comme roues et mis des élastiques autour pour avoir de la traction lors de nos différents essais.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Moteur et roues.jpg|thumb|center|300px|Moteurs et roues]]&lt;br /&gt;
&lt;br /&gt;
Pour tester toute notre carte, nous avons crée un code sous le nom de helloworld.c qui rempli différente fonction, allumer ou faire clignoter les LEDs en fonction du déplacement de la voiture et, bien évidemment, déplacer la voiture. La voiture réagissant comme nous le souhaitons, nous décidons donc de passer à l'étape suivante, le fonctionnement sur batterie. Ce n'est pas la partie la plus compliquée, il suffit de brasé les broches permettant d'accueillir la batterie puis celles destinées au cavalier. Une fois le tout installé sur notre carte, nous la testons et tout fonctionne normalement. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:LED allumée sur batterie.jpg|thumb|left|150px|LED allumée en fonctionnement sur batterie]]&lt;br /&gt;
[[Fichier:Voiture appui bouton.mp4|thumb|center|Voiture fonctionnant sur batterie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il nous reste encore un peu de temps, nous décidons de nous attaqués à la dernière partie, la recharge de la batterie. Comme pour la partie de fonctionnement sur batterie, il n'y a aucune partie de code, il suffit de soudé des composants en plus sur la carte pour que la nouvelle fonctionnalité soit active. Donc nous nous y sommes mis et encore une fois il n'y a aucun problème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture déchargée.mp4|thumb|left|500px|Voiture déchargée]]&lt;br /&gt;
[[Fichier:Voiture en charge.mp4|thumb|center|500px|Voiture en charge]]&lt;br /&gt;
[[Fichier:Voiture après recharge.mp4|thumb|left|500px|Voiture après recharge]]&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
Vous trouverez dans le lien [https://archives.plil.fr/rboursau/premier-systeme-embarque.git GIT] de notre projet, tous les fichiers de création de la carte se trouvent dans le dossier projet_voiture, le code envoyé pour tester la voiture dans le dossier cod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 erase&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 flash helloworld.hex&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 reset&lt;br /&gt;
&lt;br /&gt;
puis débranché et rebranché la voiture&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton HWB puis RESET, relaché RESET puis HWB pour que la voiture repasse en mode DFU bootloader&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton reset pour arreter le cycle de la voiture au milieu&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5620</id>
		<title>SE3Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5620"/>
		<updated>2024-06-11T14:30:26Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Brasage des composants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet Groupe 5 : Voiture Programmable =&lt;br /&gt;
Cette page est consacrée à la présentation du projet SE3 réalisé par BOURSAULT Rémi &amp;amp; LECOMTE Antoine, qui est porté sur la création d'une voiture contrôlé par programmation.&lt;br /&gt;
&lt;br /&gt;
== Présentation : ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
Les objectifs du projets sont : &lt;br /&gt;
&lt;br /&gt;
* Concevoir une voiture fonctionnant sur batterie, avec un ATMega.&lt;br /&gt;
* Intégrer des clignotants fonctionnels.&lt;br /&gt;
* Permettre à la voiture d'avancer ou reculer, toujours en utilisant l'ATMega.&lt;br /&gt;
* Ajout d'un gyrophare.&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Pour atteindre ces différents objectifs, nous aurons besoins des ressources suivantes :&lt;br /&gt;
&lt;br /&gt;
* Un microcontrôleur ATMega16U4/ATMega32U4&lt;br /&gt;
* Des LEDS&lt;br /&gt;
* Deux moteurs à courant continu&lt;br /&gt;
* Un châssis &lt;br /&gt;
* Des dipôles classiques&lt;br /&gt;
* Un gyrophare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir choisi notre projet et nos différents objectifs pour ce projet, nous avons commencé à travailler sur le schéma de montage sur KiCAD afin de pouvoir ensuite faire le PCB et le routage qui sera envoyé à une usine pour imprimer nos cartes. Les fonctions et composants principaux de notre projet sont les suivants.&lt;br /&gt;
&lt;br /&gt;
== Fonction sur le schéma : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Microcontrôleur ===&lt;br /&gt;
La partie indispensable de tous montages électroniques, le cerveau de la voiture. Sans le microcontrôleur rien dans ce projet n'est possible, il permet de gérer les informations. qui sont transmises dans toutes la carte. C'est un microcontrôleur ATMega32u4, ce n'est pas le plus puissant, mais pour la taille du projet que nous faisons c'est bien assez. Il possède assez d'entrées/sorties pour ce que nous voulons en faire.[[Fichier:Microcontroleu.png||thumb|left|300px|Schéma du microcontrôleur]]&lt;br /&gt;
[[Fichier:Pin configuration atmega.png||thumb|center|300px|Configuration des pins sur l'atmega]]&lt;br /&gt;
&lt;br /&gt;
=== Commande Moteur ===&lt;br /&gt;
Ce bloc est celui qui actionne les moteurs et leur dit quand s'arrêter. Celui-ci est composé d'un TB6612FNG, un driver pour moteur qui ne sert qu'à ça. Il prend sept signaux en entrée trois pour gérer chaque moteur et un signal de standby. Nous avons utilisé la datasheet pour savoir comment le schématiser et quels composants utilisé pour que celui-ci fonctionne dans des conditions optimales. &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'ajouter ce composant, car les signaux de sortie délivrés par l'ATMega sont trop faibles pour alimenter un moteur. Ce driver vient, à partir d'une tension d'alimentation Vcc amplifier le signal de commande délivré par l'ATMega pour que les moteurs aient l'alimentation adéquate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datasheet TB6612.png||thumb|left|300px|PCB routé de la carte]]&lt;br /&gt;
[[Fichier:Commande Moteur.png||thumb|center|300px|Schéma du bloc de commande des moteurs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chargeur LI-PO ===&lt;br /&gt;
Comme notre voiture fonctionnera sur batterie, il faut un moyen de la recharger, ceci se faisant par l'intermédiaire d'un port USB, il faut un bloc pour adapter le courant que reçoit l'USB pour que cela corresponde aux caractéristiques de notre batterie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Chargeur lipo.png||thumb|center|300px|Schéma du chargeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la Batterie ===&lt;br /&gt;
Ce bloc permet de séparer l'alimentation en USB et sur batterie. Lorsqu'un cavalier est présent sur J6, VBAT est directement relié à Vcc et ainsi la batterie sert d'alimentation pour  la carte. Il est impératif de débrancher l'USB avant de mettre le cavalier, pour éviter tout court-circuit. Lorsqu'on enlève le cavalier, on peut brancher l'USB et la carte fonctionne en filaire.[[Fichier:Utilisation baterie.png||thumb|center|300px|Schéma du switch batterie]]&lt;br /&gt;
=== Connecteur USB ===&lt;br /&gt;
On dispose de deux connecteurs USB, un pour recharger la batterie, et un autre pour transmettre les données, qui servira à implanter un programme dans notre microcontrôleur.[[Fichier:Connecteur USBs.png||thumb|center|300px|Schéma des connecteur USB]]&lt;br /&gt;
=== Connecteur ISP ===&lt;br /&gt;
Pour charger le bootloader sur le microcontrôleur si besoin.[[Fichier:Connecteur ISP.png||thumb|center|300px|Schéma du connecteur ISP]]&lt;br /&gt;
=== Diodes Électroluminescentes ===&lt;br /&gt;
[[Fichier:LED voiture.png||thumb|center|300px|Schéma des LEDS]]&lt;br /&gt;
&lt;br /&gt;
== PCB et routage : ==&lt;br /&gt;
Après avoir fini toutes nos fonctions et le schéma, nous nous sommes attaqué au PCB de la carte, il nous a fallu quelque essais pour obtenir une disposition qui nous convienne et qui facilite le routage.[[Fichier:Vue3D.png||thumb|left|300px|Vue 3D de la carte]]&lt;br /&gt;
[[Fichier:PCB voiture.png||thumb|center|300px|PCB routé de la carte]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brasage des composants ==&lt;br /&gt;
Une fois les cartes reçues, nous nous sommes attaqués à la brasure des différents composants. Nous avons commencé par le microcontrôleur, le cristal et les résistances et capacités associées. Dès le départ nous avons eu des problèmes avec le brasage, des pattes soudées entre elles, le cristal mal posé. Mais notre plus gros problème a été l'allocation des pins du microcontrôleur. Nous ne le savions pas au moment de la création de notre PCB et nous n'y avons pas fait attention, mais des pins sont spécialement attribuées au MISO, MOSI et SOCKET. Pins que nous devons utilisés pour envoyer le bootloader sur la microcontrôleur via le programmateur ISP (en orange sur le schéma).  Nous avons donc dû improviser une solution. Nous avons coupé les pistes et relié par des fils les broches de l'ISP aux pins correspondantes. A cause de cette erreur nos LEDs D2 et D3 ne sont plus utilisables.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Atmega pin mosi.png|thumb|center|800x|Pins de l'atmega utilisés pour l'ISP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois ce problème réglé, nous avons pu passer à la suite, la gestion des moteurs. Pour ce faire il n'y a pas eu autant de problèmes que sur la partie microcontrôleur, nous avons simplement soudé le contrôleur de moteurs, un TB6612FNG, puis les broches sur lesquelles nous allons venir brancher les moteurs, et enfin les fils directement sur les broches des moteurs. Nous avons également utilisé du plastique thermo rétractable pour que les fils soient protégés et restent soudés aux moteurs durant toute la durée du projet. Les moteurs étant prêt à l'emploi, nous les avons testé pour savoir si tout était fonctionnelle. Une fois confirmé, nous avons pris des bouchons de bouteilles comme roues et mis des élastiques autour pour avoir de la traction lors de nos différents essais.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Moteur et roues.jpg|thumb|center|300px|Moteurs et roues]]&lt;br /&gt;
&lt;br /&gt;
Pour tester toute notre carte, nous avons crée un code sous le nom de helloworld.c qui rempli différente fonction, allumer ou faire clignoter les LEDs en fonction du déplacement de la voiture et, bien évidemment, déplacer la voiture. La voiture réagissant comme nous le souhaitons, nous décidons donc de passer à l'étape suivante, le fonctionnement sur batterie. Ce n'est pas la partie la plus compliquée, il suffit de brasé les broches permettant d'accueillir la batterie puis celles destinées au cavalier. Une fois le tout installé sur notre carte, nous la testons et tout fonctionne normalement. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:LED allumée sur batterie.jpg|thumb|left|200px|LED allumée en fonctionnement sur batterie]]&lt;br /&gt;
[[Fichier:Voiture appui bouton.mp4|thumb|center|Voiture fonctionnant sur batterie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il nous reste encore un peu de temps, nous décidons de nous attaqués à la dernière partie, la recharge de la batterie. Comme pour la partie de fonctionnement sur batterie, il n'y a aucune partie de code, il suffit de soudé des composants en plus sur la carte pour que la nouvelle fonctionnalité soit active. Donc nous nous y sommes mis et encore une fois il n'y a aucun problème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture déchargée.mp4|thumb|left|500px|Voiture déchargée]]&lt;br /&gt;
[[Fichier:Voiture en charge.mp4|thumb|center|500px|Voiture en charge]]&lt;br /&gt;
[[Fichier:Voiture après recharge.mp4|thumb|left|500px|Voiture après recharge]]&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
Vous trouverez dans le lien [https://archives.plil.fr/rboursau/premier-systeme-embarque.git GIT] de notre projet, tous les fichiers de création de la carte se trouvent dans le dossier projet_voiture, le code envoyé pour tester la voiture dans le dossier cod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 erase&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 flash helloworld.hex&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 reset&lt;br /&gt;
&lt;br /&gt;
puis débranché et rebranché la voiture&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton HWB puis RESET, relaché RESET puis HWB pour que la voiture repasse en mode DFU bootloader&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton reset pour arreter le cycle de la voiture au milieu&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5619</id>
		<title>SE3Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5619"/>
		<updated>2024-06-11T14:30:11Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Brasage des composants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet Groupe 5 : Voiture Programmable =&lt;br /&gt;
Cette page est consacrée à la présentation du projet SE3 réalisé par BOURSAULT Rémi &amp;amp; LECOMTE Antoine, qui est porté sur la création d'une voiture contrôlé par programmation.&lt;br /&gt;
&lt;br /&gt;
== Présentation : ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
Les objectifs du projets sont : &lt;br /&gt;
&lt;br /&gt;
* Concevoir une voiture fonctionnant sur batterie, avec un ATMega.&lt;br /&gt;
* Intégrer des clignotants fonctionnels.&lt;br /&gt;
* Permettre à la voiture d'avancer ou reculer, toujours en utilisant l'ATMega.&lt;br /&gt;
* Ajout d'un gyrophare.&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Pour atteindre ces différents objectifs, nous aurons besoins des ressources suivantes :&lt;br /&gt;
&lt;br /&gt;
* Un microcontrôleur ATMega16U4/ATMega32U4&lt;br /&gt;
* Des LEDS&lt;br /&gt;
* Deux moteurs à courant continu&lt;br /&gt;
* Un châssis &lt;br /&gt;
* Des dipôles classiques&lt;br /&gt;
* Un gyrophare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir choisi notre projet et nos différents objectifs pour ce projet, nous avons commencé à travailler sur le schéma de montage sur KiCAD afin de pouvoir ensuite faire le PCB et le routage qui sera envoyé à une usine pour imprimer nos cartes. Les fonctions et composants principaux de notre projet sont les suivants.&lt;br /&gt;
&lt;br /&gt;
== Fonction sur le schéma : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Microcontrôleur ===&lt;br /&gt;
La partie indispensable de tous montages électroniques, le cerveau de la voiture. Sans le microcontrôleur rien dans ce projet n'est possible, il permet de gérer les informations. qui sont transmises dans toutes la carte. C'est un microcontrôleur ATMega32u4, ce n'est pas le plus puissant, mais pour la taille du projet que nous faisons c'est bien assez. Il possède assez d'entrées/sorties pour ce que nous voulons en faire.[[Fichier:Microcontroleu.png||thumb|left|300px|Schéma du microcontrôleur]]&lt;br /&gt;
[[Fichier:Pin configuration atmega.png||thumb|center|300px|Configuration des pins sur l'atmega]]&lt;br /&gt;
&lt;br /&gt;
=== Commande Moteur ===&lt;br /&gt;
Ce bloc est celui qui actionne les moteurs et leur dit quand s'arrêter. Celui-ci est composé d'un TB6612FNG, un driver pour moteur qui ne sert qu'à ça. Il prend sept signaux en entrée trois pour gérer chaque moteur et un signal de standby. Nous avons utilisé la datasheet pour savoir comment le schématiser et quels composants utilisé pour que celui-ci fonctionne dans des conditions optimales. &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'ajouter ce composant, car les signaux de sortie délivrés par l'ATMega sont trop faibles pour alimenter un moteur. Ce driver vient, à partir d'une tension d'alimentation Vcc amplifier le signal de commande délivré par l'ATMega pour que les moteurs aient l'alimentation adéquate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datasheet TB6612.png||thumb|left|300px|PCB routé de la carte]]&lt;br /&gt;
[[Fichier:Commande Moteur.png||thumb|center|300px|Schéma du bloc de commande des moteurs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chargeur LI-PO ===&lt;br /&gt;
Comme notre voiture fonctionnera sur batterie, il faut un moyen de la recharger, ceci se faisant par l'intermédiaire d'un port USB, il faut un bloc pour adapter le courant que reçoit l'USB pour que cela corresponde aux caractéristiques de notre batterie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Chargeur lipo.png||thumb|center|300px|Schéma du chargeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la Batterie ===&lt;br /&gt;
Ce bloc permet de séparer l'alimentation en USB et sur batterie. Lorsqu'un cavalier est présent sur J6, VBAT est directement relié à Vcc et ainsi la batterie sert d'alimentation pour  la carte. Il est impératif de débrancher l'USB avant de mettre le cavalier, pour éviter tout court-circuit. Lorsqu'on enlève le cavalier, on peut brancher l'USB et la carte fonctionne en filaire.[[Fichier:Utilisation baterie.png||thumb|center|300px|Schéma du switch batterie]]&lt;br /&gt;
=== Connecteur USB ===&lt;br /&gt;
On dispose de deux connecteurs USB, un pour recharger la batterie, et un autre pour transmettre les données, qui servira à implanter un programme dans notre microcontrôleur.[[Fichier:Connecteur USBs.png||thumb|center|300px|Schéma des connecteur USB]]&lt;br /&gt;
=== Connecteur ISP ===&lt;br /&gt;
Pour charger le bootloader sur le microcontrôleur si besoin.[[Fichier:Connecteur ISP.png||thumb|center|300px|Schéma du connecteur ISP]]&lt;br /&gt;
=== Diodes Électroluminescentes ===&lt;br /&gt;
[[Fichier:LED voiture.png||thumb|center|300px|Schéma des LEDS]]&lt;br /&gt;
&lt;br /&gt;
== PCB et routage : ==&lt;br /&gt;
Après avoir fini toutes nos fonctions et le schéma, nous nous sommes attaqué au PCB de la carte, il nous a fallu quelque essais pour obtenir une disposition qui nous convienne et qui facilite le routage.[[Fichier:Vue3D.png||thumb|left|300px|Vue 3D de la carte]]&lt;br /&gt;
[[Fichier:PCB voiture.png||thumb|center|300px|PCB routé de la carte]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brasage des composants ==&lt;br /&gt;
Une fois les cartes reçues, nous nous sommes attaqués à la brasure des différents composants. Nous avons commencé par le microcontrôleur, le cristal et les résistances et capacités associées. Dès le départ nous avons eu des problèmes avec le brasage, des pattes soudées entre elles, le cristal mal posé. Mais notre plus gros problème a été l'allocation des pins du microcontrôleur. Nous ne le savions pas au moment de la création de notre PCB et nous n'y avons pas fait attention, mais des pins sont spécialement attribuées au MISO, MOSI et SOCKET. Pins que nous devons utilisés pour envoyer le bootloader sur la microcontrôleur via le programmateur ISP (en orange sur le schéma).  Nous avons donc dû improviser une solution. Nous avons coupé les pistes et relié par des fils les broches de l'ISP aux pins correspondantes. A cause de cette erreur nos LEDs D2 et D3 ne sont plus utilisables.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Atmega pin mosi.png|thumb|center|800x|Pins de l'atmega utilisés pour l'ISP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois ce problème réglé, nous avons pu passer à la suite, la gestion des moteurs. Pour ce faire il n'y a pas eu autant de problèmes que sur la partie microcontrôleur, nous avons simplement soudé le contrôleur de moteurs, un TB6612FNG, puis les broches sur lesquelles nous allons venir brancher les moteurs, et enfin les fils directement sur les broches des moteurs. Nous avons également utilisé du plastique thermo rétractable pour que les fils soient protégés et restent soudés aux moteurs durant toute la durée du projet. Les moteurs étant prêt à l'emploi, nous les avons testé pour savoir si tout était fonctionnelle. Une fois confirmé, nous avons pris des bouchons de bouteilles comme roues et mis des élastiques autour pour avoir de la traction lors de nos différents essais.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Moteur et roues.jpg|thumb|center|300px|Moteurs et roues]]&lt;br /&gt;
&lt;br /&gt;
Pour tester toute notre carte, nous avons crée un code sous le nom de helloworld.c qui rempli différente fonction, allumer ou faire clignoter les LEDs en fonction du déplacement de la voiture et, bien évidemment, déplacer la voiture. La voiture réagissant comme nous le souhaitons, nous décidons donc de passer à l'étape suivante, le fonctionnement sur batterie. Ce n'est pas la partie la plus compliquée, il suffit de brasé les broches permettant d'accueillir la batterie puis celles destinées au cavalier. Une fois le tout installé sur notre carte, nous la testons et tout fonctionne normalement. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:LED allumée sur batterie.jpg|thumb|left|400px|LED allumée en fonctionnement sur batterie]]&lt;br /&gt;
[[Fichier:Voiture appui bouton.mp4|thumb|center|Voiture fonctionnant sur batterie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il nous reste encore un peu de temps, nous décidons de nous attaqués à la dernière partie, la recharge de la batterie. Comme pour la partie de fonctionnement sur batterie, il n'y a aucune partie de code, il suffit de soudé des composants en plus sur la carte pour que la nouvelle fonctionnalité soit active. Donc nous nous y sommes mis et encore une fois il n'y a aucun problème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture déchargée.mp4|thumb|left|500px|Voiture déchargée]]&lt;br /&gt;
[[Fichier:Voiture en charge.mp4|thumb|center|500px|Voiture en charge]]&lt;br /&gt;
[[Fichier:Voiture après recharge.mp4|thumb|left|500px|Voiture après recharge]]&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
Vous trouverez dans le lien [https://archives.plil.fr/rboursau/premier-systeme-embarque.git GIT] de notre projet, tous les fichiers de création de la carte se trouvent dans le dossier projet_voiture, le code envoyé pour tester la voiture dans le dossier cod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 erase&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 flash helloworld.hex&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 reset&lt;br /&gt;
&lt;br /&gt;
puis débranché et rebranché la voiture&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton HWB puis RESET, relaché RESET puis HWB pour que la voiture repasse en mode DFU bootloader&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton reset pour arreter le cycle de la voiture au milieu&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5618</id>
		<title>SE3Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5618"/>
		<updated>2024-06-11T14:29:27Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Brasage des composants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet Groupe 5 : Voiture Programmable =&lt;br /&gt;
Cette page est consacrée à la présentation du projet SE3 réalisé par BOURSAULT Rémi &amp;amp; LECOMTE Antoine, qui est porté sur la création d'une voiture contrôlé par programmation.&lt;br /&gt;
&lt;br /&gt;
== Présentation : ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
Les objectifs du projets sont : &lt;br /&gt;
&lt;br /&gt;
* Concevoir une voiture fonctionnant sur batterie, avec un ATMega.&lt;br /&gt;
* Intégrer des clignotants fonctionnels.&lt;br /&gt;
* Permettre à la voiture d'avancer ou reculer, toujours en utilisant l'ATMega.&lt;br /&gt;
* Ajout d'un gyrophare.&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Pour atteindre ces différents objectifs, nous aurons besoins des ressources suivantes :&lt;br /&gt;
&lt;br /&gt;
* Un microcontrôleur ATMega16U4/ATMega32U4&lt;br /&gt;
* Des LEDS&lt;br /&gt;
* Deux moteurs à courant continu&lt;br /&gt;
* Un châssis &lt;br /&gt;
* Des dipôles classiques&lt;br /&gt;
* Un gyrophare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir choisi notre projet et nos différents objectifs pour ce projet, nous avons commencé à travailler sur le schéma de montage sur KiCAD afin de pouvoir ensuite faire le PCB et le routage qui sera envoyé à une usine pour imprimer nos cartes. Les fonctions et composants principaux de notre projet sont les suivants.&lt;br /&gt;
&lt;br /&gt;
== Fonction sur le schéma : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Microcontrôleur ===&lt;br /&gt;
La partie indispensable de tous montages électroniques, le cerveau de la voiture. Sans le microcontrôleur rien dans ce projet n'est possible, il permet de gérer les informations. qui sont transmises dans toutes la carte. C'est un microcontrôleur ATMega32u4, ce n'est pas le plus puissant, mais pour la taille du projet que nous faisons c'est bien assez. Il possède assez d'entrées/sorties pour ce que nous voulons en faire.[[Fichier:Microcontroleu.png||thumb|left|300px|Schéma du microcontrôleur]]&lt;br /&gt;
[[Fichier:Pin configuration atmega.png||thumb|center|300px|Configuration des pins sur l'atmega]]&lt;br /&gt;
&lt;br /&gt;
=== Commande Moteur ===&lt;br /&gt;
Ce bloc est celui qui actionne les moteurs et leur dit quand s'arrêter. Celui-ci est composé d'un TB6612FNG, un driver pour moteur qui ne sert qu'à ça. Il prend sept signaux en entrée trois pour gérer chaque moteur et un signal de standby. Nous avons utilisé la datasheet pour savoir comment le schématiser et quels composants utilisé pour que celui-ci fonctionne dans des conditions optimales. &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'ajouter ce composant, car les signaux de sortie délivrés par l'ATMega sont trop faibles pour alimenter un moteur. Ce driver vient, à partir d'une tension d'alimentation Vcc amplifier le signal de commande délivré par l'ATMega pour que les moteurs aient l'alimentation adéquate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datasheet TB6612.png||thumb|left|300px|PCB routé de la carte]]&lt;br /&gt;
[[Fichier:Commande Moteur.png||thumb|center|300px|Schéma du bloc de commande des moteurs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chargeur LI-PO ===&lt;br /&gt;
Comme notre voiture fonctionnera sur batterie, il faut un moyen de la recharger, ceci se faisant par l'intermédiaire d'un port USB, il faut un bloc pour adapter le courant que reçoit l'USB pour que cela corresponde aux caractéristiques de notre batterie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Chargeur lipo.png||thumb|center|300px|Schéma du chargeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la Batterie ===&lt;br /&gt;
Ce bloc permet de séparer l'alimentation en USB et sur batterie. Lorsqu'un cavalier est présent sur J6, VBAT est directement relié à Vcc et ainsi la batterie sert d'alimentation pour  la carte. Il est impératif de débrancher l'USB avant de mettre le cavalier, pour éviter tout court-circuit. Lorsqu'on enlève le cavalier, on peut brancher l'USB et la carte fonctionne en filaire.[[Fichier:Utilisation baterie.png||thumb|center|300px|Schéma du switch batterie]]&lt;br /&gt;
=== Connecteur USB ===&lt;br /&gt;
On dispose de deux connecteurs USB, un pour recharger la batterie, et un autre pour transmettre les données, qui servira à implanter un programme dans notre microcontrôleur.[[Fichier:Connecteur USBs.png||thumb|center|300px|Schéma des connecteur USB]]&lt;br /&gt;
=== Connecteur ISP ===&lt;br /&gt;
Pour charger le bootloader sur le microcontrôleur si besoin.[[Fichier:Connecteur ISP.png||thumb|center|300px|Schéma du connecteur ISP]]&lt;br /&gt;
=== Diodes Électroluminescentes ===&lt;br /&gt;
[[Fichier:LED voiture.png||thumb|center|300px|Schéma des LEDS]]&lt;br /&gt;
&lt;br /&gt;
== PCB et routage : ==&lt;br /&gt;
Après avoir fini toutes nos fonctions et le schéma, nous nous sommes attaqué au PCB de la carte, il nous a fallu quelque essais pour obtenir une disposition qui nous convienne et qui facilite le routage.[[Fichier:Vue3D.png||thumb|left|300px|Vue 3D de la carte]]&lt;br /&gt;
[[Fichier:PCB voiture.png||thumb|center|300px|PCB routé de la carte]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brasage des composants ==&lt;br /&gt;
Une fois les cartes reçues, nous nous sommes attaqués à la brasure des différents composants. Nous avons commencé par le microcontrôleur, le cristal et les résistances et capacités associées. Dès le départ nous avons eu des problèmes avec le brasage, des pattes soudées entre elles, le cristal mal posé. Mais notre plus gros problème a été l'allocation des pins du microcontrôleur. Nous ne le savions pas au moment de la création de notre PCB et nous n'y avons pas fait attention, mais des pins sont spécialement attribuées au MISO, MOSI et SOCKET. Pins que nous devons utilisés pour envoyer le bootloader sur la microcontrôleur via le programmateur ISP (en orange sur le schéma).  Nous avons donc dû improviser une solution. Nous avons coupé les pistes et relié par des fils les broches de l'ISP aux pins correspondantes. A cause de cette erreur nos LEDs D2 et D3 ne sont plus utilisables.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Atmega pin mosi.png|thumb|center|800x|Pins de l'atmega utilisés pour l'ISP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois ce problème réglé, nous avons pu passer à la suite, la gestion des moteurs. Pour ce faire il n'y a pas eu autant de problèmes que sur la partie microcontrôleur, nous avons simplement soudé le contrôleur de moteurs, un TB6612FNG, puis les broches sur lesquelles nous allons venir brancher les moteurs, et enfin les fils directement sur les broches des moteurs. Nous avons également utilisé du plastique thermo rétractable pour que les fils soient protégés et restent soudés aux moteurs durant toute la durée du projet. Les moteurs étant prêt à l'emploi, nous les avons testé pour savoir si tout était fonctionnelle. Une fois confirmé, nous avons pris des bouchons de bouteilles comme roues et mis des élastiques autour pour avoir de la traction lors de nos différents essais.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Moteur et roues.jpg|thumb|center|300px|Moteurs et roues]]&lt;br /&gt;
[[Fichier:LED allumée sur batterie.jpg|vignette|LED allumée en fonctionnement sur batterie]]&lt;br /&gt;
Pour tester toute notre carte, nous avons crée un code sous le nom de helloworld.c qui rempli différente fonction, allumer ou faire clignoter les LEDs en fonction du déplacement de la voiture et, bien évidemment, déplacer la voiture. La voiture réagissant comme nous le souhaitons, nous décidons donc de passer à l'étape suivante, le fonctionnement sur batterie. Ce n'est pas la partie la plus compliquée, il suffit de brasé les broches permettant d'accueillir la batterie puis celles destinées au cavalier. Une fois le tout installé sur notre carte, nous la testons et tout fonctionne normalement. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture appui bouton.mp4|thumb|center|Voiture fonctionnant sur batterie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il nous reste encore un peu de temps, nous décidons de nous attaqués à la dernière partie, la recharge de la batterie. Comme pour la partie de fonctionnement sur batterie, il n'y a aucune partie de code, il suffit de soudé des composants en plus sur la carte pour que la nouvelle fonctionnalité soit active. Donc nous nous y sommes mis et encore une fois il n'y a aucun problème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture déchargée.mp4|thumb|left|500px|Voiture déchargée]]&lt;br /&gt;
[[Fichier:Voiture en charge.mp4|thumb|center|500px|Voiture en charge]]&lt;br /&gt;
[[Fichier:Voiture après recharge.mp4|thumb|left|500px|Voiture après recharge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
Vous trouverez dans le lien [https://archives.plil.fr/rboursau/premier-systeme-embarque.git GIT] de notre projet, tous les fichiers de création de la carte se trouvent dans le dossier projet_voiture, le code envoyé pour tester la voiture dans le dossier cod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 erase&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 flash helloworld.hex&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 reset&lt;br /&gt;
&lt;br /&gt;
puis débranché et rebranché la voiture&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton HWB puis RESET, relaché RESET puis HWB pour que la voiture repasse en mode DFU bootloader&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton reset pour arreter le cycle de la voiture au milieu&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:LED_allum%C3%A9e_sur_batterie.jpg&amp;diff=5617</id>
		<title>Fichier:LED allumée sur batterie.jpg</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:LED_allum%C3%A9e_sur_batterie.jpg&amp;diff=5617"/>
		<updated>2024-06-11T14:28:57Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;b&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5616</id>
		<title>SE3Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5616"/>
		<updated>2024-06-11T14:28:24Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* GIT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet Groupe 5 : Voiture Programmable =&lt;br /&gt;
Cette page est consacrée à la présentation du projet SE3 réalisé par BOURSAULT Rémi &amp;amp; LECOMTE Antoine, qui est porté sur la création d'une voiture contrôlé par programmation.&lt;br /&gt;
&lt;br /&gt;
== Présentation : ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
Les objectifs du projets sont : &lt;br /&gt;
&lt;br /&gt;
* Concevoir une voiture fonctionnant sur batterie, avec un ATMega.&lt;br /&gt;
* Intégrer des clignotants fonctionnels.&lt;br /&gt;
* Permettre à la voiture d'avancer ou reculer, toujours en utilisant l'ATMega.&lt;br /&gt;
* Ajout d'un gyrophare.&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Pour atteindre ces différents objectifs, nous aurons besoins des ressources suivantes :&lt;br /&gt;
&lt;br /&gt;
* Un microcontrôleur ATMega16U4/ATMega32U4&lt;br /&gt;
* Des LEDS&lt;br /&gt;
* Deux moteurs à courant continu&lt;br /&gt;
* Un châssis &lt;br /&gt;
* Des dipôles classiques&lt;br /&gt;
* Un gyrophare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir choisi notre projet et nos différents objectifs pour ce projet, nous avons commencé à travailler sur le schéma de montage sur KiCAD afin de pouvoir ensuite faire le PCB et le routage qui sera envoyé à une usine pour imprimer nos cartes. Les fonctions et composants principaux de notre projet sont les suivants.&lt;br /&gt;
&lt;br /&gt;
== Fonction sur le schéma : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Microcontrôleur ===&lt;br /&gt;
La partie indispensable de tous montages électroniques, le cerveau de la voiture. Sans le microcontrôleur rien dans ce projet n'est possible, il permet de gérer les informations. qui sont transmises dans toutes la carte. C'est un microcontrôleur ATMega32u4, ce n'est pas le plus puissant, mais pour la taille du projet que nous faisons c'est bien assez. Il possède assez d'entrées/sorties pour ce que nous voulons en faire.[[Fichier:Microcontroleu.png||thumb|left|300px|Schéma du microcontrôleur]]&lt;br /&gt;
[[Fichier:Pin configuration atmega.png||thumb|center|300px|Configuration des pins sur l'atmega]]&lt;br /&gt;
&lt;br /&gt;
=== Commande Moteur ===&lt;br /&gt;
Ce bloc est celui qui actionne les moteurs et leur dit quand s'arrêter. Celui-ci est composé d'un TB6612FNG, un driver pour moteur qui ne sert qu'à ça. Il prend sept signaux en entrée trois pour gérer chaque moteur et un signal de standby. Nous avons utilisé la datasheet pour savoir comment le schématiser et quels composants utilisé pour que celui-ci fonctionne dans des conditions optimales. &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'ajouter ce composant, car les signaux de sortie délivrés par l'ATMega sont trop faibles pour alimenter un moteur. Ce driver vient, à partir d'une tension d'alimentation Vcc amplifier le signal de commande délivré par l'ATMega pour que les moteurs aient l'alimentation adéquate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datasheet TB6612.png||thumb|left|300px|PCB routé de la carte]]&lt;br /&gt;
[[Fichier:Commande Moteur.png||thumb|center|300px|Schéma du bloc de commande des moteurs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chargeur LI-PO ===&lt;br /&gt;
Comme notre voiture fonctionnera sur batterie, il faut un moyen de la recharger, ceci se faisant par l'intermédiaire d'un port USB, il faut un bloc pour adapter le courant que reçoit l'USB pour que cela corresponde aux caractéristiques de notre batterie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Chargeur lipo.png||thumb|center|300px|Schéma du chargeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la Batterie ===&lt;br /&gt;
Ce bloc permet de séparer l'alimentation en USB et sur batterie. Lorsqu'un cavalier est présent sur J6, VBAT est directement relié à Vcc et ainsi la batterie sert d'alimentation pour  la carte. Il est impératif de débrancher l'USB avant de mettre le cavalier, pour éviter tout court-circuit. Lorsqu'on enlève le cavalier, on peut brancher l'USB et la carte fonctionne en filaire.[[Fichier:Utilisation baterie.png||thumb|center|300px|Schéma du switch batterie]]&lt;br /&gt;
=== Connecteur USB ===&lt;br /&gt;
On dispose de deux connecteurs USB, un pour recharger la batterie, et un autre pour transmettre les données, qui servira à implanter un programme dans notre microcontrôleur.[[Fichier:Connecteur USBs.png||thumb|center|300px|Schéma des connecteur USB]]&lt;br /&gt;
=== Connecteur ISP ===&lt;br /&gt;
Pour charger le bootloader sur le microcontrôleur si besoin.[[Fichier:Connecteur ISP.png||thumb|center|300px|Schéma du connecteur ISP]]&lt;br /&gt;
=== Diodes Électroluminescentes ===&lt;br /&gt;
[[Fichier:LED voiture.png||thumb|center|300px|Schéma des LEDS]]&lt;br /&gt;
&lt;br /&gt;
== PCB et routage : ==&lt;br /&gt;
Après avoir fini toutes nos fonctions et le schéma, nous nous sommes attaqué au PCB de la carte, il nous a fallu quelque essais pour obtenir une disposition qui nous convienne et qui facilite le routage.[[Fichier:Vue3D.png||thumb|left|300px|Vue 3D de la carte]]&lt;br /&gt;
[[Fichier:PCB voiture.png||thumb|center|300px|PCB routé de la carte]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brasage des composants ==&lt;br /&gt;
Une fois les cartes reçues, nous nous sommes attaqués à la brasure des différents composants. Nous avons commencé par le microcontrôleur, le cristal et les résistances et capacités associées. Dès le départ nous avons eu des problèmes avec le brasage, des pattes soudées entre elles, le cristal mal posé. Mais notre plus gros problème a été l'allocation des pins du microcontrôleur. Nous ne le savions pas au moment de la création de notre PCB et nous n'y avons pas fait attention, mais des pins sont spécialement attribuées au MISO, MOSI et SOCKET. Pins que nous devons utilisés pour envoyer le bootloader sur la microcontrôleur via le programmateur ISP (en orange sur le schéma).  Nous avons donc dû improviser une solution. Nous avons coupé les pistes et relié par des fils les broches de l'ISP aux pins correspondantes. A cause de cette erreur nos LEDs D2 et D3 ne sont plus utilisables.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Atmega pin mosi.png|thumb|center|800x|Pins de l'atmega utilisés pour l'ISP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois ce problème réglé, nous avons pu passer à la suite, la gestion des moteurs. Pour ce faire il n'y a pas eu autant de problèmes que sur la partie microcontrôleur, nous avons simplement soudé le contrôleur de moteurs, un TB6612FNG, puis les broches sur lesquelles nous allons venir brancher les moteurs, et enfin les fils directement sur les broches des moteurs. Nous avons également utilisé du plastique thermo rétractable pour que les fils soient protégés et restent soudés aux moteurs durant toute la durée du projet. Les moteurs étant prêt à l'emploi, nous les avons testé pour savoir si tout était fonctionnelle. Une fois confirmé, nous avons pris des bouchons de bouteilles comme roues et mis des élastiques autour pour avoir de la traction lors de nos différents essais.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Moteur et roues.jpg|thumb|center|300px|Moteurs et roues]]&lt;br /&gt;
&lt;br /&gt;
Pour tester toute notre carte, nous avons crée un code sous le nom de helloworld.c qui rempli différente fonction, allumer ou faire clignoter les LEDs en fonction du déplacement de la voiture et, bien évidemment, déplacer la voiture. La voiture réagissant comme nous le souhaitons, nous décidons donc de passer à l'étape suivante, le fonctionnement sur batterie. Ce n'est pas la partie la plus compliquée, il suffit de brasé les broches permettant d'accueillir la batterie puis celles destinées au cavalier. Une fois le tout installé sur notre carte, nous la testons et tout fonctionne normalement. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture appui bouton.mp4|thumb|center|Voiture fonctionnant sur batterie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il nous reste encore un peu de temps, nous décidons de nous attaqués à la dernière partie, la recharge de la batterie. Comme pour la partie de fonctionnement sur batterie, il n'y a aucune partie de code, il suffit de soudé des composants en plus sur la carte pour que la nouvelle fonctionnalité soit active. Donc nous nous y sommes mis et encore une fois il n'y a aucun problème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture déchargée.mp4|thumb|left|500px|Voiture déchargée]]&lt;br /&gt;
[[Fichier:Voiture en charge.mp4|thumb|center|500px|Voiture en charge]]&lt;br /&gt;
[[Fichier:Voiture après recharge.mp4|thumb|left|500px|Voiture après recharge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
Vous trouverez dans le lien [https://archives.plil.fr/rboursau/premier-systeme-embarque.git GIT] de notre projet, tous les fichiers de création de la carte se trouvent dans le dossier projet_voiture, le code envoyé pour tester la voiture dans le dossier cod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 erase&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 flash helloworld.hex&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 reset&lt;br /&gt;
&lt;br /&gt;
puis débranché et rebranché la voiture&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton HWB puis RESET, relaché RESET puis HWB pour que la voiture repasse en mode DFU bootloader&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton reset pour arreter le cycle de la voiture au milieu&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5615</id>
		<title>SE3Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5615"/>
		<updated>2024-06-11T14:28:17Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* GIT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet Groupe 5 : Voiture Programmable =&lt;br /&gt;
Cette page est consacrée à la présentation du projet SE3 réalisé par BOURSAULT Rémi &amp;amp; LECOMTE Antoine, qui est porté sur la création d'une voiture contrôlé par programmation.&lt;br /&gt;
&lt;br /&gt;
== Présentation : ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
Les objectifs du projets sont : &lt;br /&gt;
&lt;br /&gt;
* Concevoir une voiture fonctionnant sur batterie, avec un ATMega.&lt;br /&gt;
* Intégrer des clignotants fonctionnels.&lt;br /&gt;
* Permettre à la voiture d'avancer ou reculer, toujours en utilisant l'ATMega.&lt;br /&gt;
* Ajout d'un gyrophare.&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Pour atteindre ces différents objectifs, nous aurons besoins des ressources suivantes :&lt;br /&gt;
&lt;br /&gt;
* Un microcontrôleur ATMega16U4/ATMega32U4&lt;br /&gt;
* Des LEDS&lt;br /&gt;
* Deux moteurs à courant continu&lt;br /&gt;
* Un châssis &lt;br /&gt;
* Des dipôles classiques&lt;br /&gt;
* Un gyrophare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir choisi notre projet et nos différents objectifs pour ce projet, nous avons commencé à travailler sur le schéma de montage sur KiCAD afin de pouvoir ensuite faire le PCB et le routage qui sera envoyé à une usine pour imprimer nos cartes. Les fonctions et composants principaux de notre projet sont les suivants.&lt;br /&gt;
&lt;br /&gt;
== Fonction sur le schéma : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Microcontrôleur ===&lt;br /&gt;
La partie indispensable de tous montages électroniques, le cerveau de la voiture. Sans le microcontrôleur rien dans ce projet n'est possible, il permet de gérer les informations. qui sont transmises dans toutes la carte. C'est un microcontrôleur ATMega32u4, ce n'est pas le plus puissant, mais pour la taille du projet que nous faisons c'est bien assez. Il possède assez d'entrées/sorties pour ce que nous voulons en faire.[[Fichier:Microcontroleu.png||thumb|left|300px|Schéma du microcontrôleur]]&lt;br /&gt;
[[Fichier:Pin configuration atmega.png||thumb|center|300px|Configuration des pins sur l'atmega]]&lt;br /&gt;
&lt;br /&gt;
=== Commande Moteur ===&lt;br /&gt;
Ce bloc est celui qui actionne les moteurs et leur dit quand s'arrêter. Celui-ci est composé d'un TB6612FNG, un driver pour moteur qui ne sert qu'à ça. Il prend sept signaux en entrée trois pour gérer chaque moteur et un signal de standby. Nous avons utilisé la datasheet pour savoir comment le schématiser et quels composants utilisé pour que celui-ci fonctionne dans des conditions optimales. &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'ajouter ce composant, car les signaux de sortie délivrés par l'ATMega sont trop faibles pour alimenter un moteur. Ce driver vient, à partir d'une tension d'alimentation Vcc amplifier le signal de commande délivré par l'ATMega pour que les moteurs aient l'alimentation adéquate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datasheet TB6612.png||thumb|left|300px|PCB routé de la carte]]&lt;br /&gt;
[[Fichier:Commande Moteur.png||thumb|center|300px|Schéma du bloc de commande des moteurs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chargeur LI-PO ===&lt;br /&gt;
Comme notre voiture fonctionnera sur batterie, il faut un moyen de la recharger, ceci se faisant par l'intermédiaire d'un port USB, il faut un bloc pour adapter le courant que reçoit l'USB pour que cela corresponde aux caractéristiques de notre batterie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Chargeur lipo.png||thumb|center|300px|Schéma du chargeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la Batterie ===&lt;br /&gt;
Ce bloc permet de séparer l'alimentation en USB et sur batterie. Lorsqu'un cavalier est présent sur J6, VBAT est directement relié à Vcc et ainsi la batterie sert d'alimentation pour  la carte. Il est impératif de débrancher l'USB avant de mettre le cavalier, pour éviter tout court-circuit. Lorsqu'on enlève le cavalier, on peut brancher l'USB et la carte fonctionne en filaire.[[Fichier:Utilisation baterie.png||thumb|center|300px|Schéma du switch batterie]]&lt;br /&gt;
=== Connecteur USB ===&lt;br /&gt;
On dispose de deux connecteurs USB, un pour recharger la batterie, et un autre pour transmettre les données, qui servira à implanter un programme dans notre microcontrôleur.[[Fichier:Connecteur USBs.png||thumb|center|300px|Schéma des connecteur USB]]&lt;br /&gt;
=== Connecteur ISP ===&lt;br /&gt;
Pour charger le bootloader sur le microcontrôleur si besoin.[[Fichier:Connecteur ISP.png||thumb|center|300px|Schéma du connecteur ISP]]&lt;br /&gt;
=== Diodes Électroluminescentes ===&lt;br /&gt;
[[Fichier:LED voiture.png||thumb|center|300px|Schéma des LEDS]]&lt;br /&gt;
&lt;br /&gt;
== PCB et routage : ==&lt;br /&gt;
Après avoir fini toutes nos fonctions et le schéma, nous nous sommes attaqué au PCB de la carte, il nous a fallu quelque essais pour obtenir une disposition qui nous convienne et qui facilite le routage.[[Fichier:Vue3D.png||thumb|left|300px|Vue 3D de la carte]]&lt;br /&gt;
[[Fichier:PCB voiture.png||thumb|center|300px|PCB routé de la carte]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brasage des composants ==&lt;br /&gt;
Une fois les cartes reçues, nous nous sommes attaqués à la brasure des différents composants. Nous avons commencé par le microcontrôleur, le cristal et les résistances et capacités associées. Dès le départ nous avons eu des problèmes avec le brasage, des pattes soudées entre elles, le cristal mal posé. Mais notre plus gros problème a été l'allocation des pins du microcontrôleur. Nous ne le savions pas au moment de la création de notre PCB et nous n'y avons pas fait attention, mais des pins sont spécialement attribuées au MISO, MOSI et SOCKET. Pins que nous devons utilisés pour envoyer le bootloader sur la microcontrôleur via le programmateur ISP (en orange sur le schéma).  Nous avons donc dû improviser une solution. Nous avons coupé les pistes et relié par des fils les broches de l'ISP aux pins correspondantes. A cause de cette erreur nos LEDs D2 et D3 ne sont plus utilisables.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Atmega pin mosi.png|thumb|center|800x|Pins de l'atmega utilisés pour l'ISP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois ce problème réglé, nous avons pu passer à la suite, la gestion des moteurs. Pour ce faire il n'y a pas eu autant de problèmes que sur la partie microcontrôleur, nous avons simplement soudé le contrôleur de moteurs, un TB6612FNG, puis les broches sur lesquelles nous allons venir brancher les moteurs, et enfin les fils directement sur les broches des moteurs. Nous avons également utilisé du plastique thermo rétractable pour que les fils soient protégés et restent soudés aux moteurs durant toute la durée du projet. Les moteurs étant prêt à l'emploi, nous les avons testé pour savoir si tout était fonctionnelle. Une fois confirmé, nous avons pris des bouchons de bouteilles comme roues et mis des élastiques autour pour avoir de la traction lors de nos différents essais.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Moteur et roues.jpg|thumb|center|300px|Moteurs et roues]]&lt;br /&gt;
&lt;br /&gt;
Pour tester toute notre carte, nous avons crée un code sous le nom de helloworld.c qui rempli différente fonction, allumer ou faire clignoter les LEDs en fonction du déplacement de la voiture et, bien évidemment, déplacer la voiture. La voiture réagissant comme nous le souhaitons, nous décidons donc de passer à l'étape suivante, le fonctionnement sur batterie. Ce n'est pas la partie la plus compliquée, il suffit de brasé les broches permettant d'accueillir la batterie puis celles destinées au cavalier. Une fois le tout installé sur notre carte, nous la testons et tout fonctionne normalement. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture appui bouton.mp4|thumb|center|Voiture fonctionnant sur batterie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il nous reste encore un peu de temps, nous décidons de nous attaqués à la dernière partie, la recharge de la batterie. Comme pour la partie de fonctionnement sur batterie, il n'y a aucune partie de code, il suffit de soudé des composants en plus sur la carte pour que la nouvelle fonctionnalité soit active. Donc nous nous y sommes mis et encore une fois il n'y a aucun problème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture déchargée.mp4|thumb|left|500px|Voiture déchargée]]&lt;br /&gt;
[[Fichier:Voiture en charge.mp4|thumb|center|500px|Voiture en charge]]&lt;br /&gt;
[[Fichier:Voiture après recharge.mp4|thumb|left|500px|Voiture après recharge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
Vous trouverez dans le lien [https://archives.plil.fr/rboursau/premier-systeme-embarque.git GIT] de notre projet, tous les fichiers de création de la carte se trouvent dans le dossier projet_voiture, le code envoyé pour tester la voiture dans le dossier cod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 erase&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 flash helloworld.hex&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 reset&lt;br /&gt;
&lt;br /&gt;
puis débranché et rebranché la voiture&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton HWB puis RESET, relaché RESET puis HWB pour que la voiture repasse en mode DFU bootloader&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton reset pour arreter le cycle de la voiture au milieu&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5614</id>
		<title>SE3Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5614"/>
		<updated>2024-06-11T14:28:09Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* GIT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet Groupe 5 : Voiture Programmable =&lt;br /&gt;
Cette page est consacrée à la présentation du projet SE3 réalisé par BOURSAULT Rémi &amp;amp; LECOMTE Antoine, qui est porté sur la création d'une voiture contrôlé par programmation.&lt;br /&gt;
&lt;br /&gt;
== Présentation : ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
Les objectifs du projets sont : &lt;br /&gt;
&lt;br /&gt;
* Concevoir une voiture fonctionnant sur batterie, avec un ATMega.&lt;br /&gt;
* Intégrer des clignotants fonctionnels.&lt;br /&gt;
* Permettre à la voiture d'avancer ou reculer, toujours en utilisant l'ATMega.&lt;br /&gt;
* Ajout d'un gyrophare.&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Pour atteindre ces différents objectifs, nous aurons besoins des ressources suivantes :&lt;br /&gt;
&lt;br /&gt;
* Un microcontrôleur ATMega16U4/ATMega32U4&lt;br /&gt;
* Des LEDS&lt;br /&gt;
* Deux moteurs à courant continu&lt;br /&gt;
* Un châssis &lt;br /&gt;
* Des dipôles classiques&lt;br /&gt;
* Un gyrophare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir choisi notre projet et nos différents objectifs pour ce projet, nous avons commencé à travailler sur le schéma de montage sur KiCAD afin de pouvoir ensuite faire le PCB et le routage qui sera envoyé à une usine pour imprimer nos cartes. Les fonctions et composants principaux de notre projet sont les suivants.&lt;br /&gt;
&lt;br /&gt;
== Fonction sur le schéma : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Microcontrôleur ===&lt;br /&gt;
La partie indispensable de tous montages électroniques, le cerveau de la voiture. Sans le microcontrôleur rien dans ce projet n'est possible, il permet de gérer les informations. qui sont transmises dans toutes la carte. C'est un microcontrôleur ATMega32u4, ce n'est pas le plus puissant, mais pour la taille du projet que nous faisons c'est bien assez. Il possède assez d'entrées/sorties pour ce que nous voulons en faire.[[Fichier:Microcontroleu.png||thumb|left|300px|Schéma du microcontrôleur]]&lt;br /&gt;
[[Fichier:Pin configuration atmega.png||thumb|center|300px|Configuration des pins sur l'atmega]]&lt;br /&gt;
&lt;br /&gt;
=== Commande Moteur ===&lt;br /&gt;
Ce bloc est celui qui actionne les moteurs et leur dit quand s'arrêter. Celui-ci est composé d'un TB6612FNG, un driver pour moteur qui ne sert qu'à ça. Il prend sept signaux en entrée trois pour gérer chaque moteur et un signal de standby. Nous avons utilisé la datasheet pour savoir comment le schématiser et quels composants utilisé pour que celui-ci fonctionne dans des conditions optimales. &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'ajouter ce composant, car les signaux de sortie délivrés par l'ATMega sont trop faibles pour alimenter un moteur. Ce driver vient, à partir d'une tension d'alimentation Vcc amplifier le signal de commande délivré par l'ATMega pour que les moteurs aient l'alimentation adéquate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datasheet TB6612.png||thumb|left|300px|PCB routé de la carte]]&lt;br /&gt;
[[Fichier:Commande Moteur.png||thumb|center|300px|Schéma du bloc de commande des moteurs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chargeur LI-PO ===&lt;br /&gt;
Comme notre voiture fonctionnera sur batterie, il faut un moyen de la recharger, ceci se faisant par l'intermédiaire d'un port USB, il faut un bloc pour adapter le courant que reçoit l'USB pour que cela corresponde aux caractéristiques de notre batterie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Chargeur lipo.png||thumb|center|300px|Schéma du chargeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la Batterie ===&lt;br /&gt;
Ce bloc permet de séparer l'alimentation en USB et sur batterie. Lorsqu'un cavalier est présent sur J6, VBAT est directement relié à Vcc et ainsi la batterie sert d'alimentation pour  la carte. Il est impératif de débrancher l'USB avant de mettre le cavalier, pour éviter tout court-circuit. Lorsqu'on enlève le cavalier, on peut brancher l'USB et la carte fonctionne en filaire.[[Fichier:Utilisation baterie.png||thumb|center|300px|Schéma du switch batterie]]&lt;br /&gt;
=== Connecteur USB ===&lt;br /&gt;
On dispose de deux connecteurs USB, un pour recharger la batterie, et un autre pour transmettre les données, qui servira à implanter un programme dans notre microcontrôleur.[[Fichier:Connecteur USBs.png||thumb|center|300px|Schéma des connecteur USB]]&lt;br /&gt;
=== Connecteur ISP ===&lt;br /&gt;
Pour charger le bootloader sur le microcontrôleur si besoin.[[Fichier:Connecteur ISP.png||thumb|center|300px|Schéma du connecteur ISP]]&lt;br /&gt;
=== Diodes Électroluminescentes ===&lt;br /&gt;
[[Fichier:LED voiture.png||thumb|center|300px|Schéma des LEDS]]&lt;br /&gt;
&lt;br /&gt;
== PCB et routage : ==&lt;br /&gt;
Après avoir fini toutes nos fonctions et le schéma, nous nous sommes attaqué au PCB de la carte, il nous a fallu quelque essais pour obtenir une disposition qui nous convienne et qui facilite le routage.[[Fichier:Vue3D.png||thumb|left|300px|Vue 3D de la carte]]&lt;br /&gt;
[[Fichier:PCB voiture.png||thumb|center|300px|PCB routé de la carte]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brasage des composants ==&lt;br /&gt;
Une fois les cartes reçues, nous nous sommes attaqués à la brasure des différents composants. Nous avons commencé par le microcontrôleur, le cristal et les résistances et capacités associées. Dès le départ nous avons eu des problèmes avec le brasage, des pattes soudées entre elles, le cristal mal posé. Mais notre plus gros problème a été l'allocation des pins du microcontrôleur. Nous ne le savions pas au moment de la création de notre PCB et nous n'y avons pas fait attention, mais des pins sont spécialement attribuées au MISO, MOSI et SOCKET. Pins que nous devons utilisés pour envoyer le bootloader sur la microcontrôleur via le programmateur ISP (en orange sur le schéma).  Nous avons donc dû improviser une solution. Nous avons coupé les pistes et relié par des fils les broches de l'ISP aux pins correspondantes. A cause de cette erreur nos LEDs D2 et D3 ne sont plus utilisables.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Atmega pin mosi.png|thumb|center|800x|Pins de l'atmega utilisés pour l'ISP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois ce problème réglé, nous avons pu passer à la suite, la gestion des moteurs. Pour ce faire il n'y a pas eu autant de problèmes que sur la partie microcontrôleur, nous avons simplement soudé le contrôleur de moteurs, un TB6612FNG, puis les broches sur lesquelles nous allons venir brancher les moteurs, et enfin les fils directement sur les broches des moteurs. Nous avons également utilisé du plastique thermo rétractable pour que les fils soient protégés et restent soudés aux moteurs durant toute la durée du projet. Les moteurs étant prêt à l'emploi, nous les avons testé pour savoir si tout était fonctionnelle. Une fois confirmé, nous avons pris des bouchons de bouteilles comme roues et mis des élastiques autour pour avoir de la traction lors de nos différents essais.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Moteur et roues.jpg|thumb|center|300px|Moteurs et roues]]&lt;br /&gt;
&lt;br /&gt;
Pour tester toute notre carte, nous avons crée un code sous le nom de helloworld.c qui rempli différente fonction, allumer ou faire clignoter les LEDs en fonction du déplacement de la voiture et, bien évidemment, déplacer la voiture. La voiture réagissant comme nous le souhaitons, nous décidons donc de passer à l'étape suivante, le fonctionnement sur batterie. Ce n'est pas la partie la plus compliquée, il suffit de brasé les broches permettant d'accueillir la batterie puis celles destinées au cavalier. Une fois le tout installé sur notre carte, nous la testons et tout fonctionne normalement. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture appui bouton.mp4|thumb|center|Voiture fonctionnant sur batterie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il nous reste encore un peu de temps, nous décidons de nous attaqués à la dernière partie, la recharge de la batterie. Comme pour la partie de fonctionnement sur batterie, il n'y a aucune partie de code, il suffit de soudé des composants en plus sur la carte pour que la nouvelle fonctionnalité soit active. Donc nous nous y sommes mis et encore une fois il n'y a aucun problème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture déchargée.mp4|thumb|left|500px|Voiture déchargée]]&lt;br /&gt;
[[Fichier:Voiture en charge.mp4|thumb|center|500px|Voiture en charge]]&lt;br /&gt;
[[Fichier:Voiture après recharge.mp4|thumb|left|500px|Voiture après recharge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
Vous trouverez dans le lien [https://archives.plil.fr/rboursau/premier-systeme-embarque.git GIT] de notre projet, tous les fichiers de création de la carte se trouvent dans le dossier projet_voiture, le code envoyé pour tester la voiture dans le dossier cod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 erase&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 flash helloworld.hex&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 reset&lt;br /&gt;
&lt;br /&gt;
puis débranché et rebranché la voiture&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton HWB puis RESET, relaché RESET puis HWB pour que la voiture repasse en mode DFU bootloader&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton reset pour arreter le cycle de la voiture au milieu&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5613</id>
		<title>SE3Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5613"/>
		<updated>2024-06-11T14:27:58Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Brasage des composants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet Groupe 5 : Voiture Programmable =&lt;br /&gt;
Cette page est consacrée à la présentation du projet SE3 réalisé par BOURSAULT Rémi &amp;amp; LECOMTE Antoine, qui est porté sur la création d'une voiture contrôlé par programmation.&lt;br /&gt;
&lt;br /&gt;
== Présentation : ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
Les objectifs du projets sont : &lt;br /&gt;
&lt;br /&gt;
* Concevoir une voiture fonctionnant sur batterie, avec un ATMega.&lt;br /&gt;
* Intégrer des clignotants fonctionnels.&lt;br /&gt;
* Permettre à la voiture d'avancer ou reculer, toujours en utilisant l'ATMega.&lt;br /&gt;
* Ajout d'un gyrophare.&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Pour atteindre ces différents objectifs, nous aurons besoins des ressources suivantes :&lt;br /&gt;
&lt;br /&gt;
* Un microcontrôleur ATMega16U4/ATMega32U4&lt;br /&gt;
* Des LEDS&lt;br /&gt;
* Deux moteurs à courant continu&lt;br /&gt;
* Un châssis &lt;br /&gt;
* Des dipôles classiques&lt;br /&gt;
* Un gyrophare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir choisi notre projet et nos différents objectifs pour ce projet, nous avons commencé à travailler sur le schéma de montage sur KiCAD afin de pouvoir ensuite faire le PCB et le routage qui sera envoyé à une usine pour imprimer nos cartes. Les fonctions et composants principaux de notre projet sont les suivants.&lt;br /&gt;
&lt;br /&gt;
== Fonction sur le schéma : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Microcontrôleur ===&lt;br /&gt;
La partie indispensable de tous montages électroniques, le cerveau de la voiture. Sans le microcontrôleur rien dans ce projet n'est possible, il permet de gérer les informations. qui sont transmises dans toutes la carte. C'est un microcontrôleur ATMega32u4, ce n'est pas le plus puissant, mais pour la taille du projet que nous faisons c'est bien assez. Il possède assez d'entrées/sorties pour ce que nous voulons en faire.[[Fichier:Microcontroleu.png||thumb|left|300px|Schéma du microcontrôleur]]&lt;br /&gt;
[[Fichier:Pin configuration atmega.png||thumb|center|300px|Configuration des pins sur l'atmega]]&lt;br /&gt;
&lt;br /&gt;
=== Commande Moteur ===&lt;br /&gt;
Ce bloc est celui qui actionne les moteurs et leur dit quand s'arrêter. Celui-ci est composé d'un TB6612FNG, un driver pour moteur qui ne sert qu'à ça. Il prend sept signaux en entrée trois pour gérer chaque moteur et un signal de standby. Nous avons utilisé la datasheet pour savoir comment le schématiser et quels composants utilisé pour que celui-ci fonctionne dans des conditions optimales. &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'ajouter ce composant, car les signaux de sortie délivrés par l'ATMega sont trop faibles pour alimenter un moteur. Ce driver vient, à partir d'une tension d'alimentation Vcc amplifier le signal de commande délivré par l'ATMega pour que les moteurs aient l'alimentation adéquate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datasheet TB6612.png||thumb|left|300px|PCB routé de la carte]]&lt;br /&gt;
[[Fichier:Commande Moteur.png||thumb|center|300px|Schéma du bloc de commande des moteurs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chargeur LI-PO ===&lt;br /&gt;
Comme notre voiture fonctionnera sur batterie, il faut un moyen de la recharger, ceci se faisant par l'intermédiaire d'un port USB, il faut un bloc pour adapter le courant que reçoit l'USB pour que cela corresponde aux caractéristiques de notre batterie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Chargeur lipo.png||thumb|center|300px|Schéma du chargeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la Batterie ===&lt;br /&gt;
Ce bloc permet de séparer l'alimentation en USB et sur batterie. Lorsqu'un cavalier est présent sur J6, VBAT est directement relié à Vcc et ainsi la batterie sert d'alimentation pour  la carte. Il est impératif de débrancher l'USB avant de mettre le cavalier, pour éviter tout court-circuit. Lorsqu'on enlève le cavalier, on peut brancher l'USB et la carte fonctionne en filaire.[[Fichier:Utilisation baterie.png||thumb|center|300px|Schéma du switch batterie]]&lt;br /&gt;
=== Connecteur USB ===&lt;br /&gt;
On dispose de deux connecteurs USB, un pour recharger la batterie, et un autre pour transmettre les données, qui servira à implanter un programme dans notre microcontrôleur.[[Fichier:Connecteur USBs.png||thumb|center|300px|Schéma des connecteur USB]]&lt;br /&gt;
=== Connecteur ISP ===&lt;br /&gt;
Pour charger le bootloader sur le microcontrôleur si besoin.[[Fichier:Connecteur ISP.png||thumb|center|300px|Schéma du connecteur ISP]]&lt;br /&gt;
=== Diodes Électroluminescentes ===&lt;br /&gt;
[[Fichier:LED voiture.png||thumb|center|300px|Schéma des LEDS]]&lt;br /&gt;
&lt;br /&gt;
== PCB et routage : ==&lt;br /&gt;
Après avoir fini toutes nos fonctions et le schéma, nous nous sommes attaqué au PCB de la carte, il nous a fallu quelque essais pour obtenir une disposition qui nous convienne et qui facilite le routage.[[Fichier:Vue3D.png||thumb|left|300px|Vue 3D de la carte]]&lt;br /&gt;
[[Fichier:PCB voiture.png||thumb|center|300px|PCB routé de la carte]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brasage des composants ==&lt;br /&gt;
Une fois les cartes reçues, nous nous sommes attaqués à la brasure des différents composants. Nous avons commencé par le microcontrôleur, le cristal et les résistances et capacités associées. Dès le départ nous avons eu des problèmes avec le brasage, des pattes soudées entre elles, le cristal mal posé. Mais notre plus gros problème a été l'allocation des pins du microcontrôleur. Nous ne le savions pas au moment de la création de notre PCB et nous n'y avons pas fait attention, mais des pins sont spécialement attribuées au MISO, MOSI et SOCKET. Pins que nous devons utilisés pour envoyer le bootloader sur la microcontrôleur via le programmateur ISP (en orange sur le schéma).  Nous avons donc dû improviser une solution. Nous avons coupé les pistes et relié par des fils les broches de l'ISP aux pins correspondantes. A cause de cette erreur nos LEDs D2 et D3 ne sont plus utilisables.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Atmega pin mosi.png|thumb|center|800x|Pins de l'atmega utilisés pour l'ISP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois ce problème réglé, nous avons pu passer à la suite, la gestion des moteurs. Pour ce faire il n'y a pas eu autant de problèmes que sur la partie microcontrôleur, nous avons simplement soudé le contrôleur de moteurs, un TB6612FNG, puis les broches sur lesquelles nous allons venir brancher les moteurs, et enfin les fils directement sur les broches des moteurs. Nous avons également utilisé du plastique thermo rétractable pour que les fils soient protégés et restent soudés aux moteurs durant toute la durée du projet. Les moteurs étant prêt à l'emploi, nous les avons testé pour savoir si tout était fonctionnelle. Une fois confirmé, nous avons pris des bouchons de bouteilles comme roues et mis des élastiques autour pour avoir de la traction lors de nos différents essais.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Moteur et roues.jpg|thumb|center|300px|Moteurs et roues]]&lt;br /&gt;
&lt;br /&gt;
Pour tester toute notre carte, nous avons crée un code sous le nom de helloworld.c qui rempli différente fonction, allumer ou faire clignoter les LEDs en fonction du déplacement de la voiture et, bien évidemment, déplacer la voiture. La voiture réagissant comme nous le souhaitons, nous décidons donc de passer à l'étape suivante, le fonctionnement sur batterie. Ce n'est pas la partie la plus compliquée, il suffit de brasé les broches permettant d'accueillir la batterie puis celles destinées au cavalier. Une fois le tout installé sur notre carte, nous la testons et tout fonctionne normalement. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture appui bouton.mp4|thumb|center|Voiture fonctionnant sur batterie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il nous reste encore un peu de temps, nous décidons de nous attaqués à la dernière partie, la recharge de la batterie. Comme pour la partie de fonctionnement sur batterie, il n'y a aucune partie de code, il suffit de soudé des composants en plus sur la carte pour que la nouvelle fonctionnalité soit active. Donc nous nous y sommes mis et encore une fois il n'y a aucun problème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture déchargée.mp4|thumb|left|500px|Voiture déchargée]]&lt;br /&gt;
[[Fichier:Voiture en charge.mp4|thumb|center|500px|Voiture en charge]]&lt;br /&gt;
[[Fichier:Voiture après recharge.mp4|thumb|left|500px|Voiture après recharge]]&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
Vous trouverez dans le lien [https://archives.plil.fr/rboursau/premier-systeme-embarque.git GIT] de notre projet, tous les fichiers de création de la carte se trouvent dans le dossier projet_voiture, le code envoyé pour tester la voiture dans le dossier cod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 erase&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 flash helloworld.hex&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 reset&lt;br /&gt;
&lt;br /&gt;
puis débranché et rebranché la voiture&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton HWB puis RESET, relaché RESET puis HWB pour que la voiture repasse en mode DFU bootloader&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton reset pour arreter le cycle de la voiture au milieu&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5612</id>
		<title>SE3Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5612"/>
		<updated>2024-06-11T14:27:24Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* GIT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet Groupe 5 : Voiture Programmable =&lt;br /&gt;
Cette page est consacrée à la présentation du projet SE3 réalisé par BOURSAULT Rémi &amp;amp; LECOMTE Antoine, qui est porté sur la création d'une voiture contrôlé par programmation.&lt;br /&gt;
&lt;br /&gt;
== Présentation : ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
Les objectifs du projets sont : &lt;br /&gt;
&lt;br /&gt;
* Concevoir une voiture fonctionnant sur batterie, avec un ATMega.&lt;br /&gt;
* Intégrer des clignotants fonctionnels.&lt;br /&gt;
* Permettre à la voiture d'avancer ou reculer, toujours en utilisant l'ATMega.&lt;br /&gt;
* Ajout d'un gyrophare.&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Pour atteindre ces différents objectifs, nous aurons besoins des ressources suivantes :&lt;br /&gt;
&lt;br /&gt;
* Un microcontrôleur ATMega16U4/ATMega32U4&lt;br /&gt;
* Des LEDS&lt;br /&gt;
* Deux moteurs à courant continu&lt;br /&gt;
* Un châssis &lt;br /&gt;
* Des dipôles classiques&lt;br /&gt;
* Un gyrophare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir choisi notre projet et nos différents objectifs pour ce projet, nous avons commencé à travailler sur le schéma de montage sur KiCAD afin de pouvoir ensuite faire le PCB et le routage qui sera envoyé à une usine pour imprimer nos cartes. Les fonctions et composants principaux de notre projet sont les suivants.&lt;br /&gt;
&lt;br /&gt;
== Fonction sur le schéma : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Microcontrôleur ===&lt;br /&gt;
La partie indispensable de tous montages électroniques, le cerveau de la voiture. Sans le microcontrôleur rien dans ce projet n'est possible, il permet de gérer les informations. qui sont transmises dans toutes la carte. C'est un microcontrôleur ATMega32u4, ce n'est pas le plus puissant, mais pour la taille du projet que nous faisons c'est bien assez. Il possède assez d'entrées/sorties pour ce que nous voulons en faire.[[Fichier:Microcontroleu.png||thumb|left|300px|Schéma du microcontrôleur]]&lt;br /&gt;
[[Fichier:Pin configuration atmega.png||thumb|center|300px|Configuration des pins sur l'atmega]]&lt;br /&gt;
&lt;br /&gt;
=== Commande Moteur ===&lt;br /&gt;
Ce bloc est celui qui actionne les moteurs et leur dit quand s'arrêter. Celui-ci est composé d'un TB6612FNG, un driver pour moteur qui ne sert qu'à ça. Il prend sept signaux en entrée trois pour gérer chaque moteur et un signal de standby. Nous avons utilisé la datasheet pour savoir comment le schématiser et quels composants utilisé pour que celui-ci fonctionne dans des conditions optimales. &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'ajouter ce composant, car les signaux de sortie délivrés par l'ATMega sont trop faibles pour alimenter un moteur. Ce driver vient, à partir d'une tension d'alimentation Vcc amplifier le signal de commande délivré par l'ATMega pour que les moteurs aient l'alimentation adéquate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datasheet TB6612.png||thumb|left|300px|PCB routé de la carte]]&lt;br /&gt;
[[Fichier:Commande Moteur.png||thumb|center|300px|Schéma du bloc de commande des moteurs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chargeur LI-PO ===&lt;br /&gt;
Comme notre voiture fonctionnera sur batterie, il faut un moyen de la recharger, ceci se faisant par l'intermédiaire d'un port USB, il faut un bloc pour adapter le courant que reçoit l'USB pour que cela corresponde aux caractéristiques de notre batterie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Chargeur lipo.png||thumb|center|300px|Schéma du chargeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la Batterie ===&lt;br /&gt;
Ce bloc permet de séparer l'alimentation en USB et sur batterie. Lorsqu'un cavalier est présent sur J6, VBAT est directement relié à Vcc et ainsi la batterie sert d'alimentation pour  la carte. Il est impératif de débrancher l'USB avant de mettre le cavalier, pour éviter tout court-circuit. Lorsqu'on enlève le cavalier, on peut brancher l'USB et la carte fonctionne en filaire.[[Fichier:Utilisation baterie.png||thumb|center|300px|Schéma du switch batterie]]&lt;br /&gt;
=== Connecteur USB ===&lt;br /&gt;
On dispose de deux connecteurs USB, un pour recharger la batterie, et un autre pour transmettre les données, qui servira à implanter un programme dans notre microcontrôleur.[[Fichier:Connecteur USBs.png||thumb|center|300px|Schéma des connecteur USB]]&lt;br /&gt;
=== Connecteur ISP ===&lt;br /&gt;
Pour charger le bootloader sur le microcontrôleur si besoin.[[Fichier:Connecteur ISP.png||thumb|center|300px|Schéma du connecteur ISP]]&lt;br /&gt;
=== Diodes Électroluminescentes ===&lt;br /&gt;
[[Fichier:LED voiture.png||thumb|center|300px|Schéma des LEDS]]&lt;br /&gt;
&lt;br /&gt;
== PCB et routage : ==&lt;br /&gt;
Après avoir fini toutes nos fonctions et le schéma, nous nous sommes attaqué au PCB de la carte, il nous a fallu quelque essais pour obtenir une disposition qui nous convienne et qui facilite le routage.[[Fichier:Vue3D.png||thumb|left|300px|Vue 3D de la carte]]&lt;br /&gt;
[[Fichier:PCB voiture.png||thumb|center|300px|PCB routé de la carte]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brasage des composants ==&lt;br /&gt;
Une fois les cartes reçues, nous nous sommes attaqués à la brasure des différents composants. Nous avons commencé par le microcontrôleur, le cristal et les résistances et capacités associées. Dès le départ nous avons eu des problèmes avec le brasage, des pattes soudées entre elles, le cristal mal posé. Mais notre plus gros problème a été l'allocation des pins du microcontrôleur. Nous ne le savions pas au moment de la création de notre PCB et nous n'y avons pas fait attention, mais des pins sont spécialement attribuées au MISO, MOSI et SOCKET. Pins que nous devons utilisés pour envoyer le bootloader sur la microcontrôleur via le programmateur ISP (en orange sur le schéma).  Nous avons donc dû improviser une solution. Nous avons coupé les pistes et relié par des fils les broches de l'ISP aux pins correspondantes. A cause de cette erreur nos LEDs D2 et D3 ne sont plus utilisables.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Atmega pin mosi.png|thumb|center|800x|Pins de l'atmega utilisés pour l'ISP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois ce problème réglé, nous avons pu passer à la suite, la gestion des moteurs. Pour ce faire il n'y a pas eu autant de problèmes que sur la partie microcontrôleur, nous avons simplement soudé le contrôleur de moteurs, un TB6612FNG, puis les broches sur lesquelles nous allons venir brancher les moteurs, et enfin les fils directement sur les broches des moteurs. Nous avons également utilisé du plastique thermo rétractable pour que les fils soient protégés et restent soudés aux moteurs durant toute la durée du projet. Les moteurs étant prêt à l'emploi, nous les avons testé pour savoir si tout était fonctionnelle. Une fois confirmé, nous avons pris des bouchons de bouteilles comme roues et mis des élastiques autour pour avoir de la traction lors de nos différents essais.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Moteur et roues.jpg|thumb|center|300px|Moteurs et roues]]&lt;br /&gt;
&lt;br /&gt;
Pour tester toute notre carte, nous avons crée un code sous le nom de helloworld.c qui rempli différente fonction, allumer ou faire clignoter les LEDs en fonction du déplacement de la voiture et, bien évidemment, déplacer la voiture. La voiture réagissant comme nous le souhaitons, nous décidons donc de passer à l'étape suivante, le fonctionnement sur batterie. Ce n'est pas la partie la plus compliquée, il suffit de brasé les broches permettant d'accueillir la batterie puis celles destinées au cavalier. Une fois le tout installé sur notre carte, nous la testons et tout fonctionne normalement. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture appui bouton.mp4|thumb|center|Voiture fonctionnant sur batterie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il nous reste encore un peu de temps, nous décidons de nous attaqués à la dernière partie, la recharge de la batterie. Comme pour la partie de fonctionnement sur batterie, il n'y a aucune partie de code, il suffit de soudé des composants en plus sur la carte pour que la nouvelle fonctionnalité soit active. Donc nous nous y sommes mis et encore une fois il n'y a aucun problème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture déchargée.mp4|thumb|left|Voiture déchargée]]&lt;br /&gt;
[[Fichier:Voiture en charge.mp4|thumb|center|Voiture en charge]]&lt;br /&gt;
[[Fichier:Voiture après recharge.mp4|thumb|left|Voiture après recharge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
Vous trouverez dans le lien [https://archives.plil.fr/rboursau/premier-systeme-embarque.git GIT] de notre projet, tous les fichiers de création de la carte se trouvent dans le dossier projet_voiture, le code envoyé pour tester la voiture dans le dossier cod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 erase&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 flash helloworld.hex&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 reset&lt;br /&gt;
&lt;br /&gt;
puis débranché et rebranché la voiture&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton HWB puis RESET, relaché RESET puis HWB pour que la voiture repasse en mode DFU bootloader&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton reset pour arreter le cycle de la voiture au milieu&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5611</id>
		<title>SE3Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5611"/>
		<updated>2024-06-11T14:27:14Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Brasage des composants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet Groupe 5 : Voiture Programmable =&lt;br /&gt;
Cette page est consacrée à la présentation du projet SE3 réalisé par BOURSAULT Rémi &amp;amp; LECOMTE Antoine, qui est porté sur la création d'une voiture contrôlé par programmation.&lt;br /&gt;
&lt;br /&gt;
== Présentation : ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
Les objectifs du projets sont : &lt;br /&gt;
&lt;br /&gt;
* Concevoir une voiture fonctionnant sur batterie, avec un ATMega.&lt;br /&gt;
* Intégrer des clignotants fonctionnels.&lt;br /&gt;
* Permettre à la voiture d'avancer ou reculer, toujours en utilisant l'ATMega.&lt;br /&gt;
* Ajout d'un gyrophare.&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Pour atteindre ces différents objectifs, nous aurons besoins des ressources suivantes :&lt;br /&gt;
&lt;br /&gt;
* Un microcontrôleur ATMega16U4/ATMega32U4&lt;br /&gt;
* Des LEDS&lt;br /&gt;
* Deux moteurs à courant continu&lt;br /&gt;
* Un châssis &lt;br /&gt;
* Des dipôles classiques&lt;br /&gt;
* Un gyrophare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir choisi notre projet et nos différents objectifs pour ce projet, nous avons commencé à travailler sur le schéma de montage sur KiCAD afin de pouvoir ensuite faire le PCB et le routage qui sera envoyé à une usine pour imprimer nos cartes. Les fonctions et composants principaux de notre projet sont les suivants.&lt;br /&gt;
&lt;br /&gt;
== Fonction sur le schéma : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Microcontrôleur ===&lt;br /&gt;
La partie indispensable de tous montages électroniques, le cerveau de la voiture. Sans le microcontrôleur rien dans ce projet n'est possible, il permet de gérer les informations. qui sont transmises dans toutes la carte. C'est un microcontrôleur ATMega32u4, ce n'est pas le plus puissant, mais pour la taille du projet que nous faisons c'est bien assez. Il possède assez d'entrées/sorties pour ce que nous voulons en faire.[[Fichier:Microcontroleu.png||thumb|left|300px|Schéma du microcontrôleur]]&lt;br /&gt;
[[Fichier:Pin configuration atmega.png||thumb|center|300px|Configuration des pins sur l'atmega]]&lt;br /&gt;
&lt;br /&gt;
=== Commande Moteur ===&lt;br /&gt;
Ce bloc est celui qui actionne les moteurs et leur dit quand s'arrêter. Celui-ci est composé d'un TB6612FNG, un driver pour moteur qui ne sert qu'à ça. Il prend sept signaux en entrée trois pour gérer chaque moteur et un signal de standby. Nous avons utilisé la datasheet pour savoir comment le schématiser et quels composants utilisé pour que celui-ci fonctionne dans des conditions optimales. &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'ajouter ce composant, car les signaux de sortie délivrés par l'ATMega sont trop faibles pour alimenter un moteur. Ce driver vient, à partir d'une tension d'alimentation Vcc amplifier le signal de commande délivré par l'ATMega pour que les moteurs aient l'alimentation adéquate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datasheet TB6612.png||thumb|left|300px|PCB routé de la carte]]&lt;br /&gt;
[[Fichier:Commande Moteur.png||thumb|center|300px|Schéma du bloc de commande des moteurs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chargeur LI-PO ===&lt;br /&gt;
Comme notre voiture fonctionnera sur batterie, il faut un moyen de la recharger, ceci se faisant par l'intermédiaire d'un port USB, il faut un bloc pour adapter le courant que reçoit l'USB pour que cela corresponde aux caractéristiques de notre batterie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Chargeur lipo.png||thumb|center|300px|Schéma du chargeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la Batterie ===&lt;br /&gt;
Ce bloc permet de séparer l'alimentation en USB et sur batterie. Lorsqu'un cavalier est présent sur J6, VBAT est directement relié à Vcc et ainsi la batterie sert d'alimentation pour  la carte. Il est impératif de débrancher l'USB avant de mettre le cavalier, pour éviter tout court-circuit. Lorsqu'on enlève le cavalier, on peut brancher l'USB et la carte fonctionne en filaire.[[Fichier:Utilisation baterie.png||thumb|center|300px|Schéma du switch batterie]]&lt;br /&gt;
=== Connecteur USB ===&lt;br /&gt;
On dispose de deux connecteurs USB, un pour recharger la batterie, et un autre pour transmettre les données, qui servira à implanter un programme dans notre microcontrôleur.[[Fichier:Connecteur USBs.png||thumb|center|300px|Schéma des connecteur USB]]&lt;br /&gt;
=== Connecteur ISP ===&lt;br /&gt;
Pour charger le bootloader sur le microcontrôleur si besoin.[[Fichier:Connecteur ISP.png||thumb|center|300px|Schéma du connecteur ISP]]&lt;br /&gt;
=== Diodes Électroluminescentes ===&lt;br /&gt;
[[Fichier:LED voiture.png||thumb|center|300px|Schéma des LEDS]]&lt;br /&gt;
&lt;br /&gt;
== PCB et routage : ==&lt;br /&gt;
Après avoir fini toutes nos fonctions et le schéma, nous nous sommes attaqué au PCB de la carte, il nous a fallu quelque essais pour obtenir une disposition qui nous convienne et qui facilite le routage.[[Fichier:Vue3D.png||thumb|left|300px|Vue 3D de la carte]]&lt;br /&gt;
[[Fichier:PCB voiture.png||thumb|center|300px|PCB routé de la carte]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brasage des composants ==&lt;br /&gt;
Une fois les cartes reçues, nous nous sommes attaqués à la brasure des différents composants. Nous avons commencé par le microcontrôleur, le cristal et les résistances et capacités associées. Dès le départ nous avons eu des problèmes avec le brasage, des pattes soudées entre elles, le cristal mal posé. Mais notre plus gros problème a été l'allocation des pins du microcontrôleur. Nous ne le savions pas au moment de la création de notre PCB et nous n'y avons pas fait attention, mais des pins sont spécialement attribuées au MISO, MOSI et SOCKET. Pins que nous devons utilisés pour envoyer le bootloader sur la microcontrôleur via le programmateur ISP (en orange sur le schéma).  Nous avons donc dû improviser une solution. Nous avons coupé les pistes et relié par des fils les broches de l'ISP aux pins correspondantes. A cause de cette erreur nos LEDs D2 et D3 ne sont plus utilisables.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Atmega pin mosi.png|thumb|center|800x|Pins de l'atmega utilisés pour l'ISP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois ce problème réglé, nous avons pu passer à la suite, la gestion des moteurs. Pour ce faire il n'y a pas eu autant de problèmes que sur la partie microcontrôleur, nous avons simplement soudé le contrôleur de moteurs, un TB6612FNG, puis les broches sur lesquelles nous allons venir brancher les moteurs, et enfin les fils directement sur les broches des moteurs. Nous avons également utilisé du plastique thermo rétractable pour que les fils soient protégés et restent soudés aux moteurs durant toute la durée du projet. Les moteurs étant prêt à l'emploi, nous les avons testé pour savoir si tout était fonctionnelle. Une fois confirmé, nous avons pris des bouchons de bouteilles comme roues et mis des élastiques autour pour avoir de la traction lors de nos différents essais.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Moteur et roues.jpg|thumb|center|300px|Moteurs et roues]]&lt;br /&gt;
&lt;br /&gt;
Pour tester toute notre carte, nous avons crée un code sous le nom de helloworld.c qui rempli différente fonction, allumer ou faire clignoter les LEDs en fonction du déplacement de la voiture et, bien évidemment, déplacer la voiture. La voiture réagissant comme nous le souhaitons, nous décidons donc de passer à l'étape suivante, le fonctionnement sur batterie. Ce n'est pas la partie la plus compliquée, il suffit de brasé les broches permettant d'accueillir la batterie puis celles destinées au cavalier. Une fois le tout installé sur notre carte, nous la testons et tout fonctionne normalement. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture appui bouton.mp4|thumb|center|Voiture fonctionnant sur batterie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il nous reste encore un peu de temps, nous décidons de nous attaqués à la dernière partie, la recharge de la batterie. Comme pour la partie de fonctionnement sur batterie, il n'y a aucune partie de code, il suffit de soudé des composants en plus sur la carte pour que la nouvelle fonctionnalité soit active. Donc nous nous y sommes mis et encore une fois il n'y a aucun problème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture déchargée.mp4|thumb|left|Voiture déchargée]]&lt;br /&gt;
[[Fichier:Voiture en charge.mp4|thumb|center|Voiture en charge]]&lt;br /&gt;
[[Fichier:Voiture après recharge.mp4|thumb|left|Voiture après recharge]]&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
Vous trouverez dans le lien [https://archives.plil.fr/rboursau/premier-systeme-embarque.git GIT] de notre projet, tous les fichiers de création de la carte se trouvent dans le dossier projet_voiture, le code envoyé pour tester la voiture dans le dossier cod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 erase&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 flash helloworld.hex&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 reset&lt;br /&gt;
&lt;br /&gt;
puis débranché et rebranché la voiture&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton HWB puis RESET, relaché RESET puis HWB pour que la voiture repasse en mode DFU bootloader&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton reset pour arreter le cycle de la voiture au milieu&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5610</id>
		<title>SE3Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5610"/>
		<updated>2024-06-11T14:22:22Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Brasage des composants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet Groupe 5 : Voiture Programmable =&lt;br /&gt;
Cette page est consacrée à la présentation du projet SE3 réalisé par BOURSAULT Rémi &amp;amp; LECOMTE Antoine, qui est porté sur la création d'une voiture contrôlé par programmation.&lt;br /&gt;
&lt;br /&gt;
== Présentation : ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
Les objectifs du projets sont : &lt;br /&gt;
&lt;br /&gt;
* Concevoir une voiture fonctionnant sur batterie, avec un ATMega.&lt;br /&gt;
* Intégrer des clignotants fonctionnels.&lt;br /&gt;
* Permettre à la voiture d'avancer ou reculer, toujours en utilisant l'ATMega.&lt;br /&gt;
* Ajout d'un gyrophare.&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Pour atteindre ces différents objectifs, nous aurons besoins des ressources suivantes :&lt;br /&gt;
&lt;br /&gt;
* Un microcontrôleur ATMega16U4/ATMega32U4&lt;br /&gt;
* Des LEDS&lt;br /&gt;
* Deux moteurs à courant continu&lt;br /&gt;
* Un châssis &lt;br /&gt;
* Des dipôles classiques&lt;br /&gt;
* Un gyrophare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir choisi notre projet et nos différents objectifs pour ce projet, nous avons commencé à travailler sur le schéma de montage sur KiCAD afin de pouvoir ensuite faire le PCB et le routage qui sera envoyé à une usine pour imprimer nos cartes. Les fonctions et composants principaux de notre projet sont les suivants.&lt;br /&gt;
&lt;br /&gt;
== Fonction sur le schéma : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Microcontrôleur ===&lt;br /&gt;
La partie indispensable de tous montages électroniques, le cerveau de la voiture. Sans le microcontrôleur rien dans ce projet n'est possible, il permet de gérer les informations. qui sont transmises dans toutes la carte. C'est un microcontrôleur ATMega32u4, ce n'est pas le plus puissant, mais pour la taille du projet que nous faisons c'est bien assez. Il possède assez d'entrées/sorties pour ce que nous voulons en faire.[[Fichier:Microcontroleu.png||thumb|left|300px|Schéma du microcontrôleur]]&lt;br /&gt;
[[Fichier:Pin configuration atmega.png||thumb|center|300px|Configuration des pins sur l'atmega]]&lt;br /&gt;
&lt;br /&gt;
=== Commande Moteur ===&lt;br /&gt;
Ce bloc est celui qui actionne les moteurs et leur dit quand s'arrêter. Celui-ci est composé d'un TB6612FNG, un driver pour moteur qui ne sert qu'à ça. Il prend sept signaux en entrée trois pour gérer chaque moteur et un signal de standby. Nous avons utilisé la datasheet pour savoir comment le schématiser et quels composants utilisé pour que celui-ci fonctionne dans des conditions optimales. &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'ajouter ce composant, car les signaux de sortie délivrés par l'ATMega sont trop faibles pour alimenter un moteur. Ce driver vient, à partir d'une tension d'alimentation Vcc amplifier le signal de commande délivré par l'ATMega pour que les moteurs aient l'alimentation adéquate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datasheet TB6612.png||thumb|left|300px|PCB routé de la carte]]&lt;br /&gt;
[[Fichier:Commande Moteur.png||thumb|center|300px|Schéma du bloc de commande des moteurs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chargeur LI-PO ===&lt;br /&gt;
Comme notre voiture fonctionnera sur batterie, il faut un moyen de la recharger, ceci se faisant par l'intermédiaire d'un port USB, il faut un bloc pour adapter le courant que reçoit l'USB pour que cela corresponde aux caractéristiques de notre batterie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Chargeur lipo.png||thumb|center|300px|Schéma du chargeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la Batterie ===&lt;br /&gt;
Ce bloc permet de séparer l'alimentation en USB et sur batterie. Lorsqu'un cavalier est présent sur J6, VBAT est directement relié à Vcc et ainsi la batterie sert d'alimentation pour  la carte. Il est impératif de débrancher l'USB avant de mettre le cavalier, pour éviter tout court-circuit. Lorsqu'on enlève le cavalier, on peut brancher l'USB et la carte fonctionne en filaire.[[Fichier:Utilisation baterie.png||thumb|center|300px|Schéma du switch batterie]]&lt;br /&gt;
=== Connecteur USB ===&lt;br /&gt;
On dispose de deux connecteurs USB, un pour recharger la batterie, et un autre pour transmettre les données, qui servira à implanter un programme dans notre microcontrôleur.[[Fichier:Connecteur USBs.png||thumb|center|300px|Schéma des connecteur USB]]&lt;br /&gt;
=== Connecteur ISP ===&lt;br /&gt;
Pour charger le bootloader sur le microcontrôleur si besoin.[[Fichier:Connecteur ISP.png||thumb|center|300px|Schéma du connecteur ISP]]&lt;br /&gt;
=== Diodes Électroluminescentes ===&lt;br /&gt;
[[Fichier:LED voiture.png||thumb|center|300px|Schéma des LEDS]]&lt;br /&gt;
&lt;br /&gt;
== PCB et routage : ==&lt;br /&gt;
Après avoir fini toutes nos fonctions et le schéma, nous nous sommes attaqué au PCB de la carte, il nous a fallu quelque essais pour obtenir une disposition qui nous convienne et qui facilite le routage.[[Fichier:Vue3D.png||thumb|left|300px|Vue 3D de la carte]]&lt;br /&gt;
[[Fichier:PCB voiture.png||thumb|center|300px|PCB routé de la carte]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brasage des composants ==&lt;br /&gt;
Une fois les cartes reçues, nous nous sommes attaqués à la brasure des différents composants. Nous avons commencé par le microcontrôleur, le cristal et les résistances et capacités associées. Dès le départ nous avons eu des problèmes avec le brasage, des pattes soudées entre elles, le cristal mal posé. Mais notre plus gros problème a été l'allocation des pins du microcontrôleur. Nous ne le savions pas au moment de la création de notre PCB et nous n'y avons pas fait attention, mais des pins sont spécialement attribuées au MISO, MOSI et SOCKET. Pins que nous devons utilisés pour envoyer le bootloader sur la microcontrôleur via le programmateur ISP (en orange sur le schéma).  Nous avons donc dû improviser une solution. Nous avons coupé les pistes et relié par des fils les broches de l'ISP aux pins correspondantes. A cause de cette erreur nos LEDs D2 et D3 ne sont plus utilisables.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Atmega pin mosi.png|thumb|center|800x|Pins de l'atmega utilisés pour l'ISP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois ce problème réglé, nous avons pu passer à la suite, la gestion des moteurs. Pour ce faire il n'y a pas eu autant de problèmes que sur la partie microcontrôleur, nous avons simplement soudé le contrôleur de moteurs, un TB6612FNG, puis les broches sur lesquelles nous allons venir brancher les moteurs, et enfin les fils directement sur les broches des moteurs. Nous avons également utilisé du plastique thermo rétractable pour que les fils soient protégés et restent soudés aux moteurs durant toute la durée du projet. Les moteurs étant prêt à l'emploi, nous les avons testé pour savoir si tout était fonctionnelle. Une fois confirmé, nous avons pris des bouchons de bouteilles comme roues et mis des élastiques autour pour avoir de la traction lors de nos différents essais.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Moteur et roues.jpg|thumb|center|300px|Moteurs et roues]]&lt;br /&gt;
&lt;br /&gt;
Pour tester toute notre carte, nous avons crée un code sous le nom de helloworld.c qui rempli différente fonction, allumer ou faire clignoter les LEDs en fonction du déplacement de la voiture et, bien évidemment, déplacer la voiture. La voiture réagissant comme nous le souhaitons, nous décidons donc de passer à l'étape suivante, le fonctionnement sur batterie. Ce n'est pas la partie la plus compliquée, il suffit de brasé les broches permettant d'accueillir la batterie puis celles destinées au cavalier. Une fois le tout installé sur notre carte, nous la testons et tout fonctionne normalement. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture appui bouton.mp4|thumb|center|Voiture fonctionnant sur batterie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il nous reste encore un peu de temps, nous décidons de nous attaqués à la dernière partie, la recharge de la batterie. Comme pour la partie de fonctionnement sur batterie, il n'y a aucune partie de code, il suffit de soudé des composants en plus sur la carte pour que la nouvelle fonctionnalité soit active. Donc nous nous y sommes mis et encore une fois il n'y a aucun problème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture déchargée.mp4|thumb|left|200px|Voiture déchargée]]&lt;br /&gt;
[[Fichier:Voiture en charge.mp4|thumb|center|200px|Voiture en charge]]&lt;br /&gt;
[[Fichier:Voiture après recharge.mp4|thumb|right|200px|Voiture après recharge]]&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
Vous trouverez dans le lien [https://archives.plil.fr/rboursau/premier-systeme-embarque.git GIT] de notre projet, tous les fichiers de création de la carte se trouvent dans le dossier projet_voiture, le code envoyé pour tester la voiture dans le dossier cod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 erase&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 flash helloworld.hex&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 reset&lt;br /&gt;
&lt;br /&gt;
puis débranché et rebranché la voiture&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton HWB puis RESET, relaché RESET puis HWB pour que la voiture repasse en mode DFU bootloader&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton reset pour arreter le cycle de la voiture au milieu&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5609</id>
		<title>SE3Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5609"/>
		<updated>2024-06-11T14:21:31Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* GIT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet Groupe 5 : Voiture Programmable =&lt;br /&gt;
Cette page est consacrée à la présentation du projet SE3 réalisé par BOURSAULT Rémi &amp;amp; LECOMTE Antoine, qui est porté sur la création d'une voiture contrôlé par programmation.&lt;br /&gt;
&lt;br /&gt;
== Présentation : ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
Les objectifs du projets sont : &lt;br /&gt;
&lt;br /&gt;
* Concevoir une voiture fonctionnant sur batterie, avec un ATMega.&lt;br /&gt;
* Intégrer des clignotants fonctionnels.&lt;br /&gt;
* Permettre à la voiture d'avancer ou reculer, toujours en utilisant l'ATMega.&lt;br /&gt;
* Ajout d'un gyrophare.&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Pour atteindre ces différents objectifs, nous aurons besoins des ressources suivantes :&lt;br /&gt;
&lt;br /&gt;
* Un microcontrôleur ATMega16U4/ATMega32U4&lt;br /&gt;
* Des LEDS&lt;br /&gt;
* Deux moteurs à courant continu&lt;br /&gt;
* Un châssis &lt;br /&gt;
* Des dipôles classiques&lt;br /&gt;
* Un gyrophare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir choisi notre projet et nos différents objectifs pour ce projet, nous avons commencé à travailler sur le schéma de montage sur KiCAD afin de pouvoir ensuite faire le PCB et le routage qui sera envoyé à une usine pour imprimer nos cartes. Les fonctions et composants principaux de notre projet sont les suivants.&lt;br /&gt;
&lt;br /&gt;
== Fonction sur le schéma : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Microcontrôleur ===&lt;br /&gt;
La partie indispensable de tous montages électroniques, le cerveau de la voiture. Sans le microcontrôleur rien dans ce projet n'est possible, il permet de gérer les informations. qui sont transmises dans toutes la carte. C'est un microcontrôleur ATMega32u4, ce n'est pas le plus puissant, mais pour la taille du projet que nous faisons c'est bien assez. Il possède assez d'entrées/sorties pour ce que nous voulons en faire.[[Fichier:Microcontroleu.png||thumb|left|300px|Schéma du microcontrôleur]]&lt;br /&gt;
[[Fichier:Pin configuration atmega.png||thumb|center|300px|Configuration des pins sur l'atmega]]&lt;br /&gt;
&lt;br /&gt;
=== Commande Moteur ===&lt;br /&gt;
Ce bloc est celui qui actionne les moteurs et leur dit quand s'arrêter. Celui-ci est composé d'un TB6612FNG, un driver pour moteur qui ne sert qu'à ça. Il prend sept signaux en entrée trois pour gérer chaque moteur et un signal de standby. Nous avons utilisé la datasheet pour savoir comment le schématiser et quels composants utilisé pour que celui-ci fonctionne dans des conditions optimales. &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'ajouter ce composant, car les signaux de sortie délivrés par l'ATMega sont trop faibles pour alimenter un moteur. Ce driver vient, à partir d'une tension d'alimentation Vcc amplifier le signal de commande délivré par l'ATMega pour que les moteurs aient l'alimentation adéquate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datasheet TB6612.png||thumb|left|300px|PCB routé de la carte]]&lt;br /&gt;
[[Fichier:Commande Moteur.png||thumb|center|300px|Schéma du bloc de commande des moteurs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chargeur LI-PO ===&lt;br /&gt;
Comme notre voiture fonctionnera sur batterie, il faut un moyen de la recharger, ceci se faisant par l'intermédiaire d'un port USB, il faut un bloc pour adapter le courant que reçoit l'USB pour que cela corresponde aux caractéristiques de notre batterie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Chargeur lipo.png||thumb|center|300px|Schéma du chargeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la Batterie ===&lt;br /&gt;
Ce bloc permet de séparer l'alimentation en USB et sur batterie. Lorsqu'un cavalier est présent sur J6, VBAT est directement relié à Vcc et ainsi la batterie sert d'alimentation pour  la carte. Il est impératif de débrancher l'USB avant de mettre le cavalier, pour éviter tout court-circuit. Lorsqu'on enlève le cavalier, on peut brancher l'USB et la carte fonctionne en filaire.[[Fichier:Utilisation baterie.png||thumb|center|300px|Schéma du switch batterie]]&lt;br /&gt;
=== Connecteur USB ===&lt;br /&gt;
On dispose de deux connecteurs USB, un pour recharger la batterie, et un autre pour transmettre les données, qui servira à implanter un programme dans notre microcontrôleur.[[Fichier:Connecteur USBs.png||thumb|center|300px|Schéma des connecteur USB]]&lt;br /&gt;
=== Connecteur ISP ===&lt;br /&gt;
Pour charger le bootloader sur le microcontrôleur si besoin.[[Fichier:Connecteur ISP.png||thumb|center|300px|Schéma du connecteur ISP]]&lt;br /&gt;
=== Diodes Électroluminescentes ===&lt;br /&gt;
[[Fichier:LED voiture.png||thumb|center|300px|Schéma des LEDS]]&lt;br /&gt;
&lt;br /&gt;
== PCB et routage : ==&lt;br /&gt;
Après avoir fini toutes nos fonctions et le schéma, nous nous sommes attaqué au PCB de la carte, il nous a fallu quelque essais pour obtenir une disposition qui nous convienne et qui facilite le routage.[[Fichier:Vue3D.png||thumb|left|300px|Vue 3D de la carte]]&lt;br /&gt;
[[Fichier:PCB voiture.png||thumb|center|300px|PCB routé de la carte]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brasage des composants ==&lt;br /&gt;
Une fois les cartes reçues, nous nous sommes attaqués à la brasure des différents composants. Nous avons commencé par le microcontrôleur, le cristal et les résistances et capacités associées. Dès le départ nous avons eu des problèmes avec le brasage, des pattes soudées entre elles, le cristal mal posé. Mais notre plus gros problème a été l'allocation des pins du microcontrôleur. Nous ne le savions pas au moment de la création de notre PCB et nous n'y avons pas fait attention, mais des pins sont spécialement attribuées au MISO, MOSI et SOCKET. Pins que nous devons utilisés pour envoyer le bootloader sur la microcontrôleur via le programmateur ISP (en orange sur le schéma).  Nous avons donc dû improviser une solution. Nous avons coupé les pistes et relié par des fils les broches de l'ISP aux pins correspondantes. A cause de cette erreur nos LEDs D2 et D3 ne sont plus utilisables.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Atmega pin mosi.png|thumb|center|800x|Pins de l'atmega utilisés pour l'ISP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois ce problème réglé, nous avons pu passer à la suite, la gestion des moteurs. Pour ce faire il n'y a pas eu autant de problèmes que sur la partie microcontrôleur, nous avons simplement soudé le contrôleur de moteurs, un TB6612FNG, puis les broches sur lesquelles nous allons venir brancher les moteurs, et enfin les fils directement sur les broches des moteurs. Nous avons également utilisé du plastique thermo rétractable pour que les fils soient protégés et restent soudés aux moteurs durant toute la durée du projet. Les moteurs étant prêt à l'emploi, nous les avons testé pour savoir si tout était fonctionnelle. Une fois confirmé, nous avons pris des bouchons de bouteilles comme roues et mis des élastiques autour pour avoir de la traction lors de nos différents essais.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Moteur et roues.jpg|thumb|center|300px|Moteurs et roues]]&lt;br /&gt;
&lt;br /&gt;
Pour tester toute notre carte, nous avons crée un code sous le nom de helloworld.c qui rempli différente fonction, allumer ou faire clignoter les LEDs en fonction du déplacement de la voiture et, bien évidemment, déplacer la voiture. La voiture réagissant comme nous le souhaitons, nous décidons donc de passer à l'étape suivante, le fonctionnement sur batterie. Ce n'est pas la partie la plus compliquée, il suffit de brasé les broches permettant d'accueillir la batterie puis celles destinées au cavalier. Une fois le tout installé sur notre carte, nous la testons et tout fonctionne normalement. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture appui bouton.mp4|thumb|center|Voiture fonctionnant sur batterie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il nous reste encore un peu de temps, nous décidons de nous attaqués à la dernière partie, la recharge de la batterie. Comme pour la partie de fonctionnement sur batterie, il n'y a aucune partie de code, il suffit de soudé des composants en plus sur la carte pour que la nouvelle fonctionnalité soit active. Donc nous nous y sommes mis et encore une fois il n'y a aucun problème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture déchargée.mp4|thumb|left|Voiture déchargée]]&lt;br /&gt;
[[Fichier:Voiture en charge.mp4|thumb|center|Voiture en charge]]&lt;br /&gt;
[[Fichier:Voiture après recharge.mp4|thumb|right|Voiture après recharge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
Vous trouverez dans le lien [https://archives.plil.fr/rboursau/premier-systeme-embarque.git GIT] de notre projet, tous les fichiers de création de la carte se trouvent dans le dossier projet_voiture, le code envoyé pour tester la voiture dans le dossier cod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 erase&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 flash helloworld.hex&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 reset&lt;br /&gt;
&lt;br /&gt;
puis débranché et rebranché la voiture&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton HWB puis RESET, relaché RESET puis HWB pour que la voiture repasse en mode DFU bootloader&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton reset pour arreter le cycle de la voiture au milieu&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5608</id>
		<title>SE3Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5608"/>
		<updated>2024-06-11T14:21:21Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Brasage des composants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet Groupe 5 : Voiture Programmable =&lt;br /&gt;
Cette page est consacrée à la présentation du projet SE3 réalisé par BOURSAULT Rémi &amp;amp; LECOMTE Antoine, qui est porté sur la création d'une voiture contrôlé par programmation.&lt;br /&gt;
&lt;br /&gt;
== Présentation : ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
Les objectifs du projets sont : &lt;br /&gt;
&lt;br /&gt;
* Concevoir une voiture fonctionnant sur batterie, avec un ATMega.&lt;br /&gt;
* Intégrer des clignotants fonctionnels.&lt;br /&gt;
* Permettre à la voiture d'avancer ou reculer, toujours en utilisant l'ATMega.&lt;br /&gt;
* Ajout d'un gyrophare.&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Pour atteindre ces différents objectifs, nous aurons besoins des ressources suivantes :&lt;br /&gt;
&lt;br /&gt;
* Un microcontrôleur ATMega16U4/ATMega32U4&lt;br /&gt;
* Des LEDS&lt;br /&gt;
* Deux moteurs à courant continu&lt;br /&gt;
* Un châssis &lt;br /&gt;
* Des dipôles classiques&lt;br /&gt;
* Un gyrophare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir choisi notre projet et nos différents objectifs pour ce projet, nous avons commencé à travailler sur le schéma de montage sur KiCAD afin de pouvoir ensuite faire le PCB et le routage qui sera envoyé à une usine pour imprimer nos cartes. Les fonctions et composants principaux de notre projet sont les suivants.&lt;br /&gt;
&lt;br /&gt;
== Fonction sur le schéma : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Microcontrôleur ===&lt;br /&gt;
La partie indispensable de tous montages électroniques, le cerveau de la voiture. Sans le microcontrôleur rien dans ce projet n'est possible, il permet de gérer les informations. qui sont transmises dans toutes la carte. C'est un microcontrôleur ATMega32u4, ce n'est pas le plus puissant, mais pour la taille du projet que nous faisons c'est bien assez. Il possède assez d'entrées/sorties pour ce que nous voulons en faire.[[Fichier:Microcontroleu.png||thumb|left|300px|Schéma du microcontrôleur]]&lt;br /&gt;
[[Fichier:Pin configuration atmega.png||thumb|center|300px|Configuration des pins sur l'atmega]]&lt;br /&gt;
&lt;br /&gt;
=== Commande Moteur ===&lt;br /&gt;
Ce bloc est celui qui actionne les moteurs et leur dit quand s'arrêter. Celui-ci est composé d'un TB6612FNG, un driver pour moteur qui ne sert qu'à ça. Il prend sept signaux en entrée trois pour gérer chaque moteur et un signal de standby. Nous avons utilisé la datasheet pour savoir comment le schématiser et quels composants utilisé pour que celui-ci fonctionne dans des conditions optimales. &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'ajouter ce composant, car les signaux de sortie délivrés par l'ATMega sont trop faibles pour alimenter un moteur. Ce driver vient, à partir d'une tension d'alimentation Vcc amplifier le signal de commande délivré par l'ATMega pour que les moteurs aient l'alimentation adéquate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datasheet TB6612.png||thumb|left|300px|PCB routé de la carte]]&lt;br /&gt;
[[Fichier:Commande Moteur.png||thumb|center|300px|Schéma du bloc de commande des moteurs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chargeur LI-PO ===&lt;br /&gt;
Comme notre voiture fonctionnera sur batterie, il faut un moyen de la recharger, ceci se faisant par l'intermédiaire d'un port USB, il faut un bloc pour adapter le courant que reçoit l'USB pour que cela corresponde aux caractéristiques de notre batterie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Chargeur lipo.png||thumb|center|300px|Schéma du chargeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la Batterie ===&lt;br /&gt;
Ce bloc permet de séparer l'alimentation en USB et sur batterie. Lorsqu'un cavalier est présent sur J6, VBAT est directement relié à Vcc et ainsi la batterie sert d'alimentation pour  la carte. Il est impératif de débrancher l'USB avant de mettre le cavalier, pour éviter tout court-circuit. Lorsqu'on enlève le cavalier, on peut brancher l'USB et la carte fonctionne en filaire.[[Fichier:Utilisation baterie.png||thumb|center|300px|Schéma du switch batterie]]&lt;br /&gt;
=== Connecteur USB ===&lt;br /&gt;
On dispose de deux connecteurs USB, un pour recharger la batterie, et un autre pour transmettre les données, qui servira à implanter un programme dans notre microcontrôleur.[[Fichier:Connecteur USBs.png||thumb|center|300px|Schéma des connecteur USB]]&lt;br /&gt;
=== Connecteur ISP ===&lt;br /&gt;
Pour charger le bootloader sur le microcontrôleur si besoin.[[Fichier:Connecteur ISP.png||thumb|center|300px|Schéma du connecteur ISP]]&lt;br /&gt;
=== Diodes Électroluminescentes ===&lt;br /&gt;
[[Fichier:LED voiture.png||thumb|center|300px|Schéma des LEDS]]&lt;br /&gt;
&lt;br /&gt;
== PCB et routage : ==&lt;br /&gt;
Après avoir fini toutes nos fonctions et le schéma, nous nous sommes attaqué au PCB de la carte, il nous a fallu quelque essais pour obtenir une disposition qui nous convienne et qui facilite le routage.[[Fichier:Vue3D.png||thumb|left|300px|Vue 3D de la carte]]&lt;br /&gt;
[[Fichier:PCB voiture.png||thumb|center|300px|PCB routé de la carte]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brasage des composants ==&lt;br /&gt;
Une fois les cartes reçues, nous nous sommes attaqués à la brasure des différents composants. Nous avons commencé par le microcontrôleur, le cristal et les résistances et capacités associées. Dès le départ nous avons eu des problèmes avec le brasage, des pattes soudées entre elles, le cristal mal posé. Mais notre plus gros problème a été l'allocation des pins du microcontrôleur. Nous ne le savions pas au moment de la création de notre PCB et nous n'y avons pas fait attention, mais des pins sont spécialement attribuées au MISO, MOSI et SOCKET. Pins que nous devons utilisés pour envoyer le bootloader sur la microcontrôleur via le programmateur ISP (en orange sur le schéma).  Nous avons donc dû improviser une solution. Nous avons coupé les pistes et relié par des fils les broches de l'ISP aux pins correspondantes. A cause de cette erreur nos LEDs D2 et D3 ne sont plus utilisables.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Atmega pin mosi.png|thumb|center|800x|Pins de l'atmega utilisés pour l'ISP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois ce problème réglé, nous avons pu passer à la suite, la gestion des moteurs. Pour ce faire il n'y a pas eu autant de problèmes que sur la partie microcontrôleur, nous avons simplement soudé le contrôleur de moteurs, un TB6612FNG, puis les broches sur lesquelles nous allons venir brancher les moteurs, et enfin les fils directement sur les broches des moteurs. Nous avons également utilisé du plastique thermo rétractable pour que les fils soient protégés et restent soudés aux moteurs durant toute la durée du projet. Les moteurs étant prêt à l'emploi, nous les avons testé pour savoir si tout était fonctionnelle. Une fois confirmé, nous avons pris des bouchons de bouteilles comme roues et mis des élastiques autour pour avoir de la traction lors de nos différents essais.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Moteur et roues.jpg|thumb|center|300px|Moteurs et roues]]&lt;br /&gt;
&lt;br /&gt;
Pour tester toute notre carte, nous avons crée un code sous le nom de helloworld.c qui rempli différente fonction, allumer ou faire clignoter les LEDs en fonction du déplacement de la voiture et, bien évidemment, déplacer la voiture. La voiture réagissant comme nous le souhaitons, nous décidons donc de passer à l'étape suivante, le fonctionnement sur batterie. Ce n'est pas la partie la plus compliquée, il suffit de brasé les broches permettant d'accueillir la batterie puis celles destinées au cavalier. Une fois le tout installé sur notre carte, nous la testons et tout fonctionne normalement. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture appui bouton.mp4|thumb|center|Voiture fonctionnant sur batterie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il nous reste encore un peu de temps, nous décidons de nous attaqués à la dernière partie, la recharge de la batterie. Comme pour la partie de fonctionnement sur batterie, il n'y a aucune partie de code, il suffit de soudé des composants en plus sur la carte pour que la nouvelle fonctionnalité soit active. Donc nous nous y sommes mis et encore une fois il n'y a aucun problème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture déchargée.mp4|thumb|left|Voiture déchargée]]&lt;br /&gt;
[[Fichier:Voiture en charge.mp4|thumb|center|Voiture en charge]]&lt;br /&gt;
[[Fichier:Voiture après recharge.mp4|thumb|right|Voiture après recharge]]&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
Vous trouverez dans le lien [https://archives.plil.fr/rboursau/premier-systeme-embarque.git GIT] de notre projet, tous les fichiers de création de la carte se trouvent dans le dossier projet_voiture, le code envoyé pour tester la voiture dans le dossier cod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 erase&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 flash helloworld.hex&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 reset&lt;br /&gt;
&lt;br /&gt;
puis débranché et rebranché la voiture&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton HWB puis RESET, relaché RESET puis HWB pour que la voiture repasse en mode DFU bootloader&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton reset pour arreter le cycle de la voiture au milieu&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5607</id>
		<title>SE3Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5607"/>
		<updated>2024-06-11T14:20:34Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Brasage des composants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet Groupe 5 : Voiture Programmable =&lt;br /&gt;
Cette page est consacrée à la présentation du projet SE3 réalisé par BOURSAULT Rémi &amp;amp; LECOMTE Antoine, qui est porté sur la création d'une voiture contrôlé par programmation.&lt;br /&gt;
&lt;br /&gt;
== Présentation : ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
Les objectifs du projets sont : &lt;br /&gt;
&lt;br /&gt;
* Concevoir une voiture fonctionnant sur batterie, avec un ATMega.&lt;br /&gt;
* Intégrer des clignotants fonctionnels.&lt;br /&gt;
* Permettre à la voiture d'avancer ou reculer, toujours en utilisant l'ATMega.&lt;br /&gt;
* Ajout d'un gyrophare.&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Pour atteindre ces différents objectifs, nous aurons besoins des ressources suivantes :&lt;br /&gt;
&lt;br /&gt;
* Un microcontrôleur ATMega16U4/ATMega32U4&lt;br /&gt;
* Des LEDS&lt;br /&gt;
* Deux moteurs à courant continu&lt;br /&gt;
* Un châssis &lt;br /&gt;
* Des dipôles classiques&lt;br /&gt;
* Un gyrophare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir choisi notre projet et nos différents objectifs pour ce projet, nous avons commencé à travailler sur le schéma de montage sur KiCAD afin de pouvoir ensuite faire le PCB et le routage qui sera envoyé à une usine pour imprimer nos cartes. Les fonctions et composants principaux de notre projet sont les suivants.&lt;br /&gt;
&lt;br /&gt;
== Fonction sur le schéma : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Microcontrôleur ===&lt;br /&gt;
La partie indispensable de tous montages électroniques, le cerveau de la voiture. Sans le microcontrôleur rien dans ce projet n'est possible, il permet de gérer les informations. qui sont transmises dans toutes la carte. C'est un microcontrôleur ATMega32u4, ce n'est pas le plus puissant, mais pour la taille du projet que nous faisons c'est bien assez. Il possède assez d'entrées/sorties pour ce que nous voulons en faire.[[Fichier:Microcontroleu.png||thumb|left|300px|Schéma du microcontrôleur]]&lt;br /&gt;
[[Fichier:Pin configuration atmega.png||thumb|center|300px|Configuration des pins sur l'atmega]]&lt;br /&gt;
&lt;br /&gt;
=== Commande Moteur ===&lt;br /&gt;
Ce bloc est celui qui actionne les moteurs et leur dit quand s'arrêter. Celui-ci est composé d'un TB6612FNG, un driver pour moteur qui ne sert qu'à ça. Il prend sept signaux en entrée trois pour gérer chaque moteur et un signal de standby. Nous avons utilisé la datasheet pour savoir comment le schématiser et quels composants utilisé pour que celui-ci fonctionne dans des conditions optimales. &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'ajouter ce composant, car les signaux de sortie délivrés par l'ATMega sont trop faibles pour alimenter un moteur. Ce driver vient, à partir d'une tension d'alimentation Vcc amplifier le signal de commande délivré par l'ATMega pour que les moteurs aient l'alimentation adéquate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datasheet TB6612.png||thumb|left|300px|PCB routé de la carte]]&lt;br /&gt;
[[Fichier:Commande Moteur.png||thumb|center|300px|Schéma du bloc de commande des moteurs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chargeur LI-PO ===&lt;br /&gt;
Comme notre voiture fonctionnera sur batterie, il faut un moyen de la recharger, ceci se faisant par l'intermédiaire d'un port USB, il faut un bloc pour adapter le courant que reçoit l'USB pour que cela corresponde aux caractéristiques de notre batterie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Chargeur lipo.png||thumb|center|300px|Schéma du chargeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la Batterie ===&lt;br /&gt;
Ce bloc permet de séparer l'alimentation en USB et sur batterie. Lorsqu'un cavalier est présent sur J6, VBAT est directement relié à Vcc et ainsi la batterie sert d'alimentation pour  la carte. Il est impératif de débrancher l'USB avant de mettre le cavalier, pour éviter tout court-circuit. Lorsqu'on enlève le cavalier, on peut brancher l'USB et la carte fonctionne en filaire.[[Fichier:Utilisation baterie.png||thumb|center|300px|Schéma du switch batterie]]&lt;br /&gt;
=== Connecteur USB ===&lt;br /&gt;
On dispose de deux connecteurs USB, un pour recharger la batterie, et un autre pour transmettre les données, qui servira à implanter un programme dans notre microcontrôleur.[[Fichier:Connecteur USBs.png||thumb|center|300px|Schéma des connecteur USB]]&lt;br /&gt;
=== Connecteur ISP ===&lt;br /&gt;
Pour charger le bootloader sur le microcontrôleur si besoin.[[Fichier:Connecteur ISP.png||thumb|center|300px|Schéma du connecteur ISP]]&lt;br /&gt;
=== Diodes Électroluminescentes ===&lt;br /&gt;
[[Fichier:LED voiture.png||thumb|center|300px|Schéma des LEDS]]&lt;br /&gt;
&lt;br /&gt;
== PCB et routage : ==&lt;br /&gt;
Après avoir fini toutes nos fonctions et le schéma, nous nous sommes attaqué au PCB de la carte, il nous a fallu quelque essais pour obtenir une disposition qui nous convienne et qui facilite le routage.[[Fichier:Vue3D.png||thumb|left|300px|Vue 3D de la carte]]&lt;br /&gt;
[[Fichier:PCB voiture.png||thumb|center|300px|PCB routé de la carte]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brasage des composants ==&lt;br /&gt;
Une fois les cartes reçues, nous nous sommes attaqués à la brasure des différents composants. Nous avons commencé par le microcontrôleur, le cristal et les résistances et capacités associées. Dès le départ nous avons eu des problèmes avec le brasage, des pattes soudées entre elles, le cristal mal posé. Mais notre plus gros problème a été l'allocation des pins du microcontrôleur. Nous ne le savions pas au moment de la création de notre PCB et nous n'y avons pas fait attention, mais des pins sont spécialement attribuées au MISO, MOSI et SOCKET. Pins que nous devons utilisés pour envoyer le bootloader sur la microcontrôleur via le programmateur ISP (en orange sur le schéma).  Nous avons donc dû improviser une solution. Nous avons coupé les pistes et relié par des fils les broches de l'ISP aux pins correspondantes. A cause de cette erreur nos LEDs D2 et D3 ne sont plus utilisables.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Atmega pin mosi.png|thumb|center|800x|Pins de l'atmega utilisés pour l'ISP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois ce problème réglé, nous avons pu passer à la suite, la gestion des moteurs. Pour ce faire il n'y a pas eu autant de problèmes que sur la partie microcontrôleur, nous avons simplement soudé le contrôleur de moteurs, un TB6612FNG, puis les broches sur lesquelles nous allons venir brancher les moteurs, et enfin les fils directement sur les broches des moteurs. Nous avons également utilisé du plastique thermo rétractable pour que les fils soient protégés et restent soudés aux moteurs durant toute la durée du projet. Les moteurs étant prêt à l'emploi, nous les avons testé pour savoir si tout était fonctionnelle. Une fois confirmé, nous avons pris des bouchons de bouteilles comme roues et mis des élastiques autour pour avoir de la traction lors de nos différents essais.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Moteur et roues.jpg|thumb|center|300px|Moteurs et roues]]&lt;br /&gt;
&lt;br /&gt;
Pour tester toute notre carte, nous avons crée un code sous le nom de helloworld.c qui rempli différente fonction, allumer ou faire clignoter les LEDs en fonction du déplacement de la voiture et, bien évidemment, déplacer la voiture. La voiture réagissant comme nous le souhaitons, nous décidons donc de passer à l'étape suivante, le fonctionnement sur batterie. Ce n'est pas la partie la plus compliquée, il suffit de brasé les broches permettant d'accueillir la batterie puis celles destinées au cavalier. Une fois le tout installé sur notre carte, nous la testons et tout fonctionne normalement. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture appui bouton.mp4|thumb|center|Voiture fonctionnant sur batterie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il nous reste encore un peu de temps, nous décidons de nous attaqués à la dernière partie, la recharge de la batterie. Comme pour la partie de fonctionnement sur batterie, il n'y a aucune partie de code, il suffit de soudé des composants en plus sur la carte pour que la nouvelle fonctionnalité soit active. Donc nous nous y sommes mis et encore une fois il n'y a aucun problème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture déchargée.mp4|thumb|left|Voiture déchargée]]&lt;br /&gt;
[[Fichier:Voiture en charge.mp4|thumb|center|Voiture en charge]]&lt;br /&gt;
[[Fichier:Voiture après recharge.mp4|thumb|right|Voiture après recharge]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Voiture déchargée.mp4|Voiture déchargée&lt;br /&gt;
File:Voiture en charge.mp4|Voiture en charge&lt;br /&gt;
File:Voiture après recharge.mp4|Voiture après recharge&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
Vous trouverez dans le lien [https://archives.plil.fr/rboursau/premier-systeme-embarque.git GIT] de notre projet, tous les fichiers de création de la carte se trouvent dans le dossier projet_voiture, le code envoyé pour tester la voiture dans le dossier cod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 erase&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 flash helloworld.hex&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 reset&lt;br /&gt;
&lt;br /&gt;
puis débranché et rebranché la voiture&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton HWB puis RESET, relaché RESET puis HWB pour que la voiture repasse en mode DFU bootloader&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton reset pour arreter le cycle de la voiture au milieu&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5606</id>
		<title>SE3Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2023-5&amp;diff=5606"/>
		<updated>2024-06-11T14:19:12Z</updated>

		<summary type="html">&lt;p&gt;Alecomt1 : /* Brasage des composants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projet Groupe 5 : Voiture Programmable =&lt;br /&gt;
Cette page est consacrée à la présentation du projet SE3 réalisé par BOURSAULT Rémi &amp;amp; LECOMTE Antoine, qui est porté sur la création d'une voiture contrôlé par programmation.&lt;br /&gt;
&lt;br /&gt;
== Présentation : ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
Les objectifs du projets sont : &lt;br /&gt;
&lt;br /&gt;
* Concevoir une voiture fonctionnant sur batterie, avec un ATMega.&lt;br /&gt;
* Intégrer des clignotants fonctionnels.&lt;br /&gt;
* Permettre à la voiture d'avancer ou reculer, toujours en utilisant l'ATMega.&lt;br /&gt;
* Ajout d'un gyrophare.&lt;br /&gt;
&lt;br /&gt;
=== Ressources ===&lt;br /&gt;
Pour atteindre ces différents objectifs, nous aurons besoins des ressources suivantes :&lt;br /&gt;
&lt;br /&gt;
* Un microcontrôleur ATMega16U4/ATMega32U4&lt;br /&gt;
* Des LEDS&lt;br /&gt;
* Deux moteurs à courant continu&lt;br /&gt;
* Un châssis &lt;br /&gt;
* Des dipôles classiques&lt;br /&gt;
* Un gyrophare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir choisi notre projet et nos différents objectifs pour ce projet, nous avons commencé à travailler sur le schéma de montage sur KiCAD afin de pouvoir ensuite faire le PCB et le routage qui sera envoyé à une usine pour imprimer nos cartes. Les fonctions et composants principaux de notre projet sont les suivants.&lt;br /&gt;
&lt;br /&gt;
== Fonction sur le schéma : ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Microcontrôleur ===&lt;br /&gt;
La partie indispensable de tous montages électroniques, le cerveau de la voiture. Sans le microcontrôleur rien dans ce projet n'est possible, il permet de gérer les informations. qui sont transmises dans toutes la carte. C'est un microcontrôleur ATMega32u4, ce n'est pas le plus puissant, mais pour la taille du projet que nous faisons c'est bien assez. Il possède assez d'entrées/sorties pour ce que nous voulons en faire.[[Fichier:Microcontroleu.png||thumb|left|300px|Schéma du microcontrôleur]]&lt;br /&gt;
[[Fichier:Pin configuration atmega.png||thumb|center|300px|Configuration des pins sur l'atmega]]&lt;br /&gt;
&lt;br /&gt;
=== Commande Moteur ===&lt;br /&gt;
Ce bloc est celui qui actionne les moteurs et leur dit quand s'arrêter. Celui-ci est composé d'un TB6612FNG, un driver pour moteur qui ne sert qu'à ça. Il prend sept signaux en entrée trois pour gérer chaque moteur et un signal de standby. Nous avons utilisé la datasheet pour savoir comment le schématiser et quels composants utilisé pour que celui-ci fonctionne dans des conditions optimales. &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'ajouter ce composant, car les signaux de sortie délivrés par l'ATMega sont trop faibles pour alimenter un moteur. Ce driver vient, à partir d'une tension d'alimentation Vcc amplifier le signal de commande délivré par l'ATMega pour que les moteurs aient l'alimentation adéquate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Datasheet TB6612.png||thumb|left|300px|PCB routé de la carte]]&lt;br /&gt;
[[Fichier:Commande Moteur.png||thumb|center|300px|Schéma du bloc de commande des moteurs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chargeur LI-PO ===&lt;br /&gt;
Comme notre voiture fonctionnera sur batterie, il faut un moyen de la recharger, ceci se faisant par l'intermédiaire d'un port USB, il faut un bloc pour adapter le courant que reçoit l'USB pour que cela corresponde aux caractéristiques de notre batterie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Chargeur lipo.png||thumb|center|300px|Schéma du chargeur]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la Batterie ===&lt;br /&gt;
Ce bloc permet de séparer l'alimentation en USB et sur batterie. Lorsqu'un cavalier est présent sur J6, VBAT est directement relié à Vcc et ainsi la batterie sert d'alimentation pour  la carte. Il est impératif de débrancher l'USB avant de mettre le cavalier, pour éviter tout court-circuit. Lorsqu'on enlève le cavalier, on peut brancher l'USB et la carte fonctionne en filaire.[[Fichier:Utilisation baterie.png||thumb|center|300px|Schéma du switch batterie]]&lt;br /&gt;
=== Connecteur USB ===&lt;br /&gt;
On dispose de deux connecteurs USB, un pour recharger la batterie, et un autre pour transmettre les données, qui servira à implanter un programme dans notre microcontrôleur.[[Fichier:Connecteur USBs.png||thumb|center|300px|Schéma des connecteur USB]]&lt;br /&gt;
=== Connecteur ISP ===&lt;br /&gt;
Pour charger le bootloader sur le microcontrôleur si besoin.[[Fichier:Connecteur ISP.png||thumb|center|300px|Schéma du connecteur ISP]]&lt;br /&gt;
=== Diodes Électroluminescentes ===&lt;br /&gt;
[[Fichier:LED voiture.png||thumb|center|300px|Schéma des LEDS]]&lt;br /&gt;
&lt;br /&gt;
== PCB et routage : ==&lt;br /&gt;
Après avoir fini toutes nos fonctions et le schéma, nous nous sommes attaqué au PCB de la carte, il nous a fallu quelque essais pour obtenir une disposition qui nous convienne et qui facilite le routage.[[Fichier:Vue3D.png||thumb|left|300px|Vue 3D de la carte]]&lt;br /&gt;
[[Fichier:PCB voiture.png||thumb|center|300px|PCB routé de la carte]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brasage des composants ==&lt;br /&gt;
Une fois les cartes reçues, nous nous sommes attaqués à la brasure des différents composants. Nous avons commencé par le microcontrôleur, le cristal et les résistances et capacités associées. Dès le départ nous avons eu des problèmes avec le brasage, des pattes soudées entre elles, le cristal mal posé. Mais notre plus gros problème a été l'allocation des pins du microcontrôleur. Nous ne le savions pas au moment de la création de notre PCB et nous n'y avons pas fait attention, mais des pins sont spécialement attribuées au MISO, MOSI et SOCKET. Pins que nous devons utilisés pour envoyer le bootloader sur la microcontrôleur via le programmateur ISP (en orange sur le schéma).  Nous avons donc dû improviser une solution. Nous avons coupé les pistes et relié par des fils les broches de l'ISP aux pins correspondantes. A cause de cette erreur nos LEDs D2 et D3 ne sont plus utilisables.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Atmega pin mosi.png|thumb|center|800x|Pins de l'atmega utilisés pour l'ISP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois ce problème réglé, nous avons pu passer à la suite, la gestion des moteurs. Pour ce faire il n'y a pas eu autant de problèmes que sur la partie microcontrôleur, nous avons simplement soudé le contrôleur de moteurs, un TB6612FNG, puis les broches sur lesquelles nous allons venir brancher les moteurs, et enfin les fils directement sur les broches des moteurs. Nous avons également utilisé du plastique thermo rétractable pour que les fils soient protégés et restent soudés aux moteurs durant toute la durée du projet. Les moteurs étant prêt à l'emploi, nous les avons testé pour savoir si tout était fonctionnelle. Une fois confirmé, nous avons pris des bouchons de bouteilles comme roues et mis des élastiques autour pour avoir de la traction lors de nos différents essais.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Moteur et roues.jpg|thumb|center|300px|Moteurs et roues]]&lt;br /&gt;
&lt;br /&gt;
Pour tester toute notre carte, nous avons crée un code sous le nom de helloworld.c qui rempli différente fonction, allumer ou faire clignoter les LEDs en fonction du déplacement de la voiture et, bien évidemment, déplacer la voiture. La voiture réagissant comme nous le souhaitons, nous décidons donc de passer à l'étape suivante, le fonctionnement sur batterie. Ce n'est pas la partie la plus compliquée, il suffit de brasé les broches permettant d'accueillir la batterie puis celles destinées au cavalier. Une fois le tout installé sur notre carte, nous la testons et tout fonctionne normalement. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Voiture appui bouton.mp4|thumb|center|Voiture fonctionnant sur batterie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il nous reste encore un peu de temps, nous décidons de nous attaqués à la dernière partie, la recharge de la batterie. Comme pour la partie de fonctionnement sur batterie, il n'y a aucune partie de code, il suffit de soudé des composants en plus sur la carte pour que la nouvelle fonctionnalité soit active. Donc nous nous y sommes mis et encore une fois il n'y a aucun problème.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Voiture déchargée.mp4|Voiture déchargée&lt;br /&gt;
File:Voiture en charge.mp4|Voiture en charge&lt;br /&gt;
File:Voiture après recharge.mp4|Voiture après recharge&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
Vous trouverez dans le lien [https://archives.plil.fr/rboursau/premier-systeme-embarque.git GIT] de notre projet, tous les fichiers de création de la carte se trouvent dans le dossier projet_voiture, le code envoyé pour tester la voiture dans le dossier cod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 erase&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 flash helloworld.hex&lt;br /&gt;
&lt;br /&gt;
dfu-programmer atmega16u4 reset&lt;br /&gt;
&lt;br /&gt;
puis débranché et rebranché la voiture&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton HWB puis RESET, relaché RESET puis HWB pour que la voiture repasse en mode DFU bootloader&lt;br /&gt;
&lt;br /&gt;
appuyé sur le bouton reset pour arreter le cycle de la voiture au milieu&lt;/div&gt;</summary>
		<author><name>Alecomt1</name></author>
	</entry>
</feed>