Pages: [1]   Go Down
Author Topic: Metro, shift register 74hc595, interuption , un beau casse tete!!!  (Read 663 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bonjour,
 je suis en train de chercher comment , associer tout ca:
Metro, shift register 74hc595 et interuption

Mon programme doit commander une animation lumineuse de 8 led, donc j'opte pour l'utilisation du registre shift qui permet de coder ça en séquence binaire bien pratique car visuelles,

Cette animation doit pouvoir être interrompue à tout moment par un appui sur un bouton , que j'ai donc câblé en pin2 pour bénéficier de l’interruption, qui, lui déclenche un relais qui commande une prise d'image   , un servo moteur et une autre animation lumineuse.

la partie italique
ne me pause pas de problème, pour l'instant mais je n'ai pas encore intégrer le 74h595

cela dit,


si je m'en tiens a ce que je lis , ce CI a besoin des pin 2.3.4 or j'y ai un bouton (sur la 2) et qui doit être hyper réactif,

j'ai un peut de mal à piger l'utilisation de metro pour intercaler mes allumage/extinction de leds  et la doc la dessus est un peut maigre, 

je précise que l'utilisation de delay() est impossible en première partie pour ne pas rater l’appui  sur le bouton mais que ca ne pause pas de problème après cet appui,

voici le code
Code:
#include <Servo.h>

Servo myservo; 


const int buttonPin = 2;     // bouton  de la ciblesur pin 2
const int ledPin =  12; // led 12 sortie pour relais reed
int ledPins[] = {14,15,16,17,18,19,8,10,11};
int buttonState = 0;
void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  myservo.attach(9);  // servo sur pin 9
  myservo.write(40); //initialise le servo en position repos zero
  delay(20); // pour stabilisation
}


void loop()
{
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {  // bouton etat haut detecté 
    digitalWrite(ledPin, HIGH);  // led ON
    delay(1000);
    myservo.write(178);       // va en butée inverse     
    delay(250);  // stabilisation 250 ms
    digitalWrite(ledPin, LOW);  // led OFF
    myservo.write(40); // retour en zero
    delay(20); // pour stabilisation

/*
si la cible est atteinte, les led font un truc a la k2000
à etoffer plus tard
*/
int delayTime = 100;
for(int i = 8; i > 0; i--){
    digitalWrite(ledPins[i], HIGH);
    delay(delayTime); 
     for(int i = 1; i <= 8; i++){ 
    digitalWrite(ledPins[i], LOW); 
    delay(delayTime);               
  }
  }for(int i = 0; i <= 8; i++){
    digitalWrite(ledPins[i], HIGH);
    delay(delayTime); 
     for(int i = 8; i >= 0; i--){
       digitalWrite(ledPins[i], LOW);   delay(delayTime);   
  }
  } }
  //reste a intégrer  des animation (type MaFonction1,MaFonction2...)avant l'impact
}

bonne journée et merci a ceux qui prendrais le temps de me lire et de me conseiller, parce que la je sèche un peu
Logged

france
Offline Offline
God Member
*****
Karma: 8
Posts: 692
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ce CI a besoin des pin 2.3.4 or j'y ai un bouton (sur la 2)
Qu'est ce qui l'empêche de marcher sur 3 4 et 5 ?
Logged

Christian

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

heu c'est pour moi la question?

si oui , j'ai juste trouvé aucun exemple de code comme ca , alors comme je suis un novice qui fait des test avec des arduino qui fonctionnent, des fois , en piquant des bouts de codes a droite a gauche,mais qui n'ai aucune formation ni en elec ni en programmation ,(mais je jouais beaucoup aux lego )je me disait que peut être que ca marche que sur 2.3.4 comme les interruptions sur 2 et 3 par exemple, je me pose peut être trop de questions , un peu comme dans la vie? smiley-roll-blue

mais si tu me dit que ca ne pose pas de problème, alors voila déjà une avancé  pas mal,

là j'ai donc des del sur 3->19 mais si je passe en 74hc595 ça libéré de la place


oups je viens de me rendre compte que j'ai 9 lampe a gérer donc un 74hc595ne suffit plus argll!!!
donc je reste comme je suis mais je dois trouver comment temporiser mes animations avec autre chose que delay!!!!!

quelqu'un saurait m'orienter?
j'ai déjà essayé de comprendre mstimer2 et metro mais je ne vois pas comment on fait avec 9 led
merci
Logged

