Go Down

Topic: Changement de programme et de capteur " Machine Arcade Basket-ball " . (Read 1 time) previous topic - next topic

GR13DeStRoY

Bonjour à tous ,
J'ai fortement était aider par Mr " Lesept " dans mon projet " Machine Arcade Basket-ball " .
Le projet fonctionne très bien mis à part les capteurs qui ne sont pas adapté pour ce projet !
Donc j'ai créer cette machine pour faire du 1 contre 1 dans un temps impartit , sous 3 manches !
La machine calcul le temps de chaque manche ( 3 manches au total , de 1 minute) , et calcul le nombre de passage de balles dans les paniers ( soit un capteur par panier ) .
La machine fonctionne parfaitement bien , mis à part les capteurs qui ne sont pas adaptés !
Les capteurs se sont des SHARP GP2Y0D815Z0F Digital Distance 20 cm .
Je voudrais les remplacés , en créant un deuxième cercle sous les paniers principal et y déposé de donc un capteur de chaque côté : Mini 38KHz IR Infrared Transmitter Module + IR Infrared Receiver Sensor Module For Arduino RPI STM32 .
Cela va tracer une ligne et sera coupé par le passage des balles !
Je n'ai aucune connaissance en Arduino , d'ou toute la difficulté à remplacé ses deux capteurs !
J'en ai appris avec Mr Lesept avec qui nous avons réussit une première fois avec les anciens capteurs !
Je vous met l'ancien code à remplacé , par les deux nouveaux capteurs !
L'ancien code se trouvera dans une réponse si dessous !
Merci

GR13DeStRoY

Voici donc l'ancien code , il faut tout simplement retiré les deux anciens capteurs et y placé les deux nouveaux , ce qui met impossible à mon niveau .
Merci à vous .
 Impossible de le mettre cela dépasse 9.000 caractères ...

lesept

Tu peux le poster en plusieurs messages. Mais avant, montre ce que tu as testé pour le nouveau capteur. Pense à utiliser CTRL T dans l'IDE pour indenter correctement ton code avant de le coller dans ton message, c'est plus facile à lire.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

GR13DeStRoY

Alors voici donc l'ancien code 1ère partie :
Code: [Select]
/*
     Affichage jeu de basket
    ----> LESEPT <---- (août 2018)
*/
#include <TM1637Display.h>
#include <SharpDistSensor.h>

// Les pins LED RGB divent être PWM : D2 à D13
#define LEDM1R 2       // PIN LED Manche 1 Red
#define LEDM1G 3       // PIN LED Manche 1 Green
#define LEDM1B 4       // PIN LED Manche 1 Blue
#define LEDM2R 5       // PIN LED Manche 2 Red
#define LEDM2G 6       // PIN LED Manche 2 Green
#define LEDM2B 7       // PIN LED Manche 2 Blue
#define LEDM3R 8       // PIN LED Manche 3 Red
#define LEDM3G 9       // PIN LED Manche 3 Green
#define LEDM3B 10      // PIN LED Manche 3 Blue
#define SHARP1 A0      // PIN DE SHARP JOUEUR 1
#define SHARP2 A1      // PIN DE SHARP JOUEUR 2
#define DISP1_CLK 23   // PINS DE L AFFICHEUR SCORE JOUEUR 1
#define DISP1_DIO 25
#define DISP2_CLK 27   // PINS DE L AFFICHEUR SCORE JOUEUR 2
#define DISP2_DIO 29
#define DISPT_CLK 31   // PINS DU TIMER
#define DISPT_DIO 33
#define DISPH_CLK 35   // PINS DU HIGH SCORE
#define DISPH_DIO 37

#define MINUTE 60
#define SECONDES 1
#define MANCHES 3

//DECLARATION DES AFFICHEURS
TM1637Display score1(DISP1_CLK, DISP1_DIO);  // Score joueur 1
TM1637Display score2(DISP2_CLK, DISP2_DIO);  // Score joueur 2
TM1637Display timer(DISPT_CLK, DISPT_DIO);     // Compte à rebours
TM1637Display highscore(DISPH_CLK, DISPH_DIO); // High score

// Window size of the median filter (odd number, 1 = no filtering)
const byte medianFilterWindowSize = 5;
SharpDistSensor CapteurJ1(SHARP1, medianFilterWindowSize);
SharpDistSensor CapteurJ2(SHARP2, medianFilterWindowSize);
#define SEUILBALLON 80

