Mira's Münzbox mit Ultraschallsensor statt RFID

Mira’s Münzbox mit Ultraschallsensor

… Vorgeschichte …

Ich wollte mal einen Jukebox ähnlichen Tonuino bauen, wo man Münzen/Chips einwirft und dann ein zufälliges oder ein (durch RFID ID/Karte) bestimmtes Lied abgespielt wird. Wenn man mehrere Münzen einwirft, sollte die Warteschlange (animiert durch einen LED-Streifen/Ring) anwachsen. Mir schwebte ein Retro-Design im Stile einer Mini-Jukebox vor: Eine aufrechte, oben abgerundete Kiste mit zentralem Einwurf, links und rechts zwei runden Elementen (Drehencoder und Mini-Lautsprecher). Dann machte ich mich ans Werk und heraus kam … doch was anderes. ^^

Als ich dann die grandiose Rakete von Gabali sah,

war klar, dass mir der RFID Ansatz zu kompliziert war. Der RFID-Chip müsste ja in kurzem Abstand und mit nicht zu großer Geschwindigkeit am Sensor vorbeifallen, damit genügend Zeit, diesen zu lesen. Und wenn man genau diesen Chip abspielen will, wäre in diesem Fall das Herauskramen aus dem Auffangbehälter ziemlich nervig.

Da kam mir die Idee einen Ultraschallsensor anstelle des RFID-Sensor zu nutzen. Damit müsste ich

  • von der Entfernung her variabler sein,
  • es braucht keine Information ausgelesen werden und
  • ich könnte alles mögliche durchwerfen (bspw. stilecht auch Münzen)

Nachteil ist natürlich, dass man keine Musik gezielt abspielen kann.

Aber nach meiner bisherigen Erfahrung mit der Zielperson, war „irgendeine Musik“ wichtiger als „die Musik“.

Hardware

Der Entwurf blieb von der ursprünglichen Idee inspiriert:

  • links einen Mini-Lautsprecher
  • rechts einen Drehencoder
  • in der Mitte der Münzeinwurf
  • eine Neopixel-Animation als Ring um den Münzeinwurf
  • dazu ein an/aus Schalter
  • Powerbank für’s „to go“

Als Konstrukt wurde es eine einfache Box. Unbeabsichtigt ist es irgendwie doch ähnlich wie die erste Box geworden.

Bei der Unterkonstruktion habe ich bisher noch keine Muse gefunden, mich (nochmal) auf den Weg zum Schiegervater zu machen und ein paar Holzbretter zurecht zu sägen. Bis jetzt tut es die Pappkonstruktion auch.

Die Löcher für den LED-Ring habe ich eines Abends nachträglich mit einem Dremel (darf man das so schreiben, auch wenn es kein echter war - siehe Lego/Klemmbaustein :crazy_face:) reingebohrt/fräst, da hier wieder keine Bohrmaschine mit passendem Bohrer rechtzeitig für meinen Tatendrang zur Hand war. Leider ist mir an ein paar Stellen der Dremel kurz abgerutscht.

Video:

Teileliste

Stelle ich bei vorhandener Zeit nochmal zusammen
Im Prinzip sollte auf dem Schaltplan und den Bildern aber alles drauf sein.

Software

Bei der Software hatte ich vorab angefangen, die DEV-Version ein bisschen aufzuräumen, damit ich auch durchsteige, wo ich was ändern muss. Die anfängliche Implementierung für den Ultraschallsensor nach den üblichen Tutorials hat einfach funktioniert. Bei der Ergänzung um den Drehencoder, fiel dann aber die inherente Verzögerung der pulseIn() Funktion negativ auf, sodass ich die Pulserkennung nachimplementieren musste.

Für den Münzeinwurf habe ich einen eigenen kurzen Sound (von Mario der Coin-Sound) und eine kurze Ladeanimation für den LED-Ring implementiert. Erst danach wird ein zufälliges Lied und die rotierende Regenbogen-Animation abgespielt. Zusammen mit dem Klimpern der Münzen findet zumindest der Papa das sehr gut und die Kleine auch, denke ich.

Schaltplan

… Erkenntnisse …

… über den Ultraschallsensor:

  • Eine rasch eingeworfene / fallende Münze wird zuverlässig erkannt.
  • Man kann nur bedingt bestimmen kann, wo etwas wie zurück zum Sensor reflektiert wird.
  • Mittlerweile habe ich alle Kanten unterhalb des Deckels mit Malertape provisorisch überklebt, in der Hoffnung ungewollte Reflexionen zu reduzieren.
  • Das Ein/Auschieben der Auffangbox triggert gelegentlich den Sensor. Vermutlich von der hinteren Wand, so genau lies es sich bisher nicht reproduzieren. Den Sensor etwas hören setzen/ausrichten, würde es wohl lösen.

… über den Drehencoder:

  • Ohne Platine sollte man Aufpassen, weil die Anschlüsse der Beinchen auf der gegenüberliegenden Seite wieder heraustreten können (siehe )
  • Mit einem Pololu Switch hätte ich mit den Ein/Aus-Schalter sparen können und dafür den Button des Drehencoders nutzen können. Dann wäre das Design etwas sauberer. Aber der Tester spielt mittlerweile gern mit dem An/Aus-Schalter herum, also alles richtig gemacht. :slight_smile:

… über die LED-Animation:

  • Coole Sache, könnte ich stundenlang zuschauen

… über den Tester:

  • Das Spielen mit den Münzen ist mitunter interessanter als die Box. Oder auch das Verstecken. Neulich suchte ich 9 von 10 Münzen, bis sich die Spielpuppe durch ein Klimpern verraten hat: Da waren die Münzen in den Overall gesteckt worden und hatten sich am Fuß gesammelt … ein echter Sparstrumpf. :laughing:
  • Anfangs wurden fein säuberlich ALLE 50 Münzen hintereinander eingeworfen, die Auffangbox (vom Papa) herausgezogen und das Ganze wiederholt. Nach dem dritten Durchlauf wurde die (vom Papa hineingeschobene) Auffangbox wieder ein Stück herausgezogen und die Münzen direkt in die Auffangbox geworfen … wer braucht den diesen doofen, engen Spalt … Danke. :angry:

Werdegang

6 „Gefällt mir“

Hier noch ein bisschen Code von den Ultraschall Implementierung:

uint32_t sonic_duration = 0; 
uint16_t sonic_distance = 0; 
bool sendSonicWave = true;
bool timedOut = false;
uint32_t sendHighTime = 0;
uint32_t receiveHighTime = 0;

void TonuinoUltraSonic::setup(uint8_t triggerPIN, uint8_t echoPIN)
{
	pinTrigger = triggerPIN;
	pinEcho = echoPIN;
	
	pinMode(pinTrigger, OUTPUT); 
	pinMode(pinEcho, INPUT); 
	digitalWrite(pinEcho, LOW); 
}

uint16_t TonuinoUltraSonic::read()
{
	//sonic_duration = pulseIn(pinEcho, HIGH); // blocks current thread -> breaks encoder timing
	if (sendSonicWave)
	{
		digitalWrite(pinTrigger, HIGH); 
		digitalWrite(pinTrigger, LOW);
		sendSonicWave = false;
		timedOut = false;
		sendHighTime = micros();
		receiveHighTime = sendHighTime;
		sonic_duration = 0;
	}
	else 
	{
		// wait for wave echo start
		if (digitalRead(pinEcho) == HIGH)
		{
			if (receiveHighTime == sendHighTime)
			{
				receiveHighTime = micros();
			}
		}
		sonic_duration = micros() - receiveHighTime; // time since sending high / receiving first high
		// wait for wave echo end
		if (receiveHighTime > sendHighTime)
		{
			if (digitalRead(pinEcho) == LOW) // sonic end
			{
				sendSonicWave = true;			
			}
		}
		if (receiveHighTime == sendHighTime ? 
		    sonic_duration > 100UL * 1000 :  // timout for missing high
			sonic_duration > 100UL * 1000) 	  // timout for missing low 
		{
			timedOut = true;
			sendSonicWave = true;
		}
	}
		
	sonic_distance = 0;
	// send distance only for first appearance
	if (sendSonicWave && !timedOut) // = sonic received here
	{
		sonic_distance = sonic_duration * 0.1716; //mm
		//Serial.print(F("Duration: "));
		//Serial.println(sonic_duration);
		if (sonic_distance < 2000)
		{
			Serial.print(F("Distance: "));
			Serial.println(sonic_distance);
		}
	}
	return sonic_distance;
}

Das Handling im loop() des Main Controller sieht dann so aus:

uint16_t distance = ultraSonicSensor.read();
if (distance > 20 && distance < 60)
{
	sonicCounter++; 
}
if (distance > 60)
{
	if (sonicCounter > 1 && !countdownNextTrack) // avoid outliers and prevent new call while countdown
	{
		dfPlayer.pause();
		delay(100);
		dfPlayer.playAdvertisement(262);
		countdownNextTrack = true;
	}
	sonicCounter = 0;
}
if (countdownNextTrack && neopixelRing.limitedAnimationFinished)
{
	dfPlayer.nextTrack();
	countdownNextTrack = false;
}

Sehr schöne Idee, mal sehen was das Gehäuse daraus macht.

Meine Güte, hier schießt einer mit Kanonen auf Spatzen. Mit Kollateralschaden als Fehlerkennungen.
Kleine Rollenschalter oder eine Lichtschranke sollten den Aufwand im Code zurück Schrauben, zuverlässiger schalten und günstiger sein.
Oder eine Mechanik die den Durchmesser der Münze erkennt und auf deren Wert schließt.
2 Euro wird als nächstes gespielt, 20Cent müssen sich hinten anstellen.

Sollen es auch 50 mögliche Lieder werden?
12 Positionen ist der größte den ich gerade finde.
Oder du baust ein Display ein, an dem du über einen weiteren Drehencoder auswählst und der Münzwurf dann startet.
Oder in Verbindung mit einer Liste Einen BCD Schalter

Nur so eine Idee. Du könntest ja den RFID Reader trotzdem integrieren um z.B. mit der RFID Karte die zu Spielende Musik vorher auswählen zu können. Also entweder Kinderlieder, oder Kurzgeschichten u.s.w. Du müsstest den Code nur so anpassen, dass die Wiedergabe noch jedem Titel pausiert und bei Münzeinwurf der nächste track gespielt wird.

2 „Gefällt mir“

@raznz_snasna: So groß war die Ultraschallkanone anfangs nicht. Ich habe mich an diese Anleitung gehalten:
https://funduino.de/nr-10-entfernung-messen

also somit als Quintessenz folgendes im loop() gehabt:

digitalWrite(trigger, HIGH); 
digitalWrite(trigger, LOW);
dauer = pulseIn(echo, HIGH); 
entfernung = (dauer/2) * 0.03432; 

Das schien mir softwareseitig relativ simpel.
Und von der technischen Seite her, kann ich mit dem Sensor halt auch noch andere Sachen machen (hatte ein 5er Pack bestellt).

Bez. Lichtschranke:
Daran hatte ich auch gedacht. Aber ich wusste nicht, ob der Durchgang breit und lang genug ist. Zudem erschien mir (wie gesagt) der Ultraschallsensor multifunktionaler.

Bez. mech. Schalter:
So etwas kannte ich noch nicht. Hier könnte es aber schwer werden, verschieden große Münzen zu erkennen, vermute ich.

