• Herzlich willkommen!

    Das Team von »Doctor Brick« heißt Euch herzlich willkommen und wünscht Euch viel Spaß hier!
    »Doctor Brick« ist eine anerkannte Community (RLOC) für erwachsene LEGO Enthusiasten, auch AFOLs (= Adult Fans Of LEGO) genannt.
    Wir können uns hier über alle Belange des LEGO Hobbys austauschen wie z.B. Set- und Teilefragen, Vorstellung und Rezensionen von Legobauten.
    Bitte beachtet die Nutzungsbedingungen und den Verhaltensleitfaden.

[WIP] PU-Fernsteuerung ohne Smartphone

RR76

Urgestein
Registriert
8 Apr. 2019
Beiträge
1.147
Bevor der PU-Thread zu unübersichtlich wird will ich in einem eigenen Thread auf die Entwicklung einer Fernsteuerung für PU eingehen.

Idee des ganzen ist, ein Gamepad so zu programmieren dass man mehrere PU-Hubs damit verbinden kann und die Belegung der Tasten möglichst frei programmieren kann, ähnlich BC2, nur eben ohne ein Smartphone als "Vermittler".

Meine bisherigen Versuche basieren auf einem esp32 und der legoino Library, die .
Die gewünschten Bilder zur Hardware zeige ich wenn ich etwas ansehnliches fertig habe, das derzeitige Gebrate ist nicht vorzeigbar.
Die Potis für die ersten Versuche stammen aus einem ausgeschlachteten Gamepad. Leider ist es nichts besonders hochwertiges, und ein PS4-Gamepad auszuschlachten bin ich aber zu geizig.
Vielleicht hat ja jemand eine Idee, welches Gamepad man verwenden kann. Wichtig ist eigentlich nur dass darin genug Platz für esp32 und einen Akku ist.

Die von @Ruppie vorgeschlagene Kombination aus https://www.dfrobot.com/product-858.html und https://www.crowdsupply.com/macchina/superb gefällt mir gut, ist aber auch nicht gerade geschenkt.

Aktueller Stand ist dass ich die Legoino-Library um eine eigene Klasse für den Technic-Hub ergänzt habe, die auch eine absolute Positionierung von L- und XL-Motoren zulässt.

Code:
/*
 * TechnicHub.h - Arduino Library for controlling Technic hubs
 *
 * (c) Copyright 2019 - Cornelius Munz
 * Released under MIT License
 *
*/

#ifndef TechnicHub_h
#define TechnicHub_h

#include "Arduino.h"
#include "BLEDevice.h"
#include "Lpf2Hub.h"

class TechnicHub : public Lpf2Hub
{
public:
    //Port definitions specific to Technic Hubs
  enum Port
  {
    A = 0x00,
    B = 0x01,
    AB = 0x10,
    C = 0x02,
    D = 0x03,
    TILT = 0x3A,
    CURRENT = 0x3B,
    VOLTAGE = 0x3C
  };

  //Constructor
  TechnicHub();

  //Basic Hub methods
  void requestSensorValue();
  void setInputFormatSingle();

  //Basic Motor methods
  void setAccelerationProfile(Port port, int16_t time, int8_t profileNumber);
  void setDecelerationProfile(Port port, int16_t time, int8_t profileNumber);
  void stopMotor(Port port);
  void setMotorSpeed(Port port, int speed);
  void setMotorSpeedForTime(Port port, int speed, int16_t time);
  void setMotorSpeedForDegrees(Port port, int speed, int32_t degrees);
  void setMotorSpeedsForDegrees(int speedLeft, int speedRight, int32_t degrees);
  void GotoAbsolutePosition(int32_t degrees_absolut, int speed, int power, int EndState, int UseProfile, Port port); // Output Command 0x81 - Sub Command 0x0D
  void PresetEncoder(int32_t degrees); // Output Command 0x81 - Sub Command N/A
  void PresetEncoder(int32_t degrees_left, int32_t degrees_right); // Output Command 0x81 - Sub Command 0x14
};

#endif

Code:
/*
 * TechnicHub.cpp - Arduino Library for controlling Technic hubs
 *
 * (c) Copyright 2019 - Cornelius Munz
 * Released under MIT License
 *
*/

#include "TechnicHub.h"

