Thunderborg and UltraBorg
Forums:
Dear people,
i am fine tuning the monsterJoy.py file. i have 1 servo that i want to control with de d-pad left and right. Ive copied some lines of the diddyborgv2.py file hoping that worked but it doesnt work. Can anyone tell me what i'm doing wrong?
this is the code that im working with:
#!/usr/bin/env python
# coding: Latin-1
# Load library functions we want
import time
import os
import sys
import pygame
import ThunderBorg
import UltraBorg
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(21, GPIO.OUT, initial=GPIO.LOW)
# Re-direct our output to standard error, we need to ignore standard out to hide some nasty print statements from pygame
sys.stdout = sys.stderr
# Setup the ThunderBorgs
TB1 = ThunderBorg.ThunderBorg()
TB2 = ThunderBorg.ThunderBorg()
TB1.i2cAddress = 10
TB2.i2cAddress = 11
TB1.Init()
TB2.Init()
if not TB1.foundChip or not TB2.foundChip:
boards = ThunderBorg.ScanForThunderBorg()
if len(boards) == 0:
print 'No ThunderBorg found, check you are attached :)'
else:
print 'ThunderBorg missing at address %02X or %02X, but we did find boards:' % (TB1.i2cAddress, TB2.i2cAddress)
for board in boards:
print ' %02X (%d)' % (board, board)
print 'If you need to change the I²C address change the setup line so it is correct, e.g.'
print 'TB1.i2cAddress = 0x%02X' % (boards[0])
sys.exit()
# Ensure the communications failsafes have been enabled!
failsafe1 = False
failsafe2 = False
for i in range(5):
TB1.SetCommsFailsafe(True)
TB2.SetCommsFailsafe(True)
failsafe1 = TB1.GetCommsFailsafe()
failsafe2 = TB2.GetCommsFailsafe()
if failsafe1 and failsafe2:
break
if not failsafe1:
print 'Board %02X failed to report in failsafe mode!' % (TB1.i2cAddress)
sys.exit()
if not failsafe2:
print 'Board %02X failed to report in failsafe mode!' % (TB2.i2cAddress)
sys.exit()
# Ensure the communications failsafe has been enabled!
failsafe = False
for i in range(5):
TB1.SetCommsFailsafe(True)
TB2.SetCommsFailsafe(True)
failsafe = TB1.GetCommsFailsafe()
failsafe = TB2.GetCommsFailsafe()
if failsafe:
break
if not failsafe:
print 'Board %02X failed to report in failsafe mode!' % (TB1.i2cAddress)
print 'Board %02X failed to report in failsafe mode!' % (TB2.i2cAddress)
sys.exit()
# Setup the UltraBorg board
UB = UltraBorg.UltraBorg()
UB.i2cAddress = 24
UB.Init()
if UB.foundChip:
print 'Yay !'
else:
print 'Aww...'
# Settings for the joystick
axisUpDown = 1 # Joystick axis to read for up / down position
axisUpDownInverted = False # Set this to True if up and down appear to be swapped
axisLeftRight = 3 # Joystick axis to read for left / right position
axisLeftRightInverted = False # Set this to True if left and right appear to be swapped
buttonSlow = 6 # Joystick button number for driving slowly whilst held (L2)
slowFactor = 0.5 # Speed to slow to when the drive slowly button is held, e.g. 0.5 would be half speed
buttonFastTurn = 7 # Joystick button number for turning fast (R2)
interval = 0.00 # Time between updates in seconds, smaller responds faster but uses more processor time
buttonNew1 = 5
buttonNew2 = 4
buttonMeArmClawOpen = 13 # Joystick button number to open the claw (D-Pad Left)
buttonMeArmClawClose = 14 # Joystick button number to close the claw (D-Pad Right)
# Power settings
voltageIn = 1.2 * 10 # Total battery voltage to the ThunderBorg
voltageOut = 12.0 * 0.95 # Maximum motor voltage, we limit it to 95% to allow the RPi to get uninterrupted power
# Setup the power limits
if voltageOut > voltageIn:
maxPower = 1.0
else:
maxPower = voltageOut / float(voltageIn)
# Settings for the MeArm
servoMeArmClaw = 1 # Servo index used for opening the claw
rateMeArmClaw = 1.0 # Movement speed for the claw
# Show battery monitoring settings
battMin, battMax = TB1.GetBatteryMonitoringLimits()
battMin, battMax = TB2.GetBatteryMonitoringLimits()
battCurrent = TB1.GetBatteryReading()
battCurrent = TB2.GetBatteryReading()
print 'Battery monitoring settings:'
print ' Minimum (red) %02.2f V' % (battMin)
print ' Half-way (yellow) %02.2f V' % ((battMin + battMax) / 2)
print ' Maximum (green) %02.2f V' % (battMax)
print
print ' Current voltage %02.2f V' % (battCurrent)
print
# Setup pygame and wait for the joystick to become available
TB1.MotorsOff()
TB2.MotorsOff()
TB1.SetLedShowBattery(False)
TB2.SetLedShowBattery(False)
TB1.SetLeds(0,0,1)
TB2.SetLeds(0,0,1)
os.environ["SDL_VIDEODRIVER"] = "dummy" # Removes the need to have a GUI window
pygame.init()
#pygame.display.set_mode((1,1))
print 'Waiting for joystick... (press CTRL+C to abort)'
while True:
try:
try:
pygame.joystick.init()
# Attempt to setup the joystick
if pygame.joystick.get_count() < 1:
# No joystick attached, set LEDs blue
TB1.SetLeds(0,0,1)
TB2.SetLeds(0,0,1)
pygame.joystick.quit()
time.sleep(0.1)
else:
# We have a joystick, attempt to initialise it!
joystick = pygame.joystick.Joystick(0)
break
except pygame.error:
# Failed to connect to the joystick, set LEDs blue
TB1.SetLeds(0,0,1)
TB2.SetLeds(0,0,1)
pygame.joystick.quit()
time.sleep(0.1)
except KeyboardInterrupt:
# CTRL+C exit, give up
print '\nUser aborted'
TB1.SetCommsFailsafe(False)
TB2.SetCommsFailsafe(False)
TB1.SetLeds(0,0,0)
TB2.SetLeds(0,0,0)
sys.exit()
print 'Joystick found'
joystick.init()
TB1.SetLedShowBattery(True)
TB2.SetLedShowBattery(True)
ledBatteryMode = True
# Make a function to control a specific servo
def SetServoPosition(servo, position):
if servo == 1:
UB.SetServoPosition4(position)
else:
print 'Servo index %d is not available' % (servo)
# Set acceleration values
accelScale = 0.001
accelRate = 1.005
accelMeArmClaw = rateMeArmClaw * accelScale
# Set the initial MeArm positions
SetServoPosition(servoMeArmClaw, meArmClaw)
try:
print 'Press CTRL+C to quit'
driveLeft = 0.0
driveRight = 0.0
running = True
hadEvent = False
upDown = 0.0
leftRight = 0.0
# Loop indefinitely
while running:
# Get the latest events from the system
hadEvent = False
events = pygame.event.get()
# Handle each event individually
for event in events:
if event.type == pygame.QUIT:
# User exit
running = False
elif event.type == pygame.JOYBUTTONDOWN:
# A button on the joystick just got pushed down
hadEvent = True
if event.button == buttonNew1:
GPIO.output(21, GPIO.HIGH)
print 'Lights on'
if event.button == buttonNew2:
GPIO.output(21, GPIO.LOW)
print 'Lights off'
elif event.type == pygame.JOYAXISMOTION:
# A joystick has been moved
hadEvent = True
if hadEvent:
# Read axis positions (-1 to +1)
if axisUpDownInverted:
upDown = -joystick.get_axis(axisUpDown)
else:
upDown = joystick.get_axis(axisUpDown)
if axisLeftRightInverted:
leftRight = -joystick.get_axis(axisLeftRight)
else:
leftRight = joystick.get_axis(axisLeftRight)
# Apply steering speeds
if not joystick.get_button(buttonFastTurn):
leftRight *= 0.5
# Determine the drive power levels
driveLeft = -upDown
driveRight = -upDown
if leftRight < -0.05:
# Turning left
driveLeft *= 1.0 + (2.0 * leftRight)
elif leftRight > 0.05:
# Turning right
driveRight *= 1.0 - (2.0 * leftRight)
# Check for button presses
if joystick.get_button(buttonSlow):
driveLeft *= slowFactor
driveRight *= slowFactor
# Set the motors to the new speeds
TB1.SetMotors(driveRight * maxPower)
TB2.SetMotors(driveLeft * maxPower)
# Claw open / close
if joystick.get_button(buttonMeArmClawClose):
meArmClaw += accelMeArmClaw * meArmSpeed
accelMeArmClaw *= accelRate
if meArmClaw > 1.0:
meArmClaw = 1.0
SetServoPosition(servoMeArmClaw, meArmClaw)
elif joystick.get_button(buttonMeArmClawOpen):
meArmClaw -= accelMeArmClaw * meArmSpeed
accelMeArmClaw *= accelRate
if meArmClaw < -1.0:
meArmClaw = -1.0
SetServoPosition(servoMeArmClaw, meArmClaw)
else:
accelMeArmClaw = rateMeArmClaw * accelScale
# Change LEDs to purple to show motor faults
if TB1.GetDriveFault1() or TB1.GetDriveFault2() or TB2.GetDriveFault1() or TB2.GetDriveFault2():
if ledBatteryMode:
TB1.SetLedShowBattery(False)
TB2.SetLedShowBattery(False)
TB1.SetLeds(1,0,1)
TB2.SetLeds(1,0,1)
ledBatteryMode = False
else:
if not ledBatteryMode:
TB1.SetLedShowBattery(True)
TB2.SetLedShowBattery(True)
ledBatteryMode = True
# Wait for the interval period
time.sleep(interval)
# Disable all drives
TB1.MotorsOff()
TB2.MotorsOff()
except KeyboardInterrupt:
# CTRL+C exit, disable all drives
TB1.MotorsOff()
TB2.MotorsOff()
TB1.SetCommsFailsafe(False)
TB2.SetCommsFailsafe(False)
TB1.SetLedShowBattery(False)
TB2.SetLedShowBattery(False)
TB1.SetLeds(0,0,0)
TB2.SetLeds(0,0,0)
GPIO.cleanup()
print
- Log in to post comments


piborg
Tue, 03/19/2019 - 20:37
Permalink
What is happening?
What is happening when you try the script, does it show any error messages or move the servo at all?
It would also help to know what controller you are using.
Thieu
Wed, 03/20/2019 - 06:00
Permalink
Servo doesnt move
The servo doenst move with the d-pad left and right, im using ps3 controller
piborg
Wed, 03/20/2019 - 08:38
Permalink
Wrong button numbers
It looks like you are probably using the wrong button numbers.
Looking at our PlayStation 3 controller help sheet I think they should be:
just to confirm the code requires the button to be held to move the servo, not just quickly pressed.