360° Servo IR Zähler Ab und Auf

xx

Warum schreibst Du den gleichen Text unter 2 verschiedenen Überschriften?

Gruß Tommy

Hallo,

füge bitte den gesamten Sketch mit den Code Tags ein in der IDE unter Bearbeiten/für Forum kopieren dann hier einfügen .
oder mit dem button oben links </> zwischen die beiden Tags einfügen, das geht auch anschliessend noch.

Es fehlen die Eingänge für den Encoder. Was ist das für ein Teil.

was hast Du vor ? Meine Glaskugel ist leer. :slight_smile:

Heinz

@Uwe: Bitte mit dem anderen zusammenführen und das dann überflüssige Eröffnungsposting entsorgen.

Gruß Tommy

Hallo,

so wie ich das sehe hat der Sensor nur einen Ausgang an Pin2 angeschlossen, wie soll der da vorwärts und rückwärts zählen können.

ich vermute du hast da was zusammen kopiert und es fehlt etwas Wichtiges.

Beshreibe mal die Funktion was da passieren soll , irgendwie fehlt mir noch die Phantasie dazu :

eine Eingabe mit dem Monitor für den Zielwert ? Servo fährt , was sol der Sensor. ?

Heinz

Hallo,

also mit dem Sensor willst Du zählen. Ob auf oder ab gezählt wird von einer anderen Variablen entschieden , hab ich das so richtig verstanden.

Dann solltest Du deinen Programmteil zum Zählen noch mal neu aufbauen im Moment hast Du zwei Zähler einen für auf und einen für ab wozu ? es gibt nur eine Position.

Zähleingang erkennen
Flanke bilden

wenn Flanke und vorwärts dann plus
wenn Flanke und zurück dann minus

Wenn Du das später mit einem Stepper machst kannst Du das anders machen. Die Lib dazu gibt dir an ob du die Position erreicht hast. Aber zum üben hast Du natürlich recht.

Heinz

@TO: Dann solltest Du Deine Überschrift anpassen, denn das hat mit Incrementalgebern überhaupt nichts zu tun.

Gruß Tommy

Wenn das für Dich nutzlos ist, wirst Du noch viele Hilfen bekommen, denn ich bin nicht der einzige, der merkt, dass die Überschrift nicht zum Inhalt passt und Du den Hinweis als sinnlos abtust.
Aber wie Du willst - und tschüß.

Gruß Tommy

Hallo,

if ( (n>53)&&(n<82) == (x=x_l) )    ;      // Links Drehen   serial write 53 schnell, 82 langsam
if ( (n>100)&&(n<131) == (x=x_r) )  ;    // Rechts Drehen  serial write 100 schnell, 130 langsam

in den beiden Zeilen soll ja anscheinend entschieden werden ob links oder rechts gefahren werden soll. Wobei n vom Serielle Monitor kommt und die Sollposition sein soll. Was soll denn passieren wenn Du von z.B 60 auf 80 fahren willst ok plus. und wenn Du von 80 auf 60 fahren willst auch plus.?

meiner Meinung nach wird das nix. Du benötigst die aktuelle , alte Position und die neue vom Monitor . wenn die neue > alt ist dann rechts (plus) , wenn kleiner dann links(minus). Das speichers Du in einer Variablen typ bool. z.B

if(sollwert > istwert) plus=true else plus=false;

Wenn fahren beendet ist , setzt du die aktuelle position = neue Position.

mit der bool Variablen plus entscheidest Du ob auf oder ab gezählt wird. siehe mein letzter post.

so jetzt sollte es dann aber klappen :slight_smile:

Heinz

@Tommy schade das Du weg bist wo ich mir so viel Mühe mit den Tags gegeben habe :slight_smile:

Gruß Heinz

plus=(sollwert>istwert)?true:false;

Wobei bei SOLL==IST dann auch wieder falsch ist.

MfG

Rentner:
@Tommy schade das Du weg bist wo ich mir so viel Mühe mit den Tags gegeben habe :slight_smile:

Mit Dir habe ich doch keine Probleme, nur mit hochnäsigen Fragestellern.

Wenn ein Neuling über die Suche auf den Threadtitel stößt, freut der sich, dass da was zu Inkrementalgebern steht - Pustekuchen, nur einer für den es unter seiner Würde ist, den Titel anzupassen. Solches asoziales Verhalten mag ich nun mal nicht.

Gruß Tommy

Hi

Wofür eine ENCODER-Lib, wenn Du NUR eine Lichtschranke benutzt?
Oder wo ist das 2.te versetzte Signal?

Bitte bettel erkläre mir, WAS Du WO in DEINEM Sketch DENKST zu tun - vll. wird dann langsam ein Schuh draus.
Bitte so, daß auch Deine Oma Deiner Erklärung folgen könnte (Rubberduck-Debugging)

MfG

Hallo,

wenn das Wackeln zwischen -1 und 1 das einzge Problem ist das Du hast dann solltes Du nicht auf gleich abfragen sondern eine Hysterese mit verwenden ( Fensterfunktion).
für positive Werte gilt

wenn istwer >= (sollwert-hysterese) && sollwert <= (istwert +hysterese) dann ist die position erreicht

Beispiel:

Sollwert = 10 Hyterese =2
dann ist die Position erreicht wenn der Istwert zwischen 8 und 12 liegt

