Brushless Motor mit Poti und Display Anzeige

Hallo Zusammen,

Würde gerne einen Brushless Motor mit Regler am Arduino anschließen und diesen mittels einen 10K Poti Drehzahl regeln.

Anschluss vom Motorregler erfolgt wie ein Servo. Poti ist auch klar. Am Display möchte ich dann entweder den Wert des Potis oder im besten Fall die Drehzahl angezeigt bekommen.

Die einzelnen Komponenten funktionieren grundsätzlich. Kann also einen Servo regeln und eine Display Anzeige realisieren.

Für alles zusammen fehlt mir aber der Plan. Hat jemand zufällig einen Beispiel Code oder gibt es so eine ähnliche Anwendung?

Würdet mir wirklich weiter helfen. Vielen Dank

Hardware:
Arduino Uno
Brushless Motor mit Regler (normaler Servoanschluss)
Display: Display for Arduino, Smraza LCD 2004 Display Modul Shield (20 characters x 4 lines) for Arduino UNO R3 Mega2560 Nano

Poste zu deinen Teilen bitte mal Hyperlinks, keine URL.
Ohne die, wissen wir doch nicht, was du verbauen willst.

Und was ist ein Mega2560 Nano ?

Sorry,

Hoffe so ist es richtig: Hier Links zur Hardware, welche ich in Verwendung habe.

Arduino Uno:

LCD Display:

Motor + Regler:

Potentiometer:

HotSystems:
Und was ist ein Mega2560 Nano ?

Das war nur ein Teil der großspurige Beschreibung des Displays, der auf der zweiten Zeile gelandet ist.

@Hannes1
Wenn schon alles einzeln funktioniert und Du es progeammieren kannst, was ist Dein Problem beim zusammenfügen?
Die Drehzahlangabe auf dem Display ist schwierig da keine Messung erfolgt oder linearer Zusammenhang zwischen Ansteuerung und Drehzahl besteht. Die Drehzahl ist abhängig von der mechanischen Last des Motors. Du kannst zB eine Prozentangabe der Ansteuerung.

Grüße Uwe

uwefed:
Das war nur ein Teil der großspurige Beschreibung des Displays, der auf der zweiten Zeile gelandet ist.

Ok, danke Uwe.
Ich konnte es in dem Link auch nicht erkennen.

@Hannes1
Wie Uwe schon schreibt, die Drehzahl kannst du nicht einfach am Motor oder Regler abnehmen.
Da brauchst du min. Sensoren für.
Du kannst aber die Spannung des Potis auswerten bzw. anzeigen. Diesen legst du ja an einen analogen Eingangspin an und den Wert zeigst du auf dem Display an.

Danke für die Rückmeldungen. In der Hauptsache geht es mir darum, dass mir mal jemand über den Code drüber schaut und wie ich folgendes im Code definieren kann:

  • Stop Funktion (NotAus) mit Taster
  • Minimale Drehzahl (Motor Regler 0)
  • Maximale Drehzahl (z.B.: 60%, egal wie weit ich den Poti drehe)

Hier der aktuelle Code:

#include <Wire.h> 
 #include <LiquidCrystal_I2C.h>
 #include <Servo.h> 

 LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 20 chars and 4 line display
 Servo myservo;  // create servo object to control a servo 

 int potpin = 0;  // analog pin used to connect the potentiometer
 int val;    // variable to read the value from the analog pin 

 void setup()
 {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object  

    lcd.init();                      // initialize the lcd 
    lcd.backlight();
    lcd.setCursor(3,0);
    myservo.write(0);  // <------ put the servo at zero
    
  }

  void loop() 
  {
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023) 
  //val = map(val, 0, 1023, -10, 160);     // scale it to use it with the servo (value between 0 and 180) 
  myservo.write(val);                  // sets the servo position according to the scaled value 
  lcd.setCursor(0,0);
  lcd.print("Wuchtmaschine");
  lcd.setCursor(0,1);
  lcd.print("my name");
  lcd.setCursor(0,2);
  lcd.print("Balanceing Speed");
  lcd.setCursor(0,3);
  lcd.print("Prozent");
  lcd.setCursor(13,3);
  lcd.print("%");
  lcd.setCursor(10,3);
  lcd.print("   ");  // This covers up the previous value
  lcd.setCursor(9,3);
  lcd.print(val);
  delay(15);                           // waits for the servo to get there 
  }

