mardi 26 octobre 2021

MasterMind with Python (for beginners)

 ****************************************************
****************** Simple MASTERMIND **************
****************************************************

 

Here is a very simple mastermind game in Python 3.7 PyScripter  4.0.0.6 x64

*
done with PyScripter
https://sourceforge.net/projects/pyscripter/
*
The program proposes to find an arrangement of 5 digits among 9
without 0, without double.
he analyzes the responses and responds accordingly.
*
Method:
*
The program builds an array of arrangements
valid from 12345 to 87654, from Min to Max.
This gives 6720 arrangements:
n! / (n-k)! = A
8! / (8-5)! = 6720
https://fr.wikipedia.org/wiki/Arrangement
*
The method is simple:
We start from 12345-1 (Min) and add +1 until (Max = 6720)
all arrangements with 0 and double are rejected.
*
Then the program chooses an arrangement in this table
by a random number from 0 to A (6720)
*
Choice request is made.
it's tested:
If it's: too long, too short, with 0, with doubles : it's rejected.
*
if it's correct:
it's compared to the arrangements to be found.
For a well-placed number: +1 in the variable w
For a misplaced number: +1 in the variable b
If the answer is correct the program stops and displays the score an numbers of try.
In case of wrong answer the program displays w and b
and wait for a new choice.
*
If you enter the previous choice, the program understand
that we do not find the right arrangement, displays the arrangement to be found
and stop.
* 

A good exercise for beginners in python for approaching programming step by step, always try to build subroutines that work all by themselves in a new independent module and then include them in the main program.
It's easy to modify and everyone can contribute their ideas
by placing print (...) here and there, stops etc etc for improve it.
*
Completely open-source !
Lionel Nivelle 2021
*
The next approach:
The program must find an arrangement that the user suggests 

All of  Def() of this program are suitable but the program is totaly different.
********************************************************

 

  *****************************************************
****************** Simple MASTERMIND ***************
*****************************************************


Voici un jeu de mastermind tout simple en Python 3.7 PyScripter 4.0.0.6 x64
*
édité à l'aide de PyScripter
https://sourceforge.net/projects/pyscripter/
*
Le programme propose de trouver un arrangement de 5 chiffres parmi 9
sans 0 , sans double.
il analyse les réponses et réponds en conséquence.
*
Méthode :
*
Le programme construit un tableau des arrangements
valables de 12345 a 87654 , de Min à Max .
Cela donne 6720 arrangements :
n! / (n-k) ! =A
8! / (8-5) ! = 6720
https://fr.wikipedia.org/wiki/Arrangement
*
La méthode est simple :
On part de 12345-1 (Min) et on ajoute +1 jusqu'a (Max)
tous les arrangements avec 0 et des doubles sont rejetés.
*
Puis le programme choisi un arrangement dans ce tableau
par un nombre aléatoire de 0 a A (6720)
*
Une demande de choix est faite .
il est testé :
S'il est : trop long ,trop court, avec des 0 , avec des doubles
il est rejeté .
*
s'il est correct:
il est comparé à l’arrangement à trouver.
Pour un chiffre bien placé : +1 dans la variable w
Pour un chiffre mal placé  : +1 dans la variable b
En cas de bonne réponse le programme s'arrête et affiche le score.
En cas de mauvaise réponse le programme affiche w et b
et attends un niveau choix.
*
Si on entre le choix précédent , le programme comprend
que l'on ne trouve pas le bon arrangement et affiche l'arrangement à trouver
et s'arrête.
*
Un bon exercice pour débutant en python pour l'approche d'une programmation
pas à pas , tenter toujours de construire des sous routines qui fonctionnent
toutes seules dans un nouveau module indépendant et ensuite les inclure dans le programme principal .
Il est simple à modifier et chacun peut y apporter ses idées
en y plaçant de print(...) par ci par là , des arrêts etc etc pour l’améliorer.
*
Et complètement Open-source !
Lionel Nivelle 2021
*
La prochaine approche :
Le programme doit trouver un arrangement que l'utilisateur propose

