<?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=Skaderis</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=Skaderis"/>
	<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Skaderis"/>
	<updated>2026-05-14T03:43:30Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3171</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3171"/>
		<updated>2024-01-18T17:07:18Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Clignotement de 2 Leds */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous n'arrivez pas à lire les vidéos du wiki, nous les avons mis dans notre Git avec des Readme pour bien savoir ce qu'elles font et avec le code inséré. Les vidéos sur le git sont de meilleures qualités. &lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Lors de la première séance de Pico, nous avons soudé quelques cartes telles que le Shield, la carte de leds et la carte 7 segments : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre|205x205px]][[Fichier:CartePin.png|sans_cadre|209x209px]][[Fichier:7_segments.png|sans_cadre|213x213px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre|203x203px]][[Fichier:Back.png|sans_cadre|200x200px]]&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino qui nous servirons pour la communication du bus SPI : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre|169x169px]]&lt;br /&gt;
=== Programmation Ordonnancement ===&lt;br /&gt;
&lt;br /&gt;
==== Clignotement de 2 Leds ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente :   [[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]'''Remarque :''' Les temps ne sont pas réels, l'objectif est donc d'endormir les tâches.   &lt;br /&gt;
&lt;br /&gt;
Voici le code qui nous a permis d'endormir les tâches :    &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
for(uint8_t cpt=1; cpt&amp;lt;TACHE_MAX; cpt++) { //on parcourt toutes les tâches, excepté cette de l'attente&lt;br /&gt;
&lt;br /&gt;
if (taches[cpt].etat == SLEEPY) { //Si on est dans un état de sommeil on décrémente le temps&lt;br /&gt;
&lt;br /&gt;
       taches[cpt].temps--;&lt;br /&gt;
&lt;br /&gt;
       if(taches[cpt].temps &amp;lt;= 0){// si le temps est dépassé, alors on réveille la tâche&lt;br /&gt;
&lt;br /&gt;
         taches[cpt].etat = WAKE;&lt;br /&gt;
&lt;br /&gt;
       }&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;
Voici la fonction que l'on remplacera avec _delay_ms : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void sleepy(uint16_t timingISR){&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  cli();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  taches[tache_courante].temps = timingISR; //temps = timingISR * 20ms&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  taches[tache_courante].etat = SLEEPY;&amp;lt;/code&amp;gt; on n'oublie pas de mettre l'état de la tâche en sommeil &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  sei();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  TIMER1_COMPA_vect();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici cette fois le clignotement des 2 Leds avec l'endormissement des tâches :          &lt;br /&gt;
[[Fichier:Ordonnancement Leds serie.mov|vignette|ordonnancement Leds avec endormissement|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lecture sur port série en mémoire partagée ====&lt;br /&gt;
Par la suite, nous voulons ordonnancer une tâche qui permet de stocker dans une mémoire partagée la valeur reçue sur le port série.  &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons utilisé : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_recevoir(void) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A, RXC0);&amp;lt;/code&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = UDR0;&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;                               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                             &lt;br /&gt;
&lt;br /&gt;
Ici, la variable globale (mémoire partagée) est une variable globale (received_data) en unsigned char.  &lt;br /&gt;
&lt;br /&gt;
Pour lire sur le port série, on utilisera la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
==== Lecture/écriture sur port série ====&lt;br /&gt;
Afin de vérifier le code que nous avons écris dans la partie d'avant, nous écrirons sur le port série ce que nous avons lu. En d'autres termes, nous écrirons sur le port série ce que nous avons écris sur le clavier. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_envoyer(void) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A,UDRE0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UDR0=received_data;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
Sans remettre à '\0' comme ici, lorsque l'on appuie sur une touche, celle-ci s'affiche jusqu'à l'appuie d'une autre touche  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                         &lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ordonnancement port serie.mov|centré|vignette|Ordonnancement sur port série]]&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Nous n'avons pas fait tout ce qui avait été demandé mais nous sommes quand même assez content du résultat puisque nous avons un ordonnanceur qui gère à la fois le clignotement de 2 Leds différentes ainsi que la lecture et l'écriture sur le port série. &lt;br /&gt;
 [[Fichier:Ordinnancement complet.mov|centré|vignette|Ordonnancement des Leds + port série]] &lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous devons implémenter un contrôleur de bus série SPI. &lt;br /&gt;
&lt;br /&gt;
Tout d'abord, voici comment fonctionne un bus SPI : &lt;br /&gt;
&lt;br /&gt;
Dans un bus SPI, il y a 1 maître et 1 ou plusieurs esclaves. Le transmission des données se font sur 2 fils : MISO et MOSI : &lt;br /&gt;
&lt;br /&gt;
- MOSI : Données du maître vers l'esclave,&lt;br /&gt;
&lt;br /&gt;
- MISO : Données de l'esclave vers le maître.&lt;br /&gt;
&lt;br /&gt;
Puisqu'il y a plusieurs esclaves, le SS (Ship Select) permet d'autoriser 1 esclave précis en l'activant à 0. &lt;br /&gt;
&lt;br /&gt;
Les échanges se font sur front et sont synchronisés par le maître. &lt;br /&gt;
&lt;br /&gt;
Lorsqu'un octet du maître passe dans le registre de l'esclave, celui de l'esclave passe dans le registre du maître simultanément comme représenté sur l'image ci-dessous. C'est le principe du registre à décalage.&lt;br /&gt;
[[Fichier:Chemin spi.png|centré|sans_cadre]]Le contrôleur SPI doit jouer le rôle du maître et va contrôler les pins du bus SPI pour échanger des données.   &lt;br /&gt;
[[Fichier:Schéma bloc du driver SPI.png|centré|vignette|442x442px]]      &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons écris en VHDL :  &lt;br /&gt;
&lt;br /&gt;
Dans un process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;case ETAT is&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when REPOS =&amp;gt; ETAT &amp;lt;= TRANSMISSION;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when TRANSMISSION =&amp;gt; if compteur = 8 then&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ETAT &amp;lt;= REPOS;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;compteur &amp;lt;= 0;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;else compteur &amp;lt;= compteur + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end if;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for i in 0 to 6 loop&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(i) &amp;lt;= mosi_in(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(i) &amp;lt;= data_out_s(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end loop;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(7) &amp;lt;= data_in_s(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(7) &amp;lt;= mosi_in(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end case;&amp;lt;/code&amp;gt;                                                           &lt;br /&gt;
&lt;br /&gt;
Hors du process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS1 &amp;lt;= '1' when select_carte = &amp;quot;001&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS2 &amp;lt;= '1' when select_carte = &amp;quot;010&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS3 &amp;lt;= '1' when select_carte = &amp;quot;100&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé une machine d'état avec 2 états : un état REPOS qui permet de passer à l'état TRANSMISSION et de mettre à 1 ou à 0 les Chip Select en fonction de la selection d'état que recevra la carte FPGA de la carte mère. Et la fonction transmission qui effectue le registre à décalage.   &lt;br /&gt;
&lt;br /&gt;
Ce code, que vous trouverez dans le git, compile, en revanche nous n'avons pas pu faire de tests dessus malheureusement.  &lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet pour la carte clavier est de lire les boutons qui sont enfoncés afin de les envoyer à la carte mère via le bus SPI. &lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte :  [[Fichier:Schematique_clavier.png|centré|sans_cadre|511x511px]]Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches qui sont : la flèche de gauche, la flèche de droite, l'espace, un retour chariot, le suppression et enfin un shift qui nous permettra de switcher avec les 10 chiffres (de 0 à 9), &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation&lt;br /&gt;
* un ATmega328p&lt;br /&gt;
* un connecteur HE10 8 pins pour un bus SPI + une ligne d'interruption pour communiquer avec la carte mère&lt;br /&gt;
* un connecteur 6 pins(2x3) pour un bus SPI afin de programmer la carte.&lt;br /&gt;
&amp;lt;u&amp;gt;Fonctionnement matrice de touches :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but ici est de pouvoir lire la touche sur laquelle nous avons appuyé pour l'envoyer à la carte mère. Ici, l'idée est d'utiliser le fonctionnement de la matrice de touche qui est le suivant : &lt;br /&gt;
&lt;br /&gt;
Premièrement, il faut se décider duquel entre les lignes et les colonnes seront en entrée et l'autre en sortie. Ici se sont les lignes qui sont en sortie et les colonnes en entrée. &lt;br /&gt;
&lt;br /&gt;
L'idée est simple : alterner entre les lignes pour écrire un 0L sur 1 ligne et sur les autres un 1L. On parcourt ensuite toutes les colonnes (de la ligne à 0L). Si on lit un 0L sur une colonne, alors il suffit d'associer la ligne qui est à 0L avec celle de la colonne et on connait la touche qui a été appuyée. &lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up qui se trouvent au niveau des lignes serviront  à avoir un 1L par défaut. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le routage de la carte : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.&lt;br /&gt;
&lt;br /&gt;
Pour faire ce routage, nous avons dû créer le footprint des boutons, alors la prise des mesures sur le boutons était nécessaire. Aussi, nous avons décidé d'utiliser un ATmega328p avec des pins traversants pour une question de facilité au niveau de la soudure mais également pour éviter tout court-circuit et donc une perte de temps. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]][[Fichier:3d view.png|sans_cadre|235x235px]][[Fichier:3d view bottom.png|sans_cadre|235x235px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réel clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte_soude.jpg|sans_cadre|266x266px]]&lt;br /&gt;
&lt;br /&gt;
=== Partie programmation ===&lt;br /&gt;
La programmation de notre carte se fera via un AVR ISP &lt;br /&gt;
&lt;br /&gt;
Pour cela, on utilise une carte arduino uno dans laquelle on téléverse le programme Arduino ISP, disponible dans les exemples de l'IDE arduino, pour permettre a l'arduino uno d'envoyer notre code vers la carte clavier via le connecteur HE10.   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma AVR ISP.png|centré|400x400px|sans_cadre]]&lt;br /&gt;
Pour flasher notre carte clavier, 2 solutions : &lt;br /&gt;
&lt;br /&gt;
* utiliser l'IDE arduino, en utilisant le paramètre &amp;quot;upload using programmer&amp;quot; qui permet de televerser du code dans une atmega en passant par le bus SPI. Mais cela néccesite d'écrire le code sur l'IDE arduino. Cette solution permettra simplement de faire des tests rapides en utilisant, par exemple, l'exemple &amp;quot;Blink&amp;quot;.&lt;br /&gt;
* Créer un Makefile qui permet de téléverser notre code C vers la carte fille en passant par l'arduino uno :&lt;br /&gt;
[[Fichier:Makefil.png|sans_cadre|450x450px]]  &lt;br /&gt;
&lt;br /&gt;
==== Programme de tests sur la carte ====&lt;br /&gt;
Nous sommes ensuite passés au différents tests de la carte pour tester chaque fonctionnalités.   &lt;br /&gt;
&lt;br /&gt;
===== Premier test : la carte est-elle programmable ? =====&lt;br /&gt;
On utilise un programme très simple qui allume une des LEDs de la carte, le &amp;quot;Blink&amp;quot; disponible dans les exemples de l'IDE arduino. &lt;br /&gt;
&lt;br /&gt;
Cependant, en essayant de programmer la carte, aucune LEDs ne clignotait. Comme le code ne venait pas de nous et qe c'est un code simple, le problème ne pouvait venir que du côté du hardware. Nous avons donc tester notre carte au multimètre et il y avait effectivement un court-circuit au niveau du crystal qui empêchait forcement son fonctionnement. L'erreur vient de notre schématique puisque nous avons tourné à 90° le composant, ce qui créé effectivement un court-circuit. Pour remédier à notre problème, nous avons dé-souder le crystal et l'avons décalé sur la carte. &lt;br /&gt;
&lt;br /&gt;
Une fois le crystal re-soudé dans le bon sens, nous avons pu flasher la carte clavier avec le programme &amp;quot;Blink&amp;quot;&lt;br /&gt;
[[Fichier:Led_allumee_clavier.png|centré|sans_cadre|241x241px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; La LED clignote, ce qui nous permet de valider le faite que la carte est programmable via notre AVR ISP.&lt;br /&gt;
&lt;br /&gt;
===== Deuxième test : la lecture d'un bouton =====&lt;br /&gt;
our commencer les tests, nous cherchons à allumer une LED quand on appuie sur un bouton en particulier. Pour cela, nous avons mis à 0L la ligne sur PC3 et lu la colonne sur PD0 :   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test_clavier.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Id 1bouton.mov|centré|vignette|Reconnaissance d'1 bouton avec une Led]]Ce test nous a permit de vérifier 2 choses : &lt;br /&gt;
&lt;br /&gt;
* que notre carte permet de reconnaître l'appuie sur un bouton &lt;br /&gt;
* que nous arrivions bien à utiliser les Leds de notre carte. Ainsi nous avons nos &amp;quot;calculs&amp;quot; avec les décalages et les opérations logiques utiles pour mettre à 0L ou lire sur le port une entrée.&lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons gardé l'idée d'allumer une Led lorsqu'un bouton est enfoncé.          &lt;br /&gt;
&lt;br /&gt;
'''Problème rencontré :''' Au début nous n'arrivions par à lire le bouton bien que notre code soit simple. Nous avons donc vérifié au multimètre si nos boutons étaient bien soudés. Au multimètre, les 4 broches de chaque bouton étaient reliés (donc en court-circuit), ce n'est absolument pas normal. Effectivement, lorsque nous avions créé les footprints des boutons nous n'avons pas mis les broches au bon endroit. Dans les boutons il y a déjà des broches reliées et dans nos footprint nous n'avons pas mis les bons chiffres des broches correctement : ce qui nous a créé un court-circuit. Pour contrer ce problème, nous avons tourné à 90° chaque bouton. C n'était pas simple car il a fallut redresser les pins pour qu'ils rentrent bien dans les trous de la carte. Finalement les boutons fonctionnent correctement et les boutons restent assez droits.    &lt;br /&gt;
&lt;br /&gt;
===== Troisième test : lecture de tous les boutons + shift =====&lt;br /&gt;
Pour commencer, on definit notre matrice de touches grâce à un tableau à 2 dimensions, ça nous permettra de récupérer directement les bonnes touches.  &lt;br /&gt;
&lt;br /&gt;
Nous voulions mettre notre clavier en AZERTY, malheureusement notre matrice ne nous le permet pas, alors les touches seront dans l'ordre alphabétique. Dans le code, les lettres ne sont pas dans l'ordre simplement parce que lors du routage nous n'avons pas laissé les boutons comme dans la schématique par simplicité de routage : &lt;br /&gt;
[[Fichier:Matrice touches.png|gauche|sans_cadre]]&lt;br /&gt;
&amp;lt;u&amp;gt;traduction des valeurs hexadécimales :&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 0x0E : le shift &lt;br /&gt;
* 0x08 : suppression&lt;br /&gt;
* 0x1C : flèche gauche &lt;br /&gt;
* 0x1D : flèche droite &lt;br /&gt;
&lt;br /&gt;
Ce sont simplement les codes en ASCII. &lt;br /&gt;
[[Fichier:Lecture touches.png|gauche|sans_cadre|400x400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Cette fonction nous permet d'effectuer la lecture d'une touche avec la méthode du clavier matriciel que nous avons expliqué plus haut. &lt;br /&gt;
&lt;br /&gt;
Ainsi, pour chaque ligne à 0L on lira sur chaque colonne et on vérifie si elle est égale à 0L. Si oui, on retourne directement la valeur de la touche en retournant notre matrice de touches avec les indices de la ligne et de la colonne en cours. &lt;br /&gt;
&lt;br /&gt;
Il y a une condition supplémentaire : si la touche appuyée est le shift (0x0E). Dans ce cas, on bascule on recommence la même méthode, mais cette fois on retournera la valeur appuyée mais grâce à la deuxième matrice cette fois puisqu'elle contient les chiffres de 0 à 9. &lt;br /&gt;
&lt;br /&gt;
Ici, l'utilisateur devra appuyer sur le bouton pour les chiffres en même temps que le bouton du shift. &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;
Finalement, notre clavier ce présent comme ceci : &lt;br /&gt;
[[Fichier:Tableau du clavier.png|gauche|Clavier sans appuie sur SHIFT|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma clavier avec appuie sur SHIFT.png|clavier avec appuie sur SHIFT|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous aurions voulu faire un clavier AZERTY mais la matrice n'est pas de la bonne forme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Quatrième test : le bus SPI =====&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie est d'envoyer les touches lues par le clavier vers la carte mère grâce au bus SPI.  &lt;br /&gt;
&lt;br /&gt;
Coté carte fille, le bus SPI est utilisé en interruption. Lorsque qu'une donnée est envoyé sur le MOSI, la programme du clavier rentre dans une interruption (ISR) pour renvoyer une info sur le MISO. &lt;br /&gt;
&lt;br /&gt;
Cela nous permet par exemple d'envoyer une valeur sur le MOSI, et de récupérer une donnée sur le MISO en fonction de la valeur envoyé depuis le MOSI. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ISR(SPI_STC_vect) {&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   char data = SPDR;&amp;lt;/code&amp;gt;                   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   _delay_ms(40);&amp;lt;/code&amp;gt;                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   if(data == 0x00) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = '!';&amp;lt;/code&amp;gt;                     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x05) {&amp;lt;/code&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = bouton;&amp;lt;/code&amp;gt;                      bouton : touche qui a été appuyée  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication de la communication en bus SPI :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, l'idée est de communiquer avec la carte mère. Pour cela, voici un schéma explicatif de notre méthode de communication : &lt;br /&gt;
 [[Fichier:Schéma communication SPI.png|centré|cadre]] &lt;br /&gt;
&lt;br /&gt;
Lorsque la carte clavier lie une touche, la ligne d'interruption passe à l'état haut. &lt;br /&gt;
&lt;br /&gt;
La carte mère rentre en interruption et va alors demander quelle carte a déclenché l'interruption. &lt;br /&gt;
&lt;br /&gt;
Si c'est la carte clavier qui a déclenché l'interruption alors le carte mère demande le nombre de touche à récupérer, puis récupère une a une les touches.  &lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' la taille du tampon sera, le plus souvent, égale à 1 puisque le microcontrôleur est plus rapide que l'humain qui tape au clavier. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de tester notre communication SPI, nous avons utiliser un Arduino uno qui &amp;quot;remplace&amp;quot; la carte mère. et qui envoi les valeurs 0x00, 0x01 ou 0x05, le carte mère à la lecture de la valeur doit répondre par une autre valeur. &lt;br /&gt;
&lt;br /&gt;
En revanche, après beaucoup de tests non concluant,  la communication ne fonctionnait pas. Nous avons alors regardé à l’oscilloscope l'allure de nos signaux MISO et MOSI :  &lt;br /&gt;
&lt;br /&gt;
* Le MOSI était cohérent avec les données envoyées&lt;br /&gt;
* Le MISO en revanche a des valeurs de tensions écrasées, ce qui fait que la valeur récupérée par le maitre est toujours nulle.&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:MOSI.png|gauche|vignette|MOSI]]&lt;br /&gt;
[[Fichier:MISO.png|centré|vignette|MISO|290x290px]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; Après de nombreux essais sur différents shield, le bus SPI de certaines cartes ne fonctionnent pas, et d'autres fonctionnent, et ce même avec un code identiques. C'est assez troublant puisque même avec la dernière carte modifiée et soudée par M. Redon, le bus SPI ne fonctionne pas avec notre code. La seule carte avec laquelle nos programmes fonctionnent, c'est avec celle du groupe 9. Les shields des binômes 4,5 et 6 ont ce problème.                  &lt;br /&gt;
===== Cinquième test : affichage sur le port série =====&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier plus précisément notre communication SPI, nous avons utiliser le port série de l'arduino uno pour pouvoir voir les données qui sont envoyé depuis la carte clavier, et ainsi s'assurer que quand on appuie sur une touche du clavier, la carte mère récupère bien le code ASCII de cette touche. &lt;br /&gt;
&lt;br /&gt;
Pour ce faire, nous utilisons la même fonction &amp;lt;code&amp;gt;serie_envoyer()&amp;lt;/code&amp;gt; que dans l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                        &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_activer();&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(20);&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     data_recue = spi_envoi(0x05);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     serie_envoyer(data_recue);&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_desactiver();&amp;lt;/code&amp;gt;            &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(100);&amp;lt;/code&amp;gt;              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
Le but étant, ici, d'envoyer directement la demande de touche et de l'afficher directement sur le port série grâce au &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Clavier sansINT shift.mp4|centré|vignette|Envoi des boutons lu par SPI]]&lt;br /&gt;
&lt;br /&gt;
===== Sixième test : identification et bouton =====&lt;br /&gt;
Maintenant, puisque l'objectif est d'avoir une communication avec la carte mère, nous avons testé un programme qui envoi la demande d'identification, puis après la réponse, il envoi la demande de bouton. Notre carte clavier répond alors par ces demandes. Nous utilisons toujours une variable globale qui récupère le caractère reçu lorsqu'un bouton a été enfoncé. &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo de la communication entre le maitre et le clavier : &lt;br /&gt;
&lt;br /&gt;
 [[Fichier:Id bouton.mov|centré|vignette|Identification + bouton avec variable globale]] &lt;br /&gt;
&lt;br /&gt;
==== Programme final ====&lt;br /&gt;
Finalement, l'idée est de stocker les touches appuyées dans un tableau, pour pouvoir les envoyer à la carte mère lorsqu'elle le demande. Avant la demande de touche, la carte mère envoi la donnée 0x00 pour que l'on réponde que la carte est un clavier avec le caractère '!'. Nous avons décidé d'utilisé cette réponse seulement pour que l'on puisse l'afficher sur le port série (0x05 étant un caractère non imprimable). &lt;br /&gt;
&lt;br /&gt;
Voici les fonctions qui permettent d'ajouter et de supprimer les touches du tampon : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void remplir_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[cpt_tampon] = bouton;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon++;&amp;lt;/code&amp;gt;                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void vider_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for (int i=0; i &amp;lt; cpt_tampon; i++) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if (i == cpt_tampon - 1 ) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;} else {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = tampon[i+1];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon--;&amp;lt;/code&amp;gt;                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
L'idée est de vider le  tampon à chaque fois que l'on envoi le tableau à la case 0 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(data == 0x05) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SPDR = tampon[0];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;vider_tampon();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(cpt_tampon == 0) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PC4);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                &lt;br /&gt;
&lt;br /&gt;
En conclusion, le programme de la carte mère envoi la demande d'identification (0x00) ainsi que la demande de touche. Et le programme du clavier envoi le caractère '!', et par la suite la touche du tampon. &lt;br /&gt;
[[Fichier:Id touche tampon.mov|centré|cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' ce code n'est pas parfait puisqu'il écrit 1 fois de trop le caractère. Ex : si on appuie sur 'A', on lira sur le port série 'A', en revanche si on appuie juste après sur 'B', on lira 'A' puis 'B'. Nous n'avons malheureusement pas pu décoder cette erreur. &lt;br /&gt;
&lt;br /&gt;
==== Points importants à savoir ====&lt;br /&gt;
il faut débrancher et rebrancher le câble du bus SPI pour que la communication fonctionne. Aussi, si le programme du maître ne s'injecte pas dans l'Arduino, il faut insérer d'abord un programme d'exemple comme ArduinoISP. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons mis à part des programmes fonctionnels dans les répertoires nommés &amp;quot;Codes_OK&amp;quot;. Tout est expliqué dans des README qui se trouvent (presque) dans chaque répertoire. Un README qui se trouve dans le répertoire clavier/Code explique ce que les combinaisons de codes du maître et de l'esclave font. Des vidéos se trouvent également dans le répertoire Videos, qui montrent la fonctionnalité de chaque codes. Il y a d'ailleurs &amp;lt;u&amp;gt;plus (+) de vidéos&amp;lt;/u&amp;gt; sur le git. &lt;br /&gt;
 &lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Notre carte clavier est capable de lire chacune des touches et associe a chacune d'elle un caractère ASCII. Le clavier possède aussi un système de shift pour pouvoir taper les chiffres de 0 à 9. La précision du clavier n'est pas optimale et va parfois lire 2 fois la même touche quand on appuie sur un bouton. Il faudrait, pour corriger ça, retravailler les différents délais mais nous avons déjà passée pas mal de temps à régler nos délais sans trouver le timing parfait, si il existe.&lt;br /&gt;
&lt;br /&gt;
Notre bus SPI nous permet d'envoyer les touches du clavier vers la carte mère mais aussi d'identifier la carte clavier. Néanmoins l’ajout de notre système de tampon introduit un décalage d’une touche dans l’envoie des touches que nous avons pas su corriger.  &lt;br /&gt;
&lt;br /&gt;
Les primitives à incorporer dans la carte mère correspondent aux code que nous avons écrit dans l’arduino uno utilisé comme master spi.  &lt;br /&gt;
&lt;br /&gt;
Ce projet nous a permit de parfaitement maîtriser et comprendre la programmation de notre ATmega par AVR ISP (câblage, makefile). Cependant, la programmation par USB aurait était bien plus pratique et nous favoriserons cette méthode à l'avenir.  &lt;br /&gt;
&lt;br /&gt;
Nous sommes tout de même assez content de notre travail puisque nous arrivons à bien envoyer par SPI, que ce soit des lettres (1ère matrice clavier) ou des chiffres (2ème matrice clavier). Nous avons perdu beaucoup de temps sur la gestion du bus SPI à cause notamment des boucliers qui déformaient le signal MISO, mais après des observations à l’oscilloscope nous avons su trouver la cause de notre problème. Nous avons réussi à gérer l'ISR du SPI. Nous nous sommes alors améliorés tous les 2 que ce soit en software ou en hardware.&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3166</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3166"/>
		<updated>2024-01-18T17:03:20Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous n'arrivez pas à lire les vidéos du wiki, nous les avons mis dans notre Git avec des Readme pour bien savoir ce qu'elles font et avec le code inséré. Les vidéos sur le git sont de meilleures qualités. &lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Lors de la première séance de Pico, nous avons soudé quelques cartes telles que le Shield, la carte de leds et la carte 7 segments : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre|205x205px]][[Fichier:CartePin.png|sans_cadre|209x209px]][[Fichier:7_segments.png|sans_cadre|213x213px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre|203x203px]][[Fichier:Back.png|sans_cadre|200x200px]]&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino qui nous servirons pour la communication du bus SPI : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre|169x169px]]&lt;br /&gt;
=== Programmation Ordonnancement ===&lt;br /&gt;
&lt;br /&gt;
==== Clignotement de 2 Leds ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente :   [[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]'''Remarque :''' Les temps ne sont pas réels, l'objectif est donc d'endormir les tâches.   &lt;br /&gt;
&lt;br /&gt;
Voici le code qui nous a permis d'endormir les tâches :    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for(uint8_t cpt=1; cpt&amp;lt;TACHE_MAX; cpt++) {&amp;lt;/code&amp;gt;    on parcourt toutes les tâches, excepté cette de l'attente    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if (taches[cpt].etat == SLEEPY) {&amp;lt;/code&amp;gt;    Si on est dans un état de sommeil on décrémente le temps &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       taches[cpt].temps--;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       if(taches[cpt].temps &amp;lt;= 0){&amp;lt;/code&amp;gt; si le temps est dépassé, alors on réveille la tâche &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;         taches[cpt].etat = WAKE;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici la fonction que l'on remplacera avec _delay_ms : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void sleepy(uint16_t timingISR){&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  cli();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  taches[tache_courante].temps = timingISR; //temps = timingISR * 20ms&amp;lt;/code&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  taches[tache_courante].etat = SLEEPY;&amp;lt;/code&amp;gt; on n'oublie pas de mettre l'état de la tâche en sommeil &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  sei();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;  TIMER1_COMPA_vect();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici cette fois le clignotement des 2 Leds avec l'endormissement des tâches :          &lt;br /&gt;
[[Fichier:Ordonnancement Leds serie.mov|vignette|ordonnancement Leds avec endormissement|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Lecture sur port série en mémoire partagée ====&lt;br /&gt;
Par la suite, nous voulons ordonnancer une tâche qui permet de stocker dans une mémoire partagée la valeur reçue sur le port série.  &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons utilisé : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_recevoir(void) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A, RXC0);&amp;lt;/code&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = UDR0;&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;                               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                             &lt;br /&gt;
&lt;br /&gt;
Ici, la variable globale (mémoire partagée) est une variable globale (received_data) en unsigned char.  &lt;br /&gt;
&lt;br /&gt;
Pour lire sur le port série, on utilisera la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
==== Lecture/écriture sur port série ====&lt;br /&gt;
Afin de vérifier le code que nous avons écris dans la partie d'avant, nous écrirons sur le port série ce que nous avons lu. En d'autres termes, nous écrirons sur le port série ce que nous avons écris sur le clavier. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_envoyer(void) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A,UDRE0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UDR0=received_data;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
Sans remettre à '\0' comme ici, lorsque l'on appuie sur une touche, celle-ci s'affiche jusqu'à l'appuie d'une autre touche  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                         &lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ordonnancement port serie.mov|centré|vignette|Ordonnancement sur port série]]&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Nous n'avons pas fait tout ce qui avait été demandé mais nous sommes quand même assez content du résultat puisque nous avons un ordonnanceur qui gère à la fois le clignotement de 2 Leds différentes ainsi que la lecture et l'écriture sur le port série. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Ordonnancement Leds portSerie.mp4|centré|vignette|Ordonnancement port série + Leds]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous devons implémenter un contrôleur de bus série SPI. &lt;br /&gt;
&lt;br /&gt;
Tout d'abord, voici comment fonctionne un bus SPI : &lt;br /&gt;
&lt;br /&gt;
Dans un bus SPI, il y a 1 maître et 1 ou plusieurs esclaves. Le transmission des données se font sur 2 fils : MISO et MOSI : &lt;br /&gt;
&lt;br /&gt;
- MOSI : Données du maître vers l'esclave,&lt;br /&gt;
&lt;br /&gt;
- MISO : Données de l'esclave vers le maître.&lt;br /&gt;
&lt;br /&gt;
Puisqu'il y a plusieurs esclaves, le SS (Ship Select) permet d'autoriser 1 esclave précis en l'activant à 0. &lt;br /&gt;
&lt;br /&gt;
Les échanges se font sur front et sont synchronisés par le maître. &lt;br /&gt;
&lt;br /&gt;
Lorsqu'un octet du maître passe dans le registre de l'esclave, celui de l'esclave passe dans le registre du maître simultanément comme représenté sur l'image ci-dessous. C'est le principe du registre à décalage.&lt;br /&gt;
[[Fichier:Chemin spi.png|centré|sans_cadre]]Le contrôleur SPI doit jouer le rôle du maître et va contrôler les pins du bus SPI pour échanger des données.   &lt;br /&gt;
[[Fichier:Schéma bloc du driver SPI.png|centré|vignette|442x442px]]      &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons écris en VHDL :  &lt;br /&gt;
&lt;br /&gt;
Dans un process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;case ETAT is&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when REPOS =&amp;gt; ETAT &amp;lt;= TRANSMISSION;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when TRANSMISSION =&amp;gt; if compteur = 8 then&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ETAT &amp;lt;= REPOS;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;compteur &amp;lt;= 0;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;else compteur &amp;lt;= compteur + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end if;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for i in 0 to 6 loop&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(i) &amp;lt;= mosi_in(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(i) &amp;lt;= data_out_s(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end loop;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(7) &amp;lt;= data_in_s(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(7) &amp;lt;= mosi_in(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end case;&amp;lt;/code&amp;gt;                                                           &lt;br /&gt;
&lt;br /&gt;
Hors du process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS1 &amp;lt;= '1' when select_carte = &amp;quot;001&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS2 &amp;lt;= '1' when select_carte = &amp;quot;010&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS3 &amp;lt;= '1' when select_carte = &amp;quot;100&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé une machine d'état avec 2 états : un état REPOS qui permet de passer à l'état TRANSMISSION et de mettre à 1 ou à 0 les Chip Select en fonction de la selection d'état que recevra la carte FPGA de la carte mère. Et la fonction transmission qui effectue le registre à décalage.   &lt;br /&gt;
&lt;br /&gt;
Ce code, que vous trouverez dans le git, compile, en revanche nous n'avons pas pu faire de tests dessus malheureusement.  &lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet pour la carte clavier est de lire les boutons qui sont enfoncés afin de les envoyer à la carte mère via le bus SPI. &lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte :  [[Fichier:Schematique_clavier.png|centré|sans_cadre|511x511px]]Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches qui sont : la flèche de gauche, la flèche de droite, l'espace, un retour chariot, le suppression et enfin un shift qui nous permettra de switcher avec les 10 chiffres (de 0 à 9), &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation&lt;br /&gt;
* un ATmega328p&lt;br /&gt;
* un connecteur HE10 8 pins pour un bus SPI + une ligne d'interruption pour communiquer avec la carte mère&lt;br /&gt;
* un connecteur 6 pins(2x3) pour un bus SPI afin de programmer la carte.&lt;br /&gt;
&amp;lt;u&amp;gt;Fonctionnement matrice de touches :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but ici est de pouvoir lire la touche sur laquelle nous avons appuyé pour l'envoyer à la carte mère. Ici, l'idée est d'utiliser le fonctionnement de la matrice de touche qui est le suivant : &lt;br /&gt;
&lt;br /&gt;
Premièrement, il faut se décider duquel entre les lignes et les colonnes seront en entrée et l'autre en sortie. Ici se sont les lignes qui sont en sortie et les colonnes en entrée. &lt;br /&gt;
&lt;br /&gt;
L'idée est simple : alterner entre les lignes pour écrire un 0L sur 1 ligne et sur les autres un 1L. On parcourt ensuite toutes les colonnes (de la ligne à 0L). Si on lit un 0L sur une colonne, alors il suffit d'associer la ligne qui est à 0L avec celle de la colonne et on connait la touche qui a été appuyée. &lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up qui se trouvent au niveau des lignes serviront  à avoir un 1L par défaut. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le routage de la carte : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.&lt;br /&gt;
&lt;br /&gt;
Pour faire ce routage, nous avons dû créer le footprint des boutons, alors la prise des mesures sur le boutons était nécessaire. Aussi, nous avons décidé d'utiliser un ATmega328p avec des pins traversants pour une question de facilité au niveau de la soudure mais également pour éviter tout court-circuit et donc une perte de temps. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]][[Fichier:3d view.png|sans_cadre|235x235px]][[Fichier:3d view bottom.png|sans_cadre|235x235px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réel clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte_soude.jpg|sans_cadre|266x266px]]&lt;br /&gt;
&lt;br /&gt;
=== Partie programmation ===&lt;br /&gt;
La programmation de notre carte se fera via un AVR ISP &lt;br /&gt;
&lt;br /&gt;
Pour cela, on utilise une carte arduino uno dans laquelle on téléverse le programme Arduino ISP, disponible dans les exemples de l'IDE arduino, pour permettre a l'arduino uno d'envoyer notre code vers la carte clavier via le connecteur HE10.   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma AVR ISP.png|centré|400x400px|sans_cadre]]&lt;br /&gt;
Pour flasher notre carte clavier, 2 solutions : &lt;br /&gt;
&lt;br /&gt;
* utiliser l'IDE arduino, en utilisant le paramètre &amp;quot;upload using programmer&amp;quot; qui permet de televerser du code dans une atmega en passant par le bus SPI. Mais cela néccesite d'écrire le code sur l'IDE arduino. Cette solution permettra simplement de faire des tests rapides en utilisant, par exemple, l'exemple &amp;quot;Blink&amp;quot;.&lt;br /&gt;
* Créer un Makefile qui permet de téléverser notre code C vers la carte fille en passant par l'arduino uno :&lt;br /&gt;
[[Fichier:Makefil.png|sans_cadre|450x450px]]  &lt;br /&gt;
&lt;br /&gt;
==== Programme de tests sur la carte ====&lt;br /&gt;
Nous sommes ensuite passés au différents tests de la carte pour tester chaque fonctionnalités.   &lt;br /&gt;
&lt;br /&gt;
===== Premier test : la carte est-elle programmable ? =====&lt;br /&gt;
On utilise un programme très simple qui allume une des LEDs de la carte, le &amp;quot;Blink&amp;quot; disponible dans les exemples de l'IDE arduino. &lt;br /&gt;
&lt;br /&gt;
Cependant, en essayant de programmer la carte, aucune LEDs ne clignotait. Comme le code ne venait pas de nous et qe c'est un code simple, le problème ne pouvait venir que du côté du hardware. Nous avons donc tester notre carte au multimètre et il y avait effectivement un court-circuit au niveau du crystal qui empêchait forcement son fonctionnement. L'erreur vient de notre schématique puisque nous avons tourné à 90° le composant, ce qui créé effectivement un court-circuit. Pour remédier à notre problème, nous avons dé-souder le crystal et l'avons décalé sur la carte. &lt;br /&gt;
&lt;br /&gt;
Une fois le crystal re-soudé dans le bon sens, nous avons pu flasher la carte clavier avec le programme &amp;quot;Blink&amp;quot;&lt;br /&gt;
[[Fichier:Led_allumee_clavier.png|centré|sans_cadre|241x241px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; La LED clignote, ce qui nous permet de valider le faite que la carte est programmable via notre AVR ISP.&lt;br /&gt;
&lt;br /&gt;
===== Deuxième test : la lecture d'un bouton =====&lt;br /&gt;
our commencer les tests, nous cherchons à allumer une LED quand on appuie sur un bouton en particulier. Pour cela, nous avons mis à 0L la ligne sur PC3 et lu la colonne sur PD0 :   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test_clavier.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Id 1bouton.mov|centré|vignette|Reconnaissance d'1 bouton avec une Led]]Ce test nous a permit de vérifier 2 choses : &lt;br /&gt;
&lt;br /&gt;
* que notre carte permet de reconnaître l'appuie sur un bouton &lt;br /&gt;
* que nous arrivions bien à utiliser les Leds de notre carte. Ainsi nous avons nos &amp;quot;calculs&amp;quot; avec les décalages et les opérations logiques utiles pour mettre à 0L ou lire sur le port une entrée.&lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons gardé l'idée d'allumer une Led lorsqu'un bouton est enfoncé.          &lt;br /&gt;
&lt;br /&gt;
'''Problème rencontré :''' Au début nous n'arrivions par à lire le bouton bien que notre code soit simple. Nous avons donc vérifié au multimètre si nos boutons étaient bien soudés. Au multimètre, les 4 broches de chaque bouton étaient reliés (donc en court-circuit), ce n'est absolument pas normal. Effectivement, lorsque nous avions créé les footprints des boutons nous n'avons pas mis les broches au bon endroit. Dans les boutons il y a déjà des broches reliées et dans nos footprint nous n'avons pas mis les bons chiffres des broches correctement : ce qui nous a créé un court-circuit. Pour contrer ce problème, nous avons tourné à 90° chaque bouton. C n'était pas simple car il a fallut redresser les pins pour qu'ils rentrent bien dans les trous de la carte. Finalement les boutons fonctionnent correctement et les boutons restent assez droits.    &lt;br /&gt;
&lt;br /&gt;
===== Troisième test : lecture de tous les boutons + shift =====&lt;br /&gt;
Pour commencer, on definit notre matrice de touches grâce à un tableau à 2 dimensions, ça nous permettra de récupérer directement les bonnes touches.  &lt;br /&gt;
&lt;br /&gt;
Nous voulions mettre notre clavier en AZERTY, malheureusement notre matrice ne nous le permet pas, alors les touches seront dans l'ordre alphabétique. Dans le code, les lettres ne sont pas dans l'ordre simplement parce que lors du routage nous n'avons pas laissé les boutons comme dans la schématique par simplicité de routage : &lt;br /&gt;
[[Fichier:Matrice touches.png|gauche|sans_cadre]]&lt;br /&gt;
&amp;lt;u&amp;gt;traduction des valeurs hexadécimales :&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 0x0E : le shift &lt;br /&gt;
* 0x08 : suppression&lt;br /&gt;
* 0x1C : flèche gauche &lt;br /&gt;
* 0x1D : flèche droite &lt;br /&gt;
&lt;br /&gt;
Ce sont simplement les codes en ASCII. &lt;br /&gt;
[[Fichier:Lecture touches.png|gauche|sans_cadre|400x400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Cette fonction nous permet d'effectuer la lecture d'une touche avec la méthode du clavier matriciel que nous avons expliqué plus haut. &lt;br /&gt;
&lt;br /&gt;
Ainsi, pour chaque ligne à 0L on lira sur chaque colonne et on vérifie si elle est égale à 0L. Si oui, on retourne directement la valeur de la touche en retournant notre matrice de touches avec les indices de la ligne et de la colonne en cours. &lt;br /&gt;
&lt;br /&gt;
Il y a une condition supplémentaire : si la touche appuyée est le shift (0x0E). Dans ce cas, on bascule on recommence la même méthode, mais cette fois on retournera la valeur appuyée mais grâce à la deuxième matrice cette fois puisqu'elle contient les chiffres de 0 à 9. &lt;br /&gt;
&lt;br /&gt;
Ici, l'utilisateur devra appuyer sur le bouton pour les chiffres en même temps que le bouton du shift. &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;
Finalement, notre clavier ce présent comme ceci : &lt;br /&gt;
[[Fichier:Tableau du clavier.png|gauche|Clavier sans appuie sur SHIFT|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma clavier avec appuie sur SHIFT.png|clavier avec appuie sur SHIFT|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous aurions voulu faire un clavier AZERTY mais la matrice n'est pas de la bonne forme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Quatrième test : le bus SPI =====&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie est d'envoyer les touches lues par le clavier vers la carte mère grâce au bus SPI.  &lt;br /&gt;
&lt;br /&gt;
Coté carte fille, le bus SPI est utilisé en interruption. Lorsque qu'une donnée est envoyé sur le MOSI, la programme du clavier rentre dans une interruption (ISR) pour renvoyer une info sur le MISO. &lt;br /&gt;
&lt;br /&gt;
Cela nous permet par exemple d'envoyer une valeur sur le MOSI, et de récupérer une donnée sur le MISO en fonction de la valeur envoyé depuis le MOSI. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ISR(SPI_STC_vect) {&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   char data = SPDR;&amp;lt;/code&amp;gt;                   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   _delay_ms(40);&amp;lt;/code&amp;gt;                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   if(data == 0x00) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = '!';&amp;lt;/code&amp;gt;                     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x05) {&amp;lt;/code&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = bouton;&amp;lt;/code&amp;gt;                      bouton : touche qui a été appuyée  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication de la communication en bus SPI :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, l'idée est de communiquer avec la carte mère. Pour cela, voici un schéma explicatif de notre méthode de communication : &lt;br /&gt;
 [[Fichier:Schéma communication SPI.png|centré|cadre]] &lt;br /&gt;
&lt;br /&gt;
Lorsque la carte clavier lie une touche, la ligne d'interruption passe à l'état haut. &lt;br /&gt;
&lt;br /&gt;
La carte mère rentre en interruption et va alors demander quelle carte a déclenché l'interruption. &lt;br /&gt;
&lt;br /&gt;
Si c'est la carte clavier qui a déclenché l'interruption alors le carte mère demande le nombre de touche à récupérer, puis récupère une a une les touches.  &lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' la taille du tampon sera, le plus souvent, égale à 1 puisque le microcontrôleur est plus rapide que l'humain qui tape au clavier. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de tester notre communication SPI, nous avons utiliser un Arduino uno qui &amp;quot;remplace&amp;quot; la carte mère. et qui envoi les valeurs 0x00, 0x01 ou 0x05, le carte mère à la lecture de la valeur doit répondre par une autre valeur. &lt;br /&gt;
&lt;br /&gt;
En revanche, après beaucoup de tests non concluant,  la communication ne fonctionnait pas. Nous avons alors regardé à l’oscilloscope l'allure de nos signaux MISO et MOSI :  &lt;br /&gt;
&lt;br /&gt;
* Le MOSI était cohérent avec les données envoyées&lt;br /&gt;
* Le MISO en revanche a des valeurs de tensions écrasées, ce qui fait que la valeur récupérée par le maitre est toujours nulle.&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:MOSI.png|gauche|vignette|MOSI]]&lt;br /&gt;
[[Fichier:MISO.png|centré|vignette|MISO|290x290px]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; Après de nombreux essais sur différents shield, le bus SPI de certaines cartes ne fonctionnent pas, et d'autres fonctionnent, et ce même avec un code identiques. C'est assez troublant puisque même avec la dernière carte modifiée et soudée par M. Redon, le bus SPI ne fonctionne pas avec notre code. La seule carte avec laquelle nos programmes fonctionnent, c'est avec celle du groupe 9. Les shields des binômes 4,5 et 6 ont ce problème.                  &lt;br /&gt;
===== Cinquième test : affichage sur le port série =====&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier plus précisément notre communication SPI, nous avons utiliser le port série de l'arduino uno pour pouvoir voir les données qui sont envoyé depuis la carte clavier, et ainsi s'assurer que quand on appuie sur une touche du clavier, la carte mère récupère bien le code ASCII de cette touche. &lt;br /&gt;
&lt;br /&gt;
Pour ce faire, nous utilisons la même fonction &amp;lt;code&amp;gt;serie_envoyer()&amp;lt;/code&amp;gt; que dans l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                        &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_activer();&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(20);&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     data_recue = spi_envoi(0x05);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     serie_envoyer(data_recue);&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_desactiver();&amp;lt;/code&amp;gt;            &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(100);&amp;lt;/code&amp;gt;              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
Le but étant, ici, d'envoyer directement la demande de touche et de l'afficher directement sur le port série grâce au &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Clavier sansINT shift.mp4|centré|vignette|Envoi des boutons lu par SPI]]&lt;br /&gt;
&lt;br /&gt;
===== Sixième test : identification et bouton =====&lt;br /&gt;
Maintenant, puisque l'objectif est d'avoir une communication avec la carte mère, nous avons testé un programme qui envoi la demande d'identification, puis après la réponse, il envoi la demande de bouton. Notre carte clavier répond alors par ces demandes. Nous utilisons toujours une variable globale qui récupère le caractère reçu lorsqu'un bouton a été enfoncé. &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo de la communication entre le maitre et le clavier : &lt;br /&gt;
&lt;br /&gt;
 [[Fichier:Id bouton.mov|centré|vignette|Identification + bouton avec variable globale]] &lt;br /&gt;
&lt;br /&gt;
==== Programme final ====&lt;br /&gt;
Finalement, l'idée est de stocker les touches appuyées dans un tableau, pour pouvoir les envoyer à la carte mère lorsqu'elle le demande. Avant la demande de touche, la carte mère envoi la donnée 0x00 pour que l'on réponde que la carte est un clavier avec le caractère '!'. Nous avons décidé d'utilisé cette réponse seulement pour que l'on puisse l'afficher sur le port série (0x05 étant un caractère non imprimable). &lt;br /&gt;
&lt;br /&gt;
Voici les fonctions qui permettent d'ajouter et de supprimer les touches du tampon : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void remplir_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[cpt_tampon] = bouton;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon++;&amp;lt;/code&amp;gt;                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void vider_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for (int i=0; i &amp;lt; cpt_tampon; i++) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if (i == cpt_tampon - 1 ) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;} else {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = tampon[i+1];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon--;&amp;lt;/code&amp;gt;                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
L'idée est de vider le  tampon à chaque fois que l'on envoi le tableau à la case 0 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(data == 0x05) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SPDR = tampon[0];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;vider_tampon();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(cpt_tampon == 0) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PC4);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                &lt;br /&gt;
&lt;br /&gt;
En conclusion, le programme de la carte mère envoi la demande d'identification (0x00) ainsi que la demande de touche. Et le programme du clavier envoi le caractère '!', et par la suite la touche du tampon. &lt;br /&gt;
[[Fichier:Id touche tampon.mov|centré|cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' ce code n'est pas parfait puisqu'il écrit 1 fois de trop le caractère. Ex : si on appuie sur 'A', on lira sur le port série 'A', en revanche si on appuie juste après sur 'B', on lira 'A' puis 'B'. Nous n'avons malheureusement pas pu décoder cette erreur. &lt;br /&gt;
&lt;br /&gt;
==== Points importants à savoir ====&lt;br /&gt;
il faut débrancher et rebrancher le câble du bus SPI pour que la communication fonctionne. Aussi, si le programme du maître ne s'injecte pas dans l'Arduino, il faut insérer d'abord un programme d'exemple comme ArduinoISP. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons mis à part des programmes fonctionnels dans les répertoires nommés &amp;quot;Codes_OK&amp;quot;. Tout est expliqué dans des README qui se trouvent (presque) dans chaque répertoire. Un README qui se trouve dans le répertoire clavier/Code explique ce que les combinaisons de codes du maître et de l'esclave font. Des vidéos se trouvent également dans le répertoire Videos, qui montrent la fonctionnalité de chaque codes. Il y a d'ailleurs &amp;lt;u&amp;gt;plus (+) de vidéos&amp;lt;/u&amp;gt; sur le git. &lt;br /&gt;
 &lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Notre carte clavier est capable de lire chacune des touches et associe a chacune d'elle un caractère ASCII. Le clavier possède aussi un système de shift pour pouvoir taper les chiffres de 0 à 9. La précision du clavier n'est pas optimale et va parfois lire 2 fois la même touche quand on appuie sur un bouton. Il faudrait, pour corriger ça, retravailler les différents délais mais nous avons déjà passée pas mal de temps à régler nos délais sans trouver le timing parfait, si il existe.&lt;br /&gt;
&lt;br /&gt;
Notre bus SPI nous permet d'envoyer les touches du clavier vers la carte mère mais aussi d'identifier la carte clavier. Néanmoins l’ajout de notre système de tampon introduit un décalage d’une touche dans l’envoie des touches que nous avons pas su corriger.  &lt;br /&gt;
&lt;br /&gt;
Les primitives à incorporer dans la carte mère correspondent aux code que nous avons écrit dans l’arduino uno utilisé comme master spi.  &lt;br /&gt;
&lt;br /&gt;
Ce projet nous a permit de parfaitement maîtriser et comprendre la programmation de notre ATmega par AVR ISP (câblage, makefile). Cependant, la programmation par USB aurait était bien plus pratique et nous favoriserons cette méthode à l'avenir.  &lt;br /&gt;
&lt;br /&gt;
Nous sommes tout de même assez content de notre travail puisque nous arrivons à bien envoyer par SPI, que ce soit des lettres (1ère matrice clavier) ou des chiffres (2ème matrice clavier). Nous avons perdu beaucoup de temps sur la gestion du bus SPI à cause notamment des boucliers qui déformaient le signal MISO, mais après des observations à l’oscilloscope nous avons su trouver la cause de notre problème. Nous avons réussi à gérer l'ISR du SPI. Nous nous sommes alors améliorés tous les 2 que ce soit en software ou en hardware.&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3162</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3162"/>
		<updated>2024-01-18T16:53:33Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous n'arrivez pas à lire les vidéos du wiki, nous les avons mis dans notre Git avec des Readme pour bien savoir ce qu'elles font et avec le code inséré. Les vidéos sur le git sont de meilleures qualités. &lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Lors de la première séance de Pico, nous avons soudé quelques cartes telles que le Shield, la carte de leds et la carte 7 segments : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre|205x205px]][[Fichier:CartePin.png|sans_cadre|209x209px]][[Fichier:7_segments.png|sans_cadre|213x213px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre|203x203px]][[Fichier:Back.png|sans_cadre|200x200px]]&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino qui nous servirons pour la communication du bus SPI : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre|169x169px]]&lt;br /&gt;
=== Programmation Ordonnancement ===&lt;br /&gt;
&lt;br /&gt;
==== Clignotement de 2 Leds ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente :   [[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]'''Remarque :''' Les temps ne sont pas réels, l'objectif est donc d'endormir les tâches.   &lt;br /&gt;
&lt;br /&gt;
Voici cette fois le clignotement des 2 Leds avec l'endormissement des tâches :          &lt;br /&gt;
[[Fichier:Ordonnancement Leds serie.mov|vignette|ordonnancement Leds avec endormissement|centré]]&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;
==== Lecture sur port série en mémoire partagée ====&lt;br /&gt;
Par la suite, nous voulons ordonnancer une tâche qui permet de stocker dans une mémoire partagée la valeur reçue sur le port série.  &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons utilisé : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_recevoir(void) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A, RXC0);&amp;lt;/code&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = UDR0;&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;                               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                             &lt;br /&gt;
&lt;br /&gt;
Ici, la variable globale (mémoire partagée) est une variable globale (received_data) en unsigned char.  &lt;br /&gt;
&lt;br /&gt;
Pour lire sur le port série, on utilisera la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
==== Lecture/écriture sur port série ====&lt;br /&gt;
Afin de vérifier le code que nous avons écris dans la partie d'avant, nous écrirons sur le port série ce que nous avons lu. En d'autres termes, nous écrirons sur le port série ce que nous avons écris sur le clavier. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_envoyer(void) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A,UDRE0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UDR0=received_data;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
Sans remettre à '\0' comme ici, lorsque l'on appuie sur une touche, celle-ci s'affiche jusqu'à l'appuie d'une autre touche  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                         &lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ordonnancement port serie.mov|centré|vignette|Ordonnancement sur port série]]&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Nous n'avons pas fait tout ce qui avait été demandé mais nous sommes quand même assez content du résultat puisque nous avons un ordonnanceur qui gère à la fois le clignotement de 2 Leds différentes ainsi que la lecture et l'écriture sur le port série. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Ordonnancement Leds portSerie.mp4|centré|vignette|Ordonnancement port série + Leds]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous devons implémenter un contrôleur de bus série SPI. &lt;br /&gt;
&lt;br /&gt;
Tout d'abord, voici comment fonctionne un bus SPI : &lt;br /&gt;
&lt;br /&gt;
Dans un bus SPI, il y a 1 maître et 1 ou plusieurs esclaves. Le transmission des données se font sur 2 fils : MISO et MOSI : &lt;br /&gt;
&lt;br /&gt;
- MOSI : Données du maître vers l'esclave,&lt;br /&gt;
&lt;br /&gt;
- MISO : Données de l'esclave vers le maître.&lt;br /&gt;
&lt;br /&gt;
Puisqu'il y a plusieurs esclaves, le SS (Ship Select) permet d'autoriser 1 esclave précis en l'activant à 0. &lt;br /&gt;
&lt;br /&gt;
Les échanges se font sur front et sont synchronisés par le maître. &lt;br /&gt;
&lt;br /&gt;
Lorsqu'un octet du maître passe dans le registre de l'esclave, celui de l'esclave passe dans le registre du maître simultanément comme représenté sur l'image ci-dessous. C'est le principe du registre à décalage.&lt;br /&gt;
[[Fichier:Chemin spi.png|centré|sans_cadre]]Le contrôleur SPI doit jouer le rôle du maître et va contrôler les pins du bus SPI pour échanger des données.   &lt;br /&gt;
[[Fichier:Schéma bloc du driver SPI.png|centré|vignette|442x442px]]      &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons écris en VHDL :  &lt;br /&gt;
&lt;br /&gt;
Dans un process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;case ETAT is&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when REPOS =&amp;gt; ETAT &amp;lt;= TRANSMISSION;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when TRANSMISSION =&amp;gt; if compteur = 8 then&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ETAT &amp;lt;= REPOS;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;compteur &amp;lt;= 0;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;else compteur &amp;lt;= compteur + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end if;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for i in 0 to 6 loop&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(i) &amp;lt;= mosi_in(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(i) &amp;lt;= data_out_s(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end loop;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(7) &amp;lt;= data_in_s(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(7) &amp;lt;= mosi_in(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end case;&amp;lt;/code&amp;gt;                                                           &lt;br /&gt;
&lt;br /&gt;
Hors du process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS1 &amp;lt;= '1' when select_carte = &amp;quot;001&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS2 &amp;lt;= '1' when select_carte = &amp;quot;010&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS3 &amp;lt;= '1' when select_carte = &amp;quot;100&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé une machine d'état avec 2 états : un état REPOS qui permet de passer à l'état TRANSMISSION et de mettre à 1 ou à 0 les Chip Select en fonction de la selection d'état que recevra la carte FPGA de la carte mère. Et la fonction transmission qui effectue le registre à décalage.   &lt;br /&gt;
&lt;br /&gt;
Ce code, que vous trouverez dans le git, compile, en revanche nous n'avons pas pu faire de tests dessus malheureusement.  &lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet pour la carte clavier est de lire les boutons qui sont enfoncés afin de les envoyer à la carte mère via le bus SPI. &lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte :  [[Fichier:Schematique_clavier.png|centré|sans_cadre|511x511px]]Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches qui sont : la flèche de gauche, la flèche de droite, l'espace, un retour chariot, le suppression et enfin un shift qui nous permettra de switcher avec les 10 chiffres (de 0 à 9), &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation&lt;br /&gt;
* un ATmega328p&lt;br /&gt;
* un connecteur HE10 8 pins pour un bus SPI + une ligne d'interruption pour communiquer avec la carte mère&lt;br /&gt;
* un connecteur 6 pins(2x3) pour un bus SPI afin de programmer la carte.&lt;br /&gt;
&amp;lt;u&amp;gt;Fonctionnement matrice de touches :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but ici est de pouvoir lire la touche sur laquelle nous avons appuyé pour l'envoyer à la carte mère. Ici, l'idée est d'utiliser le fonctionnement de la matrice de touche qui est le suivant : &lt;br /&gt;
&lt;br /&gt;
Premièrement, il faut se décider duquel entre les lignes et les colonnes seront en entrée et l'autre en sortie. Ici se sont les lignes qui sont en sortie et les colonnes en entrée. &lt;br /&gt;
&lt;br /&gt;
L'idée est simple : alterner entre les lignes pour écrire un 0L sur 1 ligne et sur les autres un 1L. On parcourt ensuite toutes les colonnes (de la ligne à 0L). Si on lit un 0L sur une colonne, alors il suffit d'associer la ligne qui est à 0L avec celle de la colonne et on connait la touche qui a été appuyée. &lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up qui se trouvent au niveau des lignes serviront  à avoir un 1L par défaut. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le routage de la carte : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.&lt;br /&gt;
&lt;br /&gt;
Pour faire ce routage, nous avons dû créer le footprint des boutons, alors la prise des mesures sur le boutons était nécessaire. Aussi, nous avons décidé d'utiliser un ATmega328p avec des pins traversants pour une question de facilité au niveau de la soudure mais également pour éviter tout court-circuit et donc une perte de temps. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]][[Fichier:3d view.png|sans_cadre|235x235px]][[Fichier:3d view bottom.png|sans_cadre|235x235px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réel clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte_soude.jpg|sans_cadre|266x266px]]&lt;br /&gt;
&lt;br /&gt;
=== Partie programmation ===&lt;br /&gt;
La programmation de notre carte se fera via un AVR ISP &lt;br /&gt;
&lt;br /&gt;
Pour cela, on utilise une carte arduino uno dans laquelle on téléverse le programme Arduino ISP, disponible dans les exemples de l'IDE arduino, pour permettre a l'arduino uno d'envoyer notre code vers la carte clavier via le connecteur HE10.   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma AVR ISP.png|centré|400x400px|sans_cadre]]&lt;br /&gt;
Pour flasher notre carte clavier, 2 solutions : &lt;br /&gt;
&lt;br /&gt;
* utiliser l'IDE arduino, en utilisant le paramètre &amp;quot;upload using programmer&amp;quot; qui permet de televerser du code dans une atmega en passant par le bus SPI. Mais cela néccesite d'écrire le code sur l'IDE arduino. Cette solution permettra simplement de faire des tests rapides en utilisant, par exemple, l'exemple &amp;quot;Blink&amp;quot;.&lt;br /&gt;
* Créer un Makefile qui permet de téléverser notre code C vers la carte fille en passant par l'arduino uno :&lt;br /&gt;
[[Fichier:Makefil.png|sans_cadre|450x450px]]  &lt;br /&gt;
&lt;br /&gt;
==== Programme de tests sur la carte ====&lt;br /&gt;
Nous sommes ensuite passés au différents tests de la carte pour tester chaque fonctionnalités.   &lt;br /&gt;
&lt;br /&gt;
===== Premier test : la carte est-elle programmable ? =====&lt;br /&gt;
On utilise un programme très simple qui allume une des LEDs de la carte, le &amp;quot;Blink&amp;quot; disponible dans les exemples de l'IDE arduino. &lt;br /&gt;
&lt;br /&gt;
Cependant, en essayant de programmer la carte, aucune LEDs ne clignotait. Comme le code ne venait pas de nous et qe c'est un code simple, le problème ne pouvait venir que du côté du hardware. Nous avons donc tester notre carte au multimètre et il y avait effectivement un court-circuit au niveau du crystal qui empêchait forcement son fonctionnement. L'erreur vient de notre schématique puisque nous avons tourné à 90° le composant, ce qui créé effectivement un court-circuit. Pour remédier à notre problème, nous avons dé-souder le crystal et l'avons décalé sur la carte. &lt;br /&gt;
&lt;br /&gt;
Une fois le crystal re-soudé dans le bon sens, nous avons pu flasher la carte clavier avec le programme &amp;quot;Blink&amp;quot;&lt;br /&gt;
[[Fichier:Led_allumee_clavier.png|centré|sans_cadre|241x241px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; La LED clignote, ce qui nous permet de valider le faite que la carte est programmable via notre AVR ISP.&lt;br /&gt;
&lt;br /&gt;
===== Deuxième test : la lecture d'un bouton =====&lt;br /&gt;
our commencer les tests, nous cherchons à allumer une LED quand on appuie sur un bouton en particulier. Pour cela, nous avons mis à 0L la ligne sur PC3 et lu la colonne sur PD0 :   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test_clavier.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Id 1bouton.mov|centré|vignette|Reconnaissance d'1 bouton avec une Led]]Ce test nous a permit de vérifier 2 choses : &lt;br /&gt;
&lt;br /&gt;
* que notre carte permet de reconnaître l'appuie sur un bouton &lt;br /&gt;
* que nous arrivions bien à utiliser les Leds de notre carte. Ainsi nous avons nos &amp;quot;calculs&amp;quot; avec les décalages et les opérations logiques utiles pour mettre à 0L ou lire sur le port une entrée.&lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons gardé l'idée d'allumer une Led lorsqu'un bouton est enfoncé.          &lt;br /&gt;
&lt;br /&gt;
'''Problème rencontré :''' Au début nous n'arrivions par à lire le bouton bien que notre code soit simple. Nous avons donc vérifié au multimètre si nos boutons étaient bien soudés. Au multimètre, les 4 broches de chaque bouton étaient reliés (donc en court-circuit), ce n'est absolument pas normal. Effectivement, lorsque nous avions créé les footprints des boutons nous n'avons pas mis les broches au bon endroit. Dans les boutons il y a déjà des broches reliées et dans nos footprint nous n'avons pas mis les bons chiffres des broches correctement : ce qui nous a créé un court-circuit. Pour contrer ce problème, nous avons tourné à 90° chaque bouton. C n'était pas simple car il a fallut redresser les pins pour qu'ils rentrent bien dans les trous de la carte. Finalement les boutons fonctionnent correctement et les boutons restent assez droits.    &lt;br /&gt;
&lt;br /&gt;
===== Troisième test : lecture de tous les boutons + shift =====&lt;br /&gt;
Pour commencer, on definit notre matrice de touches grâce à un tableau à 2 dimensions, ça nous permettra de récupérer directement les bonnes touches.  &lt;br /&gt;
&lt;br /&gt;
Nous voulions mettre notre clavier en AZERTY, malheureusement notre matrice ne nous le permet pas, alors les touches seront dans l'ordre alphabétique. Dans le code, les lettres ne sont pas dans l'ordre simplement parce que lors du routage nous n'avons pas laissé les boutons comme dans la schématique par simplicité de routage : &lt;br /&gt;
[[Fichier:Matrice touches.png|gauche|sans_cadre]]&lt;br /&gt;
&amp;lt;u&amp;gt;traduction des valeurs hexadécimales :&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 0x0E : le shift &lt;br /&gt;
* 0x08 : suppression&lt;br /&gt;
* 0x1C : flèche gauche &lt;br /&gt;
* 0x1D : flèche droite &lt;br /&gt;
&lt;br /&gt;
Ce sont simplement les codes en ASCII. &lt;br /&gt;
[[Fichier:Lecture touches.png|gauche|sans_cadre|400x400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Cette fonction nous permet d'effectuer la lecture d'une touche avec la méthode du clavier matriciel que nous avons expliqué plus haut. &lt;br /&gt;
&lt;br /&gt;
Ainsi, pour chaque ligne à 0L on lira sur chaque colonne et on vérifie si elle est égale à 0L. Si oui, on retourne directement la valeur de la touche en retournant notre matrice de touches avec les indices de la ligne et de la colonne en cours. &lt;br /&gt;
&lt;br /&gt;
Il y a une condition supplémentaire : si la touche appuyée est le shift (0x0E). Dans ce cas, on bascule on recommence la même méthode, mais cette fois on retournera la valeur appuyée mais grâce à la deuxième matrice cette fois puisqu'elle contient les chiffres de 0 à 9. &lt;br /&gt;
&lt;br /&gt;
Ici, l'utilisateur devra appuyer sur le bouton pour les chiffres en même temps que le bouton du shift. &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;
Finalement, notre clavier ce présent comme ceci : &lt;br /&gt;
[[Fichier:Tableau du clavier.png|gauche|Clavier sans appuie sur SHIFT|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma clavier avec appuie sur SHIFT.png|clavier avec appuie sur SHIFT|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous aurions voulu faire un clavier AZERTY mais la matrice n'est pas de la bonne forme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Quatrième test : le bus SPI =====&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie est d'envoyer les touches lues par le clavier vers la carte mère grâce au bus SPI.  &lt;br /&gt;
&lt;br /&gt;
Coté carte fille, le bus SPI est utilisé en interruption. Lorsque qu'une donnée est envoyé sur le MOSI, la programme du clavier rentre dans une interruption (ISR) pour renvoyer une info sur le MISO. &lt;br /&gt;
&lt;br /&gt;
Cela nous permet par exemple d'envoyer une valeur sur le MOSI, et de récupérer une donnée sur le MISO en fonction de la valeur envoyé depuis le MOSI. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ISR(SPI_STC_vect) {&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   char data = SPDR;&amp;lt;/code&amp;gt;                   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   _delay_ms(40);&amp;lt;/code&amp;gt;                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   if(data == 0x00) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = '!';&amp;lt;/code&amp;gt;                     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x05) {&amp;lt;/code&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = bouton;&amp;lt;/code&amp;gt;                      bouton : touche qui a été appuyée  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication de la communication en bus SPI :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, l'idée est de communiquer avec la carte mère. Pour cela, voici un schéma explicatif de notre méthode de communication : &lt;br /&gt;
 [[Fichier:Schéma communication SPI.png|centré|cadre]] &lt;br /&gt;
&lt;br /&gt;
Lorsque la carte clavier lie une touche, la ligne d'interruption passe à l'état haut. &lt;br /&gt;
&lt;br /&gt;
La carte mère rentre en interruption et va alors demander quelle carte a déclenché l'interruption. &lt;br /&gt;
&lt;br /&gt;
Si c'est la carte clavier qui a déclenché l'interruption alors le carte mère demande le nombre de touche à récupérer, puis récupère une a une les touches.  &lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' la taille du tampon sera, le plus souvent, égale à 1 puisque le microcontrôleur est plus rapide que l'humain qui tape au clavier. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de tester notre communication SPI, nous avons utiliser un Arduino uno qui &amp;quot;remplace&amp;quot; la carte mère. et qui envoi les valeurs 0x00, 0x01 ou 0x05, le carte mère à la lecture de la valeur doit répondre par une autre valeur. &lt;br /&gt;
&lt;br /&gt;
En revanche, après beaucoup de tests non concluant,  la communication ne fonctionnait pas. Nous avons alors regardé à l’oscilloscope l'allure de nos signaux MISO et MOSI :  &lt;br /&gt;
&lt;br /&gt;
* Le MOSI était cohérent avec les données envoyées&lt;br /&gt;
* Le MISO en revanche a des valeurs de tensions écrasées, ce qui fait que la valeur récupérée par le maitre est toujours nulle.&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:MOSI.png|gauche|vignette|MOSI]]&lt;br /&gt;
[[Fichier:MISO.png|centré|vignette|MISO|290x290px]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; Après de nombreux essais sur différents shield, le bus SPI de certaines cartes ne fonctionnent pas, et d'autres fonctionnent, et ce même avec un code identiques. C'est assez troublant puisque même avec la dernière carte modifiée et soudée par M. Redon, le bus SPI ne fonctionne pas avec notre code. La seule carte avec laquelle nos programmes fonctionnent, c'est avec celle du groupe 9. Les shields des binômes 4,5 et 6 ont ce problème.                  &lt;br /&gt;
===== Cinquième test : affichage sur le port série =====&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier plus précisément notre communication SPI, nous avons utiliser le port série de l'arduino uno pour pouvoir voir les données qui sont envoyé depuis la carte clavier, et ainsi s'assurer que quand on appuie sur une touche du clavier, la carte mère récupère bien le code ASCII de cette touche. &lt;br /&gt;
&lt;br /&gt;
Pour ce faire, nous utilisons la même fonction &amp;lt;code&amp;gt;serie_envoyer()&amp;lt;/code&amp;gt; que dans l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                        &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_activer();&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(20);&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     data_recue = spi_envoi(0x05);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     serie_envoyer(data_recue);&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_desactiver();&amp;lt;/code&amp;gt;            &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(100);&amp;lt;/code&amp;gt;              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
Le but étant, ici, d'envoyer directement la demande de touche et de l'afficher directement sur le port série grâce au &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Clavier sansINT shift.mp4|centré|vignette|Envoi des boutons lu par SPI]]&lt;br /&gt;
&lt;br /&gt;
===== Sixième test : identification et bouton =====&lt;br /&gt;
Maintenant, puisque l'objectif est d'avoir une communication avec la carte mère, nous avons testé un programme qui envoi la demande d'identification, puis après la réponse, il envoi la demande de bouton. Notre carte clavier répond alors par ces demandes. Nous utilisons toujours une variable globale qui récupère le caractère reçu lorsqu'un bouton a été enfoncé. &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo de la communication entre le maitre et le clavier : &lt;br /&gt;
&lt;br /&gt;
 [[Fichier:Id bouton.mov|centré|vignette|Identification + bouton avec variable globale]] &lt;br /&gt;
&lt;br /&gt;
==== Programme final ====&lt;br /&gt;
Finalement, l'idée est de stocker les touches appuyées dans un tableau, pour pouvoir les envoyer à la carte mère lorsqu'elle le demande. Avant la demande de touche, la carte mère envoi la donnée 0x00 pour que l'on réponde que la carte est un clavier avec le caractère '!'. Nous avons décidé d'utilisé cette réponse seulement pour que l'on puisse l'afficher sur le port série (0x05 étant un caractère non imprimable). &lt;br /&gt;
&lt;br /&gt;
Voici les fonctions qui permettent d'ajouter et de supprimer les touches du tampon : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void remplir_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[cpt_tampon] = bouton;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon++;&amp;lt;/code&amp;gt;                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void vider_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for (int i=0; i &amp;lt; cpt_tampon; i++) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if (i == cpt_tampon - 1 ) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;} else {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = tampon[i+1];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon--;&amp;lt;/code&amp;gt;                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
L'idée est de vider le  tampon à chaque fois que l'on envoi le tableau à la case 0 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(data == 0x05) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SPDR = tampon[0];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;vider_tampon();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(cpt_tampon == 0) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PC4);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                &lt;br /&gt;
&lt;br /&gt;
En conclusion, le programme de la carte mère envoi la demande d'identification (0x00) ainsi que la demande de touche. Et le programme du clavier envoi le caractère '!', et par la suite la touche du tampon. &lt;br /&gt;
[[Fichier:Id touche tampon.mov|centré|cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' ce code n'est pas parfait puisqu'il écrit 1 fois de trop le caractère. Ex : si on appuie sur 'A', on lira sur le port série 'A', en revanche si on appuie juste après sur 'B', on lira 'A' puis 'B'. Nous n'avons malheureusement pas pu décoder cette erreur. &lt;br /&gt;
&lt;br /&gt;
==== Points importants à savoir ====&lt;br /&gt;
il faut débrancher et rebrancher le câble du bus SPI pour que la communication fonctionne. Aussi, si le programme du maître ne s'injecte pas dans l'Arduino, il faut insérer d'abord un programme d'exemple comme ArduinoISP. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons mis à part des programmes fonctionnels dans les répertoires nommés &amp;quot;Codes_OK&amp;quot;. Tout est expliqué dans des README qui se trouvent (presque) dans chaque répertoire. Un README qui se trouve dans le répertoire clavier/Code explique ce que les combinaisons de codes du maître et de l'esclave font. Des vidéos se trouvent également dans le répertoire Videos, qui montrent la fonctionnalité de chaque codes. Il y a d'ailleurs &amp;lt;u&amp;gt;plus (+) de vidéos&amp;lt;/u&amp;gt; sur le git. &lt;br /&gt;
 &lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Notre carte clavier est capable de lire chacune des touches et associe a chacune d'elle un caractère ASCII. Le clavier possède aussi un système de shift pour pouvoir taper les chiffres de 0 à 9. La précision du clavier n'est pas optimale et va parfois lire 2 fois la même touche quand on appuie sur un bouton. Il faudrait, pour corriger ça, retravailler les différents délais mais nous avons déjà passée pas mal de temps à régler nos délais sans trouver le timing parfait, si il existe.&lt;br /&gt;
&lt;br /&gt;
Notre bus SPI nous permet d'envoyer les touches du clavier vers la carte mère mais aussi d'identifier la carte clavier. Néanmoins l’ajout de notre système de tampon introduit un décalage d’une touche dans l’envoie des touches que nous avons pas su corriger.  &lt;br /&gt;
&lt;br /&gt;
Les primitives à incorporer dans la carte mère correspondent aux code que nous avons écrit dans l’arduino uno utilisé comme master spi.  &lt;br /&gt;
&lt;br /&gt;
Nous sommes tout de même assez content de notre travail puisque nous arrivons à bien envoyer par SPI, que ce soit des lettres (1ère matrice clavier) ou des chiffres (2ème matrice clavier). Nous avons perdu beaucoup de temps sur la gestion du bus SPI à cause notamment des boucliers qui déformaient le signal MISO, mais après des observations à l’oscilloscope nous avons su trouver la cause de notre problème. Nous avons réussi à gérer l'ISR du SPI. Nous nous sommes alors améliorés tous les 2 que ce soit en software ou en hardware.&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3153</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3153"/>
		<updated>2024-01-18T16:42:53Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Sixième test : identification et bouton */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous n'arrivez pas à lire les vidéos du wiki, nous les avons mis dans notre Git avec des Readme pour bien savoir ce qu'elles font et avec le code inséré. Les vidéos sur le git sont de meilleures qualités. &lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Lors de la première séance de Pico, nous avons soudé quelques cartes telles que le Shield, la carte de leds et la carte 7 segments : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre|205x205px]][[Fichier:CartePin.png|sans_cadre|209x209px]][[Fichier:7_segments.png|sans_cadre|213x213px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre|203x203px]][[Fichier:Back.png|sans_cadre|200x200px]]&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino qui nous servirons pour la communication du bus SPI : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre|169x169px]]&lt;br /&gt;
=== Programmation Ordonnancement ===&lt;br /&gt;
&lt;br /&gt;
==== Clignotement de 2 Leds ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente :   [[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]'''Remarque :''' Les temps ne sont pas réels, l'objectif est donc d'endormir les tâches.   &lt;br /&gt;
&lt;br /&gt;
Voici cette fois le clignotement des 2 Leds avec l'endormissement des tâches :          &lt;br /&gt;
[[Fichier:Ordonnancement Leds serie.mov|vignette|ordonnancement Leds avec endormissement|centré]]&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;
==== Lecture sur port série en mémoire partagée ====&lt;br /&gt;
Par la suite, nous voulons ordonnancer une tâche qui permet de stocker dans une mémoire partagée la valeur reçue sur le port série.  &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons utilisé : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_recevoir(void) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A, RXC0);&amp;lt;/code&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = UDR0;&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;                               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                             &lt;br /&gt;
&lt;br /&gt;
Ici, la variable globale (mémoire partagée) est une variable globale (received_data) en unsigned char.  &lt;br /&gt;
&lt;br /&gt;
Pour lire sur le port série, on utilisera la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
==== Lecture/écriture sur port série ====&lt;br /&gt;
Afin de vérifier le code que nous avons écris dans la partie d'avant, nous écrirons sur le port série ce que nous avons lu. En d'autres termes, nous écrirons sur le port série ce que nous avons écris sur le clavier. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_envoyer(void) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A,UDRE0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UDR0=received_data;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
Sans remettre à '\0' comme ici, lorsque l'on appuie sur une touche, celle-ci s'affiche jusqu'à l'appuie d'une autre touche  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                         &lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ordonnancement port serie.mov|centré|vignette|Ordonnancement sur port série]]&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Nous n'avons pas fait tout ce qui avait été demandé mais nous sommes quand même assez content du résultat puisque nous avons un ordonnanceur qui gère à la fois le clignotement de 2 Leds différentes ainsi que la lecture et l'écriture sur le port série. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Ordonnancement Leds portSerie.mp4|centré|vignette|Ordonnancement port série + Leds]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous devons implémenter un contrôleur de bus série SPI. &lt;br /&gt;
&lt;br /&gt;
Tout d'abord, voici comment fonctionne un bus SPI : &lt;br /&gt;
&lt;br /&gt;
Dans un bus SPI, il y a 1 maître et 1 ou plusieurs esclaves. Le transmission des données se font sur 2 fils : MISO et MOSI : &lt;br /&gt;
&lt;br /&gt;
- MOSI : Données du maître vers l'esclave,&lt;br /&gt;
&lt;br /&gt;
- MISO : Données de l'esclave vers le maître.&lt;br /&gt;
&lt;br /&gt;
Puisqu'il y a plusieurs esclaves, le SS (Ship Select) permet d'autoriser 1 esclave précis en l'activant à 0. &lt;br /&gt;
&lt;br /&gt;
Les échanges se font sur front et sont synchronisés par le maître. &lt;br /&gt;
&lt;br /&gt;
Lorsqu'un octet du maître passe dans le registre de l'esclave, celui de l'esclave passe dans le registre du maître simultanément comme représenté sur l'image ci-dessous. C'est le principe du registre à décalage.&lt;br /&gt;
[[Fichier:Chemin spi.png|centré|sans_cadre]]Le contrôleur SPI doit jouer le rôle du maître et va contrôler les pins du bus SPI pour échanger des données.   &lt;br /&gt;
[[Fichier:Schéma bloc du driver SPI.png|centré|vignette|442x442px]]      &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons écris en VHDL :  &lt;br /&gt;
&lt;br /&gt;
Dans un process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;case ETAT is&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when REPOS =&amp;gt; ETAT &amp;lt;= TRANSMISSION;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when TRANSMISSION =&amp;gt; if compteur = 8 then&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ETAT &amp;lt;= REPOS;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;compteur &amp;lt;= 0;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;else compteur &amp;lt;= compteur + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end if;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for i in 0 to 6 loop&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(i) &amp;lt;= mosi_in(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(i) &amp;lt;= data_out_s(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end loop;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(7) &amp;lt;= data_in_s(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(7) &amp;lt;= mosi_in(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end case;&amp;lt;/code&amp;gt;                                                           &lt;br /&gt;
&lt;br /&gt;
Hors du process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS1 &amp;lt;= '1' when select_carte = &amp;quot;001&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS2 &amp;lt;= '1' when select_carte = &amp;quot;010&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS3 &amp;lt;= '1' when select_carte = &amp;quot;100&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé une machine d'état avec 2 états : un état REPOS qui permet de passer à l'état TRANSMISSION et de mettre à 1 ou à 0 les Chip Select en fonction de la selection d'état que recevra la carte FPGA de la carte mère. Et la fonction transmission qui effectue le registre à décalage.   &lt;br /&gt;
&lt;br /&gt;
Ce code, que vous trouverez dans le git, compile, en revanche nous n'avons pas pu faire de tests dessus malheureusement.  &lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet pour la carte clavier est de lire les boutons qui sont enfoncés afin de les envoyer à la carte mère via le bus SPI. &lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte :  [[Fichier:Schematique_clavier.png|centré|sans_cadre|511x511px]]Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches qui sont : la flèche de gauche, la flèche de droite, l'espace, un retour chariot, le suppression et enfin un shift qui nous permettra de switcher avec les 10 chiffres (de 0 à 9), &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation&lt;br /&gt;
* un ATmega328p&lt;br /&gt;
* un connecteur HE10 8 pins pour un bus SPI + une ligne d'interruption pour communiquer avec la carte mère&lt;br /&gt;
* un connecteur 6 pins(2x3) pour un bus SPI afin de programmer la carte.&lt;br /&gt;
&amp;lt;u&amp;gt;Fonctionnement matrice de touches :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but ici est de pouvoir lire la touche sur laquelle nous avons appuyé pour l'envoyer à la carte mère. Ici, l'idée est d'utiliser le fonctionnement de la matrice de touche qui est le suivant : &lt;br /&gt;
&lt;br /&gt;
Premièrement, il faut se décider duquel entre les lignes et les colonnes seront en entrée et l'autre en sortie. Ici se sont les lignes qui sont en sortie et les colonnes en entrée. &lt;br /&gt;
&lt;br /&gt;
L'idée est simple : alterner entre les lignes pour écrire un 0L sur 1 ligne et sur les autres un 1L. On parcourt ensuite toutes les colonnes (de la ligne à 0L). Si on lit un 0L sur une colonne, alors il suffit d'associer la ligne qui est à 0L avec celle de la colonne et on connait la touche qui a été appuyée. &lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up qui se trouvent au niveau des lignes serviront  à avoir un 1L par défaut. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le routage de la carte : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.&lt;br /&gt;
&lt;br /&gt;
Pour faire ce routage, nous avons dû créer le footprint des boutons, alors la prise des mesures sur le boutons était nécessaire. Aussi, nous avons décidé d'utiliser un ATmega328p avec des pins traversants pour une question de facilité au niveau de la soudure mais également pour éviter tout court-circuit et donc une perte de temps. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]][[Fichier:3d view.png|sans_cadre|235x235px]][[Fichier:3d view bottom.png|sans_cadre|235x235px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réel clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte_soude.jpg|sans_cadre|266x266px]]&lt;br /&gt;
&lt;br /&gt;
=== Partie programmation ===&lt;br /&gt;
La programmation de notre carte se fera via un AVR ISP &lt;br /&gt;
&lt;br /&gt;
Pour cela, on utilise une carte arduino uno dans laquelle on téléverse le programme Arduino ISP, disponible dans les exemples de l'IDE arduino, pour permettre a l'arduino uno d'envoyer notre code vers la carte clavier via le connecteur HE10.   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma AVR ISP.png|centré|400x400px|sans_cadre]]&lt;br /&gt;
Pour flasher notre carte clavier, 2 solutions : &lt;br /&gt;
&lt;br /&gt;
* utiliser l'IDE arduino, en utilisant le paramètre &amp;quot;upload using programmer&amp;quot; qui permet de televerser du code dans une atmega en passant par le bus SPI. Mais cela néccesite d'écrire le code sur l'IDE arduino. Cette solution permettra simplement de faire des tests rapides en utilisant, par exemple, l'exemple &amp;quot;Blink&amp;quot;.&lt;br /&gt;
* Créer un Makefile qui permet de téléverser notre code C vers la carte fille en passant par l'arduino uno :&lt;br /&gt;
[[Fichier:Makefil.png|sans_cadre|450x450px]]  &lt;br /&gt;
&lt;br /&gt;
==== Programme de tests sur la carte ====&lt;br /&gt;
Nous sommes ensuite passés au différents tests de la carte pour tester chaque fonctionnalités.   &lt;br /&gt;
&lt;br /&gt;
===== Premier test : la carte est-elle programmable ? =====&lt;br /&gt;
On utilise un programme très simple qui allume une des LEDs de la carte, le &amp;quot;Blink&amp;quot; disponible dans les exemples de l'IDE arduino. &lt;br /&gt;
&lt;br /&gt;
Cependant, en essayant de programmer la carte, aucune LEDs ne clignotait. Comme le code ne venait pas de nous et qe c'est un code simple, le problème ne pouvait venir que du côté du hardware. Nous avons donc tester notre carte au multimètre et il y avait effectivement un court-circuit au niveau du crystal qui empêchait forcement son fonctionnement. L'erreur vient de notre schématique puisque nous avons tourné à 90° le composant, ce qui créé effectivement un court-circuit. Pour remédier à notre problème, nous avons dé-souder le crystal et l'avons décalé sur la carte. &lt;br /&gt;
&lt;br /&gt;
Une fois le crystal re-soudé dans le bon sens, nous avons pu flasher la carte clavier avec le programme &amp;quot;Blink&amp;quot;&lt;br /&gt;
[[Fichier:Led_allumee_clavier.png|centré|sans_cadre|241x241px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; La LED clignote, ce qui nous permet de valider le faite que la carte est programmable via notre AVR ISP.&lt;br /&gt;
&lt;br /&gt;
===== Deuxième test : la lecture d'un bouton =====&lt;br /&gt;
our commencer les tests, nous cherchons à allumer une LED quand on appuie sur un bouton en particulier. Pour cela, nous avons mis à 0L la ligne sur PC3 et lu la colonne sur PD0 :   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test_clavier.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Id 1bouton.mov|centré|vignette|Reconnaissance d'1 bouton avec une Led]]Ce test nous a permit de vérifier 2 choses : &lt;br /&gt;
&lt;br /&gt;
* que notre carte permet de reconnaître l'appuie sur un bouton &lt;br /&gt;
* que nous arrivions bien à utiliser les Leds de notre carte. Ainsi nous avons nos &amp;quot;calculs&amp;quot; avec les décalages et les opérations logiques utiles pour mettre à 0L ou lire sur le port une entrée.&lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons gardé l'idée d'allumer une Led lorsqu'un bouton est enfoncé.          &lt;br /&gt;
&lt;br /&gt;
'''Problème rencontré :''' Au début nous n'arrivions par à lire le bouton bien que notre code soit simple. Nous avons donc vérifié au multimètre si nos boutons étaient bien soudés. Au multimètre, les 4 broches de chaque bouton étaient reliés (donc en court-circuit), ce n'est absolument pas normal. Effectivement, lorsque nous avions créé les footprints des boutons nous n'avons pas mis les broches au bon endroit. Dans les boutons il y a déjà des broches reliées et dans nos footprint nous n'avons pas mis les bons chiffres des broches correctement : ce qui nous a créé un court-circuit. Pour contrer ce problème, nous avons tourné à 90° chaque bouton. C n'était pas simple car il a fallut redresser les pins pour qu'ils rentrent bien dans les trous de la carte. Finalement les boutons fonctionnent correctement et les boutons restent assez droits.    &lt;br /&gt;
&lt;br /&gt;
===== Troisième test : lecture de tous les boutons + shift =====&lt;br /&gt;
Pour commencer, on definit notre matrice de touches grâce à un tableau à 2 dimensions, ça nous permettra de récupérer directement les bonnes touches.  &lt;br /&gt;
&lt;br /&gt;
Nous voulions mettre notre clavier en AZERTY, malheureusement notre matrice ne nous le permet pas, alors les touches seront dans l'ordre alphabétique. Dans le code, les lettres ne sont pas dans l'ordre simplement parce que lors du routage nous n'avons pas laissé les boutons comme dans la schématique par simplicité de routage : &lt;br /&gt;
[[Fichier:Matrice touches.png|gauche|sans_cadre]]&lt;br /&gt;
&amp;lt;u&amp;gt;traduction des valeurs hexadécimales :&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 0x0E : le shift &lt;br /&gt;
* 0x08 : suppression&lt;br /&gt;
* 0x1C : flèche gauche &lt;br /&gt;
* 0x1D : flèche droite &lt;br /&gt;
&lt;br /&gt;
Ce sont simplement les codes en ASCII. &lt;br /&gt;
[[Fichier:Lecture touches.png|gauche|sans_cadre|400x400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Cette fonction nous permet d'effectuer la lecture d'une touche avec la méthode du clavier matriciel que nous avons expliqué plus haut. &lt;br /&gt;
&lt;br /&gt;
Ainsi, pour chaque ligne à 0L on lira sur chaque colonne et on vérifie si elle est égale à 0L. Si oui, on retourne directement la valeur de la touche en retournant notre matrice de touches avec les indices de la ligne et de la colonne en cours. &lt;br /&gt;
&lt;br /&gt;
Il y a une condition supplémentaire : si la touche appuyée est le shift (0x0E). Dans ce cas, on bascule on recommence la même méthode, mais cette fois on retournera la valeur appuyée mais grâce à la deuxième matrice cette fois puisqu'elle contient les chiffres de 0 à 9. &lt;br /&gt;
&lt;br /&gt;
Ici, l'utilisateur devra appuyer sur le bouton pour les chiffres en même temps que le bouton du shift. &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;
Finalement, notre clavier ce présent comme ceci : &lt;br /&gt;
[[Fichier:Tableau du clavier.png|gauche|Clavier sans appuie sur SHIFT|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma clavier avec appuie sur SHIFT.png|clavier avec appuie sur SHIFT|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous aurions voulu faire un clavier AZERTY mais la matrice n'est pas de la bonne forme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Quatrième test : le bus SPI =====&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie est d'envoyer les touches lues par le clavier vers la carte mère grâce au bus SPI.  &lt;br /&gt;
&lt;br /&gt;
Coté carte fille, le bus SPI est utilisé en interruption. Lorsque qu'une donnée est envoyé sur le MOSI, la programme du clavier rentre dans une interruption (ISR) pour renvoyer une info sur le MISO. &lt;br /&gt;
&lt;br /&gt;
Cela nous permet par exemple d'envoyer une valeur sur le MOSI, et de récupérer une donnée sur le MISO en fonction de la valeur envoyé depuis le MOSI. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ISR(SPI_STC_vect) {&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   char data = SPDR;&amp;lt;/code&amp;gt;                   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   _delay_ms(40);&amp;lt;/code&amp;gt;                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   if(data == 0x00) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = '!';&amp;lt;/code&amp;gt;                     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x05) {&amp;lt;/code&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = bouton;&amp;lt;/code&amp;gt;                      bouton : touche qui a été appuyée  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication de la communication en bus SPI :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, l'idée est de communiquer avec la carte mère. Pour cela, voici un schéma explicatif de notre méthode de communication : &lt;br /&gt;
 [[Fichier:Schéma communication SPI.png|centré|cadre]] &lt;br /&gt;
&lt;br /&gt;
Lorsque la carte clavier lie une touche, la ligne d'interruption passe à l'état haut. &lt;br /&gt;
&lt;br /&gt;
La carte mère rentre en interruption et va alors demander quelle carte a déclenché l'interruption. &lt;br /&gt;
&lt;br /&gt;
Si c'est la carte clavier qui a déclenché l'interruption alors le carte mère demande le nombre de touche à récupérer, puis récupère une a une les touches.  &lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' la taille du tampon sera, le plus souvent, égale à 1 puisque le microcontrôleur est plus rapide que l'humain qui tape au clavier. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de tester notre communication SPI, nous avons utiliser un Arduino uno qui &amp;quot;remplace&amp;quot; la carte mère. et qui envoi les valeurs 0x00, 0x01 ou 0x05, le carte mère à la lecture de la valeur doit répondre par une autre valeur. &lt;br /&gt;
&lt;br /&gt;
En revanche, après beaucoup de tests non concluant,  la communication ne fonctionnait pas. Nous avons alors regardé à l’oscilloscope l'allure de nos signaux MISO et MOSI :  &lt;br /&gt;
&lt;br /&gt;
* Le MOSI était cohérent avec les données envoyées&lt;br /&gt;
* Le MISO en revanche a des valeurs de tensions écrasées, ce qui fait que la valeur récupérée par le maitre est toujours nulle.&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:MOSI.png|gauche|vignette|MOSI]]&lt;br /&gt;
[[Fichier:MISO.png|centré|vignette|MISO|290x290px]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; Après de nombreux essais sur différents shield, le bus SPI de certaines cartes ne fonctionnent pas, et d'autres fonctionnent, et ce même avec un code identiques. C'est assez troublant puisque même avec la dernière carte modifiée et soudée par M. Redon, le bus SPI ne fonctionne pas avec notre code. La seule carte avec laquelle nos programmes fonctionnent, c'est avec celle du groupe 9. Les shields des binômes 4,5 et 6 ont ce problème.                  &lt;br /&gt;
===== Cinquième test : affichage sur le port série =====&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier plus précisément notre communication SPI, nous avons utiliser le port série de l'arduino uno pour pouvoir voir les données qui sont envoyé depuis la carte clavier, et ainsi s'assurer que quand on appuie sur une touche du clavier, la carte mère récupère bien le code ASCII de cette touche. &lt;br /&gt;
&lt;br /&gt;
Pour ce faire, nous utilisons la même fonction &amp;lt;code&amp;gt;serie_envoyer()&amp;lt;/code&amp;gt; que dans l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                        &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_activer();&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(20);&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     data_recue = spi_envoi(0x05);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     serie_envoyer(data_recue);&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_desactiver();&amp;lt;/code&amp;gt;            &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(100);&amp;lt;/code&amp;gt;              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
Le but étant, ici, d'envoyer directement la demande de touche et de l'afficher directement sur le port série grâce au &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Clavier sansINT shift.mp4|centré|vignette|Envoi des boutons lu par SPI]]&lt;br /&gt;
&lt;br /&gt;
===== Sixième test : identification et bouton =====&lt;br /&gt;
Maintenant, puisque l'objectif est d'avoir une communication avec la carte mère, nous avons testé un programme qui envoi la demande d'identification, puis après la réponse, il envoi la demande de bouton. Notre carte clavier répond alors par ces demandes. Nous utilisons toujours une variable globale qui récupère le caractère reçu lorsqu'un bouton a été enfoncé. &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo de la communication entre le maitre et le clavier : &lt;br /&gt;
&lt;br /&gt;
Programme final&lt;br /&gt;
Finalement, l'idée est de stocker les touches appuyées dans un tableau, pour pouvoir les envoyer à la carte mère lorsqu'elle le demande. Avant la demande de touche, la carte mère envoi la donnée 0x00 pour que l'on réponde que la carte est un clavier avec le caractère '!'. Nous avons décidé d'utilisé cette réponse seulement pour que l'on puisse l'afficher sur le port série (0x05 étant un caractère non imprimable). &lt;br /&gt;
&lt;br /&gt;
Voici les fonctions qui permettent d'ajouter et de supprimer les touches du tampon : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void remplir_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[cpt_tampon] = bouton;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon++;&amp;lt;/code&amp;gt;                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void vider_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for (int i=0; i &amp;lt; cpt_tampon; i++) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if (i == cpt_tampon - 1 ) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;} else {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = tampon[i+1];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon--;&amp;lt;/code&amp;gt;                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
L'idée est de vider le  tampon à chaque fois que l'on envoi le tableau à la case 0 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(data == 0x05) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SPDR = tampon[0];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;vider_tampon();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(cpt_tampon == 0) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PC4);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                &lt;br /&gt;
&lt;br /&gt;
En conclusion, le programme de la carte mère envoi la demande d'identification (0x00) ainsi que la demande de touche. Et le programme du clavier envoi le caractère '!', et par la suite la touche du tampon. &lt;br /&gt;
[[Fichier:Id touche tampon.mov|centré|cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' ce code n'est pas parfait puisqu'il écrit 1 fois de trop le caractère. Ex : si on appuie sur 'A', on lira sur le port série 'A', en revanche si on appuie juste après sur 'B', on lira 'A' puis 'B'. Nous n'avons malheureusement pas pu décoder cette erreur. &lt;br /&gt;
&lt;br /&gt;
==== Points importants à savoir ====&lt;br /&gt;
il faut débrancher et rebrancher le câble du bus SPI pour que la communication fonctionne. Aussi, si le programme du maître ne s'injecte pas dans l'Arduino, il faut insérer d'abord un programme d'exemple comme ArduinoISP. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons mis à part des programmes fonctionnels dans les répertoires nommés &amp;quot;Codes_OK&amp;quot;. Tout est expliqué dans des README qui se trouvent (presque) dans chaque répertoire. Un README qui se trouve dans le répertoire clavier/Code explique ce que les combinaisons de codes du maître et de l'esclave font. Des vidéos se trouvent également dans le répertoire Videos, qui montrent la fonctionnalité de chaque codes. Il y a d'ailleurs &amp;lt;u&amp;gt;plus (+) de vidéos&amp;lt;/u&amp;gt; sur le git. &lt;br /&gt;
 &lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Notre carte clavier est capable de lire chacune des touches et associe a chacune d'elle un caractère ASCII. Le clavier possède aussi un système de shift pour pouvoir taper les chiffres de 0 à 9. La précision du clavier n'est pas optimale et va parfois lire 2 fois la même touche quand on appuie sur un bouton. Il faudrait, pour corriger ça, retravailler les différents délais mais nous avons déjà passée pas mal de temps à régler nos délais sans trouver le timing parfait, si il existe.&lt;br /&gt;
&lt;br /&gt;
Notre bus SPI nous permet d'envoyer les touches du clavier vers la carte mère mais aussi d'identifier la carte clavier. &lt;br /&gt;
&lt;br /&gt;
Nous sommes tout de même assez content de notre travail puisque nous arrivons à bien envoyer par SPI, que ce soit des lettres (1ère matrice) ou des chiffres (2ème matrice). Nous avons pris pas mal de temps à gérer la gestion de la matrice de boutons et avons finalement réussi, nous avons réussi à gérer l'ISR et aussi le bus SPI. Nous nous sommes alors améliorés tous les 2 que ce soit en software ou en hardware.&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3149</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3149"/>
		<updated>2024-01-18T16:41:42Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Sixième test : identification et bouton */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous n'arrivez pas à lire les vidéos du wiki, nous les avons mis dans notre Git avec des Readme pour bien savoir ce qu'elles font et avec le code inséré. Les vidéos sur le git sont de meilleures qualités. &lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Lors de la première séance de Pico, nous avons soudé quelques cartes telles que le Shield, la carte de leds et la carte 7 segments : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre|205x205px]][[Fichier:CartePin.png|sans_cadre|209x209px]][[Fichier:7_segments.png|sans_cadre|213x213px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre|203x203px]][[Fichier:Back.png|sans_cadre|200x200px]]&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino qui nous servirons pour la communication du bus SPI : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre|169x169px]]&lt;br /&gt;
=== Programmation Ordonnancement ===&lt;br /&gt;
&lt;br /&gt;
==== Clignotement de 2 Leds ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente :   [[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]'''Remarque :''' Les temps ne sont pas réels, l'objectif est donc d'endormir les tâches.   &lt;br /&gt;
&lt;br /&gt;
Voici cette fois le clignotement des 2 Leds avec l'endormissement des tâches :          &lt;br /&gt;
[[Fichier:Ordonnancement Leds serie.mov|vignette|ordonnancement Leds avec endormissement|centré]]&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;
==== Lecture sur port série en mémoire partagée ====&lt;br /&gt;
Par la suite, nous voulons ordonnancer une tâche qui permet de stocker dans une mémoire partagée la valeur reçue sur le port série.  &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons utilisé : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_recevoir(void) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A, RXC0);&amp;lt;/code&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = UDR0;&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;                               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                             &lt;br /&gt;
&lt;br /&gt;
Ici, la variable globale (mémoire partagée) est une variable globale (received_data) en unsigned char.  &lt;br /&gt;
&lt;br /&gt;
Pour lire sur le port série, on utilisera la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
==== Lecture/écriture sur port série ====&lt;br /&gt;
Afin de vérifier le code que nous avons écris dans la partie d'avant, nous écrirons sur le port série ce que nous avons lu. En d'autres termes, nous écrirons sur le port série ce que nous avons écris sur le clavier. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_envoyer(void) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A,UDRE0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UDR0=received_data;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
Sans remettre à '\0' comme ici, lorsque l'on appuie sur une touche, celle-ci s'affiche jusqu'à l'appuie d'une autre touche  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                         &lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ordonnancement port serie.mov|centré|vignette|Ordonnancement sur port série]]&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Nous n'avons pas fait tout ce qui avait été demandé mais nous sommes quand même assez content du résultat puisque nous avons un ordonnanceur qui gère à la fois le clignotement de 2 Leds différentes ainsi que la lecture et l'écriture sur le port série. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Ordonnancement Leds portSerie.mp4|centré|vignette|Ordonnancement port série + Leds]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous devons implémenter un contrôleur de bus série SPI. &lt;br /&gt;
&lt;br /&gt;
Tout d'abord, voici comment fonctionne un bus SPI : &lt;br /&gt;
&lt;br /&gt;
Dans un bus SPI, il y a 1 maître et 1 ou plusieurs esclaves. Le transmission des données se font sur 2 fils : MISO et MOSI : &lt;br /&gt;
&lt;br /&gt;
- MOSI : Données du maître vers l'esclave,&lt;br /&gt;
&lt;br /&gt;
- MISO : Données de l'esclave vers le maître.&lt;br /&gt;
&lt;br /&gt;
Puisqu'il y a plusieurs esclaves, le SS (Ship Select) permet d'autoriser 1 esclave précis en l'activant à 0. &lt;br /&gt;
&lt;br /&gt;
Les échanges se font sur front et sont synchronisés par le maître. &lt;br /&gt;
&lt;br /&gt;
Lorsqu'un octet du maître passe dans le registre de l'esclave, celui de l'esclave passe dans le registre du maître simultanément comme représenté sur l'image ci-dessous. C'est le principe du registre à décalage.&lt;br /&gt;
[[Fichier:Chemin spi.png|centré|sans_cadre]]Le contrôleur SPI doit jouer le rôle du maître et va contrôler les pins du bus SPI pour échanger des données.   &lt;br /&gt;
[[Fichier:Schéma bloc du driver SPI.png|centré|vignette|442x442px]]      &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons écris en VHDL :  &lt;br /&gt;
&lt;br /&gt;
Dans un process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;case ETAT is&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when REPOS =&amp;gt; ETAT &amp;lt;= TRANSMISSION;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when TRANSMISSION =&amp;gt; if compteur = 8 then&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ETAT &amp;lt;= REPOS;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;compteur &amp;lt;= 0;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;else compteur &amp;lt;= compteur + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end if;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for i in 0 to 6 loop&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(i) &amp;lt;= mosi_in(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(i) &amp;lt;= data_out_s(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end loop;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(7) &amp;lt;= data_in_s(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(7) &amp;lt;= mosi_in(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end case;&amp;lt;/code&amp;gt;                                                           &lt;br /&gt;
&lt;br /&gt;
Hors du process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS1 &amp;lt;= '1' when select_carte = &amp;quot;001&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS2 &amp;lt;= '1' when select_carte = &amp;quot;010&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS3 &amp;lt;= '1' when select_carte = &amp;quot;100&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé une machine d'état avec 2 états : un état REPOS qui permet de passer à l'état TRANSMISSION et de mettre à 1 ou à 0 les Chip Select en fonction de la selection d'état que recevra la carte FPGA de la carte mère. Et la fonction transmission qui effectue le registre à décalage.   &lt;br /&gt;
&lt;br /&gt;
Ce code, que vous trouverez dans le git, compile, en revanche nous n'avons pas pu faire de tests dessus malheureusement.  &lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet pour la carte clavier est de lire les boutons qui sont enfoncés afin de les envoyer à la carte mère via le bus SPI. &lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte :  [[Fichier:Schematique_clavier.png|centré|sans_cadre|511x511px]]Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches qui sont : la flèche de gauche, la flèche de droite, l'espace, un retour chariot, le suppression et enfin un shift qui nous permettra de switcher avec les 10 chiffres (de 0 à 9), &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation&lt;br /&gt;
* un ATmega328p&lt;br /&gt;
* un connecteur HE10 8 pins pour un bus SPI + une ligne d'interruption pour communiquer avec la carte mère&lt;br /&gt;
* un connecteur 6 pins(2x3) pour un bus SPI afin de programmer la carte.&lt;br /&gt;
&amp;lt;u&amp;gt;Fonctionnement matrice de touches :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but ici est de pouvoir lire la touche sur laquelle nous avons appuyé pour l'envoyer à la carte mère. Ici, l'idée est d'utiliser le fonctionnement de la matrice de touche qui est le suivant : &lt;br /&gt;
&lt;br /&gt;
Premièrement, il faut se décider duquel entre les lignes et les colonnes seront en entrée et l'autre en sortie. Ici se sont les lignes qui sont en sortie et les colonnes en entrée. &lt;br /&gt;
&lt;br /&gt;
L'idée est simple : alterner entre les lignes pour écrire un 0L sur 1 ligne et sur les autres un 1L. On parcourt ensuite toutes les colonnes (de la ligne à 0L). Si on lit un 0L sur une colonne, alors il suffit d'associer la ligne qui est à 0L avec celle de la colonne et on connait la touche qui a été appuyée. &lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up qui se trouvent au niveau des lignes serviront  à avoir un 1L par défaut. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le routage de la carte : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.&lt;br /&gt;
&lt;br /&gt;
Pour faire ce routage, nous avons dû créer le footprint des boutons, alors la prise des mesures sur le boutons était nécessaire. Aussi, nous avons décidé d'utiliser un ATmega328p avec des pins traversants pour une question de facilité au niveau de la soudure mais également pour éviter tout court-circuit et donc une perte de temps. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]][[Fichier:3d view.png|sans_cadre|235x235px]][[Fichier:3d view bottom.png|sans_cadre|235x235px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réel clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte_soude.jpg|sans_cadre|266x266px]]&lt;br /&gt;
&lt;br /&gt;
=== Partie programmation ===&lt;br /&gt;
La programmation de notre carte se fera via un AVR ISP &lt;br /&gt;
&lt;br /&gt;
Pour cela, on utilise une carte arduino uno dans laquelle on téléverse le programme Arduino ISP, disponible dans les exemples de l'IDE arduino, pour permettre a l'arduino uno d'envoyer notre code vers la carte clavier via le connecteur HE10.   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma AVR ISP.png|centré|400x400px|sans_cadre]]&lt;br /&gt;
Pour flasher notre carte clavier, 2 solutions : &lt;br /&gt;
&lt;br /&gt;
* utiliser l'IDE arduino, en utilisant le paramètre &amp;quot;upload using programmer&amp;quot; qui permet de televerser du code dans une atmega en passant par le bus SPI. Mais cela néccesite d'écrire le code sur l'IDE arduino. Cette solution permettra simplement de faire des tests rapides en utilisant, par exemple, l'exemple &amp;quot;Blink&amp;quot;.&lt;br /&gt;
* Créer un Makefile qui permet de téléverser notre code C vers la carte fille en passant par l'arduino uno :&lt;br /&gt;
[[Fichier:Makefil.png|sans_cadre|450x450px]]  &lt;br /&gt;
&lt;br /&gt;
==== Programme de tests sur la carte ====&lt;br /&gt;
Nous sommes ensuite passés au différents tests de la carte pour tester chaque fonctionnalités.   &lt;br /&gt;
&lt;br /&gt;
===== Premier test : la carte est-elle programmable ? =====&lt;br /&gt;
On utilise un programme très simple qui allume une des LEDs de la carte, le &amp;quot;Blink&amp;quot; disponible dans les exemples de l'IDE arduino. &lt;br /&gt;
&lt;br /&gt;
Cependant, en essayant de programmer la carte, aucune LEDs ne clignotait. Comme le code ne venait pas de nous et qe c'est un code simple, le problème ne pouvait venir que du côté du hardware. Nous avons donc tester notre carte au multimètre et il y avait effectivement un court-circuit au niveau du crystal qui empêchait forcement son fonctionnement. L'erreur vient de notre schématique puisque nous avons tourné à 90° le composant, ce qui créé effectivement un court-circuit. Pour remédier à notre problème, nous avons dé-souder le crystal et l'avons décalé sur la carte. &lt;br /&gt;
&lt;br /&gt;
Une fois le crystal re-soudé dans le bon sens, nous avons pu flasher la carte clavier avec le programme &amp;quot;Blink&amp;quot;&lt;br /&gt;
[[Fichier:Led_allumee_clavier.png|centré|sans_cadre|241x241px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; La LED clignote, ce qui nous permet de valider le faite que la carte est programmable via notre AVR ISP.&lt;br /&gt;
&lt;br /&gt;
===== Deuxième test : la lecture d'un bouton =====&lt;br /&gt;
our commencer les tests, nous cherchons à allumer une LED quand on appuie sur un bouton en particulier. Pour cela, nous avons mis à 0L la ligne sur PC3 et lu la colonne sur PD0 :   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test_clavier.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Id 1bouton.mov|centré|vignette|Reconnaissance d'1 bouton avec une Led]]Ce test nous a permit de vérifier 2 choses : &lt;br /&gt;
&lt;br /&gt;
* que notre carte permet de reconnaître l'appuie sur un bouton &lt;br /&gt;
* que nous arrivions bien à utiliser les Leds de notre carte. Ainsi nous avons nos &amp;quot;calculs&amp;quot; avec les décalages et les opérations logiques utiles pour mettre à 0L ou lire sur le port une entrée.&lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons gardé l'idée d'allumer une Led lorsqu'un bouton est enfoncé.          &lt;br /&gt;
&lt;br /&gt;
'''Problème rencontré :''' Au début nous n'arrivions par à lire le bouton bien que notre code soit simple. Nous avons donc vérifié au multimètre si nos boutons étaient bien soudés. Au multimètre, les 4 broches de chaque bouton étaient reliés (donc en court-circuit), ce n'est absolument pas normal. Effectivement, lorsque nous avions créé les footprints des boutons nous n'avons pas mis les broches au bon endroit. Dans les boutons il y a déjà des broches reliées et dans nos footprint nous n'avons pas mis les bons chiffres des broches correctement : ce qui nous a créé un court-circuit. Pour contrer ce problème, nous avons tourné à 90° chaque bouton. C n'était pas simple car il a fallut redresser les pins pour qu'ils rentrent bien dans les trous de la carte. Finalement les boutons fonctionnent correctement et les boutons restent assez droits.    &lt;br /&gt;
&lt;br /&gt;
===== Troisième test : lecture de tous les boutons + shift =====&lt;br /&gt;
Pour commencer, on definit notre matrice de touches grâce à un tableau à 2 dimensions, ça nous permettra de récupérer directement les bonnes touches.  &lt;br /&gt;
&lt;br /&gt;
Nous voulions mettre notre clavier en AZERTY, malheureusement notre matrice ne nous le permet pas, alors les touches seront dans l'ordre alphabétique. Dans le code, les lettres ne sont pas dans l'ordre simplement parce que lors du routage nous n'avons pas laissé les boutons comme dans la schématique par simplicité de routage : &lt;br /&gt;
[[Fichier:Matrice touches.png|gauche|sans_cadre]]&lt;br /&gt;
&amp;lt;u&amp;gt;traduction des valeurs hexadécimales :&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 0x0E : le shift &lt;br /&gt;
* 0x08 : suppression&lt;br /&gt;
* 0x1C : flèche gauche &lt;br /&gt;
* 0x1D : flèche droite &lt;br /&gt;
&lt;br /&gt;
Ce sont simplement les codes en ASCII. &lt;br /&gt;
[[Fichier:Lecture touches.png|gauche|sans_cadre|400x400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Cette fonction nous permet d'effectuer la lecture d'une touche avec la méthode du clavier matriciel que nous avons expliqué plus haut. &lt;br /&gt;
&lt;br /&gt;
Ainsi, pour chaque ligne à 0L on lira sur chaque colonne et on vérifie si elle est égale à 0L. Si oui, on retourne directement la valeur de la touche en retournant notre matrice de touches avec les indices de la ligne et de la colonne en cours. &lt;br /&gt;
&lt;br /&gt;
Il y a une condition supplémentaire : si la touche appuyée est le shift (0x0E). Dans ce cas, on bascule on recommence la même méthode, mais cette fois on retournera la valeur appuyée mais grâce à la deuxième matrice cette fois puisqu'elle contient les chiffres de 0 à 9. &lt;br /&gt;
&lt;br /&gt;
Ici, l'utilisateur devra appuyer sur le bouton pour les chiffres en même temps que le bouton du shift. &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;
Finalement, notre clavier ce présent comme ceci : &lt;br /&gt;
[[Fichier:Tableau du clavier.png|gauche|Clavier sans appuie sur SHIFT|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma clavier avec appuie sur SHIFT.png|clavier avec appuie sur SHIFT|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous aurions voulu faire un clavier AZERTY mais la matrice n'est pas de la bonne forme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Quatrième test : le bus SPI =====&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie est d'envoyer les touches lues par le clavier vers la carte mère grâce au bus SPI.  &lt;br /&gt;
&lt;br /&gt;
Coté carte fille, le bus SPI est utilisé en interruption. Lorsque qu'une donnée est envoyé sur le MOSI, la programme du clavier rentre dans une interruption (ISR) pour renvoyer une info sur le MISO. &lt;br /&gt;
&lt;br /&gt;
Cela nous permet par exemple d'envoyer une valeur sur le MOSI, et de récupérer une donnée sur le MISO en fonction de la valeur envoyé depuis le MOSI. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ISR(SPI_STC_vect) {&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   char data = SPDR;&amp;lt;/code&amp;gt;                   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   _delay_ms(40);&amp;lt;/code&amp;gt;                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   if(data == 0x00) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = '!';&amp;lt;/code&amp;gt;                     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x05) {&amp;lt;/code&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = bouton;&amp;lt;/code&amp;gt;                      bouton : touche qui a été appuyée  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication de la communication en bus SPI :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, l'idée est de communiquer avec la carte mère. Pour cela, voici un schéma explicatif de notre méthode de communication : &lt;br /&gt;
 [[Fichier:Schéma communication SPI.png|centré|cadre]] &lt;br /&gt;
&lt;br /&gt;
Lorsque la carte clavier lie une touche, la ligne d'interruption passe à l'état haut. &lt;br /&gt;
&lt;br /&gt;
La carte mère rentre en interruption et va alors demander quelle carte a déclenché l'interruption. &lt;br /&gt;
&lt;br /&gt;
Si c'est la carte clavier qui a déclenché l'interruption alors le carte mère demande le nombre de touche à récupérer, puis récupère une a une les touches.  &lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' la taille du tampon sera, le plus souvent, égale à 1 puisque le microcontrôleur est plus rapide que l'humain qui tape au clavier. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de tester notre communication SPI, nous avons utiliser un Arduino uno qui &amp;quot;remplace&amp;quot; la carte mère. et qui envoi les valeurs 0x00, 0x01 ou 0x05, le carte mère à la lecture de la valeur doit répondre par une autre valeur. &lt;br /&gt;
&lt;br /&gt;
En revanche, après beaucoup de tests non concluant,  la communication ne fonctionnait pas. Nous avons alors regardé à l’oscilloscope l'allure de nos signaux MISO et MOSI :  &lt;br /&gt;
&lt;br /&gt;
* Le MOSI était cohérent avec les données envoyées&lt;br /&gt;
* Le MISO en revanche a des valeurs de tensions écrasées, ce qui fait que la valeur récupérée par le maitre est toujours nulle.&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:MOSI.png|gauche|vignette|MOSI]]&lt;br /&gt;
[[Fichier:MISO.png|centré|vignette|MISO|290x290px]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; Après de nombreux essais sur différents shield, le bus SPI de certaines cartes ne fonctionnent pas, et d'autres fonctionnent, et ce même avec un code identiques. C'est assez troublant puisque même avec la dernière carte modifiée et soudée par M. Redon, le bus SPI ne fonctionne pas avec notre code. La seule carte avec laquelle nos programmes fonctionnent, c'est avec celle du groupe 9. Les shields des binômes 4,5 et 6 ont ce problème.                  &lt;br /&gt;
===== Cinquième test : affichage sur le port série =====&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier plus précisément notre communication SPI, nous avons utiliser le port série de l'arduino uno pour pouvoir voir les données qui sont envoyé depuis la carte clavier, et ainsi s'assurer que quand on appuie sur une touche du clavier, la carte mère récupère bien le code ASCII de cette touche. &lt;br /&gt;
&lt;br /&gt;
Pour ce faire, nous utilisons la même fonction &amp;lt;code&amp;gt;serie_envoyer()&amp;lt;/code&amp;gt; que dans l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                        &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_activer();&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(20);&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     data_recue = spi_envoi(0x05);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     serie_envoyer(data_recue);&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_desactiver();&amp;lt;/code&amp;gt;            &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(100);&amp;lt;/code&amp;gt;              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
Le but étant, ici, d'envoyer directement la demande de touche et de l'afficher directement sur le port série grâce au &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Clavier sansINT shift.mp4|centré|vignette|Envoi des boutons lu par SPI]]&lt;br /&gt;
&lt;br /&gt;
===== Sixième test : identification et bouton =====&lt;br /&gt;
Maintenant, puisque l'objectif est d'avoir une communication avec la carte mère, nous avons testé un programme qui envoi la demande d'identification, puis après la réponse, il envoi la demande de bouton. Notre carte clavier répond alors par ces demandes. Nous utilisons toujours une variable globale qui récupère le caractère reçu lorsqu'un bouton a été enfoncé. &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo de la communication entre le maitre et le clavier : &lt;br /&gt;
[[Fichier:ID+lettre Variableglobal.mp4|centré|vignette]]&lt;br /&gt;
Programme final&lt;br /&gt;
Finalement, l'idée est de stocker les touches appuyées dans un tableau, pour pouvoir les envoyer à la carte mère lorsqu'elle le demande. Avant la demande de touche, la carte mère envoi la donnée 0x00 pour que l'on réponde que la carte est un clavier avec le caractère '!'. Nous avons décidé d'utilisé cette réponse seulement pour que l'on puisse l'afficher sur le port série (0x05 étant un caractère non imprimable). &lt;br /&gt;
&lt;br /&gt;
Voici les fonctions qui permettent d'ajouter et de supprimer les touches du tampon : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void remplir_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[cpt_tampon] = bouton;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon++;&amp;lt;/code&amp;gt;                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void vider_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for (int i=0; i &amp;lt; cpt_tampon; i++) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if (i == cpt_tampon - 1 ) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;} else {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = tampon[i+1];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon--;&amp;lt;/code&amp;gt;                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
L'idée est de vider le  tampon à chaque fois que l'on envoi le tableau à la case 0 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(data == 0x05) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SPDR = tampon[0];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;vider_tampon();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(cpt_tampon == 0) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PC4);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                &lt;br /&gt;
&lt;br /&gt;
En conclusion, le programme de la carte mère envoi la demande d'identification (0x00) ainsi que la demande de touche. Et le programme du clavier envoi le caractère '!', et par la suite la touche du tampon. &lt;br /&gt;
[[Fichier:Id touche tampon.mov|centré|cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' ce code n'est pas parfait puisqu'il écrit 1 fois de trop le caractère. Ex : si on appuie sur 'A', on lira sur le port série 'A', en revanche si on appuie juste après sur 'B', on lira 'A' puis 'B'. Nous n'avons malheureusement pas pu décoder cette erreur. &lt;br /&gt;
&lt;br /&gt;
==== Points importants à savoir ====&lt;br /&gt;
il faut débrancher et rebrancher le câble du bus SPI pour que la communication fonctionne. Aussi, si le programme du maître ne s'injecte pas dans l'Arduino, il faut insérer d'abord un programme d'exemple comme ArduinoISP. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons mis à part des programmes fonctionnels dans les répertoires nommés &amp;quot;Codes_OK&amp;quot;. Tout est expliqué dans des README qui se trouvent (presque) dans chaque répertoire. Un README qui se trouve dans le répertoire clavier/Code explique ce que les combinaisons de codes du maître et de l'esclave font. Des vidéos se trouvent également dans le répertoire Videos, qui montrent la fonctionnalité de chaque codes. Il y a d'ailleurs &amp;lt;u&amp;gt;plus (+) de vidéos&amp;lt;/u&amp;gt; sur le git. &lt;br /&gt;
 &lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Notre carte clavier est capable de lire chacune des touches et associe a chacune d'elle un caractère ASCII. Le clavier possède aussi un système de shift pour pouvoir taper les chiffres de 0 à 9. La précision du clavier n'est pas optimale et va parfois lire 2 fois la même touche quand on appuie sur un bouton. Il faudrait, pour corriger ça, retravailler les différents délais mais nous avons déjà passée pas mal de temps à régler nos délais sans trouver le timing parfait, si il existe.&lt;br /&gt;
&lt;br /&gt;
Notre bus SPI nous permet d'envoyer les touches du clavier vers la carte mère mais aussi d'identifier la carte clavier. &lt;br /&gt;
&lt;br /&gt;
Nous sommes tout de même assez content de notre travail puisque nous arrivons à bien envoyer par SPI, que ce soit des lettres (1ère matrice) ou des chiffres (2ème matrice). Nous avons pris pas mal de temps à gérer la gestion de la matrice de boutons et avons finalement réussi, nous avons réussi à gérer l'ISR et aussi le bus SPI. Nous nous sommes alors améliorés tous les 2 que ce soit en software ou en hardware.&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:ID%2Blettre_Variableglobal.mp4&amp;diff=3148</id>
		<title>Fichier:ID+lettre Variableglobal.mp4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:ID%2Blettre_Variableglobal.mp4&amp;diff=3148"/>
		<updated>2024-01-18T16:41:11Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;demonstration vidéo&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3142</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3142"/>
		<updated>2024-01-18T16:32:12Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Troisième test : lecture de tous les boutons + shift */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous n'arrivez pas à lire les vidéos du wiki, nous les avons mis dans notre Git avec des Readme pour bien savoir ce qu'elles font et avec le code inséré. Les vidéos sur le git sont de meilleures qualités. &lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Lors de la première séance de Pico, nous avons soudé quelques cartes telles que le Shield, la carte de leds et la carte 7 segments : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre|205x205px]][[Fichier:CartePin.png|sans_cadre|209x209px]][[Fichier:7_segments.png|sans_cadre|213x213px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre|203x203px]][[Fichier:Back.png|sans_cadre|200x200px]]&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino qui nous servirons pour la communication du bus SPI : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre|169x169px]]&lt;br /&gt;
=== Programmation Ordonnancement ===&lt;br /&gt;
&lt;br /&gt;
==== Clignotement de 2 Leds ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente :   [[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]'''Remarque :''' Les temps ne sont pas réels, l'objectif est donc d'endormir les tâches.   &lt;br /&gt;
&lt;br /&gt;
Voici cette fois le clignotement des 2 Leds avec l'endormissement des tâches :          &lt;br /&gt;
[[Fichier:Ordonnancement Leds serie.mov|vignette|ordonnancement Leds avec endormissement|centré]]&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;
==== Lecture sur port série en mémoire partagée ====&lt;br /&gt;
Par la suite, nous voulons ordonnancer une tâche qui permet de stocker dans une mémoire partagée la valeur reçue sur le port série.  &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons utilisé : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_recevoir(void) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A, RXC0);&amp;lt;/code&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = UDR0;&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;                               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                             &lt;br /&gt;
&lt;br /&gt;
Ici, la variable globale (mémoire partagée) est une variable globale (received_data) en unsigned char.  &lt;br /&gt;
&lt;br /&gt;
Pour lire sur le port série, on utilisera la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
==== Lecture/écriture sur port série ====&lt;br /&gt;
Afin de vérifier le code que nous avons écris dans la partie d'avant, nous écrirons sur le port série ce que nous avons lu. En d'autres termes, nous écrirons sur le port série ce que nous avons écris sur le clavier. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_envoyer(void) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A,UDRE0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UDR0=received_data;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
Sans remettre à '\0' comme ici, lorsque l'on appuie sur une touche, celle-ci s'affiche jusqu'à l'appuie d'une autre touche  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                         &lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ordonnancement port serie.mov|centré|vignette|Ordonnancement sur port série]]&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Nous n'avons pas fait tout ce qui avait été demandé mais nous sommes quand même assez content du résultat puisque nous avons un ordonnanceur qui gère à la fois le clignotement de 2 Leds différentes ainsi que la lecture et l'écriture sur le port série. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Ordonnancement Leds portSerie.mp4|centré|vignette|Ordonnancement port série + Leds]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous devons implémenter un contrôleur de bus série SPI. &lt;br /&gt;
&lt;br /&gt;
Tout d'abord, voici comment fonctionne un bus SPI : &lt;br /&gt;
&lt;br /&gt;
Dans un bus SPI, il y a 1 maître et 1 ou plusieurs esclaves. Le transmission des données se font sur 2 fils : MISO et MOSI : &lt;br /&gt;
&lt;br /&gt;
- MOSI : Données du maître vers l'esclave,&lt;br /&gt;
&lt;br /&gt;
- MISO : Données de l'esclave vers le maître.&lt;br /&gt;
&lt;br /&gt;
Puisqu'il y a plusieurs esclaves, le SS (Ship Select) permet d'autoriser 1 esclave précis en l'activant à 0. &lt;br /&gt;
&lt;br /&gt;
Les échanges se font sur front et sont synchronisés par le maître. &lt;br /&gt;
&lt;br /&gt;
Lorsqu'un octet du maître passe dans le registre de l'esclave, celui de l'esclave passe dans le registre du maître simultanément comme représenté sur l'image ci-dessous. C'est le principe du registre à décalage.&lt;br /&gt;
[[Fichier:Chemin spi.png|centré|sans_cadre]]Le contrôleur SPI doit jouer le rôle du maître et va contrôler les pins du bus SPI pour échanger des données.   &lt;br /&gt;
[[Fichier:Schéma bloc du driver SPI.png|centré|vignette|442x442px]]      &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons écris en VHDL :  &lt;br /&gt;
&lt;br /&gt;
Dans un process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;case ETAT is&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when REPOS =&amp;gt; ETAT &amp;lt;= TRANSMISSION;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when TRANSMISSION =&amp;gt; if compteur = 8 then&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ETAT &amp;lt;= REPOS;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;compteur &amp;lt;= 0;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;else compteur &amp;lt;= compteur + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end if;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for i in 0 to 6 loop&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(i) &amp;lt;= mosi_in(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(i) &amp;lt;= data_out_s(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end loop;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(7) &amp;lt;= data_in_s(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(7) &amp;lt;= mosi_in(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end case;&amp;lt;/code&amp;gt;                                                           &lt;br /&gt;
&lt;br /&gt;
Hors du process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS1 &amp;lt;= '1' when select_carte = &amp;quot;001&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS2 &amp;lt;= '1' when select_carte = &amp;quot;010&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS3 &amp;lt;= '1' when select_carte = &amp;quot;100&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé une machine d'état avec 2 états : un état REPOS qui permet de passer à l'état TRANSMISSION et de mettre à 1 ou à 0 les Chip Select en fonction de la selection d'état que recevra la carte FPGA de la carte mère. Et la fonction transmission qui effectue le registre à décalage.   &lt;br /&gt;
&lt;br /&gt;
Ce code, que vous trouverez dans le git, compile, en revanche nous n'avons pas pu faire de tests dessus malheureusement.  &lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet pour la carte clavier est de lire les boutons qui sont enfoncés afin de les envoyer à la carte mère via le bus SPI. &lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte :  [[Fichier:Schematique_clavier.png|centré|sans_cadre|511x511px]]Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches qui sont : la flèche de gauche, la flèche de droite, l'espace, un retour chariot, le suppression et enfin un shift qui nous permettra de switcher avec les 10 chiffres (de 0 à 9), &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation&lt;br /&gt;
* un ATmega328p&lt;br /&gt;
* un connecteur HE10 8 pins pour un bus SPI + une ligne d'interruption pour communiquer avec la carte mère&lt;br /&gt;
* un connecteur 6 pins(2x3) pour un bus SPI afin de programmer la carte.&lt;br /&gt;
&amp;lt;u&amp;gt;Fonctionnement matrice de touches :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but ici est de pouvoir lire la touche sur laquelle nous avons appuyé pour l'envoyer à la carte mère. Ici, l'idée est d'utiliser le fonctionnement de la matrice de touche qui est le suivant : &lt;br /&gt;
&lt;br /&gt;
Premièrement, il faut se décider duquel entre les lignes et les colonnes seront en entrée et l'autre en sortie. Ici se sont les lignes qui sont en sortie et les colonnes en entrée. &lt;br /&gt;
&lt;br /&gt;
L'idée est simple : alterner entre les lignes pour écrire un 0L sur 1 ligne et sur les autres un 1L. On parcourt ensuite toutes les colonnes (de la ligne à 0L). Si on lit un 0L sur une colonne, alors il suffit d'associer la ligne qui est à 0L avec celle de la colonne et on connait la touche qui a été appuyée. &lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up qui se trouvent au niveau des lignes serviront  à avoir un 1L par défaut. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le routage de la carte : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.&lt;br /&gt;
&lt;br /&gt;
Pour faire ce routage, nous avons dû créer le footprint des boutons, alors la prise des mesures sur le boutons était nécessaire. Aussi, nous avons décidé d'utiliser un ATmega328p avec des pins traversants pour une question de facilité au niveau de la soudure mais également pour éviter tout court-circuit et donc une perte de temps. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]][[Fichier:3d view.png|sans_cadre|235x235px]][[Fichier:3d view bottom.png|sans_cadre|235x235px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réel clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte_soude.jpg|sans_cadre|266x266px]]&lt;br /&gt;
&lt;br /&gt;
=== Partie programmation ===&lt;br /&gt;
La programmation de notre carte se fera via un AVR ISP &lt;br /&gt;
&lt;br /&gt;
Pour cela, on utilise une carte arduino uno dans laquelle on téléverse le programme Arduino ISP, disponible dans les exemples de l'IDE arduino, pour permettre a l'arduino uno d'envoyer notre code vers la carte clavier via le connecteur HE10.   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma AVR ISP.png|centré|400x400px|sans_cadre]]&lt;br /&gt;
Pour flasher notre carte clavier, 2 solutions : &lt;br /&gt;
&lt;br /&gt;
* utiliser l'IDE arduino, en utilisant le paramètre &amp;quot;upload using programmer&amp;quot; qui permet de televerser du code dans une atmega en passant par le bus SPI. Mais cela néccesite d'écrire le code sur l'IDE arduino. Cette solution permettra simplement de faire des tests rapides en utilisant, par exemple, l'exemple &amp;quot;Blink&amp;quot;.&lt;br /&gt;
* Créer un Makefile qui permet de téléverser notre code C vers la carte fille en passant par l'arduino uno :&lt;br /&gt;
[[Fichier:Makefil.png|sans_cadre|450x450px]]  &lt;br /&gt;
&lt;br /&gt;
==== Programme de tests sur la carte ====&lt;br /&gt;
Nous sommes ensuite passés au différents tests de la carte pour tester chaque fonctionnalités.   &lt;br /&gt;
&lt;br /&gt;
===== Premier test : la carte est-elle programmable ? =====&lt;br /&gt;
On utilise un programme très simple qui allume une des LEDs de la carte, le &amp;quot;Blink&amp;quot; disponible dans les exemples de l'IDE arduino. &lt;br /&gt;
&lt;br /&gt;
Cependant, en essayant de programmer la carte, aucune LEDs ne clignotait. Comme le code ne venait pas de nous et qe c'est un code simple, le problème ne pouvait venir que du côté du hardware. Nous avons donc tester notre carte au multimètre et il y avait effectivement un court-circuit au niveau du crystal qui empêchait forcement son fonctionnement. L'erreur vient de notre schématique puisque nous avons tourné à 90° le composant, ce qui créé effectivement un court-circuit. Pour remédier à notre problème, nous avons dé-souder le crystal et l'avons décalé sur la carte. &lt;br /&gt;
&lt;br /&gt;
Une fois le crystal re-soudé dans le bon sens, nous avons pu flasher la carte clavier avec le programme &amp;quot;Blink&amp;quot;&lt;br /&gt;
[[Fichier:Led_allumee_clavier.png|centré|sans_cadre|241x241px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; La LED clignote, ce qui nous permet de valider le faite que la carte est programmable via notre AVR ISP.&lt;br /&gt;
&lt;br /&gt;
===== Deuxième test : la lecture d'un bouton =====&lt;br /&gt;
our commencer les tests, nous cherchons à allumer une LED quand on appuie sur un bouton en particulier. Pour cela, nous avons mis à 0L la ligne sur PC3 et lu la colonne sur PD0 :   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test_clavier.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Id 1bouton.mov|centré|vignette|Reconnaissance d'1 bouton avec une Led]]Ce test nous a permit de vérifier 2 choses : &lt;br /&gt;
&lt;br /&gt;
* que notre carte permet de reconnaître l'appuie sur un bouton &lt;br /&gt;
* que nous arrivions bien à utiliser les Leds de notre carte. Ainsi nous avons nos &amp;quot;calculs&amp;quot; avec les décalages et les opérations logiques utiles pour mettre à 0L ou lire sur le port une entrée.&lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons gardé l'idée d'allumer une Led lorsqu'un bouton est enfoncé.          &lt;br /&gt;
&lt;br /&gt;
'''Problème rencontré :''' Au début nous n'arrivions par à lire le bouton bien que notre code soit simple. Nous avons donc vérifié au multimètre si nos boutons étaient bien soudés. Au multimètre, les 4 broches de chaque bouton étaient reliés (donc en court-circuit), ce n'est absolument pas normal. Effectivement, lorsque nous avions créé les footprints des boutons nous n'avons pas mis les broches au bon endroit. Dans les boutons il y a déjà des broches reliées et dans nos footprint nous n'avons pas mis les bons chiffres des broches correctement : ce qui nous a créé un court-circuit. Pour contrer ce problème, nous avons tourné à 90° chaque bouton. C n'était pas simple car il a fallut redresser les pins pour qu'ils rentrent bien dans les trous de la carte. Finalement les boutons fonctionnent correctement et les boutons restent assez droits.    &lt;br /&gt;
&lt;br /&gt;
===== Troisième test : lecture de tous les boutons + shift =====&lt;br /&gt;
Pour commencer, on definit notre matrice de touches grâce à un tableau à 2 dimensions, ça nous permettra de récupérer directement les bonnes touches.  &lt;br /&gt;
&lt;br /&gt;
Nous voulions mettre notre clavier en AZERTY, malheureusement notre matrice ne nous le permet pas, alors les touches seront dans l'ordre alphabétique. Dans le code, les lettres ne sont pas dans l'ordre simplement parce que lors du routage nous n'avons pas laissé les boutons comme dans la schématique par simplicité de routage : &lt;br /&gt;
[[Fichier:Matrice touches.png|gauche|sans_cadre]]&lt;br /&gt;
&amp;lt;u&amp;gt;traduction des valeurs hexadécimales :&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 0x0E : le shift &lt;br /&gt;
* 0x08 : suppression&lt;br /&gt;
* 0x1C : flèche gauche &lt;br /&gt;
* 0x1D : flèche droite &lt;br /&gt;
&lt;br /&gt;
Ce sont simplement les codes en ASCII. &lt;br /&gt;
[[Fichier:Lecture touches.png|gauche|sans_cadre|400x400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Cette fonction nous permet d'effectuer la lecture d'une touche avec la méthode du clavier matriciel que nous avons expliqué plus haut. &lt;br /&gt;
&lt;br /&gt;
Ainsi, pour chaque ligne à 0L on lira sur chaque colonne et on vérifie si elle est égale à 0L. Si oui, on retourne directement la valeur de la touche en retournant notre matrice de touches avec les indices de la ligne et de la colonne en cours. &lt;br /&gt;
&lt;br /&gt;
Il y a une condition supplémentaire : si la touche appuyée est le shift (0x0E). Dans ce cas, on bascule on recommence la même méthode, mais cette fois on retournera la valeur appuyée mais grâce à la deuxième matrice cette fois puisqu'elle contient les chiffres de 0 à 9. &lt;br /&gt;
&lt;br /&gt;
Ici, l'utilisateur devra appuyer sur le bouton pour les chiffres en même temps que le bouton du shift. &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;
Finalement, notre clavier ce présent comme ceci : &lt;br /&gt;
[[Fichier:Tableau du clavier.png|gauche|Clavier sans appuie sur SHIFT|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma clavier avec appuie sur SHIFT.png|clavier avec appuie sur SHIFT|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous aurions voulu faire un clavier AZERTY mais la matrice n'est pas de la bonne forme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Quatrième test : le bus SPI =====&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie est d'envoyer les touches lues par le clavier vers la carte mère grâce au bus SPI.  &lt;br /&gt;
&lt;br /&gt;
Coté carte fille, le bus SPI est utilisé en interruption. Lorsque qu'une donnée est envoyé sur le MOSI, la programme du clavier rentre dans une interruption (ISR) pour renvoyer une info sur le MISO. &lt;br /&gt;
&lt;br /&gt;
Cela nous permet par exemple d'envoyer une valeur sur le MOSI, et de récupérer une donnée sur le MISO en fonction de la valeur envoyé depuis le MOSI. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ISR(SPI_STC_vect) {&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   char data = SPDR;&amp;lt;/code&amp;gt;                   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   _delay_ms(40);&amp;lt;/code&amp;gt;                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   if(data == 0x00) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = '!';&amp;lt;/code&amp;gt;                     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x05) {&amp;lt;/code&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = bouton;&amp;lt;/code&amp;gt;                      bouton : touche qui a été appuyée  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication de la communication en bus SPI :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, l'idée est de communiquer avec la carte mère. Pour cela, voici un schéma explicatif de notre méthode de communication : &lt;br /&gt;
 [[Fichier:Schéma communication SPI.png|centré|cadre]] &lt;br /&gt;
&lt;br /&gt;
Lorsque la carte clavier lie une touche, la ligne d'interruption passe à l'état haut. &lt;br /&gt;
&lt;br /&gt;
La carte mère rentre en interruption et va alors demander quelle carte a déclenché l'interruption. &lt;br /&gt;
&lt;br /&gt;
Si c'est la carte clavier qui a déclenché l'interruption alors le carte mère demande le nombre de touche à récupérer, puis récupère une a une les touches.  &lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' la taille du tampon sera, le plus souvent, égale à 1 puisque le microcontrôleur est plus rapide que l'humain qui tape au clavier. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de tester notre communication SPI, nous avons utiliser un Arduino uno qui &amp;quot;remplace&amp;quot; la carte mère. et qui envoi les valeurs 0x00, 0x01 ou 0x05, le carte mère à la lecture de la valeur doit répondre par une autre valeur. &lt;br /&gt;
&lt;br /&gt;
En revanche, après beaucoup de tests non concluant,  la communication ne fonctionnait pas. Nous avons alors regardé à l’oscilloscope l'allure de nos signaux MISO et MOSI :  &lt;br /&gt;
&lt;br /&gt;
* Le MOSI était cohérent avec les données envoyées&lt;br /&gt;
* Le MISO en revanche a des valeurs de tensions écrasées, ce qui fait que la valeur récupérée par le maitre est toujours nulle.&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:MOSI.png|gauche|vignette|MOSI]]&lt;br /&gt;
[[Fichier:MISO.png|centré|vignette|MISO|290x290px]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; Après de nombreux essais sur différents shield, le bus SPI de certaines cartes ne fonctionnent pas, et d'autres fonctionnent, et ce même avec un code identiques. C'est assez troublant puisque même avec la dernière carte modifiée et soudée par M. Redon, le bus SPI ne fonctionne pas avec notre code. La seule carte avec laquelle nos programmes fonctionnent, c'est avec celle du groupe 9. Les shields des binômes 4,5 et 6 ont ce problème.                  &lt;br /&gt;
===== Cinquième test : affichage sur le port série =====&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier plus précisément notre communication SPI, nous avons utiliser le port série de l'arduino uno pour pouvoir voir les données qui sont envoyé depuis la carte clavier, et ainsi s'assurer que quand on appuie sur une touche du clavier, la carte mère récupère bien le code ASCII de cette touche. &lt;br /&gt;
&lt;br /&gt;
Pour ce faire, nous utilisons la même fonction &amp;lt;code&amp;gt;serie_envoyer()&amp;lt;/code&amp;gt; que dans l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                        &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_activer();&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(20);&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     data_recue = spi_envoi(0x05);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     serie_envoyer(data_recue);&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_desactiver();&amp;lt;/code&amp;gt;            &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(100);&amp;lt;/code&amp;gt;              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
Le but étant, ici, d'envoyer directement la demande de touche et de l'afficher directement sur le port série grâce au &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Clavier sansINT shift.mp4|centré|vignette|Envoi des boutons lu par SPI]]&lt;br /&gt;
=== Programme final ===&lt;br /&gt;
Finalement, l'idée est de stocker les touches appuyées dans un tableau, pour pouvoir les envoyer à la carte mère lorsqu'elle le demande. Avant la demande de touche, la carte mère envoi la donnée 0x00 pour que l'on réponde que la carte est un clavier avec le caractère '!'. Nous avons décidé d'utilisé cette réponse seulement pour que l'on puisse l'afficher sur le port série (0x05 étant un caractère non imprimable). &lt;br /&gt;
&lt;br /&gt;
Voici les fonctions qui permettent d'ajouter et de supprimer les touches du tampon : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void remplir_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[cpt_tampon] = bouton;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon++;&amp;lt;/code&amp;gt;                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void vider_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for (int i=0; i &amp;lt; cpt_tampon; i++) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if (i == cpt_tampon - 1 ) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;} else {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = tampon[i+1];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon--;&amp;lt;/code&amp;gt;                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
L'idée est de vider le  tampon à chaque fois que l'on envoi le tableau à la case 0 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(data == 0x05) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SPDR = tampon[0];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;vider_tampon();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(cpt_tampon == 0) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PC4);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                &lt;br /&gt;
&lt;br /&gt;
En conclusion, le programme de la carte mère envoi la demande d'identification (0x00) ainsi que la demande de touche. Et le programme du clavier envoi le caractère '!', et par la suite la touche du tampon. &lt;br /&gt;
[[Fichier:Id touche tampon.mov|centré|cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' ce code n'est pas parfait puisqu'il écrit 1 fois de trop le caractère. Ex : si on appuie sur 'A', on lira sur le port série 'A', en revanche si on appuie juste après sur 'B', on lira 'A' puis 'B'. Nous n'avons malheureusement pas pu décoder cette erreur. &lt;br /&gt;
&lt;br /&gt;
==== Points importants à savoir ====&lt;br /&gt;
il faut débrancher et rebrancher le câble du bus SPI pour que la communication fonctionne. Aussi, si le programme du maître ne s'injecte pas dans l'Arduino, il faut insérer d'abord un programme d'exemple comme ArduinoISP. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons mis à part des programmes fonctionnels dans les répertoires nommés &amp;quot;Codes_OK&amp;quot;. Tout est expliqué dans des README qui se trouvent (presque) dans chaque répertoire. Un README qui se trouve dans le répertoire clavier/Code explique ce que les combinaisons de codes du maître et de l'esclave font. Des vidéos se trouvent également dans le répertoire Videos, qui montrent la fonctionnalité de chaque codes. Il y a d'ailleurs &amp;lt;u&amp;gt;plus (+) de vidéos&amp;lt;/u&amp;gt; sur le git. &lt;br /&gt;
 &lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Notre carte clavier est capable de lire chacune des touches et associe a chacune d'elle un caractère ASCII. Le clavier possède aussi un système de shift pour pouvoir taper les chiffres de 0 à 9. La précision du clavier n'est pas optimale et va parfois lire 2 fois la même touche quand on appuie sur un bouton. Il faudrait pour corriger ça retravailler les différents délais mais nous avons déjà passée pas mal de temps à régler nos délais sans trouver le timing parfait si il existe.&lt;br /&gt;
&lt;br /&gt;
Notre bus SPI nous permet d'envoyer les touches du clavier vers la carte mère et d'identifier la carte clavier.&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3141</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3141"/>
		<updated>2024-01-18T16:31:27Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Quatrième test : le bus SPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vous n'arrivez pas à lire les vidéos du wiki, nous les avons mis dans notre Git avec des Readme pour bien savoir ce qu'elles font et avec le code inséré. Les vidéos sur le git sont de meilleures qualités. &lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Lors de la première séance de Pico, nous avons soudé quelques cartes telles que le Shield, la carte de leds et la carte 7 segments : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre|205x205px]][[Fichier:CartePin.png|sans_cadre|209x209px]][[Fichier:7_segments.png|sans_cadre|213x213px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre|203x203px]][[Fichier:Back.png|sans_cadre|200x200px]]&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino qui nous servirons pour la communication du bus SPI : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre|169x169px]]&lt;br /&gt;
=== Programmation Ordonnancement ===&lt;br /&gt;
&lt;br /&gt;
==== Clignotement de 2 Leds ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente :   [[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]'''Remarque :''' Les temps ne sont pas réels, l'objectif est donc d'endormir les tâches.   &lt;br /&gt;
&lt;br /&gt;
Voici cette fois le clignotement des 2 Leds avec l'endormissement des tâches :          &lt;br /&gt;
[[Fichier:Ordonnancement Leds serie.mov|vignette|ordonnancement Leds avec endormissement|centré]]&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;
==== Lecture sur port série en mémoire partagée ====&lt;br /&gt;
Par la suite, nous voulons ordonnancer une tâche qui permet de stocker dans une mémoire partagée la valeur reçue sur le port série.  &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons utilisé : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_recevoir(void) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A, RXC0);&amp;lt;/code&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = UDR0;&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;                               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                             &lt;br /&gt;
&lt;br /&gt;
Ici, la variable globale (mémoire partagée) est une variable globale (received_data) en unsigned char.  &lt;br /&gt;
&lt;br /&gt;
Pour lire sur le port série, on utilisera la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
==== Lecture/écriture sur port série ====&lt;br /&gt;
Afin de vérifier le code que nous avons écris dans la partie d'avant, nous écrirons sur le port série ce que nous avons lu. En d'autres termes, nous écrirons sur le port série ce que nous avons écris sur le clavier. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_envoyer(void) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A,UDRE0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UDR0=received_data;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
Sans remettre à '\0' comme ici, lorsque l'on appuie sur une touche, celle-ci s'affiche jusqu'à l'appuie d'une autre touche  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                         &lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ordonnancement port serie.mov|centré|vignette|Ordonnancement sur port série]]&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Nous n'avons pas fait tout ce qui avait été demandé mais nous sommes quand même assez content du résultat puisque nous avons un ordonnanceur qui gère à la fois le clignotement de 2 Leds différentes ainsi que la lecture et l'écriture sur le port série. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Ordonnancement Leds portSerie.mp4|centré|vignette|Ordonnancement port série + Leds]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous devons implémenter un contrôleur de bus série SPI. &lt;br /&gt;
&lt;br /&gt;
Tout d'abord, voici comment fonctionne un bus SPI : &lt;br /&gt;
&lt;br /&gt;
Dans un bus SPI, il y a 1 maître et 1 ou plusieurs esclaves. Le transmission des données se font sur 2 fils : MISO et MOSI : &lt;br /&gt;
&lt;br /&gt;
- MOSI : Données du maître vers l'esclave,&lt;br /&gt;
&lt;br /&gt;
- MISO : Données de l'esclave vers le maître.&lt;br /&gt;
&lt;br /&gt;
Puisqu'il y a plusieurs esclaves, le SS (Ship Select) permet d'autoriser 1 esclave précis en l'activant à 0. &lt;br /&gt;
&lt;br /&gt;
Les échanges se font sur front et sont synchronisés par le maître. &lt;br /&gt;
&lt;br /&gt;
Lorsqu'un octet du maître passe dans le registre de l'esclave, celui de l'esclave passe dans le registre du maître simultanément comme représenté sur l'image ci-dessous. C'est le principe du registre à décalage.&lt;br /&gt;
[[Fichier:Chemin spi.png|centré|sans_cadre]]Le contrôleur SPI doit jouer le rôle du maître et va contrôler les pins du bus SPI pour échanger des données.   &lt;br /&gt;
[[Fichier:Schéma bloc du driver SPI.png|centré|vignette|442x442px]]      &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons écris en VHDL :  &lt;br /&gt;
&lt;br /&gt;
Dans un process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;case ETAT is&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when REPOS =&amp;gt; ETAT &amp;lt;= TRANSMISSION;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when TRANSMISSION =&amp;gt; if compteur = 8 then&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ETAT &amp;lt;= REPOS;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;compteur &amp;lt;= 0;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;else compteur &amp;lt;= compteur + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end if;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for i in 0 to 6 loop&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(i) &amp;lt;= mosi_in(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(i) &amp;lt;= data_out_s(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end loop;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(7) &amp;lt;= data_in_s(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(7) &amp;lt;= mosi_in(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end case;&amp;lt;/code&amp;gt;                                                           &lt;br /&gt;
&lt;br /&gt;
Hors du process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS1 &amp;lt;= '1' when select_carte = &amp;quot;001&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS2 &amp;lt;= '1' when select_carte = &amp;quot;010&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS3 &amp;lt;= '1' when select_carte = &amp;quot;100&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé une machine d'état avec 2 états : un état REPOS qui permet de passer à l'état TRANSMISSION et de mettre à 1 ou à 0 les Chip Select en fonction de la selection d'état que recevra la carte FPGA de la carte mère. Et la fonction transmission qui effectue le registre à décalage.   &lt;br /&gt;
&lt;br /&gt;
Ce code, que vous trouverez dans le git, compile, en revanche nous n'avons pas pu faire de tests dessus malheureusement.  &lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet pour la carte clavier est de lire les boutons qui sont enfoncés afin de les envoyer à la carte mère via le bus SPI. &lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte :  [[Fichier:Schematique_clavier.png|centré|sans_cadre|511x511px]]Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches qui sont : la flèche de gauche, la flèche de droite, l'espace, un retour chariot, le suppression et enfin un shift qui nous permettra de switcher avec les 10 chiffres (de 0 à 9), &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation&lt;br /&gt;
* un ATmega328p&lt;br /&gt;
* un connecteur HE10 8 pins pour un bus SPI + une ligne d'interruption pour communiquer avec la carte mère&lt;br /&gt;
* un connecteur 6 pins(2x3) pour un bus SPI afin de programmer la carte.&lt;br /&gt;
&amp;lt;u&amp;gt;Fonctionnement matrice de touches :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but ici est de pouvoir lire la touche sur laquelle nous avons appuyé pour l'envoyer à la carte mère. Ici, l'idée est d'utiliser le fonctionnement de la matrice de touche qui est le suivant : &lt;br /&gt;
&lt;br /&gt;
Premièrement, il faut se décider duquel entre les lignes et les colonnes seront en entrée et l'autre en sortie. Ici se sont les lignes qui sont en sortie et les colonnes en entrée. &lt;br /&gt;
&lt;br /&gt;
L'idée est simple : alterner entre les lignes pour écrire un 0L sur 1 ligne et sur les autres un 1L. On parcourt ensuite toutes les colonnes (de la ligne à 0L). Si on lit un 0L sur une colonne, alors il suffit d'associer la ligne qui est à 0L avec celle de la colonne et on connait la touche qui a été appuyée. &lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up qui se trouvent au niveau des lignes serviront  à avoir un 1L par défaut. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le routage de la carte : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.&lt;br /&gt;
&lt;br /&gt;
Pour faire ce routage, nous avons dû créer le footprint des boutons, alors la prise des mesures sur le boutons était nécessaire. Aussi, nous avons décidé d'utiliser un ATmega328p avec des pins traversants pour une question de facilité au niveau de la soudure mais également pour éviter tout court-circuit et donc une perte de temps. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]][[Fichier:3d view.png|sans_cadre|235x235px]][[Fichier:3d view bottom.png|sans_cadre|235x235px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réel clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte_soude.jpg|sans_cadre|266x266px]]&lt;br /&gt;
&lt;br /&gt;
=== Partie programmation ===&lt;br /&gt;
La programmation de notre carte se fera via un AVR ISP &lt;br /&gt;
&lt;br /&gt;
Pour cela, on utilise une carte arduino uno dans laquelle on téléverse le programme Arduino ISP, disponible dans les exemples de l'IDE arduino, pour permettre a l'arduino uno d'envoyer notre code vers la carte clavier via le connecteur HE10.   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma AVR ISP.png|centré|400x400px|sans_cadre]]&lt;br /&gt;
Pour flasher notre carte clavier, 2 solutions : &lt;br /&gt;
&lt;br /&gt;
* utiliser l'IDE arduino, en utilisant le paramètre &amp;quot;upload using programmer&amp;quot; qui permet de televerser du code dans une atmega en passant par le bus SPI. Mais cela néccesite d'écrire le code sur l'IDE arduino. Cette solution permettra simplement de faire des tests rapides en utilisant, par exemple, l'exemple &amp;quot;Blink&amp;quot;.&lt;br /&gt;
* Créer un Makefile qui permet de téléverser notre code C vers la carte fille en passant par l'arduino uno :&lt;br /&gt;
[[Fichier:Makefil.png|sans_cadre|450x450px]]  &lt;br /&gt;
&lt;br /&gt;
==== Programme de tests sur la carte ====&lt;br /&gt;
Nous sommes ensuite passés au différents tests de la carte pour tester chaque fonctionnalités.   &lt;br /&gt;
&lt;br /&gt;
===== Premier test : la carte est-elle programmable ? =====&lt;br /&gt;
On utilise un programme très simple qui allume une des LEDs de la carte, le &amp;quot;Blink&amp;quot; disponible dans les exemples de l'IDE arduino. &lt;br /&gt;
&lt;br /&gt;
Cependant, en essayant de programmer la carte, aucune LEDs ne clignotait. Comme le code ne venait pas de nous et qe c'est un code simple, le problème ne pouvait venir que du côté du hardware. Nous avons donc tester notre carte au multimètre et il y avait effectivement un court-circuit au niveau du crystal qui empêchait forcement son fonctionnement. L'erreur vient de notre schématique puisque nous avons tourné à 90° le composant, ce qui créé effectivement un court-circuit. Pour remédier à notre problème, nous avons dé-souder le crystal et l'avons décalé sur la carte. &lt;br /&gt;
&lt;br /&gt;
Une fois le crystal re-soudé dans le bon sens, nous avons pu flasher la carte clavier avec le programme &amp;quot;Blink&amp;quot;&lt;br /&gt;
[[Fichier:Led_allumee_clavier.png|centré|sans_cadre|241x241px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; La LED clignote, ce qui nous permet de valider le faite que la carte est programmable via notre AVR ISP.&lt;br /&gt;
&lt;br /&gt;
===== Deuxième test : la lecture d'un bouton =====&lt;br /&gt;
our commencer les tests, nous cherchons à allumer une LED quand on appuie sur un bouton en particulier. Pour cela, nous avons mis à 0L la ligne sur PC3 et lu la colonne sur PD0 :   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test_clavier.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Id 1bouton.mov|centré|vignette|Reconnaissance d'1 bouton avec une Led]]Ce test nous a permit de vérifier 2 choses : &lt;br /&gt;
&lt;br /&gt;
* que notre carte permet de reconnaître l'appuie sur un bouton &lt;br /&gt;
* que nous arrivions bien à utiliser les Leds de notre carte. Ainsi nous avons nos &amp;quot;calculs&amp;quot; avec les décalages et les opérations logiques utiles pour mettre à 0L ou lire sur le port une entrée.&lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons gardé l'idée d'allumer une Led lorsqu'un bouton est enfoncé.          &lt;br /&gt;
&lt;br /&gt;
'''Problème rencontré :''' Au début nous n'arrivions par à lire le bouton bien que notre code soit simple. Nous avons donc vérifié au multimètre si nos boutons étaient bien soudés. Au multimètre, les 4 broches de chaque bouton étaient reliés (donc en court-circuit), ce n'est absolument pas normal. Effectivement, lorsque nous avions créé les footprints des boutons nous n'avons pas mis les broches au bon endroit. Dans les boutons il y a déjà des broches reliées et dans nos footprint nous n'avons pas mis les bons chiffres des broches correctement : ce qui nous a créé un court-circuit. Pour contrer ce problème, nous avons tourné à 90° chaque bouton. C n'était pas simple car il a fallut redresser les pins pour qu'ils rentrent bien dans les trous de la carte. Finalement les boutons fonctionnent correctement et les boutons restent assez droits.    &lt;br /&gt;
&lt;br /&gt;
===== Troisième test : lecture de tous les boutons + shift =====&lt;br /&gt;
Pour commencer, on definit notre matrice de touches grâce à un tableau à 2 dimensions, ça nous permettra de récupérer directement les bonnes touches.  &lt;br /&gt;
&lt;br /&gt;
Nous voulions mettre notre clavier en AZERTY, malheureusement notre matrice ne nous le permet pas, alors les touches seront dans l'ordre alphabétique. Dans le code, les lettres ne sont pas dans l'ordre simplement parce que lors du routage nous n'avons pas laissé les boutons comme dans la schématique par simplicité de routage : &lt;br /&gt;
[[Fichier:Matrice touches.png|gauche|sans_cadre]]&lt;br /&gt;
&amp;lt;u&amp;gt;traduction des valeurs hexadécimales :&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 0x0E : le shift &lt;br /&gt;
* 0x08 : suppression&lt;br /&gt;
* 0x1C : flèche gauche &lt;br /&gt;
* 0x1D : flèche droite &lt;br /&gt;
&lt;br /&gt;
Ce sont simplement les codes en ASCII. &lt;br /&gt;
[[Fichier:Lecture touches.png|gauche|sans_cadre|400x400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Cette fonction nous permet d'effectuer la lecture d'une touche avec la méthode du clavier matriciel que nous avons expliqué plus haut. &lt;br /&gt;
&lt;br /&gt;
Ainsi, pour chaque ligne à 0L on lira sur chaque colonne et on vérifie si elle est égale à 0L. Si oui, on retourne directement la valeur de la touche en retournant notre matrice de touches avec les indices de la ligne et de la colonne en cours. &lt;br /&gt;
&lt;br /&gt;
Il y a une condition supplémentaire : si la touche appuyée est le shift (0x0E). Dans ce cas, on bascule on recommence la même méthode, mais cette fois on retournera la valeur appuyée mais grâce à la deuxième matrice cette fois puisqu'elle contient les chiffres de 0 à 9. &lt;br /&gt;
&lt;br /&gt;
Ici, l'utilisateur devra appuyer sur le bouton pour les chiffres en même temps que le bouton du shift. &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;
Finalement, notre clavier ce présent comme ceci : &lt;br /&gt;
[[Fichier:Tableau du clavier.png|gauche|Clavier sans appuie sur SHIFT|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma clavier avec appuie sur SHIFT.png|clavier avec appuie sur SHIFT|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous aurions voulu faire un clavier AZERTY mais la matrice n'est pas de la bonne forme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Quatrième test : le bus SPI =====&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie est d'envoyer les touches lues par le clavier vers la carte mère grâce au bus SPI.  &lt;br /&gt;
&lt;br /&gt;
Coté carte fille, le bus SPI est utilisé en interruption. Lorsque qu'une donnée est envoyé sur le MOSI, la programme du clavier rentre dans une interruption (ISR) pour renvoyer une info sur le MISO. &lt;br /&gt;
&lt;br /&gt;
Cela nous permet par exemple d'envoyer une valeur sur le MOSI, et de récupérer une donnée sur le MISO en fonction de la valeur envoyé depuis le MOSI. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ISR(SPI_STC_vect) {&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   char data = SPDR;&amp;lt;/code&amp;gt;                   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   _delay_ms(40);&amp;lt;/code&amp;gt;                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   if(data == 0x00) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = '!';&amp;lt;/code&amp;gt;                     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x05) {&amp;lt;/code&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = bouton;&amp;lt;/code&amp;gt;                      bouton : touche qui a été appuyée  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication de la communication en bus SPI :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, l'idée est de communiquer avec la carte mère. Pour cela, voici un schéma explicatif de notre méthode de communication : &lt;br /&gt;
 [[Fichier:Schéma communication SPI.png|centré|cadre]] &lt;br /&gt;
&lt;br /&gt;
Lorsque la carte clavier lie une touche, la ligne d'interruption passe à l'état haut. &lt;br /&gt;
&lt;br /&gt;
La carte mère rentre en interruption et va alors demander quelle carte a déclenché l'interruption. &lt;br /&gt;
&lt;br /&gt;
Si c'est la carte clavier qui a déclenché l'interruption alors le carte mère demande le nombre de touche à récupérer, puis récupère une a une les touches.  &lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' la taille du tampon sera, le plus souvent, égale à 1 puisque le microcontrôleur est plus rapide que l'humain qui tape au clavier. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de tester notre communication SPI, nous avons utiliser un Arduino uno qui &amp;quot;remplace&amp;quot; la carte mère. et qui envoi les valeurs 0x00, 0x01 ou 0x05, le carte mère à la lecture de la valeur doit répondre par une autre valeur. &lt;br /&gt;
&lt;br /&gt;
En revanche, après beaucoup de tests non concluant,  la communication ne fonctionnait pas. Nous avons alors regardé à l’oscilloscope l'allure de nos signaux MISO et MOSI :  &lt;br /&gt;
&lt;br /&gt;
* Le MOSI était cohérent avec les données envoyées&lt;br /&gt;
* Le MISO en revanche a des valeurs de tensions écrasées, ce qui fait que la valeur récupérée par le maitre est toujours nulle.&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:MOSI.png|gauche|vignette|MOSI]]&lt;br /&gt;
[[Fichier:MISO.png|centré|vignette|MISO|290x290px]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; Après de nombreux essais sur différents shield, le bus SPI de certaines cartes ne fonctionnent pas, et d'autres fonctionnent, et ce même avec un code identiques. C'est assez troublant puisque même avec la dernière carte modifiée et soudée par M. Redon, le bus SPI ne fonctionne pas avec notre code. La seule carte avec laquelle nos programmes fonctionnent, c'est avec celle du groupe 9. Les shields des binômes 4,5 et 6 ont ce problème.                  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Clavier sansINT shift.mp4|centré|vignette|Envoi des boutons lu par SPI]]   &lt;br /&gt;
&lt;br /&gt;
===== Cinquième test : affichage sur le port série =====&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier plus précisément notre communication SPI, nous avons utiliser le port série de l'arduino uno pour pouvoir voir les données qui sont envoyé depuis la carte clavier, et ainsi s'assurer que quand on appuie sur une touche du clavier, la carte mère récupère bien le code ASCII de cette touche. &lt;br /&gt;
&lt;br /&gt;
Pour ce faire, nous utilisons la même fonction &amp;lt;code&amp;gt;serie_envoyer()&amp;lt;/code&amp;gt; que dans l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                        &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_activer();&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(20);&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     data_recue = spi_envoi(0x05);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     serie_envoyer(data_recue);&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_desactiver();&amp;lt;/code&amp;gt;            &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(100);&amp;lt;/code&amp;gt;              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
Le but étant, ici, d'envoyer directement la demande de touche et de l'afficher directement sur le port série grâce au &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Programme final ===&lt;br /&gt;
Finalement, l'idée est de stocker les touches appuyées dans un tableau, pour pouvoir les envoyer à la carte mère lorsqu'elle le demande. Avant la demande de touche, la carte mère envoi la donnée 0x00 pour que l'on réponde que la carte est un clavier avec le caractère '!'. Nous avons décidé d'utilisé cette réponse seulement pour que l'on puisse l'afficher sur le port série (0x05 étant un caractère non imprimable). &lt;br /&gt;
&lt;br /&gt;
Voici les fonctions qui permettent d'ajouter et de supprimer les touches du tampon : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void remplir_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[cpt_tampon] = bouton;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon++;&amp;lt;/code&amp;gt;                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void vider_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for (int i=0; i &amp;lt; cpt_tampon; i++) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if (i == cpt_tampon - 1 ) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;} else {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = tampon[i+1];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon--;&amp;lt;/code&amp;gt;                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
L'idée est de vider le  tampon à chaque fois que l'on envoi le tableau à la case 0 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(data == 0x05) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SPDR = tampon[0];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;vider_tampon();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(cpt_tampon == 0) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PC4);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                &lt;br /&gt;
&lt;br /&gt;
En conclusion, le programme de la carte mère envoi la demande d'identification (0x00) ainsi que la demande de touche. Et le programme du clavier envoi le caractère '!', et par la suite la touche du tampon. &lt;br /&gt;
[[Fichier:Id touche tampon.mov|centré|cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' ce code n'est pas parfait puisqu'il écrit 1 fois de trop le caractère. Ex : si on appuie sur 'A', on lira sur le port série 'A', en revanche si on appuie juste après sur 'B', on lira 'A' puis 'B'. Nous n'avons malheureusement pas pu décoder cette erreur. &lt;br /&gt;
&lt;br /&gt;
==== Points importants à savoir ====&lt;br /&gt;
il faut débrancher et rebrancher le câble du bus SPI pour que la communication fonctionne. Aussi, si le programme du maître ne s'injecte pas dans l'Arduino, il faut insérer d'abord un programme d'exemple comme ArduinoISP. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons mis à part des programmes fonctionnels dans les répertoires nommés &amp;quot;Codes_OK&amp;quot;. Tout est expliqué dans des README qui se trouvent (presque) dans chaque répertoire. Un README qui se trouve dans le répertoire clavier/Code explique ce que les combinaisons de codes du maître et de l'esclave font. Des vidéos se trouvent également dans le répertoire Videos, qui montrent la fonctionnalité de chaque codes. Il y a d'ailleurs &amp;lt;u&amp;gt;plus (+) de vidéos&amp;lt;/u&amp;gt; sur le git. &lt;br /&gt;
 &lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Notre carte clavier est capable de lire chacune des touches et associe a chacune d'elle un caractère ASCII. Le clavier possède aussi un système de shift pour pouvoir taper les chiffres de 0 à 9. La précision du clavier n'est pas optimale et va parfois lire 2 fois la même touche quand on appuie sur un bouton. Il faudrait pour corriger ça retravailler les différents délais mais nous avons déjà passée pas mal de temps à régler nos délais sans trouver le timing parfait si il existe.&lt;br /&gt;
&lt;br /&gt;
Notre bus SPI nous permet d'envoyer les touches du clavier vers la carte mère et d'identifier la carte clavier.&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3092</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3092"/>
		<updated>2024-01-18T15:48:06Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Points importants à savoir */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]    &lt;br /&gt;
&lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Lors de la première séance de Pico, nous avons soudé quelques cartes telles que le Shield, la carte de leds et la carte 7 segments : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre|205x205px]][[Fichier:CartePin.png|sans_cadre|209x209px]][[Fichier:7_segments.png|sans_cadre|213x213px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre|203x203px]][[Fichier:Back.png|sans_cadre|200x200px]]&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino qui nous servirons pour la communication du bus SPI : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre|169x169px]]&lt;br /&gt;
=== Programmation Ordonnancement ===&lt;br /&gt;
&lt;br /&gt;
==== Clignotement de 2 Leds ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente :   [[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]'''Remarque :''' Les temps ne sont pas réels, l'objectif est donc d'endormir les tâches.   &lt;br /&gt;
&lt;br /&gt;
Voici cette fois le clignotement des 2 Leds avec l'endormissement des tâches :          &lt;br /&gt;
&lt;br /&gt;
==== Lecture sur port série en mémoire partagée ====&lt;br /&gt;
Par la suite, nous voulons ordonnancer une tâche qui permet de stocker dans une mémoire partagée la valeur reçue sur le port série.  &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons utilisé : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_recevoir(void) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A, RXC0);&amp;lt;/code&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = UDR0;&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;                               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                             &lt;br /&gt;
&lt;br /&gt;
Ici, la variable globale (mémoire partagée) est une variable globale (received_data) en unsigned char.  &lt;br /&gt;
&lt;br /&gt;
Pour lire sur le port série, on utilisera la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
==== Lecture/écriture sur port série ====&lt;br /&gt;
Afin de vérifier le code que nous avons écris dans la partie d'avant, nous écrirons sur le port série ce que nous avons lu. En d'autres termes, nous écrirons sur le port série ce que nous avons écris sur le clavier. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_envoyer(void) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A,UDRE0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UDR0=received_data;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
Sans remettre à '\0' comme ici, lorsque l'on appuie sur une touche, celle-ci s'affiche jusqu'à l'appuie d'une autre touche  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                         &lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                            &lt;br /&gt;
&lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous devons implémenter un contrôleur de bus série SPI. &lt;br /&gt;
&lt;br /&gt;
Tout d'abord, voici comment fonctionne un bus SPI : &lt;br /&gt;
&lt;br /&gt;
Dans un bus SPI, il y a 1 maître et 1 ou plusieurs esclaves. Le transmission des données se font sur 2 fils : MISO et MOSI : &lt;br /&gt;
&lt;br /&gt;
- MOSI : Données du maître vers l'esclave,&lt;br /&gt;
&lt;br /&gt;
- MISO : Données de l'esclave vers le maître.&lt;br /&gt;
&lt;br /&gt;
Puisqu'il y a plusieurs esclaves, le SS (Ship Select) permet d'autoriser 1 esclave précis en l'activant à 0. &lt;br /&gt;
&lt;br /&gt;
Les échanges se font sur front et sont synchronisés par le maître. &lt;br /&gt;
&lt;br /&gt;
Lorsqu'un octet du maître passe dans le registre de l'esclave, celui de l'esclave passe dans le registre du maître simultanément comme représenté sur l'image ci-dessous. C'est le principe du registre à décalage.&lt;br /&gt;
[[Fichier:Chemin spi.png|centré|sans_cadre]]Le contrôleur SPI doit jouer le rôle du maître et va contrôler les pins du bus SPI pour échanger des données.   &lt;br /&gt;
[[Fichier:Schéma bloc du driver SPI.png|centré|vignette|442x442px]]      &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons écris en VHDL :  &lt;br /&gt;
&lt;br /&gt;
Dans un process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;case ETAT is&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when REPOS =&amp;gt; ETAT &amp;lt;= TRANSMISSION;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when TRANSMISSION =&amp;gt; if compteur = 8 then&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ETAT &amp;lt;= REPOS;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;compteur &amp;lt;= 0;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;else compteur &amp;lt;= compteur + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end if;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for i in 0 to 6 loop&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(i) &amp;lt;= mosi_in(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(i) &amp;lt;= data_out_s(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end loop;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(7) &amp;lt;= data_in_s(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(7) &amp;lt;= mosi_in(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end case;&amp;lt;/code&amp;gt;                                                           &lt;br /&gt;
&lt;br /&gt;
Hors du process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS1 &amp;lt;= '1' when select_carte = &amp;quot;001&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS2 &amp;lt;= '1' when select_carte = &amp;quot;010&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS3 &amp;lt;= '1' when select_carte = &amp;quot;100&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé une machine d'état avec 2 états : un état REPOS qui permet de passer à l'état TRANSMISSION et de mettre à 1 ou à 0 les Chip Select en fonction de la selection d'état que recevra la carte FPGA de la carte mère. Et la fonction transmission qui effectue le registre à décalage.   &lt;br /&gt;
&lt;br /&gt;
Ce code, que vous trouverez dans le git, compile, en revanche nous n'avons pas pu faire de tests dessus malheureusement.  &lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet pour la carte clavier est de lire les boutons qui sont enfoncés afin de les envoyer à la carte mère via le bus SPI. &lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte :  [[Fichier:Schematique_clavier.png|centré|sans_cadre|511x511px]]Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches qui sont : la flèche de gauche, la flèche de droite, l'espace, un retour chariot, le suppression et enfin un shift qui nous permettra de switcher avec les 10 chiffres (de 0 à 9), &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation&lt;br /&gt;
* un ATmega328p&lt;br /&gt;
* un connecteur HE10 8 pins pour un bus SPI + une ligne d'interruption pour communiquer avec la carte mère&lt;br /&gt;
* un connecteur 6 pins(2x3) pour un bus SPI afin de programmer la carte.&lt;br /&gt;
&amp;lt;u&amp;gt;Fonctionnement matrice de touches :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but ici est de pouvoir lire la touche sur laquelle nous avons appuyé pour l'envoyer à la carte mère. Ici, l'idée est d'utiliser le fonctionnement de la matrice de touche qui est le suivant : &lt;br /&gt;
&lt;br /&gt;
Premièrement, il faut se décider duquel entre les lignes et les colonnes seront en entrée et l'autre en sortie. Ici se sont les lignes qui sont en sortie et les colonnes en entrée. &lt;br /&gt;
&lt;br /&gt;
L'idée est simple : alterner entre les lignes pour écrire un 0L sur 1 ligne et sur les autres un 1L. On parcourt ensuite toutes les colonnes (de la ligne à 0L). Si on lit un 0L sur une colonne, alors il suffit d'associer la ligne qui est à 0L avec celle de la colonne et on connait la touche qui a été appuyée. &lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up qui se trouvent au niveau des lignes serviront  à avoir un 1L par défaut. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le routage de la carte : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.&lt;br /&gt;
&lt;br /&gt;
Pour faire ce routage, nous avons dû créer le footprint des boutons, alors la prise des mesures sur le boutons était nécessaire. Aussi, nous avons décidé d'utiliser un ATmega328p avec des pins traversants pour une question de facilité au niveau de la soudure mais également pour éviter tout court-circuit et donc une perte de temps. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]][[Fichier:3d view.png|sans_cadre|235x235px]][[Fichier:3d view bottom.png|sans_cadre|235x235px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réel clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte_soude.jpg|sans_cadre|266x266px]]&lt;br /&gt;
&lt;br /&gt;
=== Partie programmation ===&lt;br /&gt;
La programmation de notre carte se fera via un AVR ISP &lt;br /&gt;
&lt;br /&gt;
Pour cela, on utilise une carte arduino uno dans laquelle on téléverse le programme Arduino ISP, disponible dans les exemples de l'IDE arduino, pour permettre a l'arduino uno d'envoyer notre code vers la carte clavier via le connecteur HE10.   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma AVR ISP.png|centré|400x400px|sans_cadre]]&lt;br /&gt;
Pour flasher notre carte clavier, 2 solutions : &lt;br /&gt;
&lt;br /&gt;
* utiliser l'IDE arduino, en utilisant le paramètre &amp;quot;upload using programmer&amp;quot; qui permet de televerser du code dans une atmega en passant par le bus SPI. Mais cela néccesite d'écrire le code sur l'IDE arduino. Cette solution permettra simplement de faire des tests rapides en utilisant, par exemple, l'exemple &amp;quot;Blink&amp;quot;.&lt;br /&gt;
* Créer un Makefile qui permet de téléverser notre code C vers la carte fille en passant par l'arduino uno :&lt;br /&gt;
[[Fichier:Makefil.png|sans_cadre|450x450px]]  &lt;br /&gt;
&lt;br /&gt;
==== Programme de tests sur la carte ====&lt;br /&gt;
Nous sommes ensuite passés au différents tests de la carte pour tester chaque fonctionnalités.   &lt;br /&gt;
&lt;br /&gt;
===== Premier test : la carte est-elle programmable ? =====&lt;br /&gt;
On utilise un programme très simple qui allume une des LEDs de la carte, le &amp;quot;Blink&amp;quot; disponible dans les exemples de l'IDE arduino. &lt;br /&gt;
&lt;br /&gt;
Cependant, en essayant de programmer la carte, aucune LEDs ne clignotait. Comme le code ne venait pas de nous et qe c'est un code simple, le problème ne pouvait venir que du côté du hardware. Nous avons donc tester notre carte au multimètre et il y avait effectivement un court-circuit au niveau du crystal qui empêchait forcement son fonctionnement. L'erreur vient de notre schématique puisque nous avons tourné à 90° le composant, ce qui créé effectivement un court-circuit. Pour remédier à notre problème, nous avons dé-souder le crystal et l'avons décalé sur la carte. &lt;br /&gt;
&lt;br /&gt;
Une fois le crystal re-soudé dans le bon sens, nous avons pu flasher la carte clavier avec le programme &amp;quot;Blink&amp;quot;&lt;br /&gt;
[[Fichier:Led_allumee_clavier.png|centré|sans_cadre|241x241px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; La LED clignote, ce qui nous permet de valider le faite que la carte est programmable via notre AVR ISP.&lt;br /&gt;
&lt;br /&gt;
===== Deuxième test : la lecture d'un bouton =====&lt;br /&gt;
our commencer les tests, nous cherchons à allumer une LED quand on appuie sur un bouton en particulier. Pour cela, nous avons mis à 0L la ligne sur PC3 et lu la colonne sur PD0 :   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test_clavier.png|sans_cadre|600x600px]] &lt;br /&gt;
&lt;br /&gt;
VIDEO TEST BOUTON   &lt;br /&gt;
&lt;br /&gt;
Ce test nous a permit de vérifier 2 choses : &lt;br /&gt;
&lt;br /&gt;
* que notre carte permet de reconnaître l'appuie sur un bouton &lt;br /&gt;
* que nous arrivions bien à utiliser les Leds de notre carte. Ainsi nous avons nos &amp;quot;calculs&amp;quot; avec les décalages et les opérations logiques utiles pour mettre à 0L ou lire sur le port une entrée.&lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons gardé l'idée d'allumer une Led lorsqu'un bouton est enfoncé.          &lt;br /&gt;
&lt;br /&gt;
'''Problème rencontré :''' Au début nous n'arrivions par à lire le bouton bien que notre code soit simple. Nous avons donc vérifié au multimètre si nos boutons étaient bien soudés. Au multimètre, les 4 broches de chaque bouton étaient reliés (donc en court-circuit), ce n'est absolument pas normal. Effectivement, lorsque nous avions créé les footprints des boutons nous n'avons pas mis les broches au bon endroit. Dans les boutons il y a déjà des broches reliées et dans nos footprint nous n'avons pas mis les bons chiffres des broches correctement : ce qui nous a créé un court-circuit. Pour contrer ce problème, nous avons tourné à 90° chaque bouton. C n'était pas simple car il a fallut redresser les pins pour qu'ils rentrent bien dans les trous de la carte. Finalement les boutons fonctionnent correctement et les boutons restent assez droits.  &lt;br /&gt;
&lt;br /&gt;
===== Troisième test : lecture de tous les boutons + shift =====&lt;br /&gt;
Pour commencer, on definit notre matrice de touches grâce à un tableau à 2 dimensions, ça nous permettra de récupérer directement les bonnes touches.  &lt;br /&gt;
&lt;br /&gt;
Nous voulions mettre notre clavier en AZERTY, malheureusement notre matrice ne nous le permet pas, alors les touches seront dans l'ordre alphabétique. Dans le code, les lettres ne sont pas dans l'ordre simplement parce que lors du routage nous n'avons pas laissé les boutons comme dans la schématique par simplicité de routage : &lt;br /&gt;
[[Fichier:Matrice touches.png|gauche|sans_cadre]]&lt;br /&gt;
&amp;lt;u&amp;gt;traduction des valeurs hexadécimales :&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 0x0E : le shift &lt;br /&gt;
* 0x08 : suppression&lt;br /&gt;
* 0x1C : flèche gauche &lt;br /&gt;
* 0x1D : flèche droite &lt;br /&gt;
&lt;br /&gt;
Ce sont simplement les codes en ASCII. &lt;br /&gt;
[[Fichier:Lecture touches.png|gauche|sans_cadre|400x400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Cette fonction nous permet d'effectuer la lecture d'une touche avec la méthode du clavier matriciel que nous avons expliqué plus haut. &lt;br /&gt;
&lt;br /&gt;
Ainsi, pour chaque ligne à 0L on lira sur chaque colonne et on vérifie si elle est égale à 0L. Si oui, on retourne directement la valeur de la touche en retournant notre matrice de touches avec les indices de la ligne et de la colonne en cours. &lt;br /&gt;
&lt;br /&gt;
Il y a une condition supplémentaire : si la touche appuyée est le shift (0x0E). Dans ce cas, on bascule on recommence la même méthode, mais cette fois on retournera la valeur appuyée mais grâce à la deuxième matrice cette fois puisqu'elle contient les chiffres de 0 à 9. &lt;br /&gt;
&lt;br /&gt;
Ici, l'utilisateur devra appuyer sur le bouton pour les chiffres en même temps que le bouton du shift. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Finalement, notre clavier ce présent comme ceci : &lt;br /&gt;
[[Fichier:Tableau du clavier.png|gauche|cadre|Clavier sans appuie sur SHIFT]]&lt;br /&gt;
[[Fichier:Schéma clavier avec appuie sur SHIFT.png|centré|cadre|clavier avec appuie sur SHIFT]]&lt;br /&gt;
&lt;br /&gt;
===== Quatrième test : le bus SPI =====&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie est d'envoyer les touches lues par le clavier vers la carte mère grâce au bus SPI.  &lt;br /&gt;
&lt;br /&gt;
Coté carte fille, le bus SPI est utilisé en interruption. Lorsque qu'une donnée est envoyé sur le MOSI, la programme du clavier rentre dans une interruption (ISR) pour renvoyer une info sur le MISO. &lt;br /&gt;
&lt;br /&gt;
Cela nous permet par exemple d'envoyer une valeur sur le MOSI, et de récupérer une donnée sur le MISO en fonction de la valeur envoyé depuis le MOSI. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ISR(SPI_STC_vect) {&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   char data = SPDR;&amp;lt;/code&amp;gt;                   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   _delay_ms(40);&amp;lt;/code&amp;gt;                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   if(data == 0x00) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = '!';&amp;lt;/code&amp;gt;                     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x05) {&amp;lt;/code&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = bouton;&amp;lt;/code&amp;gt;                      bouton : touche qui a été appuyée  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication de la communication en bus SPI :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, l'idée est de communiquer avec la carte mère. Pour cela, voici un schéma explicatif de notre méthode de communication : &lt;br /&gt;
 [[Fichier:Schéma communication SPI.png|centré|cadre]] &lt;br /&gt;
&lt;br /&gt;
Lorsque la carte clavier lie une touche, la ligne d'interruption passe à l'état haut. &lt;br /&gt;
&lt;br /&gt;
La carte mère rentre en interruption et va alors demander quelle carte a déclenché l'interruption. &lt;br /&gt;
&lt;br /&gt;
Si c'est la carte clavier qui a déclenché l'interruption alors le carte mère demande le nombre de touche à récupérer, puis récupère une a une les touches.  &lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' la taille du tampon sera, le plus souvent, égale à 1 puisque le microcontrôleur est plus rapide que l'humain qui tape au clavier. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de tester notre communication SPI, nous avons utiliser un Arduino uno qui &amp;quot;remplace&amp;quot; la carte mère. et qui envoi les valeurs 0x00, 0x01 ou 0x05, le carte mère à la lecture de la valeur doit répondre par une autre valeur. &lt;br /&gt;
&lt;br /&gt;
En revanche, après beaucoup de tests non concluant,  la communication ne fonctionnait pas. Nous avons alors regardé à l’oscilloscope l'allure de nos signaux MISO et MOSI :  &lt;br /&gt;
&lt;br /&gt;
* Le MOSI était cohérent avec les données envoyées&lt;br /&gt;
* Le MISO en revanche a des valeurs de tensions écrasées, ce qui fait que la valeur récupérée par le maitre est toujours nulle.&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:MOSI.png|gauche|vignette|MOSI]]&lt;br /&gt;
[[Fichier:MISO.png|centré|vignette|MISO|290x290px]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; Après de nombreux essais sur différents shield, le bus SPI de certaines cartes ne fonctionnent pas, et d'autres fonctionnent, et ce même avec un code identiques. C'est assez troublant puisque même avec la dernière carte modifiée et soudée par M. Redon, le bus SPI ne fonctionne pas avec notre code. La seule carte avec laquelle nos programmes fonctionnent, c'est avec celle du groupe 9. Les shields des binômes 4,5 et 6 ont ce problème.   &lt;br /&gt;
&lt;br /&gt;
===== Cinquième test : affichage sur le port série =====&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier plus précisément notre communication SPI, nous avons utiliser le port série de l'arduino uno pour pouvoir voir les données qui sont envoyé depuis la carte clavier, et ainsi s'assurer que quand on appuie sur une touche du clavier, la carte mère récupère bien le code ASCII de cette touche. &lt;br /&gt;
&lt;br /&gt;
Pour ce faire, nous utilisons la même fonction &amp;lt;code&amp;gt;serie_envoyer()&amp;lt;/code&amp;gt; que dans l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                        &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_activer();&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(20);&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     data_recue = spi_envoi(0x05);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     serie_envoyer(data_recue);&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_desactiver();&amp;lt;/code&amp;gt;            &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(100);&amp;lt;/code&amp;gt;              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
Le but étant, ici, d'envoyer directement la demande de touche et de l'afficher directement sur le port série grâce au &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo montrant le fonctionnement de notre clavier : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;VIDEO&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Programme final ===&lt;br /&gt;
Finalement, l'idée est de stocker les touches appuyées dans un tableau, pour pouvoir les envoyer à la carte mère lorsqu'elle le demande. Avant la demande de touche, la carte mère envoi la donnée 0x00 pour que l'on réponde que la carte est un clavier avec le caractère '!'. Nous avons décidé d'utilisé cette réponse seulement pour que l'on puisse l'afficher sur le port série (0x05 étant un caractère non imprimable). &lt;br /&gt;
&lt;br /&gt;
Voici les fonctions qui permettent d'ajouter et de supprimer les touches du tampon : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void remplir_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[cpt_tampon] = bouton;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon++;&amp;lt;/code&amp;gt;                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void vider_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for (int i=0; i &amp;lt; cpt_tampon; i++) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if (i == cpt_tampon - 1 ) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;} else {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = tampon[i+1];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon--;&amp;lt;/code&amp;gt;                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
L'idée est de vider le  tampon à chaque fois que l'on envoi le tableau à la case 0 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(data == 0x05) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SPDR = tampon[0];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;vider_tampon();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(cpt_tampon == 0) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PC4);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                &lt;br /&gt;
&lt;br /&gt;
En conclusion, le programme de la carte mère envoi la demande d'identification (0x00) ainsi que la demande de touche. Et le programme du clavier envoi le caractère '!', et par la suite la touche du tampon. &lt;br /&gt;
[[Fichier:Id touche tampon.mov|centré|cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;VIDEO&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' ce code n'est pas parfait puisqu'il écrit 1 fois de trop le caractère. Ex : si on appuie sur 'A', on lira sur le port série 'A', en revanche si on appuie juste après sur 'B', on lira 'A' puis 'B'. Nous n'avons malheureusement pas pu décoder cette erreur. &lt;br /&gt;
&lt;br /&gt;
==== Points importants à savoir ====&lt;br /&gt;
il faut débrancher et rebrancher le câble du bus SPI pour que la communication fonctionne. Aussi, si le programme du maître ne s'injecte pas dans l'Arduino, il faut insérer d'abord un programme d'exemple comme ArduinoISP. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons mis à part des programmes fonctionnels dans les répertoires nommés &amp;quot;Codes_OK&amp;quot;. Tout est expliqué dans des README qui se trouvent (presque) dans chaque répertoire. Un README qui se trouve dans le répertoire clavier/Code explique ce que les combinaisons de codes du maître et de l'esclave font. Des vidéos se trouvent également dans le répertoire Videos, qui montrent la fonctionnalité de chaque codes. Il y a d'ailleurs &amp;lt;u&amp;gt;plus (+) de vidéos&amp;lt;/u&amp;gt; sur le git. &lt;br /&gt;
 &lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Notre carte clavier est capable de lire chacune des touches et associe a chacune d'elle un caractère ASCII. Le clavier possède aussi un système de shift pour pouvoir taper les chiffres de 0 à 9. La précision du clavier n'est pas optimale et va parfois lire 2 fois la même touche quand on appuie sur un bouton. Il faudrait pour corriger ça retravailler les différents délais mais nous avons déjà passée pas mal de temps à régler nos délais sans trouver le timing parfait si il existe.&lt;br /&gt;
&lt;br /&gt;
Notre bus SPI nous permet d'envoyer les touches du clavier vers la carte mère et d'identifier la carte clavier.&lt;br /&gt;
&lt;br /&gt;
==== Différentes vidéos ====&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3084</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3084"/>
		<updated>2024-01-18T15:35:34Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Deuxième test : la lecture d'un bouton */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]    &lt;br /&gt;
&lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Lors de la première séance de Pico, nous avons soudé quelques cartes telles que le Shield, la carte de leds et la carte 7 segments : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre|205x205px]][[Fichier:CartePin.png|sans_cadre|209x209px]][[Fichier:7_segments.png|sans_cadre|213x213px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre|203x203px]][[Fichier:Back.png|sans_cadre|200x200px]]&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino qui nous servirons pour la communication du bus SPI : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre|169x169px]]&lt;br /&gt;
=== Programmation Ordonnancement ===&lt;br /&gt;
&lt;br /&gt;
==== Clignotement de 2 Leds ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente :   [[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]'''Remarque :''' Les temps ne sont pas réels, l'objectif est donc d'endormir les tâches.   &lt;br /&gt;
&lt;br /&gt;
Voici cette fois le clignotement des 2 Leds avec l'endormissement des tâches :          &lt;br /&gt;
&lt;br /&gt;
==== Lecture sur port série en mémoire partagée ====&lt;br /&gt;
Par la suite, nous voulons ordonnancer une tâche qui permet de stocker dans une mémoire partagée la valeur reçue sur le port série.  &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons utilisé : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_recevoir(void) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A, RXC0);&amp;lt;/code&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = UDR0;&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;                               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                             &lt;br /&gt;
&lt;br /&gt;
Ici, la variable globale (mémoire partagée) est une variable globale (received_data) en unsigned char.  &lt;br /&gt;
&lt;br /&gt;
Pour lire sur le port série, on utilisera la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
==== Lecture/écriture sur port série ====&lt;br /&gt;
Afin de vérifier le code que nous avons écris dans la partie d'avant, nous écrirons sur le port série ce que nous avons lu. En d'autres termes, nous écrirons sur le port série ce que nous avons écris sur le clavier. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_envoyer(void) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A,UDRE0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UDR0=received_data;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
Sans remettre à '\0' comme ici, lorsque l'on appuie sur une touche, celle-ci s'affiche jusqu'à l'appuie d'une autre touche  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                         &lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                            &lt;br /&gt;
&lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous devons implémenter un contrôleur de bus série SPI. &lt;br /&gt;
&lt;br /&gt;
Tout d'abord, voici comment fonctionne un bus SPI : &lt;br /&gt;
&lt;br /&gt;
Dans un bus SPI, il y a 1 maître et 1 ou plusieurs esclaves. Le transmission des données se font sur 2 fils : MISO et MOSI : &lt;br /&gt;
&lt;br /&gt;
- MOSI : Données du maître vers l'esclave,&lt;br /&gt;
&lt;br /&gt;
- MISO : Données de l'esclave vers le maître.&lt;br /&gt;
&lt;br /&gt;
Puisqu'il y a plusieurs esclaves, le SS (Ship Select) permet d'autoriser 1 esclave précis en l'activant à 0. &lt;br /&gt;
&lt;br /&gt;
Les échanges se font sur front et sont synchronisés par le maître. &lt;br /&gt;
&lt;br /&gt;
Lorsqu'un octet du maître passe dans le registre de l'esclave, celui de l'esclave passe dans le registre du maître simultanément comme représenté sur l'image ci-dessous. C'est le principe du registre à décalage.&lt;br /&gt;
[[Fichier:Chemin spi.png|centré|sans_cadre]]Le contrôleur SPI doit jouer le rôle du maître et va contrôler les pins du bus SPI pour échanger des données.   &lt;br /&gt;
[[Fichier:Schéma bloc du driver SPI.png|centré|vignette|442x442px]]      &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons écris en VHDL :  &lt;br /&gt;
&lt;br /&gt;
Dans un process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;case ETAT is&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when REPOS =&amp;gt; ETAT &amp;lt;= TRANSMISSION;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when TRANSMISSION =&amp;gt; if compteur = 8 then&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ETAT &amp;lt;= REPOS;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;compteur &amp;lt;= 0;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;else compteur &amp;lt;= compteur + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end if;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for i in 0 to 6 loop&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(i) &amp;lt;= mosi_in(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(i) &amp;lt;= data_out_s(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end loop;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(7) &amp;lt;= data_in_s(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(7) &amp;lt;= mosi_in(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end case;&amp;lt;/code&amp;gt;                                                           &lt;br /&gt;
&lt;br /&gt;
Hors du process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS1 &amp;lt;= '1' when select_carte = &amp;quot;001&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS2 &amp;lt;= '1' when select_carte = &amp;quot;010&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS3 &amp;lt;= '1' when select_carte = &amp;quot;100&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé une machine d'état avec 2 états : un état REPOS qui permet de passer à l'état TRANSMISSION et de mettre à 1 ou à 0 les Chip Select en fonction de la selection d'état que recevra la carte FPGA de la carte mère. Et la fonction transmission qui effectue le registre à décalage.   &lt;br /&gt;
&lt;br /&gt;
Ce code, que vous trouverez dans le git, compile, en revanche nous n'avons pas pu faire de tests dessus malheureusement.  &lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet pour la carte clavier est de lire les boutons qui sont enfoncés afin de les envoyer à la carte mère via le bus SPI. &lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte :  [[Fichier:Schematique_clavier.png|centré|sans_cadre|511x511px]]Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches qui sont : la flèche de gauche, la flèche de droite, l'espace, un retour chariot, le suppression et enfin un shift qui nous permettra de switcher avec les 10 chiffres (de 0 à 9), &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation&lt;br /&gt;
* un ATmega328p&lt;br /&gt;
* un connecteur HE10 8 pins pour un bus SPI + une ligne d'interruption pour communiquer avec la carte mère&lt;br /&gt;
* un connecteur 6 pins(2x3) pour un bus SPI afin de programmer la carte.&lt;br /&gt;
&amp;lt;u&amp;gt;Fonctionnement matrice de touches :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but ici est de pouvoir lire la touche sur laquelle nous avons appuyé pour l'envoyer à la carte mère. Ici, l'idée est d'utiliser le fonctionnement de la matrice de touche qui est le suivant : &lt;br /&gt;
&lt;br /&gt;
Premièrement, il faut se décider duquel entre les lignes et les colonnes seront en entrée et l'autre en sortie. Ici se sont les lignes qui sont en sortie et les colonnes en entrée. &lt;br /&gt;
&lt;br /&gt;
L'idée est simple : alterner entre les lignes pour écrire un 0L sur 1 ligne et sur les autres un 1L. On parcourt ensuite toutes les colonnes (de la ligne à 0L). Si on lit un 0L sur une colonne, alors il suffit d'associer la ligne qui est à 0L avec celle de la colonne et on connait la touche qui a été appuyée. &lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up qui se trouvent au niveau des lignes serviront  à avoir un 1L par défaut. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le routage de la carte : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.&lt;br /&gt;
&lt;br /&gt;
Pour faire ce routage, nous avons dû créer le footprint des boutons, alors la prise des mesures sur le boutons était nécessaire. Aussi, nous avons décidé d'utiliser un ATmega328p avec des pins traversants pour une question de facilité au niveau de la soudure mais également pour éviter tout court-circuit et donc une perte de temps. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]][[Fichier:3d view.png|sans_cadre|235x235px]][[Fichier:3d view bottom.png|sans_cadre|235x235px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réel clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte_soude.jpg|sans_cadre|266x266px]]&lt;br /&gt;
&lt;br /&gt;
=== Partie programmation ===&lt;br /&gt;
La programmation de notre carte se fera via un AVR ISP &lt;br /&gt;
&lt;br /&gt;
Pour cela, on utilise une carte arduino uno dans laquelle on téléverse le programme Arduino ISP, disponible dans les exemples de l'IDE arduino, pour permettre a l'arduino uno d'envoyer notre code vers la carte clavier via le connecteur HE10.   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma AVR ISP.png|centré|400x400px|sans_cadre]]&lt;br /&gt;
Pour flasher notre carte clavier, 2 solutions : &lt;br /&gt;
&lt;br /&gt;
* utiliser l'IDE arduino, en utilisant le paramètre &amp;quot;upload using programmer&amp;quot; qui permet de televerser du code dans une atmega en passant par le bus SPI. Mais cela néccesite d'écrire le code sur l'IDE arduino. Cette solution permettra simplement de faire des tests rapides en utilisant, par exemple, l'exemple &amp;quot;Blink&amp;quot;.&lt;br /&gt;
* Créer un Makefile qui permet de téléverser notre code C vers la carte fille en passant par l'arduino uno :&lt;br /&gt;
[[Fichier:Makefil.png|sans_cadre|450x450px]]  &lt;br /&gt;
&lt;br /&gt;
==== Programme de tests sur la carte ====&lt;br /&gt;
Nous sommes ensuite passés au différents tests de la carte pour tester chaque fonctionnalités.   &lt;br /&gt;
&lt;br /&gt;
===== Premier test : la carte est-elle programmable ? =====&lt;br /&gt;
On utilise un programme très simple qui allume une des LEDs de la carte, le &amp;quot;Blink&amp;quot; disponible dans les exemples de l'IDE arduino. &lt;br /&gt;
&lt;br /&gt;
Cependant, en essayant de programmer la carte, aucune LEDs ne clignotait. Comme le code ne venait pas de nous et qe c'est un code simple, le problème ne pouvait venir que du côté du hardware. Nous avons donc tester notre carte au multimètre et il y avait effectivement un court-circuit au niveau du crystal qui empêchait forcement son fonctionnement. L'erreur vient de notre schématique puisque nous avons tourné à 90° le composant, ce qui créé effectivement un court-circuit. Pour remédier à notre problème, nous avons dé-souder le crystal et l'avons décalé sur la carte. &lt;br /&gt;
&lt;br /&gt;
Une fois le crystal re-soudé dans le bon sens, nous avons pu flasher la carte clavier avec le programme &amp;quot;Blink&amp;quot;&lt;br /&gt;
[[Fichier:Led_allumee_clavier.png|centré|sans_cadre|241x241px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; La LED clignote, ce qui nous permet de valider le faite que la carte est programmable via notre AVR ISP.&lt;br /&gt;
&lt;br /&gt;
===== Deuxième test : la lecture d'un bouton =====&lt;br /&gt;
our commencer les tests, nous cherchons à allumer une LED quand on appuie sur un bouton en particulier. Pour cela, nous avons mis à 0L la ligne sur PC3 et lu la colonne sur PD0 :   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test_clavier.png|sans_cadre|600x600px]] &lt;br /&gt;
&lt;br /&gt;
VIDEO TEST BOUTON   &lt;br /&gt;
&lt;br /&gt;
Ce test nous a permit de vérifier 2 choses : &lt;br /&gt;
&lt;br /&gt;
* que notre carte permet de reconnaître l'appuie sur un bouton &lt;br /&gt;
* que nous arrivions bien à utiliser les Leds de notre carte. Ainsi nous avons nos &amp;quot;calculs&amp;quot; avec les décalages et les opérations logiques utiles pour mettre à 0L ou lire sur le port une entrée.&lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons gardé l'idée d'allumer une Led lorsqu'un bouton est enfoncé.          &lt;br /&gt;
&lt;br /&gt;
'''Problème rencontré :''' Au début nous n'arrivions par à lire le bouton bien que notre code soit simple. Nous avons donc vérifié au multimètre si nos boutons étaient bien soudés. Au multimètre, les 4 broches de chaque bouton étaient reliés (donc en court-circuit), ce n'est absolument pas normal. Effectivement, lorsque nous avions créé les footprints des boutons nous n'avons pas mis les broches au bon endroit. Dans les boutons il y a déjà des broches reliées et dans nos footprint nous n'avons pas mis les bons chiffres des broches correctement : ce qui nous a créé un court-circuit. Pour contrer ce problème, nous avons tourné à 90° chaque bouton. C n'était pas simple car il a fallut redresser les pins pour qu'ils rentrent bien dans les trous de la carte. Finalement les boutons fonctionnent correctement et les boutons restent assez droits.  &lt;br /&gt;
&lt;br /&gt;
===== Troisième test : lecture de tous les boutons + shift =====&lt;br /&gt;
Pour commencer, on definit notre matrice de touches grâce à un tableau à 2 dimensions, ça nous permettra de récupérer directement les bonnes touches.  &lt;br /&gt;
&lt;br /&gt;
Nous voulions mettre notre clavier en AZERTY, malheureusement notre matrice ne nous le permet pas, alors les touches seront dans l'ordre alphabétique. Dans le code, les lettres ne sont pas dans l'ordre simplement parce que lors du routage nous n'avons pas laissé les boutons comme dans la schématique par simplicité de routage : &lt;br /&gt;
[[Fichier:Matrice touches.png|gauche|sans_cadre]]&lt;br /&gt;
&amp;lt;u&amp;gt;traduction des valeurs hexadécimales :&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 0x0E : le shift &lt;br /&gt;
* 0x08 : suppression&lt;br /&gt;
* 0x1C : flèche gauche &lt;br /&gt;
* 0x1D : flèche droite &lt;br /&gt;
&lt;br /&gt;
Ce sont simplement les codes en ASCII. &lt;br /&gt;
[[Fichier:Lecture touches.png|gauche|sans_cadre|400x400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Cette fonction nous permet d'effectuer la lecture d'une touche avec la méthode du clavier matriciel que nous avons expliqué plus haut. &lt;br /&gt;
&lt;br /&gt;
Ainsi, pour chaque ligne à 0L on lira sur chaque colonne et on vérifie si elle est égale à 0L. Si oui, on retourne directement la valeur de la touche en retournant notre matrice de touches avec les indices de la ligne et de la colonne en cours. &lt;br /&gt;
&lt;br /&gt;
Il y a une condition supplémentaire : si la touche appuyée est le shift (0x0E). Dans ce cas, on bascule on recommence la même méthode, mais cette fois on retournera la valeur appuyée mais grâce à la deuxième matrice cette fois puisqu'elle contient les chiffres de 0 à 9. &lt;br /&gt;
&lt;br /&gt;
Ici, l'utilisateur devra appuyer sur le bouton pour les chiffres en même temps que le bouton du shift. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Finalement, notre clavier ce présent comme ceci : &lt;br /&gt;
[[Fichier:Tableau du clavier.png|gauche|cadre|Clavier sans appuie sur SHIFT]]&lt;br /&gt;
[[Fichier:Schéma clavier avec appuie sur SHIFT.png|centré|cadre|clavier avec appuie sur SHIFT]]&lt;br /&gt;
&lt;br /&gt;
===== Quatrième test : le bus SPI =====&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie est d'envoyer les touches lues par le clavier vers la carte mère grâce au bus SPI.  &lt;br /&gt;
&lt;br /&gt;
Coté carte fille, le bus SPI est utilisé en interruption. Lorsque qu'une donnée est envoyé sur le MOSI, la programme du clavier rentre dans une interruption (ISR) pour renvoyer une info sur le MISO. &lt;br /&gt;
&lt;br /&gt;
Cela nous permet par exemple d'envoyer une valeur sur le MOSI, et de récupérer une donnée sur le MISO en fonction de la valeur envoyé depuis le MOSI. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ISR(SPI_STC_vect) {&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   char data = SPDR;&amp;lt;/code&amp;gt;                   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   _delay_ms(40);&amp;lt;/code&amp;gt;                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   if(data == 0x00) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = '!';&amp;lt;/code&amp;gt;                     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x05) {&amp;lt;/code&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = bouton;&amp;lt;/code&amp;gt;                      bouton : touche qui a été appuyée  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication de la communication en bus SPI :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, l'idée est de communiquer avec la carte mère. Pour cela, voici un schéma explicatif de notre méthode de communication : &lt;br /&gt;
 [[Fichier:Schéma communication SPI.png|centré|cadre]] &lt;br /&gt;
&lt;br /&gt;
Lorsque la carte clavier lie une touche, la ligne d'interruption passe à l'état haut. &lt;br /&gt;
&lt;br /&gt;
La carte mère rentre en interruption et va alors demander quelle carte a déclenché l'interruption. &lt;br /&gt;
&lt;br /&gt;
Si c'est la carte clavier qui a déclenché l'interruption alors le carte mère demande le nombre de touche à récupérer, puis récupère une a une les touches.  &lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' la taille du tampon sera, le plus souvent, égale à 1 puisque le microcontrôleur est plus rapide que l'humain qui tape au clavier. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de tester notre communication SPI, nous avons utiliser un Arduino uno qui &amp;quot;remplace&amp;quot; la carte mère. et qui envoi les valeurs 0x00, 0x01 ou 0x05, le carte mère à la lecture de la valeur doit répondre par une autre valeur. &lt;br /&gt;
&lt;br /&gt;
En revanche, après beaucoup de tests non concluant,  la communication ne fonctionnait pas. Nous avons alors regardé à l’oscilloscope l'allure de nos signaux MISO et MOSI :  &lt;br /&gt;
&lt;br /&gt;
* Le MOSI était cohérent avec les données envoyées&lt;br /&gt;
* Le MISO en revanche a des valeurs de tensions écrasées, ce qui fait que la valeur récupérée par le maitre est toujours nulle.&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:MOSI.png|gauche|vignette|MOSI]]&lt;br /&gt;
[[Fichier:MISO.png|centré|vignette|MISO|290x290px]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; Après de nombreux essais sur différents shield, le bus SPI de certaines cartes ne fonctionnent pas, et d'autres fonctionnent, et ce même avec un code identiques. C'est assez troublant puisque même avec la dernière carte modifiée et soudée par M. Redon, le bus SPI ne fonctionne pas avec notre code. La seule carte avec laquelle nos programmes fonctionnent, c'est avec celle du groupe 9. Les shields des binômes 4,5 et 6 ont ce problème.   &lt;br /&gt;
&lt;br /&gt;
===== Cinquième test : affichage sur le port série =====&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier plus précisément notre communication SPI, nous avons utiliser le port série de l'arduino uno pour pouvoir voir les données qui sont envoyé depuis la carte clavier, et ainsi s'assurer que quand on appuie sur une touche du clavier, la carte mère récupère bien le code ASCII de cette touche. &lt;br /&gt;
&lt;br /&gt;
Pour ce faire, nous utilisons la même fonction &amp;lt;code&amp;gt;serie_envoyer()&amp;lt;/code&amp;gt; que dans l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                        &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_activer();&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(20);&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     data_recue = spi_envoi(0x05);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     serie_envoyer(data_recue);&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_desactiver();&amp;lt;/code&amp;gt;            &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(100);&amp;lt;/code&amp;gt;              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
Le but étant, ici, d'envoyer directement la demande de touche et de l'afficher directement sur le port série grâce au &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo montrant le fonctionnement de notre clavier : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;VIDEO&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Programme final ===&lt;br /&gt;
Finalement, l'idée est de stocker les touches appuyées dans un tableau, pour pouvoir les envoyer à la carte mère lorsqu'elle le demande. Avant la demande de touche, la carte mère envoi la donnée 0x00 pour que l'on réponde que la carte est un clavier avec le caractère '!'. Nous avons décidé d'utilisé cette réponse seulement pour que l'on puisse l'afficher sur le port série (0x05 étant un caractère non imprimable). &lt;br /&gt;
&lt;br /&gt;
Voici les fonctions qui permettent d'ajouter et de supprimer les touches du tampon : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void remplir_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[cpt_tampon] = bouton;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon++;&amp;lt;/code&amp;gt;                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void vider_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for (int i=0; i &amp;lt; cpt_tampon; i++) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if (i == cpt_tampon - 1 ) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;} else {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = tampon[i+1];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon--;&amp;lt;/code&amp;gt;                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
L'idée est de vider le  tampon à chaque fois que l'on envoi le tableau à la case 0 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(data == 0x05) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SPDR = tampon[0];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;vider_tampon();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(cpt_tampon == 0) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PC4);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                &lt;br /&gt;
&lt;br /&gt;
En conclusion, le programme de la carte mère envoi la demande d'identification (0x00) ainsi que la demande de touche. Et le programme du clavier envoi le caractère '!', et par la suite la touche du tampon. &lt;br /&gt;
[[Fichier:Id touche tampon.mov|centré|cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;VIDEO&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' ce code n'est pas parfait puisqu'il écrit 1 fois de trop le caractère. Ex : si on appuie sur 'A', on lira sur le port série 'A', en revanche si on appuie juste après sur 'B', on lira 'A' puis 'B'. Nous n'avons malheureusement pas pu décoder cette erreur. &lt;br /&gt;
&lt;br /&gt;
==== Points importants à savoir ====&lt;br /&gt;
il faut débrancher et rebrancher le câble du bus SPI pour que la communication fonctionne. Aussi, si le programme du maître ne s'injecte pas dans l'Arduino, il faut insérer d'abord un programme d'exemple comme ArduinoISP. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons mis à part des programmes fonctionnels dans les répertoires nommés &amp;quot;Codes_OK&amp;quot;. Tout est expliqué dans des README qui se trouvent (presque) dans chaque répertoire. Un README qui se trouve dans le répertoire clavier/Code explique ce que les combinaisons de codes du maître et de l'esclave font. Des vidéos se trouvent également dans le répertoire Videos, qui montrent la fonctionnalité de chaque codes. Il y a d'ailleurs &amp;lt;u&amp;gt;plus (+) de vidéos&amp;lt;/u&amp;gt; sur le git. &lt;br /&gt;
&lt;br /&gt;
==== Différentes vidéos ====&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Sch%C3%A9ma_communication_SPI.png&amp;diff=3074</id>
		<title>Fichier:Schéma communication SPI.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Sch%C3%A9ma_communication_SPI.png&amp;diff=3074"/>
		<updated>2024-01-18T15:23:09Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;description des étapes de récupération d'une touche&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3070</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=3070"/>
		<updated>2024-01-18T15:04:09Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Type de carte choisie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]    &lt;br /&gt;
&lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Lors de la première séance de Pico, nous avons soudé quelques cartes telles que le Shield, la carte de leds et la carte 7 segments : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre|205x205px]][[Fichier:CartePin.png|sans_cadre|209x209px]][[Fichier:7_segments.png|sans_cadre|213x213px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre|203x203px]][[Fichier:Back.png|sans_cadre|200x200px]]&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino qui nous servirons pour la communication du bus SPI : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre|169x169px]]&lt;br /&gt;
=== Programmation Ordonnancement ===&lt;br /&gt;
&lt;br /&gt;
==== Clignotement de 2 Leds ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente :   [[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]'''Remarque :''' Les temps ne sont pas réels, l'objectif est donc d'endormir les tâches.   &lt;br /&gt;
&lt;br /&gt;
Voici cette fois le clignotement des 2 Leds avec l'endormissement des tâches :          &lt;br /&gt;
&lt;br /&gt;
==== Lecture sur port série en mémoire partagée ====&lt;br /&gt;
Par la suite, nous voulons ordonnancer une tâche qui permet de stocker dans une mémoire partagée la valeur reçue sur le port série.  &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons utilisé : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_recevoir(void) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A, RXC0);&amp;lt;/code&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = UDR0;&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;                               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                             &lt;br /&gt;
&lt;br /&gt;
Ici, la variable globale (mémoire partagée) est une variable globale (received_data) en unsigned char.  &lt;br /&gt;
&lt;br /&gt;
Pour lire sur le port série, on utilisera la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
==== Lecture/écriture sur port série ====&lt;br /&gt;
Afin de vérifier le code que nous avons écris dans la partie d'avant, nous écrirons sur le port série ce que nous avons lu. En d'autres termes, nous écrirons sur le port série ce que nous avons écris sur le clavier. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_envoyer(void) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A,UDRE0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UDR0=received_data;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
Sans remettre à '\0' comme ici, lorsque l'on appuie sur une touche, celle-ci s'affiche jusqu'à l'appuie d'une autre touche  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                         &lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                            &lt;br /&gt;
&lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous devons implémenter un contrôleur de bus série SPI. &lt;br /&gt;
&lt;br /&gt;
Tout d'abord, voici comment fonctionne un bus SPI : &lt;br /&gt;
&lt;br /&gt;
Dans un bus SPI, il y a 1 maître et 1 ou plusieurs esclaves. Le transmission des données se font sur 2 fils : MISO et MOSI : &lt;br /&gt;
&lt;br /&gt;
- MOSI : Données du maître vers l'esclave,&lt;br /&gt;
&lt;br /&gt;
- MISO : Données de l'esclave vers le maître.&lt;br /&gt;
&lt;br /&gt;
Puisqu'il y a plusieurs esclaves, le SS (Ship Select) permet d'autoriser 1 esclave précis en l'activant à 0. &lt;br /&gt;
&lt;br /&gt;
Les échanges se font sur front et sont synchronisés par le maître. &lt;br /&gt;
&lt;br /&gt;
Lorsqu'un octet du maître passe dans le registre de l'esclave, celui de l'esclave passe dans le registre du maître simultanément comme représenté sur l'image ci-dessous. C'est le principe du registre à décalage.&lt;br /&gt;
[[Fichier:Chemin spi.png|centré|sans_cadre]]Le contrôleur SPI doit jouer le rôle du maître et va contrôler les pins du bus SPI pour échanger des données.   &lt;br /&gt;
[[Fichier:Schéma bloc du driver SPI.png|centré|vignette|442x442px]]      &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons écris en VHDL :  &lt;br /&gt;
&lt;br /&gt;
Dans un process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;case ETAT is&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when REPOS =&amp;gt; ETAT &amp;lt;= TRANSMISSION;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when TRANSMISSION =&amp;gt; if compteur = 8 then&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ETAT &amp;lt;= REPOS;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;compteur &amp;lt;= 0;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;else compteur &amp;lt;= compteur + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end if;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for i in 0 to 6 loop&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(i) &amp;lt;= mosi_in(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(i) &amp;lt;= data_out_s(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end loop;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(7) &amp;lt;= data_in_s(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(7) &amp;lt;= mosi_in(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end case;&amp;lt;/code&amp;gt;                                                           &lt;br /&gt;
&lt;br /&gt;
Hors du process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS1 &amp;lt;= '1' when select_carte = &amp;quot;001&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS2 &amp;lt;= '1' when select_carte = &amp;quot;010&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS3 &amp;lt;= '1' when select_carte = &amp;quot;100&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé une machine d'état avec 2 états : un état REPOS qui permet de passer à l'état TRANSMISSION et de mettre à 1 ou à 0 les Chip Select en fonction de la selection d'état que recevra la carte FPGA de la carte mère. Et la fonction transmission qui effectue le registre à décalage.   &lt;br /&gt;
&lt;br /&gt;
Ce code, que vous trouverez dans le git, compile, en revanche nous n'avons pas pu faire de tests dessus malheureusement.  &lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet pour la carte clavier est de lire les boutons qui sont enfoncés afin de les envoyer à la carte mère via le bus SPI. &lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte :  [[Fichier:Schematique_clavier.png|centré|sans_cadre|511x511px]]Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches qui sont : la flèche de gauche, la flèche de droite, l'espace, un retour chariot, le suppression et enfin un shift qui nous permettra de switcher avec les 10 chiffres (de 0 à 9), &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation&lt;br /&gt;
* un ATmega328p&lt;br /&gt;
* un connecteur HE10 8 pins pour un bus SPI + une ligne d'interruption pour communiquer avec la carte mère&lt;br /&gt;
* un connecteur 6 pins(2x3) pour un bus SPI afin de programmer la carte.&lt;br /&gt;
&amp;lt;u&amp;gt;Fonctionnement matrice de touches :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but ici est de pouvoir lire la touche sur laquelle nous avons appuyé pour l'envoyer à la carte mère. Ici, l'idée est d'utiliser le fonctionnement de la matrice de touche qui est le suivant : &lt;br /&gt;
&lt;br /&gt;
Premièrement, il faut se décider duquel entre les lignes et les colonnes seront en entrée et l'autre en sortie. Ici se sont les lignes qui sont en sortie et les colonnes en entrée. &lt;br /&gt;
&lt;br /&gt;
L'idée est simple : alterner entre les lignes pour écrire un 0L sur 1 ligne et sur les autres un 1L. On parcourt ensuite toutes les colonnes (de la ligne à 0L). Si on lit un 0L sur une colonne, alors il suffit d'associer la ligne qui est à 0L avec celle de la colonne et on connait la touche qui a été appuyée. &lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up qui se trouvent au niveau des lignes serviront  à avoir un 1L par défaut. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le routage de la carte : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.&lt;br /&gt;
&lt;br /&gt;
Pour faire ce routage, nous avons dû créer le footprint des boutons, alors la prise des mesures sur le boutons était nécessaire. Aussi, nous avons décidé d'utiliser un ATmega328p avec des pins traversants pour une question de facilité au niveau de la soudure mais également pour éviter tout court-circuit et donc une perte de temps. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]][[Fichier:3d view.png|sans_cadre|235x235px]][[Fichier:3d view bottom.png|sans_cadre|235x235px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réel clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte_soude.jpg|sans_cadre|266x266px]]&lt;br /&gt;
&lt;br /&gt;
=== Partie programmation ===&lt;br /&gt;
La programmation de notre carte se fera via un AVR ISP &lt;br /&gt;
&lt;br /&gt;
Pour cela, on utilise une carte arduino uno dans laquelle on téléverse le programme Arduino ISP, disponible dans les exemples de l'IDE arduino, pour permettre a l'arduino uno d'envoyer notre code vers la carte clavier via le connecteur HE10.   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma AVR ISP.png|centré|400x400px|sans_cadre]]&lt;br /&gt;
Pour flasher notre carte clavier, 2 solutions : &lt;br /&gt;
&lt;br /&gt;
* utiliser l'IDE arduino, en utilisant le paramètre &amp;quot;upload using programmer&amp;quot; qui permet de televerser du code dans une atmega en passant par le bus SPI. Mais cela néccesite d'écrire le code sur l'IDE arduino. Cette solution permettra simplement de faire des tests rapides en utilisant, par exemple, l'exemple &amp;quot;Blink&amp;quot;.&lt;br /&gt;
* Créer un Makefile qui permet de téléverser notre code C vers la carte fille en passant par l'arduino uno :&lt;br /&gt;
[[Fichier:Makefil.png|sans_cadre|450x450px]]  &lt;br /&gt;
&lt;br /&gt;
==== Programme de tests sur la carte ====&lt;br /&gt;
Nous sommes ensuite passés au différents tests de la carte pour tester chaque fonctionnalités.   &lt;br /&gt;
&lt;br /&gt;
===== Premier test : la carte est-elle programmable ? =====&lt;br /&gt;
On utilise un programme très simple qui allume une des LEDs de la carte, le &amp;quot;Blink&amp;quot; disponible dans les exemples de l'IDE arduino. &lt;br /&gt;
&lt;br /&gt;
Cependant, en essayant de programmer la carte, aucune LEDs ne clignotait. Comme le code ne venait pas de nous et qe c'est un code simple, le problème ne pouvait venir que du côté du hardware. Nous avons donc tester notre carte au multimètre et il y avait effectivement un court-circuit au niveau du crystal qui empêchait forcement son fonctionnement. L'erreur vient de notre schématique puisque nous avons tourné à 90° le composant, ce qui créé effectivement un court-circuit. Pour remédier à notre problème, nous avons dé-souder le crystal et l'avons décalé sur la carte. &lt;br /&gt;
&lt;br /&gt;
Une fois le crystal re-soudé dans le bon sens, nous avons pu flasher la carte clavier avec le programme &amp;quot;Blink&amp;quot;&lt;br /&gt;
[[Fichier:Led_allumee_clavier.png|centré|sans_cadre|241x241px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; La LED clignote, ce qui nous permet de valider le faite que la carte est programmable via notre AVR ISP.&lt;br /&gt;
&lt;br /&gt;
===== Deuxième test : la lecture d'un bouton =====&lt;br /&gt;
Pour commencer les tests, nous cherchons à allumer une LED quand on appuie sur un bouton en particulier. Pour cela, nous avons mis à 0L la ligne sur PC3 et lu la colonne sur PD0 :   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test_clavier.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Ce test nous a permit de vérifier 2 choses : &lt;br /&gt;
&lt;br /&gt;
* que notre clavier matricielle est capable de reconnaître une touche en particulier&lt;br /&gt;
* que nous arrivions bien à utiliser les Leds de notre carte. Ainsi nous avons nos &amp;quot;calculs&amp;quot; avec les décalages et les opérations logiques utiles pour mettre à 0L ou lire sur le port une entrée. &lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons gardé l'idée d'allumer une Led lorsqu'un bouton est enfoncé.          &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Premier_test_clavier.mp4|néant|cadre]]'''Problème rencontré :''' Au début nous n'arrivions par à lire le bouton bien que notre code soit simple. Nous avons donc vérifié au multimètre si nos boutons étaient bien soudés. Au multimètre, les 4 broches de chaque bouton étaient reliés (donc en court-circuit), ce n'est absolument pas normal. Effectivement, lorsque nous avions créé les footprints des boutons nous n'avons pas mis les broches au bon endroit. Dans les boutons il y a déjà des broches reliées et dans nos footprint nous n'avons pas mis les bons chiffres des broches correctement : ce qui nous a créé un court-circuit. Pour contrer ce problème, nous avons tourné à 90° chaque bouton. C n'était pas simple car il a fallut redresser les pins pour qu'ils rentrent bien dans les trous de la carte. Finalement les boutons fonctionnent correctement et les boutons restent assez droits.  &lt;br /&gt;
&lt;br /&gt;
===== Troisième test : lecture de tous les boutons + shift =====&lt;br /&gt;
Pour commencer, on definit notre matrice de touches grâce à un tableau à 2 dimensions, ça nous permettra de récupérer directement les bonnes touches.  &lt;br /&gt;
&lt;br /&gt;
Nous voulions mettre notre clavier en AZERTY, malheureusement notre matrice ne nous le permet pas, alors les touches seront dans l'ordre alphabétique. Dans le code, les lettres ne sont pas dans l'ordre simplement parce que lors du routage nous n'avons pas laissé les boutons comme dans la schématique par simplicité de routage : &lt;br /&gt;
[[Fichier:Matrice touches.png|gauche|sans_cadre]]&lt;br /&gt;
&amp;lt;u&amp;gt;traduction des valeurs hexadécimales :&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 0x0E : le shift &lt;br /&gt;
* 0x08 : suppression&lt;br /&gt;
* 0x1C : flèche gauche &lt;br /&gt;
* 0x1D : flèche droite &lt;br /&gt;
&lt;br /&gt;
Ce sont simplement les codes en ASCII. &lt;br /&gt;
[[Fichier:Lecture touches.png|gauche|sans_cadre|400x400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Cette fonction nous permet d'effectuer la lecture d'une touche avec la méthode du clavier matriciel que nous avons expliqué plus haut. &lt;br /&gt;
&lt;br /&gt;
Ainsi, pour chaque ligne à 0L on lira sur chaque colonne et on vérifie si elle est égale à 0L. Si oui, on retourne directement la valeur de la touche en retournant notre matrice de touches avec les indices de la ligne et de la colonne en cours. &lt;br /&gt;
&lt;br /&gt;
Il y a une condition supplémentaire : si la touche appuyée est le shift (0x0E). Dans ce cas, on bascule on recommence la même méthode, mais cette fois on retournera la valeur appuyée mais grâce à la deuxième matrice cette fois puisqu'elle contient les chiffres de 0 à 9. &lt;br /&gt;
&lt;br /&gt;
Ici, l'utilisateur devra appuyer sur le bouton pour les chiffres en même temps que le bouton du shift. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Finalement, notre clavier ce présent comme ceci : &lt;br /&gt;
[[Fichier:Tableau du clavier.png|gauche|cadre|Clavier sans appuie sur SHIFT]]&lt;br /&gt;
[[Fichier:Schéma clavier avec appuie sur SHIFT.png|centré|cadre|clavier avec appuie sur SHIFT]]&lt;br /&gt;
&lt;br /&gt;
===== Quatrième test : le bus SPI =====&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie est d'envoyer les touches lues par le clavier vers la carte mère grâce au bus SPI. On a donc écrit un programme pour tester le bus SPI. L'idée était simplement d'envoyer une une variable en fonction de ce que l'on recevait. &lt;br /&gt;
&lt;br /&gt;
Pour utiliser le bus SPI, il est nécessaire d'utiliser une interruption (une ISR) qui permettra, pour rester dans le cahier des charges, d'envoyer des valeurs en fonctions de la valeur que l'on reçoit. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ISR(SPI_STC_vect) {&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   char data = SPDR;&amp;lt;/code&amp;gt;                   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   _delay_ms(40);&amp;lt;/code&amp;gt;                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   if(data == 0x00) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = '!';&amp;lt;/code&amp;gt;                     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x05) {&amp;lt;/code&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = bouton;&amp;lt;/code&amp;gt;                      bouton : touche qui a été appuyée  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication de la communication en bus SPI :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, l'idée est de communiquer avec la carte mère. Pour cela, voici un schéma explicatif de notre mèthode de communication : &lt;br /&gt;
[[Fichier:Clavier mode spi.png|centré|sans_cadre]]&lt;br /&gt;
'''Remarque :''' la taille du tampon sera, le plus souvent, égale à 1 puisque le microcontrôleur est plus rapide qu'un humain. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication du code :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puisque c'est un test sur le spi, nous avons seulement envoyé des valeurs aléatoires afin de vérifier si le bus spi marche, mais en gardant la configuration que l'on doit avoir avec le schéma ci-dessus. &lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir vérifier nos codes correctement, nous avons utiliser un Arduino uno qui &amp;quot;remplace&amp;quot; la carte mère et qui envoi les valeurs 0x00, 0x01 ou 0x05 de la même manière, avec le bus SPI et les bonnes configurations d'initialisation du bus en tant que &amp;quot;maître&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
En revanche, après beaucoup d changement de codes,  la communication ne fonctionnait pas. Nous avons alors regardé à l’oscilloscope l'allure de nos signaux MISO et MOSI :  &lt;br /&gt;
&lt;br /&gt;
* Le MOSI était cohérant avec les données envoyées&lt;br /&gt;
* Le MISO en revanche a des valeurs de tensions écrasées, ce qui fait que la valeur récupérée par le maitre est toujours nulle. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:MOSI.png|gauche|vignette|MOSI]]&lt;br /&gt;
[[Fichier:MISO.png|centré|vignette|MISO|290x290px]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; Après de nombreux essais sur différents shield, le bus SPI de certaines cartes ne fonctionnent pas, et d'autres fonctionnent, et ce même avec un code identiques. C'est assez troublant puisque même avec la dernière carte modifiée et soudée par M. Redon, le bus SPI ne fonctionne pas avec notre code. La seule carte avec laquelle nos programmes fonctionnent, c'est avec celle du groupe 9. Les shields des binômes 4,5 et 6 ont ce problème.   &lt;br /&gt;
&lt;br /&gt;
===== Cinquième test : affichage sur le port série =====&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier plus précisément et de continuer nos tests, le but étant de programmer la gestion de l'affichage des données reçues par le bus SPI sur le port série. &lt;br /&gt;
&lt;br /&gt;
Pour ce faire, nous utilisons la même fonction &amp;lt;code&amp;gt;serie_envoyer()&amp;lt;/code&amp;gt; que dans l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                        &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_activer();&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(20);&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     data_recue = spi_envoi(0x05);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     serie_envoyer(data_recue);&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_desactiver();&amp;lt;/code&amp;gt;            &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(100);&amp;lt;/code&amp;gt;              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
Le but étant, ici, d'envoyer directement la demande de touche et de l'afficher directement sur le port série grâce au &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo montrant le fonctionnement de notre clavier : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;VIDEO&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Programme final ===&lt;br /&gt;
Finalement, l'idée est de stocker les touches appuyées dans un tableau, pour pouvoir les envoyer à la carte mère lorsqu'elle le demande. Avant la demande de touche, la carte mère envoi la donnée 0x00 pour que l'on réponde que la carte est un clavier avec le caractère '!'. Nous avons décidé d'utilisé cette réponse seulement pour que l'on puisse l'afficher sur le port série (0x05 étant un caractère non imprimable). &lt;br /&gt;
&lt;br /&gt;
Voici les fonctions qui permettent d'ajouter et de supprimer les touches du tampon : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void remplir_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[cpt_tampon] = bouton;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon++;&amp;lt;/code&amp;gt;                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void vider_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for (int i=0; i &amp;lt; cpt_tampon; i++) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if (i == cpt_tampon - 1 ) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;} else {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = tampon[i+1];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon--;&amp;lt;/code&amp;gt;                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
L'idée est de vider le  tampon à chaque fois que l'on envoi le tableau à la case 0 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(data == 0x05) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SPDR = tampon[0];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;vider_tampon();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(cpt_tampon == 0) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PC4);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                &lt;br /&gt;
&lt;br /&gt;
En conclusion, le programme de la carte mère envoi la demande d'identification (0x00) ainsi que la demande de touche. Et le programme du clavier envoi le caractère '!', et par la suite la touche du tampon. &lt;br /&gt;
[[Fichier:Id touche tampon.mov|centré|cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;VIDEO&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' ce code n'est pas parfait puisqu'il écrit 1 fois de trop le caractère. Ex : si on appuie sur 'A', on lira sur le port série 'A', en revanche si on appuie juste après sur 'B', on lira 'A' puis 'B'. Nous n'avons malheureusement pas pu décoder cette erreur. &lt;br /&gt;
&lt;br /&gt;
==== Points importants à savoir ====&lt;br /&gt;
il faut débrancher et rebrancher le câble du bus SPI pour que la communication fonctionne. Aussi, si le programme du maître ne s'injecte pas dans l'Arduino, il faut insérer d'abord un programme d'exemple comme ArduinoISP. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons mis à part des programmes fonctionnels dans les répertoires nommés &amp;quot;Codes_OK&amp;quot;. Tout est expliqué dans des README qui se trouvent (presque) dans chaque répertoire. Un README qui se trouve dans le répertoire clavier/Code explique ce que les combinaisons de codes du maître et de l'esclave font. Des vidéos se trouvent également dans le répertoire Videos, qui montrent la fonctionnalité de chaque codes. Il y a d'ailleurs &amp;lt;u&amp;gt;plus (+) de vidéos&amp;lt;/u&amp;gt; sur le git. &lt;br /&gt;
&lt;br /&gt;
==== Différentes vidéos ====&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2962</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2962"/>
		<updated>2024-01-17T18:25:45Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Carte FPGA/VHDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]    &lt;br /&gt;
&lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Lors de la première séance de Pico, nous avons soudé quelques cartes telles que le Shield, la carte de leds et la carte 7 segments : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre|205x205px]][[Fichier:CartePin.png|sans_cadre|209x209px]][[Fichier:7_segments.png|sans_cadre|213x213px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre|203x203px]][[Fichier:Back.png|sans_cadre|200x200px]]&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino qui nous servirons pour la communication du bus SPI : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre|169x169px]]&lt;br /&gt;
=== Programmation Ordonnancement ===&lt;br /&gt;
&lt;br /&gt;
==== Clignotement de 2 Leds ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente :   [[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]'''Remarque :''' Les temps ne sont pas réels, l'objectif est donc d'endormir les tâches.   &lt;br /&gt;
&lt;br /&gt;
Voici cette fois le clignotement des 2 Leds avec l'endormissement des tâches :          &lt;br /&gt;
&lt;br /&gt;
==== Lecture sur port série en mémoire partagée ====&lt;br /&gt;
Par la suite, nous voulons ordonnancer une tâche qui permet de stocker dans une mémoire partagée la valeur reçue sur le port série.  &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons utilisé : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_recevoir(void) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A, RXC0);&amp;lt;/code&amp;gt;     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = UDR0;&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;                               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                             &lt;br /&gt;
&lt;br /&gt;
Ici, la variable globale (mémoire partagée) est une variable globale (received_data) en unsigned char.  &lt;br /&gt;
&lt;br /&gt;
Pour lire sur le port série, on utilisera la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
==== Lecture/écriture sur port série ====&lt;br /&gt;
Afin de vérifier le code que nous avons écris dans la partie d'avant, nous écrirons sur le port série ce que nous avons lu. En d'autres termes, nous écrirons sur le port série ce que nous avons écris sur le clavier. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void serie_envoyer(void) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;loop_until_bit_is_set(UCSR0A,UDRE0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;UDR0=received_data;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;received_data = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
Sans remettre à '\0' comme ici, lorsque l'on appuie sur une touche, celle-ci s'affiche jusqu'à l'appuie d'une autre touche  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sleepy(1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                         &lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                            &lt;br /&gt;
&lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous devons implémenter un contrôleur de bus série SPI. &lt;br /&gt;
&lt;br /&gt;
Tout d'abord, voici comment fonctionne un bus SPI : &lt;br /&gt;
&lt;br /&gt;
Dans un bus SPI, il y a 1 maître et 1 ou plusieurs esclaves. Le transmission des données se font sur 2 fils : MISO et MOSI : &lt;br /&gt;
&lt;br /&gt;
- MOSI : Données du maître vers l'esclave,&lt;br /&gt;
&lt;br /&gt;
- MISO : Données de l'esclave vers le maître.&lt;br /&gt;
&lt;br /&gt;
Puisqu'il y a plusieurs esclaves, le SS (Ship Select) permet d'autoriser 1 esclave précis en l'activant à 0. &lt;br /&gt;
&lt;br /&gt;
Les échanges se font sur front et sont synchronisés par le maître. &lt;br /&gt;
&lt;br /&gt;
Lorsqu'un octet du maître passe dans le registre de l'esclave, celui de l'esclave passe dans le registre du maître simultanément comme représenté sur l'image ci-dessous. C'est le principe du registre à décalage.&lt;br /&gt;
[[Fichier:Chemin spi.png|centré|sans_cadre]]Le contrôleur SPI doit jouer le rôle du maître et va contrôler les pins du bus SPI pour échanger des données.   &lt;br /&gt;
[[Fichier:Schéma bloc du driver SPI.png|centré|vignette|442x442px]]      &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons écris en VHDL :  &lt;br /&gt;
&lt;br /&gt;
Dans un process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;case ETAT is&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when REPOS =&amp;gt; ETAT &amp;lt;= TRANSMISSION;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;when TRANSMISSION =&amp;gt; if compteur = 8 then&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ETAT &amp;lt;= REPOS;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;compteur &amp;lt;= 0;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;else compteur &amp;lt;= compteur + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end if;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for i in 0 to 6 loop&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(i) &amp;lt;= mosi_in(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(i) &amp;lt;= data_out_s(i+1);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end loop;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mosi_in(7) &amp;lt;= data_in_s(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;data_out_s(7) &amp;lt;= mosi_in(0);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;end case;&amp;lt;/code&amp;gt;                                                           &lt;br /&gt;
&lt;br /&gt;
Hors du process :  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS1 &amp;lt;= '1' when select_carte = &amp;quot;001&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS2 &amp;lt;= '1' when select_carte = &amp;quot;010&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CS3 &amp;lt;= '1' when select_carte = &amp;quot;100&amp;quot; and ETAT &amp;lt;= REPOS else '0';&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Nous avons utilisé une machine d'état avec 2 états : un état REPOS qui permet de passer à l'état TRANSMISSION et de mettre à 1 ou à 0 les Chip Select en fonction de la selection d'état que recevra la carte FPGA de la carte mère. Et la fonction transmission qui effectue le registre à décalage.   &lt;br /&gt;
&lt;br /&gt;
Ce code, que vous trouverez dans le git, compile, en revanche nous n'avons pas pu faire de tests dessus malheureusement.  &lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet pour la carte clavier est de lire les boutons qui sont enfoncés afin de les envoyer à la carte mère via le bus SPI. &lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte :  [[Fichier:Schematique_clavier.png|centré|sans_cadre|511x511px]]Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches qui sont : la flèche de gauche, la flèche de droite, l'espace, un retour chariot, le suppression et enfin un shift qui nous permettra de switcher avec les 10 chiffres (de 0 à 9), &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation&lt;br /&gt;
* un ATmega328p&lt;br /&gt;
* un connecteur HE10 8 pins pour un bus SPI + une ligne d'interruption pour communiquer avec la carte mère&lt;br /&gt;
* un connecteur 6 pins(2x3) pour un bus SPI afin de programmer la carte.&lt;br /&gt;
&amp;lt;u&amp;gt;Fonctionnement matrice de touches :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but ici est de pouvoir lire la touche sur laquelle nous avons appuyé pour l'envoyer à la carte mère. Ici, l'idée est d'utiliser le fonctionnement de la matrice de touche qui est le suivant : &lt;br /&gt;
&lt;br /&gt;
Premièrement, il faut se décider duquel entre les lignes et les colonnes seront en entrée et l'autre en sortie. Ici se sont les lignes qui sont en sortie et les colonnes en entrée. &lt;br /&gt;
&lt;br /&gt;
L'idée est simple : alterner entre les lignes pour écrire un 0L sur 1 ligne et sur les autres un 1L. On parcourt ensuite toutes les colonnes (de la ligne à 0L). Si on lit un 0L sur une colonne, alors il suffit d'associer la ligne qui est à 0L avec celle de la colonne et on connait la touche qui a été appuyée. &lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up qui se trouvent au niveau des lignes serviront  à avoir un 1L par défaut. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le routage de la carte : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.&lt;br /&gt;
&lt;br /&gt;
Pour faire ce routage, nous avons dû créer le footprint des boutons, alors la prise des mesures sur le boutons était nécessaire. Aussi, nous avons décidé d'utiliser un ATmega328p avec des pins traversants pour une question de facilité au niveau de la soudure mais également pour éviter tout court-circuit et donc une perte de temps. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]][[Fichier:3d view.png|sans_cadre|235x235px]][[Fichier:3d view bottom.png|sans_cadre|235x235px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réel clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte_soude.jpg|sans_cadre|266x266px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Amélioration possible :&amp;lt;/u&amp;gt; permettre la programmation en USB. Avec cette carte telle qu'elle est faite, pour insérer un programme dans le microcontrôleur il faut passer par la carte Arduino et pour ça, il faut insérer le programme &amp;quot;ArduinoISP&amp;quot; qui se trouver dans les exemples de l'IDE Arduino, sans oublier tous les branchements à refaire. Ce n'est pas vraiment pratique et c'est une perte de temps qu'il est possible d'enlever en mettant un port USB directement sur la carte clavier.  &lt;br /&gt;
&lt;br /&gt;
=== Partie programmation ===&lt;br /&gt;
La programmation de notre carte se fera via un AVR ISP &lt;br /&gt;
&lt;br /&gt;
Pour cela, on utilise une carte arduino uno dans laquelle on téléverse le programme Arduino ISP, disponible dans les exemples de l'IDE arduino, pour permettre a l'arduino uno d'envoyer notre code vers la carte clavier via le connecteur HE10.   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma AVR ISP.png|centré|400x400px|sans_cadre]]&lt;br /&gt;
Pour flasher notre carte clavier, 2 solutions : &lt;br /&gt;
&lt;br /&gt;
* utiliser l'IDE arduino, en utilisant le paramètre &amp;quot;upload using programmer&amp;quot; qui permet de televerser du code dans une atmega en passant par le bus SPI. Mais cela néccesite d'écrire le code sur l'IDE arduino. Cette solution permettra simplement de faire des tests rapides en utilisant, par exemple, l'exemple &amp;quot;Blink&amp;quot;.&lt;br /&gt;
* Créer un Makefile qui permet de téléverser notre code C vers la carte fille en passant par l'arduino uno :&lt;br /&gt;
[[Fichier:Makefil.png|sans_cadre|450x450px]]  &lt;br /&gt;
&lt;br /&gt;
==== Programme de tests sur la carte ====&lt;br /&gt;
Nous sommes ensuite passés au différents tests de la carte pour tester chaque fonctionnalités.   &lt;br /&gt;
&lt;br /&gt;
===== Premier test : la carte est-elle programmable ? =====&lt;br /&gt;
On utilise un programme très simple qui allume une des LEDs de la carte, le &amp;quot;Blink&amp;quot; disponible dans les exemples de l'IDE arduino. &lt;br /&gt;
&lt;br /&gt;
Cependant, en essayant de programmer la carte, aucune LEDs ne clignotait. Comme le code ne venait pas de nous et qe c'est un code simple, le problème ne pouvait venir que du côté du hardware. Nous avons donc tester notre carte au multimètre et il y avait effectivement un court-circuit au niveau du crystal qui empêchait forcement son fonctionnement. L'erreur vient de notre schématique puisque nous avons tourné à 90° le composant, ce qui créé effectivement un court-circuit. Pour remédier à notre problème, nous avons dé-souder le crystal et l'avons décalé sur la carte. &lt;br /&gt;
&lt;br /&gt;
Une fois le crystal re-soudé dans le bon sens, nous avons pu flasher la carte clavier avec le programme &amp;quot;Blink&amp;quot;&lt;br /&gt;
[[Fichier:Led_allumee_clavier.png|centré|sans_cadre|241x241px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; La LED clignote, ce qui nous permet de valider le faite que la carte est programmable via notre AVR ISP.&lt;br /&gt;
&lt;br /&gt;
===== Deuxième test : la lecture d'un bouton =====&lt;br /&gt;
Pour commencer les tests, nous cherchons à allumer une LED quand on appuie sur un bouton en particulier. Pour cela, nous avons mis à 0L la ligne sur PC3 et lu la colonne sur PD0 :   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test_clavier.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Ce test nous a permit de vérifier 2 choses : &lt;br /&gt;
&lt;br /&gt;
* que notre clavier matricielle est capable de reconnaître une touche en particulier&lt;br /&gt;
* que nous arrivions bien à utiliser les Leds de notre carte. Ainsi nous avons nos &amp;quot;calculs&amp;quot; avec les décalages et les opérations logiques utiles pour mettre à 0L ou lire sur le port une entrée. &lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons gardé l'idée d'allumer une Led lorsqu'un bouton est enfoncé.          &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Premier_test_clavier.mp4|néant|cadre]]'''Problème rencontré :''' Au début nous n'arrivions par à lire le bouton bien que notre code soit simple. Nous avons donc vérifié au multimètre si nos boutons étaient bien soudés. Au multimètre, les 4 broches de chaque bouton étaient reliés (donc en court-circuit), ce n'est absolument pas normal. Effectivement, lorsque nous avions créé les footprints des boutons nous n'avons pas mis les broches au bon endroit. Dans les boutons il y a déjà des broches reliées et dans nos footprint nous n'avons pas mis les bons chiffres des broches correctement : ce qui nous a créé un court-circuit. Pour contrer ce problème, nous avons tourné à 90° chaque bouton. C n'était pas simple car il a fallut redresser les pins pour qu'ils rentrent bien dans les trous de la carte. Finalement les boutons fonctionnent correctement et les boutons restent assez droits.  &lt;br /&gt;
&lt;br /&gt;
===== Troisième test : lecture de tous les boutons + shift =====&lt;br /&gt;
Pour commencer, on definit notre matrice de touches grâce à un tableau à 2 dimensions, ça nous permettra de récupérer directement les bonnes touches.  &lt;br /&gt;
&lt;br /&gt;
Nous voulions mettre notre clavier en AZERTY, malheureusement notre matrice ne nous le permet pas, alors les touches seront dans l'ordre alphabétique. Dans le code, les lettres ne sont pas dans l'ordre simplement parce que lors du routage nous n'avons pas laissé les boutons comme dans la schématique par simplicité de routage : &lt;br /&gt;
[[Fichier:Matrice touches.png|gauche|sans_cadre]]&lt;br /&gt;
&amp;lt;u&amp;gt;traduction des valeurs hexadécimales :&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 0x0E : le shift &lt;br /&gt;
* 0x08 : suppression&lt;br /&gt;
* 0x1C : flèche gauche &lt;br /&gt;
* 0x1D : flèche droite &lt;br /&gt;
&lt;br /&gt;
Ce sont simplement les codes en ASCII. &lt;br /&gt;
[[Fichier:Lecture touches.png|gauche|sans_cadre|400x400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Cette fonction nous permet d'effectuer la lecture d'une touche avec la méthode du clavier matriciel que nous avons expliqué plus haut. &lt;br /&gt;
&lt;br /&gt;
Ainsi, pour chaque ligne à 0L on lira sur chaque colonne et on vérifie si elle est égale à 0L. Si oui, on retourne directement la valeur de la touche en retournant notre matrice de touches avec les indices de la ligne et de la colonne en cours. &lt;br /&gt;
&lt;br /&gt;
Il y a une condition supplémentaire : si la touche appuyée est le shift (0x0E). Dans ce cas, on bascule on recommence la même méthode, mais cette fois on retournera la valeur appuyée mais grâce à la deuxième matrice cette fois puisqu'elle contient les chiffres de 0 à 9. &lt;br /&gt;
&lt;br /&gt;
Ici, l'utilisateur devra appuyer sur le bouton pour les chiffres en même temps que le bouton du shift. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Finalement, notre clavier ce présent comme ceci : &lt;br /&gt;
[[Fichier:Tableau du clavier.png|gauche|cadre|Clavier sans appuie sur SHIFT]]&lt;br /&gt;
[[Fichier:Schéma clavier avec appuie sur SHIFT.png|centré|cadre|clavier avec appuie sur SHIFT]]&lt;br /&gt;
&lt;br /&gt;
===== Quatrième test : le bus SPI =====&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie est d'envoyer les touches lues par le clavier vers la carte mère grâce au bus SPI. On a donc écrit un programme pour tester le bus SPI. L'idée était simplement d'envoyer une une variable en fonction de ce que l'on recevait. &lt;br /&gt;
&lt;br /&gt;
Pour utiliser le bus SPI, il est nécessaire d'utiliser une interruption (une ISR) qui permettra, pour rester dans le cahier des charges, d'envoyer des valeurs en fonctions de la valeur que l'on reçoit. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ISR(SPI_STC_vect) {&amp;lt;/code&amp;gt;                    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   char data = SPDR;&amp;lt;/code&amp;gt;                   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   _delay_ms(40);&amp;lt;/code&amp;gt;                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   if(data == 0x00) {&amp;lt;/code&amp;gt;                  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = '!';&amp;lt;/code&amp;gt;                     &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x05) {&amp;lt;/code&amp;gt;          &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = bouton;&amp;lt;/code&amp;gt;                      bouton : touche qui a été appuyée  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
                                      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication de la communication en bus SPI :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, l'idée est de communiquer avec la carte mère. Pour cela, voici un schéma explicatif de notre mèthode de communication : &lt;br /&gt;
[[Fichier:Clavier mode spi.png|centré|sans_cadre]]&lt;br /&gt;
'''Remarque :''' la taille du tampon sera, le plus souvent, égale à 1 puisque le microcontrôleur est plus rapide qu'un humain. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication du code :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puisque c'est un test sur le spi, nous avons seulement envoyé des valeurs aléatoires afin de vérifier si le bus spi marche, mais en gardant la configuration que l'on doit avoir avec le schéma ci-dessus. &lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir vérifier nos codes correctement, nous avons utiliser un Arduino uno qui &amp;quot;remplace&amp;quot; la carte mère et qui envoi les valeurs 0x00, 0x01 ou 0x05 de la même manière, avec le bus SPI et les bonnes configurations d'initialisation du bus en tant que &amp;quot;maître&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
En revanche, après beaucoup d changement de codes,  la communication ne fonctionnait pas. Nous avons alors regardé à l’oscilloscope l'allure de nos signaux MISO et MOSI :  &lt;br /&gt;
&lt;br /&gt;
* Le MOSI était cohérant avec les données envoyées&lt;br /&gt;
* Le MISO en revanche a des valeurs de tensions écrasées, ce qui fait que la valeur récupérée par le maitre est toujours nulle. &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:MOSI.png|gauche|vignette|MOSI]]&lt;br /&gt;
[[Fichier:MISO.png|centré|vignette|MISO|290x290px]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; Après de nombreux essais sur différents shield, le bus SPI de certaines cartes ne fonctionnent pas, et d'autres fonctionnent, et ce même avec un code identiques. C'est assez troublant puisque même avec la dernière carte modifiée et soudée par M. Redon, le bus SPI ne fonctionne pas avec notre code. La seule carte avec laquelle nos programmes fonctionnent, c'est avec celle du groupe 9. Les shields des binômes 4,5 et 6 ont ce problème.   &lt;br /&gt;
&lt;br /&gt;
===== Cinquième test : affichage sur le port série =====&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier plus précisément et de continuer nos tests, le but étant de programmer la gestion de l'affichage des données reçues par le bus SPI sur le port série. &lt;br /&gt;
&lt;br /&gt;
Pour ce faire, nous utilisons la même fonction &amp;lt;code&amp;gt;serie_envoyer()&amp;lt;/code&amp;gt; que dans l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1) {&amp;lt;/code&amp;gt;                        &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_activer();&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(20);&amp;lt;/code&amp;gt;               &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     data_recue = spi_envoi(0x05);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     serie_envoyer(data_recue);&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_desactiver();&amp;lt;/code&amp;gt;            &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(100);&amp;lt;/code&amp;gt;              &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                 &lt;br /&gt;
&lt;br /&gt;
Le but étant, ici, d'envoyer directement la demande de touche et de l'afficher directement sur le port série grâce au &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo montrant le fonctionnement de notre clavier : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;VIDEO&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Programme final ===&lt;br /&gt;
Finalement, l'idée est de stocker les touches appuyées dans un tableau, pour pouvoir les envoyer à la carte mère lorsqu'elle le demande. Avant la demande de touche, la carte mère envoi la donnée 0x00 pour que l'on réponde que la carte est un clavier avec le caractère '!'. Nous avons décidé d'utilisé cette réponse seulement pour que l'on puisse l'afficher sur le port série (0x05 étant un caractère non imprimable). &lt;br /&gt;
&lt;br /&gt;
Voici les fonctions qui permettent d'ajouter et de supprimer les touches du tampon : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void remplir_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[cpt_tampon] = bouton;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon++;&amp;lt;/code&amp;gt;                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;void vider_tampon() {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;for (int i=0; i &amp;lt; cpt_tampon; i++) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if (i == cpt_tampon - 1 ) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = '\0';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;} else {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tampon[i] = tampon[i+1];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cpt_tampon--;&amp;lt;/code&amp;gt;                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                         &lt;br /&gt;
&lt;br /&gt;
L'idée est de vider le  tampon à chaque fois que l'on envoi le tableau à la case 0 : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(data == 0x05) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SPDR = tampon[0];&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;vider_tampon();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(cpt_tampon == 0) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PC4);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;                                &lt;br /&gt;
&lt;br /&gt;
En conclusion, le programme de la carte mère envoi la demande d'identification (0x00) ainsi que la demande de touche. Et le programme du clavier envoi le caractère '!', et par la suite la touche du tampon. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;VIDEO&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' ce code n'est pas parfait puisqu'il écrit 1 fois de trop le caractère. Ex : si on appuie sur 'A', on lira sur le port série 'A', en revanche si on appuie juste après sur 'B', on lira 'A' puis 'B'. Nous n'avons malheureusement pas pu décoder cette erreur. &lt;br /&gt;
&lt;br /&gt;
==== Points importants à savoir ====&lt;br /&gt;
il faut débrancher et rebrancher le câble du bus SPI pour que la communication fonctionne. Aussi, si le programme du maître ne s'injecte pas dans l'Arduino, il faut insérer d'abord un programme d'exemple comme ArduinoISP. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons mis à part des programmes fonctionnels dans les répertoires nommés &amp;quot;Codes_OK&amp;quot;. Tout est expliqué dans des README qui se trouvent (presque) dans chaque répertoire. Un README qui se trouve dans le répertoire clavier/Code explique ce que les combinaisons de codes du maître et de l'esclave font. Des vidéos se trouvent également dans le répertoire Videos, qui montrent la fonctionnalité de chaque codes. Il y a d'ailleurs &amp;lt;u&amp;gt;plus (+) de vidéos&amp;lt;/u&amp;gt; sur le git. &lt;br /&gt;
&lt;br /&gt;
==== Différentes vidéos ====&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Sch%C3%A9ma_bloc_du_driver_SPI.png&amp;diff=2961</id>
		<title>Fichier:Schéma bloc du driver SPI.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Sch%C3%A9ma_bloc_du_driver_SPI.png&amp;diff=2961"/>
		<updated>2024-01-17T18:25:04Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;fonctionnement global du driver spi série&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Sch%C3%A9ma_bloc.png&amp;diff=2960</id>
		<title>Fichier:Schéma bloc.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Sch%C3%A9ma_bloc.png&amp;diff=2960"/>
		<updated>2024-01-17T18:16:45Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Schéma bloc du code VHDL&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Sch%C3%A9ma_bloc_driver_spi.png&amp;diff=2959</id>
		<title>Fichier:Schéma bloc driver spi.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Sch%C3%A9ma_bloc_driver_spi.png&amp;diff=2959"/>
		<updated>2024-01-17T18:08:43Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;schéma qui décris le code vhdl réalisé&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2777</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2777"/>
		<updated>2024-01-16T13:16:07Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Carte FPGA/VHDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]    &lt;br /&gt;
&lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Lors de la première séance de Pico, nous avons soudé quelques cartes telles que le Shield, la carte de leds et la carte 7 segments : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre|205x205px]][[Fichier:CartePin.png|sans_cadre|209x209px]][[Fichier:7_segments.png|sans_cadre|213x213px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre|203x203px]][[Fichier:Back.png|sans_cadre|200x200px]]&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino qui nous servirons pour la communication du bus SPI : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre|169x169px]]&lt;br /&gt;
=== Programmation Ordonnancement ===&lt;br /&gt;
&lt;br /&gt;
==== Clignotement de 2 Leds ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente :   [[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]'''Remarque :''' Les temps ne sont pas réels, l'objectif est donc d'endormir les tâches.   &lt;br /&gt;
&lt;br /&gt;
==== Lecture sur port série en mémoire partagée ====&lt;br /&gt;
Par la suite, nous voulons ordonnancer une tâche qui permet de stocker dans une mémoire partagée la valeur reçue sur le port série.  &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons utilisé : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ordo lecture serie.png|sans_cadre]]Ici, la mémoire partagée est une variable globale en unsigned char.  &lt;br /&gt;
&lt;br /&gt;
Pour lire sur le port série, on utilisera la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
==== Lecture/écriture sur port série ====&lt;br /&gt;
Afin de vérifier le code que nous avons écris dans la partie d'avant, nous écrirons sur le port série ce que nous avons lu. En d'autres termes, nous écrirons sur le port série ce que nous avons écris sur le clavier. &lt;br /&gt;
[[Fichier:Ordo_lecture_ecriture.png|gauche|sans_cadre]] &lt;br /&gt;
Cette fonction permettra d'écrire directement sur le port série grâce au caractère que l'on aura lu précédemment. &lt;br /&gt;
 &lt;br /&gt;
En revanche, cette fonction n'est pas utilisée pour de l'ordonnancement mais elle est utilisée par la fonction suivante qui elle est utilisée pour de l'ordonnancement (et donc fait parti des taches) &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ordo_lect_ecr.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' Après réflexion nous aurions pu éviter de mettre en paramètre le caractère lu puisque la variable globale est utile pour ça. &lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous devons implémenter un contrôleur de bus série SPI. &lt;br /&gt;
&lt;br /&gt;
Tout d'abord, voici comment fonctionne un bus SPI : &lt;br /&gt;
&lt;br /&gt;
Dans un bus SPI, il y a 1 maître et 1 ou plusieurs esclaves. Le transmission des données se font sur 2 fils : MISO et MOSI : &lt;br /&gt;
&lt;br /&gt;
- MOSI : Données du maître vers l'esclave,&lt;br /&gt;
&lt;br /&gt;
- MISO : Données de l'esclave vers le maître.&lt;br /&gt;
&lt;br /&gt;
Puisqu'il y a plusieurs esclaves, le SS (Ship Select) permet d'autoriser 1 esclave précis en l'activant à 0. &lt;br /&gt;
&lt;br /&gt;
Les échanges se font sur front et sont synchronisés par le maître. &lt;br /&gt;
&lt;br /&gt;
Lorsqu'un octet du maître passe dans le registre de l'esclave, celui de l'esclave passe dans le registre du maître simultanément comme représenté sur l'image ci-dessous. C'est le principe du registre à décalage.&lt;br /&gt;
[[Fichier:Chemin spi.png|centré|sans_cadre]]Le contrôleur SPI doit jouer le rôle du maître et va contrôler les pins du bus SPI pour échanger des données : &lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet pour la carte clavier est de lire les boutons qui sont enfoncés afin de les envoyer à la carte mère via le bus SPI. &lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte :  [[Fichier:Schematique_clavier.png|centré|sans_cadre|511x511px]]Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches qui sont : la flèche de gauche, la flèche de droite, l'espace, un retour chariot, le suppression et enfin un shift qui nous permettra de switcher avec les 10 chiffres (de 0 à 9), &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation&lt;br /&gt;
* un ATmega328p&lt;br /&gt;
* un connecteur HE10 8 pins pour un bus SPI + une ligne d'interruption pour communiquer avec la carte mère&lt;br /&gt;
* un connecteur 6 pins(2x3) pour un bus SPI afin de programmer la carte.&lt;br /&gt;
&amp;lt;u&amp;gt;Fonctionnement matrice de touches :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but ici est de pouvoir lire la touche sur laquelle nous avons appuyé pour l'envoyer à la carte mère. Ici, l'idée est d'utiliser le fonctionnement de la matrice de touche qui est le suivant : &lt;br /&gt;
&lt;br /&gt;
Premièrement, il faut se décider duquel entre les lignes et les colonnes seront en entrée et l'autre en sortie. Ici se sont les lignes qui sont en sortie et les colonnes en entrée. &lt;br /&gt;
&lt;br /&gt;
L'idée est simple : alterner entre les lignes pour écrire un 0L sur 1 ligne et sur les autres un 1L. On parcourt ensuite toutes les colonnes (de la ligne à 0L). Si on lit un 0L sur une colonne, alors il suffit d'associer la ligne qui est à 0L avec celle de la colonne et on connait la touche qui a été appuyée. &lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up qui se trouvent au niveau des lignes serviront  à avoir un 1L par défaut. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le routage de la carte : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.&lt;br /&gt;
&lt;br /&gt;
Pour faire ce routage, nous avons dû créer le footprint des boutons, alors la prise des mesures sur le boutons était nécessaire. Aussi, nous avons décidé d'utiliser un ATmega328p avec des pins traversants pour une question de facilité au niveau de la soudure mais également pour éviter tout court-circuit et donc une perte de temps. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]][[Fichier:3d view.png|sans_cadre|235x235px]][[Fichier:3d view bottom.png|sans_cadre|235x235px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réel clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte_soude.jpg|sans_cadre|266x266px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Amélioration possible :&amp;lt;/u&amp;gt; permettre la programmation en USB. Avec cette carte telle qu'elle est faite, pour insérer un programme dans le microcontrôleur il faut passer par la carte Arduino et pour ça, il faut insérer le programme &amp;quot;ArduinoISP&amp;quot; qui se trouver dans les exemples de l'IDE Arduino, sans oublier tous les branchements à refaire. Ce n'est pas vraiment pratique et c'est une perte de temps qu'il est possible d'enlever en mettant un port USB directement sur la carte clavier.  &lt;br /&gt;
&lt;br /&gt;
=== Partie programmation ===&lt;br /&gt;
La programmation de notre carte se fera via un AVR ISP &lt;br /&gt;
&lt;br /&gt;
Pour cela, on utilise une carte arduino uno dans laquelle on téléverse le programme Arduino ISP, disponible dans les exemples de l'IDE arduino, pour permettre a l'arduino uno d'envoyer notre code vers la carte clavier via le connecteur HE10.   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma AVR ISP.png|centré|400x400px|sans_cadre]]&lt;br /&gt;
Pour flasher notre carte clavier, 2 solutions : &lt;br /&gt;
&lt;br /&gt;
* utiliser l'IDE arduino, en utilisant le paramètre &amp;quot;upload using programmer&amp;quot; qui permet de televerser du code dans une atmega en passant par le bus SPI. Mais cela néccesite d'écrire le code sur l'IDE arduino. Cette solution permettra simplement de faire des tests rapides en utilisant, par exemple, l'exemple &amp;quot;Blink&amp;quot;.&lt;br /&gt;
* Créer un Makefile qui permet de téléverser notre code C vers la carte fille en passant par l'arduino uno :&lt;br /&gt;
[[Fichier:Makefil.png|sans_cadre|450x450px]]  &lt;br /&gt;
&lt;br /&gt;
==== Programme de tests sur la carte ====&lt;br /&gt;
Nous sommes ensuite passés au différents tests de la carte pour tester chaque fonctionnalités.   &lt;br /&gt;
&lt;br /&gt;
===== Premier test : la carte est-elle programmable ? =====&lt;br /&gt;
On utilise un programme très simple qui allume une des LEDs de la carte, le &amp;quot;Blink&amp;quot; disponible dans les exemples de l'IDE arduino. &lt;br /&gt;
&lt;br /&gt;
Cependant, en essayant de programmer la carte, aucune LEDs ne clignotait. Comme le code ne venait pas de nous et qe c'est un code simple, le problème ne pouvait venir que du côté du hardware. Nous avons donc tester notre carte au multimètre et il y avait effectivement un court-circuit au niveau du crystal qui empêchait forcement son fonctionnement. L'erreur vient de notre schématique puisque nous avons tourné à 90° le composant, ce qui créé effectivement un court-circuit. Pour remédier à notre problème, nous avons dé-souder le crystal et l'avons décalé sur la carte. &lt;br /&gt;
&lt;br /&gt;
Une fois le crystal re-soudé dans le bon sens, nous avons pu flasher la carte clavier avec le programme &amp;quot;Blink&amp;quot;&lt;br /&gt;
[[Fichier:Led_allumee_clavier.png|centré|sans_cadre|241x241px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; La LED clignote, ce qui nous permet de valider le faite que la carte est programmable via notre AVR ISP.&lt;br /&gt;
&lt;br /&gt;
===== Deuxième test : la lecture d'un bouton =====&lt;br /&gt;
Pour commencer les tests, nous cherchons à allumer une LED quand on appuie sur un bouton en particulier. Pour cela, nous avons mis à 0L la ligne sur PC3 et lu la colonne sur PD0 :   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test_clavier.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Ce test nous a permit de vérifier 2 choses : &lt;br /&gt;
&lt;br /&gt;
* que notre clavier matricielle est capable de reconnaître une touche en particulier&lt;br /&gt;
* que nous arrivions bien à utiliser les Leds de notre carte. Ainsi nous avons nos &amp;quot;calculs&amp;quot; avec les décalages et les opérations logiques utiles pour mettre à 0L ou lire sur le port une entrée. &lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons gardé l'idée d'allumer une Led lorsqu'un bouton est enfoncé.          &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Premier_test_clavier.mp4|néant|cadre]]'''Problème rencontré :''' Au début nous n'arrivions par à lire le bouton bien que notre code soit simple. Nous avons donc vérifié au multimètre si nos boutons étaient bien soudés. Au multimètre, les 4 broches de chaque bouton étaient reliés (donc en court-circuit), ce n'est absolument pas normal. Effectivement, lorsque nous avions créé les footprints des boutons nous n'avons pas mis les broches au bon endroit. Dans les boutons il y a déjà des broches reliées et dans nos footprint nous n'avons pas mis les bons chiffres des broches correctement : ce qui nous a créé un court-circuit. Pour contrer ce problème, nous avons tourné à 90° chaque bouton. C n'était pas simple car il a fallut redresser les pins pour qu'ils rentrent bien dans les trous de la carte. Finalement les boutons fonctionnent correctement et les boutons restent assez droits. &lt;br /&gt;
&lt;br /&gt;
===== Troisième test : lecture de tous les boutons + shift =====&lt;br /&gt;
Pour commencer, on definit notre matrice de touches grâce à un tableau à 2 dimensions, ça nous permettra de récupérer directement les bonnes touches.  &lt;br /&gt;
&lt;br /&gt;
Nous voulions mettre notre clavier en AZERTY, malheureusement notre matrice ne nous le permet pas, alors les touches seront dans l'ordre alphabétique. Dans le code, les lettres ne sont pas dans l'ordre simplement parce que lors du routage nous n'avons pas laissé les boutons comme dans la schématique par simplicité de routage : &lt;br /&gt;
[[Fichier:Matrice touches.png|gauche|sans_cadre]]&lt;br /&gt;
&amp;lt;u&amp;gt;traduction des valeurs hexadécimales :&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 0x0E : le shift &lt;br /&gt;
* '''&amp;lt;big&amp;gt;0x08 : suppression&amp;lt;/big&amp;gt;'''&lt;br /&gt;
* 0x1C : flèche gauche &lt;br /&gt;
* 0x1D : flèche droite &lt;br /&gt;
&lt;br /&gt;
Ce sont simplement les codes en ASCII. &lt;br /&gt;
[[Fichier:Lecture touches.png|gauche|sans_cadre|400x400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Cette fonction nous permet d'effectuer la lecture d'une touche avec la méthode du clavier matriciel que nous avons expliqué plus haut. &lt;br /&gt;
&lt;br /&gt;
Ainsi, pour chaque ligne à 0L on lira sur chaque colonne et on vérifie si elle est égale à 0L. Si oui, on retourne directement la valeur de la touche en retournant notre matrice de touches avec les indices de la ligne et de la colonne en cours. &lt;br /&gt;
&lt;br /&gt;
Il y a une condition supplémentaire : si la touche appuyée est le shift (0x0E). Dans ce cas, on bascule on recommence la même méthode, mais cette fois on retournera la valeur appuyée mais grâce à la deuxième matrice cette fois puisqu'elle contient les chiffres de 0 à 9. &lt;br /&gt;
&lt;br /&gt;
Ici, l'utilisateur devra appuyer sur le bouton pour les chiffres en même temps que le bouton du shift. &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;
Finalement, notre clavier ce présent comme ceci : &lt;br /&gt;
[[Fichier:Tableau du clavier.png|gauche|cadre|Clavier sans appuyer sur SHIFT]]&lt;br /&gt;
[[Fichier:Schéma clavier avec appuie sur SHIFT.png|centré|cadre|clavier avec appuie sur SHIFT]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Quatrième test : le bus SPI =====&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie est d'envoyer les touches lu par le clavier vers la carte mère grâce au bus SPI. On a donc écrit un programme pour tester le bus SPI. L'idée était simplement d'envoyer une une variable en fonction de ce que l'on recevait. &lt;br /&gt;
&lt;br /&gt;
Pour utiliser le bus SPI, il est nécessaire d'utiliser une interruption (une ISR) qui permettra, pour rester dans le cahier des charges, d'envoyer des valeurs en fonctions de la valeur que l'on reçoit. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ISR(SPI_STC_vect) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   char data = SPDR;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   _delay_ms(40);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   if(data == 0x00) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = '!';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x01) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = bouton;&amp;lt;/code&amp;gt;                                      ici la valeur de bouton est initialisée à 1. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x05) SPDR = 'C';&amp;lt;/code&amp;gt;    il n'y a pas encore le traitement de la touche sur laquelle on a appuyé. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication de la communication en bus SPI :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, l'idée est de communiquer avec la carte mère. Pour cela, voici un schéma explicatif de notre mèthode de communication : &lt;br /&gt;
[[Fichier:Clavier mode spi.png|centré|sans_cadre]]&lt;br /&gt;
'''Remarque :''' la taille du tampon sera, le plus souvent, égale à 1 puisque le microcontrôleur est plus rapide qu'un humain. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication du code :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puisque c'est un test sur le spi, nous avons seulement envoyé des valeurs aléatoires afin de vérifier si le bus spi marche, mais en gardant la configuration que l'on doit avoir avec le schéma ci-dessus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir vérifier nos codes correctement, nous avons utiliser un arduino uno qui &amp;quot;remplace&amp;quot; la carte mère et qui envoit les valeurs 0x00, 0x01 ou 0x05 de la même manière, avec le bus SPI et les bonnes configurations d'initialisation du bus en tant que &amp;quot;maître&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons regardé à l'osciloscope l'allure de nos signaux MISO et MOSI :  &lt;br /&gt;
&lt;br /&gt;
* Le MOSI était cohérant avec les données envoyées&lt;br /&gt;
* Le MISO en revanche a des valeurs de tensions écrasé, ce qui fait que la valeur récuperé par le maitre est toujours zéro&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:MOSI.png|gauche|vignette|MOSI]]&lt;br /&gt;
[[Fichier:MISO.png|centré|vignette|MISO|290x290px]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; Après de nombreux essais sur différents shield, le bus SPI de certaines cartes ne fonctionnent pas, et d'autres fonctionnent, et ce même avec un code identiques. C'est assez troublant puisque même avec la dernière carte modifiée et soudée par M. Redon, le bus SPI ne fonctionne pas avec notre code. &lt;br /&gt;
&lt;br /&gt;
Les shields des binomes 4,5 et 6 ont ce problème. &lt;br /&gt;
&lt;br /&gt;
Les shields des binomes 8 et 9 fonctionnent  &lt;br /&gt;
&lt;br /&gt;
===== Cinquième test : affichage sur le port série =====&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier plus précisément et de continuer nos tests, le but étant de programmer la gestion de l'affichage des données reçues par le bus SPI sur le port série. &lt;br /&gt;
&lt;br /&gt;
Pour ce faire, nous utilisons la même fonction &amp;lt;code&amp;gt;serie_envoyer()&amp;lt;/code&amp;gt; que dans l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1){&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_activer();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(20);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     data_recue = spi_envoi(0x05);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     serie_envoyer(data_recue);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_desactiver();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(100);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but étant, ici, d'envoyer directement la demande de touche et de l'afficher directement sur le port série grâce au &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo montrant le fonctionnement de notre clavier : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;VIDEO&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Programme final ===&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2685</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2685"/>
		<updated>2024-01-15T11:58:49Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Deuxième test : la lecture d'un bouton */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]    &lt;br /&gt;
&lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Lors de la première séance de Pico, nous avons soudé quelques cartes telles que le Shield, la carte de leds et la carte 7 segments : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre|205x205px]][[Fichier:CartePin.png|sans_cadre|209x209px]][[Fichier:7_segments.png|sans_cadre|213x213px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre|203x203px]][[Fichier:Back.png|sans_cadre|200x200px]]&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino qui nous servirons pour la communication du bus SPI : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre|169x169px]]&lt;br /&gt;
=== Programmation Ordonnancement ===&lt;br /&gt;
&lt;br /&gt;
==== Clignotement de 2 Leds ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente :   [[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]'''Remarque :''' Les temps ne sont pas réels, l'objectif est donc d'endormir les tâches.   &lt;br /&gt;
&lt;br /&gt;
==== Lecture sur port série en mémoire partagée ====&lt;br /&gt;
Par la suite, nous voulons ordonnancer une tâche qui permet de stocker dans une mémoire partagée la valeur reçue sur le port série.  &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons utilisé : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ordo lecture serie.png|sans_cadre]]Ici, la mémoire partagée est une variable globale en unsigned char.  &lt;br /&gt;
&lt;br /&gt;
Pour lire sur le port série, on utilisera la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
==== Lecture/écriture sur port série ====&lt;br /&gt;
Afin de vérifier le code que nous avons écris dans la partie d'avant, nous écrirons sur le port série ce que nous avons lu. En d'autres termes, nous écrirons sur le port série ce que nous avons écris sur le clavier. &lt;br /&gt;
[[Fichier:Ordo_lecture_ecriture.png|gauche|sans_cadre]] &lt;br /&gt;
Cette fonction permettra d'écrire directement sur le port série grâce au caractère que l'on aura lu précédemment. &lt;br /&gt;
 &lt;br /&gt;
En revanche, cette fonction n'est pas utilisée pour de l'ordonnancement mais elle est utilisée par la fonction suivante qui elle est utilisée pour de l'ordonnancement (et donc fait parti des taches) &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ordo_lect_ecr.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' Après réflexion nous aurions pu éviter de mettre en paramètre le caractère lu puisque la variable globale est utile pour ça. &lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous devons implémenter un contrôleur de bus série SPI. &lt;br /&gt;
&lt;br /&gt;
Tout d'abord, voici comment fonctionne un bus SPI : &lt;br /&gt;
&lt;br /&gt;
Dans un bus SPI, il y a 1 maître et 1 ou plusieurs esclaves. Le transmission des données se font sur 2 fils : MISO et MOSI : &lt;br /&gt;
&lt;br /&gt;
- MOSI : Données du maître vers l'esclave,&lt;br /&gt;
&lt;br /&gt;
- MISO : Données de l'esclave vers le maître.&lt;br /&gt;
&lt;br /&gt;
Puisqu'il y a plusieurs esclaves, le SS (Ship Select) permet d'autoriser 1 esclave précis en l'activant à 0. &lt;br /&gt;
&lt;br /&gt;
Les échanges se font sur front et sont synchronisés par le maître. &lt;br /&gt;
&lt;br /&gt;
Lorsqu'un octet du maître passe dans le registre de l'esclave, celui de l'esclave passe dans le registre du maître simultanément comme représenté sur l'image ci-dessous.&lt;br /&gt;
[[Fichier:Chemin spi.png|centré|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet pour la carte clavier est de lire les boutons qui sont enfoncés afin de les envoyer à la carte mère via le bus SPI. &lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte :  [[Fichier:Schematique_clavier.png|centré|sans_cadre|511x511px]]Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches qui sont : la flèche de gauche, la flèche de droite, l'espace, un retour chariot, le suppression et enfin un shift qui nous permettra de switcher avec les 10 chiffres (de 0 à 9), &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation&lt;br /&gt;
* un ATmega328p&lt;br /&gt;
* un connecteur HE10 8 pins pour un bus SPI + une ligne d'interruption pour communiquer avec la carte mère&lt;br /&gt;
* un connecteur 6 pins(2x3) pour un bus SPI afin de programmer la carte.&lt;br /&gt;
&amp;lt;u&amp;gt;Fonctionnement matrice de touches :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but ici est de pouvoir lire la touche sur laquelle nous avons appuyé pour l'envoyer à la carte mère. Ici, l'idée est d'utiliser le fonctionnement de la matrice de touche qui est le suivant : &lt;br /&gt;
&lt;br /&gt;
Premièrement, il faut se décider duquel entre les lignes et les colonnes seront en entrée et l'autre en sortie. Ici se sont les lignes qui sont en sortie et les colonnes en entrée. &lt;br /&gt;
&lt;br /&gt;
L'idée est simple : alterner entre les lignes pour écrire un 0L sur 1 ligne et sur les autres un 1L. On parcourt ensuite toutes les colonnes (de la ligne à 0L). Si on lit un 0L sur une colonne, alors il suffit d'associer la ligne qui est à 0L avec celle de la colonne et on connait la touche qui a été appuyée. &lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up qui se trouvent au niveau des lignes serviront  à avoir un 1L par défaut. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le routage de la carte : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.&lt;br /&gt;
&lt;br /&gt;
Pour faire ce routage, nous avons dû créer le footprint des boutons, alors la prise des mesures sur le boutons était nécessaire. Aussi, nous avons décidé d'utiliser un ATmega328p avec des pins traversants pour une question de facilité au niveau de la soudure mais également pour éviter tout court-circuit et donc une perte de temps. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]][[Fichier:3d view.png|sans_cadre|235x235px]][[Fichier:3d view bottom.png|sans_cadre|235x235px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réel clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte_soude.jpg|sans_cadre|266x266px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Amélioration possible :&amp;lt;/u&amp;gt; permettre la programmation en USB. Avec cette carte telle qu'elle est faite, pour insérer un programme dans le microcontrôleur il faut passer par la carte Arduino et pour ça, il faut insérer le programme &amp;quot;ArduinoISP&amp;quot; qui se trouver dans les exemples de l'IDE Arduino, sans oublier tous les branchements à refaire. Ce n'est pas vraiment pratique et c'est une perte de temps qu'il est possible d'enlever en mettant un port USB directement sur la carte clavier.  &lt;br /&gt;
&lt;br /&gt;
=== Partie programmation ===&lt;br /&gt;
La programmation de notre carte se fera via un AVR ISP &lt;br /&gt;
&lt;br /&gt;
Pour cela, on utilise une carte arduino uno dans laquelle on téléverse le programme Arduino ISP, disponible dans les exemples de l'IDE arduino, pour permettre a l'arduino uno d'envoyer notre code vers la carte clavier via le connecteur HE10.   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma AVR ISP.png|centré|400x400px|sans_cadre]]&lt;br /&gt;
Pour flasher notre carte clavier, 2 solutions : &lt;br /&gt;
&lt;br /&gt;
* utiliser l'IDE arduino, en utilisant le paramètre &amp;quot;upload using programmer&amp;quot; qui permet de televerser du code dans une atmega en passant par le bus SPI. Mais cela néccesite d'écrire le code sur l'IDE arduino. Cette solution permettra simplement de faire des tests rapides en utilisant, par exemple, l'exemple &amp;quot;Blink&amp;quot;.&lt;br /&gt;
* Créer un Makefile qui permet de téléverser notre code C vers la carte fille en passant par l'arduino uno :&lt;br /&gt;
[[Fichier:Makefil.png|sans_cadre|450x450px]]  &lt;br /&gt;
&lt;br /&gt;
==== Programme de tests sur la carte ====&lt;br /&gt;
Nous sommes ensuite passés au différents tests de la carte pour tester chaque fonctionnalités.   &lt;br /&gt;
&lt;br /&gt;
===== Premier test : la carte est-elle programmable ? =====&lt;br /&gt;
On utilise un programme très simple qui allume une des LEDs de la carte, le &amp;quot;Blink&amp;quot; disponible dans les exemples de l'IDE arduino. &lt;br /&gt;
&lt;br /&gt;
Cependant, en essayant de programmer la carte, aucune LEDs ne clignotait. Comme le code ne venait pas de nous et qe c'est un code simple, le problème ne pouvait venir que du côté du hardware. Nous avons donc tester notre carte au multimètre et il y avait effectivement un court-circuit au niveau du crystal qui empêchait forcement son fonctionnement. L'erreur vient de notre schématique puisque nous avons tourné à 90° le composant, ce qui créé effectivement un court-circuit. Pour remédier à notre problème, nous avons dé-souder le crystal et l'avons décalé sur la carte. &lt;br /&gt;
&lt;br /&gt;
Une fois le crystal re-soudé dans le bon sens, nous avons pu flasher la carte clavier avec le programme &amp;quot;Blink&amp;quot;&lt;br /&gt;
[[Fichier:Led_allumee_clavier.png|centré|sans_cadre|241x241px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; La LED clignote, ce qui nous permet de valider le faite que la carte est programmable via notre AVR ISP.&lt;br /&gt;
&lt;br /&gt;
===== Deuxième test : la lecture d'un bouton =====&lt;br /&gt;
Pour commencer les tests, nous cherchons à allumer une LED quand on appuie sur un bouton en particulier. Pour cela, nous avons mis à 0L la ligne sur PC3 et lu la colonne sur PD0 :   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test_clavier.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Ce test nous a permit de vérifier 2 choses : &lt;br /&gt;
&lt;br /&gt;
* que notre clavier matricielle est capable de reconnaître une touche en particulier&lt;br /&gt;
* que nous arrivions bien à utiliser les Leds de notre carte. Ainsi nous avons nos &amp;quot;calculs&amp;quot; avec les décalages et les opérations logiques utiles pour mettre à 0L ou lire sur le port une entrée. &lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons gardé l'idée d'allumer une Led lorsqu'un bouton est enfoncé.          &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Premier_test_clavier.mp4|néant|cadre]]'''Problème rencontré :''' Au début nous n'arrivions par à lire le bouton bien que notre code soit simple. Nous avons donc vérifié au multimètre si nos boutons étaient bien soudés. Au multimètre, les 4 broches de chaque bouton étaient reliés (donc en court-circuit), ce n'est absolument pas normal. Effectivement, lorsque nous avions créé les footprints des boutons nous n'avons pas mis les broches au bon endroit. Dans les boutons il y a déjà des broches reliées et dans nos footprint nous n'avons pas mis les bons chiffres des broches correctement : ce qui nous a créé un court-circuit. Pour contrer ce problème, nous avons tourné à 90° chaque bouton. C n'était pas simple car il a fallut redresser les pins pour qu'ils rentrent bien dans les trous de la carte. Finalement les boutons fonctionnent correctement et les boutons restent assez droits. &lt;br /&gt;
&lt;br /&gt;
===== Troisième test : lecture de tous les boutons + shift =====&lt;br /&gt;
Pour commencer, on definit notre matrice de touches grâce à un tableau à 2 dimensions, ça nous permettra de récupérer directement les bonnes touches.  &lt;br /&gt;
&lt;br /&gt;
Nous voulions mettre notre clavier en AZERTY, malheureusement notre matrice ne nous le permet pas, alors les touches seront dans l'ordre alphabétique. Dans le code, les lettres ne sont pas dans l'ordre simplement parce que lors du routage nous n'avons pas laissé les boutons comme dans la schématique par simplicité de routage : &lt;br /&gt;
[[Fichier:Matrice touches.png|gauche|sans_cadre]]&lt;br /&gt;
&amp;lt;u&amp;gt;traduction des valeurs hexadécimales :&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 0x0E : le shift &lt;br /&gt;
* '''&amp;lt;big&amp;gt;0x08 : suppression&amp;lt;/big&amp;gt;'''&lt;br /&gt;
* 0x1C : flèche gauche &lt;br /&gt;
* 0x1D : flèche droite &lt;br /&gt;
&lt;br /&gt;
Ce sont simplement les codes en ASCII. &lt;br /&gt;
[[Fichier:Lecture touches.png|gauche|sans_cadre|400x400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Cette fonction nous permet d'effectuer la lecture d'une touche avec la méthode du clavier matriciel que nous avons expliqué plus haut. &lt;br /&gt;
&lt;br /&gt;
Ainsi, pour chaque ligne à 0L on lira sur chaque colonne et on vérifie si elle est égale à 0L. Si oui, on retourne directement la valeur de la touche en retournant notre matrice de touches avec les indices de la ligne et de la colonne en cours. &lt;br /&gt;
&lt;br /&gt;
Il y a une condition supplémentaire : si la touche appuyée est le shift (0x0E). Dans ce cas, on bascule on recommence la même méthode, mais cette fois on retournera la valeur appuyée mais grâce à la deuxième matrice cette fois puisqu'elle contient les chiffres de 0 à 9. &lt;br /&gt;
&lt;br /&gt;
Ici, l'utilisateur devra appuyer sur le bouton pour les chiffres en même temps que le bouton du shift. &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;
Finalement, notre clavier ce présent comme ceci : &lt;br /&gt;
[[Fichier:Tableau du clavier.png|gauche|cadre|Clavier sans appuyer sur SHIFT]]&lt;br /&gt;
[[Fichier:Schéma clavier avec appuie sur SHIFT.png|centré|cadre|clavier avec appuie sur SHIFT]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Quatrième test : le bus SPI =====&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie est d'envoyer les touches lu par le clavier vers la carte mère grâce au bus SPI. On a donc écrit un programme pour tester le bus SPI. L'idée était simplement d'envoyer une une variable en fonction de ce que l'on recevait. &lt;br /&gt;
&lt;br /&gt;
Pour utiliser le bus SPI, il est nécessaire d'utiliser une interruption (une ISR) qui permettra, pour rester dans le cahier des charges, d'envoyer des valeurs en fonctions de la valeur que l'on reçoit. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ISR(SPI_STC_vect) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   char data = SPDR;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   _delay_ms(40);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   if(data == 0x00) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = '!';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x01) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = bouton;&amp;lt;/code&amp;gt;                                      ici la valeur de bouton est initialisée à 1. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x05) SPDR = 'C';&amp;lt;/code&amp;gt;    il n'y a pas encore le traitement de la touche sur laquelle on a appuyé. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication de la communication en bus SPI :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, l'idée est de communiquer avec la carte mère. Pour cela, voici un schéma explicatif de notre mèthode de communication : &lt;br /&gt;
[[Fichier:Clavier mode spi.png|centré|sans_cadre]]&lt;br /&gt;
'''Remarque :''' la taille du tampon sera, le plus souvent, égale à 1 puisque le microcontrôleur est plus rapide qu'un humain. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication du code :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puisque c'est un test sur le spi, nous avons seulement envoyé des valeurs aléatoires afin de vérifier si le bus spi marche, mais en gardant la configuration que l'on doit avoir avec le schéma ci-dessus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir vérifier nos codes correctement, nous avons utiliser un arduino uno qui &amp;quot;remplace&amp;quot; la carte mère et qui envoit les valeurs 0x00, 0x01 ou 0x05 de la même manière, avec le bus SPI et les bonnes configurations d'initialisation du bus en tant que &amp;quot;maître&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons regardé à l'osciloscope l'allure de nos signaux MISO et MOSI :  &lt;br /&gt;
&lt;br /&gt;
* Le MOSI était cohérant avec les données envoyées&lt;br /&gt;
* Le MISO en revanche a des valeurs de tensions écrasé, ce qui fait que la valeur récuperé par le maitre est toujours zéro&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:MOSI.png|gauche|vignette|MOSI]]&lt;br /&gt;
[[Fichier:MISO.png|centré|vignette|MISO|290x290px]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; Après de nombreux essais sur différents shield, le bus SPI de certaines cartes ne fonctionnent pas, et d'autres fonctionnent, et ce même avec un code identiques. C'est assez troublant puisque même avec la dernière carte modifiée et soudée par M. Redon, le bus SPI ne fonctionne pas avec notre code. &lt;br /&gt;
&lt;br /&gt;
Les shields des binomes 4,5 et 6 ont ce problème. &lt;br /&gt;
&lt;br /&gt;
Les shields des binomes 8 et 9 fonctionnent  &lt;br /&gt;
&lt;br /&gt;
===== Cinquième test : affichage sur le port série =====&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier plus précisément et de continuer nos tests, le but étant de programmer la gestion de l'affichage des données reçues par le bus SPI sur le port série. &lt;br /&gt;
&lt;br /&gt;
Pour ce faire, nous utilisons la même fonction &amp;lt;code&amp;gt;serie_envoyer()&amp;lt;/code&amp;gt; que dans l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1){&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_activer();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(20);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     data_recue = spi_envoi(0x05);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     serie_envoyer(data_recue);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_desactiver();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(100);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but étant, ici, d'envoyer directement la demande de touche et de l'afficher directement sur le port série grâce au &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo montrant le fonctionnement de notre clavier : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;VIDEO&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Programme final ===&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2684</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2684"/>
		<updated>2024-01-15T10:38:02Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Troisième test : lecture de tous les boutons + shift */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]    &lt;br /&gt;
&lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Lors de la première séance de Pico, nous avons soudé quelques cartes telles que le Shield, la carte de leds et la carte 7 segments : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre|205x205px]][[Fichier:CartePin.png|sans_cadre|209x209px]][[Fichier:7_segments.png|sans_cadre|213x213px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre|203x203px]][[Fichier:Back.png|sans_cadre|200x200px]]&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino qui nous servirons pour la communication du bus SPI : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre|169x169px]]&lt;br /&gt;
=== Programmation Ordonnancement ===&lt;br /&gt;
&lt;br /&gt;
==== Clignotement de 2 Leds ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente :   [[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]'''Remarque :''' Les temps ne sont pas réels, l'objectif est donc d'endormir les tâches.   &lt;br /&gt;
&lt;br /&gt;
==== Lecture sur port série en mémoire partagée ====&lt;br /&gt;
Par la suite, nous voulons ordonnancer une tâche qui permet de stocker dans une mémoire partagée la valeur reçue sur le port série.  &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons utilisé : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ordo lecture serie.png|sans_cadre]]Ici, la mémoire partagée est une variable globale en unsigned char.  &lt;br /&gt;
&lt;br /&gt;
Pour lire sur le port série, on utilisera la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
==== Lecture/écriture sur port série ====&lt;br /&gt;
Afin de vérifier le code que nous avons écris dans la partie d'avant, nous écrirons sur le port série ce que nous avons lu. En d'autres termes, nous écrirons sur le port série ce que nous avons écris sur le clavier. &lt;br /&gt;
[[Fichier:Ordo_lecture_ecriture.png|gauche|sans_cadre]] &lt;br /&gt;
Cette fonction permettra d'écrire directement sur le port série grâce au caractère que l'on aura lu précédemment. &lt;br /&gt;
 &lt;br /&gt;
En revanche, cette fonction n'est pas utilisée pour de l'ordonnancement mais elle est utilisée par la fonction suivante qui elle est utilisée pour de l'ordonnancement (et donc fait parti des taches) &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ordo_lect_ecr.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' Après réflexion nous aurions pu éviter de mettre en paramètre le caractère lu puisque la variable globale est utile pour ça. &lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous devons implémenter un contrôleur de bus série SPI. &lt;br /&gt;
&lt;br /&gt;
Tout d'abord, voici comment fonctionne un bus SPI : &lt;br /&gt;
&lt;br /&gt;
Dans un bus SPI, il y a 1 maître et 1 ou plusieurs esclaves. Le transmission des données se font sur 2 fils : MISO et MOSI : &lt;br /&gt;
&lt;br /&gt;
- MOSI : Données du maître vers l'esclave,&lt;br /&gt;
&lt;br /&gt;
- MISO : Données de l'esclave vers le maître.&lt;br /&gt;
&lt;br /&gt;
Puisqu'il y a plusieurs esclaves, le SS (Ship Select) permet d'autoriser 1 esclave précis en l'activant à 0. &lt;br /&gt;
&lt;br /&gt;
Les échanges se font sur front et sont synchronisés par le maître. &lt;br /&gt;
&lt;br /&gt;
Lorsqu'un octet du maître passe dans le registre de l'esclave, celui de l'esclave passe dans le registre du maître simultanément comme représenté sur l'image ci-dessous.&lt;br /&gt;
[[Fichier:Chemin spi.png|centré|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet pour la carte clavier est de lire les boutons qui sont enfoncés afin de les envoyer à la carte mère via le bus SPI. &lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte :  [[Fichier:Schematique_clavier.png|centré|sans_cadre|511x511px]]Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches qui sont : la flèche de gauche, la flèche de droite, l'espace, un retour chariot, le suppression et enfin un shift qui nous permettra de switcher avec les 10 chiffres (de 0 à 9), &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation&lt;br /&gt;
* un ATmega328p&lt;br /&gt;
* un connecteur HE10 8 pins pour un bus SPI + une ligne d'interruption pour communiquer avec la carte mère&lt;br /&gt;
* un connecteur 6 pins(2x3) pour un bus SPI afin de programmer la carte.&lt;br /&gt;
&amp;lt;u&amp;gt;Fonctionnement matrice de touches :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but ici est de pouvoir lire la touche sur laquelle nous avons appuyé pour l'envoyer à la carte mère. Ici, l'idée est d'utiliser le fonctionnement de la matrice de touche qui est le suivant : &lt;br /&gt;
&lt;br /&gt;
Premièrement, il faut se décider duquel entre les lignes et les colonnes seront en entrée et l'autre en sortie. Ici se sont les lignes qui sont en sortie et les colonnes en entrée. &lt;br /&gt;
&lt;br /&gt;
L'idée est simple : alterner entre les lignes pour écrire un 0L sur 1 ligne et sur les autres un 1L. On parcourt ensuite toutes les colonnes (de la ligne à 0L). Si on lit un 0L sur une colonne, alors il suffit d'associer la ligne qui est à 0L avec celle de la colonne et on connait la touche qui a été appuyée. &lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up qui se trouvent au niveau des lignes serviront  à avoir un 1L par défaut. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le routage de la carte : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.&lt;br /&gt;
&lt;br /&gt;
Pour faire ce routage, nous avons dû créer le footprint des boutons, alors la prise des mesures sur le boutons était nécessaire. Aussi, nous avons décidé d'utiliser un ATmega328p avec des pins traversants pour une question de facilité au niveau de la soudure mais également pour éviter tout court-circuit et donc une perte de temps. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]][[Fichier:3d view.png|sans_cadre|235x235px]][[Fichier:3d view bottom.png|sans_cadre|235x235px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réel clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte_soude.jpg|sans_cadre|266x266px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Amélioration possible :&amp;lt;/u&amp;gt; permettre la programmation en USB. Avec cette carte telle qu'elle est faite, pour insérer un programme dans le microcontrôleur il faut passer par la carte Arduino et pour ça, il faut insérer le programme &amp;quot;ArduinoISP&amp;quot; qui se trouver dans les exemples de l'IDE Arduino, sans oublier tous les branchements à refaire. Ce n'est pas vraiment pratique et c'est une perte de temps qu'il est possible d'enlever en mettant un port USB directement sur la carte clavier.  &lt;br /&gt;
&lt;br /&gt;
=== Partie programmation ===&lt;br /&gt;
La programmation de notre carte se fera via un AVR ISP &lt;br /&gt;
&lt;br /&gt;
Pour cela, on utilise une carte arduino uno dans laquelle on téléverse le programme Arduino ISP, disponible dans les exemples de l'IDE arduino, pour permettre a l'arduino uno d'envoyer notre code vers la carte clavier via le connecteur HE10.   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma AVR ISP.png|centré|400x400px|sans_cadre]]&lt;br /&gt;
Pour flasher notre carte clavier, 2 solutions : &lt;br /&gt;
&lt;br /&gt;
* utiliser l'IDE arduino, en utilisant le paramètre &amp;quot;upload using programmer&amp;quot; qui permet de televerser du code dans une atmega en passant par le bus SPI. Mais cela néccesite d'écrire le code sur l'IDE arduino. Cette solution permettra simplement de faire des tests rapides en utilisant, par exemple, l'exemple &amp;quot;Blink&amp;quot;.&lt;br /&gt;
* Créer un Makefile qui permet de téléverser notre code C vers la carte fille en passant par l'arduino uno :&lt;br /&gt;
[[Fichier:Makefil.png|sans_cadre|450x450px]]  &lt;br /&gt;
&lt;br /&gt;
==== Programme de tests sur la carte ====&lt;br /&gt;
Nous sommes ensuite passés au différents tests de la carte pour tester chaque fonctionnalités.   &lt;br /&gt;
&lt;br /&gt;
===== Premier test : la carte est-elle programmable ? =====&lt;br /&gt;
On utilise un programme très simple qui allume une des LEDs de la carte, le &amp;quot;Blink&amp;quot; disponible dans les exemples de l'IDE arduino. &lt;br /&gt;
&lt;br /&gt;
Cependant, en essayant de programmer la carte, aucune LEDs ne clignotait. Comme le code ne venait pas de nous et qe c'est un code simple, le problème ne pouvait venir que du côté du hardware. Nous avons donc tester notre carte au multimètre et il y avait effectivement un court-circuit au niveau du crystal qui empêchait forcement son fonctionnement. L'erreur vient de notre schématique puisque nous avons tourné à 90° le composant, ce qui créé effectivement un court-circuit. Pour remédier à notre problème, nous avons dé-souder le crystal et l'avons décalé sur la carte. &lt;br /&gt;
&lt;br /&gt;
Une fois le crystal re-soudé dans le bon sens, nous avons pu flasher la carte clavier avec le programme &amp;quot;Blink&amp;quot;&lt;br /&gt;
[[Fichier:Led_allumee_clavier.png|centré|sans_cadre|241x241px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; La LED clignote, ce qui nous permet de valider le faite que la carte est programmable via notre AVR ISP.&lt;br /&gt;
&lt;br /&gt;
===== Deuxième test : la lecture d'un bouton =====&lt;br /&gt;
Pour commencer les tests, nous cherchons à allumer une LED quand on appuie sur un bouton en particulier. Pour cela, nous avons mis à 0L la ligne sur PC3 et lu la colonne sur PD0 :   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test_clavier.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Ce test nous a permit de vérifier 2 choses : &lt;br /&gt;
&lt;br /&gt;
* que nous avions bien compris la méthode du clavier matriciel&lt;br /&gt;
* que nous arrivions bien à utiliser les Leds de notre carte. Ainsi nous avons nos &amp;quot;calculs&amp;quot; avec les décalages et les opérations logiques utiles pour mettre à 0L ou lire sur le port une entrée. &lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons gardé l'idée d'allumer une Led lorsqu'un bouton est enfoncé.          &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Premier_test_clavier.mp4|néant|cadre]]'''Problème rencontré :''' Au début nous n'arrivions par à lire le bouton bien que notre code soit simple. Nous avons donc vérifié au multimètre si nos boutons étaient bien soudés. Au multimètre, les 4 broches de chaque bouton étaient reliés (donc en court-circuit), ce n'est absolument pas normal. Effectivement, lorsque nous avions créé les footprints des boutons nous n'avons pas mis les broches au bon endroit. Dans les boutons il y a déjà des broches reliées et dans nos footprint nous n'avons pas mis les bons chiffres des broches correctement : ce qui nous a créé un court-circuit. Pour contrer ce problème, nous avons tourné à 90° chaque bouton. C n'était pas simple car il a fallut redresser les pins pour qu'ils rentrent bien dans les trous de la carte. Finalement les boutons fonctionnent correctement et les boutons restent assez droits. &lt;br /&gt;
&lt;br /&gt;
===== Troisième test : lecture de tous les boutons + shift =====&lt;br /&gt;
Pour commencer, on definit notre matrice de touches grâce à un tableau à 2 dimensions, ça nous permettra de récupérer directement les bonnes touches.  &lt;br /&gt;
&lt;br /&gt;
Nous voulions mettre notre clavier en AZERTY, malheureusement notre matrice ne nous le permet pas, alors les touches seront dans l'ordre alphabétique. Dans le code, les lettres ne sont pas dans l'ordre simplement parce que lors du routage nous n'avons pas laissé les boutons comme dans la schématique par simplicité de routage : &lt;br /&gt;
[[Fichier:Matrice touches.png|gauche|sans_cadre]]&lt;br /&gt;
&amp;lt;u&amp;gt;traduction des valeurs hexadécimales :&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 0x0E : le shift &lt;br /&gt;
* 0x7F : suppression &lt;br /&gt;
* 0x1C : flèche gauche &lt;br /&gt;
* 0x1D : flèche droite &lt;br /&gt;
&lt;br /&gt;
Ce sont simplement les codes en ASCII. &lt;br /&gt;
[[Fichier:Lecture touches.png|gauche|sans_cadre|400x400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Cette fonction nous permet d'effectuer la lecture d'une touche avec la méthode du clavier matriciel que nous avons expliqué plus haut. &lt;br /&gt;
&lt;br /&gt;
Ainsi, pour chaque ligne à 0L on lira sur chaque colonne et on vérifie si elle est égale à 0L. Si oui, on retourne directement la valeur de la touche en retournant notre matrice de touches avec les indices de la ligne et de la colonne en cours. &lt;br /&gt;
&lt;br /&gt;
Il y a une condition supplémentaire : si la touche appuyée est le shift (0x0E). Dans ce cas, on bascule on recommence la même méthode, mais cette fois on retournera la valeur appuyée mais grâce à la deuxième matrice cette fois puisqu'elle contient les chiffres de 0 à 9. &lt;br /&gt;
&lt;br /&gt;
Ici, l'utilisateur devra appuyer sur le bouton pour les chiffres en même temps que le bouton du shift. &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;
Finalement, notre clavier ce présent comme ceci : &lt;br /&gt;
[[Fichier:Tableau du clavier.png|gauche|cadre|Clavier sans appuyer sur SHIFT]]&lt;br /&gt;
[[Fichier:Schéma clavier avec appuie sur SHIFT.png|centré|cadre|clavier avec appuie sur SHIFT]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Quatrième test : le bus SPI =====&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie est d'envoyer les touches à la carte mère grâce au bus SPI. On a donc écrit un programme pour tester le bus SPI. L'idée était simplement d'envoyer une une variable en fonction de ce que l'on recevait. &lt;br /&gt;
&lt;br /&gt;
Pour utiliser le bus SPI, il est nécessaire d'utiliser une interruption (une ISR) qui permettra, pour rester dans le cahier des charges, d'envoyer des valeurs en fonctions de la valeur que l'on reçoit. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ISR(SPI_STC_vect) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   char data = SPDR;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   _delay_ms(40);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   if(data == 0x00) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = '!';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x01) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = bouton;&amp;lt;/code&amp;gt;                                      ici la valeur de bouton est initialisée à 1. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x05) SPDR = 'C';&amp;lt;/code&amp;gt;    il n'y a pas encore le traitement de la touche sur laquelle on a appuyé. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication de la communication en bus SPI :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, l'idée est de communiquer avec la carte mère. Pour cela, voici un schéma explicatif de notre mèthode de communication : &lt;br /&gt;
[[Fichier:Clavier mode spi.png|centré|sans_cadre]]&lt;br /&gt;
'''Remarque :''' la taille du tampon sera, le plus souvent, égale à 1 puisque le microcontrôleur est plus rapide qu'un humain. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication du code :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puisque c'est un test sur le spi, nous avons seulement envoyé des valeurs aléatoires afin de vérifier si le bus spi marche, mais en gardant la configuration que l'on doit avoir avec le schéma ci-dessus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir vérifier nos codes correctement, nous avons utiliser un arduino uno qui &amp;quot;remplace&amp;quot; la carte mère et qui envoit les valeurs 0x00, 0x01 ou 0x05 de la même manière, avec le bus SPI et les bonnes configurations d'initialisation du bus en tant que &amp;quot;maître&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons regardé à l'osciloscope l'allure de nos signaux MISO et MOSI :  &lt;br /&gt;
&lt;br /&gt;
* Le MOSI était cohérant avec les données envoyées&lt;br /&gt;
* Le MISO en revanche a des valeurs de tensions écrasé, ce qui fait que la valeur récuperé par le maitre est toujours zéro&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:MOSI.png|gauche|vignette|MOSI]]&lt;br /&gt;
[[Fichier:MISO.png|centré|vignette|MISO|290x290px]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; Après de nombreux essais sur différents shield, le bus SPI de certaines cartes ne fonctionnent pas, et d'autres fonctionnent, et ce même avec un code identiques. C'est assez troublant puisque même avec la dernière carte modifiée et soudée par M. Redon, le bus SPI ne fonctionne pas avec notre code. &lt;br /&gt;
&lt;br /&gt;
Les shields des binomes 4,5 et 6 ont ce problème. &lt;br /&gt;
&lt;br /&gt;
Les shields des binomes 8 et 9 fonctionnent  &lt;br /&gt;
&lt;br /&gt;
===== Cinquième test : affichage sur le port série =====&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier plus précisément et de continuer nos tests, le but étant de programmer la gestion de l'affichage des données reçues par le bus SPI sur le port série. &lt;br /&gt;
&lt;br /&gt;
Pour ce faire, nous utilisons la même fonction &amp;lt;code&amp;gt;serie_envoyer()&amp;lt;/code&amp;gt; que dans l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1){&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_activer();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(20);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     data_recue = spi_envoi(0x05);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     serie_envoyer(data_recue);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_desactiver();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(100);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but étant, ici, d'envoyer directement la demande de touche et de l'afficher directement sur le port série grâce au &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo montrant le fonctionnement de notre clavier : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;VIDEO&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Programme final ===&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2683</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2683"/>
		<updated>2024-01-15T10:37:44Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Troisième test : lecture de tous les boutons + shift */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]    &lt;br /&gt;
&lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Lors de la première séance de Pico, nous avons soudé quelques cartes telles que le Shield, la carte de leds et la carte 7 segments : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre|205x205px]][[Fichier:CartePin.png|sans_cadre|209x209px]][[Fichier:7_segments.png|sans_cadre|213x213px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre|203x203px]][[Fichier:Back.png|sans_cadre|200x200px]]&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino qui nous servirons pour la communication du bus SPI : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre|169x169px]]&lt;br /&gt;
=== Programmation Ordonnancement ===&lt;br /&gt;
&lt;br /&gt;
==== Clignotement de 2 Leds ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente :   [[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]'''Remarque :''' Les temps ne sont pas réels, l'objectif est donc d'endormir les tâches.   &lt;br /&gt;
&lt;br /&gt;
==== Lecture sur port série en mémoire partagée ====&lt;br /&gt;
Par la suite, nous voulons ordonnancer une tâche qui permet de stocker dans une mémoire partagée la valeur reçue sur le port série.  &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons utilisé : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ordo lecture serie.png|sans_cadre]]Ici, la mémoire partagée est une variable globale en unsigned char.  &lt;br /&gt;
&lt;br /&gt;
Pour lire sur le port série, on utilisera la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
==== Lecture/écriture sur port série ====&lt;br /&gt;
Afin de vérifier le code que nous avons écris dans la partie d'avant, nous écrirons sur le port série ce que nous avons lu. En d'autres termes, nous écrirons sur le port série ce que nous avons écris sur le clavier. &lt;br /&gt;
[[Fichier:Ordo_lecture_ecriture.png|gauche|sans_cadre]] &lt;br /&gt;
Cette fonction permettra d'écrire directement sur le port série grâce au caractère que l'on aura lu précédemment. &lt;br /&gt;
 &lt;br /&gt;
En revanche, cette fonction n'est pas utilisée pour de l'ordonnancement mais elle est utilisée par la fonction suivante qui elle est utilisée pour de l'ordonnancement (et donc fait parti des taches) &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ordo_lect_ecr.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' Après réflexion nous aurions pu éviter de mettre en paramètre le caractère lu puisque la variable globale est utile pour ça. &lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous devons implémenter un contrôleur de bus série SPI. &lt;br /&gt;
&lt;br /&gt;
Tout d'abord, voici comment fonctionne un bus SPI : &lt;br /&gt;
&lt;br /&gt;
Dans un bus SPI, il y a 1 maître et 1 ou plusieurs esclaves. Le transmission des données se font sur 2 fils : MISO et MOSI : &lt;br /&gt;
&lt;br /&gt;
- MOSI : Données du maître vers l'esclave,&lt;br /&gt;
&lt;br /&gt;
- MISO : Données de l'esclave vers le maître.&lt;br /&gt;
&lt;br /&gt;
Puisqu'il y a plusieurs esclaves, le SS (Ship Select) permet d'autoriser 1 esclave précis en l'activant à 0. &lt;br /&gt;
&lt;br /&gt;
Les échanges se font sur front et sont synchronisés par le maître. &lt;br /&gt;
&lt;br /&gt;
Lorsqu'un octet du maître passe dans le registre de l'esclave, celui de l'esclave passe dans le registre du maître simultanément comme représenté sur l'image ci-dessous.&lt;br /&gt;
[[Fichier:Chemin spi.png|centré|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet pour la carte clavier est de lire les boutons qui sont enfoncés afin de les envoyer à la carte mère via le bus SPI. &lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte :  [[Fichier:Schematique_clavier.png|centré|sans_cadre|511x511px]]Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches qui sont : la flèche de gauche, la flèche de droite, l'espace, un retour chariot, le suppression et enfin un shift qui nous permettra de switcher avec les 10 chiffres (de 0 à 9), &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation&lt;br /&gt;
* un ATmega328p&lt;br /&gt;
* un connecteur HE10 8 pins pour un bus SPI + une ligne d'interruption pour communiquer avec la carte mère&lt;br /&gt;
* un connecteur 6 pins(2x3) pour un bus SPI afin de programmer la carte.&lt;br /&gt;
&amp;lt;u&amp;gt;Fonctionnement matrice de touches :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but ici est de pouvoir lire la touche sur laquelle nous avons appuyé pour l'envoyer à la carte mère. Ici, l'idée est d'utiliser le fonctionnement de la matrice de touche qui est le suivant : &lt;br /&gt;
&lt;br /&gt;
Premièrement, il faut se décider duquel entre les lignes et les colonnes seront en entrée et l'autre en sortie. Ici se sont les lignes qui sont en sortie et les colonnes en entrée. &lt;br /&gt;
&lt;br /&gt;
L'idée est simple : alterner entre les lignes pour écrire un 0L sur 1 ligne et sur les autres un 1L. On parcourt ensuite toutes les colonnes (de la ligne à 0L). Si on lit un 0L sur une colonne, alors il suffit d'associer la ligne qui est à 0L avec celle de la colonne et on connait la touche qui a été appuyée. &lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up qui se trouvent au niveau des lignes serviront  à avoir un 1L par défaut. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le routage de la carte : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.&lt;br /&gt;
&lt;br /&gt;
Pour faire ce routage, nous avons dû créer le footprint des boutons, alors la prise des mesures sur le boutons était nécessaire. Aussi, nous avons décidé d'utiliser un ATmega328p avec des pins traversants pour une question de facilité au niveau de la soudure mais également pour éviter tout court-circuit et donc une perte de temps. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]][[Fichier:3d view.png|sans_cadre|235x235px]][[Fichier:3d view bottom.png|sans_cadre|235x235px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réel clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte_soude.jpg|sans_cadre|266x266px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Amélioration possible :&amp;lt;/u&amp;gt; permettre la programmation en USB. Avec cette carte telle qu'elle est faite, pour insérer un programme dans le microcontrôleur il faut passer par la carte Arduino et pour ça, il faut insérer le programme &amp;quot;ArduinoISP&amp;quot; qui se trouver dans les exemples de l'IDE Arduino, sans oublier tous les branchements à refaire. Ce n'est pas vraiment pratique et c'est une perte de temps qu'il est possible d'enlever en mettant un port USB directement sur la carte clavier.  &lt;br /&gt;
&lt;br /&gt;
=== Partie programmation ===&lt;br /&gt;
La programmation de notre carte se fera via un AVR ISP &lt;br /&gt;
&lt;br /&gt;
Pour cela, on utilise une carte arduino uno dans laquelle on téléverse le programme Arduino ISP, disponible dans les exemples de l'IDE arduino, pour permettre a l'arduino uno d'envoyer notre code vers la carte clavier via le connecteur HE10.   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma AVR ISP.png|centré|400x400px|sans_cadre]]&lt;br /&gt;
Pour flasher notre carte clavier, 2 solutions : &lt;br /&gt;
&lt;br /&gt;
* utiliser l'IDE arduino, en utilisant le paramètre &amp;quot;upload using programmer&amp;quot; qui permet de televerser du code dans une atmega en passant par le bus SPI. Mais cela néccesite d'écrire le code sur l'IDE arduino. Cette solution permettra simplement de faire des tests rapides en utilisant, par exemple, l'exemple &amp;quot;Blink&amp;quot;.&lt;br /&gt;
* Créer un Makefile qui permet de téléverser notre code C vers la carte fille en passant par l'arduino uno :&lt;br /&gt;
[[Fichier:Makefil.png|sans_cadre|450x450px]]  &lt;br /&gt;
&lt;br /&gt;
==== Programme de tests sur la carte ====&lt;br /&gt;
Nous sommes ensuite passés au différents tests de la carte pour tester chaque fonctionnalités.   &lt;br /&gt;
&lt;br /&gt;
===== Premier test : la carte est-elle programmable ? =====&lt;br /&gt;
On utilise un programme très simple qui allume une des LEDs de la carte, le &amp;quot;Blink&amp;quot; disponible dans les exemples de l'IDE arduino. &lt;br /&gt;
&lt;br /&gt;
Cependant, en essayant de programmer la carte, aucune LEDs ne clignotait. Comme le code ne venait pas de nous et qe c'est un code simple, le problème ne pouvait venir que du côté du hardware. Nous avons donc tester notre carte au multimètre et il y avait effectivement un court-circuit au niveau du crystal qui empêchait forcement son fonctionnement. L'erreur vient de notre schématique puisque nous avons tourné à 90° le composant, ce qui créé effectivement un court-circuit. Pour remédier à notre problème, nous avons dé-souder le crystal et l'avons décalé sur la carte. &lt;br /&gt;
&lt;br /&gt;
Une fois le crystal re-soudé dans le bon sens, nous avons pu flasher la carte clavier avec le programme &amp;quot;Blink&amp;quot;&lt;br /&gt;
[[Fichier:Led_allumee_clavier.png|centré|sans_cadre|241x241px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; La LED clignote, ce qui nous permet de valider le faite que la carte est programmable via notre AVR ISP.&lt;br /&gt;
&lt;br /&gt;
===== Deuxième test : la lecture d'un bouton =====&lt;br /&gt;
Pour commencer les tests, nous cherchons à allumer une LED quand on appuie sur un bouton en particulier. Pour cela, nous avons mis à 0L la ligne sur PC3 et lu la colonne sur PD0 :   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test_clavier.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Ce test nous a permit de vérifier 2 choses : &lt;br /&gt;
&lt;br /&gt;
* que nous avions bien compris la méthode du clavier matriciel&lt;br /&gt;
* que nous arrivions bien à utiliser les Leds de notre carte. Ainsi nous avons nos &amp;quot;calculs&amp;quot; avec les décalages et les opérations logiques utiles pour mettre à 0L ou lire sur le port une entrée. &lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons gardé l'idée d'allumer une Led lorsqu'un bouton est enfoncé.          &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Premier_test_clavier.mp4|néant|cadre]]'''Problème rencontré :''' Au début nous n'arrivions par à lire le bouton bien que notre code soit simple. Nous avons donc vérifié au multimètre si nos boutons étaient bien soudés. Au multimètre, les 4 broches de chaque bouton étaient reliés (donc en court-circuit), ce n'est absolument pas normal. Effectivement, lorsque nous avions créé les footprints des boutons nous n'avons pas mis les broches au bon endroit. Dans les boutons il y a déjà des broches reliées et dans nos footprint nous n'avons pas mis les bons chiffres des broches correctement : ce qui nous a créé un court-circuit. Pour contrer ce problème, nous avons tourné à 90° chaque bouton. C n'était pas simple car il a fallut redresser les pins pour qu'ils rentrent bien dans les trous de la carte. Finalement les boutons fonctionnent correctement et les boutons restent assez droits. &lt;br /&gt;
&lt;br /&gt;
===== Troisième test : lecture de tous les boutons + shift =====&lt;br /&gt;
Pour commencer, on definit notre matrice de touches grâce à un tableau à 2 dimensions, ça nous permettra de récupérer directement les bonnes touches.  &lt;br /&gt;
&lt;br /&gt;
Nous voulions mettre notre clavier en AZERTY, malheureusement notre matrice ne nous le permet pas, alors les touches seront dans l'ordre alphabétique. Dans le code, les lettres ne sont pas dans l'ordre simplement parce que lors du routage nous n'avons pas laissé les boutons comme dans la schématique par simplicité de routage : &lt;br /&gt;
[[Fichier:Matrice touches.png|gauche|sans_cadre]]&lt;br /&gt;
&amp;lt;u&amp;gt;traduction des valeurs hexadécimales :&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 0x0E : le shift &lt;br /&gt;
* 0x7F : suppression &lt;br /&gt;
* 0x1C : flèche gauche &lt;br /&gt;
* 0x1D : flèche droite &lt;br /&gt;
&lt;br /&gt;
Ce sont simplement les codes en ASCII. &lt;br /&gt;
[[Fichier:Lecture touches.png|gauche|sans_cadre|400x400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Cette fonction nous permet d'effectuer la lecture d'une touche avec la méthode du clavier matriciel que nous avons expliqué plus haut. &lt;br /&gt;
&lt;br /&gt;
Ainsi, pour chaque ligne à 0L on lira sur chaque colonne et on vérifie si elle est égale à 0L. Si oui, on retourne directement la valeur de la touche en retournant notre matrice de touches avec les indices de la ligne et de la colonne en cours. &lt;br /&gt;
&lt;br /&gt;
Il y a une condition supplémentaire : si la touche appuyée est le shift (0x0E). Dans ce cas, on bascule on recommence la même méthode, mais cette fois on retournera la valeur appuyée mais grâce à la deuxième matrice cette fois puisqu'elle contient les chiffres de 0 à 9. &lt;br /&gt;
&lt;br /&gt;
Ici, l'utilisateur devra appuyer sur le bouton pour les chiffres en même temps que le bouton du shift. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalement, notre clavier ce présent comme ceci : &lt;br /&gt;
[[Fichier:Tableau du clavier.png|gauche|cadre|Clavier sans appuyer sur SHIFT]]&lt;br /&gt;
[[Fichier:Schéma clavier avec appuie sur SHIFT.png|centré|cadre|clavier avec appuie sur SHIFT]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Quatrième test : le bus SPI =====&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie est d'envoyer les touches à la carte mère grâce au bus SPI. On a donc écrit un programme pour tester le bus SPI. L'idée était simplement d'envoyer une une variable en fonction de ce que l'on recevait. &lt;br /&gt;
&lt;br /&gt;
Pour utiliser le bus SPI, il est nécessaire d'utiliser une interruption (une ISR) qui permettra, pour rester dans le cahier des charges, d'envoyer des valeurs en fonctions de la valeur que l'on reçoit. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ISR(SPI_STC_vect) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   char data = SPDR;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   _delay_ms(40);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   if(data == 0x00) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = '!';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x01) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = bouton;&amp;lt;/code&amp;gt;                                      ici la valeur de bouton est initialisée à 1. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x05) SPDR = 'C';&amp;lt;/code&amp;gt;    il n'y a pas encore le traitement de la touche sur laquelle on a appuyé. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication de la communication en bus SPI :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, l'idée est de communiquer avec la carte mère. Pour cela, voici un schéma explicatif de notre mèthode de communication : &lt;br /&gt;
[[Fichier:Clavier mode spi.png|centré|sans_cadre]]&lt;br /&gt;
'''Remarque :''' la taille du tampon sera, le plus souvent, égale à 1 puisque le microcontrôleur est plus rapide qu'un humain. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication du code :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puisque c'est un test sur le spi, nous avons seulement envoyé des valeurs aléatoires afin de vérifier si le bus spi marche, mais en gardant la configuration que l'on doit avoir avec le schéma ci-dessus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir vérifier nos codes correctement, nous avons utiliser un arduino uno qui &amp;quot;remplace&amp;quot; la carte mère et qui envoit les valeurs 0x00, 0x01 ou 0x05 de la même manière, avec le bus SPI et les bonnes configurations d'initialisation du bus en tant que &amp;quot;maître&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons regardé à l'osciloscope l'allure de nos signaux MISO et MOSI :  &lt;br /&gt;
&lt;br /&gt;
* Le MOSI était cohérant avec les données envoyées&lt;br /&gt;
* Le MISO en revanche a des valeurs de tensions écrasé, ce qui fait que la valeur récuperé par le maitre est toujours zéro&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:MOSI.png|gauche|vignette|MOSI]]&lt;br /&gt;
[[Fichier:MISO.png|centré|vignette|MISO|290x290px]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; Après de nombreux essais sur différents shield, le bus SPI de certaines cartes ne fonctionnent pas, et d'autres fonctionnent, et ce même avec un code identiques. C'est assez troublant puisque même avec la dernière carte modifiée et soudée par M. Redon, le bus SPI ne fonctionne pas avec notre code. &lt;br /&gt;
&lt;br /&gt;
Les shields des binomes 4,5 et 6 ont ce problème. &lt;br /&gt;
&lt;br /&gt;
Les shields des binomes 8 et 9 fonctionnent  &lt;br /&gt;
&lt;br /&gt;
===== Cinquième test : affichage sur le port série =====&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier plus précisément et de continuer nos tests, le but étant de programmer la gestion de l'affichage des données reçues par le bus SPI sur le port série. &lt;br /&gt;
&lt;br /&gt;
Pour ce faire, nous utilisons la même fonction &amp;lt;code&amp;gt;serie_envoyer()&amp;lt;/code&amp;gt; que dans l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1){&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_activer();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(20);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     data_recue = spi_envoi(0x05);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     serie_envoyer(data_recue);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_desactiver();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(100);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but étant, ici, d'envoyer directement la demande de touche et de l'afficher directement sur le port série grâce au &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo montrant le fonctionnement de notre clavier : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;VIDEO&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Programme final ===&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2682</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2682"/>
		<updated>2024-01-15T10:37:22Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Deuxième test : la lecture d'un bouton */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]    &lt;br /&gt;
&lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Lors de la première séance de Pico, nous avons soudé quelques cartes telles que le Shield, la carte de leds et la carte 7 segments : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre|205x205px]][[Fichier:CartePin.png|sans_cadre|209x209px]][[Fichier:7_segments.png|sans_cadre|213x213px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre|203x203px]][[Fichier:Back.png|sans_cadre|200x200px]]&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino qui nous servirons pour la communication du bus SPI : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre|169x169px]]&lt;br /&gt;
=== Programmation Ordonnancement ===&lt;br /&gt;
&lt;br /&gt;
==== Clignotement de 2 Leds ====&lt;br /&gt;
&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente :   [[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]'''Remarque :''' Les temps ne sont pas réels, l'objectif est donc d'endormir les tâches.   &lt;br /&gt;
&lt;br /&gt;
==== Lecture sur port série en mémoire partagée ====&lt;br /&gt;
Par la suite, nous voulons ordonnancer une tâche qui permet de stocker dans une mémoire partagée la valeur reçue sur le port série.  &lt;br /&gt;
&lt;br /&gt;
Voici le code que nous avons utilisé : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ordo lecture serie.png|sans_cadre]]Ici, la mémoire partagée est une variable globale en unsigned char.  &lt;br /&gt;
&lt;br /&gt;
Pour lire sur le port série, on utilisera la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
==== Lecture/écriture sur port série ====&lt;br /&gt;
Afin de vérifier le code que nous avons écris dans la partie d'avant, nous écrirons sur le port série ce que nous avons lu. En d'autres termes, nous écrirons sur le port série ce que nous avons écris sur le clavier. &lt;br /&gt;
[[Fichier:Ordo_lecture_ecriture.png|gauche|sans_cadre]] &lt;br /&gt;
Cette fonction permettra d'écrire directement sur le port série grâce au caractère que l'on aura lu précédemment. &lt;br /&gt;
 &lt;br /&gt;
En revanche, cette fonction n'est pas utilisée pour de l'ordonnancement mais elle est utilisée par la fonction suivante qui elle est utilisée pour de l'ordonnancement (et donc fait parti des taches) &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ordo_lect_ecr.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
'''Remarque :''' Après réflexion nous aurions pu éviter de mettre en paramètre le caractère lu puisque la variable globale est utile pour ça. &lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous devons implémenter un contrôleur de bus série SPI. &lt;br /&gt;
&lt;br /&gt;
Tout d'abord, voici comment fonctionne un bus SPI : &lt;br /&gt;
&lt;br /&gt;
Dans un bus SPI, il y a 1 maître et 1 ou plusieurs esclaves. Le transmission des données se font sur 2 fils : MISO et MOSI : &lt;br /&gt;
&lt;br /&gt;
- MOSI : Données du maître vers l'esclave,&lt;br /&gt;
&lt;br /&gt;
- MISO : Données de l'esclave vers le maître.&lt;br /&gt;
&lt;br /&gt;
Puisqu'il y a plusieurs esclaves, le SS (Ship Select) permet d'autoriser 1 esclave précis en l'activant à 0. &lt;br /&gt;
&lt;br /&gt;
Les échanges se font sur front et sont synchronisés par le maître. &lt;br /&gt;
&lt;br /&gt;
Lorsqu'un octet du maître passe dans le registre de l'esclave, celui de l'esclave passe dans le registre du maître simultanément comme représenté sur l'image ci-dessous.&lt;br /&gt;
[[Fichier:Chemin spi.png|centré|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet pour la carte clavier est de lire les boutons qui sont enfoncés afin de les envoyer à la carte mère via le bus SPI. &lt;br /&gt;
&lt;br /&gt;
=== Partie électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte :  [[Fichier:Schematique_clavier.png|centré|sans_cadre|511x511px]]Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches qui sont : la flèche de gauche, la flèche de droite, l'espace, un retour chariot, le suppression et enfin un shift qui nous permettra de switcher avec les 10 chiffres (de 0 à 9), &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation&lt;br /&gt;
* un ATmega328p&lt;br /&gt;
* un connecteur HE10 8 pins pour un bus SPI + une ligne d'interruption pour communiquer avec la carte mère&lt;br /&gt;
* un connecteur 6 pins(2x3) pour un bus SPI afin de programmer la carte.&lt;br /&gt;
&amp;lt;u&amp;gt;Fonctionnement matrice de touches :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but ici est de pouvoir lire la touche sur laquelle nous avons appuyé pour l'envoyer à la carte mère. Ici, l'idée est d'utiliser le fonctionnement de la matrice de touche qui est le suivant : &lt;br /&gt;
&lt;br /&gt;
Premièrement, il faut se décider duquel entre les lignes et les colonnes seront en entrée et l'autre en sortie. Ici se sont les lignes qui sont en sortie et les colonnes en entrée. &lt;br /&gt;
&lt;br /&gt;
L'idée est simple : alterner entre les lignes pour écrire un 0L sur 1 ligne et sur les autres un 1L. On parcourt ensuite toutes les colonnes (de la ligne à 0L). Si on lit un 0L sur une colonne, alors il suffit d'associer la ligne qui est à 0L avec celle de la colonne et on connait la touche qui a été appuyée. &lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up qui se trouvent au niveau des lignes serviront  à avoir un 1L par défaut. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le routage de la carte : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.&lt;br /&gt;
&lt;br /&gt;
Pour faire ce routage, nous avons dû créer le footprint des boutons, alors la prise des mesures sur le boutons était nécessaire. Aussi, nous avons décidé d'utiliser un ATmega328p avec des pins traversants pour une question de facilité au niveau de la soudure mais également pour éviter tout court-circuit et donc une perte de temps. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]][[Fichier:3d view.png|sans_cadre|235x235px]][[Fichier:3d view bottom.png|sans_cadre|235x235px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réel clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte_soude.jpg|sans_cadre|266x266px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Amélioration possible :&amp;lt;/u&amp;gt; permettre la programmation en USB. Avec cette carte telle qu'elle est faite, pour insérer un programme dans le microcontrôleur il faut passer par la carte Arduino et pour ça, il faut insérer le programme &amp;quot;ArduinoISP&amp;quot; qui se trouver dans les exemples de l'IDE Arduino, sans oublier tous les branchements à refaire. Ce n'est pas vraiment pratique et c'est une perte de temps qu'il est possible d'enlever en mettant un port USB directement sur la carte clavier.  &lt;br /&gt;
&lt;br /&gt;
=== Partie programmation ===&lt;br /&gt;
La programmation de notre carte se fera via un AVR ISP &lt;br /&gt;
&lt;br /&gt;
Pour cela, on utilise une carte arduino uno dans laquelle on téléverse le programme Arduino ISP, disponible dans les exemples de l'IDE arduino, pour permettre a l'arduino uno d'envoyer notre code vers la carte clavier via le connecteur HE10.   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma AVR ISP.png|centré|400x400px|sans_cadre]]&lt;br /&gt;
Pour flasher notre carte clavier, 2 solutions : &lt;br /&gt;
&lt;br /&gt;
* utiliser l'IDE arduino, en utilisant le paramètre &amp;quot;upload using programmer&amp;quot; qui permet de televerser du code dans une atmega en passant par le bus SPI. Mais cela néccesite d'écrire le code sur l'IDE arduino. Cette solution permettra simplement de faire des tests rapides en utilisant, par exemple, l'exemple &amp;quot;Blink&amp;quot;.&lt;br /&gt;
* Créer un Makefile qui permet de téléverser notre code C vers la carte fille en passant par l'arduino uno :&lt;br /&gt;
[[Fichier:Makefil.png|sans_cadre|450x450px]]  &lt;br /&gt;
&lt;br /&gt;
==== Programme de tests sur la carte ====&lt;br /&gt;
Nous sommes ensuite passés au différents tests de la carte pour tester chaque fonctionnalités.   &lt;br /&gt;
&lt;br /&gt;
===== Premier test : la carte est-elle programmable ? =====&lt;br /&gt;
On utilise un programme très simple qui allume une des LEDs de la carte, le &amp;quot;Blink&amp;quot; disponible dans les exemples de l'IDE arduino. &lt;br /&gt;
&lt;br /&gt;
Cependant, en essayant de programmer la carte, aucune LEDs ne clignotait. Comme le code ne venait pas de nous et qe c'est un code simple, le problème ne pouvait venir que du côté du hardware. Nous avons donc tester notre carte au multimètre et il y avait effectivement un court-circuit au niveau du crystal qui empêchait forcement son fonctionnement. L'erreur vient de notre schématique puisque nous avons tourné à 90° le composant, ce qui créé effectivement un court-circuit. Pour remédier à notre problème, nous avons dé-souder le crystal et l'avons décalé sur la carte. &lt;br /&gt;
&lt;br /&gt;
Une fois le crystal re-soudé dans le bon sens, nous avons pu flasher la carte clavier avec le programme &amp;quot;Blink&amp;quot;&lt;br /&gt;
[[Fichier:Led_allumee_clavier.png|centré|sans_cadre|241x241px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; La LED clignote, ce qui nous permet de valider le faite que la carte est programmable via notre AVR ISP.&lt;br /&gt;
&lt;br /&gt;
===== Deuxième test : la lecture d'un bouton =====&lt;br /&gt;
Pour commencer les tests, nous cherchons à allumer une LED quand on appuie sur un bouton en particulier. Pour cela, nous avons mis à 0L la ligne sur PC3 et lu la colonne sur PD0 :   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test_clavier.png|sans_cadre|600x600px]]&lt;br /&gt;
&lt;br /&gt;
Ce test nous a permit de vérifier 2 choses : &lt;br /&gt;
&lt;br /&gt;
* que nous avions bien compris la méthode du clavier matriciel&lt;br /&gt;
* que nous arrivions bien à utiliser les Leds de notre carte. Ainsi nous avons nos &amp;quot;calculs&amp;quot; avec les décalages et les opérations logiques utiles pour mettre à 0L ou lire sur le port une entrée. &lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons gardé l'idée d'allumer une Led lorsqu'un bouton est enfoncé.          &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Premier_test_clavier.mp4|néant|cadre]]'''Problème rencontré :''' Au début nous n'arrivions par à lire le bouton bien que notre code soit simple. Nous avons donc vérifié au multimètre si nos boutons étaient bien soudés. Au multimètre, les 4 broches de chaque bouton étaient reliés (donc en court-circuit), ce n'est absolument pas normal. Effectivement, lorsque nous avions créé les footprints des boutons nous n'avons pas mis les broches au bon endroit. Dans les boutons il y a déjà des broches reliées et dans nos footprint nous n'avons pas mis les bons chiffres des broches correctement : ce qui nous a créé un court-circuit. Pour contrer ce problème, nous avons tourné à 90° chaque bouton. C n'était pas simple car il a fallut redresser les pins pour qu'ils rentrent bien dans les trous de la carte. Finalement les boutons fonctionnent correctement et les boutons restent assez droits. &lt;br /&gt;
&lt;br /&gt;
===== Troisième test : lecture de tous les boutons + shift =====&lt;br /&gt;
Pour commencer, on definit notre matrice de touches grâce à un tableau à 2 dimensions, ça nous permettra de récupérer directement les bonnes touches.  &lt;br /&gt;
&lt;br /&gt;
Nous voulions mettre notre clavier en AZERTY, malheureusement notre matrice ne nous le permet pas, alors les touches seront dans l'ordre alphabétique. Dans le code, les lettres ne sont pas dans l'ordre simplement parce que lors du routage nous n'avons pas laissé les boutons comme dans la schématique par simplicité de routage : &lt;br /&gt;
[[Fichier:Matrice touches.png|gauche|sans_cadre]]&lt;br /&gt;
&amp;lt;u&amp;gt;traduction des valeurs hexadécimales :&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 0x0E : le shift &lt;br /&gt;
* 0x7F : suppression &lt;br /&gt;
* 0x1C : flèche gauche &lt;br /&gt;
* 0x1D : flèche droite &lt;br /&gt;
&lt;br /&gt;
Ce sont simplement les codes en ASCII. &lt;br /&gt;
[[Fichier:Lecture touches.png|gauche|sans_cadre|400x400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Cette fonction nous permet d'effectuer la lecture d'une touche avec la méthode du clavier matriciel que nous avons expliqué plus haut. &lt;br /&gt;
&lt;br /&gt;
Ainsi, pour chaque ligne à 0L on lira sur chaque colonne et on vérifie si elle est égale à 0L. Si oui, on retourne directement la valeur de la touche en retournant notre matrice de touches avec les indices de la ligne et de la colonne en cours. &lt;br /&gt;
&lt;br /&gt;
Il y a une condition supplémentaire : si la touche appuyée est le shift (0x0E). Dans ce cas, on bascule on recommence la même méthode, mais cette fois on retournera la valeur appuyée mais grâce à la deuxième matrice cette fois puisqu'elle contient les chiffres de 0 à 9. &lt;br /&gt;
&lt;br /&gt;
Ici, l'utilisateur devra appuyer sur le bouton pour les chiffres en même temps que le bouton du shift. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalement, notre clavier ce présent comme ceci : &lt;br /&gt;
[[Fichier:Tableau du clavier.png|gauche|cadre|Clavier sans appuyer sur SHIFT]]&lt;br /&gt;
[[Fichier:Schéma clavier avec appuie sur SHIFT.png|centré|cadre|clavier avec appuie sur SHIFT]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Quatrième test : le bus SPI =====&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie est d'envoyer les touches à la carte mère grâce au bus SPI. On a donc écrit un programme pour tester le bus SPI. L'idée était simplement d'envoyer une une variable en fonction de ce que l'on recevait. &lt;br /&gt;
&lt;br /&gt;
Pour utiliser le bus SPI, il est nécessaire d'utiliser une interruption (une ISR) qui permettra, pour rester dans le cahier des charges, d'envoyer des valeurs en fonctions de la valeur que l'on reçoit. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ISR(SPI_STC_vect) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   char data = SPDR;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   _delay_ms(40);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   if(data == 0x00) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = '!';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x01) {&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;       SPDR = bouton;&amp;lt;/code&amp;gt;                                      ici la valeur de bouton est initialisée à 1. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;   } else if (data == 0x05) SPDR = 'C';&amp;lt;/code&amp;gt;    il n'y a pas encore le traitement de la touche sur laquelle on a appuyé. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication de la communication en bus SPI :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, l'idée est de communiquer avec la carte mère. Pour cela, voici un schéma explicatif de notre mèthode de communication : &lt;br /&gt;
[[Fichier:Clavier mode spi.png|centré|sans_cadre]]&lt;br /&gt;
'''Remarque :''' la taille du tampon sera, le plus souvent, égale à 1 puisque le microcontrôleur est plus rapide qu'un humain. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explication du code :&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puisque c'est un test sur le spi, nous avons seulement envoyé des valeurs aléatoires afin de vérifier si le bus spi marche, mais en gardant la configuration que l'on doit avoir avec le schéma ci-dessus. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir vérifier nos codes correctement, nous avons utiliser un arduino uno qui &amp;quot;remplace&amp;quot; la carte mère et qui envoit les valeurs 0x00, 0x01 ou 0x05 de la même manière, avec le bus SPI et les bonnes configurations d'initialisation du bus en tant que &amp;quot;maître&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons regardé à l'osciloscope l'allure de nos signaux MISO et MOSI :  &lt;br /&gt;
&lt;br /&gt;
* Le MOSI était cohérant avec les données envoyées&lt;br /&gt;
* Le MISO en revanche a des valeurs de tensions écrasé, ce qui fait que la valeur récuperé par le maitre est toujours zéro&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:MOSI.png|gauche|vignette|MOSI]]&lt;br /&gt;
[[Fichier:MISO.png|centré|vignette|MISO|290x290px]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;u&amp;gt;Conclusion :&amp;lt;/u&amp;gt; Après de nombreux essais sur différents shield, le bus SPI de certaines cartes ne fonctionnent pas, et d'autres fonctionnent, et ce même avec un code identiques. C'est assez troublant puisque même avec la dernière carte modifiée et soudée par M. Redon, le bus SPI ne fonctionne pas avec notre code. &lt;br /&gt;
&lt;br /&gt;
Les shields des binomes 4,5 et 6 ont ce problème. &lt;br /&gt;
&lt;br /&gt;
Les shields des binomes 8 et 9 fonctionnent  &lt;br /&gt;
&lt;br /&gt;
===== Cinquième test : affichage sur le port série =====&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier plus précisément et de continuer nos tests, le but étant de programmer la gestion de l'affichage des données reçues par le bus SPI sur le port série. &lt;br /&gt;
&lt;br /&gt;
Pour ce faire, nous utilisons la même fonction &amp;lt;code&amp;gt;serie_envoyer()&amp;lt;/code&amp;gt; que dans l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;while(1){&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_activer();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(20);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     data_recue = spi_envoi(0x05);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     serie_envoyer(data_recue);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     spi_desactiver();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;     _delay_ms(100);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but étant, ici, d'envoyer directement la demande de touche et de l'afficher directement sur le port série grâce au &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo montrant le fonctionnement de notre clavier : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;VIDEO&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Programme final ===&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Sch%C3%A9ma_clavier_avec_appuie_sur_SHIFT.png&amp;diff=2681</id>
		<title>Fichier:Schéma clavier avec appuie sur SHIFT.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Sch%C3%A9ma_clavier_avec_appuie_sur_SHIFT.png&amp;diff=2681"/>
		<updated>2024-01-15T10:11:18Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;quot;map&amp;quot; du clavier quand SHIFT est appuyé&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Tableau_du_clavier.png&amp;diff=2680</id>
		<title>Fichier:Tableau du clavier.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Tableau_du_clavier.png&amp;diff=2680"/>
		<updated>2024-01-15T10:06:17Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ce tableau est une &amp;quot;map&amp;quot; de notre clavier&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2648</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2648"/>
		<updated>2024-01-10T11:45:30Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Type de carte choisie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]    &lt;br /&gt;
&lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Nous avons commencé par souder le redresseur de niveau, le lecteur de carte puis les résistances et les Leds : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre|205x205px]]&lt;br /&gt;
&lt;br /&gt;
Également, nous avons partiellement soudé la carte de Leds suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:CartePin.png|sans_cadre|209x209px]]&lt;br /&gt;
&lt;br /&gt;
Puis, nous avons soudé entièrement la carte 7 segments comme suit : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:7_segments.png|sans_cadre|213x213px]]&lt;br /&gt;
&lt;br /&gt;
Et pour finir, la carte Shield est entièrement soudée : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre|203x203px]][[Fichier:Back.png|sans_cadre|200x200px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre|169x169px]]&lt;br /&gt;
=== Programmation ===&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente :   [[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]'''Remarque :''' Les temps ne sont pas réels, c'est pour ça que l'objectif est d'endormir les tâches. &lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous devons implémenter un contrôleur de bus série SPI. &lt;br /&gt;
&lt;br /&gt;
Tout d'abord, voici comment fonctionne un bus SPI : &lt;br /&gt;
&lt;br /&gt;
Dans un bus SPI, il y a 1 maître et 1 ou plusieurs esclaves. Le transmission des données se font sur 2 fils : MISO et MOSI : &lt;br /&gt;
&lt;br /&gt;
- MOSI : Données du maître vers l'esclave,&lt;br /&gt;
&lt;br /&gt;
- MISO : Données de l'esclave vers le maître.&lt;br /&gt;
&lt;br /&gt;
Puisqu'il y a plusieurs esclaves, le SS (Ship Select) permet d'autoriser 1 esclaves précis en l'activant à 0. &lt;br /&gt;
&lt;br /&gt;
Les échanges se font sur front et sont synchronisés par le maître. &lt;br /&gt;
&lt;br /&gt;
Lorsqu'un octet du maître passe dans le registre de l'escalve, celui de l'esclave passe dans le registre du maître simultanément comme représenté sur l'image ci-dessous.&lt;br /&gt;
[[Fichier:Chemin spi.png|centré|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Schéma Électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte &lt;br /&gt;
&lt;br /&gt;
Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches, &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation&lt;br /&gt;
* un ATmega328p&lt;br /&gt;
* un connecteur HE10 8 pins pour un bus SPI + une ligne d'interruption pour communiquer avec la carte mère&lt;br /&gt;
* un connecteur 6 pins(2x3) pour un bus SPI afin de programmer la carte.&lt;br /&gt;
La programmation de notre carte se fera via un AVR ISP &lt;br /&gt;
&lt;br /&gt;
Pour cela, on utilise une carte arduino uno dans laquelle on televerse le programme Arduino ISP, disponible dans les exemples de l'IDE arduino, pour permettre a l'arduino uno d'envoyer notre code vers la carte clavier via le bus SPI.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma AVR ISP.png|centré|vignette|400x400px]]&lt;br /&gt;
Pour flasher notre carte clavier 2 solutions : &lt;br /&gt;
&lt;br /&gt;
* utiliser l'IDE arduino, en utilisant le paramètre &amp;quot;upload using programmer&amp;quot; qui permet de televerser du code dans une atmega en passant par le bus SPI. Mais cela néccesite d'écrire le code sur l'IDE arduino. Cette solution permettra simplement de faire des testes rapides en utilisant par exemple l'exemple Blink.&lt;br /&gt;
* Créer un Makefil qui permet de televerser notre code C vers la carte fille en passant par l'arduino uno :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Makefil.png|centré|cadre]]&lt;br /&gt;
Les résistances de pull up serviront  à avoir un 1L par défaut puisque les lignes sont des sorties sur lesquelles nous écriront un 0L sur chaque sortie l'une après l'autre. Les colonnes sont des entrées, lorsqu'on lira un 0L sur une des colonnes, alors il suffira de voir laquelle des lignes est à 0L et ainsi connaitre le bouton qui est appuyé. &lt;br /&gt;
[[Fichier:Schematique_clavier.png|centré|sans_cadre|511x511px]] &lt;br /&gt;
&lt;br /&gt;
Voici le routage de la schématique : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]][[Fichier:3d view.png|sans_cadre|235x235px]][[Fichier:3d view bottom.png|sans_cadre|235x235px]] &lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réél clavier avec toutes les touches (ici 32) : &lt;br /&gt;
[[Fichier:Carte_soude.jpg|centré|sans_cadre|383x383px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous somme ensuite passée au différents testes de la carte : &lt;br /&gt;
&lt;br /&gt;
====== &amp;lt;u&amp;gt;Premier test : la carte est elle programmable ?&amp;lt;/u&amp;gt; ======&lt;br /&gt;
On utilise un programme très simple qui allume une des LEDs de la carte, le Blink disponible dans les exemple de l'IDE arduino.&lt;br /&gt;
&lt;br /&gt;
Mais en essayant de programmer la carte, aucune LEDs ne glignotait. Nous avons donc tester notre carte au multimètre. Il y avait un court-circuit au niveau du crystal qui empechait forcement son fonctionnement. l'erreur vient de notre footprint qui était décalé a 90°. Pour remedier a notre problème, nous avons désouder le crystal et l'avons tourné de 90°.&lt;br /&gt;
&lt;br /&gt;
Une fois le crystal resoudé dans la bon sens, nous avons pu flasher la carte clavier avec le programme Blink&lt;br /&gt;
[[Fichier:Led_allumee_clavier.png|centré|sans_cadre|241x241px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La LED est allumé, ce qui nous permet de valider le faite que la carte est programmable via notre AVR ISP&lt;br /&gt;
&lt;br /&gt;
====== &amp;lt;u&amp;gt;Deuxième test : la lecture des boutons&amp;lt;/u&amp;gt; ======&lt;br /&gt;
Pour commencer les testes, nous cherchons à allumer une led quand on appuie sur n'importe quel bouton. Pour cela on nous avons programmer notre matrice de LED :   &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Test clavier.png|centré|vignette]]                &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Premier_test_clavier.mp4|néant|cadre]]&lt;br /&gt;
                &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans notre code, nous avons fait en sorte d'avoir les boutons dans l'ordre alphabétique, c'est la raison pour laquelle les lettres ne sont pas dans l'odre dans notre code : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Boutons alphabétique.png|sans_cadre|300x300px]]&lt;br /&gt;
&lt;br /&gt;
Nous voulions mettre notre clavier en AZERTY, malheureusement notre matrice ne nous le permet pas. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par la suite, l'idée est d'envoyer les boutons appuyés à la carte mère via l'ISP. Pour cela, lorsque l'ISP enverra les octets 0x01 nous devrons envoyer le nombre de touches qui ont été appuyés depuis la dernière fois qu'il a envoyé cet octet. Après ça, la carte mère devra nous envoyer autre chose que 0x00 ou 0x01 et autant de fois que de touches touchées. Voici un exemple :&lt;br /&gt;
&lt;br /&gt;
Carte mère : 0x01&lt;br /&gt;
&lt;br /&gt;
Clavier : 2 (2 touches ont été touchées)&lt;br /&gt;
&lt;br /&gt;
Carte mère : 0x00&lt;br /&gt;
&lt;br /&gt;
Clavier : 'M'&lt;br /&gt;
&lt;br /&gt;
Carte mère : 0x00&lt;br /&gt;
&lt;br /&gt;
Clavier : 'S'&lt;br /&gt;
&lt;br /&gt;
Aussi, il se peut que la carte mère envoie l'octet 0x00, dans ce cas c'est une demande d'identification, alors la clavier devra répondre 0x1.&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Test_clavier.png&amp;diff=2647</id>
		<title>Fichier:Test clavier.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Test_clavier.png&amp;diff=2647"/>
		<updated>2024-01-10T11:42:50Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;code qui permet d'allumer une led si on appuie sur un bouton&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Makefil.png&amp;diff=2646</id>
		<title>Fichier:Makefil.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Makefil.png&amp;diff=2646"/>
		<updated>2024-01-10T11:05:42Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;makefil pour utiliser l'AVR ISP et flasher la carte clavier&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Sch%C3%A9ma_AVR_ISP.png&amp;diff=2645</id>
		<title>Fichier:Schéma AVR ISP.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Sch%C3%A9ma_AVR_ISP.png&amp;diff=2645"/>
		<updated>2024-01-10T10:32:52Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;schéma&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2296</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2296"/>
		<updated>2023-12-07T10:09:36Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Schéma Électronique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]    &lt;br /&gt;
&lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Nous avons commencé par souder le redresseur de niveau, le lecteur de carte puis les résistances et les Leds : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Également, nous avons partiellement soudé la carte de Leds suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:CartePin.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Puis, nous avons soudé entièrement la carte 7 segments comme suit : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:7_segments.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Et pour finir, la carte Shield est entièrement soudée : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre]][[Fichier:Back.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation ===&lt;br /&gt;
[[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente.  &lt;br /&gt;
&lt;br /&gt;
Les temps ne sont pas réels, c'est pour ça que l'objectif est d'endormir les tâches. &lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Schéma Électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte &lt;br /&gt;
&lt;br /&gt;
Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches, &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation, &lt;br /&gt;
* une ISP pour communiquer avec la carte mère&lt;br /&gt;
* la programmation de notre microcontrôleur se fera via un AVR ISP&lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up serviront  à avoir un 1L par défaut puisque les lignes sont des sorties sur lesquelles nous écriront un 0L sur chaque sortie l'une après l'autre. Les colonnes sont des entrées, lorsqu'on lira un 0L sur une des colonnes, alors il suffira de voir laquelle des lignes est à 0L et ainsi connaitre le bouton qui est appuyé. &lt;br /&gt;
[[Fichier:Premier test clavier.mp4|néant|cadre]]&lt;br /&gt;
[[Fichier:Schematique clavier.png|sans_cadre]] &lt;br /&gt;
&lt;br /&gt;
Voici le routage de la schématique : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur dans la schématique sur le crystal, il a été nécessaire de tourner à 90° pour le souder, sans ça on créait un court-circuit qui ne permet plus d'utiliser la carte. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:3d view.png|sans_cadre]][[Fichier:3d view bottom.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réél clavier avec toutes les touches (ici 32) : &lt;br /&gt;
[[Fichier:Carte soude.jpg|gauche|vignette]]            &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Afin de vérifier si la carte fonctionne, on a utilisé un Arduino Uno pour pouvoir téléverser un programme sur la carte du clavier. Pour se faire, on a inséré un programme Arduino &amp;quot;ArduinoISP&amp;quot; pour &amp;quot;transformer&amp;quot; la carte Arduino en ISP. Après ça, nous avons chargé le programme exemple &amp;quot;Blink&amp;quot; qui permet de faire clignoter des Leds. Nous avons alors fait clignoté la Led 8 : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Led allumee clavier.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après de multiples test au niveau programmation sur les boutons, rien ne fonctionnait. Alors nous avons vérifié si nos soudures étaient bonnes grâce au multimètre. Alors nous avons remarqué que chaque pin du bouton (les 4).  Nous nous sommes alors rendu compte que nous avons fait une erreur lors de la création de nos footprint. Nos boutons étaient mal soudés et il a fallut dessouder puis ressouder chaque boutons en les tournant de 90°, ça n'a pas été facile puisqu'il a fallut plier et bouger les pins pour que le bouton rentre bien dans les trous.  &lt;br /&gt;
&lt;br /&gt;
Finalement, nous avons fait un petit code qui permet d'allumer une led lorsque l'on appuie sur le bouton en bas à gauche de la carte afin de tester nos boutons. &lt;br /&gt;
&lt;br /&gt;
VIDEO BOUTON ET LED&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par la suite, l'idée est d'envoyer les boutons appuyés à la carte mère via l'ISP. Pour cela, lorsque l'ISP enverra les octets 0x01 nous devrons envoyer le nombre de touches qui ont été appuyés depuis la dernière fois qu'il a envoyé cet octet. Après ça, la carte mère devra nous envoyer autre chose que 0x00 ou 0x01 et autant de fois que de touches touchées. Voici un exemple :&lt;br /&gt;
&lt;br /&gt;
Carte mère : 0x01&lt;br /&gt;
&lt;br /&gt;
Clavier : 2 (2 touches ont été touchées)&lt;br /&gt;
&lt;br /&gt;
Carte mère : 0x00&lt;br /&gt;
&lt;br /&gt;
Clavier : 'M'&lt;br /&gt;
&lt;br /&gt;
Carte mère : 0x00&lt;br /&gt;
&lt;br /&gt;
Clavier : 'S'&lt;br /&gt;
&lt;br /&gt;
Aussi, il se peut que la carte mère envoie l'octet 0x00, dans ce cas c'est une demande d'identification, alors la clavier devra répondre 0x1.&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Carte_soude.jpg&amp;diff=2294</id>
		<title>Fichier:Carte soude.jpg</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Carte_soude.jpg&amp;diff=2294"/>
		<updated>2023-12-07T10:08:45Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;photo de la carte clavier avec tout les composants soudées&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2287</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2287"/>
		<updated>2023-12-07T10:00:14Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Programmation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]    &lt;br /&gt;
&lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Nous avons commencé par souder le redresseur de niveau, le lecteur de carte puis les résistances et les Leds : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Également, nous avons partiellement soudé la carte de Leds suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:CartePin.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Puis, nous avons soudé entièrement la carte 7 segments comme suit : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:7_segments.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Et pour finir, la carte Shield est entièrement soudée : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre]][[Fichier:Back.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation ===&lt;br /&gt;
[[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente.  &lt;br /&gt;
&lt;br /&gt;
Les temps ne sont pas réels, c'est pour ça que l'objectif est d'endormir les tâches. &lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Schéma Électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte &lt;br /&gt;
&lt;br /&gt;
Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches, &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation, &lt;br /&gt;
* une ISP pour communiquer avec la carte mère&lt;br /&gt;
* la programmation de notre microcontrôleur se fera via un AVR ISP&lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up serviront  à avoir un 1L par défaut puisque les lignes sont des sorties sur lesquelles nous écriront un 0L sur chaque sortie l'une après l'autre. Les colonnes sont des entrées, lorsqu'on lira un 0L sur une des colonnes, alors il suffira de voir laquelle des lignes est à 0L et ainsi connaitre le bouton qui est appuyé. &lt;br /&gt;
[[Fichier:Premier test clavier.mp4|néant|cadre]]&lt;br /&gt;
[[Fichier:Schematique clavier.png|sans_cadre]] &lt;br /&gt;
&lt;br /&gt;
Voici le routage de la schématique : Tous les condensateurs se trouvent à côté d'un VCC, le crystal est au plus proche du microcontrôleur et nous avons pris soin d'avoir des longueurs de pistes égales sur XTAL1 et XTAL2 du Crystal.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur dans la schématique sur le crystal, il a été nécessaire de tourner à 90° pour le souder, sans ça on créait un court-circuit qui ne permet plus d'utiliser la carte. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:3d view.png|sans_cadre]][[Fichier:3d view bottom.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réél clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PHOTO CARTE SOUDEE &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier si la carte fonctionne, on a utilisé un Arduino Uno pour pouvoir téléverser un programme sur la carte du clavier. Pour se faire, on a inséré un programme Arduino &amp;quot;ArduinoISP&amp;quot; pour &amp;quot;transformer&amp;quot; la carte Arduino en ISP. Après ça, nous avons chargé le programme exemple &amp;quot;Blink&amp;quot; qui permet de faire clignoter des Leds. Nous avons alors fait clignoté la Led 8 : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Led allumee clavier.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après de multiples test au niveau programmation sur les boutons, rien ne fonctionnait. Alors nous avons vérifié si nos soudures étaient bonnes grâce au multimètre. Alors nous avons remarqué que chaque pin du bouton (les 4).  Nous nous sommes alors rendu compte que nous avons fait une erreur lors de la création de nos footprint. Nos boutons étaient mal soudés et il a fallut dessouder puis ressouder chaque boutons en les tournant de 90°, ça n'a pas été facile puisqu'il a fallut plier et bouger les pins pour que le bouton rentre bien dans les trous.  &lt;br /&gt;
&lt;br /&gt;
Finalement, nous avons fait un petit code qui permet d'allumer une led lorsque l'on appuie sur le bouton en bas à gauche de la carte afin de tester nos boutons. &lt;br /&gt;
&lt;br /&gt;
VIDEO BOUTON ET LED&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Premier_test_clavier.mp4&amp;diff=2286</id>
		<title>Fichier:Premier test clavier.mp4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Premier_test_clavier.mp4&amp;diff=2286"/>
		<updated>2023-12-07T09:54:06Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;premier test des boutons du clavier&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2283</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2283"/>
		<updated>2023-12-07T09:36:54Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Programmation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]    &lt;br /&gt;
&lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Nous avons commencé par souder le redresseur de niveau, le lecteur de carte puis les résistances et les Leds : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Également, nous avons partiellement soudé la carte de Leds suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:CartePin.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Puis, nous avons soudé entièrement la carte 7 segments comme suit : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:7_segments.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Et pour finir, la carte Shield est entièrement soudée : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre]][[Fichier:Back.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation ===&lt;br /&gt;
[[Fichier:Ordonnanceur 1er test.mp4|centré|vignette]]&lt;br /&gt;
Nous avons écris un programme d'ordonnancement qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VIDEO LEDS QUI CLIGNOTENT &lt;br /&gt;
 &lt;br /&gt;
Les temps ne sont pas réels, c'est pour ça que l'objectif est d'endormir les tâches.  &lt;br /&gt;
&lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Schéma Électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte &lt;br /&gt;
&lt;br /&gt;
Nous avons opté pour :  &lt;br /&gt;
&lt;br /&gt;
* une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches, &lt;br /&gt;
* 2 Leds de test + 1 Led d'alimentation, &lt;br /&gt;
* une ISP. &lt;br /&gt;
&lt;br /&gt;
Les résistances de pull up serviront  avoir un 1L par défaut puisque les lignes sont des sorties sur lesquelles nous écriront un 0L sur chaque sortie l'une après l'autre. Les colonnes sont des entrées, lorsqu'on lira un 0L sur une des colonnes, alors il suffira de voir laquelle des lignes est à 0L et ainsi connaitre le bouton qui est appuyé. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schematique clavier.png|sans_cadre]] &lt;br /&gt;
&lt;br /&gt;
Voici le routage de la schématique : Tous les condensateurs se trouvent à côté d'un VCC, le crystal se situe également à côté de ses Pins et nous avons pris soin d'avoir des tailles égales sur XTAL1 et XTAL2 du Crystal.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur dans la schématique sur le crystal, il a été nécessaire de tourner à 90° pour le souder, sans ça on créait un court-circuit qui ne permet plus d'utiliser la carte. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:3d view.png|sans_cadre]][[Fichier:3d view bottom.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec tous les composants. On retrouve finalement l'allure d'un réél clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PHOTO CARTE SOUDEE &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier si la carte fonctionne, on a utilisé un Arduino Uno pour pouvoir téléverser un programme sur la carte du clavier. Pour se faire, on a inséré un programme Arduino &amp;quot;ArduinoISP&amp;quot; pour &amp;quot;transformer&amp;quot; la carte Arduino en ISP. Après ça, nous avons chargé le programme exemple &amp;quot;Blink&amp;quot; qui permet de faire clignoter des Leds. Nous avons alors fait clignoté la Led 8 : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Led allumee clavier.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après de multiples test au niveau programmation sur les boutons, rien ne fonctionnait. Alors nous avons vérifié si nos soudures étaient bonnes grâce au multimètre. Alors nous avons remarqué que chaque pin du bouton (les 4).  Nous nous sommes alors rendu compte que nous avons fait une erreur lors de la création de nos footprint. Nos boutons étaient mal soudés et il a fallut dessouder puis ressouder chaque boutons en les tournant de 90°, ça n'a pas été facile puisqu'il a fallut plier et bouger les pins pour que le bouton rentre bien dans les trous.  &lt;br /&gt;
&lt;br /&gt;
Finalement, nous avons fait un petit code qui permet d'allumer une led lorsque l'on appuie sur le bouton en bas à gauche de la carte afin de tester nos boutons. &lt;br /&gt;
&lt;br /&gt;
VIDEO BOUTON ET LED&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Ordonnanceur_1er_test.mp4&amp;diff=2282</id>
		<title>Fichier:Ordonnanceur 1er test.mp4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Ordonnanceur_1er_test.mp4&amp;diff=2282"/>
		<updated>2023-12-07T09:33:28Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;clignotement  LED ordonnanceur&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2173</id>
		<title>SE4Binome2023-5</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-5&amp;diff=2173"/>
		<updated>2023-11-28T17:07:45Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Schéma Électronique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Voici le lien de notre Git : https://archives.plil.fr/mnorman1/PICO.git&lt;br /&gt;
Puis le zip de notre routage (vérifié par M. Redon) : [[Fichier:Gerber B5.zip|gauche|cadre]]    &lt;br /&gt;
&lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Soudure ===&lt;br /&gt;
Nous avons commencé par souder le redresseur de niveau, le lecteur de carte puis les résistances et les Leds : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:SHIELD.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Également, nous avons partiellement soudé la carte de Leds suivante : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:CartePin.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Puis, nous avons soudé entièrement la carte 7 segments comme suit : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:7_segments.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Et pour finir, la carte Shield est entièrement soudée : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield.png|sans_cadre]][[Fichier:Back.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Câble pont Shield Arduino ===&lt;br /&gt;
En parallèle, nous avons réalisé les câbles qui se situent entre la carte Shield et la carte Arduino : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Câbles.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programmation ===&lt;br /&gt;
Nous avons écris un programme qui permet de faire clignoter 2 Leds (Led1 et Led2) avec une durée différente. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VIDEO LEDS QUI CLIGNOTENT &lt;br /&gt;
&lt;br /&gt;
== Carte FPGA/VHDL ==&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Type de carte choisie ==&lt;br /&gt;
Nous avons choisi de travailler sur la carte fille clavier &amp;quot;'''matrice de touches'''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Schéma Électronique ===&lt;br /&gt;
Voici le schéma électronique fini de notre carte &lt;br /&gt;
&lt;br /&gt;
Nous avons opté pour une matrice de touches de 4 par 8, ce qui nous fait 32 touches soient les 26 lettres de l'alphabet + 6 autre touches. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schematique clavier.png|sans_cadre]] &lt;br /&gt;
&lt;br /&gt;
Voici le routage de la schématique : Tous les condensateurs se toruvent à côté d'un VCC, le crystal se situe également à côté de ses Pins et nous avons pris soin d'avoir (à peu près) des tailles égales sur XTAL1 et XTAL2 du Crystal.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage fini.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur dans la schématique sur le crystal, il a été nécessaire de tourner à 90° pour le souder, sans ça on créait un court-circuit qui ne permet plus d'utiliser la carte. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:3d view.png|sans_cadre]][[Fichier:3d view bottom.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir reçu la carte imprimée, nous l'avons directement soudée avec (pratiquement) tous les composants. On retrouve finalement l'allure d'un réél clavier avec toutes les touches (ici 32) : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier si la carte fonctionne, on a utilisé un Arduino Uno pour pouvoir téléverser un programme sur la carte du clavier. Pour se faire, on a inséré un programme Arduino &amp;quot;ArduinoISP&amp;quot; pour &amp;quot;transformer&amp;quot; la carte Arduino en ISP. Après ça, nous avons chargé le programme exemple &amp;quot;Blink&amp;quot; qui permet de faire clignoter des Leds. Nous avons alors fait clignoté la Led 8 : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Led allumee clavier.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors du test de nos boutons, nous nous sommes rendu compte d'une erreur sur nos footprint de bouton. Nos boutons étaient mal câblé et il a fallut dessouder puis resouder chaque boutons en les tourant de 90°. &lt;br /&gt;
&lt;br /&gt;
Nous avons fait un petit code qui permet d'allumer une led lorsque l'on appuie sur le bouton en bas à gauche de la carte afin de tester nos boutons.&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Carte_sous_int%C3%A9gralement_.jpg&amp;diff=2065</id>
		<title>Fichier:Carte sous intégralement .jpg</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Carte_sous_int%C3%A9gralement_.jpg&amp;diff=2065"/>
		<updated>2023-11-15T07:46:01Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La carte a était testé est soudé entièrement&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Trinome2022-6&amp;diff=1182</id>
		<title>SE3Trinome2022-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Trinome2022-6&amp;diff=1182"/>
		<updated>2023-06-04T15:08:30Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Makefile */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Premier Système SE3 =&lt;br /&gt;
Voici le lien de notre Git :&lt;br /&gt;
&lt;br /&gt;
https://archives.plil.fr/mnorman1/PSE_trinome_6&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction et objectif ==&lt;br /&gt;
Nous partons sur la voiture 1/43.&lt;br /&gt;
&lt;br /&gt;
Notre voiture comportera les éléments ci-dessous : &lt;br /&gt;
&lt;br /&gt;
* 2  moteurs pour le contrôle (1 DC à l'arrière et un pas à pas à l'avant),&lt;br /&gt;
* 1 module Bluetooth,&lt;br /&gt;
* des leds (4 : deux phares avants ainsi que deux arrières),&lt;br /&gt;
* une batterie&lt;br /&gt;
L'idée est, avec le module Bluetooth, de pouvoir piloter la voiture à distance.  &lt;br /&gt;
&lt;br /&gt;
L'objectif à la fin des semaines de ce projet est d'être capable de gérer les différentes leds, les moteurs et d'avoir une batterie fonctionnelle.  &lt;br /&gt;
&lt;br /&gt;
== Schéma électronique ==&lt;br /&gt;
&lt;br /&gt;
Pour faire notre schéma électronique ainsi que notre routage, nous avons utilisé le logiciel Kikad. &lt;br /&gt;
&lt;br /&gt;
Vous trouverez différentes blocs : &lt;br /&gt;
&lt;br /&gt;
* L'ATMega16u2 qui est alimenté en +5V&lt;br /&gt;
* L'alimentation et la charge batterie, avec un ''MAX1811'' et un USB pour brancher directement la carte sur le PC pour l'alimentation et le téléversement du programme en C.&lt;br /&gt;
* Un bloc AVR qui est un connecteur femele pour se brancher directement à l'autre carte.&lt;br /&gt;
* Les 4 leds (qui sont les phares de notre voiture)&lt;br /&gt;
* Les moteurs : nous avons choisi d'utiliser un moteur pas à pas bipolaire et un moteur à courant continu (avec des PWM qui sont connectés aux Pins PWM du microcontroleur)&lt;br /&gt;
* Le Bluetooth avec un ''BM71BLE01FC2'' (nous l'avons créé nous même sur Kikad) et son antenne (créée également par nous-même)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schematique carte.png|vignette|Schéma entier|centré]]&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un circuit à part pour l'AVR car il ne sera utilisé que pour la programmation et pas pour le fonctionnement de la voiture.[[Fichier:Schématique ISP.png|vignette|Schéma ISP|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Routage ==&lt;br /&gt;
#Carte de la voiture&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La carte se connectera directement sur une prise USB pour téléverser le programme dans l'atMega16u2. Les deux faces sont des plans de masse, ce qui facile le routage. Pour faire notre routage, nous avons dû créer certains footprint tels que celui de l'antenne, du moteur continu et du ''BM71BLE01FC2'' (le module bluetooth).[[Fichier:Routage derniere version.png|vignette|Routage|centré]] [[Fichier:Vue 3D carte .png|vignette|Top|centré]] [[Fichier:Vue bottom.png|vignette|Bottom|centré]]&lt;br /&gt;
#Carte de l'ISP&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage ISP.png|Routage ISP|centré|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Carte imprimée ==&lt;br /&gt;
Voici la carte imprimée et partiellement soudée (uC, Leds, moteur pas à pas, USB) : &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Carte imprimée et soudée.png|centré|Carte imprimée|sans_cadre]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;u&amp;gt;Remarque :&amp;lt;/u&amp;gt;  un des pins du moteur n'a pas était relié au microcontrôleur lors du routage de la carte, nous avons donc connecté un fil entre le moteur et la pin 25 du microcontrôleur. &lt;br /&gt;
&lt;br /&gt;
Avant de souder tous les composants, l'idée est de vérifier si le PC détecte bien la carte. Pour pouvoir alimenter notre carte via l'usb sans avoir a souder le régulateur et ces condensateurs, nous avons simplement souder un fil entre le port USB et l'alimentation du microcontrôleur. &lt;br /&gt;
== Carte fonctionnelle ==&lt;br /&gt;
Premièrement, afin de vérifier si la carte est fonctionnelle nous n'avons soudé que l'atmega, le quartz et le port usb, pour s'assurer avec la commande &amp;quot;''lsusb&amp;quot;''  que la carte est bien vue par le PC. &lt;br /&gt;
[[Fichier:Fonction lsusb.png|600x600px|Fonction lsusb|centré|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On voit ici que l'atmega16u2 est bien détecté. &lt;br /&gt;
&lt;br /&gt;
Maintenant que l'on sait que notre carte fonctionne, on peut passer à la partie programmation des différents composants de la voiture.&lt;br /&gt;
== Programmation ==&lt;br /&gt;
&lt;br /&gt;
Les PINS dont nous allons avoir besoin sont les suivants :   &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|LED 1&lt;br /&gt;
|B6/20&lt;br /&gt;
|-&lt;br /&gt;
|LED 2&lt;br /&gt;
|B5/19&lt;br /&gt;
|-&lt;br /&gt;
|LED 3&lt;br /&gt;
|B4/18&lt;br /&gt;
|-&lt;br /&gt;
|LED 4&lt;br /&gt;
|B1/14&lt;br /&gt;
|-&lt;br /&gt;
|MOT1&lt;br /&gt;
|D4/10&lt;br /&gt;
|-&lt;br /&gt;
|MOT2&lt;br /&gt;
|D5/11&lt;br /&gt;
|-&lt;br /&gt;
|MOT3&lt;br /&gt;
|D6/12&lt;br /&gt;
|-&lt;br /&gt;
|MOT4&lt;br /&gt;
|C5/25&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Makefile ===&lt;br /&gt;
Tout d'abord, nous avons écris notre Makefile comme ceci :  &lt;br /&gt;
[[Fichier:Makefile .png|centré|Makefile|sans_cadre]]&lt;br /&gt;
 &lt;br /&gt;
=== Gestion des LEDS ===&lt;br /&gt;
Nous avons repris la base du programme que nous avons utilisé en TPI (manette) pour configurer les Leds ainsi que le programme ''io.c'' pour utiliser les fonctions présentes dans celui-ci (''output_toogle(), output_set(), ...''). &lt;br /&gt;
&lt;br /&gt;
Nous avons également repris les configurations des Pins des entrées/sorties des Leds ainsi que les moteurs , comme ci-dessous. &lt;br /&gt;
[[Fichier:Pins entrees sorties.png|centré|Config entree/sortie|sans_cadre]]&lt;br /&gt;
Par la suite, afin de faire clignoter les Leds, voici le programme (fonctionnel) que nous avons écrit : &lt;br /&gt;
[[Fichier:Programme leds.png|centré|Prog leds|sans_cadre]] &lt;br /&gt;
&lt;br /&gt;
=== Gestion du moteur pas à pas ===&lt;br /&gt;
Pour poursuivre, afin de faire fonctionner le moteur pas à pas, nous avons fait quelques recherches pour la programmation.  &lt;br /&gt;
Pour ce faire, nous nous sommes aidés du chronogramme de l'activité du moteur bipolaire suivant : &lt;br /&gt;
[[Fichier:Chronogramme des pas .png|centré|chrono des pas |sans_cadre]]&lt;br /&gt;
 &lt;br /&gt;
Le fonctionnement est simple, les 4 pines du moteur sont connecté directement à 4 pattes du microcontrôleur. et il suffit alors de mettre à 1 chacune des sorties selon le chronogramme ci-dessus.  &lt;br /&gt;
&lt;br /&gt;
Voici le code final fonctionnel du moteur pas à pas :  &lt;br /&gt;
[[Fichier:Code moteur pas à pas .png|centré|prog mots|sans_cadre]]&lt;br /&gt;
On trouve l'initialisation des sorties avec DDRX, et la mise à 1 des sorties avec PORTX. On peut alors configurer les pins du microcontrôleur pour commander le moteur selon le chronogramme.     &lt;br /&gt;
&lt;br /&gt;
Dans ce cas, le code permet au moteur de tourner dans un sens puis dans l'autre.     &lt;br /&gt;
&lt;br /&gt;
=== USB/LUFA ===&lt;br /&gt;
Par la suite, l'idée est de faire fonctionner le moteur directement avec les commandes de l'ordinateur. Pour se faire, on a récupéré les programmes faits en TPI Manette.  &lt;br /&gt;
&lt;br /&gt;
Evidemment, nous devons changer quelques informations, telles que le idVendor et le idProduct. &lt;br /&gt;
[[Fichier:Lsusb -vvv.png|centré|sans_cadre|lsusb -vvv]]&lt;br /&gt;
Enfin, nous avons ajouter une fonction principale dans lib.c afin de controler, grâce aux octets, l'allumage des leds et du moteur :   &lt;br /&gt;
[[Fichier:Fonction lib.c.png|centré|sans_cadre]]&lt;br /&gt;
Dans data[] : on a 2 octets : le premier qui sert à gérer les Leds et le moteur et la 2ème qu'on n'utilisera pas. &lt;br /&gt;
&lt;br /&gt;
Les 4 bits de poids faibles servent à allumer les Leds (chaque bit commande une led). &lt;br /&gt;
&lt;br /&gt;
Les 4 bits de poids forts servent à gérer le moteur(1 pour un un sens, 2 pour l'autre sens)   &lt;br /&gt;
&lt;br /&gt;
Dans le fichier Voiture.c, on a repris les lignes de test_leds.c (notre programme de tests) et les avons mis dans la fonction HandlePCReceive() de Voiture.c. &lt;br /&gt;
&lt;br /&gt;
== Vidéos système ==&lt;br /&gt;
Les vidéos étant trop lourdes, voici un lien Drive de nos vidéos : https://drive.google.com/drive/folders/1xb7-hz1aA-z115mloMOLafnvyD3ojA3p?usp=share_link &lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
A la fin du projet, notre carte est détectée par le PC, et nous sommes en mesure de programmer le microcontrôleur pour commander les leds et le moteur pas a pas. Il est également possible de commander les leds et le moteur via l'USB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de ce projet à été la réalisation du PCB sur Kicad, où nous avons appris plusieurs aspects de la conception d'un PCB : &lt;br /&gt;
&lt;br /&gt;
- créer des footprint, en allant chercher les dimensions dans les datasheets.&lt;br /&gt;
&lt;br /&gt;
- s'assurer que notre schéma est cohérent, et que chaque composant est correctement câblé, sans quoi la carte finale n'a aucune chance de fonctionner.&lt;br /&gt;
&lt;br /&gt;
- rooter de manière cohérente, en prenant en compte les perturbations que chaque composants engendrent sur les autres, notamment au niveau de l'antenne.&lt;br /&gt;
Ce projet nous a aussi permit d'apprendre a soudé des composants montés en surface (led, microcontrôleur, résistance). &lt;br /&gt;
&lt;br /&gt;
Nous avons aussi eu un problème lors de la soudure du moteur, où celui-ci a été endommagé, probablement à cause d'une exposition prolongée au fer à souder, qui a endommagé la bobine. &lt;br /&gt;
&lt;br /&gt;
La voiture est loin d'être finie, nous n'avons malheureusement pas pu traiter la partie Bluetooth et la partie batterie. Néanmoins, ce projet nous à permit d'avoir une première approche de ce en quoi consiste un projet de système embarqué, de sa conception, à sa réalisation, et nous somme maintenant bien plus à l'aise avec la créations des PCB et la programmation avec un microcontrôleur.&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Trinome2022-6&amp;diff=1169</id>
		<title>SE3Trinome2022-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Trinome2022-6&amp;diff=1169"/>
		<updated>2023-06-04T14:15:02Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Carte imprimée */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Premier Système SE3 =&lt;br /&gt;
Voici le lien de notre Git :&lt;br /&gt;
&lt;br /&gt;
https://archives.plil.fr/mnorman1/PSE_trinome_6&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction et objectif ==&lt;br /&gt;
Nous partons sur la voiture 1/43.&lt;br /&gt;
&lt;br /&gt;
Notre voiture comportera les éléments ci-dessous : &lt;br /&gt;
&lt;br /&gt;
* 2  moteurs pour le contrôle (1 DC à l'arrière et un pas à pas à l'avant),&lt;br /&gt;
* 1 module Bluetooth,&lt;br /&gt;
* des leds (4 : deux phares avants ainsi que deux arrières),&lt;br /&gt;
* une batterie&lt;br /&gt;
L'idée est, avec le module Bluetooth, de pouvoir piloter la voiture à distance.  &lt;br /&gt;
&lt;br /&gt;
L'objectif à la fin des semaines de ce projet est d'être capable de gérer les différentes leds, les moteurs et d'avoir une batterie fonctionnelle.  &lt;br /&gt;
&lt;br /&gt;
== Schéma électronique ==&lt;br /&gt;
&lt;br /&gt;
Pour faire notre schéma électronique ainsi que notre routage, nous avons utilisé le logiciel Kikad. &lt;br /&gt;
&lt;br /&gt;
Vous trouverez différentes blocs : &lt;br /&gt;
&lt;br /&gt;
* L'ATMega16u2 qui est alimenté en +5V&lt;br /&gt;
* L'alimentation et la charge batterie, avec un ''MAX1811'' et un USB pour brancher directement la carte sur le PC pour l'alimentation et le téléversement du programme en C.&lt;br /&gt;
* Un bloc AVR qui est un connecteur femele pour se brancher directement à l'autre carte.&lt;br /&gt;
* Les 4 leds (qui sont les phares de notre voiture)&lt;br /&gt;
* Les moteurs : nous avons choisi d'utiliser un moteur pas à pas bipolaire et un moteur à courant continu (avec des PWM qui sont connectés aux Pins PWM du microcontroleur)&lt;br /&gt;
* Le Bluetooth avec un ''BM71BLE01FC2'' (nous l'avons créé nous même sur Kikad) et son antenne (créée également par nous-même)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schematique carte.png|vignette|Schéma entier|centré]]&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un circuit à part pour l'AVR car il ne sera utilisé que pour la programmation et pas pour le fonctionnement de la voiture.[[Fichier:Schématique ISP.png|vignette|Schéma ISP|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Routage ==&lt;br /&gt;
#Carte de la voiture&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La carte se connectera directement sur une prise USB pour téléverser le programme dans l'atMega16u2. Les deux faces sont des plans de masse, ce qui facile le routage. Pour faire notre routage, nous avons dû créer certains footprint tels que celui de l'antenne, du moteur continu et du ''BM71BLE01FC2'' (le module bluetooth).[[Fichier:Routage derniere version.png|vignette|Routage|centré]] [[Fichier:Vue 3D carte .png|vignette|Top|centré]] [[Fichier:Vue bottom.png|vignette|Bottom|centré]]&lt;br /&gt;
#Carte de l'ISP&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage ISP.png|Routage ISP|centré|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Carte imprimée ==&lt;br /&gt;
Voici la carte imprimée et partiellement soudée (uC, Leds, moteur pas à pas, USB) : &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Carte imprimée et soudée.png|centré|Carte imprimée|sans_cadre]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;u&amp;gt;Remarque :&amp;lt;/u&amp;gt;  un des pins du moteur n'a pas était relié au microcontrôleur lors du routage de la carte, nous avons donc connecté un fil entre le moteur et la pin 25 du microcontrôleur. &lt;br /&gt;
&lt;br /&gt;
Avant de souder tous les composants, l'idée est de vérifier si le PC détecte bien la carte. Pour pouvoir alimenter notre carte via l'usb sans avoir a souder le régulateur et ces condensateurs, nous avons simplement souder un fil entre le port USB et l'alimentation du microcontrôleur. &lt;br /&gt;
== Carte fonctionnelle ==&lt;br /&gt;
Premièrement, afin de vérifier si la carte est fonctionnelle nous n'avons soudé que l'atmega, le quartz et le port usb, pour s'assurer avec la commande &amp;quot;''lsusb&amp;quot;''  que la carte est bien vue par le PC. &lt;br /&gt;
[[Fichier:Fonction lsusb.png|600x600px|Fonction lsusb|centré|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On voit ici que l'atmega16u2 est bien détecté. &lt;br /&gt;
&lt;br /&gt;
Maintenant que l'on sait que notre carte fonctionne, on peut passer à la partie programmation des différents composants de la voiture.&lt;br /&gt;
== Programmation ==&lt;br /&gt;
&lt;br /&gt;
Les PINS dont nous allons avoir besoin sont les suivants :   &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|LED 1&lt;br /&gt;
|B6/20&lt;br /&gt;
|-&lt;br /&gt;
|LED 2&lt;br /&gt;
|B5/19&lt;br /&gt;
|-&lt;br /&gt;
|LED 3&lt;br /&gt;
|B4/18&lt;br /&gt;
|-&lt;br /&gt;
|LED 4&lt;br /&gt;
|B1/14&lt;br /&gt;
|-&lt;br /&gt;
|MOT1&lt;br /&gt;
|D4/10&lt;br /&gt;
|-&lt;br /&gt;
|MOT2&lt;br /&gt;
|D5/11&lt;br /&gt;
|-&lt;br /&gt;
|MOT3&lt;br /&gt;
|D6/12&lt;br /&gt;
|-&lt;br /&gt;
|MOT4&lt;br /&gt;
|C5/25&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== '''Makefile''' ===&lt;br /&gt;
Tout d'abord, nous avons écris notre Makefile comme ceci :  &lt;br /&gt;
[[Fichier:Makefile .png|centré|Makefile|sans_cadre]]&lt;br /&gt;
 &lt;br /&gt;
=== Gestion des LEDS ===&lt;br /&gt;
Nous avons repris la base du programme que nous avons utilisé en TPI (manette) pour configurer les Leds ainsi que le programme ''io.c'' pour utiliser les fonctions présentes dans celui-ci (''output_toogle(), output_set(), ...''). &lt;br /&gt;
&lt;br /&gt;
Nous avons également repris les configurations des Pins des entrées/sorties des Leds ainsi que les moteurs , comme ci-dessous. &lt;br /&gt;
[[Fichier:Pins entrees sorties.png|centré|Config entree/sortie|sans_cadre]]&lt;br /&gt;
Par la suite, afin de faire clignoter les Leds, voici le programme (fonctionnel) que nous avons écrit : &lt;br /&gt;
[[Fichier:Programme leds.png|centré|Prog leds|sans_cadre]] &lt;br /&gt;
&lt;br /&gt;
=== Gestion du moteur pas à pas ===&lt;br /&gt;
Pour poursuivre, afin de faire fonctionner le moteur pas à pas, nous avons fait quelques recherches pour la programmation.  &lt;br /&gt;
Pour ce faire, nous nous sommes aidés du chronogramme de l'activité du moteur bipolaire suivant : &lt;br /&gt;
[[Fichier:Chronogramme des pas .png|centré|chrono des pas |sans_cadre]]&lt;br /&gt;
 &lt;br /&gt;
Le fonctionnement est simple, les 4 pines du moteur sont connecté directement à 4 pattes du microcontrôleur. et il suffit alors de mettre à 1 chacune des sorties selon le chronogramme ci-dessus.  &lt;br /&gt;
&lt;br /&gt;
Voici le code final fonctionnel du moteur pas à pas :  &lt;br /&gt;
[[Fichier:Code moteur pas à pas .png|centré|prog mots|sans_cadre]]&lt;br /&gt;
On trouve l'initialisation des sorties avec DDRX, et la mise à 1 des sorties avec PORTX. On peut alors configurer les pins du microcontrôleur pour commander le moteur selon le chronogramme.     &lt;br /&gt;
&lt;br /&gt;
Dans ce cas, le code permet au moteur de tourner dans un sens puis dans l'autre.     &lt;br /&gt;
&lt;br /&gt;
=== USB/LUFA ===&lt;br /&gt;
Par la suite, l'idée est de faire fonctionner le moteur directement avec les commandes de l'ordinateur. Pour se faire, on a récupéré les programmes faits en TPI Manette.  &lt;br /&gt;
&lt;br /&gt;
Evidemment, nous devons changer quelques informations, telles que le idVendor et le idProduct. &lt;br /&gt;
[[Fichier:Lsusb -vvv.png|centré|sans_cadre|lsusb -vvv]]&lt;br /&gt;
Enfin, nous avons ajouter une fonction principale dans lib.c afin de controler, grâce aux octets, l'allumage des leds et du moteur :   &lt;br /&gt;
[[Fichier:Fonction lib.c.png|centré|sans_cadre]]&lt;br /&gt;
Dans data[] : on a 2 octets : le premier qui sert à gérer les Leds et le moteur et la 2ème qu'on n'utilisera pas. &lt;br /&gt;
&lt;br /&gt;
Les 4 bits de poids faibles servent à allumer les Leds (chaque bit commande une led). &lt;br /&gt;
&lt;br /&gt;
Les 4 bits de poids forts servent à gérer le moteur(1 pour un un sens, 2 pour l'autre sens)   &lt;br /&gt;
&lt;br /&gt;
Dans le fichier Voiture.c, on a repris les lignes de test_leds.c (notre programme de tests) et les avons mis dans la fonction HandlePCReceive() de Voiture.c. &lt;br /&gt;
&lt;br /&gt;
== Vidéos système ==&lt;br /&gt;
Les vidéos étant trop lourdes, voici un lien Drive de nos vidéos : https://drive.google.com/drive/folders/1xb7-hz1aA-z115mloMOLafnvyD3ojA3p?usp=share_link &lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
A la fin du projet, notre carte est détecté par le PC, et nous sommes en mesure de programmer le microcontrôleur pour commander les leds et le moteur pas a pas. Il est également possible de commander les leds et le moteur via l'USB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de ce projet à était la réalisation du PCB sur Kicad, ou nous avons appris plusieurs aspects de la conception d'un PCB : &lt;br /&gt;
&lt;br /&gt;
- créer des footprint, en allant chercher les dimensions dans les datasheets.&lt;br /&gt;
&lt;br /&gt;
- s'assurer que notre schéma est cohérant, et que chaque composant est correctement câblé, sans quoi la carte final n'a aucune chance de fonctionner.&lt;br /&gt;
&lt;br /&gt;
- rooter de manière cohérant, en prenant en compte les perturbations que chaque composants engendre sur les autres, notamment au niveau de l'antenne.&lt;br /&gt;
Ce projet nous a aussi permit d'apprendre a souder des composants monté en surface (led, microcontrôleur, résistance).&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi eu un problème lors de la soudure du moteur, ou celui-ci à était endommagé, probablement à cause d'une exposition prolongé au fer à souder, qui a endommagé la bobine.&lt;br /&gt;
&lt;br /&gt;
La voiture est loin d'être fini, nous n'avons malheureusement pas pu traiter la partie Bluetooth et la partie batterie. Néanmoins, ce projet nous à permit d'avoir une première approche de ce en quo consiste un projet de système embarqué, de sa conception, à sa réalisation, et nous somme maintenant bien plus à l'aise avec la créations des PCB.&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Trinome2022-6&amp;diff=1144</id>
		<title>SE3Trinome2022-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Trinome2022-6&amp;diff=1144"/>
		<updated>2023-06-04T13:29:14Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Programmation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Premier Système SE3 =&lt;br /&gt;
Voici le lien de notre Git :&lt;br /&gt;
&lt;br /&gt;
https://archives.plil.fr/mnorman1/PSE_trinome_6&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction et objectif ==&lt;br /&gt;
Nous partons sur la voiture 1/43.&lt;br /&gt;
&lt;br /&gt;
Voici le modèle de carte de que nous choisissons :&lt;br /&gt;
&lt;br /&gt;
* 2  moteurs pour le contrôle (1 DC à l'arrière et un pas à pas à l'avant),&lt;br /&gt;
* 1 module Bluetooth,&lt;br /&gt;
* des leds (4 : deux phares avants ainsi que deux arrières),&lt;br /&gt;
* une batterie&lt;br /&gt;
L'idée est, avec le module Bluetooth, de pouvoir piloter la voiture grâce à une application mobile.  &lt;br /&gt;
&lt;br /&gt;
L'objectif à la fin des semaines de ce projet est d'être capable de gérer les différentes leds, les moteurs et d'avoir une batterie fonctionnelle.  &lt;br /&gt;
&lt;br /&gt;
== Schéma électronique ==&lt;br /&gt;
&lt;br /&gt;
Pour faire notre schéma électronique ainsi que notre routage, nous avons utilisé le logiciel Kikad. &lt;br /&gt;
&lt;br /&gt;
Vous trouverez différentes blocs : &lt;br /&gt;
&lt;br /&gt;
* L'ATMega16u2 qui est alimenté en +5V&lt;br /&gt;
* L'alimentation et la charge batterie, avec un ''MAX1811'' et un USB pour brancher directement la carte sur le PC pour l'alimentation et le téléversement du programme en C.&lt;br /&gt;
* Un bloc AVR qui est un connecteur femele pour se brancher directement à l'autre carte.&lt;br /&gt;
* Les 4 leds (qui sont les phares de notre voiture)&lt;br /&gt;
* Les moteurs : nous avons choisi d'utiliser un moteur pas à pas bipolaire et un moteur à courant continu (avec des PWM qui sont connectés aux Pins PWM du microcontroleur)&lt;br /&gt;
* Le Bluetooth avec un ''BM71BLE01FC2'' (nous l'avons créé nous même sur Kikad) et son antenne (créée également par nous-même)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schematique carte.png|vignette|Schéma entier|centré]]&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un circuit à part pour l'AVR car il ne sera utilisé que pour la programmation et pas pour le fonctionnement de la voiture.[[Fichier:Schématique ISP.png|vignette|Schéma ISP|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Routage ==&lt;br /&gt;
#Carte de la voiture&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La carte se connectera directement sur une prise USB pour téléverser le programme dans l'atMega16u2. Les deux faces sont des plans de masse, ce qui facile le routage. Pour faire notre routage, nous avons dû créer certains footprint tels que celui de l'antenne, du moteur continu et du ''BM71BLE01FC2'' (le module bluetooth).[[Fichier:Routage derniere version.png|vignette|Routage|centré]] [[Fichier:Vue 3D carte .png|vignette|Top|centré]] [[Fichier:Vue bottom.png|vignette|Bottom|centré]]&lt;br /&gt;
#Carte de l'ISP&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage ISP.png|Routage ISP|centré|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Carte imprimée ==&lt;br /&gt;
Voici la carte imprimée et partiellement soudée (uC, Leds, moteur pas à pas, USB) : &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Carte imprimée et soudée.png|centré|Carte imprimée|sans_cadre]]&lt;br /&gt;
 &lt;br /&gt;
Avant de souder tous les composants, l'idée était de vérifier si le PC détectait bien la carte, nous avons dû souder un fil sur le Pin 4 et le Pin 5 pour pouvoir alimenter l'ATMega16u2. &lt;br /&gt;
== Carte fonctionnelle ==&lt;br /&gt;
Premièrement, afin de vérifier si la carte est fonctionnelle nous n'avons soudé que l'atmega, le quartz et le port usb, pour s'assurer avec la commande &amp;quot;''lsusb&amp;quot;''  que la carte est bien vue par le PC. &lt;br /&gt;
[[Fichier:Fonction lsusb.png|600x600px|Fonction lsusb|centré|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On voit ici que l'atmega16u2 est bien détecté. &lt;br /&gt;
&lt;br /&gt;
Maintenant que l'on sait que notre carte fonctionne, on peut passer à la partie programmation des différents composants de la voiture.&lt;br /&gt;
== Programmation ==&lt;br /&gt;
&lt;br /&gt;
Les PINS dont nous allons avoir besoin sont les suivants :   &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|LED 1&lt;br /&gt;
|B6/20&lt;br /&gt;
|-&lt;br /&gt;
|LED 2&lt;br /&gt;
|B5/19&lt;br /&gt;
|-&lt;br /&gt;
|LED 3&lt;br /&gt;
|B4/18&lt;br /&gt;
|-&lt;br /&gt;
|LED 4&lt;br /&gt;
|B1/14&lt;br /&gt;
|-&lt;br /&gt;
|MOT1&lt;br /&gt;
|D4/10&lt;br /&gt;
|-&lt;br /&gt;
|MOT2&lt;br /&gt;
|D5/11&lt;br /&gt;
|-&lt;br /&gt;
|MOT3&lt;br /&gt;
|D6/12&lt;br /&gt;
|-&lt;br /&gt;
|MOT4&lt;br /&gt;
|C5/25&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== '''Makefile''' ===&lt;br /&gt;
Tout d'abord, nous avons écris notre Makefile comme ceci :  &lt;br /&gt;
[[Fichier:Makefile .png|centré|Makefile|sans_cadre]]&lt;br /&gt;
 &lt;br /&gt;
=== Gestion des LEDS ===&lt;br /&gt;
Nous avons repris la base du programme que nous avons utilisé en TPI (manette) pour configurer les Leds ainsi que le programme ''io.c'' pour utiliser les fonctions présentes dans celui-ci (''output_toogle(), output_set(), ...''). &lt;br /&gt;
&lt;br /&gt;
Nous avons également repris les configurations des Pins des entrées/sorties des Leds ainsi que les moteurs , comme ci-dessous. &lt;br /&gt;
[[Fichier:Pins entrees sorties.png|centré|Config entree/sortie|sans_cadre]]&lt;br /&gt;
Par la suite, afin de faire clignoter les Leds, voici le programme (fonctionnel) que nous avons écrit : &lt;br /&gt;
[[Fichier:Programme leds.png|centré|Prog leds|sans_cadre]] &lt;br /&gt;
&lt;br /&gt;
=== Gestion du moteur pas à pas ===&lt;br /&gt;
Pour poursuivre, afin de faire fonctionner le moteur pas à pas, nous avons fait quelques recherches pour la programmation.  &lt;br /&gt;
Pour ce faire, nous nous sommes aidés du chronogramme de l'activité du moteur bipolaire suivant : &lt;br /&gt;
[[Fichier:Chronogramme des pas .png|centré|chrono des pas |sans_cadre]]&lt;br /&gt;
 &lt;br /&gt;
Le fonctionnement est simple, les 4 pines du moteur sont connecté directement à 4 pattes du microcontrôleur. et il suffit alors de mettre à 1 chacune des sorties selon le chronogramme ci-dessus.  &lt;br /&gt;
&lt;br /&gt;
Voici le code final fonctionnel du moteur pas à pas :  &lt;br /&gt;
[[Fichier:Code moteur pas à pas .png|centré|prog mots|sans_cadre]]&lt;br /&gt;
On trouve l'initialisation des sorties avec DDRX, et la mise à 1 des sorties avec PORTX. On peut alors configurer les pins du microcontrôleur pour commander le moteur selon le chronogramme.     &lt;br /&gt;
&lt;br /&gt;
Dans ce cas, le code permet au moteur de tourner dans un sens puis dans l'autre.     &lt;br /&gt;
&lt;br /&gt;
=== USB/LUFA ===&lt;br /&gt;
Par la suite, l'idée est de faire fonctionner le moteur directement avec les commandes de l'ordinateur. Pour se faire, on a récupéré les programmes faits en TPI Manette.  &lt;br /&gt;
&lt;br /&gt;
Evidemment, nous devons changer quelques informations, telles que le idVendor et le idProduct. &lt;br /&gt;
[[Fichier:Lsusb -vvv.png|centré|sans_cadre|lsusb -vvv]]&lt;br /&gt;
Enfin, nous avons ajouter une fonction principale dans lib.c afin de controler, grâce aux octets, l'allumage des leds et du moteur :   &lt;br /&gt;
[[Fichier:Fonction lib.c.png|centré|sans_cadre]]&lt;br /&gt;
Dans data[] : on a 2 octets : le premier qui sert à gérer les Leds et le moteur et la 2ème qu'on n'utilisera pas. &lt;br /&gt;
&lt;br /&gt;
Les 4 bits de poids faibles servent à allumer les Leds (chaque bit commande une led). &lt;br /&gt;
&lt;br /&gt;
Les 4 bits de poids forts servent à gérer le moteur(1 pour un un sens, 2 pour l'autre sens)   &lt;br /&gt;
&lt;br /&gt;
Dans le fichier Voiture.c, on a repris les lignes de test_leds.c (notre programme de tests) et les avons mis dans la fonction HandlePCReceive() de Voiture.c. &lt;br /&gt;
&lt;br /&gt;
== Vidéos système ==&lt;br /&gt;
Les vidéos étant trop lourdes, voici un lien Drive de nos vidéos : https://drive.google.com/drive/folders/1xb7-hz1aA-z115mloMOLafnvyD3ojA3p?usp=share_link &lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
A la fin du projet, notre carte est détecté par le PC, et nous sommes en mesure de programmer le microcontrôleur pour commander les leds et le moteur pas a pas. Il est également possible de commander les leds et le moteur via l'USB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de ce projet à était la réalisation du PCB sur Kicad, ou nous avons appris plusieurs aspects de la conception d'un PCB : &lt;br /&gt;
&lt;br /&gt;
- créer des footprint, en allant chercher les dimensions dans les datasheets.&lt;br /&gt;
&lt;br /&gt;
- s'assurer que notre schéma est cohérant, et que chaque composant est correctement câblé, sans quoi la carte final n'a aucune chance de fonctionner.&lt;br /&gt;
&lt;br /&gt;
- rooter de manière cohérant, en prenant en compte les perturbations que chaque composants engendre sur les autres, notamment au niveau de l'antenne.&lt;br /&gt;
Ce projet nous a aussi permit d'apprendre a souder des composants monté en surface (led, microcontrôleur, résistance).&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Trinome2022-6&amp;diff=953</id>
		<title>SE3Trinome2022-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Trinome2022-6&amp;diff=953"/>
		<updated>2023-06-03T12:59:30Z</updated>

		<summary type="html">&lt;p&gt;Skaderis : /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Premier Système SE3 =&lt;br /&gt;
Voici le lien de notre Git :&lt;br /&gt;
&lt;br /&gt;
https://archives.plil.fr/mnorman1/PSE_trinome_6&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Introduction et objectif ==&lt;br /&gt;
Nous partons sur la voiture 1/43.&lt;br /&gt;
&lt;br /&gt;
Voici le modèle de carte de que nous choisissons :&lt;br /&gt;
&lt;br /&gt;
* 2  moteurs pour le contrôle (1 DC à l'arrière et un pas à pas à l'avant),&lt;br /&gt;
* 1 module Bluetooth,&lt;br /&gt;
* des leds (4 : deux phares avants ainsi que deux arrières),&lt;br /&gt;
* une batterie&lt;br /&gt;
L'idée est, avec le module Bluetooth, de pouvoir piloter la voiture grâce à une application mobile.  &lt;br /&gt;
&lt;br /&gt;
L'objectif à la fin des semaines de ce projet est d'être capable de gérer les différentes leds, les moteurs et d'avoir une batterie fonctionnelle.  &lt;br /&gt;
&lt;br /&gt;
== Schéma électronique ==&lt;br /&gt;
&lt;br /&gt;
Pour faire notre schéma électronique ainsi que notre routage, nous avons utilisé le logiciel Kikad. &lt;br /&gt;
&lt;br /&gt;
Vous trouverez différentes blocs : &lt;br /&gt;
&lt;br /&gt;
* L'ATMega16u2 qui est alimenté en +5V&lt;br /&gt;
* L'alimentation et la charge batterie, avec un ''MAX1811'' et un USB pour brancher directement la carte sur le PC pour l'alimentation et le téléversement du programme en C.&lt;br /&gt;
* Un bloc AVR qui est un connecteur femele pour se brancher directement à l'autre carte.&lt;br /&gt;
* Les 4 leds (qui sont les phares de notre voiture)&lt;br /&gt;
* Les moteurs : nous avons choisi d'utiliser un moteur pas à pas bipolaire et un moteur à courant continu (avec des PWM qui sont connectés aux Pins PWM du microcontroleur)&lt;br /&gt;
* Le Bluetooth avec un ''BM71BLE01FC2'' (nous l'avons créé nous même sur Kikad) et son antenne (créée également par nous-même)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schematique carte.png|vignette|Schéma entier|centré]]&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de créer un circuit à part pour l'AVR car il ne sera utilisé que pour la programmation et pas pour le fonctionnement de la voiture.[[Fichier:Schématique ISP.png|vignette|Schéma ISP|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Routage ==&lt;br /&gt;
#Carte de la voiture&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La carte se connectera directement sur une prise USB pour téléverser le programme dans l'atMega16u2. Les deux faces sont des plans de masse, ce qui facile le routage. Pour faire notre routage, nous avons dû créer certains footprint tels que celui de l'antenne, du moteur continu et du ''BM71BLE01FC2'' (le module bluetooth).[[Fichier:Routage derniere version.png|vignette|Routage|centré]] [[Fichier:Vue 3D carte .png|vignette|Top|centré]] [[Fichier:Vue bottom.png|vignette|Bottom|centré]]&lt;br /&gt;
#Carte de l'ISP&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Routage ISP.png|Routage ISP|centré|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Carte imprimée ==&lt;br /&gt;
Voici la carte imprimée et partiellement soudée (uC, Leds, moteur pas à pas, USB) : &lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Carte imprimée et soudée.png|centré|Carte imprimée|sans_cadre]]&lt;br /&gt;
 &lt;br /&gt;
Avant de souder tous les composants, l'idée était de vérifier si le PC détectait bien la carte, nous avons dû souder un fil sur le Pin 4 et le Pin 5 pour pouvoir alimenter l'ATMega16u2. &lt;br /&gt;
== Carte fonctionnelle ==&lt;br /&gt;
Premièrement, afin de vérifier si la carte est fonctionnelle nous n'avons soudé que l'atmega, le quartz et le port usb, pour s'assurer avec la commande &amp;quot;''lsusb&amp;quot;''  que la carte est bien vue par le PC. &lt;br /&gt;
[[Fichier:Fonction lsusb.png|600x600px|Fonction lsusb|centré|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On voit ici que l'atmega16u2 est bien détecté. &lt;br /&gt;
&lt;br /&gt;
Maintenant que l'on sait que notre carte fonctionne, on peut passer à la partie programmation des différents composants de la voiture.&lt;br /&gt;
== Programmation ==&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, nous avons écris notre Makefile comme ceci :  &lt;br /&gt;
[[Fichier:Makefile .png|centré|Makefile|sans_cadre]]&lt;br /&gt;
 &lt;br /&gt;
Nous avons repris la base du programme que nous avons utilisé en TPI (manette) pour configurer les Leds ainsi que le programme ''io.c'' pour utiliser les fonctions présentes dans celui-ci (''output_toogle(), output_set(), ...''). &lt;br /&gt;
&lt;br /&gt;
Nous avons également repris les configurations des Pins des entrées/sorties des Leds ainsi que les moteurs , comme ci-dessous. &lt;br /&gt;
[[Fichier:Pins entrees sorties.png|centré|Config entree/sortie|sans_cadre]]&lt;br /&gt;
Par la suite, afin de faire clignoter les Leds, voici le programme (fonctionnel) que nous avons écrit : &lt;br /&gt;
[[Fichier:Programme leds.png|centré|Prog leds|sans_cadre]] &lt;br /&gt;
&lt;br /&gt;
Pour poursuivre, afin de faire fonctionner le moteur pas à pas, nous avons fait quelques recherches pour la programmation.  &lt;br /&gt;
Pour ce faire, nous nous sommes aidés du chronogramme de l'activité du moteur bipolaire suivant : &lt;br /&gt;
[[Fichier:Chronogramme des pas .png|centré|chrono des pas |sans_cadre]]&lt;br /&gt;
 &lt;br /&gt;
Le fonctionnement est simple, les 4 pines du moteur sont connecté directement à 4 pattes du microcontrôleur. et il suffit alors de mettre à 1 chacune des sorties selon le chronogramme ci-dessus  &lt;br /&gt;
&lt;br /&gt;
Voici le code final fonctionnel du moteur pas à pas :  &lt;br /&gt;
[[Fichier:Code moteur pas à pas .png|centré|prog mots|sans_cadre]]&lt;br /&gt;
On trouve l'initialisation des sorties en fonction des pin des moteurs, et on a mis à 1 les sorties grâce à PORTx. Bien sûr, on n'a pas oublié de faire le décalage des pas (comme le chronogramme ci-dessus).     &lt;br /&gt;
&lt;br /&gt;
Notre code ci-dessus permet donc de tourner le moteur dans un sens puis dans l'autre.     &lt;br /&gt;
&lt;br /&gt;
Par la suite, l'idée est de faire fonctionner le moteur directement avec les commandes de l'ordinateur. Pour se faire, on a récupéré les programmes faits en TPI Manette.  &lt;br /&gt;
&lt;br /&gt;
Evidemment, nous devons changer quelques informations, telles que le idVendor et le idProduct. &lt;br /&gt;
[[Fichier:Lsusb -vvv.png|centré|sans_cadre|lsusb -vvv]]&lt;br /&gt;
Enfin, nous avons ajouter une fonction principale dans lib.c afin de controler, grâce aux octets, l'allumage des leds et du moteur :   &lt;br /&gt;
[[Fichier:Fonction lib.c.png|centré|sans_cadre]]&lt;br /&gt;
Dans data[] : on a 2 octets : le premier qui sert à gérer les Leds et le moteur et la 2ème qu'on n'utilisera pas. &lt;br /&gt;
&lt;br /&gt;
Les 4 bits de poids faibles servent à allumer les Leds (chaque bit commande une led). &lt;br /&gt;
&lt;br /&gt;
Les 4 bits de poids forts servent à gérer le moteur(1 pour un un sens, 2 pour l'autre sens)   &lt;br /&gt;
&lt;br /&gt;
Dans le fichier Voiture.c, on a repris les lignes de test_leds.c (notre programme de tests) et les avons mis dans la fonction HandlePCReceive() de Voiture.c. &lt;br /&gt;
&lt;br /&gt;
== Vidéos système ==&lt;br /&gt;
Les vidéos étant trop lourdes, voici un lien Drive de nos vidéos : https://drive.google.com/drive/folders/1xb7-hz1aA-z115mloMOLafnvyD3ojA3p?usp=share_link &lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
A la fin du projet, notre carte est détecté par le PC, et nous sommes en mesure de programmer le microcontrôleur pour commander les leds et le moteur pas a pas. Il est également possible de commander les leds et le moteur via l'USB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La principale difficulté de ce projet à était la réalisation du PCB sur Kicad, ou nous avons appris plusieurs aspects de la conception d'un PCB : &lt;br /&gt;
&lt;br /&gt;
- créer des footprint, en allant chercher les dimensions dans les datasheets.&lt;br /&gt;
&lt;br /&gt;
- s'assurer que notre schéma est cohérant, et que chaque composant est correctement câblé, sans quoi la carte final n'a aucune chance de fonctionner.&lt;br /&gt;
&lt;br /&gt;
- rooter de manière cohérant, en prenant en compte les perturbations que chaque composants engendre sur les autres, notamment au niveau de l'antenne.&lt;br /&gt;
Ce projet nous a aussi permit d'apprendre a souder des composants monté en surface (led, microcontrôleur, résistance).&lt;/div&gt;</summary>
		<author><name>Skaderis</name></author>
	</entry>
</feed>