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.
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
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.