ez expander : mettre un programme

Bonjour à tous,

j’ai acheté un ez-expander ( http://www.robotshop.com/blindage-ez-expander.html )
afin d’augmenter le nombre de sorties de mon arduino uno.

je voudrais donc savoir comment faire pour “étendre” le programme qui est dans mon arduino dans les nouvelles sorties (du expander).

voici le programme (il fonctionne) dans mon arduino :

int led[10] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; // Assign the pins for the leds
int leftChannel = 0;  // left channel input
int left, i;

void setup()
{
for (i = 0; i < 10; i++)  // Tell the arduino that the leds are digital outputs
  pinMode(led[i], OUTPUT);
//  Serial.begin(9600); // Uncomment to enable troubleshooting over serial.
}

void loop()
{
left = analogRead(leftChannel);  // read the left channel
// Serial.println(left);  // uncomment to check the raw input.
left = left / 50;    // adjusts the sensitivity  
//  Serial.println(left);  // uncomment to check the modified input.
// left = 1500;  // uncomment to test all leds light.
// left = 0;    // uncomment to check the leds are not lit when the input is 0.

  if (left == 0)  // si le volume = 0 then éteindre ttes les leds
   {
   for(i = 0; i < 10; i++)
     {
     digitalWrite(led[i], LOW);
     }
  }
  
  else
  {
   for (i = 0; i < left; i++) // allume les leds en fonction du niveau du volume 
    {
     digitalWrite(led[i], HIGH);
    }
    
    for(i = i; i < 10; i++)  // éteind les leds en fonction du niveau de voltage 
     {
      digitalWrite(led[i], LOW);
     }
  }
}

Suffit il d’ajouter le numero des nouvelles sorties au programme,
faut il programmer le expander (si oui, comment) ?

Merci d avance pour vos réponses.

si vous avez des questions, je suis à vous

bonne soirée.

ce site peut guider, mais j avoue ne pas avoir tt compris

http://nootropicdesign.com/ez-expander/

Franchement le mieux est que tu commence par comprendre comment fonctionne un registre à décalage (shift register).
Un site pris au hasard http://www.premiumorange.com/daniel.robert9/Digit/Digit_8T.html
Trois points à comprendre :

  • Le role de l’horloge
  • Qu’est ce qu’on met sur l’entrée donnée
  • Le role du verrou (latch)
    Une fois compris le fonctionnement d’un registre isolé c’est simple d’étendre le raisonnement à des registres chaînés (daisy chain) puisque sur ta carte tu en a deux.

Ensuite regarde du coté de la fonction arduino “shiftout()”.

Et pour la suite c’est à toi de constituer les deux octets que tu enverra sur les registres en fonction de ce que tu veux faire.

Un site encore meilleurs et adapté Arduino 74HC595
http://blog.matael.org/writing/arduino-et-registres/

Bonjour 68tjs,

merci pour ta réponse.

je débute en programmation donc je ne maîtrise pas trop arduino et son langage.

je vais essayer de comprendre en effet les décalages, horloges ...

si vous avez d autres remarques à faire, n hésitez pas ;p

Indépendamment du code, il y a un autre paramètre à prendre en compte : ces registres sont spécifiés pour un courant max par broche de +/- 6mA, c'est nettement moins que les broches de l'avr, il sera donc peut-être nécessaire de revoir la valeur des résistances associées aux leds.

j'ai des resistances de 390 ohms

j'ai pu mettre environs 10 leds en derivation à chaque sorties du arduino.

faut il diminuer les valeurs des resistances aux sorties de l'expander ?
a voir

j'ai pu mettre environs 10 leds en derivation à chaque sorties du arduino.

Tu es sur de ce que tu annonce ?
Une led consomme au moins 10mA donc 100mA par sortie C'est bien cela ?
Le micro-controleur supporte :
40mA par sortie en usage exeptionnel et sur un temps limité
Le fournisseur Atmel ne garanti que 20 mA en usage permanent.

ce que je fais est un vu metre

donc les diodes ne sont pas allumée en permanence

mtn j ai un doute sur mon message précédent mais ce dont je suis sur c'est que 60 leds sur la meme sortie ca fonctionne

j’ai bien pris en compte vos remarques et je continue à étudier les registres et décalage…

j ai juste une question :

est ce qu il est possible d’inclure un programme du genre : (je l ai trouvé dans le lien de mon 2° mess )

#include <EZExpander.h>

// Create an EZExpander object
EZExpander expander = EZExpander();

void setup() {
}

void loop() {
  for(int i=20;i<=35;i++) {
    expander.digitalWrite(i, HIGH);
  }
  delay(1000);
  for(int i=20;i<=35;i++) {
    expander.digitalWrite(i, LOW);
  }
  delay(1000);
}

au programme du arduino de base ?

mais en mettant le meme programme que j ai mis dans le arduino

en gros, mettre

#include <EZExpander.h>

int led[13] = {20 à 32}; // Assign the pins for the leds
int leftChannel = 0;  // left channel input
int left, i;

void setup()
{
for (i = 0; i < 13; i++)  // Tell the arduino that the leds are digital outputs
  pinMode(led[i], OUTPUT);
//  Serial.begin(9600); // Uncomment to enable troubleshooting over serial.
}

puis le meme void loop que celui du arduino

dsl mes questions sont un peu compliquées ^^ ;p

Je ferais la même réponse que pour le topic : "74HC595 newbie perdu"
De plus je ne connais pas la bibliothèque qui accompagne ta carte.
Désolé.

PS : pour le code la charte du forum, que tu n'as pas manqué de lire avant de poster, stipule que le code doit être placé entre balise code -> icône # situé juste avant l’icône pour les citations que tu utiles par erreur.
Merci d'éditer tout tes messages avec l'option "modify".

ok merci

mon montage est le suivant (c'est un vu metre dc les diodes s allument en fonction de la musique) :

je me suis inspiré de ça pour réaliser la partie droite du schema :

mtn, j aimerai ajouter des sorties grace à 2 74HC595. (partie gauche du schema).
Et là ça fait plusieur semaine que je cherche mais malheureusement je ne maitrise pas assez arduino.

je pense avoir compris ça : http://www.arduino.cc/en/Tutorial/ShiftOut

mais je n arrive pas à "traduire" ttes ces infos en code.

Merci d'avance pour votre aide

bonne journée et à bientot

Ton problème n'a rien à voir avec l'arduino c'est juste de la programmation en C ou C++.

La fonction shiftout() permet d'envoyer un octet dans un registre à décalage.
Si tu as plusieurs registres chaînés (sortie du registre n raccordé sur l'entrée du registre n+1) il faut envoyer autant d'octets que de registres.

Les données sont envoyées en série, c'est à dire les une après les autres, ce qui fait que pour changer la valeur d'une sortie d'un registre il faut TOUT ré-envoyer c'est à dire autant d'octets qu'il y a de registres chaînés.

Après ce qui y a dans l'octet c'est à toi de le décider.
Pour écrire un octet il y a plusieurs méthodes, pour moi la plus simple est d'écrire le nombre en notation binaire : c'est visuel.
Le registre à 8 sorties Q7 à Q0 pour passer à "1" la sortie Q2 il suffit d'écrire :

uint8_t mot ;
mot= 0b00001000 ;

Après il y a des méthodes plus élaborées qui sont connues sous le nom de "manipulation de bit" où on utilise des fonctions "OU" et "ET" avec des masques. Je te renvoie sur des tutos ou simplement le site du zéro.

mais j'ai vraiment du mal avec la programmation.

si qq'un pouvait m aider ça serait génial ; )

bonjour bonjour,

j ai trouvé ce code :

int current;
int highest = 350;
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
int volume[9] = {0b00000000, 0b00000001, 0b00000011, 0b00000111,
                 0b00001111, 0b00011111, 0b00111111, 0b01111111,
                 0b11111111};
                 
void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  Serial.begin(9600);
}
 
void loop() {
  current = map(analogRead(A0), 0, highest, 0, 9);
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, volume[current]);  
  digitalWrite(latchPin, HIGH);
}

c est un programme qui permet de faire ça Arduino VU meter - YouTube

mtn j'aimerai pouvoir faire le meme mais avec 2 74HC595

pour ça je pense qu il faut utiliser "daisy chain" comme vous me l avez suggéré.

mais là, je ne sait pas vraiment comment le programmer.

si vous avez des idées, votre aide est la bienvenue :wink:

bonne journée

pour ça je pense qu il faut utiliser "daisy chain" comme vous me l avez suggéré.
mais là, je ne sait pas vraiment comment le programmer.

Grrrrr
Les registres à décalage 74HC595 sont des registres 8 bits.
8 bits = 1 octet
Deux registres à décalage chaînés = 8 + 8 bits = 1 octet + 1 octet

Il faut a chaque fois

  • construire autant d'octets qu'il y de 74HC595 en série,
  • envoyer tous les octets, dans le bon ordre, à chaque mise à jour, même d'un seul bit.

slt

là où je bloque ds mon programme c'est inserer le 2° 74HC595 à ce code :

int current;
int highest = 350;
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
int volume[9] = {0b00000000, 0b00000001, 0b00000011, 0b00000111,
                 0b00001111, 0b00011111, 0b00111111, 0b01111111,
                 0b11111111};
                  
void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  Serial.begin(9600);
}
  
