DrHennes86
Posts: 13
Joined: Sun Aug 25, 2019 9:30 am

I2C Problem mit ansteuerung von Schrittmotoren

Thu Oct 24, 2019 10:20 am

Hallo,
ich habe mal wieder ein kleineres Problem. Aktuell versuche ich mich an einem Self-Balancing-Robot. Geschrieben ist die Software in Python. Für die Motoren verwende ich einen DRV 8825 Schrittmotortreiber. Als Gyroscop benutze ich das MPU6050. Motoren sind die Nema 17.
Die ansteuerung der Treiber erfolgt über einen while loop, welcher als Thread im Hintergrund läuft. Die Frequenz in der Schleife, also die verzögerung zwischen dem Einschalten und Ausschalten des PIN für den Schritt, erfolgt über die sleep funktion. Soweit so gut. Das funktioniert auch alles bis zu dem Punkt wo dann die I2C Abfrage für den Gyrosensor in einem weiteren Thread kommt. Denn dann fängt der Motor immer an zu stotern und läuft nicht mehr sauber.
Lasse ich jeden Thread einzelt ohne den anderen laufen funktioniert das alles.
Zum Auslesen wird das smbus modul benutzt.


Das ist der Code der in der Libary für das Auslesen des MPU Sensor verwendet wird.

Code: Select all

    
        def read_i2c_word(self, register):
        """Read two i2c registers and combine them.

        register -- the first register to read from.
        Returns the combined read results.
        """
        # Read the data from the registers
        high = self.bus.read_byte_data(self.address, register)
        low = self.bus.read_byte_data(self.address, register + 1)

        value = (high << 8) + low

        if (value >= 0x8000):
            return -(65535 - value) + 1
        else:
            return value
    
    def get_accel_data(self, g=True, get_raw_data = False):
        """Gets and returns the X, Y and Z values from the accelerometer.

        If g is True, it will return the data in g
        If g is False, it will return the data in m/s^2
        Returns a dictionary with the measurement results.
        """
        x = self.read_i2c_word(self.ACCEL_XOUT0) - self.acc_x_offset
        y = self.read_i2c_word(self.ACCEL_YOUT0) - self.acc_y_offset
        z = self.read_i2c_word(self.ACCEL_ZOUT0) - self.acc_z_offset
        
        

Hier ist mein Programm Code um den es sich handelt.

Code: Select all

import mpu6050,time,math, _thread, threading
import  RPi.GPIO as gpio
import pid_regler
import mpu6050cal
import simple_pid

class KalmanAngle:
    def __init__(self):
        self.QAngle = 0.001
        self.QBias = 0.003
        self.RMeasure = 0.03
        self.angle = 0.0
        self.bias = 0.0
        self.rate = 0.0
        self.P=[[0.0,0.0],[0.0,0.0]]

    '''def kalman():
        QAngle = 0.001
        QBias = 0.003
        RMeasure = 0.03
        angle = 0.0
        bias = 0.0
        P[0][0] = 0.0
        P[0][1] = 0.0
        P[1][0] = 0.0
        P[1][1] = 0.0'''

    def getAngle(self,newAngle, newRate,dt):
        #step 1:
        self.rate = newRate - self.bias;    #new_rate is the latest Gyro measurement
        self.angle += dt * self.rate;

        #Step 2:
        self.P[0][0] += dt * (dt*self.P[1][1] -self.P[0][1] - self.P[1][0] + self.QAngle)
        self.P[0][1] -= dt * self.P[1][1]
        self.P[1][0] -= dt * self.P[1][1]
        self.P[1][1] += self.QBias * dt

        #Step 3: Innovation
        y = newAngle - self.angle

        #Step 4: Innovation covariance
        s = self.P[0][0] + self.RMeasure

        #Step 5:    Kalman Gain
        K=[0.0,0.0]
        K[0] = self.P[0][0]/s
        K[1] = self.P[1][0]/s

        #Step 6: Update the Angle
        self.angle += K[0] * y
        self.bias  += K[1] * y

        #Step 7: Calculate estimation error covariance - Update the error covariance
        P00Temp = self.P[0][0]
        P01Temp = self.P[0][1]

        self.P[0][0] -= K[0] * P00Temp;
        self.P[0][1] -= K[0] * P01Temp;
        self.P[1][0] -= K[1] * P00Temp;
        self.P[1][1] -= K[1] * P01Temp;

        return self.angle

    def setAngle(self,angle):
        self.angle = angle

    def setQAngle(self,QAngle):
        self.QAngle = QAngle

    def setQBias(self,QBias):
        self.QBias = QBias

    def setRMeasure(self,RMeasure):
        self.RMeasure = RMeasure

    def getRate(self):
        return self.rate

    def getQAngle(self):
        return self.QAngle

    def getQBias(self):
        return self.QBias

    def  getRMeasure(self):
        return self.RMeasure

