AS5600 programmierung

hallo liebe Gemeinde

ich habe folgendes Problem:

ich benötige eine genaue Positionsbestimmung mittels AS5600

nur bekomme ich es einfach nicht hin, dass der Motor irgendwas macht ausser zu brummen

#include <Wire.h>
#include <AS5600.h>

AS5600 as5600;

const float zielWinkel = 70.0;
const float endwinkel = 0.0;

// Motoranschluesse
// Sie können hier die Pinbelegung beliebig aendern
//int EnA = 44; //nicht aktiv
//int EnB = 46; //nicht aktiv
int In1 = 6;
int In2 = 7;


void setup() {
pinMode(In1, OUTPUT);
pinMode(In2, OUTPUT);

  Serial.begin(115200);
  Wire.begin();
  as5600.begin();
  
  // Motor starten (Beispielhaftes Signal)
  digitalWrite(In1, LOW);
  digitalWrite(In2, HIGH);
}

void loop() {
  // Aktuellen Winkel in Grad auslesen (0.00 bis 360.00)
  float aktuellerWinkel = as5600.readAngle() * 360.0 / 4096.0;
  
  // Sobald 70 Grad erreicht oder überschritten sind: Motor stoppen
  if (aktuellerWinkel >= zielWinkel) {
    digitalWrite(In1, LOW); // Motor aus
    digitalWrite(In2, LOW);

    delay(3000);
    
  digitalWrite(In1, HIGH);
  digitalWrite(In2, LOW);

  if (aktuellerWinkel <=endwinkel){
    digitalWrite(In1, LOW);
    digitalWrite(In2, LOW);
  }
  }
  
  delay(10); // Kurze Pause zur Stabilisierung
}

das ist mein aktueller sketch aber damit geht (egal wie nich drehe und wende) nichts :frowning:

ich hoffe ihr könnt mir helfen

ich verzweifle noch daran

lg

Funktionieren die Beispiele aus der Bibliothek?
Es gibt auch vielle Beispiele im Netz.

mit diesem sketch zeigt er mir die winkel an

#include <AS5600.h>

// Erstelle ein Sensor-Objekt (Standard I2C-Adresse 0x36)
AS5600 as5600; 

void setup() {
  Serial.begin(9600);
  Wire.begin();
  
  // Sensor initialisieren
  as5600.begin();
  //as5600.setAddress(0x36); // Standardadresse
  
  // Prüfen, ob der Magnet erkannt wird
  while (as5600.detectMagnet() == 0) {
    Serial.println("Kein Magnet gefunden!");
    delay(500);
  }
}

void loop() {
  // Rohwert (0 - 4095) oder direkt den Winkel in Grad (0 - 360) auslesen
  int rawAngle = as5600.rawAngle();
  float degrees = as5600.readAngle() * AS5600_RAW_TO_DEGREES; // Umrechnung zu Grad

  Serial.print("Winkel: ");
  Serial.print(degrees);
  Serial.println(" °");
  
  delay(100);
}

aber den Motor steuert er mit meinem sketch nicht :frowning:

er soll im Prinzip den motor um 70 Grad in eine richtung drehen und dann an seinen startpunkt zurückfahren nach 3 sekunden wartezeit.

aber egal was ich mache der motor bewegt sich nicht.

vllt ist es wichtig zu wissen, dass der motor über ein L298N gesteuert wird

ich könnte mir auch vorstellen, dass es mit den 2 "if-Funktionen" zusammen hängt

ich weiss nur nicht wie ich es anders lösen soll

Du beschäftigt sich mit Arduino schon ein paar Jahre, somit sollte die Anpassung kein Problem

wenn es kein Problem wäre hätte ich hier keinen Post erstellen müssen :slight_smile:

ich kenne den AS5600 nicht und raffe einfach nicht warum er die abfolge nicht so macht wie ich es programmiert habe

Bist Du sicher? Diese Pins werden üblicherweise für die Geschwindigkeit mittels PWM verwendet.

ja aber ich habe auf der L298N die "EN" pins mit Jumpern belegt also brauche ich die EN Ansteuerung ja nicht

er dreht mit voller Geschwindigkeit

Dann baue Serial.print in Dein Programm ein, um zu sehen, warum der Vergleich mißlingt.

Serial.print ist doch drin die Winkel kann ich ja auch sehen nur dreht der Motor halt nicht

if (aktuellerWinkel >= 70.0) {
     // Motor aus
     pause
   // Motor drehen  
  if (aktuellerWinkel <=0.0){
    // Motor aus
  }
  }

Ich nehme mal an, der Motor dreht sich gut ohne Winkelkontrolle, das heißt die Ansteuerung, Netzteil und Verkabelung stimmt.

