Photbooth avec monnayeur et bouton

Bonjour à tous,

je suis tout nouveau ici et malheureusement grandement débutant dans cet univers de l'Arduino et de la programmation en général.

Je créé ce nouveau sujet car je bosse pour la boite de nuit tenu par 2 potes qui m'ont filé un défi un peu particulier : créer un photobooth fonctionnant avec un monnayeur ainsi qu'en parallèle un bouton poussoir lorsque les soirées sont privatisées.

J'ai tout le matériel :
_ Arduino Uno pour la gestion du monnayeur
_ Arduino Leonardo pour simuler l'appui d'une touche (qui lance la sequence de photo dans le logiciel)
_ Monnayeur de type DG600F qui acceptera les pièces de 10ct/20ct/50ct/1€/2€

Je viens donc vers vous car malgré des heures passées à étudier le sujet celui-ci reste totalement incompréhensible pour moi.

Je bloque sur la programmation pure et dure c'est à dire que dans le cahier des charges le resultat doit etre comme cela :
_ le client insère des pièces jusqu'à la somme de 4€ ou appui sur le bouton poussoir (les 2 manières doivent etre fonctionnelles en parallèle)
_ une fois la somme reçu par le monnayeur ou le bouton enclenché, une simulation d'appui de touche (touche F du clavier par exemple) doit etre effectué afin que le logiciel lance sa séquence qui dure environ 1minute
_ pendant cette minute l'arduino doit alimenter un des fils du monnayeur afin que celui-ci refuse toute nouvelle pièce

Toute la partie logiciel/photographie est prete, il ne me manque plus que la partie monnayeur. (Ce dernier est programmé pour envoyer 1 impulsion pour une pièce de 10ct, 2 impulsions pour 20cts, 5 impulsions pour 50cts, 10 imp pour 1€ et 20 imp pour 2€)

J'ai essayé de charger des codes que j'ai trouvé mais ceux ci ne passent meme pas la vérification dans Guenuino. (et ne répondrait meme pas à mon besoin quoiqu'il arrive)
Je sais que ce n'est pas un sujet facile mais je ne trouve aucune aide pour de gros débutant à ce sujet.

J'espere que vous accepterez de m'aider de n'importe quelle manière et que cela n'est pas insurmontable !

hello
as tu approfondi le lien que tu donnes pour le monnayeur?

on y trouve CECI

qui semble bien contenir un prg Hatermatic qui ressemble beaucoup à ce que tu veux faire

Bonsoir, merci pour la réponse avant tout !

Oui je l'avais vu mais de ce cas le monnayeur n'a pas le même role, car pour ma situation il faut que l'arduino compte jusqu'à la bonne somme (4€).
Une fois que les 4€ sont la, il faut qu'il envoie une commande a un autre arduino qui traduira le signal par une simulation de keyboard.

Dans les faits c'est super simple, mais je suis totalement perdu dans cet univers de codage :confused:

hello
suis pas d’accord avec toi. je n’ai pas détaillé mais:
il me semble bien que tu dois étalonner ton monnayeur en 1er
puis lorsqu’il reçoit une pièce, il t’envoie un code correspondant à la somme

à toi dans ton prg de traiter la réception du message du monnayeur.

regardes le 2 eme code d’exemple, tu y trouveras :

Choose some love based on the amount your client has paid. By using the
// modulo on the NUM constants, we ensure that we never request a string
// with a number higher than we have provided.
if (cashola > 0 && cashola < 5) cheapStrings();
else if (cashola >= 5 && cashola < 10) valueStrings(stringSelect % NUM_V);
else if (cashola >= 10 && cashola <25) qualityStrings(stringSelect % NUM_Q);
else if (cashola >= 25) luxuryStrings(stringSelect % NUM_L);

cashola = 0; // Reset our received cash amount.

il n’y a pas à dire, il va falloir que tu te tapes la doc

Alors toute la partie programmation du monnayeur est faite.

J'ai réussi à trouver un code qui traduit les "Pulse" (impulsions => piece de 2€=4 pulses) et ca fonctionne, le moniteur série m'énumère les pièces que je met dans le monnayeur mais sans les compter.

Maintenant je suis à l'étape où les 4€ ont été insérés. Le Arduino doit donc :
_ déjà réussir à compter jusqu'à 4€ (1€+1€+1€+1€ par exemple)
_ arrivé dans une valeur entre 4€ et 6€ il doit envoyer un courant (de 1 ou 3volts) pendant 1minute via une des pin (pour activer l'inhibiteur du monnayeur, qui n'acceptera plus de pièce le temps de la séance photo)
_ envoyer une commande à l'autre arduino qui simule l'appui sur une touche de clavier

Toute la partie simulation de clavier je l'ai faite, ca doit fonctionner mais je crois que mon Leonardo non officiel est complètement HS (il s'active lorsque je rapproche ma main par exemple....)