TechnicHub::TechnicHub(){};

/**
 * @brief Set the motor speed on a defined port.
 * @param [in] port Port of the Hub on which the speed of the motor will set (A, B, AB)
 * @param [in] speed Speed of the Motor -100..0..100 negative values will reverse the rotation
 */
void TechnicHub::setMotorSpeed(Port port, int speed)
{
    byte setMotorCommand[8] = {0x81, port, 0x11, 0x01, MapSpeed(speed), 0x64, 0x7f, 0x03}; //boost
    WriteValue(setMotorCommand, 8);
}

/**
 * @brief Set the acceleration profile
 * @param [in] port Port of the Hub on which the speed of the motor will set (A, B, AB)
 * @param [in] time Time value in ms of the acceleration from 0-100% speed/Power
 * @param [in] profileNumber Number for which the acceleration profile is stored
 */
void TechnicHub::setAccelerationProfile(Port port, int16_t time, int8_t profileNumber)
{
    byte *timeBytes = Int16ToByteArray(time);
    byte setMotorCommand[7] = {0x81, port, 0x10, 0x05, timeBytes[0], timeBytes[1], profileNumber};
    WriteValue(setMotorCommand, 7);
}

/**
 * @brief Set the deceleration profile
 * @param [in] port Port of the Hub on which the speed of the motor will set (A, B, AB)
 * @param [in] time Time value in ms of the deceleration from 100-0% speed/Power
 * @param [in] profileNumber Number for which the deceleration profile is stored
 */
void TechnicHub::setDecelerationProfile(Port port, int16_t time, int8_t profileNumber)
{
    byte *timeBytes = Int16ToByteArray(time);
    byte setMotorCommand[7] = {0x81, port, 0x10, 0x06, timeBytes[0], timeBytes[1], profileNumber};
    WriteValue(setMotorCommand, 7);
}

/**
 * @brief Set the motor speed on a defined port.
 * @param [in] port Port of the Hub on which the speed of the motor will set (A, B, AB)
 * @param [in] speed Speed of the Motor -100..0..100 negative values will reverse the rotation
 * @param [in] time Time in miliseconds for running the motor on the desired speed
 */
void TechnicHub::setMotorSpeedForTime(Port port, int speed, int16_t time = 0)
{
    //max power 100 (0x64)
    //End state Brake (127)
    //Use acc and dec profile (0x03 last two bits set)
    byte *timeBytes = Int16ToByteArray(time);
    byte setMotorCommand[10] = {0x81, port, 0x11, 0x09, timeBytes[0], timeBytes[1], MapSpeed(speed), 0x64, 0x7F, 0x03}; //boost with time
    WriteValue(setMotorCommand, 10);
}

/**
 * @brief Set the motor speed on a defined port.
 * @param [in] port Port of the Hub on which the speed of the motor will set (A, B, AB)
 * @param [in] speed Speed of the Motor -100..0..100 negative values will reverse the rotation
 * @param [in] time Time in miliseconds for running the motor on the desired speed
 */
void TechnicHub::setMotorSpeedForDegrees(Port port, int speed, int32_t degrees)
{
    byte *degreeBytes = Int32ToByteArray(degrees);
    //max power 100 (0x64)
    //End state Brake (127)
    //Use acc and dec profile (0x03 last two bits set)
    byte setMotorCommand[12] = {0x81, port, 0x11, 0x0B, degreeBytes[0], degreeBytes[1], degreeBytes[2], degreeBytes[3], MapSpeed(speed), 0x64, 0x7F, 0x03}; //boost with time
    WriteValue(setMotorCommand, 12);
}

void TechnicHub::setMotorSpeedsForDegrees(int speedLeft, int speedRight, int32_t degrees)
{
    byte *degreeBytes = Int32ToByteArray(degrees);
    Port port = AB;
    //both ports A and B
    //max power 100 (0x64)
    //End state Brake (127)
    //Use acc and dec profile (0x03 last two bits set)
    byte setMotorCommand[13] = {0x81, port, 0x11, 0x0C, degreeBytes[0], degreeBytes[1], degreeBytes[2], degreeBytes[3], MapSpeed(speedLeft), MapSpeed(speedRight), 0x64, 0x7F, 0x03}; //boost with time
    WriteValue(setMotorCommand, 13);
}

