<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>http://wikigeii.iut-troyes.univ-reims.fr//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=De0Nano</id>
		<title>troyesGEII - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="http://wikigeii.iut-troyes.univ-reims.fr//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=De0Nano"/>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Sp%C3%A9cial:Contributions/De0Nano"/>
		<updated>2026-05-04T17:09:55Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.30.1</generator>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9310</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9310"/>
				<updated>2017-01-20T10:22:42Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Nous avons dimensionné : les résistances : 10KΩ pour les boutons (incrémental/poussoirs), 220Ω pour le reste. Pour les condensateurs : 3 de 0.1uF, 1 de 10uF, et 100uF pour les condensateurs du bouton incrémental.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour le bouton incrémental, il serait préférable de prendre des plus petits condensateurs, 0.1uF par exemple.&lt;br /&gt;
&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 &lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'afficheur affiche bien les nombres 0-1-2-3, il fonctionne donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestAfficheur.JPG|300px|link=Fichier:TestAfficheur.JPG]]&lt;br /&gt;
==={{Vert|Test du bouton incrémental}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//1ere sortie du codeur&lt;br /&gt;
#define PinA 1  &lt;br /&gt;
//2e sortie du codeur  &lt;br /&gt;
#define PinB 0  &lt;br /&gt;
  &lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
int valeur = 0;&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {&lt;br /&gt;
  if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinB);&lt;br /&gt;
  else&lt;br /&gt;
    up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup (){&lt;br /&gt;
  pinMode(PinA, INPUT);&lt;br /&gt;
  pinMode(PinB, INPUT);&lt;br /&gt;
&lt;br /&gt;
  //Activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH);&lt;br /&gt;
  //  digitalWrite (PinB, HIGH);&lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0, routineInterruption, FALLING); //Interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   //Initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
void loop(){&lt;br /&gt;
  if (mouvement)  { //On a détecté une rotation du bouton&lt;br /&gt;
    if (up)&lt;br /&gt;
      valeur++;&lt;br /&gt;
    else&lt;br /&gt;
      valeur--;&lt;br /&gt;
    mouvement = false;&lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
J'ai incrémenté jusqu’à 15, tout fonctionne correctement, mais au niveau de la décrémentation, le bouton ne réagit quasiment pas.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoutonIncré.png|250px|link=Fichier:BoutonIncré.png]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme incrémentation/décrémentation}}==&lt;br /&gt;
Le but final de ce programme est de pouvoir incrémenter/décrémenter à l'aide du bouton incrémental et de l'afficheur 4x7.&lt;br /&gt;
Dans un premier temps nous avons réalisé un programme où l'afficheur s'incrémente automatiquement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0X80, 0X90};&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1, 0xF2, 0xF4, 0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x = 0;&lt;br /&gt;
byte x1 = 0;&lt;br /&gt;
byte x2 = 0;&lt;br /&gt;
byte x3 = 0;&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  pinMode(LATCH_DIO, OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO, OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
  void loop()&lt;br /&gt;
  {&lt;br /&gt;
    if (x &amp;gt; 9) {&lt;br /&gt;
      x = 0;&lt;br /&gt;
      x1++;&lt;br /&gt;
    }&lt;br /&gt;
    if (x1 &amp;gt; 9) {&lt;br /&gt;
      x1 = 0;&lt;br /&gt;
      x2++;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (x2 &amp;gt; 9) {&lt;br /&gt;
      x2 = 0;&lt;br /&gt;
      x3++;&lt;br /&gt;
    }&lt;br /&gt;
    if (x3 &amp;gt; 9) {&lt;br /&gt;
      x3 = 0;&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; 50; i++) {&lt;br /&gt;
      WriteNumberToSegment(0 , x3);&lt;br /&gt;
      delay(2);&lt;br /&gt;
      WriteNumberToSegment(1 , x2);&lt;br /&gt;
      delay(2);&lt;br /&gt;
      WriteNumberToSegment(2 , x1);&lt;br /&gt;
      delay(2);&lt;br /&gt;
      WriteNumberToSegment(3 , x);&lt;br /&gt;
      delay(2);&lt;br /&gt;
    }&lt;br /&gt;
    x++;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(LATCH_DIO, LOW);&lt;br /&gt;
    shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
    shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
    digitalWrite(LATCH_DIO, HIGH);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite ajouter le mouvement du bouton incrémental dans le programme, afin d'incrémenter/décrémenter en fonction des mouvements du bouton, avec le programme test du bouton incrémental.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    &lt;br /&gt;
#define PinB 0    &lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);  &lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   &lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinB);&lt;br /&gt;
    else&lt;br /&gt;
    up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){&lt;br /&gt;
  mouvement = false;&lt;br /&gt;
  if (x&amp;gt;9){&lt;br /&gt;
    x=0;&lt;br /&gt;
    x1++;&lt;br /&gt;
  }&lt;br /&gt;
  if(x1&amp;gt;9){&lt;br /&gt;
    x1=0;&lt;br /&gt;
    x2++;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if(x2&amp;gt;9){&lt;br /&gt;
    x2=0;&lt;br /&gt;
    x3++;&lt;br /&gt;
  }&lt;br /&gt;
  if(x3&amp;gt;9){&lt;br /&gt;
    x3=0;&lt;br /&gt;
  }&lt;br /&gt;
  for(int i=0;i&amp;lt;50;i++){&lt;br /&gt;
    WriteNumberToSegment(0 , x3);&lt;br /&gt;
    delay(2);&lt;br /&gt;
    WriteNumberToSegment(1 , x2);&lt;br /&gt;
    delay(2);&lt;br /&gt;
    WriteNumberToSegment(2 , x1);&lt;br /&gt;
    delay(2);&lt;br /&gt;
    WriteNumberToSegment(3 , x);&lt;br /&gt;
    delay(2);&lt;br /&gt;
  }&lt;br /&gt;
  if (mouvement){&lt;br /&gt;
    if(up)&lt;br /&gt;
      x++;&lt;br /&gt;
    else&lt;br /&gt;
      x--;    &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Avec ce programme, l'incrémentation marche très bien. La décrémentation marche elle aussi, mais une fois revenu à 0, on incrémente l'afficheur d’à coté : on passe de 32,31,30,40,50,60 par exemple, à cause des lignes gérant l'incrémentation/décrémentation, le programme n'est donc pas complet.&lt;br /&gt;
&lt;br /&gt;
On a ensuite voulu essayer une autre méthode pour gérer l'incrémentation/décrémentation, le DCB : Le décimal codé binaire ou BCD (binary coded decimal en anglais).&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    &lt;br /&gt;
#define PinB 0    &lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   &lt;br /&gt;
  Serial.begin (9600);  &lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  if (mouvement)  {		  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Avec cette méthode, ici on doit faire le choix entre incrémenter ou décrémenter, les deux ne fonctionnent pas en même temps... En revanche les 2 fonctionnent correctement, à l'inverse du programme précédant où la décrémentation ne marchait pas totalement. Mais cette méthode est assez compliquée, ici on code sur 16 bits (9999), et pour incrémentater, il faut ajouter 1 aux 4 bits de droite, et si on obtient 1010 (10d) par exemple, on les remplace par 0000 et on ajoute 1 aux quatre bits suivants, les dizaines, tout en vérifiant que l'on ne passe pas à la centaine suivante, ce qui rend les calculs assez compliqués.&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9309</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9309"/>
				<updated>2017-01-19T22:58:14Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Nous avons dimensionné : les résistances : 10KΩ pour les boutons (incrémental/poussoirs), 220Ω pour le reste. Pour les condensateurs : 3 de 0.1uF, 1 de 10uF, et 100uF pour les condensateurs du bouton incrémental.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour le bouton incrémental, il serait préférable de prendre des plus petits condensateurs, 0.1uF par exemple.&lt;br /&gt;
&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 &lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'afficheur affiche bien les nombres 0-1-2-3, il fonctionne donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestAfficheur.JPG|300px|link=Fichier:TestAfficheur.JPG]]&lt;br /&gt;
==={{Vert|Test du bouton incrémental}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//1ere sortie du codeur&lt;br /&gt;
#define PinA 1  &lt;br /&gt;
//2e sortie du codeur  &lt;br /&gt;
#define PinB 0  &lt;br /&gt;
  &lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
int valeur = 0;&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {&lt;br /&gt;
  if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinB);&lt;br /&gt;
  else&lt;br /&gt;
    up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup (){&lt;br /&gt;
  pinMode(PinA, INPUT);&lt;br /&gt;
  pinMode(PinB, INPUT);&lt;br /&gt;
&lt;br /&gt;
  //Activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH);&lt;br /&gt;
  //  digitalWrite (PinB, HIGH);&lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0, routineInterruption, FALLING); //Interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   //Initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
void loop(){&lt;br /&gt;
  if (mouvement)  { //On a détecté une rotation du bouton&lt;br /&gt;
    if (up)&lt;br /&gt;
      valeur++;&lt;br /&gt;
    else&lt;br /&gt;
      valeur--;&lt;br /&gt;
    mouvement = false;&lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
J'ai incrémenté jusqu’à 15, tout fonctionne correctement, mais au niveau de la décrémentation, le bouton ne réagit quasiment pas.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoutonIncré.png|250px|link=Fichier:BoutonIncré.png]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme incrémentation/décrémentation}}==&lt;br /&gt;
Le but final de ce programme est de pouvoir incrémenter/décrémenter à l'aide du bouton incrémental et de l'afficheur 4x7.&lt;br /&gt;
Dans un premier temps nous avons réalisé un programme où l'afficheur s'incrémente automatiquement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0X80, 0X90};&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1, 0xF2, 0xF4, 0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x = 0;&lt;br /&gt;
byte x1 = 0;&lt;br /&gt;
byte x2 = 0;&lt;br /&gt;
byte x3 = 0;&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  pinMode(LATCH_DIO, OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO, OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
  void loop()&lt;br /&gt;
  {&lt;br /&gt;
    if (x &amp;gt; 9) {&lt;br /&gt;
      x = 0;&lt;br /&gt;
      x1++;&lt;br /&gt;
    }&lt;br /&gt;
    if (x1 &amp;gt; 9) {&lt;br /&gt;
      x1 = 0;&lt;br /&gt;
      x2++;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (x2 &amp;gt; 9) {&lt;br /&gt;
      x2 = 0;&lt;br /&gt;
      x3++;&lt;br /&gt;
    }&lt;br /&gt;
    if (x3 &amp;gt; 9) {&lt;br /&gt;
      x3 = 0;&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; 50; i++) {&lt;br /&gt;
      WriteNumberToSegment(0 , x3);&lt;br /&gt;
      delay(2);&lt;br /&gt;
      WriteNumberToSegment(1 , x2);&lt;br /&gt;
      delay(2);&lt;br /&gt;
      WriteNumberToSegment(2 , x1);&lt;br /&gt;
      delay(2);&lt;br /&gt;
      WriteNumberToSegment(3 , x);&lt;br /&gt;
      delay(2);&lt;br /&gt;
    }&lt;br /&gt;
    x++;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(LATCH_DIO, LOW);&lt;br /&gt;
    shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
    shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
    digitalWrite(LATCH_DIO, HIGH);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite ajouter le mouvement du bouton incrémental dans le programme, afin d'incrémenter/décrémenter en fonction des mouvements du bouton, avec le programme test du bouton incrémental.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    &lt;br /&gt;
#define PinB 0    &lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);  &lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   &lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinB);&lt;br /&gt;
    else&lt;br /&gt;
    up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){&lt;br /&gt;
  mouvement = false;&lt;br /&gt;
  if (x&amp;gt;9){&lt;br /&gt;
    x=0;&lt;br /&gt;
    x1++;&lt;br /&gt;
  }&lt;br /&gt;
  if(x1&amp;gt;9){&lt;br /&gt;
    x1=0;&lt;br /&gt;
    x2++;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if(x2&amp;gt;9){&lt;br /&gt;
    x2=0;&lt;br /&gt;
    x3++;&lt;br /&gt;
  }&lt;br /&gt;
  if(x3&amp;gt;9){&lt;br /&gt;
    x3=0;&lt;br /&gt;
  }&lt;br /&gt;
  for(int i=0;i&amp;lt;50;i++){&lt;br /&gt;
    WriteNumberToSegment(0 , x3);&lt;br /&gt;
    delay(2);&lt;br /&gt;
    WriteNumberToSegment(1 , x2);&lt;br /&gt;
    delay(2);&lt;br /&gt;
    WriteNumberToSegment(2 , x1);&lt;br /&gt;
    delay(2);&lt;br /&gt;
    WriteNumberToSegment(3 , x);&lt;br /&gt;
    delay(2);&lt;br /&gt;
  }&lt;br /&gt;
  if (mouvement){&lt;br /&gt;
    if(up)&lt;br /&gt;
      x++;&lt;br /&gt;
    else&lt;br /&gt;
      x--;    &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Avec ce programme, l'incrémentation marche très bien. La décrémentation marche elle aussi, mais une fois revenu à 0, on incrémente l'afficheur d’à coté : on passe de 32,31,30,40,50,60 par exemple, à cause des lignes gérant l'incrémentation/décrémentation, le programme n'est donc pas complet.&lt;br /&gt;
&lt;br /&gt;
On a ensuite voulu essayer une autre méthode pour gérer l'incrémentation/décrémentation, le DCB : Le décimal codé binaire ou BCD (binary coded decimal en anglais).&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    &lt;br /&gt;
#define PinB 0    &lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   &lt;br /&gt;
  Serial.begin (9600);  &lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  if (mouvement)  {		  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Avec cette méthode, ici on doit faire le choix entre incrémenter ou décrémenter, les deux ne fonctionnent pas en même temps... En revanche les 2 fonctionnent correctement, à l'inverse du programme précédant où la décrémentation ne marchait pas totalement.&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9308</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9308"/>
				<updated>2017-01-19T22:45:47Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Nous avons dimensionné : les résistances : 10KΩ pour les boutons (incrémental/poussoirs), 220Ω pour le reste. Pour les condensateurs : 3 de 0.1uF, 1 de 10uF, et 100uF pour les condensateurs du bouton incrémental.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour le bouton incrémental, il serait préférable de prendre des plus petits condensateurs, 0.1uF par exemple.&lt;br /&gt;
&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 &lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'afficheur affiche bien les nombres 0-1-2-3, il fonctionne donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestAfficheur.JPG|300px|link=Fichier:TestAfficheur.JPG]]&lt;br /&gt;
==={{Vert|Test du bouton incrémental}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//1ere sortie du codeur&lt;br /&gt;
#define PinA 1  &lt;br /&gt;
//2e sortie du codeur  &lt;br /&gt;
#define PinB 0  &lt;br /&gt;
  &lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
int valeur = 0;&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {&lt;br /&gt;
  if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinB);&lt;br /&gt;
  else&lt;br /&gt;
    up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup (){&lt;br /&gt;
  pinMode(PinA, INPUT);&lt;br /&gt;
  pinMode(PinB, INPUT);&lt;br /&gt;
&lt;br /&gt;
  //Activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH);&lt;br /&gt;
  //  digitalWrite (PinB, HIGH);&lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0, routineInterruption, FALLING); //Interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   //Initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
void loop(){&lt;br /&gt;
  if (mouvement)  { //On a détecté une rotation du bouton&lt;br /&gt;
    if (up)&lt;br /&gt;
      valeur++;&lt;br /&gt;
    else&lt;br /&gt;
      valeur--;&lt;br /&gt;
    mouvement = false;&lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
J'ai incrémenté jusqu’à 15, tout fonctionne correctement, mais au niveau de la décrémentation, le bouton ne réagit quasiment pas.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoutonIncré.png|250px|link=Fichier:BoutonIncré.png]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme incrémentation/décrémentation}}==&lt;br /&gt;
Le but final de ce programme est de pouvoir incrémenter/décrémenter à l'aide du bouton incrémental et de l'afficheur 4x7.&lt;br /&gt;
Dans un premier temps nous avons réalisé un programme où l'afficheur s'incrémente automatiquement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0X80, 0X90};&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1, 0xF2, 0xF4, 0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x = 0;&lt;br /&gt;
byte x1 = 0;&lt;br /&gt;
byte x2 = 0;&lt;br /&gt;
byte x3 = 0;&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  pinMode(LATCH_DIO, OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO, OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
  void loop()&lt;br /&gt;
  {&lt;br /&gt;
    if (x &amp;gt; 9) {&lt;br /&gt;
      x = 0;&lt;br /&gt;
      x1++;&lt;br /&gt;
    }&lt;br /&gt;
    if (x1 &amp;gt; 9) {&lt;br /&gt;
      x1 = 0;&lt;br /&gt;
      x2++;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (x2 &amp;gt; 9) {&lt;br /&gt;
      x2 = 0;&lt;br /&gt;
      x3++;&lt;br /&gt;
    }&lt;br /&gt;
    if (x3 &amp;gt; 9) {&lt;br /&gt;
      x3 = 0;&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; 50; i++) {&lt;br /&gt;
      WriteNumberToSegment(0 , x3);&lt;br /&gt;
      delay(2);&lt;br /&gt;
      WriteNumberToSegment(1 , x2);&lt;br /&gt;
      delay(2);&lt;br /&gt;
      WriteNumberToSegment(2 , x1);&lt;br /&gt;
      delay(2);&lt;br /&gt;
      WriteNumberToSegment(3 , x);&lt;br /&gt;
      delay(2);&lt;br /&gt;
    }&lt;br /&gt;
    x++;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(LATCH_DIO, LOW);&lt;br /&gt;
    shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
    shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
    digitalWrite(LATCH_DIO, HIGH);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite ajouter le mouvement du bouton incrémental dans le programme, afin d'incrémenter/décrémenter en fonction des mouvements du bouton, avec le programme test du bouton incrémental.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    &lt;br /&gt;
#define PinB 0    &lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);  &lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   &lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinB);&lt;br /&gt;
    else&lt;br /&gt;
    up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){&lt;br /&gt;
  mouvement = false;&lt;br /&gt;
  if (x&amp;gt;9){&lt;br /&gt;
    x=0;&lt;br /&gt;
    x1++;&lt;br /&gt;
  }&lt;br /&gt;
  if(x1&amp;gt;9){&lt;br /&gt;
    x1=0;&lt;br /&gt;
    x2++;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if(x2&amp;gt;9){&lt;br /&gt;
    x2=0;&lt;br /&gt;
    x3++;&lt;br /&gt;
  }&lt;br /&gt;
  if(x3&amp;gt;9){&lt;br /&gt;
    x3=0;&lt;br /&gt;
  }&lt;br /&gt;
  for(int i=0;i&amp;lt;50;i++){&lt;br /&gt;
    WriteNumberToSegment(0 , x3);&lt;br /&gt;
    delay(2);&lt;br /&gt;
    WriteNumberToSegment(1 , x2);&lt;br /&gt;
    delay(2);&lt;br /&gt;
    WriteNumberToSegment(2 , x1);&lt;br /&gt;
    delay(2);&lt;br /&gt;
    WriteNumberToSegment(3 , x);&lt;br /&gt;
    delay(2);&lt;br /&gt;
  }&lt;br /&gt;
  if (mouvement){&lt;br /&gt;
    if(up)&lt;br /&gt;
      x++;&lt;br /&gt;
    else&lt;br /&gt;
      x--;    &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Avec ce programme, l'incrémentation marche très bien. La décrémentation marche elle aussi, mais une fois revenu à 0, on incrémente l'afficheur d’à coté : on passe de 32,31,30,40,50,60 par exemple, à cause des lignes gérant l'incrémentation/décrémentation, le programme n'est donc pas complet.&lt;br /&gt;
&lt;br /&gt;
On a ensuite voulu essayer une autre méthode pour gérer l'incrémentation/décrémentation, le DCB : Le décimal codé binaire ou BCD (binary coded decimal en anglais).&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    &lt;br /&gt;
#define PinB 0    &lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   &lt;br /&gt;
  Serial.begin (9600);  &lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  if (mouvement)  {		  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Avec cette méthode, ici on doit faire le choix entre incrémenter ou décrémenter, les deux ne fonctionnent pas en même... En revanche les 2 fonctionnent correctement, à l'inverse du programme précédant où la décrémentation ne marchait pas totalement.&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9304</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9304"/>
				<updated>2017-01-19T22:26:34Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Nous avons dimensionné : les résistances : 10KΩ pour les boutons (incrémental/poussoirs), 220Ω pour le reste. Pour les condensateurs : 3 de 0.1uF, 1 de 10uF, et 100uF pour les condensateurs du bouton incrémental.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour le bouton incrémental, il serait préférable de prendre des plus petits condensateurs, 0.1uF par exemple.&lt;br /&gt;
&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 &lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'afficheur affiche bien les nombres 0-1-2-3, il fonctionne donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestAfficheur.JPG|300px|link=Fichier:TestAfficheur.JPG]]&lt;br /&gt;
==={{Vert|Test du bouton incrémental}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//1ere sortie du codeur&lt;br /&gt;
#define PinA 1  &lt;br /&gt;
//2e sortie du codeur  &lt;br /&gt;
#define PinB 0  &lt;br /&gt;
  &lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
int valeur = 0;&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {&lt;br /&gt;
  if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinB);&lt;br /&gt;
  else&lt;br /&gt;
    up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup (){&lt;br /&gt;
  pinMode(PinA, INPUT);&lt;br /&gt;
  pinMode(PinB, INPUT);&lt;br /&gt;
&lt;br /&gt;
  //Activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH);&lt;br /&gt;
  //  digitalWrite (PinB, HIGH);&lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0, routineInterruption, FALLING); //Interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   //Initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
void loop(){&lt;br /&gt;
  if (mouvement)  { //On a détecté une rotation du bouton&lt;br /&gt;
    if (up)&lt;br /&gt;
      valeur++;&lt;br /&gt;
    else&lt;br /&gt;
      valeur--;&lt;br /&gt;
    mouvement = false;&lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
J'ai incrémenté jusqu’à 15, tout fonctionne correctement, mais au niveau de la décrémentation, le bouton ne réagit quasiment pas.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoutonIncré.png|250px|link=Fichier:BoutonIncré.png]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme incrémentation/décrémentation}}==&lt;br /&gt;
Le but final de ce programme est de pouvoir incrémenter/décrémenter à l'aide du bouton incrémental et de l'afficheur 4x7.&lt;br /&gt;
Dans un premier temps nous avons réalisé un programme où l'afficheur s'incrémente automatiquement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0X80, 0X90};&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1, 0xF2, 0xF4, 0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x = 0;&lt;br /&gt;
byte x1 = 0;&lt;br /&gt;
byte x2 = 0;&lt;br /&gt;
byte x3 = 0;&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  pinMode(LATCH_DIO, OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO, OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
  void loop()&lt;br /&gt;
  {&lt;br /&gt;
    if (x &amp;gt; 9) {&lt;br /&gt;
      x = 0;&lt;br /&gt;
      x1++;&lt;br /&gt;
    }&lt;br /&gt;
    if (x1 &amp;gt; 9) {&lt;br /&gt;
      x1 = 0;&lt;br /&gt;
      x2++;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (x2 &amp;gt; 9) {&lt;br /&gt;
      x2 = 0;&lt;br /&gt;
      x3++;&lt;br /&gt;
    }&lt;br /&gt;
    if (x3 &amp;gt; 9) {&lt;br /&gt;
      x3 = 0;&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; 50; i++) {&lt;br /&gt;
      WriteNumberToSegment(0 , x3);&lt;br /&gt;
      delay(2);&lt;br /&gt;
      WriteNumberToSegment(1 , x2);&lt;br /&gt;
      delay(2);&lt;br /&gt;
      WriteNumberToSegment(2 , x1);&lt;br /&gt;
      delay(2);&lt;br /&gt;
      WriteNumberToSegment(3 , x);&lt;br /&gt;
      delay(2);&lt;br /&gt;
    }&lt;br /&gt;
    x++;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(LATCH_DIO, LOW);&lt;br /&gt;
    shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
    shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
    digitalWrite(LATCH_DIO, HIGH);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite ajouter le mouvement du bouton incrémental dans le programme, afin d'incrémenter/décrémenter en fonction des mouvements du bouton.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9294</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9294"/>
				<updated>2017-01-19T22:08:11Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Nous avons dimensionné : les résistances : 10KΩ pour les boutons (incrémental/poussoirs), 220Ω pour le reste. Pour les condensateurs : 3 de 0.1uF, 1 de 10uF, et 100uF pour les condensateurs du bouton incrémental.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour le bouton incrémental, il serait préférable de prendre des plus petits condensateurs, 0.1uF par exemple.&lt;br /&gt;
&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 &lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'afficheur affiche bien les nombres 0-1-2-3, il fonctionne donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestAfficheur.JPG|300px|link=Fichier:TestAfficheur.JPG]]&lt;br /&gt;
==={{Vert|Test du bouton incrémental}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//1ere sortie du codeur&lt;br /&gt;
#define PinA 1  &lt;br /&gt;
//2e sortie du codeur  &lt;br /&gt;
#define PinB 0  &lt;br /&gt;
  &lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
int valeur = 0;&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {&lt;br /&gt;
  if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinB);&lt;br /&gt;
  else&lt;br /&gt;
    up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup (){&lt;br /&gt;
  pinMode(PinA, INPUT);&lt;br /&gt;
  pinMode(PinB, INPUT);&lt;br /&gt;
&lt;br /&gt;
  //Activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH);&lt;br /&gt;
  //  digitalWrite (PinB, HIGH);&lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0, routineInterruption, FALLING); //Interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   //Initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
void loop(){&lt;br /&gt;
  if (mouvement)  { //On a détecté une rotation du bouton&lt;br /&gt;
    if (up)&lt;br /&gt;
      valeur++;&lt;br /&gt;
    else&lt;br /&gt;
      valeur--;&lt;br /&gt;
    mouvement = false;&lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
J'ai incrémenté jusqu’à 15, tout fonctionne correctement, mais au niveau de la décrémentation, le bouton ne réagit quasiment pas.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoutonIncré.png|250px|link=Fichier:BoutonIncré.png]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9293</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9293"/>
				<updated>2017-01-19T22:06:31Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Nous avons dimensionné : les résistances : 10KΩ pour les boutons (incrémental/poussoirs), 220Ω pour le reste. Pour les condensateurs : 3 de 0.1uF, 1 de 10uF, et 100uF pour les condensateurs du bouton incrémental.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour le bouton incrémental, il serait préférable de prendre des plus petits condensateurs, 0.1uF par exemple.&lt;br /&gt;
&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 &lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'afficheur affiche bien les nombres 0-1-2-3, il fonctionne donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestAfficheur.JPG|300px|link=Fichier:TestAfficheur.JPG]]&lt;br /&gt;
==={{Vert|Test du bouton incrémental}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//1ere sortie du codeur&lt;br /&gt;
#define PinA 1  &lt;br /&gt;
//2e sortie du codeur  &lt;br /&gt;
#define PinB 0  &lt;br /&gt;
  &lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
int valeur = 0;&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {&lt;br /&gt;
  if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinB);&lt;br /&gt;
  else&lt;br /&gt;
    up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup (){&lt;br /&gt;
  pinMode(PinA, INPUT);&lt;br /&gt;
  pinMode(PinB, INPUT);&lt;br /&gt;
&lt;br /&gt;
  //Activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH);&lt;br /&gt;
  //  digitalWrite (PinB, HIGH);&lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0, routineInterruption, FALLING); //Interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   //Initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
void loop(){&lt;br /&gt;
  if (mouvement)  { //On a détecté une rotation du bouton&lt;br /&gt;
    if (up)&lt;br /&gt;
      valeur++;&lt;br /&gt;
    else&lt;br /&gt;
      valeur--;&lt;br /&gt;
    mouvement = false;&lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
J'ai incrémenté jusqu’à 15, tout fonctionne correctement, mais après j'ai essayé de décrémenter, le bouton réagit quasiment pas.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoutonIncré.png|250px|link=Fichier:BoutonIncré.png]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9292</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9292"/>
				<updated>2017-01-19T22:06:02Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Nous avons dimensionné : les résistances : 10KΩ pour les boutons (incrémental/poussoirs), 220Ω pour le reste. Pour les condensateurs : 3 de 0.1uF, 1 de 10uF, et 100uF pour les condensateurs du bouton incrémental.&lt;br /&gt;
'''ATTENTION''' : Pour le bouton incrémental, il serait préférable de prendre des plus petits condensateurs, 0.1uF par exemple.&lt;br /&gt;
&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 &lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'afficheur affiche bien les nombres 0-1-2-3, il fonctionne donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestAfficheur.JPG|300px|link=Fichier:TestAfficheur.JPG]]&lt;br /&gt;
==={{Vert|Test du bouton incrémental}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//1ere sortie du codeur&lt;br /&gt;
#define PinA 1  &lt;br /&gt;
//2e sortie du codeur  &lt;br /&gt;
#define PinB 0  &lt;br /&gt;
  &lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
int valeur = 0;&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {&lt;br /&gt;
  if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinB);&lt;br /&gt;
  else&lt;br /&gt;
    up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup (){&lt;br /&gt;
  pinMode(PinA, INPUT);&lt;br /&gt;
  pinMode(PinB, INPUT);&lt;br /&gt;
&lt;br /&gt;
  //Activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH);&lt;br /&gt;
  //  digitalWrite (PinB, HIGH);&lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0, routineInterruption, FALLING); //Interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   //Initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
void loop(){&lt;br /&gt;
  if (mouvement)  { //On a détecté une rotation du bouton&lt;br /&gt;
    if (up)&lt;br /&gt;
      valeur++;&lt;br /&gt;
    else&lt;br /&gt;
      valeur--;&lt;br /&gt;
    mouvement = false;&lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
J'ai incrémenté jusqu’à 15, tout fonctionne correctement, mais après j'ai essayé de décrémenter, le bouton réagit quasiment pas.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoutonIncré.png|250px|link=Fichier:BoutonIncré.png]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9290</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9290"/>
				<updated>2017-01-19T22:03:02Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Nous avons dimensionné : les résistances : 10KΩ pour les boutons (incrémental/poussoirs), 220Ω pour le reste. Pour les condensateurs : 3 de 0.1uF, 1 de 10uF, et 100uF pour les condensateurs du bouton incrémental.&lt;br /&gt;
&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 &lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'afficheur affiche bien les nombres 0-1-2-3, il fonctionne donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestAfficheur.JPG|300px|link=Fichier:TestAfficheur.JPG]]&lt;br /&gt;
==={{Vert|Test du bouton incrémental}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//1ere sortie du codeur&lt;br /&gt;
#define PinA 1  &lt;br /&gt;
//2e sortie du codeur  &lt;br /&gt;
#define PinB 0  &lt;br /&gt;
  &lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
int valeur = 0;&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {&lt;br /&gt;
  if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinB);&lt;br /&gt;
  else&lt;br /&gt;
    up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup (){&lt;br /&gt;
  pinMode(PinA, INPUT);&lt;br /&gt;
  pinMode(PinB, INPUT);&lt;br /&gt;
&lt;br /&gt;
  //Activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH);&lt;br /&gt;
  //  digitalWrite (PinB, HIGH);&lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0, routineInterruption, FALLING); //Interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   //Initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
void loop(){&lt;br /&gt;
  if (mouvement)  { //On a détecté une rotation du bouton&lt;br /&gt;
    if (up)&lt;br /&gt;
      valeur++;&lt;br /&gt;
    else&lt;br /&gt;
      valeur--;&lt;br /&gt;
    mouvement = false;&lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
J'ai incrémenté jusqu’à 15, tout fonctionne correctement, mais après j'ai essayé de décrémenter, le bouton réagit quasiment pas.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoutonIncré.png|250px|link=Fichier:BoutonIncré.png]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9289</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9289"/>
				<updated>2017-01-19T21:59:18Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Nous avons dimensionné : les résistances : 10KΩ pour les boutons (incrémental/poussoirs), 220Ω pour le reste. Pour les condensateurs : 3 de 0.1uF, 1 de 10uF, et 100uF pour les condensateurs du bouton incrémental.&lt;br /&gt;
&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 &lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'afficheur affiche bien les nombres 0-1-2-3, il fonctionne donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestAfficheur.JPG|300px|link=Fichier:TestAfficheur.JPG]]&lt;br /&gt;
==={{Vert|Test du bouton incrémental}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//1ere sortie du codeur&lt;br /&gt;
#define PinA 1  &lt;br /&gt;
//2e sortie du codeur  &lt;br /&gt;
#define PinB 0  &lt;br /&gt;
  &lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
int valeur = 0;&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {&lt;br /&gt;
  if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinB);&lt;br /&gt;
  else&lt;br /&gt;
    up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup (){&lt;br /&gt;
  pinMode(PinA, INPUT);&lt;br /&gt;
  pinMode(PinB, INPUT);&lt;br /&gt;
&lt;br /&gt;
  //Activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH);&lt;br /&gt;
  //  digitalWrite (PinB, HIGH);&lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0, routineInterruption, FALLING); //Interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   //Initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
void loop(){&lt;br /&gt;
  if (mouvement)  { //On a détecté une rotation du bouton&lt;br /&gt;
    if (up)&lt;br /&gt;
      valeur++;&lt;br /&gt;
    else&lt;br /&gt;
      valeur--;&lt;br /&gt;
    mouvement = false;&lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
J'ai incrémenté jusqu’à 15, tout fonctionne correctement, mais après j'ai essayé de décrémenter, le bouton réagit moins bien.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoutonIncré.png|250px|link=Fichier:BoutonIncré.png]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9288</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9288"/>
				<updated>2017-01-19T21:57:28Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Nous avons dimensionné : les résistances : 10KΩ pour les boutons (incrémental/poussoirs), 220Ω pour le reste. Pour les condensateurs : 3 de 0.1uF, 1 de 10uF, et 100uF pour les condensateurs du bouton incrémental.&lt;br /&gt;
&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 &lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'afficheur affiche bien les nombres 0-1-2-3, il fonctionne donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestAfficheur.JPG|300px|link=Fichier:TestAfficheur.JPG]]&lt;br /&gt;
==={{Vert|Test du bouton incrémental}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//1ere sortie du codeur&lt;br /&gt;
#define PinA 1  &lt;br /&gt;
//2e sortie du codeur  &lt;br /&gt;
#define PinB 0  &lt;br /&gt;
  &lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
int valeur = 0;&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {&lt;br /&gt;
  if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinB);&lt;br /&gt;
  else&lt;br /&gt;
    up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup (){&lt;br /&gt;
  pinMode(PinA, INPUT);&lt;br /&gt;
  pinMode(PinB, INPUT);&lt;br /&gt;
&lt;br /&gt;
  //Activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH);&lt;br /&gt;
  //  digitalWrite (PinB, HIGH);&lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0, routineInterruption, FALLING); //Interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   //Initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
void loop(){&lt;br /&gt;
  if (mouvement)  { //On a détecté une rotation du bouton&lt;br /&gt;
    if (up)&lt;br /&gt;
      valeur++;&lt;br /&gt;
    else&lt;br /&gt;
      valeur--;&lt;br /&gt;
    mouvement = false;&lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
J'ai incrémenté jusqu’à 15, tout fonctionne correctement, mais après j'ai essayé de décrémenter, le bouton réagit moins bien.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BoutonIncré.png|100px|link=Fichier:BoutonIncré.png]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:BoutonIncr%C3%A9.png&amp;diff=9287</id>
		<title>Fichier:BoutonIncré.png</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:BoutonIncr%C3%A9.png&amp;diff=9287"/>
				<updated>2017-01-19T21:56:46Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9286</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9286"/>
				<updated>2017-01-19T21:56:00Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Nous avons dimensionné : les résistances : 10KΩ pour les boutons (incrémental/poussoirs), 220Ω pour le reste. Pour les condensateurs : 3 de 0.1uF, 1 de 10uF, et 100uF pour les condensateurs du bouton incrémental.&lt;br /&gt;
&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 &lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'afficheur affiche bien les nombres 0-1-2-3, il fonctionne donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestAfficheur.JPG|300px|link=Fichier:TestAfficheur.JPG]]&lt;br /&gt;
==={{Vert|Test du bouton incrémental}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//1ere sortie du codeur&lt;br /&gt;
#define PinA 1  &lt;br /&gt;
//2e sortie du codeur  &lt;br /&gt;
#define PinB 0  &lt;br /&gt;
  &lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
int valeur = 0;&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {&lt;br /&gt;
  if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinB);&lt;br /&gt;
  else&lt;br /&gt;
    up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup (){&lt;br /&gt;
  pinMode(PinA, INPUT);&lt;br /&gt;
  pinMode(PinB, INPUT);&lt;br /&gt;
&lt;br /&gt;
  //Activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH);&lt;br /&gt;
  //  digitalWrite (PinB, HIGH);&lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0, routineInterruption, FALLING); //Interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   //Initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
void loop(){&lt;br /&gt;
  if (mouvement)  { //On a détecté une rotation du bouton&lt;br /&gt;
    if (up)&lt;br /&gt;
      valeur++;&lt;br /&gt;
    else&lt;br /&gt;
      valeur--;&lt;br /&gt;
    mouvement = false;&lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
J'ai incrémenté jusqu’à 15, tout fonctionne correctement, mais après j'ai essayé de décrémenter, le bouton réagit moins bien.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9285</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9285"/>
				<updated>2017-01-19T21:42:28Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Nous avons dimensionné : les résistances : 10KΩ pour les boutons (incrémental/poussoirs), 220Ω pour le reste. Pour les condensateurs : 3 de 0.1uF, 1 de 10uF, et 100uF pour les condensateurs du bouton incrémental.&lt;br /&gt;
&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 &lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'afficheur affiche bien les nombres 0-1-2-3, il fonctionne donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestAfficheur.JPG|300px|link=Fichier:TestAfficheur.JPG]]&lt;br /&gt;
==={{Vert|Test du bouton incrémental}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//1ere sortie du codeur&lt;br /&gt;
#define PinA 1  &lt;br /&gt;
//2e sortie du codeur  &lt;br /&gt;
#define PinB 0  &lt;br /&gt;
  &lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
int valeur = 0;&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {&lt;br /&gt;
  if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinB);&lt;br /&gt;
  else&lt;br /&gt;
    up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup (){&lt;br /&gt;
  pinMode(PinA, INPUT);&lt;br /&gt;
  pinMode(PinB, INPUT);&lt;br /&gt;
&lt;br /&gt;
  //Activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH);&lt;br /&gt;
  //  digitalWrite (PinB, HIGH);&lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0, routineInterruption, FALLING); //Interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   //Initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
void loop(){&lt;br /&gt;
  if (mouvement)  { //On a détecté une rotation du bouton&lt;br /&gt;
    if (up)&lt;br /&gt;
      valeur++;&lt;br /&gt;
    else&lt;br /&gt;
      valeur--;&lt;br /&gt;
    mouvement = false;&lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9284</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9284"/>
				<updated>2017-01-19T21:41:47Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Nous avons dimensionné : les résistances : 10KΩ pour les boutons (incrémental/poussoirs), 220Ω pour le reste. Pour les condensateurs : 3 de 0.1uF, 1 de 10uF, et 100uF pour les condensateurs du bouton incrémental.&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 &lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'afficheur affiche bien les nombres 0-1-2-3, il fonctionne donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestAfficheur.JPG|300px|link=Fichier:TestAfficheur.JPG]]&lt;br /&gt;
==={{Vert|Test du bouton incrémental}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//1ere sortie du codeur&lt;br /&gt;
#define PinA 1  &lt;br /&gt;
//2e sortie du codeur  &lt;br /&gt;
#define PinB 0  &lt;br /&gt;
  &lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
int valeur = 0;&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {&lt;br /&gt;
  if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinB);&lt;br /&gt;
  else&lt;br /&gt;
    up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup (){&lt;br /&gt;
  pinMode(PinA, INPUT);&lt;br /&gt;
  pinMode(PinB, INPUT);&lt;br /&gt;
&lt;br /&gt;
  //Activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH);&lt;br /&gt;
  //  digitalWrite (PinB, HIGH);&lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0, routineInterruption, FALLING); //Interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   //Initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
void loop(){&lt;br /&gt;
  if (mouvement)  { //On a détecté une rotation du bouton&lt;br /&gt;
    if (up)&lt;br /&gt;
      valeur++;&lt;br /&gt;
    else&lt;br /&gt;
      valeur--;&lt;br /&gt;
    mouvement = false;&lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9283</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9283"/>
				<updated>2017-01-19T21:39:03Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Nous avons dimensionné : les résistances : 10KΩ pour les boutons (incrémental/poussoirs), 220Ω pour le reste. Pour les condensateurs : 3 de 0.1uF, 1 de 10uF.&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 &lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'afficheur affiche bien les nombres 0-1-2-3, il fonctionne donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestAfficheur.JPG|300px|link=Fichier:TestAfficheur.JPG]]&lt;br /&gt;
==={{Vert|Test du bouton incrémental}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define PinA 1    //1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
int valeur = 0;&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {&lt;br /&gt;
  if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinB);&lt;br /&gt;
  else&lt;br /&gt;
    up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup (){&lt;br /&gt;
  pinMode(PinA, INPUT);&lt;br /&gt;
  pinMode(PinB, INPUT);&lt;br /&gt;
&lt;br /&gt;
  //Activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH);&lt;br /&gt;
  //  digitalWrite (PinB, HIGH);&lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0, routineInterruption, FALLING); //Interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   //Initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
void loop(){&lt;br /&gt;
  if (mouvement)  { //On a détecté une rotation du bouton&lt;br /&gt;
    if (up)&lt;br /&gt;
      valeur++;&lt;br /&gt;
    else&lt;br /&gt;
      valeur--;&lt;br /&gt;
    mouvement = false;&lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9280</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9280"/>
				<updated>2017-01-19T21:25:57Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Nous avons dimensionner : les résistances : 10KΩ pour les boutons (incrémental/poussoirs), 220Ω pour le reste.&lt;br /&gt;
                          les condensateurs : 3 de 0.1uF, 1 de 10uF.&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 &lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'afficheur affiche bien les nombres 0-1-2-3, il fonctionne donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestAfficheur.JPG|300px|link=Fichier:TestAfficheur.JPG]]&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9278</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9278"/>
				<updated>2017-01-19T20:42:16Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 &lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'afficheur affiche bien les nombres 0-1-2-3, il fonctionne donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestAfficheur.JPG|300px|link=Fichier:TestAfficheur.JPG]]&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:TestAfficheur.JPG&amp;diff=9277</id>
		<title>Fichier:TestAfficheur.JPG</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:TestAfficheur.JPG&amp;diff=9277"/>
				<updated>2017-01-19T20:41:04Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9276</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9276"/>
				<updated>2017-01-19T20:36:52Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 &lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L'afficheur affiche bien les nombres 0-1-2-3, il fonctionne donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9275</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9275"/>
				<updated>2017-01-19T20:27:54Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 &lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9274</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9274"/>
				<updated>2017-01-19T20:19:39Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Test de l'afficheur 4x7 segments}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8 //On définit les broches utilisées par les registres à décalage pour l'afficheur 4x7&lt;br /&gt;
 &lt;br /&gt;
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; //Segments utilisés pour afficher les nombres de 0 à 9         &lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; //Définition des segments utilisés&lt;br /&gt;
 &lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
pinMode(LATCH_DIO,OUTPUT); //Définition des broches en sorties&lt;br /&gt;
pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
WriteNumberToSegment(0 , 0); //On affiche les nombres 0-1-2-3 sur l'afficheur&lt;br /&gt;
WriteNumberToSegment(1 , 1);&lt;br /&gt;
WriteNumberToSegment(2 , 2);&lt;br /&gt;
WriteNumberToSegment(3 , 3);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value) //On écrit un nombre décimal entre 0 et 9 sur les segments &lt;br /&gt;
{&lt;br /&gt;
digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9273</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9273"/>
				<updated>2017-01-19T20:10:01Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend quant à elle les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9272</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9272"/>
				<updated>2017-01-19T20:08:11Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
La face Top comprend le bouton incrémental, l'afficheur 4x7 segments, les 3 boutons poussoirs, les 4 leds, des résistances et des condensateurs, ainsi que les connecteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
La face Bot comprend les 2 composants 74HC595 (registre à décalage), ainsi que des résistances.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9271</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9271"/>
				<updated>2017-01-19T20:02:30Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Les 4 leds fonctionnent donc correctement.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Chaque bouton allume une led, les 3 boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9270</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9270"/>
				<updated>2017-01-19T19:58:15Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|315px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|320px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9269</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9269"/>
				<updated>2017-01-19T19:55:24Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|300px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:TestBouton3.jpg|300px|link=Fichier:TestBouton3.jpg]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:TestBouton3.jpg&amp;diff=9268</id>
		<title>Fichier:TestBouton3.jpg</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:TestBouton3.jpg&amp;diff=9268"/>
				<updated>2017-01-19T19:54:42Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9267</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9267"/>
				<updated>2017-01-19T19:52:51Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:TestBouton2.jpg|300px|link=Fichier:TestBouton2.jpg]]&lt;br /&gt;
[[Fichier:.JPG|300px|link=Fichier:Tesed.JPG]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:TestBouton2.jpg&amp;diff=9266</id>
		<title>Fichier:TestBouton2.jpg</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:TestBouton2.jpg&amp;diff=9266"/>
				<updated>2017-01-19T19:52:10Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9265</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9265"/>
				<updated>2017-01-19T19:50:10Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fichier:TestBouton.jpg|300px|link=Fichier:TestBouton.jpg]]&lt;br /&gt;
[[Fichier:.JPG|300px|link=Fichier:Teed.JPG]]&lt;br /&gt;
[[Fichier:.JPG|300px|link=Fichier:Tesed.JPG]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:TestBouton.jpg&amp;diff=9264</id>
		<title>Fichier:TestBouton.jpg</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:TestBouton.jpg&amp;diff=9264"/>
				<updated>2017-01-19T19:49:20Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9263</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9263"/>
				<updated>2017-01-19T19:44:33Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fichier:JPG|300px|link=Fichier:T.JPG]]&lt;br /&gt;
[[Fichier:.JPG|300px|link=Fichier:Teed.JPG]]&lt;br /&gt;
[[Fichier:.JPG|300px|link=Fichier:Tesed.JPG]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9262</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9262"/>
				<updated>2017-01-19T19:43:49Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fichier:JPG|300px|link=Fichier:T.JPG]]&lt;br /&gt;
[[Fichier:.JPG|300px|link=Fichier:Teed.JPG]]&lt;br /&gt;
[[Fichier:.JPG|300px|link=Fichier:Tesed.JPG]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9261</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9261"/>
				<updated>2017-01-19T19:43:21Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fichier:JPG|300px|link=Fichier:T.JPG]]&lt;br /&gt;
[[Fichier:.JPG|300px|link=Fichier:Teed.JPG]]&lt;br /&gt;
[[Fichier:.JPG|300px|link=Fichier:Tesed.JPG]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9260</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9260"/>
				<updated>2017-01-19T19:42:26Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fichier:JPG|300px|link=Fichier:T.JPG]]&lt;br /&gt;
[[Fichier:.JPG|300px|link=Fichier:Teed.JPG]]&lt;br /&gt;
[[Fichier:.JPG|300px|link=Fichier:Tesed.JPG]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9247</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9247"/>
				<updated>2017-01-19T16:42:16Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fichier:TestLed.JPG|300px|link=Fichier:TestLed.JPG]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:TestLed.JPG&amp;diff=9244</id>
		<title>Fichier:TestLed.JPG</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:TestLed.JPG&amp;diff=9244"/>
				<updated>2017-01-19T16:38:32Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9243</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9243"/>
				<updated>2017-01-19T16:32:11Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
Nous avons donc réaliser quelques programmes afin de tester les différents composants.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Fichier:.jpg|300px|link=Fichier:Fa.jpg]]&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9241</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9241"/>
				<updated>2017-01-19T16:01:42Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage. Avec cette carte, nous avons donc d'abord passer la face Bot au four.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
Après la réalisation de la carte, il faut maintenant la tester, afin de dépanner les éventuelles erreurs.&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9240</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9240"/>
				<updated>2017-01-19T15:58:14Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9239</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9239"/>
				<updated>2017-01-19T15:57:47Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
Les pistes étant assez fines, certaines soudures se sont révélées difficiles.&lt;br /&gt;
Certaines difficultés sont apparues avec quelques vias, trop proches des composants (voir FaceTop2, via entre les deux leds).&lt;br /&gt;
'''ATTENTION''' : La carte étant double face, avec des composants CMS des 2 cotés, je vous conseille de passer d’abord la face avec le moins de composant au four, afin d'éviter des incidents au second passage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9238</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9238"/>
				<updated>2017-01-19T15:50:42Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:FaceBot.jpg|300px|link=Fichier:FaceBot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:FaceBot.jpg&amp;diff=9237</id>
		<title>Fichier:FaceBot.jpg</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:FaceBot.jpg&amp;diff=9237"/>
				<updated>2017-01-19T15:50:10Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9236</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9236"/>
				<updated>2017-01-19T15:49:41Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
[[Fichier:FaceTop2.jpg|300px|link=Fichier:FaceTop2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:.jpg|300px|link=Fichier:Bot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:FaceTop2.jpg&amp;diff=9235</id>
		<title>Fichier:FaceTop2.jpg</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:FaceTop2.jpg&amp;diff=9235"/>
				<updated>2017-01-19T15:49:06Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9234</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9234"/>
				<updated>2017-01-19T15:48:36Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
[[Fichier:FaceTop.JPG|300px|link=Fichier:FaceTop.JPG]]&lt;br /&gt;
[[Fichier:.jpg|300px|link=Fichier:Top2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:.jpg|300px|link=Fichier:Bot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:FaceTop.JPG&amp;diff=9233</id>
		<title>Fichier:FaceTop.JPG</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:FaceTop.JPG&amp;diff=9233"/>
				<updated>2017-01-19T15:47:55Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9232</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9232"/>
				<updated>2017-01-19T15:46:14Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
[[Fichier:.JPG|300px|link=Fichier:Top.JPG]]&lt;br /&gt;
[[Fichier:.jpg|300px|link=Fichier:Top2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:.jpg|300px|link=Fichier:Bot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9231</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9231"/>
				<updated>2017-01-19T15:43:14Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
[[Fichier:Top.JPG|300px|link=Fichier:Top.JPG]]&lt;br /&gt;
[[Fichier:Top2.jpg|300px|link=Fichier:Top2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:Bot.jpg|300px|link=Fichier:Bot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9230</id>
		<title>De0NanoExtension</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=De0NanoExtension&amp;diff=9230"/>
				<updated>2017-01-19T15:42:16Z</updated>
		
		<summary type="html">&lt;p&gt;De0Nano : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet carte extension pour DE0Nano 2016/2017 (Violette et Villaire)}}=&lt;br /&gt;
=={{Bleu|Première Partie : Étude théorique}}==&lt;br /&gt;
==={{Vert|Présentation du projet}}===&lt;br /&gt;
Le but de ce projet est de réaliser un shield multifonction, généraliste, sur une De0Nano. Les principaux composants qui vont être utilisés sont un afficheur 4x7 segments, un bouton à codage rotatif, 2 registres à décalage (74HC595), des boutons poussoirs et des leds. &lt;br /&gt;
Avec un nombre d'entrées/sorties limitées, nous avons décidé de mettre sur la carte 4 leds et 3 boutons poussoirs, en plus du bouton incrémental, de l'afficheur, et des registres à décalage.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Afficheur4x7.jpg|100px|link=Fichier:Afficheur4x7.jpg]]&lt;br /&gt;
[[Fichier:BoutonRota.jpeg|100px|link=Fichier:BoutonRota.jpeg]]&lt;br /&gt;
[[Fichier:74HC595.png|100px|link=Fichier:74HC595.png]]&lt;br /&gt;
==={{Vert|Conception du schéma Eagle}}===&lt;br /&gt;
Voici le schéma Eagle complet :&lt;br /&gt;
[[Fichier:Schéma Eagle.png|1000px|link=Fichier:Schéma Eagle.png]]&lt;br /&gt;
Schéma individuel du bouton incrémental :&lt;br /&gt;
[[Fichier:Bouton incrémental.png|250px|link=Fichier:Bouton incrémental.png]]&lt;br /&gt;
&lt;br /&gt;
Schéma individuel des 3 boutons poussoirs :&lt;br /&gt;
[[Fichier:BoutonPoussoirs.png|250px|link=Fichier:BoutonPoussoirs.png]]&lt;br /&gt;
&lt;br /&gt;
Pour l'afficheur 4x7 segments, on a du créer une librairie, car notre composant n'existait pas : &lt;br /&gt;
[[Fichier:Afficheur.png|250px|link=Fichier:Afficheur.png]]&lt;br /&gt;
&lt;br /&gt;
Nous avons pris la surface d'une carte arduino en modèle, afin d'avoir une idée de la taille du shield à réaliser.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION''' : Pour de la programmation avec Arduino, comme notre shield utilise les broches 0 et 1 de l’Arduino (RX et TX), il faut téléverser le programme avant que le shield ne soit connecté... Pour des raisons pratiques, il serait préférable à l'avenir de laisser ces broches disponibles, quitte à mettre moins de composants de sur la carte.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Conception du routage Eagle}}===&lt;br /&gt;
===={{Routage complet}}====&lt;br /&gt;
Faire tenir tous les composants sur la surface d'une carte arduino est assez compliqué, nous avons donc &amp;quot;dépassé&amp;quot; un petit peu.&lt;br /&gt;
Vu le nombre de composants à placer et la surface disponible, on se retrouve avec beaucoup de vias.&lt;br /&gt;
[[Fichier:RoutageComplet.png|1000px|link=Fichier:RoutageComplet.png]]&lt;br /&gt;
===={{Routage de la face Top}}====&lt;br /&gt;
[[Fichier:FaceTop.png|1000px|link=Fichier:FaceTop.png]]&lt;br /&gt;
===={{Routage de la face Bot}}====&lt;br /&gt;
[[Fichier:FaceBot.png|1000px|link=Fichier:FaceBot.png]]&lt;br /&gt;
=={{Bleu|Deuxième Partie : Réalisation de la carte}}==&lt;br /&gt;
==={{Vert|Face Top de la carte}}===&lt;br /&gt;
[[Fichier:Top.JPG|300px|link=Fichier:Top.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Top2.jpg|300px|link=Fichier:Top2.jpg]]&lt;br /&gt;
==={{Vert|Face Bot de la carte}}===&lt;br /&gt;
[[Fichier:Bot.jpg|300px|link=Fichier:Bot.jpg]]&lt;br /&gt;
=={{Bleu|Troisième Partie : Test de la carte}}==&lt;br /&gt;
==={{Vert|Test des leds}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int L1 = 10; //Déclaration des broches&lt;br /&gt;
const int L2 = 11; &lt;br /&gt;
const int L3 = 12; &lt;br /&gt;
const int L4 = 13; &lt;br /&gt;
&lt;br /&gt;
void setup() &lt;br /&gt;
{&lt;br /&gt;
  pinMode(L1, OUTPUT); //Les broches sont des broches de sortie&lt;br /&gt;
  pinMode(L2, OUTPUT); &lt;br /&gt;
  pinMode(L3, OUTPUT); &lt;br /&gt;
  pinMode(L4, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
void loop() &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(L1, HIGH); //Toutes les leds s'allument pendant 1 seconde&lt;br /&gt;
  digitalWrite(L2, HIGH); &lt;br /&gt;
  digitalWrite(L3, HIGH);&lt;br /&gt;
  digitalWrite(L4, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite(L1, LOW); &lt;br /&gt;
  digitalWrite(L2, LOW);&lt;br /&gt;
  digitalWrite(L3, LOW); &lt;br /&gt;
  digitalWrite(L4, LOW); &lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==={{Vert|Test des boutons poussoirs}}===&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int pinBouton;&lt;br /&gt;
int pinBouton2;&lt;br /&gt;
int pinBouton3;&lt;br /&gt;
int pinLed1, pinLed2, pinLed3; //Déclaration des variables&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinBouton = 3;&lt;br /&gt;
  pinBouton2 = 5;&lt;br /&gt;
  pinBouton3 = 6;   &lt;br /&gt;
&lt;br /&gt;
  pinLed1 = 10;&lt;br /&gt;
  pinLed2 = 11;&lt;br /&gt;
  pinLed3 = 12; //Initialisation des variables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinBouton, INPUT); //Mode lecture pour les boutons&lt;br /&gt;
  pinMode(pinBouton2, INPUT);&lt;br /&gt;
  pinMode(pinBouton3, INPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(pinLed1, OUTPUT); //Mode écriture pour les leds&lt;br /&gt;
  pinMode(pinLed2, OUTPUT);&lt;br /&gt;
  pinMode(pinLed3, OUTPUT); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  boolean etatBouton = digitalRead(pinBouton);&lt;br /&gt;
  boolean etatBouton2 = digitalRead(pinBouton2);&lt;br /&gt;
  boolean etatBouton3 = digitalRead(pinBouton3); //Lecture de l'état du bouton et stockage dans etatBouton&lt;br /&gt;
  &lt;br /&gt;
  if (etatBouton==LOW) //Test si bouton appuyé&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,LOW);   //led1 allumée&lt;br /&gt;
    digitalWrite(pinLed2,HIGH); //led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatBouton2==LOW) //Test si bouton2 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH);  //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,LOW);  //led2 allumée&lt;br /&gt;
    digitalWrite(pinLed3,HIGH);//led3 éteinte&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
   if (etatBouton3==LOW) //Test si bouton3 appuyé&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(pinLed1,HIGH); //led1 éteinte&lt;br /&gt;
    digitalWrite(pinLed2,HIGH);//led2 éteinte&lt;br /&gt;
    digitalWrite(pinLed3,LOW);//led3 allumée&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Quatrième Partie : Réalisation d'un programme}}==&lt;br /&gt;
Nous avons décidé de tester la carte avec une carte Arduino UNO. Le programme utilisé est :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/* Define shift register pins used for seven segment display */&lt;br /&gt;
#define LATCH_DIO 4&lt;br /&gt;
#define CLK_DIO 7&lt;br /&gt;
#define DATA_DIO 8&lt;br /&gt;
&lt;br /&gt;
/* Segment byte maps for numbers 0 to 9 */&lt;br /&gt;
const byte SEGMENT_MAP[] = {&lt;br /&gt;
  0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};&lt;br /&gt;
/* Byte maps to select digit 1 to 4 */&lt;br /&gt;
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};&lt;br /&gt;
&lt;br /&gt;
byte x=0;&lt;br /&gt;
byte x1=0;&lt;br /&gt;
byte x2=0;&lt;br /&gt;
byte x3=0;&lt;br /&gt;
&lt;br /&gt;
#define PinA 1    //  1ere sortie du codeur&lt;br /&gt;
#define PinB 0    //  2e sortie du codeur&lt;br /&gt;
&lt;br /&gt;
volatile boolean mouvement;&lt;br /&gt;
volatile boolean up;&lt;br /&gt;
&lt;br /&gt;
unsigned int valeur = 0;  &lt;br /&gt;
&lt;br /&gt;
// routine déclanchée quand le signal A passe de haut a bas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
  /* Set DIO pins to outputs */&lt;br /&gt;
  pinMode(LATCH_DIO,OUTPUT);&lt;br /&gt;
  pinMode(CLK_DIO,OUTPUT);&lt;br /&gt;
  pinMode(DATA_DIO,OUTPUT);&lt;br /&gt;
&lt;br /&gt;
  pinMode(PinA,INPUT);&lt;br /&gt;
  pinMode(PinB,INPUT);  &lt;br /&gt;
&lt;br /&gt;
  // activation des pullups internes de l'Arduino, si on n'utilise pas de pullups externes.&lt;br /&gt;
  //  digitalWrite (PinA, HIGH); &lt;br /&gt;
  //  digitalWrite (PinB, HIGH); &lt;br /&gt;
&lt;br /&gt;
  attachInterrupt (0,routineInterruption,FALLING);   // interruption sur front descendant&lt;br /&gt;
&lt;br /&gt;
  Serial.begin (9600);   // initialisation du moniteur série&lt;br /&gt;
  Serial.println(&amp;quot;Veuillez tourner le bouton&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void routineInterruption ()  {     &lt;br /&gt;
  //if (digitalRead(PinA))&lt;br /&gt;
    up = digitalRead(PinA);&lt;br /&gt;
  &lt;br /&gt;
  //  else&lt;br /&gt;
  //  up = !digitalRead(PinB);&lt;br /&gt;
  mouvement = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Main program */&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  /* Update the display with the current counter value */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if (mouvement)  {		  // on a détecté une rotation du bouton  &lt;br /&gt;
    if (up)&lt;br /&gt;
      //valeur++;&lt;br /&gt;
      incrementBCD(&amp;amp;valeur);&lt;br /&gt;
    else&lt;br /&gt;
      //valeur--;&lt;br /&gt;
      decrementBCD(&amp;amp;valeur);&lt;br /&gt;
    mouvement= false;         &lt;br /&gt;
&lt;br /&gt;
    Serial.println (valeur);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  WriteNumberToSegment(0 , (valeur&amp;amp;0xF000)&amp;gt;&amp;gt;12);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(1 , (valeur&amp;amp;0x0F00)&amp;gt;&amp;gt;8);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(2 , (valeur&amp;amp;0x00F0)&amp;gt;&amp;gt;4);&lt;br /&gt;
    delay(1);&lt;br /&gt;
    WriteNumberToSegment(3 , (valeur&amp;amp;0x000F));&lt;br /&gt;
    delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */&lt;br /&gt;
void WriteNumberToSegment(byte Segment, byte Value)&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(LATCH_DIO,LOW);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);&lt;br /&gt;
  shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );&lt;br /&gt;
  digitalWrite(LATCH_DIO,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void incrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)++;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) &amp;gt; 0x0009) *cnt += 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) &amp;gt; 0x0090) *cnt += 0x0060;&lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) &amp;gt; 0x0900) *cnt += 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) &amp;gt; 0x9000) *cnt += 0x6000;  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
void decrementBCD(unsigned int *cnt) { &lt;br /&gt;
  (*cnt)--;    &lt;br /&gt;
  if ((*cnt &amp;amp; 0x000F) == 0x000F) *cnt -= 6; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x00F0) == 0x00F0) *cnt -= 0x0060; &lt;br /&gt;
  if ((*cnt &amp;amp; 0x0F00) == 0x0F00) *cnt -= 0x0600; &lt;br /&gt;
  if ((*cnt &amp;amp; 0xF000) == 0xF000) *cnt -= 0x6000; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>De0Nano</name></author>	</entry>

	</feed>