Brushless Motor steuern über RS232 Schnittstelle

Braucht der MAX232 keine Versorgungsspannung?

Grüße Uwe

Du hast mich wieder gerettet :slight_smile: Zuerst habe ich probiert, wie von dir vorgeschlagen RX,TX neu anlöten. Leider hat es nicht viel gebracht. Das Display war extrem langsam nur dadurch.
Der Übeltäter war

  mySerial.println("encres 64");//encres64
  mySerial.println("sor 0");//sor0
  mySerial.println("a 1");//a1

Faulhaber hat sein eigenes Software Umgebung es heißt Motion Manager und da ist es in der Programmdatei drinnen.

Naja wieder was gelernt Vielen Dank für deine Hilfe, du machst hier im Forum großartige Arbeit.

Das Display benötige ich nicht für steuerung aber für meinen Zweck ist wichtig die Darstellung von den aktuellen Drehzahl und auch Steuerung. MAX232 ist mit 5V Spannung an der UNO angeschlossen. my_xy_projekt Brattain hat mein Problem schon entdeckt. :slight_smile:

Ich hatte einen guten Abend.

Wie gesagt: Der Code ist noch extrem Verbesserungswürdig. Wie sieht der denn jetzt aktuell aus?

Schneid ich mir aus und klebs mir an die Wand :laughing:
Danke.

Das ist das aktuelle Programm. Die Wiederholung von der Geschwindigkeit musste ich da lassen sonst war der Motor unruhig. Mit diesem Programm läuft es wie eine Katze:)

#include <SPI.h>
//TFT
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
#include <TouchScreen.h>
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library
#define MINPRESSURE 200
#define MAXPRESSURE 1000
#include <Interval.h>

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin
///////////
//#include <SoftwareSerial.h>
//const byte RX = 6;
//const byte TX = 7;
//SoftwareSerial mySerial (RX, TX);

char CRPM[18] ;// für eine 5 stellige Zahl

// Variablen
int drehzahl = 0; // Startdrehzahl
const int drehzahlSchritt = 5; // Schrittgröße für die Drehzahl
const int maxDrehzahl = 500; // Maximale Drehzahl
const int minDrehzahl = -500; // Minimale Drehzahl
int VSpeed;

bool showSymbol1 = true; // Flag für das Symbol
bool Sperre = true;



/////Touchdisplay

// ALL Touch panels and wiring is DIFFERENT
// copy-paste results from TouchScreen_Calibr_native.ino
//const int XP = 8, XM = A2, YP = A3, YM = 9; //ID=0x9341 Hochformat
const int XP = 9, XM = A3, YP = A2, YM = 8; //ID=0x9341 Querformat
//const int TS_LEFT = 907, TS_RT = 136, TS_TOP = 942, TS_BOT = 139; //Hochformat
const int TS_LEFT = 92, TS_RT = 870, TS_TOP = 860, TS_BOT = 140; //Querformat
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

Adafruit_GFX_Button minus_btn, plus_btn, lock_btn, unlock_btn,plus50_btn,minus50_btn,plus25_btn,minus25_btn;

int pixel_x, pixel_y;     //Touch_getXY() updates global vars
bool Touch_getXY(void)
{
    TSPoint p = ts.getPoint();
    pinMode(YP, OUTPUT);      //restore shared pins
    pinMode(XM, OUTPUT);
    digitalWrite(YP, HIGH);   //because TFT control pins
    digitalWrite(XM, HIGH);
    bool pressed = (p.z > MINPRESSURE && p.z < MAXPRESSURE);
    if (pressed) {
        pixel_x = map(p.x, TS_LEFT, TS_RT, 0, tft.width()); //.kbv makes sense to me
        pixel_y = map(p.y, TS_TOP, TS_BOT, 0, tft.height());
    }
    return pressed;
}

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600,SERIAL_8N1);
//mySerial.begin(9600);
setupscreen(); 
displayWelcomeMessage();
tft.fillScreen(BLACK);
initializeButtons();

}
void setupscreen() {
/////Touchdisplay

tft.reset();
uint16_t identifier = tft.readID();
identifier=0x9341;
tft.begin(identifier);
tft.setRotation(1);            //PORTRAIT
tft.fillScreen(BLACK);



}
   


