donderdag 18 augustus 2016

Subsystemen voor Zyptar: De muntautomaat

Zyptar, de toekomstvoorspeller in een doos, werkt wanneer je er geld in gooit. Eigenlijk is Zyptar alleen maar bedoeld voor gasten die betalen voor een consumptie. In plaats van je geld op een schoteltje te leggen kun je het aan Zyptar schenken. Een consumptie kost 50 cent tot een euro en dat moet je dus kunnen "afrekenen".


De muntautomaat is een CH-924 van Adafruit. Hij kan vier munten onderscheiden.


Deze muntautomaat geeft pulsen af als er een munt doorheen komt en je kunt bepalen hoeveel pulsen overeenkomen met een bepaald bedrag.


De muntautomaat
Ik wil het zo maken dat Zyptar afhankelijk van het bedrag iets anders doet. Bij 20 cent voelt hij zich beledig en scheldt hij je uit bijvoorbeeld.


Daarom moet ik mijn vier munten goed kiezen, bijvoorbeeld:


1 euro: 10 pulsen
50 cent: 5 pulsen
20 cent: 2 pulsen
10 cent: 1 puls


Dit betekent dat de gebruiker geen 2 euro munt kan gebruiken. Nu is de maximale consumptieprijs momenteel 1 euro, maar dat kan natuurlijk ooit verhoogd worden. Alternatief is:


2 euro: 20 pulsen
1 euro: 10 pulsen
50 cent: 5 pulsen
20 cent: 2 pulsen


Ik denk dat ik maar het eerste schema aanhoudt (en ik wou dat ik een muntautomaat voor zes munten gekocht had).


Ik wil het zo maken dat er een vier digit display komt waarop je ziet hoeveel cent er is ingeworpen. Je kunt dan op een startknop drukken en dan gaat Zyptar iets doen.


Het programmeren van de muntautomaat gaat door op wat knopjes te drukken en de vier munten er elk 25 keer in te gooien. Het apparaat slaat de karakteristieken van de munt op. Op youtube staat een video die dit uitlegt.






Het apparaat heeft twee data-aansluitingen waarvan ik er één gebruik, namelijk de grijze draad die de pulsen geeft. De grijze draad heb ik in pin 2 van de Arduino Mega gestoken.


Ik heb een testprogrammaatje geschreven dat de werking aantoont:


const byte interruptPin = 2;
volatile int pulseCount = 0;

void setup() {

  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt (digitalPinToInterrupt(interruptPin), countPulse, RISING);
  Serial.begin(9600);
  Serial.println("Coin Acceptor ready");
  pulseCount = 0;
}


void loop() {
  // put your main code here, to run repeatedly:
Serial.println(pulseCount);
delay (1000);
}
void countPulse(){
  pulseCount += 1;
  }


Het koste nog wat gepuzzel om dit voor elkaar te krijgen. Het is bijvoorbeeld echt nodig om de interruptpin als INPUT_PULLUP te definiëren. Als je dat niet doet dan is er geen weerstandje dat de spanning op de pin omhoog trekt en dat betekent dat de spanning op de pin een beetje staat te variëren en de pin dus heel veel niet bedoelde interrupts genereert.


Ook is het nodig om digitalPinToInterrupt te gruiken omdat de pinnummers niet gelijk zijn aan de interruptnummers en per board verschilt dit ook nog.


Wat het programmaatje doet is een parameter pulseCount bijhouden die weergeeft hoeveel pulsen er langsgekomen zijn.


Wanneer pin 2 hoog wordt (er komt een pulse aan), dan wordt countPulse() aangeroepen en die verhoogt pulseCount  met 1. In de onderstaande video zie je wat er gebeurt wanneer ik een euro in de gleuf gooi. Op het scherm zie je de waarde van pulseCount.


video


Nou, weer een stukje Zyptar dat ik onder de knie heb.

Geen opmerkingen:

Een reactie plaatsen