void TechnicHub::GotoAbsolutePosition(int32_t degrees_absolut, int speed, int power, int EndState, int UseProfile, Port port) // Output Command 0x81 - Sub Command 0x0D
{
    byte *degreeBytes = Int32ToByteArray(degrees_absolut);
    //both ports A and B
    //max power 100 (0x64)
    //End state Brake (127)
    //Use acc and dec profile (0x03 last two bits set)
    byte setMotorCommand[13] = {0x81, port, 0x11, 0x0D, degreeBytes[0], degreeBytes[1], degreeBytes[2], degreeBytes[3], speed, 0x64, 0x7F, 0x03}; //100%, 127 (Brake)
    WriteValue(setMotorCommand, 12);
}

void TechnicHub::requestSensorValue()
{
    byte requestPortValue[3] = {0x21, 0x01, 0x00};
    WriteValue(requestPortValue, 3);
}

void TechnicHub::setInputFormatSingle(){
    //byte inputFormatValue[8] = {0x41, 0x01, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01}; //color and distance on port C (1)
    byte inputFormatValue[8] = {0x41, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01}; //boost tacho motor on port C (1)
    WriteValue(inputFormatValue, 8);
}

/**
 * @brief Stop the motor on a defined port. If no port is set, all motors (AB) will be stopped
 * @param [in] port Port of the Hub on which the motor will be stopped (A, B, AB, C, D)
 */
void TechnicHub::stopMotor(Port port = AB)
{
    setMotorSpeed(port, 0);
}

Für erste Tests habe ich ein paar Zeilen geschrieben, um den 42099 mit dem Gamepad zu steuern.

Code:
/**
Gamepad für 42099
Mittlerer Anschluss Poti links X-Achse an Pin 32 des esp32
Mittlerer Anschluss Poti rechts Y-Achse an Pin 35 des esp32
Äußere Anschlüsse der Potis an 3V und GND
Buttons an Masse und Pin 12 / 14 des esp32
Antriebsmotoren an Technic-Hub Port A und B
Servo-Motor an Technic-Hub Port C
*/

#include "TechnicHub.h"

// create a hub instance
TechnicHub myTechnicHub;
TechnicHub::Port _portA = TechnicHub::Port::A;
TechnicHub::Port _portB = TechnicHub::Port::B;
TechnicHub::Port _portC = TechnicHub::Port::C;
TechnicHub::Port _portD = TechnicHub::Port::D;

const int Poti_L_X = 32;
const int Poti_L_Y = 33;
const int Poti_R_X = 34;
const int Poti_R_Y = 35;
const int Button_L = 12;
const int Button_R = 14;
int Poti_LX = 1950;
int Poti_LY = 1950;
int Poti_RX = 1950;
int Poti_RY = 1950;

void setup() {
  Serial.begin(115200);
  myTechnicHub.init(); // initalize the TechnicHub instance
  pinMode(Button_L, INPUT_PULLUP);
  pinMode(Button_R, INPUT_PULLUP);
}


// main loop
void loop() {

  // connect flow. Search for BLE services and try to connect if the uuid of the hub is found
  if (myTechnicHub.isConnecting()) {
    myTechnicHub.connectHub();
    if (myTechnicHub.isConnected()) {
      Serial.println("Connected to HUB");
      // connect color/distance sensor to port c, activate sensor for updates
      //      myTechnicHub.activatePortDevice(_portA, 37); // BOOST_DISTANCE = 37
      // connect boost tacho motor  to port d, activate sensor for updates
      //      myTechnicHub.activatePortDevice(_portB, 38); // BOOST_TACHO_MOTOR = 38
      myTechnicHub.activatePortDevice(_portA, 38); // BOOST_TACHO_MOTOR = 38
      myTechnicHub.setLedColor(GREEN);
    } else {
      Serial.println("Failed to connect to HUB");
    }
  }

  // if connected, you can set the name of the hub, the led color and shut it down
  if (myTechnicHub.isConnected()) {
    int rotation;
    delay(100);

    // read rotation value in degrees of the boost tacho motor
    rotation = myTechnicHub.getTachoMotorRotation();
    Serial.print("rotation - ");
    Serial.println(rotation);
    Serial.print("Poti_L_X - ");
    Serial.println(digitalRead(Poti_L_X));
    Serial.print("Poti_L_Y - ");
    Serial.println(digitalRead(Poti_L_Y));
    Serial.print("Poti_R_X - ");
    Serial.println(digitalRead(Poti_R_X));
    Serial.print("Poti_R_Y - ");
    Serial.println(digitalRead(Poti_R_Y));
    Serial.print("Button_L - ");
    Serial.println(digitalRead(Button_L));
    Serial.print("Button_R - ");
    Serial.println(digitalRead(Button_R));

    // set hub LED color dependent on the absolute angle of the rotation (mapping from angle to rainbow color)
    //    myTechnicHub.setLedHSVColor(abs(rotation), 1.0, 1.0);

    // Links X ist Geber für Antriebsmotor A + B
    Poti_LX = analogRead(Poti_L_X);
    //Serial.println(Poti_LX);
    if (Poti_LX < 2000 && Poti_LX > 1900)
    {
      myTechnicHub.stopMotor(_portA);
      myTechnicHub.stopMotor(_portB);
    }
    else if (Poti_RX > 2000)
    {
      myTechnicHub.setMotorSpeed(_portA, (Poti_RX - 2100) / 21);
      myTechnicHub.setMotorSpeed(_portB, (Poti_RX - 2100) / 21);
    }
    else if (Poti_RX < 1900)
    {
      myTechnicHub.setMotorSpeed(_portA, (Poti_RX - 1900) / 19);
      myTechnicHub.setMotorSpeed(_portB, (Poti_RX - 1900) / 19);
    }


    // Rechts Y ist Geber für Lenkung an Port C
    Poti_RY = analogRead(Poti_R_Y);
    if (Poti_RY < 2000 && Poti_RY > 1900)
    {
      myTechnicHub.GotoAbsolutePosition(0, 100, 50, 127, 0, _portC);
    }
    else if (Poti_RY > 2000)
    {
      myTechnicHub.GotoAbsolutePosition((Poti_RY - 2000) / 20, 100, 50, 127, 0, _portC);
    }
    else if (Poti_RY < 1900)
    {
      myTechnicHub.GotoAbsolutePosition((Poti_RY - 1900) / 19, 100, 50, 127, 0, _portC);
    }


    /*
      // Funktioniert nicht, Motor fährt auch bei halber Entfernung immer über das Ziel hinaus.
      if (rotation > 0)
      {
      myTechnicHub.setMotorSpeedForDegrees(_portA, -50, (rotation/2));
      }
      else
      {
      myTechnicHub.setMotorSpeedForDegrees(_portA, 50, (rotation/2));
      }
    */


  }

} // End of loop

Der Code ist von einigem Müll bereigt damit er halbwegs lesbar ist, seitdem aber nicht mehr getestet da ich angefangen habe, das Gamepad zu bauen und gerade keinen Prototyp zur Verfügung habe.
Und ja, sauberer Code sieht bestimmt anders aus, ich pfusche mich da halt so halbwegs mit meinen schlechten Programmierkenntnissen durch :D

Was mir nicht gefällt ist dass der L-Motor als Servo viel zittert, das scheint mit der C+-App besser zu sein.

Und für @gatewalker noch ein Testprogramm für den Trailer:

Code:
/**
Synchronisation zwischen Motoren an Port A und B
Port B fährt die Position von Port A an
*/

#include "TechnicHub.h"

// create a hub instance
TechnicHub myTechnicHub;
TechnicHub::Port _portA = TechnicHub::Port::A;
TechnicHub::Port _portB = TechnicHub::Port::B;
TechnicHub::Port _portC = TechnicHub::Port::C;
TechnicHub::Port _portD = TechnicHub::Port::D;

const int Poti_L_X = 32;
const int Poti_L_Y = 33;
const int Poti_R_X = 34;
const int Poti_R_Y = 35;
const int Button_L = 33;
const int Button_R = 33;
int Poti_LX = 1950;
int Poti_LY = 1950;
int Poti_RX = 1950;
int Poti_RY = 1950;

void setup() {
  Serial.begin(115200);
  myTechnicHub.init(); // initalize the TechnicHub instance
  pinMode(Button_L, INPUT_PULLUP);
  pinMode(Button_R, INPUT_PULLUP);
}


