Encodeur rotatif Com-10982, un petit peu de code...
Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

Encodeur rotatif Com-10982, un petit peu de code...



  1. #1
    minms

    Encodeur rotatif Com-10982, un petit peu de code...


    ------

    Bonjour,

    Débutant complet en électronique et en programmation, je prépare un projet pour faire de la photo haute vitesse que l'on peut retrouver sur ce forum sous le titre arduino et photo haute vitesse.
    Grâce à l'aide reçu, j'ai réussi à construire mon schéma et à écrire quelques lignes de code pour le faire tourner mais j'avoue avoir du mal à trouver comment faire fonctionner mon encodeur rotatif.
    Cette petite chose vendu chez sparkfun sous la ref com-10982 rassemble un encodeur 24 clics/tour, un bouton poussoir et une led RVB... Intéressant mais pas simple à programmer pour moi.

    En m'inspirant de ceci: http://bildr.org/2012/08/rotary-encoder-arduino/
    J'en suis arrivé au code suivant qui se compile correctement:


    //Les pins 2&3 ne peuvent être change car ce sont les pins d’interruption.
    int encodeurB = 2; //définition de la broche 2 de la carte en tant que variable, encodeur B
    int encodeurA = 3; //définition de la broche 3 de la carte en tant que variable, encodeur A
    int encodeurBouton = 11; //définition de la broche 11 de la carte en tant que variable, B. poussoir
    volatile int retard= 500; //variable pour mémoriser le temps de retardement appeler à évoluer
    volatile long encodeurValue = 0; //je sais pas ce que c’est mais ça doit être important
    long lastencodeurValue = 0 ; //je sais pas ce que c’est mais ça doit être important
    int lastMSB = 0; //je sais pas ce que c’est mais ça doit être important
    int lastLSB = 0; //je sais pas ce que c’est mais ça doit être important

    void setup() {

    pinMode(encodeurB, INPUT); // initialisation de la broche 2 comme étant une entrée
    pinMode(encodeurA, INPUT); //initialisation de la broche 3 comme étant une entrée
    pinMode(encodeurBouton, INPUT); //initialisation de la broche 3 comme étant une entrée
    digitalWrite(encodeurB, HIGH); // initialisation de la broche 2 en pullup
    digitalWrite(encodeurA, HIGH); // initialisation de la broche 3 en pullup
    digitalWrite(encodeurBouton, HIGH); // initialisation de la broche 11 en pullup

    //appelle updateEncodeur() quand un changement Haut ou Bas est détécté sur les broches //interrupt 0 (broche 2) ou interrupt 1 (broche 3)
    attachInterrupt(0, updateEncodeur, CHANGE);
    attachInterrupt(1, updateEncodeur, CHANGE);
    }

    void loop(){
    // déroulement du programme
    if(digitalRead(encodeurBouton) ){
    //bouton non poussé
    }else{
    //bouton poussé
    }
    delay(1000); //ou autres actions
    }

    void updateEncodeur(){
    int MSB = digitalRead(encodeurB); //MSB = most significant bit, bit le plus significatif
    int LSB = digitalRead(encodeurA); //LSB = least significant bit, bit le moins significatif

    int encodeur = (MSB << 1) |LSB; // conversion de la valeur des 2 broches en une valeur unique
    int sum = (retard << 2) | encodeur; // ajouter à la valeur précédente d’encodeur

    if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encodeurValue ++;
    if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encodeurValue --;

    retard = encodeur; //stock la nouvelle valeur de retard
    }


    Le code complet devant faire tourner tout le programme se voit augmenter du code suivant, ne prenant pas en compte l'encodeur mais qui semble se compiler également correctement:


    int retard=500; // variable pour mémoriser le temps de retardement
    int phototransState = 1; //variable pour mémoriser l'état du phototrans
    const int opto_coupl = 13; //définition de la broche 13 de la carte en tant que variable
    const int led_IR = 7; //définition de la broche 7 de la carte en tant que variable, masse Led IR
    const int phototransmass = 6; //définition de la broche 6 de la carte en tant que variable, masse phototransistor
    const int phototrans = 4; //définition de la broche 4 de la carte en tant que variable, phototrans

    void setup() //fonction d'initialisation de la carte
    {
    pinMode(opto_coupl,OUTPUT); //initialisation de la broche 13 comme étant une sortie
    pinMode(led_IR, OUTPUT); //initialisation de la broche 7 comme étant une sortie
    pinMode(phototransmass, OUTPUT); //initialisation de la broche 6 comme étant une sortie
    pinMode(phototrans, INPUT); //initialisation de la broche 4 comme étant une entrée
    }

    void loop() //fonction principale, elle se répète à l'infini
    {
    digitalWrite(led_IR, LOW); //allume LED IR
    digitalWrite(phototransmass, LOW); //allume phototrans
    phototransState=digitalRead(ph ototrans); //lit la valeur de l'état du phototrans

    if(phototransState!=1) //teste si le faisceau est coupé
    {
    delay(retard); // fait une pause de la valeur de retard
    digitalWrite(led_IR, HIGH); // coupe LED IR
    digitalWrite(phototransmass, HIGH); // coupe phototrans
    digitalWrite(opto_coupl, HIGH); // déclenche optocoupleur
    delay(50) ; //durée d'impulsion vers flash
    digitalWrite(opto_coupl, LOW); // coupe optocoupleur
    delay(15000); // fait une pause de 15000 milli-seconde avant reprise du programme
    }
    }


    Suite au prochain message...


    Tout cela est relatif au schéma suivant:

    -----
    Images attachées Images attachées  
    Dernière modification par minms ; 02/11/2012 à 16h01.

  2. #2
    minms

    Re : Encodeur rotatif Com-10982, un petit peu de code...

    Forcément, il faut que ça se gâte à un moment...

    L'ensemble donne donc la chose suivante qui OH surprise bloque sur
    attachInterrupt(0, updateEncodeur, CHANGE);
    relatif à la ligne volatile long encodeurValue = 0;
    et sur MSB...


    volatile*int retard = 500; //variable pour mémoriser le temps de retardement appeler à évoluer
    const int opto_coupl = 13; //définition de la broche 13 de la carte en tant que variable, optocoupl
    const int led_IR = 7; //définition de la broche 7 de la carte en tant que variable, masse Led IR
    const int phototransmass = 6; //définition de la broche 6 de la carte en tant que variable, masse phototrans
    const int phototrans = 4; //définition de la broche 4 de la carte en tant que variable, phototrans
    int phototransState = 1; //variable pour mémoriser l'état du phototrans
    int encodeurB = 2; //définition de la broche 2 de la carte en tant que variable, encodeur B
    int encodeurA = 3; //définition de la broche 3 de la carte en tant que variable, encodeur A
    int encodeurC = 12; //définition de la broche 12 de la carte en tant que variable, encodeur C
    int encodeurBouton = 11; //définition de la broche 11 de la carte en tant que variable, B. poussoir
    int encodeurBoutonState = 0; //variable pour mémoriser l'état du bouton
    volatile*long encodeurValue = 0; //je sais pas ce que c’est mais ça doit être important
    long lastencodeurValue = 0 ; //je sais pas ce que c’est mais ça doit être important
    int lastMSB = 0; //je sais pas ce que c’est mais ça doit être important
    int lastLSB = 0; //je sais pas ce que c’est mais ça doit être important
    const int encod_1 = 10; //définition de la broche 10 de la carte en tant que variable, led rouge
    const int encod_2 = 9; //définition de la broche 9 de la carte en tant que variable, led verte
    const int encod_4 = 8; //définition de la broche 8 de la carte en tant que variable, led bleue

    void setup() //fonction d'initialisation de la carte
    {
    pinMode(opto_coupl, OUTPUT); //initialisation de la broche 13 comme étant une sortie
    pinMode(led_IR, OUTPUT); //initialisation de la broche 7 comme étant une sortie
    pinMode(phototransmass, OUTPUT); //initialisation de la broche 6 comme étant une sortie
    pinMode(phototrans, INPUT); //initialisation de la broche 4 comme étant une entrée
    pinMode(encodeurB, INPUT); // initialisation de la broche 2 comme étant une entrée
    pinMode(encodeurA, INPUT); //initialisation de la broche 3 comme étant une entrée
    pinMode(encodeurC, OUTPUT); //définition de la broche 12 comme étant une sortie
    pinMode(encodeurBouton, INPUT); //initialisation de la broche 11 comme étant une entrée
    digitalWrite(encodeurB, HIGH); // initialisation de la broche 2 en pullup
    digitalWrite(encodeurA, HIGH); // initialisation de la broche 3 en pullup
    digitalWrite(encodeurBouton, HIGH); // initialisation de la broche 11 en pullup
    pinMode(encod_1, OUTPUT); //initialisation de la broche 10 comme étant une sortie
    pinMode(encod_2, OUTPUT); //initialisation de la broche 9 comme étant une sortie
    pinMode(encod_4, OUTPUT); //initialisation de la broche 8 comme étant une sortie
    *//appelle updateEncodeur() quand un changement Haut ou Bas est détécté sur les broches //interrupt 0 (broche 2) ou interrupt 1 (broche 3)
    attachInterrupt(0, updateEncodeur, CHANGE);
    attachInterrupt(1, updateEncodeur, CHANGE);
    }
    *
    void loop() //fonction principale, elle se répète à l'infini
    {
    digitalWrite(encodeurC, LOW); //allume encodeur, le met en attente
    digitalWrite(led_IR, LOW); //allume Led IR
    digitalWrite(phototransmass, LOW); //allume phototrans
    phototransState=digitalRead(phototrans); //lit la valeur de l'état du phototrans
    encodeurBoutonState*=*digitalRead(encodeurBouton); //lit la valeur de l'état du bouton

    if(encodeurBoutonState!=0) ; //teste si le bouton est poussé
    {*
    digitalWrite (led_IR, HIGH); //éteint LED IR
    digitalWrite(phototransmass, HIGH); //éteint phototrans

    if(retard == 500); //si retard = 500 milli-seconde
    {
    digitalWrite(encod_1, LOW); //allume Led rouge
    }
    if(retard >500); //si retard > 500 milli-seconde
    {
    digitalWrite(encod_2, LOW); //allume Led verte
    }
    if(retard<500); //si retard < 500 milli-seconde
    {
    digitalWrite (encod_4, LOW); //allume Led Bleu
    }

    void updateEncodeur()
    int MSB = digitalRead(encodeurB); //MSB = most significant bit, bit le plus significatif
    int LSB = digitalRead(encodeurA); //LSB = least significant bit, bit le moins significatif

    int encodeur = (MSB << 1) |LSB; //conversion de la valeur des 2 broches en une valeur unique
    int sum = (retard << 2) | encodeur; //ajouter à la valeur précédente d’encodeur
    if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encodeurValue ++;
    if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encodeurValue --;
    retard*=*encodeur;**//stock la nouvelle valeur de retard
    }

    if(phototransState!=1); //teste si le faisceau IR est coupé
    {
    delay(retard); //fait une pause de la valeur de retard
    digitalWrite(led_IR, HIGH); //coupe LED IR
    digitalWrite(phototransmass, HIGH); //coupe phototrans
    digitalWrite(opto_coupl, HIGH); //déclenche optocoupleur
    delay(50); //durée d'impulsion vers flash
    digitalWrite(opto_coupl, LOW); //coupe optocoupleur
    delay(15000); //fait une pause de 15000 milli-seconde avant reprise du programme
    }
    }
    Ou me suis-je planté?

    Question subsidiaire,
    Que faire de la broche C de l’encodeur relié au pin 12 de l’arduino? La brancher plutôt sur le pin
    GND ?

    Ici, si je ne m’abuse, l’interruption est produite par la rotation de l’encodeur, mais je souhaiterais que l’interruption soit produite par l’appui sur le on poussoir. Dois-je recablé mon schéma pour poser la broche du BP sur une des broches 2ou 3 de l’arduino ?


    Merci du coup de main...

  3. #3
    gabuzo

    Re : Encodeur rotatif Com-10982, un petit peu de code...

    Tu t'es planté euh... Partout !

    Tu te compliques la vie là où il n'y a pas la place.

    Tu commences par regarder comment se branche ton encodeur : http://dlnmh9ip6v2uc.cloudfront.net/...8-6H(SPEC).pdf

    Tu relies la broche C à la masse en ayant pris soin de rajouter les résitances de pull up pour A et B
    Tu detectes une interruption sur A et tu lis la valeur de B. Si B est à 0 tu décrementes de 1 la valeur de ta tempo (en faisant gaffe que la tempo ne peut pas être inférieure à 0), si B est à 1 tu incrementes de 1 la valeur de ta tempo.
    B ne doit pas être branché sur une broche d'interruption !

    Tu vires ...
    void updateEncodeur()
    int MSB = digitalRead(encodeurB); //MSB = most significant bit, bit le plus significatif
    int LSB = digitalRead(encodeurA); //LSB = least significant bit, bit le moins significatif

    int encodeur = (MSB << 1) |LSB; //conversion de la valeur des 2 broches en une valeur unique
    int sum = (retard << 2) | encodeur; //ajouter à la valeur précédente d’encodeur
    if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encodeurValue ++;
    if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encodeurValue --;
    retard*=*encodeur;**//stock la nouvelle valeur de retard
    }
    ...qui ne sert à rien.

    Si le coeur t'en dit tu utilises la broche d'interruption que tu as liberé pour mettre ton BP dessus.
    Je suis Charlie

  4. #4
    minms

    Re : Encodeur rotatif Com-10982, un petit peu de code...

    Lut'


    Tu t'es planté euh... Partout !
    C'est un peu sévère ça!!

    Le code à été repiqué de la version avec BP du site suivant, http://bildr.org/
    J'ai bien pris en compte ta remarque sur le codage qui me semble en effet bien plus simple mais il apparaît qu'il peut exister des différence de fiabilité importante selon les choix... Je garde et testerai si je ne m'en sort pas.

    D'autre part,
    B ne doit pas être branché sur une broche d'interruption !
    Pourquoi ? Le branchement est également inspiré du site http://bildr.org/ auquel renvoie le site du fabricant (sparkfun)

    Sinon bien heureux que tout charabia ne servent à rien mais la dernière ligne me semble importante si je souhaite garder la nouvelle valeur en mémoire... non?


    A part ça, une idée sur

    attachInterrupt(0, updateEncodeur, CHANGE); qui semble bloquer...


    Merci

  5. A voir en vidéo sur Futura
  6. #5
    gabuzo

    Re : Encodeur rotatif Com-10982, un petit peu de code...

    Citation Envoyé par minms Voir le message

    C'est un peu sévère ça!!
    C'est vrai que c'est un poil sévère...

    J'ai enfin reussi à démeller l'usine à gaz qui te sert de code, je ne vois pas bien l'intérêt de pondre des trucs aussi tarabiscotés mais sur le papier (enfin sur l'écran) ça devrait pouvoir fonctionner.
    Pourquoi ça bloque sur le "attachInterrupt(0, updateEncodeur, CHANGE); " ? Aucune idée ! Si tu posais la question sur un forum vraiment dédié Arduino tu aurais pet-être plus de chance de trouver une réponse.
    Ca c'est pour la forme.

    Pour le fond je reste persuadé qu'il est plus facile de dépatouiller un programme simple qu'on a écrit soi-même qu'un programme compliqué dont on a fait un simple copier-coller et auquel on ne comprend rien.

    A ta place je testerai un code simple juste pour l'encodeur (par exemple allumer une led s'il tourne dans un sens et en allumer une autre s'il tourne dans l'autre) avec interruption sur A et lecture logique de B. Si tu arrives à faire fonctionner ça le reste devient de la rigolade.
    Je suis Charlie

  7. #6
    minms

    Re : Encodeur rotatif Com-10982, un petit peu de code...

    AOURF...

    J'ai l'immense plaisir de vous fournir ci dessous un code qui se compilationne à merveille...
    La cacouille sur attachInterrupt(0, updateEncodeur, CHANGE); venait du fait que void updateEncoder() était inclue dans void loop() ... Une connerie de } en somme...

    Le nouveau schéma du montage suit, nouveauté:
    encodeur C part maintenant directement à la masse, et le BP de l'encodeur reçoit un pull down. Quelques changements de pin en plus pour que ce soit plus clair.

    Quote
    Code:
    const int opto_coupl = 13;   //définition de la broche 13 de la carte en tant que variable, optocoupl
    
    const int encod_1 = 10;   //définition de la broche 10 de la carte en tant que variable, led rouge
    const int encod_2 = 9;   //définition de la broche 9 de la carte en tant que variable, led verte
    const int encod_4 = 8;   //définition de la broche 8 de la carte en tant que variable, led bleue
    
    const int led_IR = 7;   //définition de la broche 7 de la carte en tant que variable, masse Led IR
    const int phototransmass = 6;   //définition de la broche 6 de la carte en tant que variable, masse phototrans
    const int phototrans = 5;   //définition de la broche 5 de la carte en tant que variable, phototrans
    int phototransstate = 1; // memorise état du phototrans
    
    int encodeurbouton = 4; //définition de la broche 4 de la carte en tant que variable,BP encodeur 
    int encodeurboutonstate = 0; // memorise état du BP  
    int encodeurB = 3; //définition de la broche 3 de la carte en tant que variable, encodeur B
    int encodeurA= 2; //définition de la broche 2 de la carte en tant que variable, encodeur A
    
    volatile int lastEncoded = 0; //je sais pas ce que c’est mais ça doit être important
    volatile long encoderValue = 0; //je sais pas ce que c’est mais ça doit être important
    long lastencoderValue = 0; //je sais pas ce que c’est mais ça doit être important
    
    int lastMSB = 0; //je sais pas ce que c’est mais ça doit être important
    int lastLSB = 0; //je sais pas ce que c’est mais ça doit être important
    
    
    void setup() 
    {
    pinMode(opto_coupl, OUTPUT);   //initialisation de la broche 13 comme étant une sortie
    
    pinMode(encod_1, OUTPUT);   //initialisation de la broche 10 comme étant une sortie
    pinMode(encod_2, OUTPUT);   //initialisation de la broche 9 comme étant une sortie
    pinMode(encod_4, OUTPUT);   //initialisation de la broche 8 comme étant une sortie
    
    pinMode(led_IR, OUTPUT);   //initialisation de la broche 7 comme étant une sortie
    pinMode(phototransmass, OUTPUT);   //initialisation de la broche 6 comme étant une sortie
    pinMode(phototrans, INPUT);   //initialisation de la broche 5 comme étant une entrée
    
    pinMode(encodeurbouton, INPUT);  //initialisation de la broche 4 comme étant une entrée
    pinMode(encodeurB, INPUT);  //initialisation de la broche 3 comme étant une entrée
    digitalWrite(encodeurB, HIGH);
    pinMode(encodeurA, INPUT);  //initialisation de la broche 2 comme étant une entrée
     digitalWrite(encodeurA, HIGH);
     digitalWrite(encodeurB, HIGH); 
    
    attachInterrupt (0, updateEncoder, CHANGE); 
    attachInterrupt (1, updateEncoder, CHANGE); 
    //appelle updateEncodeur() quand un changement Haut ou Bas est détécté sur les broches 
    //interrupt 0 (broche 2) ou interrupt 1 (broche 3)
    }
    
    void loop()  //fonction principale, elle se répète à l'infini
    { 
    encodeurboutonstate = digitalRead(encodeurbouton);  //lit la valeur de l'état du bouton
       if (encodeurboutonstate==0) ;  //teste si le bouton est laché
       {
       noInterrupts(); // désactivation des interruptions 
       digitalWrite(led_IR, LOW); //allume Led IR
       digitalWrite(phototransmass, LOW);  //allume phototrans 
       phototransstate=digitalRead(phototrans);  //lit la valeur de l'état du phototrans
           if(phototransstate==0);  //teste si le faisceau IR est coupé
          {
          delay(lastEncoded);  //fait une pause de la valeur de retard
          digitalWrite(led_IR, HIGH);  //coupe LED IR
          digitalWrite(phototransmass, HIGH);  //coupe phototrans
          digitalWrite(opto_coupl, HIGH);  //déclenche optocoupleur 
          delay(100);  //durée d'impulsion vers flash
          digitalWrite(opto_coupl, LOW);  //coupe optocoupleur
          delay(10000);  //fait une pause de 10000 milli-seconde avant reprise du programme
          }
       }
    
       if(encodeurboutonstate==1) ;  //teste si le bouton est poussé
       {
                        interrupts(); // réactivation des interruptions 
          if(lastEncoded == 500);  //si retard = 500 milli-seconde
          {
          digitalWrite(encod_1, LOW); //allume Led rouge
          }
          if(lastEncoded >500);  //si retard > 500 milli-seconde
          {
          digitalWrite(encod_2, LOW); //allume Led verte
          }
          if(lastEncoded <500);  //si retard < 500 milli-seconde
          {
          digitalWrite (encod_4, LOW);  //allume Led Bleu
          }
        }
    }
       void updateEncoder()
       {
        int MSB = digitalRead(encodeurA);  
        int LSB = digitalRead(encodeurB);  
    
        int encoded = (MSB << 1) |LSB;  
        int sum  = (lastEncoded << 2) | encoded;  
    
         if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
         if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;
    
         lastEncoded = encoded;  
       }


    Une petite question tout de même, lastEncoded est bien la valeur retard qui servira à commander la fonction delay dans
    Quote
    delay(lastEncoded); //fait une pause de la valeur de retard

    ??

    Back to the bread board...
    Images attachées Images attachées  
    Dernière modification par Jack ; 06/11/2012 à 16h02.

  8. #7
    Jack
    Modérateur

    Re : Encodeur rotatif Com-10982, un petit peu de code...

    Prière de mettre tout seul les balises code la prochaine fois. Merci.

  9. #8
    gabuzo

    Re : Encodeur rotatif Com-10982, un petit peu de code...

    Citation Envoyé par minms Voir le message

    Une petite question tout de même, lastEncoded est bien la valeur retard qui servira à commander la fonction delay dans
    Quote
    delay(lastEncoded); //fait une pause de la valeur de retard

    ??

    Back to the bread board...
    Oui ! Par contre pour connaitre la valeur précise entre 0 et 499 ms ça va être coton
    Je suis Charlie

  10. #9
    minms

    Re : Encodeur rotatif Com-10982, un petit peu de code...

    Salut Gabuzo,

    Oui c'est vrai mais pour l'instant je n'ai pas de studio dédié ce qui m'oblige à démonter après chaque séance photo. Je part donc sur le fonctionnement suivant: je monte mon affaire, barrière à peu près à 50 cm de la surface de l'eau (a affiner), puis je shoote une première fois et je règle ensuite grâce à l'encodeur un peu au jugé jusqu’à être dans les clou pour la séance...

    On essaye déjà de faire rouler la chose et on améliorera plus tard... lol


    à bientot.

  11. #10
    minms

    Re : Encodeur rotatif Com-10982, un petit peu de code...

    Yep,

    Ben ça marche po les zamis... Résultats, le led IR ne s'allume pas, les Leds Bleu et Verte de l'encodeur s'allument en permanence etc...
    Si je pige bien, le code fournit par http://bildr.org/2012/08/rotary-encoder-arduino/ est naze (j'avais pourtant déjà corrigé des trucs genre if(digitalRead(encoderSwitchPi n2)) ... super c'est le site renvoyé par sparkfun... je vais chercher autre chose... En attendant, VACANCES.

    à Bientot.

Discussions similaires

  1. encodeur rotatif
    Par bilel90 dans le forum Électronique
    Réponses: 1
    Dernier message: 03/07/2012, 12h20
  2. Encodeur rotatif
    Par Mushussu dans le forum Électronique
    Réponses: 11
    Dernier message: 24/05/2012, 07h23
  3. Où trouver un encodeur rotatif?
    Par invitea28fcae9 dans le forum Électronique
    Réponses: 7
    Dernier message: 07/06/2011, 16h06
  4. Encodeur rotatif a sortie analogique
    Par invite85f50251 dans le forum Électronique
    Réponses: 11
    Dernier message: 25/05/2007, 08h54
  5. Encodeur rotatif et sens
    Par thomasalbert1993 dans le forum Électronique
    Réponses: 34
    Dernier message: 08/02/2007, 13h22
Découvrez nos comparatifs produits sur l'informatique et les technologies.