void loop() {
  current = map(analogRead(A0), 0, highest, 0, 9);
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, volume[current]); 
  digitalWrite(latchPin, HIGH);
}

dans ce programme, j'ai simplement ajouté un shiftout, mais en demande au arduino de lire du bit de poids fort à celui de poids faible (MSB)

int current;
int highest = 350;
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
int volume[9] = {0b00000000, 0b00000001, 0b00000011, 0b00000111,
                 0b00001111, 0b00011111, 0b00111111, 0b01111111,
                 0b11111111};
         

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  Serial.begin(9600);
}
   
void loop() {
  current = map(analogRead(A0), 0, highest, 0, 9);
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, volume[current]);
  shiftOut(dataPin, clockPin, MSBFIRST, volume[current]);
  digitalWrite(latchPin, HIGH);
}

je ne comprends pas trop pourquoi ça ne fonctionne pas

voilà, si vous avez des idees, je suis tt ouie

Je ne comprends pas trop pourquoi ça ne fonctionne pas

Au lieu de chercher la facilité et d'appeler "AU SECOURS" au moindre problème place des informations de débogage dans ton programme.

Des Serial.print(" Message qui va bien") tel que Serial.print(" Envoie du premier octet") te permettrons dans 80% des cas de trouver tout seul pourquoi cela ne fonctionne pas.