// VARIABLES GLOBALES
byte nb_pts1;     // NB DE POINTS (0 à 255) joueur 1
byte nb_pts2;     // NB DE POINTS (0 à 255) joueur 2
byte vainqueur[3]={0,0,0};
byte high = 0;    // Mémoire du score le plus élevé des manches
byte numeromanche = 1;
unsigned long chrono;
unsigned long chrono1 = 0; // Temporisation capteur après un panier
unsigned long chrono2 = 0;
unsigned long temps = 1000;
unsigned long tempopanier = 500; // Durée de la temporisation du capteur
int tempsmax; // Temps max par manche
boolean capteur1; // état du capteur du joueur 1
boolean capteur2;
unsigned int distance1; // Distance mesurée par le capteur du joueur 1
unsigned int distance2;

void setup() {
  Serial.begin(9600);
  // CONFIG PIN LED (Common cathode)
  pinMode(LEDM1R, OUTPUT);
  pinMode(LEDM1G, OUTPUT);
  pinMode(LEDM1B, OUTPUT);
  pinMode(LEDM2R, OUTPUT);
  pinMode(LEDM2G, OUTPUT);
  pinMode(LEDM2B, OUTPUT);
  pinMode(LEDM3R, OUTPUT);
  pinMode(LEDM3G, OUTPUT);
  pinMode(LEDM3B, OUTPUT);
  for(int i=2; i<11; i++) analogWrite(i, 0);
  // Init affichage
  score1.setBrightness(7); // REGLAGE LUMINOSITE MAX
  score2.setBrightness(7);
  timer.setBrightness(7);
  highscore.setBrightness(7);
  CapteurJ1.setModel(SharpDistSensor::GP2Y0A51SK0F_5V_DS);
  CapteurJ2.setModel(SharpDistSensor::GP2Y0A51SK0F_5V_DS);
  score1.showNumberDec(8888); //AFFICHAGE 8888
  score2.showNumberDec(8888); //AFFICHAGE 8888
  delay(1000); //PAUSE 1 SEC
  initjeu();
}

void loop() {
  if (millis() - chrono >= temps) { // une seconde est passée
    tempsmax --;
    Serial.println(tempsmax);
    affichetemps(tempsmax);
    if (tempsmax <= 0) {
      animation1(); // Animation fin de manche : vainqueur clignote
      Serial.print ("Vainqueurs : "); Serial.print(vainqueur[0]); Serial.print ("\t");
      Serial.print(vainqueur[1]); Serial.print ("\t"); Serial.println(vainqueur[2]);
      numeromanche ++;
      if (numeromanche > MANCHES) {
        majled(3);
        animation2(); // Animation fin de jeu
        while (1); // fin du jeu (boucle infinie)
      }
      initjeu();
    }
    chrono = millis();
  }
  lecturecapteurs();
  if ((millis() - chrono1 >= tempopanier) && (distance1 < SEUILBALLON)) scoreplusjoueur1 ();
  if ((millis() - chrono2 >= tempopanier) && (distance2 < SEUILBALLON)) scoreplusjoueur2 ();
}


void initjeu () {
  Serial.println("Debut initjeu");
  Serial.print ("Manche "); Serial.println(numeromanche);
  tempsmax = 1 * MINUTE; // Temps max 01:00
  nb_pts1 = 0; // NB DE POINTS (0 à 255) joueur 1
  nb_pts2 = 0; // NB DE POINTS (0 à 255) joueur 2
  affichetemps(tempsmax);
  score1.showNumberDec(nb_pts1, true);
  score2.showNumberDec(nb_pts2, true);
  highscore.showNumberDec(high, true);
  switch (numeromanche) {
      case 1:
        analogWrite(LEDM1B, 255);
        break;
      case 2:
        analogWrite(LEDM2B, 255);
        Serial.println("Maj LED 1");
        majled(1);
        break;
      case 3:
        analogWrite(LEDM3B, 255);
        Serial.println("Maj LED 2");
        majled(2);
        break;
  }
  animation0();
  Serial.println("Fin initjeu");
  chrono = millis();
}

void lecturecapteurs () {
  distance1 = CapteurJ1.getDist();
  distance2 = CapteurJ2.getDist();
  Serial.print(millis()); Serial.print("\t"); Serial.print(distance1); Serial.print("\t"); Serial.println(distance2);
}

void scoreplusjoueur1 () {
  nb_pts1++;
  nb_pts1++;
  score1.showNumberDec(nb_pts1, true);
  if (nb_pts1 > high) {
    high = nb_pts1;
    highscore.showNumberDec(high, true);
  }
  chrono1 = millis(); // On lance un chrono pour attendre 500 ms
}

void scoreplusjoueur2 () {
  nb_pts2++;
  nb_pts2++;
  score2.showNumberDec(nb_pts2, true);
  if (nb_pts2 > high) {
    high = nb_pts2;
    highscore.showNumberDec(high, true);
  }
  chrono2 = millis();
}

void affichetemps(int temps) {
  byte minutes = temps / 60;
  byte secondes = temps % 60;
  int tempsaff = minutes * 100 + secondes;
  timer.showNumberDecEx(tempsaff, 0b01000000, true, 4);
}

