Go Down

Topic: ez expander : mettre un programme (Read 5109 times) previous topic - next topic

costiflex

bonjour bonjour,

j ai trouvé ce code :

Code: [Select]
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 http://www.youtube.com/watch?v=chjxg2eqfPg

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 ;)

bonne journée

68tjs

Quote
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.

costiflex

#17
Jun 02, 2013, 10:26 am Last Edit: Jun 02, 2013, 10:33 am by costiflex Reason: 1
slt


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


Code: [Select]

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)


Code: [Select]

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


68tjs

#18
Jun 02, 2013, 11:00 am Last Edit: Jun 02, 2013, 11:04 am by 68tjs Reason: 1
Quote
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.

costiflex

ç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


Code: [Select]
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 :

Code: [Select]


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 ?

68tjs

Mmouais.
A condition de vérifier qu'il n'y a pas d'incohérence -> a toi de jouer

Et pourquoi pas transférer le contenu du setup du premier prog dans une fonction setup_prog_1 et celui du 2eme dans setup_prog_2. le source devient:
Code: [Select]

void setup_prog_1()
{
   tatatata 1 ;
}

void setup_prog_2()
{
      tatatata 2;
}

void setup()    // c'est la fonction setup obligatoire pour l'ide arduino
{
    setup_prog_1();
    setup_prog_2();
}

Loop -> idem


Cela permet de ne pas mélanger les choux et les carottes.
C'est plus facile à mettre au point. Si tu as un soucis avec loop_prog_2() tu sais aller directement dans setup_prog_2

Bien évidement tu peut donner n'importe quel nom aux fonctions.

costiflex

Bonsoir

Code: [Select]
int led[11] = {0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11};
int leftChannel = 0;
int left, i;

int current;


int highest = 20;


int latchPin = 8;
int clockPin = 12;
int dataPin = 13;

int volume[9] = {0b00000000, 0b00000001, 0b00000011, 0b00000111,
                 0b00001111, 0b00011111, 0b00111111, 0b01111111,
                 0b11111111};
                 
void setup()
{
  for (i = 0; i < 11; i++) 
  pinMode(led[i], OUTPUT);
 
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  Serial.begin(9600);
}


void loop() {

 
 
 
  left = analogRead(leftChannel); 

left = left / 15;   


  if (left == 0) 
   {
   for(i = 0; i < 11; i++)
     {
     digitalWrite(led[i], LOW);
     }
  }
 
  else
  {
   for (i = 0; i < left; i++)
    {
     digitalWrite(led[i], HIGH);
    }
   
    for(i = i; i < 11; i++) 
     {
      digitalWrite(led[i], LOW);
     }
  }
 
  if (digitalRead(10) == HIGH)
 
  { 
current = map(left, 0, highest, 0, 9);

  digitalWrite(latchPin, LOW);
 
 
  shiftOut(dataPin, clockPin, LSBFIRST, volume[current]);
   
 
  digitalWrite(latchPin, HIGH);
  }
 
  else
  {
     digitalWrite(latchPin, LOW);
 
 
  shiftOut(dataPin, clockPin, LSBFIRST, 0);
   
 
  digitalWrite(latchPin, HIGH);
 
  }
 
 
 
}



ce programme fonctionne à part le fait que les sorties 0 et 1 du arduino restent tjrs activées mm qd il n'y a pas de musique

je ne perviens pas à résoudre ce probleme

si qq'un pouvait m'aider, ça serai sympas

Go Up