Blaster: Licht und Sound für Cosplay Projekt

Moin zusammen.

Ich stell‘ mich hier mal vor. Ich bin Enno, 35 aus Weener in Ostfriesland, von Beruf Elektroniker für Betriebstechnik.

Mit Platinenlöten und Programmierung habe ich bisher nicht so viel zu tun gehabt, bis auf ein paar Unterrichtsstunden in der Berufsschule, während meiner Lehre.

Beste Voraussetzungen also :laughing:

Für ein Star Wars Cosplay Projekt habe ich mir in den Kopf gesetzt eine Blasterpistole, die ich per 3D Drucker gedruckt habe, mit Licht und Sound auszustatten.
So sieht der Blaster erstmal aus:

Und so in Einzelteilen:

Den Korpus vorne habe ich ausgehölt auf 50x100mm und pro Hälfte 15mm tief.
Zum Abzug und zum Magazinfach habe ich auch Gänge vorbereitet, damit per Mikrotaster ein Sound abgespielt werden kann.
Mein Plan ist es jetzt drei Soundeffekte (Blast, Dry fire, Reload) abzuspielen und bei jedem Schuss soll eine LED aufblitzen.

Jetzt habe ich mir gedacht, dass ich das ganze doch mit einem Nano Board, einem DFPlayer, Mikrotastern, Lautsprecher usw. realisiere.

Nun meine Frage an euch: Wie setze ich das am besten um? Auf einer Lochrasterplatine oder mit direkter Verdrahtung? Welche Akkus kann ich nutzen? Wichtig wäre, dass ich von außen maximal einen Ein-Aus-Schalter und eine USB-C Ladebuchse sehen kann.
Da ich vom programmieren nicht viel Ahnung habe, habe ich mal ChatGPT gefragt (Asche auf mein Haupt).
Die KI hat mir folgendes ausgespuckt:

#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>

SoftwareSerial dfSerial(10, 11);
DFRobotDFPlayerMini dfPlayer;

// Pins
const int triggerPin = 2;
const int reloadPin  = 3;
const int ledPin     = 5;

// Settings
const int maxAmmo = 10;
int ammo = maxAmmo;

unsigned long lastShotTime = 0;
const int fireDelay = 150; // Feuerrate (ms)

bool lastTriggerState = HIGH;
bool lastReloadState  = HIGH;

void setup() {
  pinMode(triggerPin, INPUT_PULLUP);
  pinMode(reloadPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);

  dfSerial.begin(9600);
  dfPlayer.begin(dfSerial);
  dfPlayer.volume(25);
}

void loop() {
  handleTrigger();
  handleReload();
}

//  Trigger Logik
void handleTrigger() {
  bool state = digitalRead(triggerPin);

  if (lastTriggerState == HIGH && state == LOW) {

    if (millis() - lastShotTime > fireDelay) {

      if (ammo > 0) {
        fireShot();
        ammo--;
      } else {
        dryFire();
      }

      lastShotTime = millis();
    }
  }

  lastTriggerState = state;
}

//  Reload Logik
void handleReload() {
  bool state = digitalRead(reloadPin);

  if (lastReloadState == HIGH && state == LOW) {
    reloadMag();
  }

  lastReloadState = state;
}

//  Schuss
void fireShot() {
  dfPlayer.play(1);

  // realistischer Blitz
  digitalWrite(ledPin, HIGH);
  delay(30);
  digitalWrite(ledPin, LOW);
  delay(20);
  digitalWrite(ledPin, HIGH);
  delay(20);
  digitalWrite(ledPin, LOW);
}

//  Leer
void dryFire() {
  dfPlayer.play(2);
}

//  Reload
void reloadMag() {
  dfPlayer.play(3);
  ammo = maxAmmo;
}

Ergibt das irgendwie Sinn?

Beste Grüße

Enno

Willkommen im Forum.
https://wolles-elektronikkiste.de/dfplayer-mini-ansteuerung-mit-dem-arduino
Dort ist alles erklärt.

Hier mit ATtiny 85, ist ziemlich unten.

Dankeschön für deine Antwort.

