4 x MCP23S17 über SPI ansteuern, wie erstelle ich einen Sketch hierfür

ist ein MCP23S17 (oder ein Shift-Register) überhaupt die Beste Wahl für "mehr" Stepper Ausgänge? Gäbe es nicht etwas das autark PWM macht? Irgendwas ähnlich pca9685 aber eventuell was anderes als I2C?

Auch wenn das hier keine 'echten' Stepper, sondern Servo Motore sind, denke ich schon, dass der ESP32 die Zahl der erzeugten Stepimpulse kontrollieren und kennen muss. Das ist bei einer autarken PWM-Schaltung kaum möglich. Es ist ja auch nicht PWM.
Aber wie gesagt, die kompletten Anforderungen, außer das es um hohe Stepfrequenzen geht, habe ich noch nicht gesehen - oder nicht verstanden. Es scheint ja um einen Flugsimulator mit realen Bewegungen zu gehen, was sich nach einer recht komplexen Anwendung anhört. Ist aber definitiv nicht meine Welt.

ich würde halt lieber einen schwarzen Käfer schicken wollen: pulse pin x n mal mit Dutycycle m als den ESP mit

ein aus ein aus ein aus ein aus ein aus ein aus ein aus ein aus ein aus ein aus ein aus ein aus ein aus ein aus ein aus ein aus ein aus ein aus ein aus ein aus ein aus ein aus ein aus ein aus

zu beschäftigen. Auch wenn der ESP dass zeitlich hinbekommt.

Hallo,

der 6 Channel-controller ist vom Flugsimulator der ja läuft (Esp32 mit 1X MCP23S17), der 4 Channel-Controller ist ein für einen Renn-Simulator, der läuft auch aber auf einem Mega2560. Beide erzeugen die benötigten Stepimpulse. Der 8 Kanal Controller ist für Rennsimulation mit erweiterten Umfang Motor M5 Surge, Motor M6 und M7 Traction Loss und Motor M8 für den Seatbelt Tensioner. Um das mit dem ESP32 hinzubkommen werden 4 X MCP23s17 genutzt. um die benötigten GPIO für die 8 Motoren zu haben. Diese sind ja soweit in der motor.h in Klassen und Instanzen definiert worden, es geht jetzt darum den Arduino Code ( STEP, DIR, etc.) von 4 auf 8 Kanäle zu erweitern was ich in der Controller.ino schon als Draft begonnen habe, hier fehlt nun das die Motor M1-M8 Klassen in die STEP,DIR,.... gemappt werden. Klingt einfach ist es aber nicht und man müsste noch die Timer definitionen die auf Arduino ausgelegt sind anpassen. Ich habe die E-Stop Funktion komplett als eigene Funktion erst einmal ausgelagert. Ich kann bei Fragen auch noch präzisere Angaben machen.

@agmue, @noiasca,@MicroBahner

ich habe mich mal hingesetzt um eine Formel für die max. Pulse zu berechnen.
Exemplarisch ist hierbei mal ein Hub von 100mm typisch sind 100mm 150mm, 200,300mm und 400mm.

wobei 100 und 150mm für die Motoren M1-M4 sind, 200, 300 und 400 mm M5, 300mm für M6 und M7. Für M8 ist eine 180 Grad rotation vorgesehen.

Das elektronishe Ratio PN98 ist hier mal als Beispiel mit 2 definiert, typischerweise wird meistens aber 20 benutzt.

ppr (pulse per rotation)

Linear Actuator:

Controller:AASD15A
Actuator Type: SFX 100
Stroke length: 100 mm
motor rpm: 1500 rpm typical, to 3000rpm max.

Encoder ppr (RIG.ppr) : 10000
Gearbox (RIG.mechanical.GearRatio_Servo)1:1
PN98 (RIG.electronic_GearRatio_Servo)= 2
Leadscrew length (RIG.leadscrew_length)= 100 mm
Leadscrew (RIG.leadscrew_pitch)= 5
Linear Safety (RIG.lin_act_safety)= 5 mm

Formula:
MaxPulse = RIG.ppr * RIG.mechanical.GearRatio_Servo/RIG.electronic_GearRatio_Servo * ((RIG.leadscrew_length - RIG.lin_act_safety * 2) / RIG.leadscrew_pitch)

MaxPulse = 10000 * 1/2 * ((100 -2 * 5) / 5) = 90000 pulses / 100 mm
resolution = 0.0011 mm

bei einem electronic Ratio von 20

MaxPulse = 10000 * 1/20 * ((100 -2 * 5) / 5) = 9000 pulses / 100 mm
resolution = 0,011 mm
bei einem electronic Ratio von 10

MaxPulse = 10000 * 1/10 * ((100 -2 * 5) / 5) = 18000 pulses / 100 mm
resolution = 0,0055 mm

Rotating Actuator:

Controller:AASD15A