Hi

int potpin = 0
const byte potpin = A0; //Pinne können nicht negativ sein, also unsigned. Byte ist unsigned und geht bis 255, reicht
//Für analoge Messungen einen analogen Input, oder?

int val;
int unsigned val; //der ADC gibt Werte 0...1023 zurück - eigentlich egal, ob signed oder unsigned

Du kannst, egal wie weit Du das Poti drehst (und ggf. via map den Wert eingrenzt) ja jeder Zeit einen 'Deckel' drauf machen, indem Du auf eine von Dir frei gewählte (ggf. später auch frei einstellbare) Grenze maximierst - verwirrender Weise geht Das mit MIN :wink:

min(val,123);
ergibt MAXIMAL 123, eben den kleineren Wert, wenn val zu groß wird.

Vll. ist das LCD-Menü (gibt dazu einen Thread) eine Idee für Dich - so kannst Du in den Menüs Werte einstellen und im 'Arbeits-Menü' wird halt die Maschine bedient.
Hatte selber beim Spielen damit Probleme bei der Unterscheidung langer/kurzer Druck auf einen Drehencoder (Durchscrollen per Drehrad, Auswählen/Abbrechen durch Druck/langen Druck - Letzteres wollte nicht, hatte Das dann abgebrochen und noch nicht wieder aufgenommen).

MfG

Danke für die Rückmeldung.

Wollte jetzt den Code neu aufspielen und bekomme die Fehlermeldung, dass der Sketch nicht kompiliert werden kann. ????

Was kann hier das Problem sein?

@ Angemerkt sei auf einem anderen PC

Danke

Hannes1:
Wollte jetzt den Code neu aufspielen und bekomme die Fehlermeldung, dass der Sketch nicht kompiliert werden kann. ???

Was kann hier das Problem sein?

Welches Problem.
Das können wir nicht sehen.

Also solltest du uns die Fehlermeldung posten.

Setze die bitte in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.

Damit wird diese für alle besser lesbar, auch mobile Geräte.

Arduino: 1.8.6 Hourly Build 2018/01/03 03:33 (Windows 10), Board: "Arduino/Genuino Uno"

C:\Users\User\Dropbox\LCD_Servo_Poti_Code\LCD_Servo_Poti_Code.ino:2:32: fatal error: LiquidCrystal_I2C.h: No such file or directory

  #include <LiquidCrystal_I2C.h>

                                ^

compilation terminated.

exit status 1
Fehler beim Kompilieren für das Board Arduino/Genuino Uno.

Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.

Er findet die Datei LiquidCrystal_I2C.h aus der Bibliothek LiquidCrystal_I2C nicht.
Die Lib ist entweder nicht oder falsch installiert.

Gruß Tommy

Und zusätzlich solltest die Einstellungen anpassen, so wie es am Ende der Meldung steht.

Hi

MAnches Mal ist Es wirklich so einfach, daß der Compiler Dir sagt, was Ihn stört - wie immer: in Englisch, damit muß man halt 'um können' - oder Google fragen.
Wobei 'No such file or directory' als Programmierer verstanden werden dürfte - die ganzen Programme bestehen nur aus englischem Zeug.

MfG

Danke für eure Unterstützung und entschuldigt, dass ich das nicht gleich gewusst habe. Am anderen PC hatte ich natürlich die Dateien noch nicht in “libraries” kopiert.

Soweit macht es nun den Anschein, dass die Ansteuerung (mit den min, max Werten muss ich noch etwas experimentieren) funktioniert.

Was ich noch nicht weiß, ist wie ich den Not Aus Schalter einbinden soll. Noch jemand einen Tipp für mich, wie ich meinen Code ergänzen muss?

Vielen Dank

Aktueller Code:

#include <Wire.h> 
 #include <LiquidCrystal_I2C.h>
 #include <Servo.h> 

 LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 20 chars and 4 line display
 Servo myservo;  // create servo object to control a servo 

 int potpin = 0;  // analog pin used to connect the potentiometer
 int val;    // variable to read the value from the analog pin 

 void setup()
 {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object  

    lcd.init();                      // initialize the lcd 
    lcd.backlight();
    lcd.setCursor(3,0);
    myservo.write(0);  // <------ put the servo at zero
    
  }

  void loop() 
  {
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023) 
  val = map(val, 0, 1023, -10, 160);     // scale it to use it with the servo (value between 0 and 180) 
  myservo.write(val);                  // sets the servo position according to the scaled value 
  lcd.setCursor(0,0);
  lcd.print("Wuchtmaschine");
  lcd.setCursor(0,1);
  lcd.print("my name");
  lcd.setCursor(0,2);
  lcd.print("Balanceing Speed");
  lcd.setCursor(0,3);
  lcd.print("Prozent");
  lcd.setCursor(13,3);
  lcd.print("%");
  lcd.setCursor(10,3);
  lcd.print("   ");  // This covers up the previous value
  lcd.setCursor(9,3);
  lcd.print(val);
  delay(15);                           // waits for the servo to get there 
  }

Und was genau soll der Not-Aus-Schalter bewirken ?

Motor Aus

Hi

Mit delay() im Code schon Mal gar nicht - oder Du kannst eben darauf warten, daß der Arduino, nach dem Schläfchen, endlich den Motor abschaltet.

Du musst sicherstellen, daß Deine Not-Aus-Abfrage JEDERZEIT statt findet wird - also in jedem loop()-Durchlauf und Dieser muß möglichst schnell erfolgen - also wieder: kein delay(), keine while-Schleifen, Die auf irgend ein Ereignis warten.
millis() und 'blink without delay' ist Dein Freund.

Dann 'Motor aus' ist ein großes Wort - was macht der BLDC-Treiber, wenn man Ihm bei voller Drehzahl den Saft abklemmt, die Rotormasse den Motor aber die nächsten Sekunden zum Generator macht?
Man kann auch die Welle aktiv bremsen (in 'the wild' sind Bremsen meist stromlos aktiv, macht so ja auch Sinn) - hier könnte man einen Stromausfall als 'äußerst unwahrscheinlich' deklarieren und davon ausgehen, daß wir für eine aktiv bremsende Bremse jederzeit Strom über haben - hier müsste drauf geachtet werden, daß die Bremse die Bremsdauer überlebt (könnte, auch 100% ED werden, wenn die Maschine so verlassen wird).

Über welche Massen, welche potentielle 'Gefahr' reden wir?

MfG

Ein echtes Notaus sollte nicht über den Prozessor laufen, sondern außerhalb die Energieversorgung unterbrechen (z.B. Selbsthaltung unterbrechen).

Gruß Tommy

Muss kein echtes Not Aus werden. Es besteht grundsätzlich keine Gefahr. Am Motor ist nur eine Riemenscheibe dran und ein Keilriemen gespannt. Sollte eher als Hauptschalter fungieren. Bremse am Regler ist deaktiviert. Das heißt bei Signal 0 läuft er einfach aus.

Wo ich ebenfalls noch nicht dahinter gekommen bin ist die Einstellung der Werte.

val = map(val, 0, 1023, -10, 160); // scale it to use it with the servo (value between 0 and 180)

Kann herumstellen was ich will, der Motor läuft bei ca. 30 an und endet bei ca. 60
Schön wäre halt 0 und 100
Was könnte es da noch für Problem geben?

Vielen Dank an euch .....

Hi

Was stellst Du wo herum?
Auch scheint mir der Wert -10 für ein Servo zumindest ungewöhnlich.
Den Wert würde ich deckeln wollen (kA, ob Das die Servo-Lib von sich aus bereits macht).

Hast Du Mal geschaut, was vom Arduino ausgegeben wird? (Oszi)
Vll. ist ja auch Dein Treiber nur 'schwer von Begriff' und verallgemeinert die von Dir explizit aufgefecherten Werte einfach wieder.

MfG