France S-O ou exil en IDF
Offline Offline
Edison Member
*
Karma: 25
Posts: 1905
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Regarde le code de la fonction shiftout et tu verras que c'est uniquement toi qui décide quelles pins utiliser.
Fonction shiftout contenue dans le fichier wiring_shift.c :
Code:
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{
uint8_t i;

for (i = 0; i < 8; i++)  {
if (bitOrder == LSBFIRST)
digitalWrite(dataPin, !!(val & (1 << i)));
else
digitalWrite(dataPin, !!(val & (1 << (7 - i))));

digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
}
;
Tu peux même utiliser les pins analogiques comme des pins numériques, le seul fait de faire pinMode( A0, OUTPUT) mettra A0 en mode digital. D'ailleurs si tu lit bien les explications sur le site Arduino tu verra que le pin A0 est aussi dénommer D14, A1-> D15 etc....

Pour ton besoin de commander 9 leds c'est simple un registre à décalage eh bien ça décale ! smiley-mr-green
Plus sérieusement les registres à décalage se chaînent : sortie du registre n sur l'entrée du registre (n+1)

Dans ton cas tu va devoir utiliser 2 registres à décalage.
Il faut relier entre elles toutes les broches "horloges" et toutes les broches "latch".
Pour les données tu relies la pin que tu as choisi pour les données sur l'entrée du premier registre et la sortie de ce premier registre sur l'entrée du deuxième .
Et ainsi de suite quelque soit le nombre de registre.
Bien sûr il te faudra envoyer autant de mot de 8 bits qu'il y a de registres.
Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3010
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Metro, c'est quoi !!!

Tu parles d'interruption mais tu ne les utilises pas.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

excusez ma confusion, je ne suis pas trop  rigoureux ,j' ai testé pleins de truc et je me melange, la j"en suis là,
Code:
#include <Servo.h>
#include <Metro.h>
Metro ledMetro = Metro(1500);
Servo myservo; 
boolean etat = HIGH;

const int buttonPin = 2;     // bouton sur pin 2
const int reedrelay =  12; // led 12 sortie pour reed
int ledPins[] = {14,15,16,17,18,19,8,10,11};
int buttonState = 0;

void Mapattern()
{
  int delayTime = 200;
  for(int i = 8; i >= 0; i--){
    digitalWrite(ledPins[i], HIGH);
    delay(delayTime);  }
     for(int i = 0; i <= 8; i++){ 
    digitalWrite(ledPins[i], LOW); 
    delay(delayTime);               
  }
 
 }
 

void setup()
{
  pinMode(reedrelay, OUTPUT);
  pinMode(buttonPin, INPUT);
  myservo.attach(9);  // servo sur pin 9
  myservo.write(40); //initialise le servo en position repos zero
  delay(20); // pour stabilisation
}


void loop()
{
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {  // bouton etat haut detecté 
 
    digitalWrite(reedrelay, HIGH);  // led ON
    delay(100);
    myservo.write(178);       // va en butée inverse     
    delay(350);  // stabilisation 250 ms
    digitalWrite(reedrelay, LOW);  // led OFF
    myservo.write(40); // retour en zero
    delay(20); // pour stabilisation
      Mapattern();
    }
else {
  if (ledMetro.check() == 1) { // check if the metro has passed it's interval .

  for (int i = 0; i <= 8; i++ ) {
    digitalWrite(ledPins[i], etat);
   
    etat=!etat;
     for(int i = 8; i >= 0; i--){
       
       digitalWrite(ledPins[i], etat);   
 
}}}}


  //verifier les histoires de chenillard
}

ca marche , mais c'est pas le top niveau création de paterne lumineuses
Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3010
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu utilises Metro mais en même temps tu programmes des événements récurrents avec des délais.
Je pense qu'il doit y avoir moyen de rendre ça beaucoup plus réactif en supprimant les délais et en exploitant plusieurs objets Metro.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

je cherche a comprendre mieux métro, mais je ne suis pas un as de la programmation, en fait je suis un parfait néophyte, j'ai réussit a coder deux ou fois truc en recopiant des bouts de codes a droit a gauche l’année dernière sur  des utilisations de waveshield,

mais je suis assez mauvais en anglais (mais les traduction google m'aident un peu, ) et je n'ai pas été longtemps à l’école :smiley-red
alors je m'y attelle à tâtons et les didacticiels du site du zero sont en berne!!!

comme je le disais, les élément ou je me permet du delay surviennent à un moment ou  le reste du système est immobilisé,  cela dit , en vue d’améliorations futurs ....

mais j'ai du mal à piger le truc pour faire des chenillards  en metro , je viens de tomber sur ca: http://playground.arduino.cc/Code/Timer
 ca a l'air bien aussi mais je m'y perd un peu...
 
 
si tu peut m'orienter sur l’utilisation de metro  avec 9 led parce que je n'arrive qu'a les faire clignoter toutes ensembles,
merci
Logged

Pages: [1]   Go Up
Jump to: