Arduino Stepper Motor mit TMC2208 ansteuern?

Hallo,

ich versuche gerade meinen Stepper Motor mit dem Arduino anzusteuern dazu nutze ich den Stepper Motor Treiber TMC2208. Ich habe jetzt das Problem, dass ich keine Ahnung habe wie ich den ansteuern kann. Im Internet habe ich jetzt schon lange gesucht viele machen das einfach mit der Stepper.h Bibliothek. Die die das machen haben aber alle nicht den Stepper Treiber.

Dann habe ich explizit nach Codes mit diesem Treiber gesucht und das gefunden:

#define EN_PIN    13 								
#define STEP_PIN  54 								

#include <TMC2208Stepper.h>							
TMC2208Stepper driver = TMC2208Stepper(&Serial);														

void setup() {
	Serial.begin(115200);							
	while(!Serial);									

	pinMode(EN_PIN, OUTPUT);
	pinMode(STEP_PIN, OUTPUT);

	driver.pdn_disable(1);							
	driver.I_scale_analog(0);						
	driver.rms_current(500);						
	driver.toff(0x2);								

	digitalWrite(13, LOW);			
}

void loop() {
	digitalWrite(STEP_PIN, !digitalRead(STEP_PIN));
	delay(10);
}

Diesen Code habe ich dann auch mal drauf geladen es hat alles funktioniert, das heißt der Stepper dreht sich durchgehend (Geschwindigkeit je nach delay Einstellung).

Mein Problem ist ich verstehe diesen Code nicht wirklich. Ich weiß, dass sich der Motor dreht weil der Zustand des StepPins ständig hin und her wechselt weiß aber nicht warum das so sein muss. Es wäre auch gut wenn mir jemand die Zeilen die mit driver. beginnen erklären könnte :D

Da ich den Code nicht richtig verstehe, kann ich ihn nicht nutzen um ihn auf meine Anforderungen umzubauen. Zum Beispiel , dass er nur zu einer Bedingung dreht und nur eine gewisse Zeit lang oder eine gewisse Anzahl an Steps. Kann mir jemand sagen wie ich das umsetzten könnte?

Geht das vielleicht auch komplett ohne die Treiber Bibliothek? (Nur mit der Stepper Bibliothek? Oder ganz ohne?)

Ich weiß das ist womöglich eine komplexe Frage wäre aber sehr dankbar wenn sie mir jemand beantworten könnte.

PS. Ich habe die Stepper und Treiber im Moment nicht bei mir bin aber was das Thema angeht recht im Stress deshalb muss ich versuchen den Code zu schreiben ohne ihn direkt ausprobieren zu können.

Vielen Dank :D

Computer, Technik, Programm, Elektronik, programmieren, Elektrotechnik, Motor, Arduino, Technologie
Game Controller selber bauen / programmieren?

Wie kann ich mir einen Gamecontroller selber bauen? Evt. mit einem Arduino ?

Mein Vorhaben ist (siehe Bild) meinem Laptop seitlich ein paar Griffe (3d-Gedruckt) zu verpassen und dort hinein in den Griff, die Controllersteuerung einzubauen. Ähnlich wie bei der Switch vom Konzept. Nun brauch ich ein System oder Bauteile mir einen Custom Controller zu bauen. Ziel sollte sein, vom Umfang die Funktion eines Xbox oder PS Controllers ab zu bilden.

Ähnlich wie das Steamdeck soll das teil später genutzt werden.

Mein erstes Versuch war es einen Xbox Controller zu schlachten und diese Technik zu verwenden, dafür ein 3d-gedrucktes Gehäuse in der die Knöpfe und Steuersticks passen und per USB ein zu stecken, jedoch sind diese alle auf einer Platine und somit nicht lageunabhängig.

Ich habe mal aufgezeichnet wie die Knöpfe angeordnet sein sollte, ich suche hier die Technik für in das Gehäuse. Das Gehäuse selbst kann Dank 3D-Druck beliebig konstruiert werden.

