Well, all went well with soldering up the MotorHAT. In fact, we downloaded the software from Adafruit, fired it up in Python, and went through a sequence of first moving a single motor, then moving two motors just using SSH and Python locally on the Pi, with the device on the bench.
|
|
What I needed to do next was find a python program that would initialize a networktables server, and listen for a connection from a client, and print out the values, so I could see what was happening at the driverstation.
I started with just a listener, but here is what I'm running now. This code listens to any changes in network tables, and then filters out anything that has to do with the forward/backward axes on the two joysticks.
This is NOT production code BTW. It's a hack to get things to work.
#!/usr/bin/env python3
#
# This is a NetworkTables client (eg, the DriverStation/coprocessor side).
# You need to tell it the IP address of the NetworkTables server (the
# robot or simulator).
#
# This shows how to use a listener to listen for changes in NetworkTables
# values. This will print out any changes detected on the SmartDashboard
# table.
#
# Make this a server/listener
'''
import time
from networktables import NetworkTables
# To see messages from networktables, you must setup logging
import logging
logging.basicConfig(level=logging.DEBUG)
NetworkTables.initialize()
sd = NetworkTables.getTable("SmartDashboard")
i = 0
while True:
print('dsTime:', sd.getNumber('dsTime', 'N/A'))
sd.putNumber('robotTime', i)
time.sleep(1)
i += 1
'''
import sys
import time
import atexit
from networktables import NetworkTables
from Adafruit_MotorHAT import Adafruit_MotorHAT, Adafruit_DCMotor
# To see messages from networktables, you must setup logging
import logging
logging.basicConfig(level=logging.DEBUG)
'''if len(sys.argv) != 2:
print("Error: specify an IP to connect to!")
exit(0)
ip = sys.argv[1]
NetworkTables.initialize(server=ip)
'''
# create a default object, no changes to I2C address or frequency
mh = Adafruit_MotorHAT(addr=0x60)
# recommended for auto-disabling motors on shutdown!
def turnOffMotors():
mh.getMotor(1).run(Adafruit_MotorHAT.RELEASE)
mh.getMotor(2).run(Adafruit_MotorHAT.RELEASE)
mh.getMotor(3).run(Adafruit_MotorHAT.RELEASE)
mh.getMotor(4).run(Adafruit_MotorHAT.RELEASE)
atexit.register(turnOffMotors)
motorLeft = mh.getMotor(3)
motorRight = mh.getMotor(4)
motorLeftSpeed = 0 # should be from 0-255
motorLeftDirection = Adafruit_MotorHAT.RELEASE # Start in a forward direction
motorGain = .5 # 1.0 is full speed, needed to turn them down
def getSpeedFromAxisValue(axisvalue: float) -> int:
if abs(axisvalue) < .001:
axisvalue = 0.0
return abs(int(axisvalue*motorGain*255.0))
def getDirectionFromAxisValue(axisvalue: float, reverse: bool) -> int:
if abs(axisvalue) < .001:
direction = Adafruit_MotorHAT.RELEASE
elif axisvalue < 0.0:
direction = Adafruit_MotorHAT.FORWARD
if reverse:
direction = Adafruit_MotorHAT.BACKWARD
else:
direction = Adafruit_MotorHAT.BACKWARD
if reverse:
direction = Adafruit_MotorHAT.FORWARD
return direction
nt = "driver_station//joystick-0"
print("Listening to table:"+nt)
NetworkTables.initialize()
sd = NetworkTables.getTable(nt)
def valueChanged(table, key, value, isNew):
print("valueChanged: key: '%s'; value: %s; isNew: %s" % (key, value, isNew))
if key == "axis-3":
print("Axis 3 changed to %f" % value)
motorLeft.run(getDirectionFromAxisValue(value, True))
motorLeft.setSpeed(getSpeedFromAxisValue(value))
elif key == "axis-1":
print("Axis 1 changed to %f" % value)
motorRight.run(getDirectionFromAxisValue(value, True))
motorRight.setSpeed(getSpeedFromAxisValue(value))
def connectionListener(connected, info):
print(info, '; Connected=%s' % connected)
NetworkTables.addConnectionListener(connectionListener, immediateNotify=True)
sd = NetworkTables.getTable(nt)
sd.addEntryListener(valueChanged)
# set the speed to start, from 0 (off) to 255 (max speed)
motorLeft.setSpeed(150)
motorLeft.run(Adafruit_MotorHAT.FORWARD);
# turn off motor
motorLeft.run(Adafruit_MotorHAT.RELEASE);
motorRight.setSpeed(150)
motorRight.run(Adafruit_MotorHAT.FORWARD);
# turn off motor
motorRight.run(Adafruit_MotorHAT.RELEASE);
while True:
time.sleep(1)
|
|