Encoder ppr (RIG.ppr) : 10000
Gearbox (RIG.mechanical.GearRatio_Servo)1:50
PN98 (RIG.electronic_GearRatio_Servo)= 2
Range (RIG.Range=: 180 °

MaxPulse = RIG.ppr * RIG.mechanical.GearRatio_Servo/RIG.electronic_GearRatio_Servo/ (360 / RIG.Range);

MaxPulse = 10000 * 50/2 / (360/180)
resolution = 125000 positions per half round

Ich hoffe das man mit diesen Angaben nun besser mit dem MCP Anforderungen umgehen kann, d.h. die maximale Anzahl von PWM Impulsen liegt bei 90 k pulses pro 100 mm im typischen Betrieb zwichen 9-18k pro 100 mm pulses und 125k pulses für 180 Rotationsbewegung.

serial interface definitions:

speed: 250,000 baud
Databits: 8 bit
Stop bits:1
Parity: none

Actuator mode:

ist ein direct mode in diesem mode werden alle Actuatoren einzeln gesteuert.

ID: is byte values 0xFF + 0xFF
Each axis is 24 bit wide. (3byte)
LF + CR is required in the end (0x0A + 0x0D)

ID MOTOR1 MOTOR2 MOTOR3 MOTOR4 MOTOR5 MOTOR6 MOTOR7 MOTOR8 LF / CR

oder

ID AXIS1 AXIS2 AXIS3 AXIS4 AXIS5 AXIS6 AXIS7 AXIS8 LF / CR

Data format

2 start bytes
24 data bytes
<255> <255>
3 bytes (24bit) per channel / actuator 8 channels
2 stop bytes <10> <13>

Zunächst habe ich auf acht Stepper erweitert, was mit den ESP-Pins problemlos funktioniert. Bis zu drei MCP-STEP-Pins sind auch noch möglich, dann stürzt der ESP32 ab. Das ist weit entfernt vom Ziel, vermutlich zu weit.

@newbi71: Mit meinen Möglichkeiten bekomme ich die MobaTools für acht Stepper über MCP23s17 nicht zum Laufem. Mein Vorschlag führt wohl in eine Sackgasse, schade :flushed:

Es ist ja auch entscheidend, aufgrund welcher Vorgaben die Steps überhaupt erzeugt werden sollen. Und in welcher Form? Die MobaTools sind dafür gedacht, dass man einen Stepper positioniert, also ein Zielposition vorgibt. Ob das hier überhaupt so funktioniert habe ich noch nicht ersehen können. Da ist ja auch ganz anderes denkbar. Liegt alles noch im Unklaren.

Und für die Ansteuerung per MCP ist die Auflösung der Servos letztendlich nicht wesentlich, sondern die notwendige Pulsrate, die erreicht werden muss. Das hängt zwar sicher miteinander zusammen, aber für den ESP ist das egal, da ist nur die notwendige zu erreichende Pulsrate wichtig - und wer sie vorgibt. Was der Antrieb dann daraus macht betrifft den ESP nicht mehr.
Hier wird jetzt auch von PWM geredet - das wäre wieder was anderes. Ich komme da nicht mehr mit und verstehe auch die Abkürzungen nicht alle. Ist offensichtlich nicht meine Welt...

Hallo Microbahner,

also ich habe mehrere Controller generationen auf dem Tisch liegen die funktionieren,

1.) Arduino Leonardo -> 4 Channel Stepper board (HBS86H) , Typ: Linear Actuators

4Channel_controller_ HBS86H.ino (4,8 KB)

aus diesem ging dann der folgende Controller:

2.) Arduino Meg2560 -> 4 Channel AASD-15a, Typ: Linear Actuators

4-channel_controller_aasd-15a.ino (30,1 KB)

darauf folgte dann der

3.) Esp32 mit 1x MCP23S17-> 6 Channel AASD-15a , Typ: (Rotation Actuators)

6_kanal-Controller.zip (56,6 KB)

und die letzte Generation ist nun der 8 Kanal Controller

4.) Esp32 mit 4 MCP's -> 8 Kanal Controller,AASD-15a Typ: Linear Actuators

der das Problem Kind ist (Esp32, 4 MCP, 8 Channel, Typ linear Actuator).

Zusammenfassend:

  • auf Arduino funktionieren sowohl Stepper (HBS86H) als auch AC-Servo (AASD-15a) für Lineare Actuatoren.

  • auf ESP32 funktionert derzeit nur AC-Servo (AASD-15a) für Rotations Actuatoren.

Ziel ist:

  • Esp32 für AC-Servo (AASD-15a) und Lineare Actuatoren mit 8 Motoren

Ich hoffe nun etwas mehr Licht ins dunkel gebracht zu haben.

Bisher wurde noch keine einzige meiner Fragen beantwortet. Ich werde dazu nicht irgendwelche länglichen kaum dokumentierten Sketche durchsuchen.

Ich habe da aber auch überhaupt kein Problem mit :wink: :innocent:

Hallo, Ich habe noch einmal etwas den Code analysiert und die beiden Schaltungen 6-Kanal vs 8 Kanal verglichen.

  • Beide Schaltungen nutzen den MCP23S17_0 für alle STEP und DIR Leitungen sowohl bei 6 Kanal als auch bei 8 Kanal
  • man könnte die Funktion der einzelnen MCP' s aufteilen, einige handle den Output die anderen den Input, jedoch ohne diese zu mixen, dies könnte den Ablauf/Prozes (Nutzung beider Cores) optimieren, da man Updates über Output senden könnte in einem thread und man könnte über einen anderen thread den Input Monitoren/Überwachen.
  • zusätzliche output für jeden Motor verteilt über mehrere MCP's bedeutet zusätzliche Zeit die benötigt wird um diese zu senden, im Umkehrschluss zieht das den Gesamt Takt gesehen pro Motor runter .
  • um ein "fast as possible" umsetzen zu können muss man mit load bit array für den motorStepDirValue arbeiten, damit man den array dann an die/den MCP sendet. Das würde dann dazu führen, das der MCP instantan die Pins triggert was man im gesendet hat.
  • man müsste denn rotation step Algorithmus, gegen den linear Algorithmus Austauschen oder adaptieren.

Hoffentlich versteht jemand von was ich Rede. Das wären die benötigten Anpassungen um den bestehenden 6-Kanal Code in einen lauffähigen 8 Kanal Code zu portieren

Den Satz: "Bisher wurde noch keine einzige meiner Fragen beantwortet." lese ich als "Wenn Du meine Fragen beantwortest, kann ich Dir möglicherweise helfen.". Wenn mir das jemand schreibt, der eine Bibliothek

  • auch für Schrittmotoren
  • auch für Timer
  • auch auf dem ESP32

erstellt hat, dann würde ich ganz schnell alle seine Fragen beantworten. Denn das dürfte der letzte Strohhalm in diesem Forum sein.

Hallo @all

  • auch für Schrittmotoren
    ja die AC-Servomotoren werden wie Schrittmotoren angesteuert, in diesem Zusammenhang ja auch für Schrittmotoren.

  • auch für Timer,
    das Timing gibt der ESP vor, ja dem ESP sind die Impulse bekannt, #105 habe ich die Formeln beschrieben wie die Step berechnet werden, der ESP bekommt ja wie im gleichen Post unter Actuator Mode hierfür den beschriebenen Datensatz ID,... und das Data Format wie es aufgebaut ist.

  • auch auf dem ESP32
    ja auf dem ESP32

Aufgrund welcher Vorgaben die Steps überhaupt erzeugt werden sollen. Und in welcher Form?

Die Steps werden aus den Vorgaben #105 erzeugt

ID: is byte values 0xFF + 0xFF
Each axis is 24 bit wide. (3byte)
LF + CR is required in the end (0x0A + 0x0D)

hier als Referenz wie es der 6-Channel Controller mit Esp32 und dem MCP23S17 macht.

ID MOTOR1 MOTOR2 MOTOR3 MOTOR4 MOTOR5 MOTOR6 LF / CR

  1. "2047,2047,2047,2047,2047,2047X" - das ist der HOME position Befehl

2.) "2047,2047,3047,2047,2047,2047X" - das ist ein simpler test um alle Motoren eine aufwärts Richtung zu bewegen,.. Dieser Befehl hebt die Plattform an.
3.) "2047,2047,1047,2047,2047,2047X" - das ist ein simpler test um alle Motoren eine abfwärts Richtung zu bewegen,.. Dieser Befehl senkt die Plattform ab.

Hallo zusammen,

habe bezüglich eurer Anmerkungen, Antworten und Vorschläge noch einmal die Schaltung überarbeitet, Ich habe die Anzahl der MCP's auf 3 Stk. reduziert. MCP1 und MCP2 sind nur ausgehende Int Pins und MCP2 ist nur eingehende Int Pins. Somit sind alle GPIO per MCP gruppiert. Hintergrund ist das man im "Blockweise" die Werte setzen kann. Jeder MCP hat jetzt eine eigene "SS" und einen "INT-A" zum ESP32 verbunden. Sollte auch etwas hilfreich sein, bezüglich Timing,... Durch die Gruppierung das MCP1&2 output sind kann man diese über den 1. thread (Core 1) und MCP3 der Input ist über den 2. Thread (Core 2) laufen lassen.

Hier das neue Schaltbild

Schematic_ESP32-MCP23S17-SPI_v3_2022-01-31.pdf (284,9 KB)

Nö, im Schaltbild ist es "SCK".

Danke, habe es schon angepasst und aktualisiert

und ab jetzt macht es auch Sinn, sich genau anzusehen, wie das schnell anzusteuern ist, 8bit vs 16 bit, autoincrement oder nicht. Aber ich wiederhole mich ... ich weis...

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.