Voici le code du monnayeur pour les curieux :

volatile byte CoinPulseCount = 0;
byte NewCoinInserted;
byte Command = 0;
int OpticalCountPin = 3;
volatile unsigned long PulseTime;
 
String OnePulse = "10 cts";
String TwoPulses = "20 cts";
String ThreePulses = "1 €";
String FourPulses = "2 €";
 
void setup(){
        Serial.begin(9600);
        Serial.println("Waiting...");
        Serial.println();
        pinMode(OpticalCountPin, INPUT);
        attachInterrupt(1, CoinPulse, RISING);
}
 
void loop(){
        if(CoinPulseCount > 0 && millis() - PulseTime > 450){
                NewCoinInserted = CoinPulseCount;
                CoinPulseCount = 0;
        }
        switch(NewCoinInserted){
                case 1:
                        Serial.println(OnePulse + " inserted");
                        NewCoinInserted = 0;
                        break;
                case 2:
                        Serial.println(TwoPulses + " inserted");
                        NewCoinInserted = 0;
                        break;
                case 3:
                        Serial.println(ThreePulses + " inserted");
                        NewCoinInserted = 0;
                        break;
                case 4:
                        Serial.println(FourPulses + " inserted");
                        NewCoinInserted = 0;
                        break;

        }
}
 
void CoinPulse(){
        CoinPulseCount ++;
        PulseTime = millis();
}

pour l'instant, ton code prend en compte tes différents appuis sur un BP

tu fais 4 appuis et le moniteur t'affiche 2 euros

la liaison avec le monnayeur n'est pas encore établie.

pourquoi utilises tu 2 platines arduino, la UNO ne te suffit pas?

tu gères le monnayeur, une fois que tu as tes 4 euros, le prog ne peut 'il pas gérer ce que tu demandes à la Léonardo?

dfgh:
...

pourquoi utilises tu 2 platines arduino, la UNO ne te suffit pas?

tu gères le monnayeur, une fois que tu as tes 4 euros, le prog ne peut 'il pas gérer ce que tu demandes à la Léonardo?

Bonsoir
Comme il a déjà un leonardo , je pense qu'il est plus simple de l'utiliser à la fois pour la gestion du monnayeur et l'emulation du clavier par HID USB.

Je pense meme que ce projet pourrais tenir sur un simple digispark à 2€ (comptage et emulation clavier)

oui, et je voulais amener notre ami à me dire pourquoi il veut envoyer un F

dfgh:
oui, et je voulais amener notre ami à me dire pourquoi il veut envoyer un F

Je pense que c'est simplement la touche prevue par le logiciel cible pour prendre une photo

oui, je suppose que c'est le code ascii, une arduino sait le faire par prog pas besoin d'un clavier.

une fois les 4 euros encaissés, un HIGH sur une broche pour neutraliser le monnayeur et le code ascii de 'F' sur TX de la liaison série consacrée. lequel est relié à l'entrée série du "système photo"

dfgh:
oui, je suppose que c'est le code ascii, une arduino sait le faire par prog pas besoin d'un clavier.

une fois les 4 euros encaissés, un HIGH sur une broche pour neutraliser le monnayeur et le code ascii de 'F' sur TX de la liaison série consacrée. lequel est relié à l'entrée série du "système photo"

Oui ,mais il faut que ce soit reconnu/vu comme un appui de touche "F" sur clavier du PC par le logiciel de photo