class euler_angle(threading.Thread):

    #Address
    address = 0x68

    #Offset
    angle_y_offset = 0

    #Angle
    offset_comAngleY = 0
    comAngleY = 0
    angle = 0
    pitch = 0
    kalangle = 0

    #Timer
    start_time = time.time()
    stop_time = time.time()

    #Variabel für Stepper um Störungen zwischen dem Bus und dem Step pin zu verhindern
    steps_running = False

    def __init__(self, angle_y_offset=0):
        threading.Thread.__init__(self)
        self.running = True
        self.angle_y_offset = angle_y_offset

    def run(self):
        lock = _thread.allocate_lock()
        while self.running == True:
            #Timing
            if not self.steps_running:
                self.stop_time = time.time()
                self.dt = self.stop_time - self.start_time
                self.start_time = time.time()

                # get accel_data with an Threading lock
                lock.acquire()

                accel_data = mpu.get_accel_data(get_raw_data = True)
                self.accel_data_x = accel_data["x"]
                self.accel_data_z = accel_data["z"]
                self.accel_data_y = accel_data["y"]
                # get gyro data
                self.gyro_data_y = mpu.get_gyro_data()["y"]

                lock.release()

                # Calculate Pitch
                self.pitch = math.atan2(self.accel_data_z, self.accel_data_x) * 57.2958

                # Using Complenmentair Filter
                self.comAngleY = 0.98 * (self.comAngleY + self.gyro_data_y * self.dt) + 0.02 * self.pitch

                #Angle offset
                self.offset_comAngleY = self.comAngleY - self.angle_y_offset

                self.kalangle = kal.getAngle(self.offset_comAngleY, self.gyro_data_y, self.dt)
                time.sleep(0.05)

    def stop(self):
        self.running = False

class stepper(threading.Thread):
    step_pin = 23
    dir_pin = 24
    m_1_pin = 7
    m_2_pin = 8
    m_2_pin = 9
    m_3_pin = 10


    #Stepmodes
    steps = {"Full step": [0, 0, 0],
             "Half step": [1, 0, 0],
             "1/4 step": [0, 1, 0],
             "1/8 step": [1, 1, 0],
             "1/16 step": [0, 0, 1],
             "1/32 step": [1, 0, 1]}
    current_stepmode = ""

    #Running Variabels
    delay = 0.0008
    running = True



    def __init__(self, step_pin=16, dir_pin=21, m_1_pin=26, m_2_pin=19, m_3_pin=13, stepmode="Full step"):
        threading.Thread.__init__(self)
        output_channel = []
        self.step_pin = step_pin
        output_channel.append(step_pin)
        self.dir_pin = dir_pin
        output_channel.append(dir_pin)
        self.m_1_pin = m_1_pin
        output_channel.append(m_1_pin)
        self.m_2_pin = m_2_pin
        output_channel.append(m_2_pin)
        self.m_3_pin = m_3_pin
        output_channel.append(m_3_pin)

        # Gpio initialisieren
        gpio.setmode(gpio.BCM)
        gpio.setup(output_channel, gpio.OUT)

        #stepmode configurate
        gpio.output(m_1_pin,self.steps[stepmode][0])
        gpio.output(m_2_pin, self.steps[stepmode][1])
        gpio.output(m_2_pin, self.steps[stepmode][2])
        self.current_stepmode = stepmode

    def run(self):
        while self.running:
            gpio.output(self.step_pin, 1)
            time.sleep(self.delay)
            gpio.output(self.step_pin, 0)
        print("Stepper Output Disable")

    def change_stepmode(self,stepmode):
        gpio.output(self.m_1_pin, self.steps[stepmode][0])
        gpio.output(self.m_2_pin, self.steps[stepmode][1])
        gpio.output(self.m_2_pin, self.steps[stepmode][2])
        self.current_stepmode = stepmode

    def change_direction(self, direction):
        gpio.output(self.dir_pin, direction)