Toutes les sous-routines sont utilisables mais le programme devient tres different
*
**********************************************************************************

#-------------------------------------------------------------------------------
# Name:        le pc propose mastermind
# Purpose:
# Author:      Lionel Nivelle
# Created:     24/10/2021
# Licence:     <Open-Source>
#                   PyScripter   4.0.0.6 x64
#-------------------------------------------------------------------------------

import secrets
# Super Mastermind

# 8 couleurs 5 cases en 12 rangées : le "Super" Master Mind
"""
Il se présente généralement sous la forme d'un plateau perforé de 10 ou 12 rangées de 4 ou 5 trous pouvant accueillir des pions de couleurs.
Les 6 couleurs sont dans la version originale : jaune, bleu, rouge, vert, blanc, noir.
"""

Tableau=[0]*6721 # tableau des combinaisons : voir formule de maths
Max = 87654
Min = 12345
Codage =[12] # tableau des reponse bien place / mal placé

def Nodouble(x): # si dans x y a un double return = False
    Double = True
    for i in range (0,len(x)):
        for j in range (0,len(x)):
            #print ( x[i] ,  "   " , x[j])
            if (x[i] == x[j]) and j!=i:
                Double = False
    return Double

def Lettre(x):
    #cherche une lettre dans une chaine x
    #que des chiffres : Lettre= None
    #avec des lettres : Lettre <> None
    OK= False
    for i in range (0, len(x)):
        if not(int(ord(x[i]))>=48 and int(ord(x[i]))<=57):
            return OK

def Entrée(x): # controle de l'input du joueur
    OK = False
    if Nodouble(x):
        OK = True  #pas de double
    else:
        print('double')
        OK = False
    if OK:
        if x.count(str(0))==0:
            OK = True #pas de zero
        else:
            print ('zero')
            OK = False
    if OK:
        if len(x)==5:
            OK = True #bonne longueur
        else:
            print ('longueur')
            OK = False
    if OK:
        if Lettre(x)== None: #pas de lettre
            OK = True
        else:
            print ('lettre')
            OK = False
    return OK

def ChoixDuPc(a): # le pc choisi une combinaison <sans double , sans 0
                  # a partir du tableau de 6720 elements
    while a>6720:
        a= secrets.randbelow (6721)
        if a>6720: #  *********** en cas d'erreur peu probable
            print (Tableau[a])
    return (Tableau[a])

def analyse(x , Atrouver):
    b=0
    w=0
    s=""
    for i in range (0, len(x)):
        for j in range (0, len(x)):
            if x[i] == Atrouver[j]:
                if i==j:
                    w+=1
                else:
                    b+=1
    s=str(w)+str(b)
    return s

def Cls():
    for i in range(50):
        print()
    print ('MASTERMIND')
    print ('en entrant 2 fois la même combinaison : le jeu s''arrête' )
    print ('et donne la reponse ')
    print()

# ***********************************************************
# ***********  construction du tableaux de combinaisons ***************
# ***********        pas de 0 , pas de double      **********************
# ***********************************************************

code = Min-1
CODE=str(code)
# OK = False
Nombredecode=0
for i in range (Min , Max+1):
    code+=1
    CODE=str(code)
    # test absence de 0 et de 9
    if CODE.count("0")==0  and str(CODE).count("9")==0:
        # test presence de double
        if Nodouble(CODE):
            Nombredecode+=1
            Tableau[Nombredecode]= CODE
            # print (CODE)

# Atrouver
Atrouver= (ChoixDuPc(7000)) # 7000 pour forcer la boucle dans la def
# print (Atrouver) # ecrit la combinaison a trouver pour controle

Cls() # remonte l'ecran