Was da in Deinem Sketch eigendlich passieren soll kann ich auch nicht nachvolziehen. Ich denke Deine Lichtschranke hat nur einen Ausgang, Was ist dann jetzt mit pin 2 und 3 was hängt das dran ? Ich finde auch Deine encoder Lib nicht, aber das ist ok denn die ist in dem Fall völlig unnötig.

Heinz

Über Serial monitor will ich Servo X ansprechen mit Befehl X20 (Servo X gehe 20 Schritte vorwärts). Der Zeit reagiert es nur auf 20 (gehe 20 Schritte vorwärts).
Wie konnte das Programm aussehen?

statt deines while Serial.available()
eventuell sowas:

if (Serial.available())
    {
      char servo = Serial.read();  // sollte 'X' 'Y' oder 'Z' sein
      servo = servo - 'X'; // 0 .. 2 
       
      int wert = Serial.parseInt();
      ...

Das funktioniert ohne Timeout, wenn der Text "X20" zusammen mit einem Zeilenende-Zeichen gesendet wird. Vielleicht noch um Plausibilitätsabfragen erweitern (z.B. alles ignorieren, bis tatsächlich ein X, Y oder Z empfangen wird)

Den String readString würde ich rauswerfen.

Das Leerzeichen sollte Serial.parseInt() beenden. Das nächste 'X' ... 'Z' wird den nächsten Befehl starten lassen. Also OK.

Ich würde auf jeden Fall einbauen, dass alles nach der Zahl bis zum nächsten 'X' .. 'Z' einfach ignoriert wird.

Interessanter ist, ob auch " Y-10 \n" geht :slight_smile:
und ob du auch " y30 " erlauben willst

Hallo,

Deine Eingabezeile könnte auch so aussehen

20;30;50

Dann kannst Du jeweils bis zum Semilkolon trennen und auf die drei Sollwerte aufteilen.

Beispiel / Comunication/ readASCIIString

Heinz

Hi

Häh?
Linien? --> Zeilen?

Dir ist aber schon bekannt, daß die Koordinaten der verschiedenen Achsen gemeinsam am Ziel ankommen sollen?

Aber - hatte gerade den Thread quer gelesen - Dir geht's nicht sonderlich darum, daß zukünftige Leser auch was von der Antwort haben, da Titel und Inhalt differieren, wa?

MfG

Hallo,

ich bin jetzt nicht sicher ob ich dich richtig verstanden habe ?
wenn bei dem was Du einlesen willst eine neue Zeile beginnt , d.h es stehen mehrere Zeilen untereinander, dann wird es ein CR oder LF code geben. Damit ist dann eine Zeile beendet und es fängt eine neue an. Damit kannst Du doch das Einlesen der SD Karte verlassen. Wenn Du dann die nächste lesen willst geht es automatisch da weiter. Du must halt nur das file geöffnet lassen.

Du baust 2 functionen ein

file_open //einmal aufrufen am Anfang
lese_Zeile // mehrfach aufrufen wenn gefahren werden soll

lese_zeile liest eine Zeile oder erkennnt das ende der Datei und schliesst in dem Fall die Datei.

Heinz

Hallo,

ich glaube ich verstehe Dein Problem nicht, ich denke aber du siehst vor Bäumen den Wald nicht , weil Dir da einfach ein paar Grundkenntnisse fehlen. Ich kann im Moment nur nochmal auf das Beispiel ReadAsciiSting verweisen , da wird eigendlich gezeigt wann eine Zeile zu Ende ist und wie man das dann erkennt. Nachdem du die gesamte Zeile eingelesen hast musst sie dann analysieren. Ob Du das mit parseInt() machst oder den String in Teile zerlegst und in Deine Fahrbefehle aufteilst bleibt Dir überlassen. Das ist doch völlig egal ob die Zeile 10 Zeichen oder 100 Zeichen lang ist. X,Y,Z,sind Trennzeichen für Sollwerte. Darauf kannst Du doch abfragen, dahinter kommt eine Zahl, das ist der entsprechende Sollwert für den Fahrbefehl.
Was soll das sein "Seriell Read PAUSE" ?

Wenn die Daten auf einer SD Karte vorliegen geht das ähnlich. Sind alle Fahrbefehle abgearbeitet , oder nach Ablauf einer Wartezeit , wird die nexte Zeile von SD Karte eingelesen.

Heinz

Hi

Du liest nur etwas ein, wenn DU DAS im Sketch auch so schreibst.
Wenn Du Das nicht willst - die aktuelle Zeile ich noch nicht fertig bearbeitet - dann überspringst Du den Teil im Sketch, Der die nächste Zeile einliest.

Zumindest verstehe ich diesen simplen Ansatz als die Lösung zu Deinem gedachten Problem.

Der Arduino macht nur Das, was Du Ihm sagst, was Er machen soll.
Wenn Da so was drin steht:

if (fertig_bearbeitet){
   SD.readZeile();
   fertig_bearbeitet=false;
}

Dann wird die Funktion 'SD.readZeile()' nur aufgerufen, wenn das Flag (die Variable) 'fertig_bearbeitet' TRUE ist.
Gleich dahinter wird die Variable wieder auf FALSE gesetzt - also ein erneuter Aufruf passiert erst wieder, wenn Deine Auswerte-Routiene das Flag wieder auf TRUE setzt.

MfG