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()#include <Acrome-SMD.h>
#define BAUDRATE 115200 // Serial communication speed
#define ID 1 // ID of the SMD Red module
Red master(ID, Serial, BAUDRATE); // Create SMD Red object
int currentLimit = 100; // Max allowed current
bool torqueEnabled = true; // Motor torque status
void setup() {
Serial.begin(115200); // Start serial monitor
master.begin(); // Initialize communication with SMD Red
master.setOperationMode(TorqueControl); // Set operation mode to Torque Control
master.torqueEnable(1); // Enable motor torque
}
void loop() {
// Read joystick X and Y values from module 1
int joystickX = master.getJoystickX(1);
int joystickY = master.getJoystickY(1);
// Adjust current limit based on joystick direction
if (joystickX > 50 || joystickY > 50) {
currentLimit++;
} else if (joystickX < -50 || joystickY < -50) {
currentLimit--;
}
// Send torque setpoint to motor
master.setpoint(3, currentLimit - 50); // Adjust for offset
int current = master.getTorque(); // Read current draw from motor
// Debug output
Serial.print("Motor Current: "); Serial.println(current);
Serial.print("Current Limit: "); Serial.println(currentLimit);
// Safety: Disable motor if current exceeds limit
if (current >= currentLimit) {
master.torqueEnable(0); // Disable torque
torqueEnabled = false;
Serial.println("Motor disabled due to overcurrent!");
}
delay(100); // Small delay for stability
}Last updated