Brushless Motorcontroll

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Capo24
User
Beiträge: 1
Registriert: Dienstag 24. Januar 2023, 19:09

Moin Moin,

ich bin da an so nem kleinen Projekt dran, aber komme irgendwie an meine Grenzen, da ich nicht aktiv am Coden bin.

Vielleicht kann mir jemand weiterhelfen? Ich zeige erstmal den Code.

import socket

import pigpio

import RPi.GPIO as GPIO



# Set up the pigpio library

pi = pigpio.pi()

servo_pin = 18 # Servo control pin



# Set up the GPIO pins for the brushless motor

GPIO.setmode(GPIO.BOARD)

GPIO.setup(12, GPIO.OUT) # ESC control pin

esc_pwm = GPIO.PWM(12, 50) # ESC PWM signal

esc_pwm.start(0)



# Connect to the Dualshock 4 controller

HOST = '0.0.0.0' # IP address of the Dualshock 4 controller

PORT = 1234 # Port number to connect to

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((HOST, PORT))

s.listen()



print(f'Listening for incoming connections on {HOST}:{PORT}...')

conn, addr = s.accept()

print(f'Connection established with {addr}')



previous_speed = 0

while True:

data = conn.recv(1024).decode()

if not data:

break

data_list = data.split("\n")

for i in data_list:

# parse the received data to determine which axis the data corresponds to

if 'Axis 0' in i:

angle = float(i.split(':')[1])

print(f'Received angle for axis 0: {angle}')

# map the angle from 0 to 180 to a pulse width from 1000 to 2000

pulse_width = 1000 + (angle / 180) * 1000

pi.set_servo_pulsewidth(servo_pin, int(pulse_width))

elif 'Axis 5' in i:

speed = float(i.split(':')[1])

print(f'Received speed for axis 5: {speed}')

# map the speed from 0 to 100 to a duty cycle from 0 to 100

duty_cycle = speed

if speed > 0 and previous_speed == 0:

esc_pwm.start(duty_cycle)

elif speed == 0 and previous_speed > 0:

for i in range(previous_speed, 25, -1):

esc_pwm.ChangeDutyCycle(i)

time.sleep(0.01)

else:

esc_pwm.ChangeDutyCycle(duty_cycle)

previous_speed = duty_cycle

conn.close()

pi.stop()

GPIO.cleanup()



Nun zur Sache.

Ich hab ein RC Auto und möchte dies über ein ovpn steuern.
Das RC Auto ist ein WLTOYS 124017 V2.
Leider funktioniert mein Gaspedal nicht wirklich.
Ich hab die Range vom Sende eingestellt auf 0-10 für Axe5 leider reagiert dieser aber nicht.

Hättet ihr einen Plan warum das Ganze nicht funktioniert?
Teilweise reagiert der Motor teilweise nicht.
Über Tipps wäre ich mega glücklich !!!

Grüße,
Capo24
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Code in Code-Tags setzen, damit er lesbar ist. Das ist der </>-Knopf im vollstaendigen Editor. Dann importierst du pigpio *UND* RPI.GPIO. Das ist quatsch, die kommen sich ins Gehege. Entscheide dich fuer eines, pigpio ist technisch besser, RPi.GPIO leider weiter verbreitet. Besser ist eh gpiozero zu verwenden, und dann kann man das im Hintergrund auch auf pigpio konfigurieren.

Zu deinem Problem: wenn du die PWM des ESC direkt durch Code einstellst, kommt dann das erwartete Verhalten in Bezug auf Richtung und Geschwindigkeit?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Die vielen Leerzeilen machen den Code fast unlesbar.
Einbuchstabige Variablennamen sind fast immer schlecht, `s` für einen server_socket ist besonders unleserlich.
Dann hast Du den typischen Fehler mit TCP-Verbindungen, den fast jeder macht. TCP ist kein paketbasiertes Format, sondern ein Strom von einzelnen Bytes. Der Code muß also damit zurechtkommen, dass `recv` nur ein einzelnes Byte liefert, oder auch mehrere "Pakete" bei einem Aufruf.
Als nächstes hast Du bei `data_list` einen Einrückungsfehler, so dass das Programm effektiv nichts macht.
data_list scheint eine Liste mit Zeilen zu sein. `i` ist deshalb ein besonders bescheuerter Name für eine Zeile.
Ab `conn.close()` ist dann doppelt falsch eingerückt.

Bei den Problemen solltest Du solangsam anfangen aktiv am Coden zu werden.
Antworten