DIY - fabrication de mon flipper / Arduino
-
-
c'est dingue par chez vous ! bon après il faut de la place pour stocker mais c'est vraiment donné
Ce flipper a un thème sympa dans l'idée
mais c'est un flipper low-cost : ils avaient breveté leur bumper et slingshot simplifiés sans switch (c'est la bille qui fait la continuité électrique) mais ça marchait pas terrible
et les deux batteurs sont toujours actionnés simultanément : une seule bobine et une biellette entre les 2 batteurs
Pas sûr que ça vaille grand chose une fois retapé...
il semble que Sentinel n'a fabriqué de 6 modèles de flippers en fin des années 70
-
-
en tous cas, c'est pas cher, c'est sûr !
-
Oh mon dieu les prix, je vais monter avec un 20m3 et prendre le bateau pour faire le plein 😁
-
ou fixer des boudins autour de quelques flippers et traverser l'Atlantique pour rentrer
-
pour compléter la partie code pour ricousky :
voici un autre exemple de machine d'état en code Arduino pour un flipper (je ne l'ai pas encore relu)
http://www.ece.rutgers.edu/sites/default/…FinalReport.pdf
686 lignes
Code
Afficher plus//http://www.ece.rutgers.edu/sites/default/files/uploads/PinBallMachine-FinalReport.pdf //input variables (15) int ds1= LOW; int ds2= LOW; int ds3= LOW; int ds4= LOW; int ds5= LOW; int ds6= LOW; int ds7= LOW; int pb1= LOW; int pb2= LOW; int pb3= LOW; int pb4= LOW; int pb5= LOW; int ir1= LOW; int bumr= LOW; int buml= LOW; //output variables (14) int ledpb1= HIGH; int ledpb2= HIGH; int ledpb3= HIGH; int ledpb4a= LOW; int ledpb4b= LOW; int ledir1a= LOW; int ledir1b= LOW; int ledir1c= LOW; int ledds4= LOW; int ledds5= LOW; int ledds6= LOW; int ledbumr= LOW; int ledbuml= LOW; int sol1= LOW; int shun1=LOW; int shun2=LOW; int shun4=LOW; int shun8=LOW; int sten1=LOW; int sten2=LOW; int sten4=LOW; int sten8=LOW; int sone1=LOW; int sone2=LOW; int sone4=LOW; int sone8=LOW; int ball1=LOW; int ball2=LOW; int ball4=LOW; int ball8=LOW; //flags (4) int fscore=0; //indicates that points have been scored but not recorded int fball=0; //indicates that a ball has been lost int fgo=0; //indicates game is over int fbonus=0; //scoring const int v=6; //points for pb5 const int w=10; //points for ir const int x=4; //points for pbled1,2,3 const int y=15; //points for bonus const int z=5; //ds1-3 const int u=8; //ds4-6 //delays const int a=500; const int b=1000; int score=0; int scoreone=0; int scoreten=0; int scorehun=0; int balls=3; int ircounter=0; int modl=0; int modr=0; //input pins (15) const int pds1=49; const int pds2=2; const int pds3=3; const int pds4=4; const int pds5=5; const int pds6=6; const int pds7=7; const int ppb1=8; const int ppb2=9; const int ppb3=10; const int ppb4=11; const int ppb5=12; const int pir1=13; const int pbuml=14; const int pbumr=15; //output pins (30) const int pshun1=16; const int pshun2=17; const int pshun4=18; const int pshun8=19; const int psten1=20; const int psten2=21; const int psten4=22; const int psten8=23; const int psone1=24; const int psone2=25; const int psone4=26; const int psone8=27; const int pball1=28; const int pball2=29; const int pball4=30; const int pball8=31; const int pledpb1=32; const int pledpb2=33; const int pledpb3=34; const int pledpb4a=35; const int pledir1a=36; const int pledir1b=37; const int pledir1c=38; const int pledds4=39; const int pledds5=40; const int pledds6=41; const int pledpb4b=42; const int pledbumr=43; const int pledbuml=44; const int psol1=45; void setup() { //Declare input Pins Serial.begin(9600); pinMode(pds1 , INPUT); pinMode(pds2 , INPUT); pinMode(pds3 , INPUT); pinMode(pds4 , INPUT); pinMode(pds5 , INPUT); pinMode(pds6 , INPUT); pinMode(pds7 , INPUT); pinMode(ppb1 , INPUT); pinMode(ppb2 , INPUT); pinMode(ppb3 , INPUT); pinMode(ppb4 , INPUT); pinMode(ppb5 , INPUT); pinMode(pir1 , INPUT); pinMode(pbuml, INPUT); pinMode(pbumr, INPUT); //declare output pins pinMode(pshun1, OUTPUT); pinMode(pshun2, OUTPUT); pinMode(pshun4, OUTPUT); pinMode(pshun8, OUTPUT); pinMode(psten1, OUTPUT); pinMode(psten2, OUTPUT); pinMode(psten4, OUTPUT); pinMode(psten8, OUTPUT); pinMode(psone1, OUTPUT); pinMode(psone2, OUTPUT); pinMode(psone4, OUTPUT); pinMode(psone8, OUTPUT); pinMode(pball1, OUTPUT); pinMode(pball2, OUTPUT); pinMode(pball4, OUTPUT); pinMode(pball8, OUTPUT); pinMode(pledpb1, OUTPUT); pinMode(pledpb2, OUTPUT); pinMode(pledpb3, OUTPUT); pinMode(pledpb4a, OUTPUT); pinMode(pledir1a, OUTPUT); pinMode(pledir1b, OUTPUT); pinMode(pledir1c, OUTPUT); pinMode(pledds4, OUTPUT); pinMode(pledds5, OUTPUT); pinMode(pledds6, OUTPUT); pinMode(pledpb4b, OUTPUT); pinMode(pledbumr, OUTPUT); pinMode(pledbuml, OUTPUT); pinMode(psol1, OUTPUT); digitalWrite(pledpb1, HIGH); digitalWrite(pledpb2, HIGH); digitalWrite(pledpb3, HIGH); digitalWrite(pledpb4a, LOW); digitalWrite(pledir1a, LOW); digitalWrite(pledir1b, LOW); digitalWrite(pledir1c, LOW); digitalWrite(pledds4, LOW); digitalWrite(pledds5, LOW); digitalWrite(pledds6, LOW); digitalWrite(pledpb4b, LOW); digitalWrite(pball1, balls & 1); digitalWrite(pball2, balls & 2); digitalWrite(pball4, balls & 4); digitalWrite(pball8, balls & 8); digitalWrite(pshun1, scorehun & 1); digitalWrite(pshun2, scorehun & 2); digitalWrite(pshun4, scorehun & 4); digitalWrite(pshun8, scorehun & 8); digitalWrite(psten1, scoreten & 1); digitalWrite(psten2, scoreten & 2); digitalWrite(psten4, scoreten & 4); digitalWrite(psten8, scoreten & 8); digitalWrite(psone1, scoreone & 1); digitalWrite(psone2, scoreone & 2); digitalWrite(psone4, scoreone & 4); digitalWrite(psone8, scoreone & 8); }//close setup void loop() //start main body { //while(Serial.available()>0) //{ //Read inputs // digitalWrite(psol1, HIGH); //tester line ds1= digitalRead(pds1); ds2= digitalRead(pds2); ds3= digitalRead(pds3); ds4= digitalRead(pds4); ds5= digitalRead(pds5); ds6= digitalRead(pds6); ds7= digitalRead(pds7); pb1= digitalRead(ppb1); pb2= digitalRead(ppb2); pb3= digitalRead(ppb3); pb4= digitalRead(ppb4); pb5= digitalRead(ppb5); ir1= digitalRead(pir1); bumr= digitalRead(pbumr); buml= digitalRead(pbuml); /*Testing without hardware int variable = Serial.parseInt(); switch(variable) { case 1: ds1=HIGH; break; case 2: ds2=HIGH; break; case 3: ds3=HIGH; break; case 4: ds4=HIGH; break; case 5: ds5=HIGH; break; case 6: ds6=HIGH; break; case 7: ds7=HIGH; break; case 8: pb1=HIGH; break; case 9: pb2=HIGH; break; case 10: pb3=HIGH; break; case 11: pb4=HIGH; break; case 12: pb5=HIGH; break; case 13: ir1=HIGH; break; case 14: bumr=HIGH; break; case 15: buml=HIGH; break; default: variable=0; } */ //input logic //3 LED scoring if(pb1==HIGH) { score=score+x; fscore=1; digitalWrite(pledpb1, LOW); ledpb1=LOW; } if(pb2==HIGH) { score=score+x; fscore=1; digitalWrite(pledpb2, LOW); ledpb2=LOW; } if(pb3==HIGH) { score=score+x; fscore=1; digitalWrite(pledpb3, LOW); ledpb3=LOW; } if(ledpb1==LOW && ledpb2==LOW && ledpb3==LOW) { fbonus=1; digitalWrite(pledpb4a, HIGH); ledpb4a=HIGH; //make flashing } if(pb4==HIGH) { if(fbonus==1) { digitalWrite(pledpb4a, LOW); digitalWrite(pledpb1, HIGH); digitalWrite(pledpb2, HIGH); digitalWrite(pledpb3, HIGH); digitalWrite(pledpb4b, HIGH); delay(1.5*b); digitalWrite(pledpb4b, LOW); ledpb4a=LOW; ledpb1=HIGH; ledpb2=HIGH; ledpb3=HIGH; ledpb4b=HIGH; if(balls==9) { score=score+2*y; } else { balls=balls+1; digitalWrite(pball1, balls & 1); digitalWrite(pball2, balls & 2); digitalWrite(pball4, balls & 4); digitalWrite(pball8, balls & 8); score=score+y; } fscore=1; fbonus=0; } else { digitalWrite(pledpb4b, HIGH); delay(b*1.5); digitalWrite(pledpb4b, LOW); ledpb4b=HIGH; score=score+y; fscore=1; } } if(ds1==HIGH) { score=score+z; fscore=1; // digitalWrite(ledbumr, HIGH); } if(ds2==HIGH) { score=score+z; fscore=1; } if(ds3==HIGH) { score=score+z; fscore=1; } if(ds4==HIGH) { score=score+u; fscore=1; digitalWrite(pledds4, HIGH); ledds4=HIGH; delay(b); digitalWrite(pledds4, LOW); } if(ds5==HIGH) { score=score+u; fscore=1; digitalWrite(pledds5, HIGH); ledds5=HIGH; delay(b); digitalWrite(pledds5, LOW); } if(ds6==HIGH) { score=score+u; fscore=1; digitalWrite(pledds6, HIGH); ledds6=HIGH; delay(b); digitalWrite(pledds6, LOW); } if(ir1==HIGH) { score=score+w; fscore=1; ircounter=ircounter+1; switch(ircounter) { case 1: digitalWrite(pledir1a, HIGH); ledir1a=HIGH; break; case 2: digitalWrite(pledir1b, HIGH); ledir1b=HIGH; break; default: digitalWrite(pledir1c, HIGH); ledir1c=HIGH; break; } } if(pb5==HIGH) { switch(ircounter) { case 0: score=score+v; fscore=1; break; case 1: score=score+2*v; fscore=1; break; case 2: score=score+3*v; fscore=1; break; default: score=score+5*v; fscore=1; break; } digitalWrite(pledir1a, LOW); digitalWrite(pledir1b, LOW); digitalWrite(pledir1c, LOW); ledir1a=LOW; ledir1b=LOW; ledir1c=LOW; ircounter=0; } if(bumr==HIGH ) { digitalWrite(pledbumr, HIGH); modr=0; // delay(b); // digitalWrite(pledbumr, LOW); // score=score+x; // score=1; } if((modr%2500)==2499) { digitalWrite(pledbumr, LOW); } else { modr=modr+1; } if(buml==HIGH) { digitalWrite(pledbuml, HIGH); modl=0; // delay(b); // digitalWrite(pledbuml, LOW); // ledbuml=HIGH; // score=score+x; // fscore=1; } if((modl%2500)==2499) { digitalWrite(pledbuml, LOW); } else { modl=modl+1; } if(ds7==HIGH) { fball=1; } //balls if(fball==1) { if(balls==0) { fgo=1; } else { balls=balls-1; digitalWrite(pball1, balls & 1); digitalWrite(pball2, balls & 2); digitalWrite(pball4, balls & 4); digitalWrite(pball8, balls & 8); delay(b); } digitalWrite(pledpb1, HIGH); digitalWrite(pledpb2, HIGH); digitalWrite(pledpb3, HIGH); digitalWrite(pledpb4a, LOW); digitalWrite(pledir1a, LOW); digitalWrite(pledir1b, LOW); digitalWrite(pledir1c, LOW); digitalWrite(pledds4, LOW); digitalWrite(pledds5, LOW); digitalWrite(pledds6, LOW); digitalWrite(pledpb4b, LOW); ledpb1=HIGH; ledpb2= HIGH; ledpb3= HIGH; ledpb4a= LOW; ledir1a= LOW; ledir1b= LOW; ledir1c= LOW; ledds4= LOW; ledds5= LOW; ledds6= LOW; ledpb4b= LOW; fball=0; ircounter=0; } //if gameover or initial loop, reset/set variables if(fgo==1) { //basic variables digitalWrite(psol1, HIGH); sol1=HIGH; for(int g=0; g<60; g=g+1) { digitalWrite(pledbuml, HIGH); digitalWrite(pledbumr, HIGH); digitalWrite(pball1, balls & 1); digitalWrite(pball2, balls & 2); digitalWrite(pball4, balls & 4); digitalWrite(pball8, balls & 8); digitalWrite(pshun1, scorehun & 1); digitalWrite(pshun2, scorehun & 2); digitalWrite(pshun4, scorehun & 4); digitalWrite(pshun8, scorehun & 8); digitalWrite(psten1, scoreten & 1); digitalWrite(psten2, scoreten & 2); digitalWrite(psten4, scoreten & 4); digitalWrite(psten8, scoreten & 8); digitalWrite(psone1, scoreone & 1); digitalWrite(psone2, scoreone & 2); digitalWrite(psone4, scoreone & 4); digitalWrite(psone8, scoreone & 8); delay(a/2); digitalWrite(pledbuml, LOW); digitalWrite(pledbumr, LOW); digitalWrite(pball1, HIGH); digitalWrite(pball2, HIGH); digitalWrite(pball4, HIGH); digitalWrite(pball8, HIGH); digitalWrite(pshun1, HIGH); digitalWrite(pshun2, HIGH); digitalWrite(pshun4, HIGH); digitalWrite(pshun8, HIGH); digitalWrite(psten1, HIGH); digitalWrite(psten2, HIGH); digitalWrite(psten4, HIGH); digitalWrite(psten8, HIGH); digitalWrite(psone1, HIGH); digitalWrite(psone2, HIGH); digitalWrite(psone4, HIGH); digitalWrite(psone8, HIGH); delay(a/2); } digitalWrite(psol1, LOW); sol1= LOW; score=0; scoreone=0; scoreten=0; scorehun=0; balls=3; digitalWrite(pball1, balls & 1); digitalWrite(pball2, balls & 2); digitalWrite(pball4, balls & 4); digitalWrite(pball8, balls & 8); ledpb1=HIGH; ledpb2=HIGH; ledpb3=HIGH; ircounter=0; fscore=1; fgo=0; } //scoring if(fscore==1) { if(score>999) { score=999; } else { scorehun=score/100; scoreten=((score-(scorehun*100))/10); scoreone=score-(scorehun*100)-(scoreten*10); digitalWrite(pshun1, scorehun & 1); digitalWrite(pshun2, scorehun & 2); digitalWrite(pshun4, scorehun & 4); digitalWrite(pshun8, scorehun & 8); digitalWrite(psten1, scoreten & 1); digitalWrite(psten2, scoreten & 2); digitalWrite(psten4, scoreten & 4); digitalWrite(psten8, scoreten & 8); digitalWrite(psone1, scoreone & 1); digitalWrite(psone2, scoreone & 2); digitalWrite(psone4, scoreone & 4); digitalWrite(psone8, scoreone & 8); fscore=0; sten1= scoreten & 1; sten2= scoreten & 2; sten4= scoreten & 4; sten8= scoreten & 8; } delay(b/2); } /* Serial.print("\n \nScore: "); Serial.println(score, DEC); Serial.print("\n LEDIRCA "); Serial.println(ledir1a, DEC); Serial.print("\n LEDIRB: "); Serial.println(ledir1b, DEC); Serial.print("\n LEDIRC: "); Serial.println(ledir1c, DEC); Serial.print("\n LEDDS4: "); Serial.println(ledds4, DEC); Serial.print("\n LEDDS5: "); Serial.println(ledds5, DEC); Serial.print("\n LEDDS6: "); Serial.println(ledds6, DEC); Serial.print("\n LEDPB1: "); Serial.println(ledpb1, DEC); Serial.print("\n LEDPB2: "); Serial.println(ledpb2, DEC); Serial.print("\n LEDBP3: "); Serial.println(ledpb3, DEC); Serial.print("\n LEDBP4b: "); Serial.println(ledpb4b, DEC); Serial.print("\n Bonus: "); Serial.println(ledpb4a, DEC); Serial.print("\n ircounter: "); Serial.println(ircounter, DEC); Serial.print("\n bumpr: "); Serial.println(ledbumr, DEC); Serial.print("\n bumpl: "); Serial.println(ledbuml, DEC); Serial.print("\n Scoreone: "); Serial.println(scoreone, DEC); Serial.print("\n Scoreten: "); Serial.println(scoreten, DEC); Serial.print("\n Scorehun: "); Serial.println(scorehun, DEC); Serial.print("\n Balls: "); Serial.println(balls, DEC); Serial.print("\n sellenoid: "); Serial.println(sol1, DEC); Serial.print("\n sten1: "); Serial.println(sten1, DEC); Serial.print("\n Sten2: "); Serial.println(sten2, DEC); Serial.print("\n Sten4: "); Serial.println(sten4, DEC); Serial.print("\n Sten8: "); Serial.println(sten8, DEC); */ //reset input variables ds1= LOW; ds2= LOW; ds3= LOW; ds4= LOW; ds5= LOW; ds6= LOW; ds7= LOW; pb1= LOW; pb2= LOW; pb3= LOW; pb4= LOW; pb5= LOW; ir1= LOW; bumr=LOW; buml=LOW; ledpb4b=LOW; ledds4=LOW; ledds5=LOW; ledds6=LOW; sol1=LOW; ledbumr=LOW; ledbuml=LOW; //} //close test }//close loop
-
Merci mon bon monsieur 😉
-
laisse, il est tout pourri...
Citationhttp://forum.locoduino.org/index.php?topic=98.msg763#msg763
La modélisation d'un système par machine d'états-transitions est, à ma connaissance, un des moyens les plus efficaces pour analyser un problème et écrire du bon code (dans le sens conforme, efficace, facile à mettre au point et à maintenir). Cela s'applique à la gestion de systèmes physiques en toute sécurité ou à des protocoles de communication, avec la même facilité.
Pour chaque état, un (ou des) évènements permettent une transition vers un autre état (ou d'autres états), en réalisant éventuellement une action déterminée. Il peut parfois y avoir retour vers le même état (à une variable d'état près, éventuellement). A chaque état peuvent être associées un jeu de valeurs des variables d'état (ce qui peu matérialiser en quoi consiste une 'transition', mais pas toujours).
Cette approche permet effectivement de réfléchir à bien poser le problème, à trouver les bons états, les bonnes variables d'état, à tester sur papier la conformité du fonctionnement aux attentes, tout cela avec rapidité (ce n'est finalement que du dessin servant de support à une 'expérience de pensée') mais avec une grande sûreté (l'automate dessiné fait ce que l'on veut, ou non, le constat est immédiat, et en cas de non, c'est que la modélisation est à revoir). Cette approche événementielle est en général vécue comme assez naturelle. Tout cela sans avoir écrit une seule ligne de code !
http://fadiese.hd.free.fr/barbadidoua/in…machines-d-etat
là c'est clair et concis : il faut lire toute la page
CitationLe programme va donc regarder dans quelle étape il se trouve (y positionner les actionneurs, c'est à dire agir sur l'environnement=écriture des sorties) puis voir (en observation l'environnement=lecture des entrées)s'il doit effectuer la transition vers l'étape suivante
-
Voila mon aire d'entraînement à la programmation 😁. Dès qu'un bout de code sera correct, je ferai les tests dessus.
-
sympa et très propreoui, il te faut un hébergeur
-
Voila mon aire d'entraînement à la programmation 😁. Dès qu'un bout de code sera correct, je ferai les tests dessus.
Entre le plateau et un bout de code, il te faut aussi une carte pour piloter les bobines avec des transistors ou MOSFET. Tu as quoi ?
-
J'ai pleins de cartes car je fabrique mes machines CNC et imprimantes 3d, de la méga, de la Uno, de la nano. Je ne pilote pas en MOSFET car j'en ai pas envie, je pilote en relais statiques opto tout fait dans boîtier alu.
-
Salut Ricousky je ne vois pas ton air d'entrainement ;(
-
Salut, Pourtant elle apparaît bien sous mon commentaire, c'est le plateau de flipper hein ! 😉
-
Je ne pilote pas en MOSFET car j'en ai pas envie, je pilote en relais statiques opto tout fait dans boîtier alu.
tu as un lien de ce truc ?
ça va pas être facile de gérer la puissance et pour les batteurs comment vas-tu obtenir du touché ?
-
Pour l'instant ce n'est que théorique, mais je ne vois pas pourquoi j'aurais moins de toucher avec une lamelle qui ferme un contact, qu'un relais qui ferme un contact. Je te dirais ça dès que j'aurai reçu. 😁 Je suis sur des electromeca en flipper, et pas en Stern 2018, donc le touché se fait avec le corps sur le flipp.
-
Voici le lien pour un 25A en CC vers CC.
https://www.ebay.fr/itm/SSR-25DD-M…6e9d5%7Ciid%3A1
Et il y a les mêmes en CC vers AC, la ref terminera par DA au lieu de DD.
-
laisse, il est tout pourri...
http://fadiese.hd.free.fr/barbadidoua/in…machines-d-etat
là c'est clair et concis : il faut lire toute la page
salut, quand tu dis il faut tout lire, tu veux dire la toute petite page avec le bout de code ? ou tout le site ?
Merciiiii
-
la page seulement !
avec ton relais tout ou rien, le pb c'est que si le joueur garde le doigt appuyé, tu vas cramer tes bobines.
à moins que tu n'utilises des bobines à deux enroulements et deux relais...
-