Electrofoot : Différence entre versions
(→Terrain) |
(→Assemblage) |
||
(27 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 26 : | Ligne 26 : | ||
==Réalisation Technique== | ==Réalisation Technique== | ||
− | + | Nous allons réaliser un "éléctrofoot" dont le but est de compter les buts lors d'un match de babyfoot. | |
+ | Nous voulions utiliser un capteur piézoélectrique qui détecte les chocs, mais l'expert en babyfoot nous a fait remarqué que souvent lors d'un match de babyfoot, il peut y avoir multiples coups ou chocs. On a donc opter pour une photo résistance ce qui permet d'avoir un système complétement isolé, l'environnement extérieure ne va pas influer sur la photo résistance comme elle est placé dans la goulotte et seulement éclairé par la led. | ||
===Solutions Techniques=== | ===Solutions Techniques=== | ||
Ligne 47 : | Ligne 48 : | ||
[[Fichier:plan.jpg|200px]] | [[Fichier:plan.jpg|200px]] | ||
+ | |||
+ | Notre idée était de placer une photo résistance éclairé par une led dans un petit trou de la goulotte. La balle qui passe dans la goulotte cache un court instant la led. Le programme arduino va détecter ce moment. A cet instant, le compteur s'incrémente et ajoute un but. Ce but est retranscrit directement sur l'afficheur 7 segments. | ||
===Goulotte=== | ===Goulotte=== | ||
Nous avons décider de réaliser la structure en carton. Cette structure a pour but de réceptionner la balle de babyfoot. | Nous avons décider de réaliser la structure en carton. Cette structure a pour but de réceptionner la balle de babyfoot. | ||
+ | Le haut de la goulotte est large et renforcé afin de rester en place lors du lancer de balle. | ||
+ | L'entonnoir permet de ralentir la balle. | ||
[[Fichier:Goulotte1.JPG|300px]] | [[Fichier:Goulotte1.JPG|300px]] | ||
+ | [[Fichier:Goulotte2.JPG|300px]] | ||
− | + | Plusieurs techniques ont été utilisé, le découpage de carton, collage, pliage. | |
− | |||
− | |||
[[Fichier:Goulotte3.JPG|300px]] | [[Fichier:Goulotte3.JPG|300px]] | ||
[[Fichier:Goulotte4.JPG|300px]] | [[Fichier:Goulotte4.JPG|300px]] | ||
+ | |||
+ | La balle rentre dans la goulotte et glisse dans le tube triangulaire en carton. Elle vient se loger dans un goblet en plastique. On peut ainsi la récupérer facilement. | ||
===Terrain=== | ===Terrain=== | ||
Le terrain est aussi en carton poli et plastifié , plus solide cette fois ci ce qui permet d'avoir une surface plate et qui se déforme peu. Ainsi nous pouvons effectuer un lancer, la balle roule jusqu'au but. | Le terrain est aussi en carton poli et plastifié , plus solide cette fois ci ce qui permet d'avoir une surface plate et qui se déforme peu. Ainsi nous pouvons effectuer un lancer, la balle roule jusqu'au but. | ||
+ | |||
+ | Le terrain est finalement en deux parties. On assemble le but et le terrain. | ||
[[Fichier:terrain1.JPG|300px]] | [[Fichier:terrain1.JPG|300px]] | ||
+ | [[Fichier:terrain2.JPG|300px]] | ||
− | + | Le terrain ressemble de plus en plus à un vrai terrain, on lui a rajouté des pieds, çà permet aussi de régler parfaitement la goulotte pour que la balle ne se coince jamais. | |
[[Fichier:terrain3.JPG|300px]] | [[Fichier:terrain3.JPG|300px]] | ||
+ | |||
+ | Le terrain a été solidifié grâce à du bois. | ||
+ | |||
+ | [[Fichier:terrain4.JPG|300px]] | ||
===Arduino=== | ===Arduino=== | ||
− | ==== | + | Le code arduino ci-dessous |
− | ==== | + | |
+ | <pre> | ||
+ | // BABY FOOT COUNTER | ||
+ | // v0.01 | ||
+ | |||
+ | int lightSensorPin = A0; // select the input pin for the potentiometer | ||
+ | int ledPin = 13; // select the pin for the LED | ||
+ | int lightSensorValue = 0; // variable to store the value coming from the sensor | ||
+ | int Ngoal = 0; // Nombre de but | ||
+ | int addGoalPin = 12 ; | ||
+ | int addGoal = 0; | ||
+ | int oldAddGoalState = 0; | ||
+ | int subGoalPin = 11; | ||
+ | int subGoal = 0; | ||
+ | int oldSubGoalState = 0; | ||
+ | int a=0; //Compteur pour fonction win | ||
+ | |||
+ | // Sert à piloter l'afficheur led en fonction du nombre à afficher. | ||
+ | byte empty[8]={0,0,0,0,0,0,0,0}; | ||
+ | byte zero[8]= {1,1,1,1,0,1,1,0}; | ||
+ | byte one[8]= {0,1,1,0,0,0,0,0}; | ||
+ | byte two[8]= {1,1,0,0,1,1,1,0}; | ||
+ | byte three[8]={1,1,1,0,1,0,1,0}; | ||
+ | byte four[8]= {0,1,1,1,1,0,0,0}; | ||
+ | byte five[8]= {1,0,1,1,1,0,1,0}; | ||
+ | byte six[8]= {1,0,1,1,1,1,1,0}; | ||
+ | byte seven[8]={1,1,1,0,0,0,0,0}; | ||
+ | byte eight[8]={1,1,1,1,1,1,1,0}; | ||
+ | byte nine[8]= {1,1,1,1,1,0,1,0}; | ||
+ | byte* numberTab[10]={zero,one,two,three,four,five,six,seven,eight,nine}; | ||
+ | |||
+ | // sert à éxécuter les fontions à intervalle régulier | ||
+ | double oldtime = 0; | ||
+ | double time = 0; | ||
+ | double oldtime2 = 0; | ||
+ | double time2 = 0; | ||
+ | |||
+ | // Initialisation | ||
+ | void setup() { | ||
+ | pinMode(ledPin, OUTPUT); | ||
+ | pinMode(addGoalPin, INPUT); | ||
+ | pinMode(subGoalPin, INPUT); | ||
+ | digitalWrite(ledPin, HIGH); | ||
+ | pinMode(10,OUTPUT); | ||
+ | pinMode(2,OUTPUT); | ||
+ | pinMode(3,OUTPUT); | ||
+ | pinMode(4,OUTPUT); | ||
+ | pinMode(5,OUTPUT); | ||
+ | pinMode(6,OUTPUT); | ||
+ | pinMode(7,OUTPUT); | ||
+ | pinMode(8,OUTPUT); | ||
+ | Serial.begin(9600); | ||
+ | } | ||
+ | |||
+ | // Boucle d'éxécution | ||
+ | void loop() { | ||
+ | time=millis()-oldtime; | ||
+ | if (time>100) { | ||
+ | oldtime=millis(); | ||
+ | lightSensorControl(); | ||
+ | manageGoalCounter(); | ||
+ | getButtonState(); | ||
+ | if (Ngoal<10) { | ||
+ | displayManager(numberTab[Ngoal]); | ||
+ | } | ||
+ | if (Ngoal==10) { | ||
+ | win(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void getButtonState() { | ||
+ | addGoal = digitalRead(addGoalPin); | ||
+ | subGoal = digitalRead(subGoalPin); | ||
+ | Serial.println(addGoal); | ||
+ | // avoid annoying add and delete | ||
+ | if (addGoal==0) {oldAddGoalState=0;} | ||
+ | if (subGoal==0) {oldSubGoalState=0;} | ||
+ | } | ||
+ | |||
+ | // Manage control of Ngoal | ||
+ | void manageGoalCounter() { | ||
+ | if (addGoal==1 && oldAddGoalState==0 && Ngoal<10) { | ||
+ | Ngoal=Ngoal+1; | ||
+ | oldAddGoalState=1; | ||
+ | } | ||
+ | else if(subGoal==1 && oldSubGoalState==0 && Ngoal>0) { | ||
+ | Ngoal=Ngoal-1; | ||
+ | oldSubGoalState=1; | ||
+ | } | ||
+ | else { | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Display the counterGoal value | ||
+ | void displayManager(byte* number) { | ||
+ | digitalWrite(10, number[0]); | ||
+ | digitalWrite(2, number[1]); | ||
+ | digitalWrite(3, number[2]); | ||
+ | digitalWrite(4, number[3]); | ||
+ | digitalWrite(5, number[4]); | ||
+ | digitalWrite(6, number[5]); | ||
+ | digitalWrite(7, number[6]); | ||
+ | digitalWrite(8, number[7]); | ||
+ | digitalWrite(9, number[8]); | ||
+ | } | ||
+ | |||
+ | // Manage lightsensor, if ball fonction add one goal | ||
+ | void lightSensorControl() { | ||
+ | lightSensorValue = analogRead(lightSensorPin); | ||
+ | if (lightSensorValue<600) { | ||
+ | // addGoal = 1; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Pilote l'afficheur en cas de gagne | ||
+ | void win() { | ||
+ | time2=millis()-oldtime2; | ||
+ | if (time2>150 && a<10) { | ||
+ | displayManager(numberTab[a]); | ||
+ | oldtime2=millis(); | ||
+ | a=a+1; | ||
+ | } | ||
+ | else if (time2<250 && a>=10 && a<=20) { | ||
+ | displayManager(zero); | ||
+ | } | ||
+ | else if (500>time2 && time2>=250) { | ||
+ | displayManager(empty); | ||
+ | } | ||
+ | else if (time2>=500) { | ||
+ | oldtime2=millis(); | ||
+ | a=a+1; | ||
+ | } | ||
+ | else if (a>15) { | ||
+ | a=0; | ||
+ | Ngoal=0; | ||
+ | } | ||
+ | Serial.println(a); | ||
+ | Serial.println(time2); | ||
+ | } | ||
+ | |||
+ | </pre> | ||
===Assemblage=== | ===Assemblage=== | ||
− | [[Fichier: | + | On fixe l'arduino sur le coté du terrain. La photo résistance est placé dans un petit trou, ce qui permettra de détecter les moments ou la luminosité variera. |
+ | |||
+ | [[Fichier:Emilien.jpg|800px]] | ||
+ | |||
+ | |||
+ | [[Fichier:assemblage2.JPG|400px]] | ||
==Problèmes rencontrés== | ==Problèmes rencontrés== | ||
+ | Nous avons eu des problèmes pour l'afficheur 7 segments qui permet d'afficher le score. | ||
+ | |||
+ | [[Fichier:afficheur.JPG|300px]] | ||
+ | |||
+ | Nous souhaitions utiliser un grand afficheur qui avait 13 broches. Le problème c'est que la datasheet était relativement mal renseigné. On avait du mal a savoir à quelle broches correspondait les numéros. On a donc décider de les tester une par une. On s'est rendu compte assez tardivement que les résistances que nous mettions étaient beaucoup trop grandes. On pensait qu'il s'agissait de résistances de 130 ohm mais finalement les résistances était de plusieurs milliers d'ohm. | ||
+ | L'afficheur à 13 broches ne fonctionnait pas très bien certaines led étaient grillées. On s'est rabattu sur l'afficheur plus petit de 10 broches, qui, au vu du temps qu'il nous restait, est plus simple à commander. Le principe reste le même qu'avec le grand afficheur. | ||
+ | |||
+ | Lors de la coordination entre le comptage et l'affichage des buts, il fallut retravailler quelque passage du code afin d'avoir une parfaite communication. | ||
==Diaporama== | ==Diaporama== |
Version actuelle datée du 22 janvier 2018 à 15:24
Sommaire
L'idée
Nous souhaitons réaliser un babyfoot avec assistance électronique appelé "Electrofoot" afin de moderniser la pratique du babyfoot. Il s'agit de créer un compteur de buts à base d'afficheur digital et de led.
Cadre Pédagogique
Public
Notre projet est fait pour toute personne fan de petits ballons ronds.
Notions abordées
- bases de la programmation
- maîtrise de l'arduino
- bricolage
- base de la conception de projet
Objectifs Pédagogiques
- éduquer aux notions ci-dessus
- se poser des questions
- travailler en équipe
- respecter une deadline
Réalisation Technique
Nous allons réaliser un "éléctrofoot" dont le but est de compter les buts lors d'un match de babyfoot. Nous voulions utiliser un capteur piézoélectrique qui détecte les chocs, mais l'expert en babyfoot nous a fait remarqué que souvent lors d'un match de babyfoot, il peut y avoir multiples coups ou chocs. On a donc opter pour une photo résistance ce qui permet d'avoir un système complétement isolé, l'environnement extérieure ne va pas influer sur la photo résistance comme elle est placé dans la goulotte et seulement éclairé par la led.
Solutions Techniques
- Variables
- boucles
- incrémentation
- circuits électroniques de base (résistances, photo-résistance, leds)
- écrans LCDs.
Materiels
- Arduino
- LEDs
- affichage digital
- résistances
- photorésistances
Conception
On a d'abord réfléchi sur papier.
Notre idée était de placer une photo résistance éclairé par une led dans un petit trou de la goulotte. La balle qui passe dans la goulotte cache un court instant la led. Le programme arduino va détecter ce moment. A cet instant, le compteur s'incrémente et ajoute un but. Ce but est retranscrit directement sur l'afficheur 7 segments.
Goulotte
Nous avons décider de réaliser la structure en carton. Cette structure a pour but de réceptionner la balle de babyfoot. Le haut de la goulotte est large et renforcé afin de rester en place lors du lancer de balle. L'entonnoir permet de ralentir la balle.
Plusieurs techniques ont été utilisé, le découpage de carton, collage, pliage.
La balle rentre dans la goulotte et glisse dans le tube triangulaire en carton. Elle vient se loger dans un goblet en plastique. On peut ainsi la récupérer facilement.
Terrain
Le terrain est aussi en carton poli et plastifié , plus solide cette fois ci ce qui permet d'avoir une surface plate et qui se déforme peu. Ainsi nous pouvons effectuer un lancer, la balle roule jusqu'au but.
Le terrain est finalement en deux parties. On assemble le but et le terrain.
Le terrain ressemble de plus en plus à un vrai terrain, on lui a rajouté des pieds, çà permet aussi de régler parfaitement la goulotte pour que la balle ne se coince jamais.
Le terrain a été solidifié grâce à du bois.
Arduino
Le code arduino ci-dessous
// BABY FOOT COUNTER // v0.01 int lightSensorPin = A0; // select the input pin for the potentiometer int ledPin = 13; // select the pin for the LED int lightSensorValue = 0; // variable to store the value coming from the sensor int Ngoal = 0; // Nombre de but int addGoalPin = 12 ; int addGoal = 0; int oldAddGoalState = 0; int subGoalPin = 11; int subGoal = 0; int oldSubGoalState = 0; int a=0; //Compteur pour fonction win // Sert à piloter l'afficheur led en fonction du nombre à afficher. byte empty[8]={0,0,0,0,0,0,0,0}; byte zero[8]= {1,1,1,1,0,1,1,0}; byte one[8]= {0,1,1,0,0,0,0,0}; byte two[8]= {1,1,0,0,1,1,1,0}; byte three[8]={1,1,1,0,1,0,1,0}; byte four[8]= {0,1,1,1,1,0,0,0}; byte five[8]= {1,0,1,1,1,0,1,0}; byte six[8]= {1,0,1,1,1,1,1,0}; byte seven[8]={1,1,1,0,0,0,0,0}; byte eight[8]={1,1,1,1,1,1,1,0}; byte nine[8]= {1,1,1,1,1,0,1,0}; byte* numberTab[10]={zero,one,two,three,four,five,six,seven,eight,nine}; // sert à éxécuter les fontions à intervalle régulier double oldtime = 0; double time = 0; double oldtime2 = 0; double time2 = 0; // Initialisation void setup() { pinMode(ledPin, OUTPUT); pinMode(addGoalPin, INPUT); pinMode(subGoalPin, INPUT); digitalWrite(ledPin, HIGH); pinMode(10,OUTPUT); pinMode(2,OUTPUT); pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT); pinMode(8,OUTPUT); Serial.begin(9600); } // Boucle d'éxécution void loop() { time=millis()-oldtime; if (time>100) { oldtime=millis(); lightSensorControl(); manageGoalCounter(); getButtonState(); if (Ngoal<10) { displayManager(numberTab[Ngoal]); } if (Ngoal==10) { win(); } } } void getButtonState() { addGoal = digitalRead(addGoalPin); subGoal = digitalRead(subGoalPin); Serial.println(addGoal); // avoid annoying add and delete if (addGoal==0) {oldAddGoalState=0;} if (subGoal==0) {oldSubGoalState=0;} } // Manage control of Ngoal void manageGoalCounter() { if (addGoal==1 && oldAddGoalState==0 && Ngoal<10) { Ngoal=Ngoal+1; oldAddGoalState=1; } else if(subGoal==1 && oldSubGoalState==0 && Ngoal>0) { Ngoal=Ngoal-1; oldSubGoalState=1; } else { } } // Display the counterGoal value void displayManager(byte* number) { digitalWrite(10, number[0]); digitalWrite(2, number[1]); digitalWrite(3, number[2]); digitalWrite(4, number[3]); digitalWrite(5, number[4]); digitalWrite(6, number[5]); digitalWrite(7, number[6]); digitalWrite(8, number[7]); digitalWrite(9, number[8]); } // Manage lightsensor, if ball fonction add one goal void lightSensorControl() { lightSensorValue = analogRead(lightSensorPin); if (lightSensorValue<600) { // addGoal = 1; } } // Pilote l'afficheur en cas de gagne void win() { time2=millis()-oldtime2; if (time2>150 && a<10) { displayManager(numberTab[a]); oldtime2=millis(); a=a+1; } else if (time2<250 && a>=10 && a<=20) { displayManager(zero); } else if (500>time2 && time2>=250) { displayManager(empty); } else if (time2>=500) { oldtime2=millis(); a=a+1; } else if (a>15) { a=0; Ngoal=0; } Serial.println(a); Serial.println(time2); }
Assemblage
On fixe l'arduino sur le coté du terrain. La photo résistance est placé dans un petit trou, ce qui permettra de détecter les moments ou la luminosité variera.
Problèmes rencontrés
Nous avons eu des problèmes pour l'afficheur 7 segments qui permet d'afficher le score.
Nous souhaitions utiliser un grand afficheur qui avait 13 broches. Le problème c'est que la datasheet était relativement mal renseigné. On avait du mal a savoir à quelle broches correspondait les numéros. On a donc décider de les tester une par une. On s'est rendu compte assez tardivement que les résistances que nous mettions étaient beaucoup trop grandes. On pensait qu'il s'agissait de résistances de 130 ohm mais finalement les résistances était de plusieurs milliers d'ohm. L'afficheur à 13 broches ne fonctionnait pas très bien certaines led étaient grillées. On s'est rabattu sur l'afficheur plus petit de 10 broches, qui, au vu du temps qu'il nous restait, est plus simple à commander. Le principe reste le même qu'avec le grand afficheur.
Lors de la coordination entre le comptage et l'affichage des buts, il fallut retravailler quelque passage du code afin d'avoir une parfaite communication.
Diaporama
L'équipe
- Crenn Samuel
- Rachidi Sofiane
- Limousin Émilien
- Favé Thomas
- Fechet Pierre-Antoine
- Didier Hugo
- Marchadour Erwan
- Le Pevedic Alex