void initializeButtons() {
 minus_btn.initButton(&tft,  30, 210, 60, 60,WHITE, CYAN, BLACK, "-", 4);
 plus_btn.initButton(&tft, 291, 210, 60, 60, WHITE, CYAN, BLACK, "+", 4);
 lock_btn.initButton(&tft, 160, 220, 160, 40, RED, RED, BLACK, "Gesperrt", 2);
 minus25_btn.initButton(&tft,  30, 150, 60, 50,WHITE, CYAN, BLACK, "-25", 3);
 plus25_btn.initButton(&tft, 291, 150, 60, 50, WHITE, CYAN, BLACK, "+25", 3);
  minus50_btn.initButton(&tft,  105, 150, 60, 50,WHITE, CYAN, BLACK, "-50", 3);
 plus50_btn.initButton(&tft, 216, 150, 60, 50, WHITE, CYAN, BLACK, "+50", 3);
 //unlock_btn.initButton(&tft, 140, 230, 160, 20, WHITE, CYAN, BLACK, "gesppert", 2);
// unlock_btn.initButton(&tft, 200, 210, 60, 60, WHITE, CYAN, BLACK, "e", 4);
 minus_btn.drawButton(false);
 plus_btn.drawButton(false);
 lock_btn.drawButton(false);
 minus25_btn.drawButton(false);
 plus25_btn.drawButton(false);
  minus50_btn.drawButton(false);
 plus50_btn.drawButton(false);
 //unlock_btn.drawButton(false);
 }
void displayWelcomeMessage() {
    tft.setCursor(60, 0);
    tft.setTextSize(3);
    tft.setTextColor(WHITE, BLACK);
    tft.print("");
    tft.setCursor(70, 30);
    tft.print("");
    tft.setCursor(90, 60);
    tft.print("");
    tft.setCursor(0, 100);
    tft.setTextSize(2);
    tft.print("");
    tft.setCursor(0, 140);
    tft.print("");
    tft.setCursor(0, 160);
    tft.print("");
     delay(10000);
    tft.fillScreen(BLACK);
    
}
void updateTouch() {
 
    bool down = Touch_getXY();
    // Button-Status aktualisieren
    minus_btn.press(down && minus_btn.contains(pixel_x, pixel_y));
    plus_btn.press(down && plus_btn.contains(pixel_x, pixel_y));
    lock_btn.press(down && lock_btn.contains(pixel_x, pixel_y));
    minus25_btn.press(down && minus25_btn.contains(pixel_x, pixel_y));
    plus25_btn.press(down && plus25_btn.contains(pixel_x, pixel_y));
    minus50_btn.press(down && minus50_btn.contains(pixel_x, pixel_y));
    plus50_btn.press(down && plus50_btn.contains(pixel_x, pixel_y));
     if (minus_btn.justReleased())
   minus_btn.drawButton();
 if (plus_btn.justReleased())
   plus_btn.drawButton();
 if (lock_btn.justReleased())
 lock_btn.drawButton();
  if (unlock_btn.justReleased())
   unlock_btn.drawButton();
 if (plus25_btn.justReleased())
   plus25_btn.drawButton();
 if (minus25_btn.justReleased())
   minus25_btn.drawButton();
 if (plus50_btn.justReleased())
   plus50_btn.drawButton();
 if (minus50_btn.justReleased())
   minus50_btn.drawButton();

}