Den Blast Sound würde ich gerne 10 mal abspielen und danach den dry Fire Sound, so lange bis man nachlädt. Ist das mit dem Attiny auch möglich?

Gruß
Enno

macht es das was du willst? Wenn ja, dann passt es.
Wenn nicht, solltest du zunächst exact beschreiben was genau in welcher reihenfolge bei welcher Aktion passieren soll.

Ist doch prima, funktioniert es denn auch ?
Wenn nicht, frage ChatGPT solange, bis es funktioniert.

Wer di KI verwendet, sollte schon Wissen, was da passiert und damit umgehen können.

Also es soll beim Betätigen des Abzugs ein Blast Sound abgespielt werden. Das soll zehn mal passieren und danach nur noch ein dry fire, also klick, Sound gespielt gespielt werden. So lange bis das Magazin entfernt und wieder eingesetzt wird.
Danach soll der Zyklus von vorne durchgespielt werden können.

Außer, dass es gestern kurz gequalmt hat, ist nichts passiert. Direkte Verdrahtung ist wohl nicht so praktsich.

Was?
Zeichne mall wie wurde das zusammen gebaut, Schema wehre besser.

Nur dann, wenn du es falsch angeschlossen hast.
Zeige mal ein Foto, wie deine Verdrahtung aussieht und wo es gequalmt hat.

Ich sag‘s mal so: wenn ich wüsste wie es funktioniert hätte ich wahrscheinlich nicht die KI gefragt :wink:

Das geht leider nicht mehr. Ich hab’s direkt nach dem Qualmen wieder auseinander genommen.
Ich vermute, dass ich mit der groben Lötspitze einen Kurzschluss eingebaut habe. Es hat zumindest am Spannungseingang zum DFPlayer gequalmt

Nicht kontrolliert nach dem Eingriff, na ja Fehler muss man ausbaden :joy:
Gerade du solltest wissen was man tut.

Falscher Ansatz. Um die KI sinnvoll nutzen zu können, muss man über genügend Kenntnisse verfügen, um die Antwort bewerten zu können und die Fehler der KI erkennen/beseitigen zu können.
Die KI wird Dir keine Probleme lösen können, die Du nicht selbst lösen könntest. Sie kann Dir lediglich Schreibarbeit abnehmen.

Gruß Tommy

Na doch, Sichtprüfung und anschließendes Messen waren unauffällig. Gequalmt hat’s trotzdem

Wahrscheinlich hast du recht. Dann werde ich mir für das eine Projekt wohl das programmieren beibringen müssen. Oder hast du eine andere Idee?

Die Basisgrundlagen von C++ sollten dir vorher schon bekannt sein. Tommy hat dir ja schon geschrieben, wie es richtig geht.

Zumindest die Grundlagen von C++ wirst Du lernen müssen, um wenigstens bestehende Quelltexte verstehen zu können oder das Projekt als Lohnarbeit (engl. Forum) vergeben.

Gruß Tommy

Neben dem typisch deutschen Aufzählen der Fehler, immerhin mal eine hilfreiche Antwort.
Danke dir Tommy.

Kann geschlossen werden.

Verstehe ich nicht.
Wenn wir dich nicht auf deine Fehler hinweisen dürfen, was willst du dann hier?

also ich würde das als state machine bauen. Dann ist das mit den Statusübergängen einfacher zu formulieren.

du beginnst mit anumition = 10.
Am Anfang ist das Gerät im Status LOADED.
Jeder trigger verringert die anumition um 1.
Nach dem Trigger fällt der Status fällt zurück in LOADED.
Außer die anumition = 0. Dann fällst du zurück in EMTPY.
Dort wartest du auf die Magazin Entnahme. Sobald das Magazin entnommen wird, landest du im NO_MAG (da könnte man künstlich auch eine kleine Wartezeit einplanen für das "aufmagazinieren").
Im NO_MAG wartest du darauf dass das Magazin wieder angesteckt wird.
und damit lädst du die anumition wieder auf 10 und wechselst in LOADED.

ca so:

Macht das aus deiner Sicht das was du haben willst?

Das mit einer kleinen Button Klasse für den trigger und dann lässt sich das runter programmieren.