Source code for MotorController
# Motor Controller
# Example application for using motors.
#
# Copyright (c) 2014 Charles Weir. Shared under the MIT Licence.
import sys, os # Python path kludge - omit these 2 lines if BrickPython is installed.
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0]))))
from BrickPython.TkApplication import TkApplication
from BrickPython.Motor import PIDSetting
from BrickPython.Sensor import Sensor
import logging
[docs]class MotorControllerApp(TkApplication):
'''Application to control a lego NXT motor on port A as a servo motor.
Type keystrokes into the application window to make the motor move:
Numbers 0-9 make it move forward the corresponding number of quarter-turns.
Lower case letters a-p make it go backward the corresponding number of quarter turns.
Capital letter A stops the motor.
Capital letters B-G make it go forward at a constant speed. B is a quarter turn per second, C a half turn, and so on.
Letters xyz and XYZ adjust the settings for the PID Servo Motor algorithm:
* X,x increase and decrease the 'distance multiplier' - the P setting.
* Y,y increase and decrease the 'speed multiplier' - the D setting (I think).
* Z,z increase and decrease the 'Integrated distance multimplier' - the I setting.
'''
def __init__(self):
TkApplication.__init__(self, {'1': Sensor.ULTRASONIC_CONT })
self.pidSetting = PIDSetting()
[docs] def rotate(self, degrees):
'Rotate motor A through *degrees*'
self.stopAllCoroutines()
motor = self.motor('A')
logging.info( "Rotating motor A %d degrees" % degrees )
co = motor.moveTo( motor.position() + degrees*2 )
self.addActionCoroutine( co )
[docs] def setSpeed(self, speed):
'Set the speed of motor A'
self.stopAllCoroutines()
motor = self.motor('A')
logging.info( "Speed for motor A %.2f" % speed )
co = motor.runAtConstantSpeed( speed )
self.addActionCoroutine( co )
[docs] def onKeyPress(self, event):
'Handle user keystroke'
if TkApplication.onKeyPress(self, event):
return
char = event.char
if char in "0123456789":
# rotate forwards:
self.rotate(90 * (ord(char) - ord("0")))
elif char in "abcdefghijklmnop":
# rotate reverse:
self.rotate(-90 * (ord(char) - ord("a") + 1))
elif char in "ABCDEFG":
self.setSpeed(180 * (ord(char) - ord("A") ))
# Adjust PID settings:
elif char in "xyzXYZ":
if char == 'x':
self.pidSetting.distanceMultiplier *= 1.1
elif char == 'X':
self.pidSetting.distanceMultiplier /= 1.1
elif char == 'y':
self.pidSetting.speedMultiplier *= 1.1
elif char == 'Y':
self.pidSetting.speedMultiplier /= 1.1
elif char == 'z':
self.pidSetting.integratedDistanceMultiplier *= 1.1
elif char == 'Z':
self.pidSetting.integratedDistanceMultiplier /= 1.1
logging.info( "%r" % (self.pidSetting) )
self.motor('A').setPIDSetting( self.pidSetting )
if __name__ == "__main__":
logging.basicConfig(format='%(message)s', level=logging.INFO) # Logging is a simple print
logging.info( "Starting" )
app = MotorControllerApp()
app.mainloop()