void animation0() {
  // Animation avant de lancer une manche (compte à rebours)
  timer.showNumberDec(3, false, 1, 1);
  delay(1000);
  timer.showNumberDec(2, false, 1, 1);
  delay(1000);
  timer.showNumberDec(1, false, 1, 1);
  delay(1000);
  uint8_t SEG_GO[] = {
    SEG_D,                                            // _
    SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G,    // G
    SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F ,   // O
    SEG_D                                             // _
  };
  timer.setSegments(SEG_GO);
  delay(1000);
}

GR13DeStRoY

Et voici la deuxième partie :
Code: [Select]

void animation1 () {
  // Animation des afficheurs en fin de manche
  Serial.print("Fin manche ");
  Serial.println(numeromanche);
  Serial.print("Scores : "); Serial.print(nb_pts1);
  Serial.print("\t"); Serial.println(nb_pts2);
  if (nb_pts1 > nb_pts2) { // Joueur 1 gagne : score clignote
    vainqueur[numeromanche-1] = 1;
    for (int i = 0; i < 5; i++) {
      score1.setBrightness(7, false);
      delay (500);
      score1.setBrightness(7, true);
      score1.showNumberDec(nb_pts1, true);
      delay (500);
    }
  } else if (nb_pts1 < nb_pts2) { // Joueur 2 gagne : score clignote
    vainqueur[numeromanche-1] = 2;
    for (int i = 0; i < 5; i++) {
      score2.setBrightness(7, false);
      delay (500);
      score2.setBrightness(7, true);
      score2.showNumberDec(nb_pts1, true);
      delay (500);
    }
  } else {  // égalité :  les 2 scores clignotent
    for (int i = 0; i < 5; i++) {
      score1.setBrightness(7, false);
      score2.setBrightness(7, true);
      score2.showNumberDec(nb_pts2, true);
      delay (500);
      score2.setBrightness(7, false);
      score1.setBrightness(7, true);
      score1.showNumberDec(nb_pts1, true);
      delay (500);
    }
    score2.setBrightness(7, true);
    score2.showNumberDec(nb_pts2, true);
  }
}

void animation2 () {
  // Animation des afficheurs en fin de jeu
  for (int i = 0; i < 5; i++) {
    // On éteint tout pendant 500 ms
    for(int j=2; j<11; j++) analogWrite(j, 0);
    highscore.setBrightness(7, false);
    delay (500);
    // Et on rallume tout pendant 500 ms
    byte pin = 4;
    if(vainqueur[0]==1) { pin = 2; }
    else if(vainqueur[0]==2){ pin = 3; }
    analogWrite(pin, 255);
    pin = 7;
    if(vainqueur[1]==1) { pin = 5; }
    else if(vainqueur[1]==2){ pin = 6; }
    analogWrite(pin, 255);
    pin = 10;
    if(vainqueur[2]==1) { pin = 8; }
    else if(vainqueur[2]==2){ pin = 9; }
    analogWrite(pin, 255);
    highscore.setBrightness(7, true);
    highscore.showNumberDec(high, true);
    delay (500);
  }
  uint8_t SEG_FInI[] = {
  SEG_A | SEG_E | SEG_F | SEG_G,    // F
  SEG_E | SEG_F,                    // I
  SEG_C | SEG_E | SEG_G,            // n
  SEG_E | SEG_F                     // I
   };
  timer.setSegments(SEG_FInI);
}

void majled (int manche) {
  // Mise à jour de la couleur de la LED de la manche terminée
  // La led reste bleue si ex-aequos
  Serial.print("majled : pins ");
  if (vainqueur[manche-1] != 0) {
    int pinblue = manche * 3 + 1;
    int pincolor = (manche - 1) * 3 + vainqueur[manche-1] + 1;
    Serial.print(pinblue); Serial.print("\n"); Serial.println(pincolor);
    for(int i=0; i<256; i=i+15) {
      Serial.println(i);
      analogWrite(pinblue, 255 - i);
      analogWrite(pincolor, i);
      delay(100);
    }
  }
}

GR13DeStRoY

Ensuite voilà le code pour effectué des test sur l'un des capteurs :
Code: [Select]
#include <IRremote.h>
IRsend irsend; // déclaration de l'objet émetteur
 
void setup() {
  Serial.begin(115200);   // régler la console sur 115200 baud
  irsend.enableIROut(38); // crée une sortie modulée à 38kHz
  irsend.mark(0); // envoi du signal pour une durée illimitée
  delay(5);
}
 
void loop()
{
}



Je vois donc la petite lumière infrarouge depuis mon téléphone portable , donc j'ai rajouté des lignes , pour testé le bon fonctionnement :