// main loop
void loop() {

  // connect flow. Search for BLE services and try to connect if the uuid of the hub is found
  if (myTechnicHub.isConnecting()) {
    myTechnicHub.connectHub();
    if (myTechnicHub.isConnected()) {
      Serial.println("Connected to HUB");
      // connect color/distance sensor to port c, activate sensor for updates
      //      myTechnicHub.activatePortDevice(_portA, 37); // BOOST_DISTANCE = 37
      // connect boost tacho motor  to port d, activate sensor for updates
      //      myTechnicHub.activatePortDevice(_portD, 38); // BOOST_TACHO_MOTOR = 38
      myTechnicHub.activatePortDevice(_portA, 38); // Port A liest Position aus
      myTechnicHub.setLedColor(GREEN);
    } else {
      Serial.println("Failed to connect to HUB");
    }
  }

  // if connected, you can set the name of the hub, the led color and shut it down
  if (myTechnicHub.isConnected()) {
    delay(100);
    int rotation = myTechnicHub.getTachoMotorRotation();
    Serial.println(rotation);
    myTechnicHub.GotoAbsolutePosition(rotation, 100, 50, 127, 0, _portB); // PortB fährt Position von PortA an
  }

} // End of loop

Port B fährt immer die Position von Port A an. Weniger als 1/10 Sekunde zwischen zwei Messungen führen leider zu wildem Hin- und Herfahren des Motors an Port B, diese Verzögerung ist also das Minimum.
Auch hier stört das Zittern.

Bevor ich jetzt zu große Hoffnungen wecke: Bis etwas wirklich nutzbares fertig ist wird es noch eine Zeitlang dauern und ich bin auch nicht in der Lage, so schnellen und guten Support zu leisten wie es z.B. der Entwickler von BC2 schafft. In erster Linie bastle ich hier an einem Gamepad für mich, werde aber wenn möglich auch Eure Ideen mit einbringen und Euch den Code zur Verfügung stellen. Mithilfe ist natürlich auch gerne gesehen.

Hier auch gleich die erste Frage: Wie würdet Ihr Euch die Programmierung vorstellen?
Für mich kann ich die verschiedenen Modelle am einfachsten fest im Code hinterlegen, aber eine freie Programmierbarkeit ohne den Quellcode zu ändern wäre schöner.

Eine Idee ist, eine SD-Karte mit Text-Dateien zu beschreiben, die Hubs und deren Ports mit Tasten am Gamepad verbinden.

Eine andere Idee wäre, über Tastenkombinationen Hubs anzulernen. Das kommt ohne PC aus, ist aber aufwändiger und wenn mehr als nur Vorwärts/Rückwärts programmiert werden soll auch ziemlich unkomfortabel.

Die meisten Gamepads haben vier LEDs, die würde ich als Statusanzeige nutzen und auch vier Modelle hinterlegen, die dann beim Einschalten ausgewählt werden können.

Und jetzt bin ich auf Meinungen und Ideen gespannt.

Gruß
Patrick
 
Zuletzt bearbeitet:

RR76

Urgestein
Registriert
8 Apr. 2019
Beiträge
1.147
Autsch, da hätte ich wohl nach dem Posten nochmal reinschauen sollen.
Danke für den Hinweis.

CODE war mir zu groß, dass SPOILER plötzlich Smileys produziert war mir nicht klar, wieder was gelernt ...

Ich hab's geändert, jetzt gibt's CODE innerhalb von SPOILER, dann kann man auch etwas damit anfangen.
 
Zuletzt bearbeitet:

Lok24

Elektronikbahner
Registriert
11 Sep. 2019
Beiträge
1.451
Hallo Patrick,

tolle Sache, leider Lichtjahre von meinen Fähigkeinten entfent.
trotzdem zwei Fragen:

Was ist das für eine Programmiersprache?
Was sind Dateien vom Typ .h und was solche vom Typ .cpp?

Vielen Dank, ich werde sehr interessiert hier weiterlesen.
Ich brauche also erstmal Tips zur Hardware.