#Address from MPU6050
address = 0x68

#Calibrating?
calibrating = False
if calibrating:
    mpucal = mpu6050cal
    mpucal.calibrate()
else:
    print("Loading Offsets from file.")

#timings
start_time = time.time()
stop_time = time.time()


#Creating Objects
kal = KalmanAngle()
mpu = mpu6050.mpu6050(address, calibration_offsets=True)
pid = simple_pid.PID(1, 1, 0.05, setpoint=90)

#Configurate PID
pid.output_limits = (-100, 100)


#Starting Threads
angle = euler_angle()
angle.start()

stepper_engine = stepper(23, 24)
stepper_engine.start()


try:
    while True:
        #Timings
        stop_time = time.time()
        dt = stop_time - start_time
        start_time = time.time()
        pid.sample_time = dt

        #Calculating
        new_angle = round(angle.kalangle)
        raw_value_pid = round(pid(new_angle))

        #Controling
        #Maximum Delay = 0.0008 minimum Delay = 0.005  
        if new_angle > 90:
            stepper_engine.change_direction(1)
            stepper_engine.delay = 0.005 - (-1*raw_value_pid * 0.00004)
        else:
            stepper_engine.change_direction(0)
            stepper_engine.delay = 0.005 - (raw_value_pid * 0.00004)

        time.sleep(0.001)


except KeyboardInterrupt:
    angle.stop()
    stepper_engine.running = False
    gpio.cleanup()

Wie mann dem Programm schon entnhemen kann hab ich es bereits mit Locks probiert aber dies hat auch nichts gebracht.
Kann das sein, dass es eine Signalüberschneidung gibt wenn der BUS abgefragt wird und über den Step_Pin ein Signal an den Motor geschickt wird?

Mit freundlichen Grüßen

User avatar
mline
Posts: 1359
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: I2C Problem mit ansteuerung von Schrittmotoren

Thu Oct 24, 2019 3:26 pm

Slte eigentlich nicht passieren weil I2C Geräte immer nur dann den Bus belegen, wenn sie ein Request mit deren Adresse bekommen.


Ich kann dir jedenfalls versichern, dass der MPU mit anderen Geräten am selben Bus funktioniert.
Vielleicht stimmt was mit den Pullups nicht. Hatte mal den Fall, dass an jedem Gerät ein eigener Pullup hing und da der Gesamtwiderstand dann nicht mehr gepasst hat. Führte allerdings dazu, dass dann garnix mehr funktioniert hat.
<~~>

DrHennes86
Posts: 13
Joined: Sun Aug 25, 2019 9:30 am

Re: I2C Problem mit ansteuerung von Schrittmotoren

Fri Oct 25, 2019 7:31 am

Ok,
Der Schrittmotor hängt allerdings nicht mit an dem BUS der ist an einem ganz anderen Pin angeschlossen. Kann das sein, dass da vielleicht intern, wenn der BUS anfängt zu arbeiten, vielleicht irgendwas geschaltet wird ?
Ich stehe echt auf dem Schlauch aktuell. Und ohne Oszi wird das auch nicht so einfach rauszufinden wie die Störung am PIN für den Schrittmotor aussieht.
Ich würde auch ein Softwareseitiges Problem nicht ausschließen...vielleicht kann ja dazu jemand was sagen?
Also wenn Multithreading genutzt wird und in einem Thread der I2C Bus abgefragt wird und in dem anderen Thread Gpio geschaltet werden..

User avatar
mline
Posts: 1359
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: I2C Problem mit ansteuerung von Schrittmotoren

Fri Oct 25, 2019 11:43 am

Oh mein Fehler. Dachte der Motortreiber nutzt auch I2C.

Wie sieht denn die CPU Auslastung aus wenn du beide Threads laufen hast? Eventuell blockiert der Thread für die IMU die CPU sodass für den Thread für den Stepper keine Zeit mehr über ist
<~~>

DrHennes86
Posts: 13
Joined: Sun Aug 25, 2019 9:30 am

Re: I2C Problem mit ansteuerung von Schrittmotoren

Sat Oct 26, 2019 8:24 am