Bez. 50 Münzen / Lieder:
Das waren nur ca. die Münzen, die ich noch im Bastelvorrat herumliegen hatte. Aktuell sind nur 9 (ehemals 10 ^^) Münzen im Umlauf, um das Durcheinander im Zimmer zu reduzieren.
Lieder sind aktuell ca. 250 Kinderlieder in einem Ordner, wovon eine zufällig gespielt wird (Hörspiel).
Es soll eigentlich keine Münze individuell bzw. die Encoder-Stellung ausgewertet werden, um eine Musik auszuwählen.

Bez. des 12 Positionen Encoder:
Schöne Idee. Ich wusste nicht, dass es so etwas auch gibt. Notfalls (und unlimitiert) kann man es auch softwareseitig lösen - aber dann fehlt natürlich die Zuordnung zur Position/Markierung auf der Abdeckung des Encoders.
Zudem ist der Encoder primär für das Einstellen der Lautstärke gedacht. Eine feste Encoder-Stellung (eines Encoders) würde dann für Lautstärke und Musikauswahl zutreffen.

Bez. Display-Anzeige:
Da habe ich auch schon darüber nachgedacht. Die Zielgruppe kann aber noch nicht lesen.
Notfalls kann man auch den LED-Ring als Anzeige verwenden. Lichteranzahl und/oder Farbe einer Musikauswahl zuordnen.

Bez. Musikauswahl:
Da hatte ich auch verschiedene Überlegungen.
Beispielweise den Ordner wechseln per
A) Langem Drehencoder-Klick

  1. Musikauswahl durchgehen (1->2->3->1->…) oder
  2. Akustik-Menu aktivieren (s. Admin-Menu) und per Encoder-Drehung Musik auswählen

B) Druck zusätzlicher Taste(n)

  1. Mit einer Taste: 1->2->3->1->…
  2. Mit Vor/Zurück Taste
  3. Mit mehreren Tasten: Definierte Musik auswählen (aka Shortcut)

Für weitere haptische Taster war in der Box allerdings kein Platz.
Zudem sollte das Design kompakt und reduziert sein und der Fokus auf Münzeinwurf liegen.

Bez. zusätzlichem RFID Reader:

  • Das ist auch eine gute Idee. Das würde zumindest das Design schlicht lassen. Im Grunde hätte man dann einen (Zufallslied)Tonuino, wo der Münzeinwurf die Vor/Zurück-Tasten ersetzt.
  • Aktuell würde er vom Platz her aber nur an die Seite passen. Bei einer Neukonstruktion (bspw. mit Pololu-Switch statt An/Aus-Schalter) wäre wohl auch obendrauf ausreichend Platz.
  • Von den Anschlüssen her müsste dann der Ultraschallsensor an die analogen Pins wandern, aber afaik müsste das auch funktionieren, oder?! Der braucht ja nur High/Low zu interpretieren.

Ausblick Musikauswahl
Mit der aktuellen Box würde ich Variante A2 (Akustik-Menu per Drehencoder) mit zusätzlichen LED-Visualisierung versuchen.
Bei einer Neukonstruktion würde ich vermutlich den RFID-Reader integrieren.
So oder so gibt es erst einmal keine (Kunden)Anfrage bez. einer Musikauswahl. :wink:

Ich habe mal noch ein Video hochgeladen und im Startbeitrag verlinkt.

1 „Gefällt mir“

Der Münzensound ist der beste…
Du kannst die Löcher vom Ring noch mit durchsichtigem Kleber / Heißkleber füllen, ich denke das macht einen schöneren Eindruck.
Edit: Ring nochmal ab, Klebeband von oben und dann die Löcher mit Kleber auffüllen.

Oh ja, da werden Kindheitserinnerungen wieder wach bei dem Sound :yum:
Ich muss glaub meine NES mal wieder reaktivieren :upside_down_face:

Hatte ich auch schon überlegt. Aber ich wusste nicht, ob er Heißkleber dann nicht zu milchig wird, wenn ich das irgendwie glatt streiche. Mit der Füllung von hinten könnte es klappen, danke für den Tipp.