Programmcode für Servosteuerung einbinden

Moin zusammen,

ich bräuchte mal eure Hilfe für die Einbindung eines Prorammes.
Für einen Geocache habe ich den TonUnio ausgewählt. Wenn eine besteimmte Karte abgespielt wird, soll ein Servo angesteuert werden um das Logbuch freizugeben.
Ich habe versucht den Code einzubinden, leider wird der Servo nicht richtig angesteuert. Beim auflegen einer belibigenden Karte zuckt der Servo ein bischen.
Vielleicht könnt hier mir dabei helfen, das es klappt.

Hier der CODE:


#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>

#define SS_PIN    10
#define RST_PIN   9
#define SERVO_PIN A5

MFRC522 rfid(SS_PIN, RST_PIN);
Servo servo;

byte authorizedUID1[4] = {0xA3, 0x12, 0x8F, 0x97};
byte authorizedUID2[4] = {0x04, 0xAA, 0xA9, 0x33};

int angle = 0; // the current angle of servo motor

void setup() {
  Serial.begin(115200);
  SPI.begin(); // init SPI bus
  rfid.PCD_Init(); // init MFRC522
  servo.attach(SERVO_PIN);
  servo.write(angle); // rotate servo motor to 0°

  Serial.println("Tap RFID/NFC Tag on reader");
}

void loop() {
  if (rfid.PICC_IsNewCardPresent()) { // new tag is available
    if (rfid.PICC_ReadCardSerial()) { // NUID has been readed
      MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);

      if (rfid.uid.uidByte[0] == authorizedUID1[0] &&
          rfid.uid.uidByte[1] == authorizedUID1[1] &&
          rfid.uid.uidByte[2] == authorizedUID1[2] &&
          rfid.uid.uidByte[3] == authorizedUID1[3] ) {
        Serial.println("Authorized Tag 1");
        changeServo();
      } else if (rfid.uid.uidByte[0] == authorizedUID2[0] &&
                 rfid.uid.uidByte[1] == authorizedUID2[1] &&
                 rfid.uid.uidByte[2] == authorizedUID2[2] &&
                 rfid.uid.uidByte[3] == authorizedUID2[3] ) {
        Serial.println("Authorized Tag 2");
        changeServo();
      } else {
        Serial.print("Unauthorized Tag with UID:");
        for (int i = 0; i < rfid.uid.size; i++) {
          Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
          Serial.print(rfid.uid.uidByte[i], HEX);
        }
        Serial.println();
      }

      rfid.PICC_HaltA(); // halt PICC
      rfid.PCD_StopCrypto1(); // stop encryption on PCD
    }
  }
}

void changeServo() {
  servo.write(150);
  delay(500);
  servo.write(0);
}

Danke für eure Zeit und Hilfe…

Liebe Grüße aus Bremen

Peter

Hi ich denke du solltest dir lieber die rfid Nutzung aus dem TonUINO extrahieren als den Servo integrieren.

Bekommst du den Servo denn ohne den TonUINO drumherum zum laufen?

1 „Gefällt mir“

moin Marco117,

Danke für deine Antwort,
ja, der Servo läuft solo auf ein Tonuino classic Board.
Für deinen Vorschlag fehlt mir das Wissen.
ich wüsste nicht wo ich da anfangen sollte…

Probier mal dich etwas in die Modifier einzuarbeiten.

Die sind besser geeignet als es direkt in die loop zu packen, da sie eine eigene loop haben und eine intialisierungsphase.

Es geht aber auch in der DEV ab Zeile 851