#***********************************************************
#********************** entree au clavier ************************
#***********************************************************
precedente="" # entrée precedente
Stop=False
tour=0   # entree au clavier
fin='non'
while fin=='non':
    N=False  # True si entree correcte pas de 0 , de double , longueur = 5 , pas de lettre
    while N==False:
        n=input('  votre entrée : ')
        if Entrée(n) == True:
            N=True
        else:
            N= False
    tour+=1
#**********************************************************
#*************** analyse *************************************
#**********************************************************
    Retour = analyse(n , Atrouver)
    print ('tour N° :' , tour , 'proposition',n , 'bien placé :' ,Retour[0] , 'mal placé :' ,Retour[1] , end ='')

    # *********************************************
    # ***********   test reponse = precedente  ************
    # *********************************************
    if n==precedente:
        print (' *** STOP ****')
        Stop=True
    else:
       precedente=n
    # *********************************************
    # *********** arrêt voulu ou gagné ******************
    # *********************************************
    if Retour[0] == '5':
        fin ='oui'
    else:
        if Stop:
            print ('la reponse est : ',Atrouver)
            print ('bye')
            fin="oui"

if not(Stop):
#*********************************************************
#*************** gagné *************************************
#*********************************************************
    print()
    print('********************************************')
    print ('BRAVO , trouvé en ',  tour , 'coup', end ="")
    if tour>1:
        print('s')
    else:
        print()
**********************************************************


mercredi 22 juillet 2020

Animations à partir d'un timbre - Première partie : les images .


Pour m'amuser ou suite une demande d'un club , je réalise de petites animations à partir de timbres .
En voici un exemple à partir d'un timbre de Slania C.

Animation
C'est très mignon mais ca demande un peu de boulot !

Pour illustrer la partie Image je prends un exemple moins élaboré , plus simple à réaliser  !

a partir du timbre original :
 et on me pose la question  "quel programme fait cela ??"
Impossible de répondre en 2 phrases , il faut un programme de traitement d'image et un programme d'animation.
J’utilise GIMP libre , performant , très puissant pour le images .
je m'aide aussi de fsviewer pour les découpages rapides à effectuer et d'autres effets .
il y en a d'autres Photoshop , PaintShop et la suite , autant sous Windows que Linux
*************************************
Voici les étapes nécessaires à effectuer à partir du timbre .

Premièrement à l'aide d'un programme de traitement d'images il faut découper les éléments à traiter et les extraire .

découper le satellite et le 0.60.
Le satellite car il va bouger.
le 0.60 car le satellite passe derrière lui .
Nettoyer ces images d'éléments à faire disparaitre et ne garder que l'essentiel.
Gommer les bords .
Pour ne garder que le satellite

Faire de même avec le prix


Les parties blanches ici sont en réalité transparentes .
************************
Revenons au timbre dans lequel il y a des trous maintenant .
Pour en faire cela :
il faut cloner des emplacements d'une partie vers une autre :
il nous faut aussi l'avant-plan , pour cela on découpe le centre du timbre
maintenant nous avons les différents éléments nécessaires a l'animation .
il faut agencer tout cela selon le scenario choisi.

En tableau ce que cela donne.




La maitrise des calques est nécessaire , il suffit de penser au travail de Walt Disney à l'origine.
© inconnu !

Maintenant nous avons des images découpées que l'on peut agencer à notre guise .
Cela pour la partie images prises une a une et qui sont sur le HDD.

Avant de passer à la partie animation il est impératif de maitriser un programme de traitement d'images parfaitement ,quelqu'il soit  et seulement quand toutes les images indépendantes sont satisfaisantes le passage aux programmes d'animations est faisable .

Toutes les images sont a sauvegarder et à traiter en PNG , le format JPG ne convient pas pour la transparence et d'autres paramètres ou les calques sont necessaires ou indispensables.
****************************
La partie suivante sera l'approche d'un programme d'animation
image par image comme : Krita
ou bien  : Natron logiciel de compositing nodal open-source
et il y en a pleins d'autres , ceux là sont libres !
*****
bon entrainement , a bientôt !


