RPI Step Motor controller - Viktor Mihalovic
Contents
Project Overview:
The primary goal of the RPI Step Motor Controller project is to automate the process of controlling the height of the Oree R-t model laser arm for laser marking in production. This automation involves automatically scanning a product's serial number, retrieving information from a database, and adjusting the height of the laser arm accordingly. This project was focused on part to manage height of laser arm
Hardware Setup:
- Raspberry Pi Model 4 4GB
- Oree R-t model laser
- Step Motor: 57CM22X
- Microstep Drive: DM542
- Controller with display: MC-24MR-4MT-500-FX-A
- Bottom and top sensors: TL-Q5MC1-Z
Software Setup:
Programming Language: Python Libraries/Frameworks: RPi.GPIO, time
User Interface:
The project currently does not include a user interface. Control signals are sent automatically based on the scanned product serial number and database information.
Testing and Validation:
Testing of the functionality involves:
Challenges and Solutions:
Challenges encountered during development:
Integrating the Raspberry Pi with the Microstep Drive DM542. Ensuring accurate height adjustments based on database information. Solutions:
Using Python for GPIO control on the Raspberry Pi. Implementing specific wiring configurations for proper communication with the Microstep Drive DM542.
Code Explanation:
- Import necessary libraries
import RPi.GPIO as GPIO import time
- Set GPIO mode
GPIO.setmode(GPIO.BCM)
class Arm:
def __init__(self): # Initialize GPIO pins and variables self.settings() self.sensor_down = False self.sensor_up = False self.buttonUp = False self.buttonDown = False self.actHeight = -1 self.check_read_sensors() self.numberOfSteps = 0 # Function to initialize GPIO settings def settings(self): # Define GPIO pins for motor control, sensors, and buttons self.motor_direction_pin = 27 self.motor_step_pin = 22 self.sensor_down_pin = 23 self.buttonUpPin = 25 self.buttonDownPin = 6 self.sensor_up_pin = 24 self.delay = 0.000003 # Adjust this delay for motor speed self.pulses_per_rev = 5000 # Set pulses per revolution # Setup GPIO pins GPIO.setup(self.motor_direction_pin, GPIO.OUT) GPIO.setup(self.motor_step_pin, GPIO.OUT) GPIO.setup(self.sensor_down_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(self.sensor_up_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.setup(self.buttonUpPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(self.buttonDownPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# Function to perform a single step def step_once(self): self.numberOfSteps += 1 GPIO.output(self.motor_step_pin, True) time.sleep(self.delay) GPIO.output(self.motor_step_pin, False) time.sleep(self.delay) # Function to step the motor forward def step_forward(self): GPIO.output(self.motor_direction_pin, True) self.step_once() self.actHeight += 0.0008 # Function to step the motor in reverse def step_reverse(self): GPIO.output(self.motor_direction_pin, False) self.step_once() self.actHeight -= 0.0008
# Function to stop the motor def stopMotor(self): GPIO.output(self.motor_step_pin, False) # Function to read sensor states def check_read_sensors(self): self.sensor_down = not GPIO.input(self.sensor_down_pin) self.sensor_up = not GPIO.input(self.sensor_up_pin) self.buttonUp = not GPIO.input(self.buttonUpPin) self.buttonDown = not GPIO.input(self.buttonDownPin)
# Main function to start height adjustment def start(self): while True: self.check_read_sensors() if self.sensor_down and self.buttonDown: self.stopMotor() print('Hit bottom') continue if self.sensor_up and self.buttonUp: self.stopMotor() print('Hit top') continue if self.buttonUp and self.buttonDown: self.stopMotor() print('Both Sensors') break if self.buttonUp: self.step_forward() print('Forward') continue if self.buttonDown: self.step_reverse() print('Backward') continue self.stopMotor() GPIO.cleanup()
# Function to find the bottom position def findBottom(self): while not self.sensor_down: self.check_read_sensors() self.step_reverse() self.actHeight = 143 self.numberOfSteps = 0 # Function to move to a specified height def goto(self, height): self.check_read_sensors() if self.actHeight <= height: while round(self.actHeight,2) != round(height,2) and not self.sensor_up: self.step_forward() self.check_read_sensors() else: while round(self.actHeight,2) != round(height,2) and not self.sensor_down: self.step_reverse() self.check_read_sensors()
- Main function
if __name__ == "__main__":
print("Program has started") a = Arm() a.findBottom() print('I am at 0 cm') time.sleep(4) print('Going up to 480 mm') a.goto(480) print('I am at 480 mm') time.sleep(4) print('Going up to 200 mm') a.goto(200) print('I am at 200 mm') time.sleep(4) print('Going up to 0 mm') a.goto(0) print('Stopped at 143 mm due to height limit') GPIO.cleanup()
Conclusion:
The RPI Step Motor Controller project successfully achieves the goal of automating the process of controlling the height of the Oree R-t model laser arm. With further improvements and enhancements, it can effectively contribute to the automation of the laser marking process in production.