A partir d'arduino (ou approchant) , il n'y a pas 36 solutions

  • utiliser un arduino pouvant faire nativement en USB de l'HID KEYBOARD (Leonardo, digispark, et autres)
  • utiliser un PC ayant encore du connecteur clavier "PS2" (de + en + rare)
  • utiliser sur le PC un emulateur de clavier "Serial to Keyboard" , solution simple avec un uno par exemple ( je n'ai testé que sous windows)

Il y a surement d'autres "options"

Si je devais faire avec le materiel dont dispose déjà Sawyer et de ce que j'ai compris , je partirais simplement sur un leonardo seul

:slight_smile: ok, merci pour ces précisions, je ne savais pas tout cela

Merci à tous les 2 pour vos réponses !

Alors oui effectivement l’utilisation de la touche “F” est pour le logiciel photo (DSLRbooth) qui reconnaîtra cet appui comme le lancement de la séance photo.

Vous pensez qu’un simple Leonardo peut suffir pour ces 3 fonctions ?

  • analyse et comptage des pulses du monnayeur
  • envoie du HIGH au monnayeur pour l’inhibition
  • envoi de la touche “F” via le HID Keyboard

Depuis ce matin mon Uno sait compter en tout cas !

Par contre j’ai une question un peu autre. Pourquoi lorsque je viens de taper ou copier/coller mon code dans une nouvelle “fenêtre” celui-ci n’a aucune erreur, et lorsque je l’enregistre et que j’essaye de le vérifier à nouveau j’ai l’erreur que vous verrez dans l’image ?

en "copiant", tu n'as pas "oublié" une "}"

Non c'est vraiment qu'à partir du moment où j'enregistre le projet qu'il me fait apparaître l'erreur.
Alors qu'avant l'enregistrement il n'y a aucun soucis lors des verifs et téléversements.

J'ai bien sur essayé de mettre dans un nouveau projet, même résultat !

Bonjour , je pense qu il faudrait le code complet pour voir ou vous avez positionné vos declarations de variables dans un premier temps , ca ne doit pas etre bien mechant .

Sawyer:
Par contre j'ai une question un peu autre. Pourquoi lorsque je viens de taper ou copier/coller mon code dans une nouvelle "fenêtre" celui-ci n'a aucune erreur, et lorsque je l'enregistre et que j'essaye de le vérifier à nouveau j'ai l'erreur que vous verrez dans l'image ?

Bonjour,

J'ai déjà eu ce type de problème.

Normalement en C++ la fonction doit être déclarée avant d'être utilisée.
Avec l'IDE arduino, c'est inutile car celui ci fait cette déclaration à ta place. Mais quelquefois, va savoir pourquoi, ça ne fonctionne pas correctement.
J'ai résolu ce problème en ajoutant une déclaration explicite de la fonction.

Dans ton cas essaie d'ajouter la déclaration

void CoinPulse();

avant le setup.

Merci beaucoup Kamill c'était bien ca, je n'ai plus de problème après enregistrement désormais :wink:

J'ai bien avancé, toute la partie monnayeur est codée !
Il sait analyser les pièces, arduino les comptes et une fois à 4€ ou plus, il envoie pendant 15 sec une inhibition au monnayeur qui n'encaisse plus rien. Au bout de ces 15 sec le crédit total se réinitialise.

Il ne me reste plus que la simulation de la touche à faire et ca sera compilé et partagé avec vous si cela vous intéresse !

Sawyer:
...
Vous pensez qu'un simple Leonardo peut suffir pour ces 3 fonctions ?

  • analyse et comptage des pulses du monnayeur
  • envoie du HIGH au monnayeur pour l’inhibition
  • envoi de la touche "F" via le HID Keyboard

Bonsoir
perso je pense que oui , tes 2 premier points ne necessite pas beaucoup de ressources MCU.

le seul point "dur" eventuel que je vois sur ton projet c'est que tu ne dispose pas d'une vraie info "cycle photo terminée OK"
tu travaille en boucle ouverte , mis ça n'est peut etre pas du tout un probleme

Bonsoir à toi,

pour le point que tu soulèves, j'ai mis un delay, qui au bout de 1 minute relâche l'inhibiteur du monnayeur.

J'ai mis une minute car la boucle du logiciel photo (prise de 4 photos + montage + imprime + retour à l'écran "insérerez crédit") dure un peu moins d'une minute. :slight_smile: