ich habe mir mal die beiden versionen des codes angeschaut und verglichen...
deine
und die meineCode:// DIR und STEP pins definieren #define dirPin_VL 6 //2 #define stepPin_VL 7 //3 #define dirPin_HL 8 //4 #define stepPin_HL 9 //5 #define dirPin_VR 2 //6 #define stepPin_VR 3 //7 #define dirPin_HR 4 //8 #define stepPin_HR 5 //9 //enable pins definieren #define enbl_VL 40 #define enbl_HL 42 #define enbl_VR 41 #define enbl_HR 43 //resett pin definieren #define PIN2RESET 10 //steps pro umdrehung definieren: #define stepsPerRevolution 200 uint8_t taste_neu = 1; uint8_t taste_alt = 8; uint8_t taste = 0; uint8_t s_vor = 0; uint8_t s_rueck = 0; uint8_t s_links = 0; uint8_t s_rechts = 0; uint8_t StepsPerDirection = 0; void setup() { // pinMode(LED, OUTPUT); //pins als output: pinMode(dirPin_VL, OUTPUT); pinMode(stepPin_VL, OUTPUT); pinMode(enbl_VL, OUTPUT); pinMode(dirPin_HL, OUTPUT); pinMode(stepPin_HL, OUTPUT); pinMode(enbl_HL, OUTPUT); pinMode(dirPin_VR, OUTPUT); pinMode(stepPin_VR, OUTPUT); pinMode(enbl_VR, OUTPUT); pinMode(dirPin_HR, OUTPUT); pinMode(stepPin_HR, OUTPUT); pinMode(enbl_HR, OUTPUT); //resett pin zustand definieren pinMode(PIN2RESET, INPUT); Serial.begin(115200); Serial1.begin(115200); Serial.println("code----- /home/georg/Arduino/outdoor_robo/smartphone_steuerung/outdoor_moppi_FB_switch_bluetooth_1"); Serial.println("bluetooth übertragung!"); //enable pins deaktivieren: digitalWrite(enbl_VL, LOW); digitalWrite(enbl_HL, LOW); digitalWrite(enbl_VR, LOW); digitalWrite(enbl_HR, LOW); //resett pin aktivieren digitalWrite(PIN2RESET, HIGH); } void loop() { if (Serial1.available()) { taste = Serial1.read(); Serial.println(taste); // taste_neu = taste; tasten_abfrage(); } if ( StepsPerDirection > 0) { StepsPerDirection--; richtung_abfrage(); } } /***********************************************************/ void richtung_abfrage(void) { if (s_rechts == 1) rechts_drehen(); if (s_links == 1) links_drehen(); if (s_vor == 1) vorwaerts(); if (s_rueck == 1) rueckwaerts(); } /***********************************************************/ void tasten_abfrage(void) { switch (taste) { case 100:// rotate rechts - FB quer smartphone { StepsPerDirection = 200/4; //Nach 1/4 Radumdrehung Stillstand; weil pro Umdrehung = 200 Schritte rechts_drehen(); break; } case 97:// rotate links - FB quer smartphone { StepsPerDirection = 200/4; //Nach 1/4 Radumdrehung Stillstand; weil pro Umdrehung = 200 Schritte links_drehen(); break; } case 116:// fahre vor - FB quer smartphone { StepsPerDirection = 200/4; //Nach 1/4 Radumdrehung Stillstand; weil pro Umdrehung = 200 Schritte vorwaerts(); break; } case 115:// fahre rückwärts - FB quer smartphone { StepsPerDirection = 200/4; //Nach 1/4 Radumdrehung Stillstand; weil pro Umdrehung = 200 Schritte rueckwaerts(); break; } } } /***********************************************************/ void alle_stepper_stop(void) { //enable pins deaktivieren digitalWrite(enbl_VL, LOW); digitalWrite(enbl_HL, LOW); digitalWrite(enbl_VR, LOW); digitalWrite(enbl_HR, LOW); reboot(); } /***********************************************************/ void vorwaerts(void) { if(s_vor == 0) { // enable pins aktivieren: digitalWrite(enbl_VL, HIGH); digitalWrite(enbl_HL, HIGH); digitalWrite(enbl_VR, HIGH); digitalWrite(enbl_HR, HIGH); //richtung bestimmen digitalWrite(dirPin_VL, LOW); digitalWrite(dirPin_HL, LOW); digitalWrite(dirPin_VR, HIGH); digitalWrite(dirPin_HR, HIGH); s_vor = 1; s_rueck = 0; s_links = 0; s_rechts = 0; } else{ digitalWrite(stepPin_VL, HIGH); digitalWrite(stepPin_HL, HIGH); digitalWrite(stepPin_VR, HIGH); digitalWrite(stepPin_HR, HIGH); delayMicroseconds(500); digitalWrite(stepPin_VL, LOW); digitalWrite(stepPin_HL, LOW); digitalWrite(stepPin_VR, LOW); digitalWrite(stepPin_HR, LOW); delayMicroseconds(500); } } /**********************************************************/ void rueckwaerts(void) { if(s_rueck == 0) { // enable pins aktivieren: digitalWrite(enbl_VL, HIGH); digitalWrite(enbl_HL, HIGH); digitalWrite(enbl_VR, HIGH); digitalWrite(enbl_HR, HIGH); //richtung bestimmen digitalWrite(dirPin_VL, HIGH); digitalWrite(dirPin_HL, HIGH); digitalWrite(dirPin_VR, LOW); digitalWrite(dirPin_HR, LOW); s_vor = 0; s_rueck = 1; s_links = 0; s_rechts = 0; } else{ digitalWrite(stepPin_VL, HIGH); digitalWrite(stepPin_HL, HIGH); digitalWrite(stepPin_VR, HIGH); digitalWrite(stepPin_HR, HIGH); delayMicroseconds(500); digitalWrite(stepPin_VL, LOW); digitalWrite(stepPin_HL, LOW); digitalWrite(stepPin_VR, LOW); digitalWrite(stepPin_HR, LOW); delayMicroseconds(500); } } /***********************************************************/ void rechts_drehen(void) { if(s_rechts == 0) { // enable pins aktivieren digitalWrite(enbl_VL, HIGH); digitalWrite(enbl_HL, HIGH); digitalWrite(enbl_VR, HIGH); digitalWrite(enbl_HR, HIGH); //richtung bestimmen digitalWrite(dirPin_VL, LOW); digitalWrite(dirPin_HL, LOW); digitalWrite(dirPin_VR, LOW); digitalWrite(dirPin_HR, LOW); s_vor = 0; s_rueck = 0; s_links = 0; s_rechts = 1; } else{ digitalWrite(stepPin_VL, HIGH); digitalWrite(stepPin_HL, HIGH); digitalWrite(stepPin_VR, HIGH); digitalWrite(stepPin_HR, HIGH); delayMicroseconds(500); digitalWrite(stepPin_VL, LOW); digitalWrite(stepPin_HL, LOW); digitalWrite(stepPin_VR, LOW); digitalWrite(stepPin_HR, LOW); delayMicroseconds(500); } } /**********************************************************/ void links_drehen(void) { if(s_links == 0) { //enable pins aktivieren digitalWrite(enbl_VL, HIGH); digitalWrite(enbl_HL, HIGH); digitalWrite(enbl_VR, HIGH); digitalWrite(enbl_HR, HIGH); //richtung bestimmen digitalWrite(dirPin_VL, HIGH); digitalWrite(dirPin_HL, HIGH); digitalWrite(dirPin_VR, HIGH); digitalWrite(dirPin_HR, HIGH); s_vor = 0; s_rueck = 0; s_links = 1; s_rechts = 0; } else{ digitalWrite(stepPin_VL, HIGH); digitalWrite(stepPin_HL, HIGH); digitalWrite(stepPin_VR, HIGH); digitalWrite(stepPin_HR, HIGH); delayMicroseconds(500); digitalWrite(stepPin_VL, LOW); digitalWrite(stepPin_HL, LOW); digitalWrite(stepPin_VR, LOW); digitalWrite(stepPin_HR, LOW); delayMicroseconds(500); } } /* void links_drehen(void) //mit beschleunigung und sound { //enable pins aktivieren digitalWrite(enbl_VL, HIGH); digitalWrite(enbl_HL, HIGH); digitalWrite(enbl_VR, HIGH); digitalWrite(enbl_HR, HIGH); //richtung bestimmen digitalWrite(dirPin_VL, HIGH); digitalWrite(dirPin_HL, HIGH); digitalWrite(dirPin_VR, HIGH); digitalWrite(dirPin_HR, HIGH); //"j = 2000": der Anfangswert für das Delay in Microsekunden for (int i = 0, j = 2000; i < stepsPerRevolution; i++) { //"j > 500": der Endwert für das Delay in Microsekunden - bestimmt auch die Endgeschwindigkeit (mindestens 250 bis 300) if (j > 300) j--; //"z < 3": wieviele Schritte mit dem eingstellten Delay "j" gemacht werden sollen, bevor es reduziert wird for (int z = 0; z < 3 && i < stepsPerRevolution; z++) { digitalWrite(stepPin_VL, HIGH); digitalWrite(stepPin_HL, HIGH); digitalWrite(stepPin_VR, HIGH); digitalWrite(stepPin_HR, HIGH); delayMicroseconds(j); digitalWrite(stepPin_VL, LOW); digitalWrite(stepPin_HL, LOW); digitalWrite(stepPin_VR, LOW); digitalWrite(stepPin_HR, LOW); delayMicroseconds(j); i++; } } } */ /***********************************************************/ void reboot() { pinMode(PIN2RESET, OUTPUT); digitalWrite(PIN2RESET, LOW); delay(100); } /***********************************************************/ /************************************************************/
bei meiner version habe ich die rekursiv - aufrufe in den einzelnen bewegungsfunktionen rausgenommen - und - das ist bei mir in ein wenig in vergessenheit geraten - die Stepper laufen mit mikrostepping, 1/8schritt, das bedeutet, dass ich die variable "StepsPerRevolution" auf 1600 anpassen muss. Dann laufen die Stepper je nach befehl vom smartphone genau eine umdrehung.Code://#include "Arduino.h" //2019_12_21: //bei linksdrehen ist das langsammere anfahren berücksichtigt / auskommentiert //dauerbewegung beim einmal drücken (fernbedienung "quer" am smartphone) geht nicht //uint8_t LED = 13; // DIR und STEP pins definieren #define dirPin_VL 6 //2 #define stepPin_VL 7 //3 #define dirPin_HL 8 //4 #define stepPin_HL 9 //5 #define dirPin_VR 2 //6 #define stepPin_VR 3 //7 #define dirPin_HR 4 //8 #define stepPin_HR 5 //9 //enable pins definieren #define enbl_VL 40 #define enbl_HL 42 #define enbl_VR 41 #define enbl_HR 43 //resett pin definieren #define PIN2RESET 10 //steps pro umdrehung definieren: #define stepsPerRevolution 1600 uint8_t taste_neu = 1; uint8_t taste_alt = 8; uint8_t taste = 0; void setup() { // pinMode(LED, OUTPUT); //pins als output: pinMode(dirPin_VL, OUTPUT); pinMode(stepPin_VL, OUTPUT); pinMode(enbl_VL, OUTPUT); pinMode(dirPin_HL, OUTPUT); pinMode(stepPin_HL, OUTPUT); pinMode(enbl_HL, OUTPUT); pinMode(dirPin_VR, OUTPUT); pinMode(stepPin_VR, OUTPUT); pinMode(enbl_VR, OUTPUT); pinMode(dirPin_HR, OUTPUT); pinMode(stepPin_HR, OUTPUT); pinMode(enbl_HR, OUTPUT); //resett pin zustand definieren pinMode(PIN2RESET, INPUT); Serial.begin(115200); Serial1.begin(115200); Serial.println("code----- /home/georg/Arduino/outdoor_robo/smartphone_steuerung/outdoor_FB_switch_bluetooth_1.ino"); Serial.println("bluetooth übertragung!"); //enable pins deaktivieren: digitalWrite(enbl_VL, LOW); digitalWrite(enbl_HL, LOW); digitalWrite(enbl_VR, LOW); digitalWrite(enbl_HR, LOW); //resett pin aktivieren digitalWrite(PIN2RESET, HIGH); } void loop() { while (Serial1.available()) { taste = Serial1.read(); Serial.println(taste); // taste_neu = taste; tasten_abfrage(); } } /***********************************************************/ void tasten_abfrage(void) { switch (taste) { case 100:// rotate rechts - FB quer smartphone { rechts_drehen(); break; } case 97:// rotate links - FB quer smartphone { links_drehen(); break; } case 116:// fahre vor - FB quer smartphone { vorwaerts(); break; } case 115:// fahre rückwärts - FB quer smartphone { rueckwaerts(); break; } } } /***********************************************************/ void alle_stepper_stop(void) { //enable pins deaktivieren digitalWrite(enbl_VL, LOW); digitalWrite(enbl_HL, LOW); digitalWrite(enbl_VR, LOW); digitalWrite(enbl_HR, LOW); reboot(); } /***********************************************************/ void vorwaerts(void) { // enable pins aktivieren: digitalWrite(enbl_VL, HIGH); digitalWrite(enbl_HL, HIGH); digitalWrite(enbl_VR, HIGH); digitalWrite(enbl_HR, HIGH); //richtung bestimmen digitalWrite(dirPin_VL, LOW); digitalWrite(dirPin_HL, LOW); digitalWrite(dirPin_VR, HIGH); digitalWrite(dirPin_HR, HIGH); for (int i = 0; i < stepsPerRevolution; i++) { digitalWrite(stepPin_VL, HIGH); digitalWrite(stepPin_HL, HIGH); digitalWrite(stepPin_VR, HIGH); digitalWrite(stepPin_HR, HIGH); delayMicroseconds(500); digitalWrite(stepPin_VL, LOW); digitalWrite(stepPin_HL, LOW); digitalWrite(stepPin_VR, LOW); digitalWrite(stepPin_HR, LOW); delayMicroseconds(500); } // tasten_abfrage(); } /**********************************************************/ void rueckwaerts(void) { // enable pins aktivieren: digitalWrite(enbl_VL, HIGH); digitalWrite(enbl_HL, HIGH); digitalWrite(enbl_VR, HIGH); digitalWrite(enbl_HR, HIGH); //richtung bestimmen digitalWrite(dirPin_VL, HIGH); digitalWrite(dirPin_HL, HIGH); digitalWrite(dirPin_VR, LOW); digitalWrite(dirPin_HR, LOW); for (int i = 0; i < stepsPerRevolution; i++) { digitalWrite(stepPin_VL, HIGH); digitalWrite(stepPin_HL, HIGH); digitalWrite(stepPin_VR, HIGH); digitalWrite(stepPin_HR, HIGH); delayMicroseconds(500); digitalWrite(stepPin_VL, LOW); digitalWrite(stepPin_HL, LOW); digitalWrite(stepPin_VR, LOW); digitalWrite(stepPin_HR, LOW); delayMicroseconds(500); } // tasten_abfrage(); } /***********************************************************/ void rechts_drehen(void) { // enable pins aktivieren digitalWrite(enbl_VL, HIGH); digitalWrite(enbl_HL, HIGH); digitalWrite(enbl_VR, HIGH); digitalWrite(enbl_HR, HIGH); //richtung bestimmen digitalWrite(dirPin_VL, LOW); digitalWrite(dirPin_HL, LOW); digitalWrite(dirPin_VR, LOW); digitalWrite(dirPin_HR, LOW); for (int i = 0; i < stepsPerRevolution; i++) { digitalWrite(stepPin_VL, HIGH); digitalWrite(stepPin_HL, HIGH); digitalWrite(stepPin_VR, HIGH); digitalWrite(stepPin_HR, HIGH); delayMicroseconds(500); digitalWrite(stepPin_VL, LOW); digitalWrite(stepPin_HL, LOW); digitalWrite(stepPin_VR, LOW); digitalWrite(stepPin_HR, LOW); delayMicroseconds(500); } // tasten_abfrage(); } /**********************************************************/ void links_drehen(void) { //enable pins aktivieren digitalWrite(enbl_VL, HIGH); digitalWrite(enbl_HL, HIGH); digitalWrite(enbl_VR, HIGH); digitalWrite(enbl_HR, HIGH); //richtung bestimmen digitalWrite(dirPin_VL, HIGH); digitalWrite(dirPin_HL, HIGH); digitalWrite(dirPin_VR, HIGH); digitalWrite(dirPin_HR, HIGH); for (int i = 0; i < stepsPerRevolution; i++) { digitalWrite(stepPin_VL, HIGH); digitalWrite(stepPin_HL, HIGH); digitalWrite(stepPin_VR, HIGH); digitalWrite(stepPin_HR, HIGH); delayMicroseconds(500); digitalWrite(stepPin_VL, LOW); digitalWrite(stepPin_HL, LOW); digitalWrite(stepPin_VR, LOW); digitalWrite(stepPin_HR, LOW); delayMicroseconds(500); } // tasten_abfrage(); } /* void links_drehen(void) //mit beschleunigung und sound { //enable pins aktivieren digitalWrite(enbl_VL, HIGH); digitalWrite(enbl_HL, HIGH); digitalWrite(enbl_VR, HIGH); digitalWrite(enbl_HR, HIGH); //richtung bestimmen digitalWrite(dirPin_VL, HIGH); digitalWrite(dirPin_HL, HIGH); digitalWrite(dirPin_VR, HIGH); digitalWrite(dirPin_HR, HIGH); //"j = 2000": der Anfangswert für das Delay in Microsekunden for (int i = 0, j = 2000; i < stepsPerRevolution; i++) { //"j > 500": der Endwert für das Delay in Microsekunden - bestimmt auch die Endgeschwindigkeit (mindestens 250 bis 300) if (j > 300) j--; //"z < 3": wieviele Schritte mit dem eingstellten Delay "j" gemacht werden sollen, bevor es reduziert wird for (int z = 0; z < 3 && i < stepsPerRevolution; z++) { digitalWrite(stepPin_VL, HIGH); digitalWrite(stepPin_HL, HIGH); digitalWrite(stepPin_VR, HIGH); digitalWrite(stepPin_HR, HIGH); delayMicroseconds(j); digitalWrite(stepPin_VL, LOW); digitalWrite(stepPin_HL, LOW); digitalWrite(stepPin_VR, LOW); digitalWrite(stepPin_HR, LOW); delayMicroseconds(j); i++; } } } */ /***********************************************************/ void reboot() { pinMode(PIN2RESET, OUTPUT); digitalWrite(PIN2RESET, LOW); delay(100); } /***********************************************************/ /************************************************************/
Bei Deiner version verstehe ich einiges nicht. Dass Du in den einzelnen "richtungs"funktionen die richtungsdefinition nur einmal ablaufen lässt verstehe ich, auch den sinn der "s-* variablen" (vor, rück usw) ist klar.
Bei einer änderung der zeile " StepsPerDirection = 200/4;" in 200 dreht der Stepper um 1/8 umdrehung, bei 200/4 war es 1/32 pro befehl vom smartphone. Wenn ich die zahl in 1600 ändere müsste doch der Stepper eine ganze umdrehung machen er dreht sich aber nur um einen 1/24stel. Wie kommt das?





Zitieren


Lesezeichen