Zuerst mal kann der Winkel nicht kleiner als 0,0 werden da der gelesene Winkel von 0 bis kleiner 360 Grad geht (0 bis 4095) Da mußt Du umrechnen, daß nach 0 wieder 360 kommt.
Dann wird der Motor sicher nicht genau bei 0,0 ° stehen bleiben sondern etwas nachdrehen. Das muß bei der Ansteuerung des Motors berücksichtigt werden zb durch abbremsen mittels einer PWM Rampe.

Wo steht der Motor denn? zwischen 70 und 360 oder zwischen 0 und 70?

Grüße Uwe

Was denn jetzt?

Bitte bedenke, ich kann und will nicht auf Deinen Schreibtisch schauen :wink:

er steht bei ca 6 grad

ich habe ein programm versucht zu schreiben mit einem null offset

und ja wenn ich das erste programm draufhabe dreht er, aber da habe ich mit zeiten gearbeitet und der motor dreht nicht genau in seinen startpunkt zurück.

deshalt habe ich mir den as5600 angeschaut und versuche seit 3 tagen den motor damit zu steuern

sry er soll einfach mit voller geschwindigkeit drehen aber er dreht nicht

#include <Wire.h>
#include <AS5600.h>

AS5600 as5600;

// Motor-Steuerungspins
const int motorIN1 = 6; 
const int motorIN2 = 7;
const int motorPWM = 10; 

// Ziele relativ zum Startpunkt
const float zielWinkel = 70.0;
const float startWinkel = 1.0; // Minimaler Puffer über 0° gegen Schwingen

float winkelOffset = 0.0; // Speichert die Startposition

enum Zustand { VORWAERTS, RUECKWAERTS, GESTOPPT };
Zustand aktuellerZustand = VORWAERTS;

// Hilfsfunktion: Wandelt Sensor-Rohdaten in Grad (0-360) um
float holeRohWinkel() {
  return as5600.readAngle() * 360.0 / 4096.0;
}

void setup() {
  Serial.begin(115200);
  Wire.begin();
  as5600.begin();
  
  pinMode(motorIN1, OUTPUT);
  pinMode(motorIN2, OUTPUT);
  pinMode(motorPWM, OUTPUT);

  // Nullpunkt beim Einschalten kalibrieren
  delay(200); // Kurz warten, bis der Sensor stabil liefert
  winkelOffset = holeRohWinkel();
  Serial.print("Nullpunkt kalibriert auf Rohwert: ");
  Serial.println(winkelOffset);

  // Fahrt starten
  motorVorwaerts(255); 
}

void loop() {
  // Aktuellen Rohwinkel holen
  float rohWinkel = holeRohWinkel();
  
  // Offset abziehen für den relativen Winkel
  float relativWinkel = rohWinkel - winkelOffset;
  
  // Korrektur für den 360°-Übergang
  if (relativWinkel < 0) {
    relativWinkel += 360.0;
  }

  Serial.print("Relativer Winkel: ");
  Serial.println(relativWinkel);

  switch (aktuellerZustand) {
    case VORWAERTS:
      if (relativWinkel >= zielWinkel && relativWinkel < 180.0) { 
        motorStopp();
        delay(500); 
        aktuellerZustand = RUECKWAERTS;
        motorRueckwaerts(255); 
      }
      break;

    case RUECKWAERTS:
      // Stoppt, wenn der Winkel wieder nahe 0 ist
      // Der Schutz "relativWinkel > 180" greift, falls der Motor leicht unter 0 rutscht
      if (relativWinkel <= startWinkel || relativWinkel > 350.0) {
        motorStopp();
        aktuellerZustand = GESTOPPT;
        Serial.println("Startposition (0 Grad) wieder erreicht. Stopp.");
      }
      break;

    case GESTOPPT:
      break;
  }
  
  delay(10); 
}

void motorVorwaerts(int geschwindigkeit) {
  digitalWrite(motorIN1, HIGH);
  digitalWrite(motorIN2, LOW);
  analogWrite(motorPWM, geschwindigkeit);
}

void motorRueckwaerts(int geschwindigkeit) {
  digitalWrite(motorIN1, LOW);
  digitalWrite(motorIN2, HIGH);
  analogWrite(motorPWM, geschwindigkeit);
}

void motorStopp() {
  digitalWrite(motorIN1, LOW);
  digitalWrite(motorIN2, LOW);
  analogWrite(motorPWM, 0);
}

das sit das was ich aus allen möglichen bruchstücken zusammen gebastelt habe :smiley:

ich hab den motor mit dem obigen programm zum drehen bekommen allerdings dreht er immer weiter und weiter und weiter er hält gar nicht mehr an.....

der winkel ist im serial immer 0.0

Ich habe nun den ganzen Tag herum experimentiert

ich verstehs einfach nicht

der Motor dreht immer nur in eine Richtung als wenn ich ihn direkt an die 12v hänge,solange bis ich das L298N abschalte

Du sagst Du bekommst hier immer nur 0?

Unten ist ein Beispiel für den Motortreiber