N.B : L'idée de cette page est venue d'une discussion avec un copain , Omar de Tlemcen
grand spécialiste et collectionneur de la monnaie algérienne.


Une erreur ? une remarque ? une question :  lionel3829 <arobas> Gmail.com





mercredi 17 juin 2020

Pendule d'officier - Junghans - Kienzle - Fratelli Borletti


Je me suis offert à un prix trés trés raisonnable cette belle pendule d'officier. 
merci au vendeur .



Le modele original serait fabriqué par Junghans ou Kienzle, deux horlogers allemands aux histoires longues et illustres vers la fin XIX' < 1850 > , avec le logo JungHans une étoile a 5 branches puis a 8 branches .
Le mecanisme serait JUNGHANS W 67  32  2 ???

À une certaine époque (vers 1905), Junghans avait une succursale à Venise (Italie), probablement un dépôt de livraison d'horloges fabriquées en Allemagne.

"Fratelli Borletti"  était la seule usine d'horlogerie en Italie avant la Première Guerre mondiale et ne produisait que des réveils.
Fratelli Borletti a ensuite été renommé «Veglia Borletti» et a produit de nombreux instruments de voiture pour Fiat, Lancia, Daimler et ainsi de suite. Aujourd'hui, Veglia Borletti appartient à Magneti Marelli.




L'horloge Junghans ou Kienzle est un réveil musical tandis que l'horloge Fratelli Borletti a une alarme de type cloche avec un attaquant exactement comme celle de mon achat.

DONC la mienne serait vraisemblablement une Fratelli Borletti datant d'apres la WWI.


Bloqué et avec un spiral tordu , aprés intervention la voici fonctionnant.
il lui manque le poids sur le battant de la sonnerie d'alarme.
Les heures et demi-heures sonnent, tintent .







*******************************************************
La notation sur socle A24S


 Le Timbre

La branche de la raquette bloque une roue 

 Le spiral à redresser

Aprés intervention ca Marche et ca sonne  !!

 

Des logos de Veglia et de JungHans



Des precisions :
https://boowiki.info/art/entreprises-fondee-en-1897/borletti-fratelli.html


Source des info :
antiquevintageclock.com
Lexikon der Deutschen Uhrenindustrie 1850-1980

jeudi 19 mars 2020

Moteur pas à pas commandé par Ir pour Ampli Yamaha . avec Arduino Nano



Je possède un ampli Yamaha qui me donne toute satisfaction .

  
pour info : lien-Web-Yamaha 


je n'ai pas sa télécommande .... et je dois me lever pour modifier le son.
Je ne trouve pas la télécommande originale qui ne doit pas être bon marché.


Alors je vais tenter de réaliser avec Arduino un moyen de tourner le bouton de volume a partir d'une télécommande quelconque ! 

*********
il me faut
une détection Ir
un Arduino Uno pour commencer avec les connections volantes
une télécommande quelconque 
un moteur Pas à Pas
une poulie + courroie (ou élastique)
Un boîtier
l'interface de programmation Arduino
sous Linux dans mon cas .
ET 
faire le programme 
****************
La liste est faite..... c'est parti ! 
 
une détection Ir
un arduino Uno pour commencer
 
Une télécommande quelconque
 et je prévois une deuxième télécommande qui traînait dans un tiroir
  un moteur Pas à Pas
 
Une poulie + courroie 
boutons + élastique
 le boitier 
l'interface arduino

 **************
Pour le programme je ne vais pas réinventer l'eau tiède
la méthode existe.  

il faut
choisir les touches de la télécommande à utiliser
identifier le code de ces touches 
Définir l'action selon la touche pressée
---
Pour le programme 
il faut inclure les bibliothèques
"Infrarouge"
et
"moteur pas a pas"
--
lire le code reçu  par la partie Ir
et
selon ce code 
actionner le moteur  vers la droite ou la gauche.

