Joystickmittelpunkt verschoben

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
BauerNoob
User
Beiträge: 5
Registriert: Dienstag 6. Februar 2018, 08:10

Guten Morgen liebe Gemeinde.

Nachdem ich vor einigen Wochen die großartigen Möglichkeiten des RaspberryPis und Python endeckte.
Habe ich mir direkt ein ziemlich ergeiziges Ziel gesteckt.
Bei meinem Projekt, handelt es sich um ein Kettenfahrzeug, welches u.a. einen Greifarm bekommen soll.
Dieses möchte ich (anfangs) über einen Bluetooth PS3 Controller steuern.
Nach dem ich nun den Bluetoothcontroller mit dem RPi verbunden hatte (das war sehr Nerven aufreibend)
Habe ich begonnen ein Skript für den Antrieb der Ketten zubasteln.
Diesen Teil der Aufgabe habe ich mit einigem Lesen und Interpretieren anderer Skripte und Tutorials gut gelöst. 8)

Danach habe ich begonnen den Servoteil zu lösen am Ende sollen min.6 Servos den Greifarm bewegen.
und einige andere Servos weiter Aufgaben übernehmen.
Dafür habe ich zunächst diesen Teil des Skripts aus dem,restlichem gelöst.
Einfach damit ich mir beim ausprobieren des Servoteiles, den Antriebsteil nicht wieder Kaputtschreibe.

!Nun zum eigentlichem Problem!

Ich habe also damit begonnen ersteinmal einen Servokanal für eine Axe zuschreiben
(das erleichtert es mir Anfangs die Übersicht zu behalten)
Wenn ich nun diesen Teil des Skrips ausführe dann geschiet etwas merkwürdiges.
Ich kann zwar den Servo über den gesamten bereich seiner Bewegungsfreiheit steuern.
Jedoch nur mit einer Seite des Joystickweges.
Also der Joystick steht in der Mitte und nichts geschiet (so soll es sein)
dann bewege ich den Joystick nach Links, und es geschiet noch immer nichts.(das ist nicht Gut)
bewege ich den Joystick aber nach Rechts kann ich den Servo komplett bewegen.
Also links, rechts , schnell, langsam. jedoch befindet sich die "Nullstellung"des Servos etwa bei 50% des Joystickweges nach rechts :shock:
Das ist sehr unpraktisch und es ist damit nicht möglich präzise Steuerbefehle auszufüren.

Wie bekomme ich also die Mitte des Servoweges in die Mitte meiner Joystickaxe?
Wenn ich im Terminal z.B. jstest /dev/input/js0 werden alle Axen und deren Mittelpunkte korrekt wiedergegeben.

Die verwendeten Komponenten:
RPi 3 + Bluetooth PS3 Controller + doppel H-Brücke L298N + DC-Getriebemotoren + Adafruit.PCA_9685 + standart Servos aus der Bastelkiste
+ externe (konstant) Stromquelle

Mein Skript(Nur Servoteil ausgelöst)

Code: Alles auswählen

#!/usr/bin/python

import pygame
import os                  
import sys
import time
import RPi.GPIO as GPIO
import Adafruit_PCA9685

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)

GPIO.setup(31,GPIO.OUT)
GPIO.setup(33,GPIO.OUT)
GPIO.setup(35,GPIO.OUT)
GPIO.setup(37,GPIO.OUT)

pygame.init()
pygame.joystick.init()
j = pygame.joystick.Joystick(0)
j.init()
print('Initialized Joystick : %s' % j.get_name())

pwm = Adafruit_PCA9685.PCA9685()
servo_min = -126
servo_max = 126
servo_mid = 0
 

def set_servo_pulse(channal, pulse):
    puls_length = 1000000
    pulse_length //= 60
    print('{0}us per period'.format(pulse_length))
    pulse_length //= 4096
    print('{0}us per bit'.format(pulse_length))
    pulse *=1000
    pulse //= pulse_lenght
    pwm.set_pwm(channel, 0, int(pulse))

pwm.set_pwm_freq(60)

try:
     while j.get_button(3) == 0:
         
         pygame.event.pump()
         
         if j.get_axis(0) != 0.0:
             pos= j.get_axis(0)
             pwm.set_pwm(0, 0, int(pos * 1023))
             print('servo 1')
     

except KeyboardInterrupt:
    print('Program wird beendet...')
    GPIO.cleanup()
    j.quit()
    sys.exit()


Im vorraus Danke ich Euch für die Antworten,
und hoffe das die Erläuterung nicht zulang ausgefallen ist.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wichtig waere noch zu wissen, welche Werte denn deine Joystick-Achse annimmt. Maximal, Minimal, Nullstelle. Und was kommt dann fuer den Servo raus?
BauerNoob
User
Beiträge: 5
Registriert: Dienstag 6. Februar 2018, 08:10

Grüße, danke für die schnelle Reaktion