void handleButtonActions() {
if(!Sperre  && plus25_btn.justPressed()){
   plus25_btn.drawButton(true);
    drehzahl = drehzahl+25;
     if (drehzahl > maxDrehzahl) {
      drehzahl = maxDrehzahl; // Begrenzung auf minimale Drehzahl
    }
    delay(200); // Entprellzeit
  } 
   if(!Sperre  && plus50_btn.justPressed()){
   plus50_btn.drawButton(true);
    drehzahl = drehzahl+50;
     if (drehzahl > maxDrehzahl) {
      drehzahl = maxDrehzahl; // Begrenzung auf minimale Drehzahl
    }
    delay(200); // Entprellzeit
  }
   if(!Sperre  && minus25_btn.justPressed()){
   minus25_btn.drawButton(true);
    drehzahl = drehzahl-25;
     if (drehzahl < minDrehzahl) {
      drehzahl = minDrehzahl; // Begrenzung auf minimale Drehzahl
    }
    delay(200); // Entprellzeit
  }
   if(!Sperre  && minus50_btn.justPressed()){
   minus50_btn.drawButton(true);
    drehzahl = drehzahl-50;
     if (drehzahl < minDrehzahl) {
      drehzahl = minDrehzahl; // Begrenzung auf minimale Drehzahl
    }
    delay(200); // Entprellzeit
  }
  if (lock_btn.justPressed()) {
    showSymbol1 = !showSymbol1; // Symbol wechseln
    drawButton(); // Taste neu zeichnen
    delay(200); // Entprellen
  }   

  
 if (!Sperre  && minus_btn.justPressed()) {
   minus_btn.drawButton(true);
   drehzahl -= drehzahlSchritt; // Drehzahl verringern
    if (drehzahl < minDrehzahl) {
      drehzahl = minDrehzahl; // Begrenzung auf minimale Drehzahl
    }
    delay(200); // Entprellzeit
  }
 if (!Sperre  && plus_btn.justPressed()) {
   plus_btn.drawButton(true);
       drehzahl += drehzahlSchritt; // Drehzahl erhöhen
    if (drehzahl > maxDrehzahl) {
      drehzahl = maxDrehzahl; // Begrenzung auf maximale Drehzahl
    }
    delay(200); // Entprellzeit
  }
}
void displayDrehzahl() {
VSpeed = drehzahl;
snprintf(CRPM,sizeof(CRPM),"%" "18d", VSpeed);// 5 stellig

tft.setCursor(100,0); tft.setTextSize(3);
tft.setTextColor(WHITE, BLACK); 
tft.print("Drehzahl");
tft.setCursor(40,30); tft.setTextSize(3);
tft.setTextColor(WHITE, BLACK); 
tft.print("des Kegels RPM");
 tft.setTextSize(5);
tft.setTextColor(WHITE, BLACK); 




if (VSpeed>=100){
 tft.setCursor(115,80);
 tft.print(VSpeed);
  tft.print(" ");
}
if (VSpeed<=99 && VSpeed >= 10 ){
 tft.setCursor(105,80);
   tft.print(" ");
 tft.print(VSpeed);
  tft.print(" ");
}
if (VSpeed<=9 && VSpeed >= 0){
 tft.setCursor(90,80);
  tft.print("  ");
 tft.print(VSpeed);
  tft.print(" ");
}
if (VSpeed<=-1){
 tft.setCursor(70,80);
  tft.print(" ");
 tft.print(VSpeed);
  tft.print("");
}



}
void speed() {

//Serial.println("encres 64");//encres64
//Serial.println("sor 0");//sor0
//Serial.println("a 1");//a1
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
///*
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295



Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v29

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295

Serial.println("delay 4");//delay4
Serial.print("V");//a1
Serial.println(VSpeed);//v295



Serial.println("delay 4");//delay4
//Serial.println("jmp 1");//jmp1
//*/

}
void loop() {

updateTouch();
handleButtonActions();
displayDrehzahl();
speed();
}
void drawButton() {
 bool down = Touch_getXY();
  if (showSymbol1) {
     lock_btn.initButton(&tft, 160, 220, 160, 40, RED, RED, BLACK, "Gesperrt", 2);
     
   Sperre = true;
  } else {
     lock_btn.initButton(&tft, 160, 220, 160, 40, GREEN, GREEN, BLACK, "Entsperrt", 2);
     
    Sperre = false; 
  }
}

Warum hast du das 50 mal hintereinander?

Schrieb er ja.
Es ruckelt sonst.

Allerdings scheint das nur die Symptome zu überdecken und das eigentliche Problem nicht zu beheben.

Ok. Man hätte das auch als:

  for (byte b = 0; b < 50; b++)
  {
    Serial.println("delay 4");//delay4
    Serial.print("V");//a1
    Serial.println(VSpeed);//v295
  }

schreiben können :grin:
Aber da gibts noch ganz andere Baustellen - darum schrieb ich ja:

Ja, der Code ist bestimmt verbesserungswürdig, aber mit meinen Kenntnissen stoße ich auf gewisse Grenzen :slight_smile:
Übrigens, das mit dem wiederholten Code habe ich direkt von den Faulhaber. In Ihrem programmier Umgebung gibts die Möglichkeit der Code aus dem Motioncontroller auslesen. (das wäre schön auch bei arduino) Der Code besteht aus 2 Dateien. Die erste Datei ist so was ähnliches wie setup in dem Arduino und die zweite Datei ist loop.