Hier auch gleich die erste Frage: Wie würdet Ihr Euch die Programmierung vorstellen?
Für mich kann ich die verschiedenen Modelle am einfachsten fest im Code hinterlegen, aber eine freie Programmierbarkeit ohne den Quellcode zu ändern wäre schöner.
Eine Idee ist, eine SD-Karte mit Text-Dateien zu beschreiben, die Hubs und deren Ports mit Tasten am Gamepad verbinden.
Jein. Du musst unten anfangen, und das ist Deine txt-Datei, ein Profil für ein bestimmtes Bediengerät für ein bestimmtes Modell.

Beispiele hatte ich doch mit Marc / @Ruppie schon mal iregndwo abgelegt?
So wie kommmt die jetzt in dein Bedienteil? Via WLAN / BT / Kabel / Karte?

Und dann die "oberste" Frage: wie werden die erstellt?
Im einfachsten Fall mit einem texteditor, im besten Fall z.B. mit einer grafischen App.
Aber die könnte auch jemand anders liefern.

Du gibst nur das Format der Profil-Datei vor.

Die Frage ist welchen Sinn das alles macht und wo der Bedarf ist.
Da gehen die Meinungen offenbar weit auseinander.
 

GBCPeter

Herr der Bälle
Teammitglied
Registriert
21 Apr. 2012
Beiträge
3.404
Ort
Wuppertal
Hallo Werner
die Programmiersprache ist C++ und die Dateiendungen sind .cpp ist die Datei zum Compilieren und .h ist eine Bibliothek die gebraucht wird beim Compilieren z.b. für Funktionen oder Übersetzungen ( Kennst du bestimmt als Module in Py). Die Dateiendung .ino sagt das das Programm mit der Arduino IDE erstellt wurde, falls du probieren möchtest. Die IDE ist kostenlos unter Arduino.cc zu finden.

mfg GBCPeter
 

Lok24

Elektronikbahner
Registriert
11 Sep. 2019
Beiträge
1.451
Hallo Peter,

vielen Dank, das macht es etwas klarer.
Ich muss sehen dass ich mal ein "Hello World"-Programm finde.

Aber was soll ich damit wenn ich keine HW habe?
Da schließt sich der Kreis.....(mm)
 

RR76

Urgestein
Registriert
8 Apr. 2019
Beiträge
1.147
Beispiele findest Du in der Arduino Entwicklungsumgebung, die sind auch recht gut kommentiert.

Für fast alles reicht es auch aus, Dich mit den .ino Dateien zu beschäftigen, die h und cpp bekommst Du normalerweise nichtmal zu sehen, hier müsstest Du sie ausnahmsweise in einen Library-Ordner kopieren weil ich noch keine neue Library zusammengestellt habe.

Gerade für Züge fände ich einen eigenen Controller sehr interessant weil Du mit wenig Aufwand mehrere Züge mit je drei Tasten steuern könntest - und für Zusatzfunktionen baust Du halt so viele Tasten ein wie Du willst. Und wenn man löten kann kostet die Hardware weniger als eine Zug-Fernsteuerung.
 

Lok24

Elektronikbahner
Registriert
11 Sep. 2019
Beiträge
1.451
Vielen Dank!

Gerade für Züge fände ich einen eigenen Controller sehr interessant weil Du mit wenig Aufwand mehrere Züge mit je drei Tasten steuern könntest - und für Zusatzfunktionen baust Du halt so viele Tasten ein wie Du willst. Und wenn man löten kann kostet die Hardware weniger als eine Zug-Fernsteuerung.

Eben genau nicht, leider. Wenn ich dann mit der Box neben der Lok her laufe verlieren die andern irgenwann die Connection.
Also eher ein Box por Lok, feste MAC Adresse. Das hat der Entwickler mir auf meinen Wunsch in wenigen Stunden drangestrickt.

Am Löten soll's nicht mangeln.
 

RR76

Urgestein
Registriert
8 Apr. 2019
Beiträge
1.147
Mit zu wenig Reichweite hätte ich nicht gerechnet, ich hätte eher vermutet dass eine zentral stehende Box dafür geeignet wäre.
 

Lok24

