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
ich hoffe ihr könnt mir helfen
ich verzweifle noch daran
lg
fony
September 10, 2026, 5:30am
2
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
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
fony
September 10, 2026, 8:09am
6
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
ich kenne den AS5600 nicht und raffe einfach nicht warum er die abfolge nicht so macht wie ich es programmiert habe
agmue
September 10, 2026, 8:21am
8
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
agmue
September 10, 2026, 8:37am
10
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
uwefed
September 10, 2026, 9:32am
12
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
agmue
September 10, 2026, 9:46am
13
Was denn jetzt?
Bitte bedenke, ich kann und will nicht auf Deinen Schreibtisch schauen
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
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
uwefed
September 10, 2026, 9:18pm
19
Du sagst Du bekommst hier immer nur 0?
fony
September 11, 2026, 10:30am
20
Unten ist ein Beispiel für den Motortreiber