Ich kann ehrlich gesagt nichts zu der CPU Auslastung sagen, da ich keine Ahnung hab wie man die abfragt unter Linux mit Python. Aber ich habe einen Feldversuch gestartet indem ich die Berechnungen für den Delay in einem Thread gemacht habe und die While Schleife in einem Process. Ergebnis: Jetzt gehts. Also wird es an der Auslasung gelegen haben, hoffe ich mal. Jetzt stoße ich allerdings auf das Problem, dass die Delay`s für die Schrittverögerung in dem Thread berechnet werden. Wie bekommt man denn Daten zwischen einem Thread und einem Process ausgetauscht?
Beim Threading war das ja recht einfach, da man ja die ganze Klasse als Thread laufen lassen konnte. Nach ersten tests ist das aber bei Processen so wohl nicht möglich.
Ich probier mal ein wenig aus. Wenn da jemand was weiß wäre ich ganz dankbar.

DrHennes86
Posts: 13
Joined: Sun Aug 25, 2019 9:30 am

Re: I2C Problem mit ansteuerung von Schrittmotoren

Wed Oct 30, 2019 7:27 am

Hallo,
ich bin nun weiter gekommen mit dem Modul Value von Multiprocessing Libary. Aber schön ist das irgendwie nicht und ich denke das das nicht der richtige Weg ist. Gib es nicht irgendwelche anderen möglichkeiten Werte auszutauschen? Ich dachte da mal an eine art Datenbank oder Shelve File..jemand ne Idee?

User avatar
DerKleinePunk
Posts: 73
Joined: Thu Feb 23, 2017 9:18 am
Location: Germany
Contact: Website

Re: I2C Problem mit ansteuerung von Schrittmotoren

Thu Oct 31, 2019 7:58 am

Ich verstehe nicht warum du einen zweiten Process brauchst ?
PI 2 und PI 3 1GB Raspbian Strech
Der Wandel von Atom zum Bit ist unwiderruflich und nicht mehr aufzuhalten.
Nicholas Negroponte

DrHennes86
Posts: 13
Joined: Sun Aug 25, 2019 9:30 am

Re: I2C Problem mit ansteuerung von Schrittmotoren

Mon Nov 04, 2019 7:14 pm

Das verstehe ich selber nicht so wirklich. Aber wenn ich die Schleife für den Stepper in einem Prozess ausführe läuft der Motor flüssig. Wird die Schleife in einem Thread ausgeführt fängt der an zu stottern. Ich bekomme die Wochen mal ein Osziloskop dann will ich mir mal das Signal anschauen was da genau passiert. Ich bin jetzt mal davon ausgegangen, dass die Schleife in einem Thread zuviel Ressourcen benötigt und somit alles ins Stottern kommt.

Muss dabei halt sagen, dass ich noch recht unerfahren bin was Elektrik und Programmierung betrifft.

User avatar
DerKleinePunk
Posts: 73
Joined: Thu Feb 23, 2017 9:18 am
Location: Germany
Contact: Website

Re: I2C Problem mit ansteuerung von Schrittmotoren

Tue Nov 05, 2019 5:18 am

Ohne Das ich jetzt massen an Python Erfahrung habe aber hier bertrachtet als wäre es C++ Code.

Ich hätte da Folgende Idee ob es so ist weiß ich nicht aber passt:

Wenn du auf die GPIO zu greifst halten deine Threads an weil die GPIO lip Thread save ist. Und so versuch das du die selbe Pin's aus zwei Threads unter schiedlich setzt. Wenn du das vielleicht auch gar nicht tuts.

Versuche mal das du jedem Thread eine eigene Instance der GPIO zu geben und nicht eine Globale zu haben. Wie man das jetzt genau in Python macht kann ich dir nicht sagen.

Selbst wenn du jetzt das in einen zweiten Process auslagers und dann in der Schleife die neue Werte holst wirst du zwangs Läufig Unterbrechungen habe. Egal wie du den Datentransfer machst. Den du muss ja kurz nach sehen ob da neue Daten sind. Könnte als so sein das im Wörstcase das nicht lösbar ist ohne die Hardware zu ändern in sofern das der Motor weiter läuft auch ohne signal vom Rechner aber da dann wird das rechnen noch komplexer den der Motor ist ja schon weiter als die Software weiß.

Ich glaube ich würde als erstes versuchen auch wenn es eine Heiden Arbeit ist nicht auf den GPIO aus zwei Lip zuzugreifen um besser Kontrolle zu haben. die GPIO kann auch I²C nicht das sich das da Irgendwo beißt.

https://circuitdigest.com/microcontroll ... pberry-pi/

Den Sensor muss ich mal auf meine Wunschliste schreiben wäre auch was für meine Projekt.
PI 2 und PI 3 1GB Raspbian Strech
Der Wandel von Atom zum Bit ist unwiderruflich und nicht mehr aufzuhalten.
Nicholas Negroponte

DrHennes86
Posts: 13
Joined: Sun Aug 25, 2019 9:30 am

Re: I2C Problem mit ansteuerung von Schrittmotoren

Mon Nov 11, 2019 9:50 pm

Hi,
also ich habe das mal angefangen zu testen bz2. zu programmieren. Aber so ganz bekomme ich das nicht unte einen Deckel das ich die beiden Funktionen unabhängig von einander Synchronisiere(LOCK Module). Ich werde aber mal weiter probieren wobei ja die Lösung aktuell mit dem zweiten Prozess gut funktioniert, trotzdem werde ich mal das beschriebene von dir ausprobieren.
Das Verhalten welches du beschreibst , dass die Libary der GPIOs nicht ThreadSafe ist, würde meinem Problem sehr nahe kommen. Ich hatte schonmal ein ähnliches Problem bei eine anderen Projekt. Wo das Verhalten echt gut im nachhinein passen würde. Ich teste und probiere mal weiter und melde mich dann nochmal wenn ich mehr rausgefunden habe.
Vielen Dank für deine Hilfe!

User avatar
mline
Posts: 1359
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: I2C Problem mit ansteuerung von Schrittmotoren

Tue Nov 12, 2019 6:09 am

Die GPIOs werden über ein Register konfiguriert. Bei raspian wäre dieses über das Device /dev/gpiomem verfügbar. "Threadsafe" ist dies auf jeden Fall da der Status direkt ins Register geschrieben bzw davon gelesen wird. Wenn es Konflikte gibt, dann weil du das in deinem Code so programmiert hast


Lass dich nicht in falsche Richtungen führen. Das stottern deutet darauf hin, dass der Thread für den Stepper nicht genug Zeit hat um seine Aufgabe ordentlich und ohne Verzögerungen zu erledigen
<~~>

User avatar
DerKleinePunk
Posts: 73
Joined: Thu Feb 23, 2017 9:18 am
Location: Germany
Contact: Website

Re: I2C Problem mit ansteuerung von Schrittmotoren

Thu Nov 14, 2019 5:27 am

mline ist stimme deine Analyse ja zu ist nur die frage in welchem code ist der Lock der den Thread anhält.
Im User Code, in der Lib Python Teil in der Lib C Teil.

Eine frage meiner Seits wäre zum Beispiel wie ist die Definition bei Python bei Globalen Variablen. Kann das einen Thread Anhalten oder ist es halt wie bei C++ es knallt wenn es falsch macht und sich nicht selbst drum Kümmert. Ich reden nicht von SmartPointer das noch mal was anders.

Multithreading ist eines der Komplexe Thema in der Software Branche.
PI 2 und PI 3 1GB Raspbian Strech
Der Wandel von Atom zum Bit ist unwiderruflich und nicht mehr aufzuhalten.
Nicholas Negroponte

User avatar
mline
Posts: 1359
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: I2C Problem mit ansteuerung von Schrittmotoren

Thu Nov 14, 2019 11:44 am

DerKleinePunk wrote:
Thu Nov 14, 2019 5:27 am
mline ist stimme deine Analyse ja zu ist nur die frage in welchem code ist der Lock der den Thread anhält.
Im User Code, in der Lib Python Teil in der Lib C Teil.

Es hängt bei der Verarbeitung fürs IMU

Eine frage meiner Seits wäre zum Beispiel wie ist die Definition bei Python bei Globalen Variablen. Kann das einen Thread Anhalten oder ist es halt wie bei C++ es knallt wenn es falsch macht und sich nicht selbst drum Kümmert. Ich reden nicht von SmartPointer das noch mal was anders.

Multithreading ist eines der Komplexe Thema in der Software Branche.

Nein, kann keinen Thread anhalten. Im schlimmsten Fall hat diese Variable halt noch alte oder unvollständige Daten.


Die Verzögerung kommt durch nen Thread der die selbe Priorität hat wie der andere aber mehr Rechenzeit benötigt
<~~>

User avatar
DerKleinePunk
Posts: 73
Joined: Thu Feb 23, 2017 9:18 am
Location: Germany
Contact: Website

Re: I2C Problem mit ansteuerung von Schrittmotoren

Sat Nov 16, 2019 6:16 am

Die Verzögerung kommt durch nen Thread der die selbe Priorität hat wie der andere aber mehr Rechenzeit benötigt
Wie erklärst du dann das in einen zweiten Process Funktioniert. Würde der PI CPU mässig voll ausgelastet sein. ist es doch egal ob Thread oder Process. Die CPU hat keine Zeit mehr.
Ist schon echt spannend habe aber keine Stepper und Ansteuerung da sonst würde ich es glatt mal Probieren.

https://www.raspberrypi.org/forums/view ... 3&t=256740
Es muss gehen der Analysiert noch ein Bild nebei.
PI 2 und PI 3 1GB Raspbian Strech
Der Wandel von Atom zum Bit ist unwiderruflich und nicht mehr aufzuhalten.
Nicholas Negroponte

User avatar
mline
Posts: 1359
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: I2C Problem mit ansteuerung von Schrittmotoren

Sat Nov 16, 2019 8:18 am

DerKleinePunk wrote:
Sat Nov 16, 2019 6:16 am
Wie erklärst du dann das in einen zweiten Process Funktioniert.

TO schrieb, dass es klappt, wenn beide Routinen in einem Thread laufen. In diesem Fall wird jede Routine einmal pro Durchlauf abgearbeitet.

Hat jede Routine einen eigenen Thread, kann es bei identischer Priorität passieren, dass ein Thread die CPU blockiert und damit die zweite Routine im anderen Thread nur sporadisch zu laufen kommt. In dem Fall müsste man die Priorität zugunsten der zweiten Routine ändern.

DerKleinePunk wrote:
Sat Nov 16, 2019 6:16 am
https://www.raspberrypi.org/forums/view ... 3&t=256740
Es muss gehen der Analysiert noch ein Bild nebei.
Hier wird vermutlich die GPU zur Berechnung benutzt. Die CPU bleibt also frei für andere Aufgaben.
<~~>

DrHennes86
Posts: 13
Joined: Sun Aug 25, 2019 9:30 am

Re: I2C Problem mit ansteuerung von Schrittmotoren

Wed Nov 27, 2019 1:29 pm

So ich konnte leider erst am Wochende wieder weiter machen und mich damit beschäftigen. Habe allerdings mitlerweile auch ein Osziloskop und werde das die Tage mal testen, wie das Signal beim Thread aussieht und wie im Prozess. Wäre ja mal interessant zu wissen. Zumindest läuft es jetzt soweit aber ich warte noch vergeblich auf den bestellten Akku aus China, damit es endlich weiter gehen kann.
Habe mal noch Versuche gestartet mit PWM zur Ansteuerung des Treibers und das funktioniert auch super. Habe einfach die Frequenz verändert um die Geschwindigkeit zu varieren.
Ich werde dann mal die Bilder hier vom Osziloskop hochladen falls es jemanden interessiert.

User avatar
DerKleinePunk
Posts: 73
Joined: Thu Feb 23, 2017 9:18 am
Location: Germany
Contact: Website

Re: I2C Problem mit ansteuerung von Schrittmotoren

Thu Nov 28, 2019 7:22 am

https://github.com/brgl/libgpiod

Habe gerade gesehen das jetzt die GPIO unterstüzung in den Kernel gewandert ist. Vielleicht eine Option für dich. Wenn ich das richtig gelesen habe gibt es auch eine Python lib um es dann zu Nutzen.

Im C++ Forum hier habe die damit extreme Zeiten erreicht was die Signal Verarbeitung an geht.
PI 2 und PI 3 1GB Raspbian Strech
Der Wandel von Atom zum Bit ist unwiderruflich und nicht mehr aufzuhalten.
Nicholas Negroponte

DrHennes86
Posts: 13
Joined: Sun Aug 25, 2019 9:30 am

Re: I2C Problem mit ansteuerung von Schrittmotoren

Thu Nov 28, 2019 2:50 pm

Ich glaube um das mit den Kernel nachzuvollziehen muss ich mich mal noch n bisschen in das Thema "Wie funktioniert ein Computer" einarbeiten:D Muss ehrlich gestehen das ich nicht so der Fachmann bin was Software/Hardware betrifft. Aber ich lerne gerne. Mir fehlen allerdings noch einige Basics die ich aktuell noch aufarbeite... bin halt Maschi-Techniker :D
Gestern bei Versuchen mit dem alten Programm, wo die ansteuerung des Treiber in einem while_loop läuft als Thread, lief er wieder ruckelig konnte aber mit dem Oszi da nicht wirklich schlau raus werden. Das einzigste was mir aufgefallen ist, da ich mal über die Oberfläche am Raspberry war, die CPU auslastung lag bei 100%. Ich denke mal das da auch der Fehler bei mir gelegen hat. Wohin gegen das Programm mit dem Prozess statt dem Thread nur ne Auslastung von 40% hatte.
Nebenbei habe ich aber auch gemerkt, dass es wesentlich einfacher ist den Treiber des Motors über eine PWM anzusteuern. Wie dann die CPU auslastung ist werde ich die Tage berichten...

User avatar
DerKleinePunk
Posts: 73
Joined: Thu Feb 23, 2017 9:18 am
Location: Germany
Contact: Website

Re: I2C Problem mit ansteuerung von Schrittmotoren

Fri Nov 29, 2019 6:11 am

100 % CPU ist nie gut. Ok bei MircoController ohne Betriebsystem kann man unter Umständen so weit gehen. Bei einem Betriebssystem würde ich das für gefährlich halten. Klar gibt es auch hier ausnahmen. Realtime Linux zum Beispiel.

Wenn du aber mit dem Prozess nur 40% hast würde ich auf ein Problem in der Software tippen wie du. Man kann ja auch einen Rechner mit nix beschäftigen das führt zu Interessanten Effekten.

Bei PWM gibt es 2 Möglichkeiten der PI hat Hardware PWM und Software PWM sprich es ist nicht gesagt das PWM grundsätzlich deine CPU entlastet.
https://pinout.xyz/pinout/pin12_gpio18#
Wenn ich das richtig verstehe wir ein PWM für die Soundkarte gebraucht.

Hast du die Graphische Oberfläche gestartet ? Das würde ich nicht tun wenn ich so was Teste...
PI 2 und PI 3 1GB Raspbian Strech
Der Wandel von Atom zum Bit ist unwiderruflich und nicht mehr aufzuhalten.
Nicholas Negroponte

DrHennes86
Posts: 13
Joined: Sun Aug 25, 2019 9:30 am

Re: I2C Problem mit ansteuerung von Schrittmotoren

Mon Dec 02, 2019 7:42 pm

Ne in der Regel benutze ich nicht die grafische Oberfläche. Aber mich hat das doch mal interessiert mit der CPU Auslastung.
Ah ok das ist auch interessant. Mich würde halt mal interessieren wie die implementierung von so einer Software PWM aussieht..läuft die dann in einem Thread oder wie kann ich mir das bei der "RPi.GPIO" Libary vorstellen?

User avatar
mline
Posts: 1359
Joined: Sun Jan 27, 2013 1:47 pm
Location: Austria, Vienna

Re: I2C Problem mit ansteuerung von Schrittmotoren

Mon Dec 02, 2019 9:09 pm

Bei Software-PWM wird das Timing - wie der Name schon sagt - per Software realisiert. Das kann (in deinem Fall wird es das garantiert) zu Jitter und damit zu ungenauen Steps führen.

Lass dich nicht vom ursprünglichen Problem ablenken...
mline wrote:
Tue Nov 12, 2019 6:09 am
...
Lass dich nicht in falsche Richtungen führen. Das stottern deutet darauf hin, dass der Thread für den Stepper nicht genug Zeit hat um seine Aufgabe ordentlich und ohne Verzögerungen zu erledigen
<~~>

DrHennes86
Posts: 13
Joined: Sun Aug 25, 2019 9:30 am

Re: I2C Problem mit ansteuerung von Schrittmotoren

Sat Dec 14, 2019 8:35 am

So es läuft alles mit Thread und auch mit einem Prozess. Zumindest sagt es das Oszi. Laufen tut der Roboter immer noch nicht weil mein Provisorium mit den AA Batterien als Akku ersatz, vermutlich nicht genug Leistung bringt um beide Motoren vernünftig zu drehen.
Vielen Dank jungs für eure Hilfe, ich habe wieder viel gelernt dabei.
Mit freundlichen Grüßen
Hennes

Return to “Deutsch”