Wenn ich mit 'jstest /dev/input/js0' den PS3 controller teste habe ich einen Bereich von -32767, 0 , +32767
ich finde diese Zahlen auch sehr merkwürdig da ich selbst Zahlen zwischen -127 & +127 erwartet hätte.
Ich kann jedoch diese gesamte Prozedur auch mit einem USB-3D-Joystick ausführen und erhalte die gleichen Ergebnisse.
(auch innerhalb des Skriptes)
Wie ich mir die Werte für den Servo anzeigen lasse ist mir allerdings nicht klar.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also wenn du einen Wert von +/- 32K einfach mit 1023 multiplizierst und dann in die PWM stopfst, dann kann da ja nicht so richgtig was sinnvolles rauskommen, denn *negative* Werte kann die schon mal gar nicht. Dein Setup mit 60 klingt auch komisch. Denn das Servo-Protokoll sieht ja vor, das man von 500-2500 uS einen Pulse erzeugt, und das eingebettet in ein 50Hz-Raster.

Du hast da auch jede Menge Code, den du nicht benutzt. Und der uns hier verwirrt.

Schreib dir mal ein kleines Testprogramm, welches dein Servo in voll links, voll rechts, Mittelstellung bringt. Dann kennst du die Werte, auf die du den Bereich des Joysticks abbilden musst.
BauerNoob
User
Beiträge: 5
Registriert: Dienstag 6. Februar 2018, 08:10

Natürlich geht Minus nicht - Danke für diesen Gedankenanstoß!
Es ergaben sich also für den Servo folgende Werte

Servo 0° = 150 = 1 mS
Servo 90° = 375 = 1,5 mS
Servo 180°= 600 = 2,0 mS

Demnach wäre also:
Joystick = -32767 -> Servo = 0°
Joystick = 0 -> Servo = 90°
Joystick = 32767 -> Servo = 180°

Bleibt also die Frage wie ich diese Werte übergebe.
Ist das soweit korrekt ?
BauerNoob
User
Beiträge: 5
Registriert: Dienstag 6. Februar 2018, 08:10

Guten Morgen
Nun also habe ich das Skript noch einmal zusammen geschrumpft.
Und noch etwas mit den Werten gespielt.
Dabei hat sich jedoch nicht viel verändert.

Die Frage ist im Prinzip die gleiche.
Wie ist es möglich dem jeweiligen Minimum ,Neutral ,Maximum des Joysticks an jene des Servo zu übergeben,
und die Bereiche dazwischen möglichst interpretieren zu lassen ?
Und bin ich mit meinem Skript überhaupt auf dem richtigem Weg?

Joystick min -32767 = Servo DutyCycle 2,5% -> 1 ms
Joystick mid 0 = Servo DutyCycle 7,5% -> 1,5 ms
Joystick max 32767 = Servo DutyCycle 12,5% -> 2 ms

Code: Alles auswählen

#!/usr/bin/python

import time
import pygame
import os                  
import sys
import Adafruit_PCA9685


pygame.init()
pygame.joystick.init()
j = pygame.joystick.Joystick(0)
j.init()
print('Initialized Joystick : %s' % j.get_name())

pwm = Adafruit_PCA9685.PCA9685()
servo_min = 150
servo_max = 600
servo_mid = 375


try:
     while j.get_button(3) == 0:
         
         pygame.event.pump()
         
         if j.get_axis(0) != 0.0:
             pos= j.get_axis(0)
             pwm.set_pwm(0, 0, int(pos*1023))
             print('servo 1')
     

except KeyboardInterrupt:
    print('Program wird beendet...')
    j.quit()
    sys.exit()
Danke für Eure Mühen.
Liebe Grüße
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na das ist ja nun eine simple Geradengleichung, Stoff der Mittelstufe. Dein Wertebereich von -32K - +32K muss auf 1000-2000 abgebildet werden:

servo = joystick * slope + offset

Haben wir die Tage hier im Forum uebrigens auch schon mal diskutiert.
BauerNoob
User
Beiträge: 5
Registriert: Dienstag 6. Februar 2018, 08:10

@ __deets__
Danke das du Dich wiederholt dazu herrab gelassen hast mir zu Antworten. Das ist sehr freundlich.
Wenn ich einst die Mittelstufe erreichen sollte werde ich die Lehrer dort von Dir grüßen, sie erinnern sich sicherlich noch an Dich.
Kleiner Tipp noch: Wenn dir die Fragen hier zu dumm sind, dann ignoriere diese einfach.
Damit ersparst Du dir eine Menge Herzklappern. Und ergrauendes Haar.
Fals ich hier doch nochmal eine Frage stelle, antworte bitte NICHT.
Danke.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es gibt Leute, denen der Hinweis darauf wie ihr Problem heißt & das sie das doch eigentlich selbst können, Ansporn ist es selbst zu lösen.

Und dann gibt es immer wieder Leute (gerade mit Pi) die ihr Eintrittsgeld hier zurück fordern, wenn man ihnen nicht Code frei Haus nach ihren Wünschen liefert. Oh warte. Kostet ja alles gar nix hier...

Aber da du dich so rührend um meine Gesundheit sorgst, will ich deinem Wunsch entsprechen, und hab dich auf meine Blockierliste gesetzt. Dann kommen deine Fragen mir nicht mehr unter.
Antworten