Basic Motor Torque Control Application
In this application, you will learn how to control the torque (current) of a brushed DC motor using the Torque Mode of the SMD Red module. You will input a torque value between -100
and 100
, and observe the motor’s response. This control mode is particularly useful for applications that require force feedback, current-limited motion, or haptic interaction.
About Tools and Materials:
SMD USB Gateway (Purchase Here)
Arduino Gateway Module (Purchase Here)
Step 1: Hardware & Software Overview
Project Key Components
SMD Red: Drives the DC motor and manages current control via internal PID loop.
BDC Motor: Converts electrical energy into mechanical torque.
Project Key Features
Real-time torque input via command line
Bidirectional torque control (±100)
Live current measurement feedback
PID-based torque regulation
Step 2: Assemble
Getting Started
Hardware Setup
Connect the SMD to the PC or Arduino board using USB Gateway Module or Arduino Gateway Module.
Connect the 100 RPM BDC Motor with Encoder to the motor ports of the SMD Red.
Make sure that the SMD is powered and all connections are correct.
Project Wiring Diagram

Step 3: Run & Test
Run the Script
You will be prompted to enter a torque value in the range of -100
to 100
.
The motor will apply the specified current, and the system will print both the target and actual measured torque.
Codes
from smd.red import * # Import the SMD Red Python library
from serial.tools.list_ports import comports # Used to detect available serial (COM) ports
from platform import system # Used to identify the current operating system
import time # For time delays
# Function to automatically detect the correct USB port where SMD Red is connected
def USB_Port():
ports = list(comports()) # Get list of all serial ports
usb_names = {
"Windows": ["USB Serial Port"],
"Linux": ["/dev/ttyUSB"],
"Darwin": ["/dev/cu."] # macOS serial devices typically start with /dev/cu.
}
os_name = system()
for port, desc, _ in ports:
# Return the first matching port based on platform-specific device names
if any(name in port or name in desc for name in usb_names.get(os_name, [])):
return port
return None # If no matching port is found, return None
# Main function that sets up and runs the torque control loop
def main():
port = USB_Port()
if not port:
print("No port found.") # Exit if no SMD Red is detected
return
master = Master(port) # Create a Master object to communicate with the SMD Red
motor_id = 1 # Set the motor ID (default is 1)
# Attach the SMD Red module and configure it
master.attach(Red(motor_id)) # Attach the motor
master.set_shaft_cpr(motor_id, 6533) # Set encoder resolution (not used in torque mode, but good practice)
master.set_shaft_rpm(motor_id, 100) # Set motor's nominal speed (not critical for torque mode)
# Set torque control parameters (PID: P=3.0, I=0.1, D=0.0)
master.set_control_parameters_torque(motor_id, 3.0, 0.1, 0.0)
# Enable Torque mode
master.set_operation_mode(motor_id, OperationMode.Torque)
# Enable the motor torque output
master.enable_torque(motor_id, True)
# Loop to continuously read user input and set torque
while True:
try:
# Read torque input from user
current = float(input("Enter desired torque current (-100 to 100): "))
# Send torque value to the motor
master.set_torque(motor_id, current)
# Read and print actual measured current from the motor
measured = master.get_torque(motor_id)
print(f"Set: {current:.2f}, Measured: {measured:.2f}\n")
time.sleep(0.2) # Small delay for stability
except KeyboardInterrupt:
# On Ctrl+C, safely disable torque and exit the loop
master.enable_torque(motor_id, False)
break
# Entry point of the script
if __name__ == "__main__":
main()
Last updated