Der Laptop hat unter anderem Touch, was sich dafür eignet bequem Windows zu bedienen.

Ich hoffe ihr habt verstanden was ich suche, und ihr könnt mir helfen.

Vielen Dank :D

EDIT: Ich habe das ganze über einen Arduino Leonardo realisieren können, mit dem funktionsumfang eines Xbox Controllers. Der Leonardo kann einfach als USB-Device verwendet werden - z.B. um eine Tastatur oder Maus zu emulieren. Und das Zubehör kann auch easy über Berrybase, Alixpress...etc. beschafft werden.

Beim Code bin ich aktuell noch dran.

Bild zum Beitrag
Computer, Computerspiele, Technik, Elektronik, programmieren, Arduino, Technologie, Controller, 3D-Drucker, Raspberry Pi, Spiele und Gaming
mehrere Funktionen mit einem Taster ausführen?

Hallo

Ich möchte, dass ich wenn ich den Taster 1x drücke, die LEDs Weiss sind und wenn ich ihn 2x drücke, dass sie z.B. Blau sind. Wie kann ich so etwas machen?

Ich habe den Code, damit sie weiss sind schon einmal. Doch wie kann ich bei 2x drücken eine Funktion ausführen?



#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif




int tasterPin = 5; //taster an pin5






#define PIN        4 // An welchem Pin ist die LED angeschlossen


#define NUMPIXELS 60 // Anzahl LEDs




Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);


#define DELAYVAL 30 // Definiert, dass die Variabel DELAYVAL 30millisekunden pause bedeutet




void setup() {


  //
  Serial.begin(115200);
  Serial.println();
  Serial.println("ESP gestartet");


  pinMode(tasterPin, INPUT_PULLUP);
  //




  //einstellungen für LEDs
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
  // nur, falls man eine externe energiequelle hat


  pixels.setBrightness(255); // Helligkeit auf 50 - höchster wert : 255
  pixels.begin();
}
//einstellungen für LEDs ende


void loop() {




  if (digitalRead(tasterPin) == LOW) {
    Serial.println("Status: Taster Gedrückt");
    Serial.println("Effekt wird abgespielt...");
    delay(100);


    pixels.clear(); // Schaltet alle Pixel auf "OFF"


    for (int i = 0; i < NUMPIXELS; i++) { // Für jede LED...


      //Das ist ein RGB LED streifen das R steht für ROT G = Grün und B = Blau
      pixels.setPixelColor(i, pixels.Color(255, 255, 255));


      pixels.show();   // Sendet die geänderten LED farben zum LED Streifen (neue Farbe)


      delay(DELAYVAL); //pause
    } //...


    //
    delay(30000); //30000 Millisekunden weiss (wartet 10000 Millisekunden)
    //


    for (int i = 0; i < NUMPIXELS; i++) { // Für jede LED...


      pixels.setPixelColor(i, pixels.Color(0, 0, 0));


      pixels.show();


      delay(DELAYVAL); // Pause bevor es neu startet


    }


  } else {
    Serial.println("Status: Taster nicht Gedrückt");
    delay(100);
  }




}//...

Danke für die Antworten :)

LG

Computer, Technik, Elektronik, programmieren, Arduino, Technologie, taster, ESP8266, Spiele und Gaming, Arduino IDE
Arduino integer mit binärem Wert in decimal umwandeln?

// Probleme wurden gelöst. Teil des Problems war dass ich den Chip außversehen nach dem umprogrammieren eine Reihe zu weit nach Oben gemacht habe... Leichtsinnsfehler... :)

Hallo. Bin gerade an einem Projekt bei dem ich LED's mit einem 8Bit shift register zum leuchten bringen will.

1 bedeutet leuchten und 0 bedeutet aus.

Jetzt will ich einen Wert wie "10000001" angeben können und die LED's werden direkt so eingeschalten wie es im int aussieht.

Gerade im Moment probiere ich es so zu lösen dass ich der ShiftOut Funktion den decimalen Wert gebe welche diese dann wieder in decimal umwandelt und raus schiebt:

  int bits = 10000001;

  digitalWrite(latchPin, LOW);
  //Binary to decimal Versuch
  int decimal =
  (((bits / 10000000U) % 10) * 128)
  + (((bits / 1000000U) % 10) * 64)
  + (((bits / 100000U) % 10) * 32)
  + (((bits / 10000U) % 10) * 16)
  + (((bits / 1000U) % 10) * 8)
  + (((bits / 100U) % 10) *4)
  + (((bits / 10U) % 10) *2)
  + ((bits / 1U) % 10);

  shiftOut(dataPin, clockPin, MSBFIRST, decimal);

  digitalWrite(latchPin, HIGH);

Ich bin mir sicher dass man das wesentlich effizienter und schlauer lösen kann. Unter anderem funktioniert mein Code nicht mal... wenn ich ihn laufen lasse sind die LED's volgendermaßen angeschaltet: "00010000"...

Würde mich über Hilfe freuen und danke schon mal im Vorraus.

Liebe Grüße, Leo

Bild zum Beitrag
Computer, Technik, Programm, programmieren, Arduino, Code, Informatik, Technologie, binär, Integer, Spiele und Gaming
7 Segment anzeige Aktualisierrate ändern Arduino?

Hallo, ich baue ein Voltmeter mit esc steuerung und als anzeige verwende ich ein 7 Segment Display. Mein Problem ist, dass sich das Display zu schnell aktualisiert, so dass die Zahlen nicht lesbar sind.

Ich möchte das sich die Spannung jede sekunde aktualisiert und das display das ohne flackern anzeigt.

Vielen Dank im Vorraus!!

#include "SevSeg.h" ;
int sum = 0;          
unsigned char sample_count = 0; 
float voltage = 0.0;       
#include <Servo.h>
#define PIN_MOTOR 13
#define PIN_POTI A2
#define NUM_SAMPLES 10
SevSeg sevseg; 
Servo servo;
unsigned long startTime, delayTime = 1000; 
int val = 0;
void setup() 
{
  
  startTime = micros();
  servo.attach(PIN_MOTOR);
  servo.write(25); 
  delay(2000);
   
byte numDigits = 4; 
byte digitPins[] = {2, 3, 4, 5}; 
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 1}; 
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins); 
}
void loop() 
{
sevseg.setNumber(voltage * 1132,2);
sevseg.refreshDisplay();
sevseg.setBrightness(90); 
while (sample_count < NUM_SAMPLES) {
    sum += analogRead(A0);
    sample_count++;
     
    
     
  }
   
  voltage = ((float)sum / (float)NUM_SAMPLES * 5.015) / 1024.0;
   
  Serial.print(voltage * 11.132);
  Serial.println (" V");
  sample_count = 0;
  sum = 0;
   
   
  if ((millis() - startTime) >= delayTime){
    val = map(analogRead(PIN_POTI), 0, 676, 30, 110);
    servo.write(val);
    Serial.println(val);
    startTime = micros();
  }  }

https://www.youtube.com/watch?v=1zuE3fo1_lQ

Technik, Arduino
Tasterstatus HIGH schalten ?

Hallo Leute bei dem unten Angegebenen Sketch sieht man das wen count richtig ist und der Taster gedrückt ist die LEDS in Reihenfolge blinken sollen.

Ich möchte das die LEDS nicht mehr aufhören zu blinken was muss ich da noch ergänzen?

int taster1=7;
int taster2=8;


int tasterstatus2=0;


int led1=12;
int led2=11;
int led3=10;
int led4=9;







bool oldButtonState = HIGH;
bool newButtonState;
int count = 0;


void setup() {
 pinMode (taster1,INPUT);
pinMode (taster2,INPUT);




pinMode (led1,OUTPUT);
pinMode (led2,OUTPUT);
pinMode (led3,OUTPUT);
pinMode (led4,OUTPUT);





}