Elektronikbahner
Registriert
11 Sep. 2019
Beiträge
1.451
Mit zu wenig Reichweite hätte ich nicht gerechnet, ich hätte eher vermutet dass eine zentral stehende Box dafür geeignet wäre.
Es kommt drauf an was Du machen willst, wie immer im Leben (mm)
Selbst wenn die Reichweite langt: Eine Lok ohne Sicht auf die Strecke fahren ist nur bei Kreisverkehr halbwegs sinnvoll.
Also habe ich die Box bei mir.
Die andern zwei Loks stehen im Bahnhof im Weg. Wer bekommt die jetzt wie da weg?
M.a.W.: Nicht immer fährt nur eine Lok.

Wenn Die Boxen so preiswert sind (sind sie) schadet ja auch eine pro Lok nicht.
 

Lok24

Elektronikbahner
Registriert
11 Sep. 2019
Beiträge
1.451
Hallo,

ergänzend zu dem was ich schrieb und Deiner Frage nach der Konfiguration:

Ich wollte sowas probieren:
Ich erstelle in der Entwicklungsumgebung eine Datei, die nur aus Kommentar besteht und immer xxx.ini heißt
Da kann ich meine Konfiguration eingeben.

Also so:
Code:
/*
MAC 00-80-41-ae-fd-7e
Port A
Type  ON
IO 4
*/
Das soll sich dann mit der MAC Adresse verbinden und bei Signal an Pin 4 den Motor an Port A starten.

D.h. mein Hauptprogramm muss eine festgelegte Datei öfnnet, als Text lesen, die Werte interpretieren und dann dem Objekt "HUB" passend zuordnen.
Mit type ONOFF könnte der Motor z.B. toggeln.
Hat das Aussicht zu funktionieren?
 

RR76

Urgestein
Registriert
8 Apr. 2019
Beiträge
1.147
Da hab ich wohl eine falsche Vorstellung von Euren Anlagen, da muss ich bei der nächsten Ausstellung besser hinschauen.

So ähnlich hatte ich mir das mit der ini auch vorgestellt, aber als einfache Textdatei, die jeder in Notepad etc. bearbeiten kann und die dann auf eine SD-Karte gespeichert wird.
Dafür braucht man dann zwar einen PC oder ein Smartphone aber es ist komfortabler und einfacher zu programmieren als alles über das Gamepad zu programmieren.
Ohne SD-Karte ist noch einfacher zu entwickeln, aber man ist dann von der Programmierumgebung abhängig.
 

Lok24

Elektronikbahner
Registriert
11 Sep. 2019
Beiträge
1.451
Da hab ich wohl eine falsche Vorstellung von Euren Anlagen, da muss ich bei der nächsten Ausstellung besser hinschauen.
Es gibt solche und solche, die letzte wo ich war war ein komplettes Straßenbahn-Depot voll....
Aber da hatte ich genau die "umschaltbare" FB mit. Ist auch egal, das sind ja Kleinigkeiten.

Ohne SD-Karte ist noch einfacher zu entwickeln, aber man ist dann von der Programmierumgebung abhängig.
Stimmt, habe ich übersehen.
Aber warum kann ich die Datei nicht z.B. via WLAN oder BT übertragen?
 

Lok24

Elektronikbahner
Registriert
11 Sep. 2019
Beiträge
1.451
Hum.
ich hatte hier gelesen:
https://www.makershop.de/plattformen/arduino/nodemcu-cp2102/
"mit wenigen Zeilen im WLAN", hatte gehofft da gibt es nix zu programmiern.
Aber ich kenn mich damit 0 aus. Leider.

Wie bekommt denn jemand ohne Progrmmierumgebung das Programm da drauf? Auch via Karte?
Sorry, sind wahrscheinlich viele dumme Fragen, aber ich habe nur einen Raspberry hier, der hat eine grafische Oberfläche für Dummies wie mich.
 

Ruppie

Mitglied
Registriert
9 März 2020
Beiträge
161
Ort
Duisburg
Hallo,

1. Prima Idee
2. @Werner "Beispiele hatte ich doch mit Marc / @Ruppie schon mal iregndwo abgelegt?"

Nö: Wir hatten im Rahmen meiner FB für "Autos" mal darüber nachgedacht. Ich hatte mich zunächst mal dagegen ausgesprochen. War mir für einfache Auto's zu viel ;-)


"Was mir nicht gefällt ist dass der L-Motor als Servo viel zittert, das scheint mit der C+-App besser zu sein."
"Die Potis für die ersten Versuche stammen aus einem ausgeschlachteten Gamepad. Leider ist es nichts besonders hochwertiges".

