Arduino Taktgeber

Hallo,

mein Ziel ist es mit Hilfe des Arduinos einen Takt für meinen Schrittmotor zu erzeugen.
Mein Code besteht aus der Funktion Tone. Diese Funktion macht auch das was ich brauche.
Das Problem ist das ich auf einen Taster drücke, der Takt beschleunigt und dann kurze Zeit aufhört únd dann wieder anliegt , aber mit voller Geschwindigkeit weiter macht. Dadurch bleibt der Schrittmotor einfach stehen ,da die Frequenz zum Anlaufen zu schnell ist.

Meine Frage ist warum macht das der Arduino?

Hier der Code:

const int buttonPin = 7;
const int FrqOut = 11;
int buttonread = 0;
int i = 150;
int Trigger = 9;

int Absteigend = 400;
int Aufsteigend = 25;



void setup()
{
  pinMode(buttonPin, INPUT);
  pinMode(FrqOut, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  if (digitalRead(buttonPin) == HIGH)
  {
    for (; i < 15000; i = i + Aufsteigend)
    {
      tone(11, i); //Frequenz
      Serial.println(i);
      Aufsteigend ++;
      if (digitalRead(buttonPin) == LOW) break;
      delay(5);
    }
  }

  if (digitalRead(buttonPin) == LOW)
  {
    for (; i >= 220; i = i - Absteigend / 2)
    {
      Aufsteigend = 40;
      tone(11, i); //Frequenz
      Serial.println(i);
      if (digitalRead(buttonPin) == HIGH) break;
      delay(5);
    }
    noTone(11);
  }
}

Gruß und vielen Dank!

Schrittmotor_Steps_C.ino (765 Bytes)

janbaz497:
Meine Frage ist warum macht das der Arduino?

Weil du es so programmiert hast.
Und verwende bitte Code-Tags für deinen Sketch, nicht Quote-Tags.
Jetzt ist er sehr schlecht zu lesen.

janbaz497:
... mein Ziel ist es ...

Dein Code ist übler Kauderwelsch. Wieso gibt es z. B. „FrqOut“, wenn das sonst nirgendwo mehr auftaucht? Wäre ich an Deiner Stelle, würde ich erstmal den Code aufräumen und unsinniges Zeug wie „Aufsteigend=40“ wegwerfen (was zur Hölle hat das in einer Schleife zu suchen?)

Gruß

Gregor

Wie schaffe ich es, dass der Code keine solche Aussetzer hat?

Vielen Danke für die schnelle Hilfe!

Hier nochmals der Code:

const int buttonPin = 7;
int buttonread = 0;
int i = 150;
int Trigger = 9;
int Absteigend = 400;
int Aufsteigend = 25;



void setup()
{
  pinMode(buttonPin, INPUT);
  pinMode(FrqOut, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  if (digitalRead(buttonPin) == HIGH)
  {
    for (; i < 15000; i = i + Aufsteigend)
    {
      tone(11, i); //Frequenz
      Serial.println(i);
      Aufsteigend ++;
      if (digitalRead(buttonPin) == LOW) break;
      delay(5);
    }
  }

  if (digitalRead(buttonPin) == LOW)
  {
    for (; i >= 220; i = i - Absteigend / 2)
    {
      Aufsteigend = 40;
      tone(11, i); //Frequenz
      Serial.println(i);
      if (digitalRead(buttonPin) == HIGH) break;
      delay(5);
    }
    noTone(11);
  }
}

Du solltest Dir wenigstens die Mühe machen, Deinen Code durch den Kompiler zu schicken, um zu sehen, ob er überhaupt kompiliert. Das tut er nämlich nicht.

Gruß Tommy

Du solltest Dir wenigstens die Mühe machen, Deinen Code durch den Kompiler zu schicken, um zu sehen, ob er überhaupt kompiliert. Das tut er nämlich nicht.

der Sketch aus dem Anhang kompiliert.

Das Problem ist das ich auf einen Taster drücke, der Takt beschleunigt und dann kurze Zeit aufhört únd dann wieder anliegt , aber mit voller Geschwindigkeit weiter macht. Dadurch bleibt der Schrittmotor einfach stehen ,da die Frequenz zum Anlaufen zu schnell ist.

Mir ist nicht Klar was du mit dem Taster erreichen willst.
Soll mit jedem Tastendruck die Frequenz erhöht werden? Hast du einen Pulldown Widerstand verbaut?
Wann/wie soll die Frequenz abgesenkt werden?
Was soll das break und das delay(5) bewirken?

Wen interssiert der Anhang? Der Sketch im Forum ist für mich (und wohl für andere auch) maßgebend.

Gruß Tommy

janbaz497:
... Meine Frage ist warum macht das der Arduino? ...

Wie Du vermutlich gemerkt hast, sorgt Dein Code und Deine Postings hier für reichlich Verwirrung.

Beschreibe doch mal, was für Komponenten Du hast, wie diese angeschlossen sind, und natürlich, was Du mit dem Arduino erreichen möchtest. Zumindest mir ist das nicht klar. Um mir und anderen Such- und Raterei zu ersparen, solltest Du genaue Typen-/Teilebezeichnungen und im Idealfall Links auf entsprechende Seiten oder Datenblätter liefern.

Wenn wir hier wissen, was für Teile Du hast und was Du erreichen möchtest, können wir Dir sehr viel besser helfen.

Was die Programmiererei angeht, scheinst Du nicht allzu geübt zu sein, vermutlich bist Du sogar blutiger Anfänger. Dazu: Guck Dir mal bei der Wikipedia an, was ein Programmablaufplan ist. Wenn Du aufzeichnen kannst, wie Dein Programm ablaufen und was im Einzelnen passieren soll, bist Du funktionierendem Code schon ziemlich nah.
Hüte Dich vor allem davor irgendwelchen Code zu kopieren. Meiner Erfahrung und Beobachtungen zufolge führt das in den meisten Fällen in eine Sackgasse, an deren Ende klar ist, dass man den Kram eben doch besser selbst schreibt (dabei lernt man auch sehr viel mehr).

Gruß

Gregor

Also mein Ziel ist es einen Schrittmotor möglichst schnell von A nach B zu bringen.
Die Ansteuerung an sich funktioniert. Ich benötige nur noch den TAKT.
Ich habe zwei Schrittmotoren, also eine X-und Z-Achse. Eine "Bedienbox" hat jeweils 2 Taster für jede Achse. (Hoch/Runter und Links/Rechts)
Der Taster im Programm soll diese Taster darstellen.

Das Programm ist so gedacht das es am Anfang mit einem "langsamen" Takt anfängt und mit jedem Durchlauf schneller wird.

Nochmals ich benötige nur einen TAKT der beschleunigt bis zu einer bestimmten Geschwindigkeit und beim loslassen des Tasters wieder abbremst :slight_smile:

const int buttonPin = 7;
int buttonread = 0;
int i = 150;
int Trigger = 9;
int Absteigend = 400;
int Aufsteigend = 25;



void setup()
{
  pinMode(buttonPin, INPUT);

  Serial.begin(9600);
}

void loop()
{
  if (digitalRead(buttonPin) == HIGH)
  {
    for (; i < 15000; i = i + Aufsteigend)
    {
      tone(11, i); //Frequenz
      Serial.println(i);
      Aufsteigend ++;
      if (digitalRead(buttonPin) == LOW) break;
      delay(5);
    }
  }

  if (digitalRead(buttonPin) == LOW)
  {
    for (; i >= 220; i = i - Absteigend / 2)
    {
      Aufsteigend = 40;
      tone(11, i); //Frequenz
      Serial.println(i);
      if (digitalRead(buttonPin) == HIGH) break;
      delay(5);
    }
    noTone(11);
  }
}

Es ist schwierig mit nur einem Taster sowohl aufsteigend als auch absteigend zu realisieren. Man könnte es z.B. so lösen: Kurz drücken aufsteigend, lang drücken absteigend. Oder man nimmt 2 Taster, einen für aufsteigend und einen für absteigend.
Oder soll solange der Taster gedrückt ist beschleunigt werden und wenn man den Taster loslässt wieder abgebremst werden?
wenn es die letzte Version sein soll, versuch es mal so:

/*
 * Taster an GND und Pin 7 angeschlossen
 */


const int buttonPin = 7;
bool buttonread = 0;
uint16_t i = 150;
uint16_t Trigger = 9;
const uint16_t Absteigend = 400;
const uint16_t Aufsteigend = 25;

void setup()
{
  pinMode(buttonPin, INPUT_PULLUP);

  Serial.begin(9600);
}

void loop()
{ 
  buttonread = digitalRead(buttonPin);
  delay(5); //Taster entprellen
  if (!buttonread)
    {
      i += Aufsteigend;
      if (i >=15000) i =15000;
      tone(11, i); //Frequenz
      Serial.println(i);
     }
     else
     {
      i -= Absteigend;
      if (i <= 220) i = 220;
      tone(11, i); //Frequenz
      Serial.println(i);
      }
    noTone(11);
  }