void loop() {
  newButtonState = digitalRead(taster1);
  
  tasterstatus2 = digitalRead(taster2);
  
  if (oldButtonState == HIGH && newButtonState == LOW) {
    count++;
    oldButtonState = newButtonState;


    if (count == 1) {
      digitalWrite(led1, HIGH);
    }
    if (count == 2) {
      digitalWrite(led1, LOW);
      digitalWrite (led2,HIGH);
    }


    if (count == 3 ){
      digitalWrite (led2,LOW);
      digitalWrite (led3,HIGH);
    }


    if (count == 4){
      digitalWrite (led3,LOW);
      digitalWrite (led4,HIGH);
    }


    if (count == 5){
      digitalWrite (led4,LOW);
      count = 0;
    }


if ((tasterstatus2 == HIGH) && (count == 1)){
  
  
  digitalWrite (led1,HIGH);
  digitalWrite (led2,LOW);
  digitalWrite (led3,LOW);
  digitalWrite (led4,LOW);
  delay (1000);


  digitalWrite (led1,LOW);
  digitalWrite (led2,HIGH);
  delay (1000);
  digitalWrite (led2,LOW);
  digitalWrite (led3,HIGH);
  delay (1000);
  digitalWrite (led3,LOW);
  digitalWrite (led4,HIGH);
  delay (1000);
  digitalWrite (led4,LOW);
}








    if ((tasterstatus2 == HIGH ) &&( count == 2)){


      digitalWrite (led1,LOW);
      digitalWrite (led2,HIGH);
      digitalWrite (led3,LOW);
      digitalWrite (led4,LOW);
      delay (1000);
      digitalWrite (led3,HIGH);
      digitalWrite (led2,LOW);
      delay (1000);
      digitalWrite (led3,LOW);
      digitalWrite (led4,HIGH);
      delay (1000);
      digitalWrite (led4,LOW);
      digitalWrite (led1,HIGH);
      delay (1000);
      digitalWrite (led1,LOW);
      
    }




    if ((tasterstatus2 == HIGH) && (count == 3)){


digitalWrite (led1,LOW);
digitalWrite (led2,LOW);
digitalWrite (led3,HIGH);
digitalWrite (led4,LOW);
delay (1000);


digitalWrite (led3,LOW);
digitalWrite (led4,HIGH);
delay (1000);


digitalWrite (led4,LOW);
digitalWrite (led1,HIGH);
delay (1000);


digitalWrite (led1,LOW);
digitalWrite(led2,HIGH);
delay (1000);


digitalWrite (led2,LOW);
delay (1000);
}


if ((tasterstatus2 == HIGH) && (count == 4)){


  digitalWrite (led1,LOW);
  digitalWrite (led2,LOW);
  digitalWrite (led3,LOW);
  digitalWrite (led4,HIGH);
  delay (1000);


  digitalWrite (led4,LOW);
  digitalWrite (led1,HIGH);
  delay (1000);


  digitalWrite (led1,LOW);
  digitalWrite (led2,HIGH);
  delay (1000);


  digitalWrite (led2,LOW);
  digitalWrite (led3,HIGH);
  delay (1000);


  digitalWrite (led3,LOW);
  
}
    
        
 
Technik, Arduino, schalten, Arduino Uno
Arduino if Bedinung mit 2 Werten ?

ich schreibe gerade einen Sketch das man mit einem Taster 4 LEDS weiterschalten

und wen der 2 Taster gedrückt wird blinken die anderen LEDS .

aber bei der if Bedingung bei der beide werte überprüft werden funktioniert es nicht

Weiß da jemand weiter

Das ist der Sketch:

int taster1=7;
int taster2=8;


int tasterstatus1=0;
int tasterstatus2=0;


int led1=12;
int led2=11;
int led3=10;
int led4=9;


bool oldButtonState = HIGH;
bool newButtonState;
int count = 0;


void setup() {
 pinMode (taster1,INPUT);
pinMode (taster2,INPUT_PULLUP);




pinMode (led1,OUTPUT);
pinMode (led2,OUTPUT);
pinMode (led3,OUTPUT);
pinMode (led4,OUTPUT);
}


void loop() {
  newButtonState = digitalRead(taster1);
  
  tasterstatus2 = digitalRead(taster2);
  
  if (oldButtonState == HIGH && newButtonState == LOW) {
    count++;
    oldButtonState = newButtonState;


    if (count == 3) {
      digitalWrite(led1, HIGH);
    }
    if (count == 4) {
      digitalWrite(led1, LOW);
      digitalWrite (led2,HIGH);
    }


    if (count == 5 ){
      digitalWrite (led2,LOW);
      digitalWrite (led3,HIGH);
    }


    if (count == 6){
      digitalWrite (led3,LOW);
      digitalWrite (led4,HIGH);
    }


    if (count == 7){
      digitalWrite (led4,LOW);
    }




    


    if ((tasterstatus2 == HIGH && count == 3)){
      digitalWrite (led1,HIGH);
      delay (1000);
      digitalWrite (led1,LOW);
      digitalWrite (led2,HIGH);
      delay (1000);
      digitalWrite (led2,LOW);
      digitalWrite (led3,HIGH);
      delay (1000);
      digitalWrite (led3,LOW);
      digitalWrite (led4,HIGH);
      delay (1000);
      digitalWrite (led4,LOW);
    }




    if ((tasterstatus2 == HIGH) && (count == 4)){
      digitalWrite (led2,HIGH);
      delay (1000);
      digitalWrite (led2,LOW);
      digitalWrite (led3,HIGH);
      delay (1000);
      digitalWrite (led3,LOW);
      digitalWrite (led4,HIGH);
      delay (1000);
      digitalWrite (led4,LOW);
      digitalWrite (led1,HIGH);
      delay (1000);
      digitalWrite (led1,LOW);
    }
    
        
    delay(100);
  } else if (oldButtonState == LOW && newButtonState == HIGH) {
    oldButtonState = newButtonState;
  }
}
Computer, Programm, Arduino
Arduino LED "gleichmäßiger" pulsieren lassen?

Bei dem einfachen Sketch für eine pulsierende LED ist es immer so, dass die helligkeit am Anfang sehr schnell ansteigt, dann immer langsamer, sodass es aussieht als würde sich die helligkeit fast gar nicht verändern? Hat jemand eine idee wie man das lösen könnte?

Meine idee wäre gewesen, die zählervariable in der Schleife, die die helligkeit angibt und immer mit 1 addiert wird, jedes mal zu quadrieren, oder eben hoch *irgendeine andere zahl*, sodass die helligkeit nach oben hin immer schneller ansteigt, aber es so aussieht als würde sie gleichmäßig ansteigen.

Das funktioniert aber irgendwie nicht. Wenn ich die variable in int speichere und z.b. hoch 2 rechne, geht es, das ist aber zu schnell. Mit dezimalzahlen gibt es immer eine fehlermeldung.

Wenn ich die Variable in int speichere:

Test:27:26: error: invalid operands of types 'int' and 'double' to binary 'operator^'
   helligkeit = helligkeit^1.5;
                ~~~~~~~~~~^~~~
exit status 1
invalid operands of types 'int' and 'double' to binary 'operator^'

Das könnte wegen den 1,5 sein. Aber wenn ich die Variable in double speichere:

Test:27:26: error: invalid operands of types 'double' and 'double' to binary 'operator^'
   helligkeit = helligkeit^1.5;
                ~~~~~~~~~~^~~~
exit status 1
invalid operands of types 'double' and 'double' to binary 'operator^'

Es ändert sich nichts. Wo liegt hier der Fehler?

FROHE WEIHNACHTEN!!!
Computer, Technik, Elektronik, programmieren, Elektrotechnik, Mikrocontroller, Arduino, LED, Technologie
Kann mir das jemand erklären?

Arduino-Code und Erläuterungen für den Zähneputz-Timer

[code]

const int ledPins[ ] = {7, 8, 9, 10, 11, 12};

const int buttonPin = 2;

long myTimer = -200000;

void setup( ) {

 for (int i = 0; i < 6; i++) {

  pinMode(ledPins[ i ], OUTPUT);

 }

 pinMode(buttonPin, INPUT_PULLUP);

 Serial.begin(9600);

 for (int i = 0; i < 6; i++) {

  digitalWrite(ledPins[ i ], LOW);

 }

}

void loop( ) {

 if (digitalRead(buttonPin) == LOW) {

  myTimer = millis( );

 }

 if (millis( ) - myTimer < ( 30000) ) { // 30 Sekunden

  digitalWrite(ledPins[ 0 ], ((millis( ) - myTimer) % 1000) > 500);

 } else if (millis( ) - myTimer < ( 60000) ) { // 60 Sekunden

  digitalWrite(ledPins[ 1 ], ((millis( ) - myTimer) % 1000) > 500);

 } else if (millis( ) - myTimer < ( 90000) ) { // 90 Sekunden

  digitalWrite(ledPins[ 2 ], ((millis( ) - myTimer) % 1000) > 500);

 } else if (millis( ) - myTimer < ( 120000) ) { // 120 Sekunden

  digitalWrite(ledPins[ 3 ], ((millis( ) - myTimer) % 1000) > 500);

 } else if (millis( ) - myTimer < ( 150000) ) { // 150 Sekunden

  digitalWrite(ledPins[ 4 ], ((millis( ) - myTimer) % 1000) > 500);

 } else if (millis( ) - myTimer < ( 180000) ) { // 180 Sekunden

  digitalWrite(ledPins[ 5 ], ( (millis( ) - myTimer) % 1000) > 500);

 } else if (millis( ) - myTimer < ( 190000) ) { // nach 180 Sekunden

  for (int i = 0; i < 6; i++) {

   digitalWrite(ledPins[ i ], ( (millis( ) - myTimer) % 1000) < 500);

  }

 } else {

  for (int i = 0; i < 6; i++) {

   digitalWrite(ledPins[ i ], LOW);

  }

 }

 delay( 10 );

}

[/code]

Schule, Arduino
Arduino programmieren?

Kennt sich jemand hier aus um das zu programmieren

First Shield:

Es sollen die Taster S1 und S2 mittels Flankenerkennung eingelesen werden.

Es soll bei beiden Tastern die negative Flanke erkannt werden.

Die Flankenerkennung soll selbst programmiert werden.

Zusätzlich sollen die beiden Taster mittels geeigneter Software entprellt werden.

Funktion S1:

S1 schaltet die Zählrichtung um.

Die Zählrichtung wechselt bei jedem Drücken des Tasters zwischen Aufwärtszählung und

Abwärtszählung.

S2 wird als Zähleingang verwendet. Jeder Tastendruck wird gezählt und in einer Variablen

abgespeichert.

Diese Zählvariable wird "usi_zaehler" benannt und ist vom Datentyp unsigned short integer.

Diese Variable soll nur Werte zwischen 0 und 9 annehmen.

Hat die Variable eine der beiden Grenzen erreicht, so bleibt sie auf dem jeweiligen Wert stehen,

bis wieder ein Richtungswechsel durchgeführt wird.

7-Segment-Anzeige:

Die Zählvariable soll auf dem "DIGIT1" dargestellt werden.

Zusatz-Aufgabe für interessierte Schüler:

Entsprechend dem Wert der Zählvariable "usi_zaehler" von 0 bis 9 soll die RGB-Led von

0% bis 100% angesteuert werden und damit die Helligkeit entsprechend der 7-Segment-Anzeige

angesteuert werden.

Bei jedem Zählrichtungswechsel soll die Farbe der RGB-Led wechseln.

Die Reihenfolge der Farbwechsel lautet:

Rot-Grün-Blau-Alle drei Farben gleichzeitig-Rot-Grün-Blau-Alle drei Farben gleichzeitig - usw.

Computer, Technik, programmieren, Arduino, Technologie

Meistgelesene Beiträge zum Thema Arduino