Code: [Select]

#include <IRremote.h>
#define pinRecept 3
IRsend irsend; // déclaration de l'objet émetteur
 
void setup() {
  Serial.begin(115200);   // régler la console sur 115200 baud
  irsend.enableIROut(38); // crée une sortie modulée à 38kHz
  irsend.mark(0); // envoi du signal pour une durée illimitée
  delay(5);
boolean mesure = digitalRead(pinRecept);
Serial.println (mesure);
pinMode(pinRecept, INPUT);
}
 
void loop()
{
}


Je ferais un nouveau test demain soir ou samedi pour vous montré ce que cela donne .

lesept

Salut
Il fait mettre la mesure dans la loop sinon elle ne sera faite qu'une fois
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

GR13DeStRoY


lesept

Ces lignes sont à déplacer du setup dans la loop :
Code: [Select]
boolean mesure = digitalRead(pinRecept);
Serial.println (mesure);
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

GR13DeStRoY

J'ai donc modifier le code :
Code: [Select]

#include <IRremote.h>
#define pinRecept 3
IRsend irsend; // déclaration de l'objet émetteur

void setup() {
  Serial.begin(115200);   // régler la console sur 115200 baud
  irsend.enableIROut(38); // crée une sortie modulée à 38kHz
  irsend.mark(0); // envoi du signal pour une durée illimitée
  delay(5);
  pinMode(pinRecept, INPUT);
}
void loop()
{
  boolean mesure = digitalRead(pinRecept);
  Serial.println (mesure);
}


Aucun code erreur en téléversant , bonne nouvelle .
Ensuite quand je regarde dans moniteur de série voilà ce que cela me donne :
F⸮0⸮ 0⸮ J0⸮B ⸮0⸮ 00⸮ 0⸮ H0⸮ JF⸮B ⸮0⸮ 0⸮ J0⸮B ⸮0⸮ 0⸮ H0⸮ JF⸮B ⸮0⸮ 0⸮ J0⸮B ⸮0⸮ 0⸮ H0⸮ JF⸮B ⸮0⸮ 0⸮ J0⸮B ⸮0⸮ 0⸮JB ⸮0⸮ 0⸮ H0⸮ JF⸮B ⸮0⸮ 0⸮ J0⸮B ⸮0⸮ 0⸮ H0⸮ JF⸮B ⸮0⸮ 0⸮ J0⸮B ⸮0⸮ 0⸮ H0⸮ JF⸮B ⸮0⸮ 0⸮ H0⸮B ⸮0⸮ 0⸮ H0⸮ JF⸮B ⸮0⸮ 0⸮ H0⸮ JF⸮B ⸮0⸮ H0⸮ J0⸮B ⸮0⸮ 0⸮ H0⸮ JF⸮B ⸮0⸮ 0⸮ J0⸮B ⸮0⸮ 0⸮ H0⸮ JF
......


lesept

Il faut régler la console à 115200 baud (menu en bas à droite)
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

GR13DeStRoY

D'accord cela est bien fait , donc j'ai bien des lignes à
0
0
0
0
0....
Je passe ma main entre l'émetteur et le récepteur cela fait toujours :
0
0
0
0...
Une idée ?

lesept

J'ai pas trop l'habitude de ces capteurs. Il faut que tu t'inspires pour la partie réception de l'exemple IRrecvDemo de la bibliothèque.

Code: [Select]

#include <IRremote.h>

int pinRecept = 3;
IRrecv irrecv(pinRecept); // <--  ligne à ajouter
decode_results results;

void setup()
{
  Serial.begin(115200);
  irrecv.enableIRIn(); // <-- ligne à ajouter
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
}


Dans un premier temps, teste avec juste les deux lignes en plus dans ton code, si ça ne fonctionne pas, essaie avec la loop de l'exemple et la dernière ligne de l'entête.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

GR13DeStRoY

Code: [Select]
#include <IRremote.h>
#define pinRecept 3
IRsend irsend; // déclaration de l'objet émetteur

void setup() {
  Serial.begin(115200);   // régler la console sur 115200 baud
  irsend.enableIROut(38); // crée une sortie modulée à 38kHz
  irsend.mark(0); // envoi du signal pour une durée illimitée
  delay(5);
  pinMode(pinRecept, INPUT);
  Serial.begin(115200);
  IRrecv irrecv(pinRecept) ;
 }
void loop()
{
  boolean mesure = digitalRead(pinRecept);
  Serial.println (mesure);
  irrecv.resume(); // Receive the next value
}


J'ai testé dans un premier temps en rajoutant les deux lignes , toujours pareil et ensuite j'ai ajouté la dernière ligne dans Loop et j'ai un message d'erreur  :
'irrecv' was not declared in this scope

lesept

A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Go Up