void playFolder() {
Serial.println(F("== playFolder()")) ;
disablestandbyTimer();
knownCard = true;
_lastTrackFinished = 0;
numTracksInFolder = mp3.getFolderTrackCount(myFolder->folder);
firstTrack = 1;
Serial.print(numTracksInFolder);
Serial.print(F(" Dateien in Ordner "));
Serial.println(myFolder->folder);

Wenn du das ergänzt um

servo.write(150);
delay(500);
servo.write(0);

Wird immer wenn ein Track gespielt werden soll der servo bewegt.
Also eine Karte die Track b eins aus Ordner eins spielen soll, startet den servo.

Eine andere Karte startet nichts.

Ich denke auch dass er hier falsch ist, denn mit einem tonuino hat der Zweck nichts mehr zu tun.

@DerPeter hast du dir mal die Beispiele der bibliothek zum RFID angesehen? Da wird sicher schon etwas passendes bei sein wo dann nur noch der servo rein muss.

Dann muss es denn eine RFID Karte sein? Also gibt es auch die Möglichkeit etwas falsches zum Öffnen zu probieren?
Oder geht auch ein versteckter Magnet Schalter der den servo startet?

Oder ausschließlich mechanisch? Ich möchte ein Schachbrett als Cache bauen und wenn man die richtige Figur setzen möchte, zieht man einen Stift mit raus und dieser lässt das Schloss öffnen.
So erstmal eine Idee.

Sag mal mehr zu deiner Idee, vielleicht finden wir etwas völlig anderes

Mir ist nach dem Schreiben meiner Nachricht auch aufgefallen das @DerPeter gar nicht mitteilt ob er nicht tatsächlich den TonUINO in seiner Grundfunktionen verwendet oder nicht.

moin zusammen,
danke für eure Antworten, ich werde da mal nachschauen.
Zum Cache selber, in der Box wird ein Ring mit 50 Tags sein. Jeder spielt eine andere mp3 Datei ab. Nur bei der einen wird das Fach mit dem Logbuch geöffnet.
Ich finde schon, daß Tonuino hier für ideal ist.

Sobald der Cache fertig ist, kann ich gerne Fotos und ein Video hochladen.
LG Peter

In dem Fall wurde ich auch den TonUINO als Basis nehmen.

Für den Servo empfehle ich dir einen Modifier zu erstellen bzw. einen Vorhandenen zu ändern.
Dann bleibt der Code für den Servo in der Modifier Klasse. Das klingt auch komplizierter als es ist.
Du wirst wahrscheinlich über die Modifier einfacher ans Ziel kommmen.

An einigen Punkten im Gesamt Code werden Methoden aus der Modifierklasse aufgerufen und abgehandelt, falls ein Modifier aktiv ist.
z.B. wenn eine Karte aufgelegt wird und auch bei jedem loop durchgang.

Es gibt auch bei Aktivierung eine Initialisierungsphase.

In der Initphase kannst du deinen Servo die Kiste öffnen lassen und etwas abspielen.

In der Loop kannst du z.B. Abfragen ob der Deckel wieder zu ist und bei geschlossenem Deckel dreht der Servo die Kiste zu und entfernt den Modifier.

1 „Gefällt mir“

Absolut.

Geht auch ohne tonuino, aber auf jeden Fall ist diese Richtung die einfachste.

@marco-117 Ich komme überhaupt nicht weiter,…
Hast Du vielleicht ein Tipp für mich, wie ich da weiterkomme. Mit den Classen von Java habe ich keine Ahnung. Sonst aber auch nicht viel vom Programimeren.
Wenn ich was einfüge, hängt das Programm an stellen, wo ich garnicht weis, warum es jetzt da hängt.



// MFRC522
#define RST_PIN 9                 // Configurable, see typical pin layout above
#define SS_PIN 10                 // Configurable, see typical pin layout above
#define SERVO_PIN A5              // Setzt ServoPIN
int angle = 0; // the current angle of servo motor
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522
Servo servo;
  servo.attach(SERVO_PIN);
  servo.write(angle); // rotate servo motor to 0°
MFRC522::MIFARE_Key key;
bool successRead;
byte sector = 1;
byte blockAddr = 4;
byte trailerBlock = 7;
byte authorizedUID1[4] = {0xA3, 0x12, 0x8F, 0x97};
byte authorizedUID2[4] = {0x04, 0xAA, 0xA9, 0x33};

Dann bekomme ich weiter oben bei playFolder(); eine Fehleremeldung beim Überprüfen


  public:
    virtual bool handleNext() {
      Serial.println(F("== KindergardenMode::handleNext() -> NEXT"));
      //if (this->nextCard.cookie == cardCookie && this->nextCard.nfcFolderSettings.folder != 0 && this->nextCard.nfcFolderSettings.mode != 0) {
      //myFolder = &this->nextCard.nfcFolderSettings;
      if (this->cardQueued == true) {
        this->cardQueued = false;

        myCard = nextCard;
        myFolder = &myCard.nfcFolderSettings;
        Serial.println(myFolder->folder);
        Serial.println(myFolder->mode);
        playFolder();
        return true;
      }
      return false;


Kanst Du mir ein Strukturbeispiel zeigen, wie das hier funktioniert ?

LG Peter

Was hast du denn eingefügt und wie merkst du wo es hängt?

@raznz_snasna
Wie müste ich es ändern, das wenn der Track 1 im Ordner 2 abgespiet wird, sich auch der Servo bewegt? Bei Tracks aus dem Ordner 1 soll der Servo sich nicht bewegen.

LG Peter

If (myFolder->folder == 2) {

servo.write(150);
delay(500);
servo.write(0);
}

@raznz_snasna
Danke, jetzt geht es. Das hat mir sehr geholfen :+1:

1 „Gefällt mir“