Autre méthode de débogage : quand ça ne veut pas aller on ne s'obstine pas à rester sur son "gros" programme -> on écrit un tout petit programme de test qui n'est destiné qu'a résoudre UN SEUL problème à la fois.
Dans ton cas écris deux octets , n'importe lesquels cela n'a aucune importance et envoie les dans tes deux 74HC595.
Vérifie au voltmètre que le résultat est correct.

Et SEULEMENT quand c'est Ok tu retourne à ton vrai programme et tu applique ce que tu viens de mettre au point.

L'aide c'est pas pour du prêt à consommer mais pour les 20% de cas qui résistent.

ça y est, j ai trouvé !!

merci pour ton aide ; )

mtn j ai une derniere question et apres je te laisse tranquille ^^

comment fusionner deux programmes ensemble :

je m’explique :

je voudrais mettre ce programme

int current;
int highest = 50;
int latchPin = 8;
int clockPin = 12;
int dataPin = 13;
int volume[9] = {
  0b00000000, 0b00000001, 0b00000011, 0b00000111,
  0b00001111, 0b00011111, 0b00111111, 0b01111111,
  0b11111111};

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  current = map(analogRead(A0), 0, highest, 0, 9);
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, volume[current]);  
  digitalWrite(latchPin, HIGH);
}

(pour les sorties du ez-expender)

et celui ci :

int led[11] = { 0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11}; // Assign the pins for the leds
int leftChannel = 0;  // left channel input
int left, i;

void setup()
{
for (i = 0; i < 11; i++)  // Tell the arduino that the leds are digital outputs
  pinMode(led[i], OUTPUT);
//  Serial.begin(9600); // Uncomment to enable troubleshooting over serial.
}

void loop()
{
left = analogRead(leftChannel);  // read the left channel
// Serial.println(left);  // uncomment to check the raw input.
left = left / 50;    // adjusts the sensitivity  
//  Serial.println(left);  // uncomment to check the modified input.
// left = 1500;  // uncomment to test all leds light.
// left = 0;    // uncomment to check the leds are not lit when the input is 0.

  if (left == 0)  // if the volume is 0 then turn off all leds
   {
   for(i = 0; i < 11; i++)
     {
     digitalWrite(led[i], LOW);
     }
  }
  
  else
  {
   for (i = 0; i < left; i++) // turn on the leds up to the volume level
    {
     digitalWrite(led[i], HIGH);
    }
    
    for(i = i; i < 11; i++)  // turn off the leds above the voltage level
     {
      digitalWrite(led[i], LOW);
     }
  }
}

(pour les sorties du arduino)

dans un meme et unique programme

suffit il de mettre les 2 voidloop ensemble et les 2 voidsetup ensemble ?