voici un exemple de code à recevoir et à traiter
Le programme final (trés court)
se trouve tout en bas. 
----
Passons au prototype
Je travaille sur une serviette cela me permet de 
tout faire pivoter d'un coup, c'est bien plus facile .
j'ai utilisé dans un premier temps un Arduino Uno + plus une plaque de connections et tout le câblage volant.
--
voici la partie Ir et sa diode témoin (avec la commande de l'affichage 16*2)
 là tout est câblé et fonctionnel.

il faut maintenant réduire le volume de tout cela
utiliser un Arduino Nano
virer l'afficheur de test , la diode témoin puis souder le tout.

ici l'arduino Nano , bien plus petit.
placer le tout dans le boîtier de pilule après avoir 
forer un trou pour le moteur
 vernir les bavures et rayures
 coller le moteur dans la boite
 et voilà
Pour la poulie , le premier essai fut un échec puis j'ai utilisé des boutons de manteau , là ça marche !
---------
 le contrôleur du moteur
le nano et ses connections
 

 le détecteur ir
 Le tout dans sa boite et la première poulie.

voici le tout en place , je dois repeindre la poulie


J'ai repeint la poulie ... plus joli  , non ?
Les vidéos montrant le fonctionnement 
(fonctionnent elles avec tous les navigateurs ????)
avec la première poulie
et finalement avec la deuxième commande et la deuxième poulie
 


 Amélioration à prévoir

tenter l'implantation sur Arduino Tyni et un I²C pour combler le manque de pattes du Tyni - A évaluer -


Prévoir une touche autre sur la télécommande qui baisse le son d'un coup automatiquement et une autre qui le remet au même volume , en cas de coup de téléphone par exemple une fonction MUTE en quelque sorte

Pour le moment l'appui prolongé ne fonctionne pas (je ne l'ais pas programmé) il le faudrait pour économiser les piles de la télécommande
 
-------------
Le programme  
 

    #include "IRremoteInt.h"
    #include "IRremote.h"
    #include "Stepper.h"
 

    const int RECV_PIN = 8; // reception pin 8
    IRrecv irrecv(RECV_PIN);
    decode_results results;       
    double stepsPerRevolution = 2048;
    Stepper myStepper(stepsPerRevolution, 9, 11, 10, 12);  
    // sequence des pin moteur

    void setup() {
     Serial.begin(9600); // initialisation liaison série
     irrecv.enableIRIn(); // initialisation reception Ir
     irrecv.blink13(true); // la diode implémenté clignote a la reception
     myStepper.setSpeed(10);  // pas du moteur
     } // void setup

    
    void loop() {

           
       if (irrecv.decode(&results)){   // si reception trame correcte
        Serial.println(results.value);  // liaison pc
        irrecv.resume();                      / resume Ir
        }


  switch (results.value) { // debut de la structure code sylver crest  kh 2311
  
    case (16748655):         // cas <<<<<  autre touche
     myStepper.step(-100);
      break;

    case (16756815):         // cas volume -
     myStepper.step(100);
      break;

    case (16724175):         // cas volume +
     myStepper.step(-100);
      break;
   
    case (16740495):         // cas >>>>>  autre touche
     myStepper.step(100);
     break;

    case (1489202892):         // cas commande blanche off = +
     myStepper.step(-100);
     break;

    case (3925222132):         // cas commande blanche on = -
     myStepper.step(100);
     break;


    case (4294967295):       // cas touche enfoncé longuement non fonctionnel
     break;
 }  // fin switch
   
   results.value= 0; // force l' arret du moteur en effaçant le code
   
   
    } //void loop 



**********************************************************


c'est une bien petite réalisation qui permet d'approcher la programmation avec de l'Ir et des moteurs pas à pas, de tenter d'identifier le code Ir des différentes télécommandes
Il faut maintenant l' améliorer !

Je suis preneur de toute suggestion ! 

Cdlt.


LN 03/2020