Das grundlegende Problem der kleinen Joysticks ist zunächst mal der kleine Hebelweg.
Oder anders:

Ich habe gerade nachgemessen: Mindestens an meinen "Basteljosticks" ist der Wiederstand am Joytsick offenbar nicht linear.
https://eckstein-shop.de/JoyStick-B...MI6-z-uPm_6AIVDE8YCh0XbgdVEAQYAyABEgLt8fD_BwE


Das kann Fluch und Segen sein,zu betrachten wäre nochmal der Werte verlauf des AD Wandlers.
Vielleicht hat sich aber auch damit die Notwendigkeit eine "Expotentialfunktion" zu entwerfen erledigt:

Warum: Durch den kleinen Hebelweg ist es etwa schwierig einen Gashebelweg von 0-100% Leistung vernünftig umzusetzen.
Die Frage lautet, wieviele Gasstufen man hier einbauen kann die der Anwender spürbar auch kontrollieren kann.

Meisst hat man hier eine "Gaskurve" welche im unteren Bereich einen geweissen "Boost" bewirkt.

Anderer Punkt, insbesondere Lenkung: Ist zunächst mal das gleiche Problem: Welche kleinen Hebelauslenkungen, sollen /müssen am Modell welchen Lenkeingriff haben ....
Ist das gleiche Thema wie bei Gaskontrolle ....

Ansonsten:
Es ist nicht vernünftig den AD Wert roh zu verwenden, Massnahmen zur Beruigung des Messwertes sind praktisch, gibt schon genaug Beispiel in den Foren.


Ausserdem gilt: Welche Änderung des A/D Wertes hat welche Auslenkungsänderungen in° zur Folge, manchmal sind hier "Schwellen" / Totzonen zweckmässig.
Damit wird der Servomotor zumindest nicht dauernd umgeschaltet im Zweifel für Winkeländerungen (Toleranz im Beispiel +-3°) welche er ohnedies nicht erreichen kann.
Es ist auch zu beachten, das bei der Lenkung im Modell immer auch Widerstände und Trägheiten zu überwinden sind.

Oder Anders: Der Unterschied zwischen Theorie und Praxis ;-)



Gruß






Wüsste I
 

RR76

Urgestein
Registriert
8 Apr. 2019
Beiträge
1.147
Sehr gute Argumente auf die ich später bestimmt zurückkommen werde, aber so weit bin ich noch lange nicht.

Das Zittern kommt auch bei meinem Testprogramm für @gatewalker und da nutze ich den Stick nicht. Auch die Mittelstellung am Stick habe ich für die ersten Tests sehr großzügig ausgelegt, die steht stabil bei 0, dafür ist der nutzbare Weg noch kleiner. Ich lasse mir auf der Konsole die Werte ausgeben und selbst wenn da dauerhaft der selbe Wert steht zittert der Motor teilweise mehrere Sekunden.

Was den Weg des Sticks angeht wäre mir eine große Modellflug-Fernsteuerung am liebsten, aber die haben halt andere Nachteile.
 

Ruppie

Mitglied
Registriert
9 März 2020
Beiträge
161
Ort
Duisburg
Hallo,
zum Thema Hilfe bei der realen Umsetzung, im Zweifel auch Entwicklung von Bausätzen zu LEGO FB

Vor längerer Zeit hatte ich mal Kontakt zur Zeitschrift "CT Make".
Der Chef Redakteur ist immer stark an Konzepten interessiert , welche einen Nutzen haben und was sich vielleicht in Bausatzform vermarkten ließe.
Ansprechpartner wäre: Herr Daniel Bachfeld: https://www.heise.de/make/impressum.html

Viel Erfolg:
 

tismabrick

Neumitglied
Registriert
31 Mai 2020
Beiträge
3
Hallo

Habe Ruppie‘s Beitrag auf zusammengebaut mit Hinweis nach hier gelesen.
Ich bin an einer „echten“ Fernbedienung ohne Smartphone interessiert.
Allerdings möchte ich nicht ein Evaluierungrozess bezüglich geeigneter Hardware machen.
Aber ich kann bei der Programmierung mithelfen (Windows, Visual Studio Code). Benötige allerdings Starthilfe.
 
Oben