Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- ################################################################################
- # Copyright (c) 2016, ROBOTIS CO., LTD.
- # All rights reserved.
- #
- # Redistribution and use in source and binary forms, with or without
- # modification, are permitted provided that the following conditions are met:
- #
- # * Redistributions of source code must retain the above copyright notice, this
- # list of conditions and the following disclaimer.
- #
- # * Redistributions in binary form must reproduce the above copyright notice,
- # this list of conditions and the following disclaimer in the documentation
- # and/or other materials provided with the distribution.
- #
- # * Neither the name of ROBOTIS nor the names of its
- # contributors may be used to endorse or promote products derived from
- # this software without specific prior written permission.
- #
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- ################################################################################
- # Author: Ryu Woon Jung (Leon)
- #
- # ********* Sync Write Example *********
- #
- #
- # Available Dynamixel model on this example : All models using Protocol 1.0
- # This example is designed for using two Dynamixel MX-28, and an USB2DYNAMIXEL.
- # To use another Dynamixel model, such as X series, see their details in E-Manual(support.robotis.com) and edit below variables yourself.
- # Be sure that Dynamixel MX properties are already set as %% ID : 1 / Baudnum : 34 (Baudrate : 57600)
- #
- import os, ctypes
- if os.name == 'nt':
- import msvcrt
- def getch():
- return msvcrt.getch().decode()
- else:
- import sys, tty, termios
- fd = sys.stdin.fileno()
- old_settings = termios.tcgetattr(fd)
- def getch():
- try:
- tty.setraw(sys.stdin.fileno())
- ch = sys.stdin.read(1)
- finally:
- termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
- return ch
- os.sys.path.append('../dynamixel_functions_py') # Path setting
- import dynamixel_functions as dynamixel # Uses Dynamixel SDK library
- # Control table address
- ADDR_MX_TORQUE_ENABLE = 24 # Control table address is different in Dynamixel model
- ADDR_MX_GOAL_POSITION = 30
- ADDR_MX_PRESENT_POSITION = 36
- # Data Byte Length
- LEN_MX_GOAL_POSITION = 2
- LEN_MX_PRESENT_POSITION = 2
- # Protocol version
- PROTOCOL_VERSION = 1 # See which protocol version is used in the Dynamixel
- # Default setting
- DXL1_ID = 1 # Dynamixel ID: 1
- DXL2_ID = 2 # Dynamixel ID: 2
- DXL3_ID = 3
- BAUDRATE = 1000000
- #DEVICENAME = "/dev/ttyUSB1".encode('utf-8')# Check which port is being used on your controller
- # ex) Windows: "COM1" Linux: "/dev/ttyUSB0" Mac: "/dev/tty.usbserial-*"
- DEVICENAME = "/dev/ttyACM0".encode('utf-8')# Check which port is being used on your controller
- TORQUE_ENABLE = 1 # Value for enabling the torque
- TORQUE_DISABLE = 0 # Value for disabling the torque
- DXL_MINIMUM_POSITION_VALUE = 100 # Dynamixel will rotate between this value
- DXL_MAXIMUM_POSITION_VALUE = 4000 # and this value (note that the Dynamixel would not move when the position value is out of movable range. Check e-manual about the range of the Dynamixel you use.)
- DXL_MOVING_STATUS_THRESHOLD = 10 # Dynamixel moving status threshold
- ESC_ASCII_VALUE = 0x1b
- COMM_SUCCESS = 0 # Communication Success result value
- COMM_TX_FAIL = -1001 # Communication Tx Failed
- # Initialize PortHandler Structs
- # Set the port path
- # Get methods and members of PortHandlerLinux or PortHandlerWindows
- port_num = dynamixel.portHandler(DEVICENAME)
- # Initialize PacketHandler Structs
- dynamixel.packetHandler()
- # Initialize Groupsyncwrite instance
- group_num = dynamixel.groupSyncWrite(port_num, PROTOCOL_VERSION, ADDR_MX_GOAL_POSITION, LEN_MX_GOAL_POSITION)
- index = 0
- dxl_comm_result = COMM_TX_FAIL # Communication result
- dxl_goal_position = [DXL_MINIMUM_POSITION_VALUE, DXL_MAXIMUM_POSITION_VALUE] # Goal position
- dxl_error = 0 # Dynamixel error
- dxl1_present_position = 0 # Present position
- dxl2_present_position = 0
- # Open port
- if dynamixel.openPort(port_num):
- print("Succeeded to open the port!")
- else:
- print("Failed to open the port!")
- print("Press any key to terminate...")
- getch()
- quit()
- # Set port baudrate
- if dynamixel.setBaudRate(port_num, BAUDRATE):
- print("Succeeded to change the baudrate!")
- else:
- print("Failed to change the baudrate!")
- print("Press any key to terminate...")
- getch()
- quit()
- # Enable Dynamixel#1 Torque
- dynamixel.write1ByteTxRx(port_num, PROTOCOL_VERSION, DXL1_ID, ADDR_MX_TORQUE_ENABLE, TORQUE_ENABLE)
- dxl_comm_result = dynamixel.getLastTxRxResult(port_num, PROTOCOL_VERSION)
- dxl_error = dynamixel.getLastRxPacketError(port_num, PROTOCOL_VERSION)
- if dxl_comm_result != COMM_SUCCESS:
- print(dynamixel.getTxRxResult(PROTOCOL_VERSION, dxl_comm_result))
- elif dxl_error != 0:
- print(dynamixel.getRxPacketError(PROTOCOL_VERSION, dxl_error))
- else:
- print("Dynamixel#1 has been successfully connected")
- # Enable Dynamixel#2 Torque
- dynamixel.write1ByteTxRx(port_num, PROTOCOL_VERSION, DXL2_ID, ADDR_MX_TORQUE_ENABLE, TORQUE_ENABLE)
- dxl_comm_result = dynamixel.getLastTxRxResult(port_num, PROTOCOL_VERSION)
- dxl_error = dynamixel.getLastRxPacketError(port_num, PROTOCOL_VERSION)
- if dxl_comm_result != COMM_SUCCESS:
- print(dynamixel.getTxRxResult(PROTOCOL_VERSION, dxl_comm_result))
- elif dxl_error != 0:
- print(dynamixel.getRxPacketError(PROTOCOL_VERSION, dxl_error))
- else:
- print("Dynamixel#2 has been successfully connected")
- # Enable Dynamixel#3 Torque
- dynamixel.write1ByteTxRx(port_num, PROTOCOL_VERSION, DXL3_ID, ADDR_MX_TORQUE_ENABLE, TORQUE_ENABLE)
- dxl_comm_result = dynamixel.getLastTxRxResult(port_num, PROTOCOL_VERSION)
- dxl_error = dynamixel.getLastRxPacketError(port_num, PROTOCOL_VERSION)
- if dxl_comm_result != COMM_SUCCESS:
- print(dynamixel.getTxRxResult(PROTOCOL_VERSION, dxl_comm_result))
- elif dxl_error != 0:
- print(dynamixel.getRxPacketError(PROTOCOL_VERSION, dxl_error))
- else:
- print("Dynamixel#3 has been successfully connected")
- while 1:
- print("Press any key to continue! (or press ESC to quit!)")
- if getch() == chr(ESC_ASCII_VALUE):
- break
- dxl_addparam_result = 1
- # Add Dynamixel#1 goal position value to the Syncwrite storage
- dxl_addparam_result = ctypes.c_ubyte(dynamixel.groupSyncWriteAddParam(group_num, DXL1_ID, dxl_goal_position[index], LEN_MX_GOAL_POSITION)).value
- if dxl_addparam_result != 1:
- print("[ID:%03d] groupSyncWrite addparam failed" % (DXL1_ID))
- quit()
- # Add Dynamixel#2 goal position value to the Syncwrite parameter storage
- dxl_addparam_result = ctypes.c_ubyte(dynamixel.groupSyncWriteAddParam(group_num, DXL2_ID, dxl_goal_position[index], LEN_MX_GOAL_POSITION)).value
- if dxl_addparam_result != 1:
- print("[ID:%03d] groupSyncWrite addparam failed" % (DXL2_ID))
- # Add Dynamixel#3 goal position value to the Syncwrite parameter storage
- dxl_addparam_result = ctypes.c_ubyte(dynamixel.groupSyncWriteAddParam(group_num, DXL3_ID, dxl_goal_position[index], LEN_MX_GOAL_POSITION)).value
- if dxl_addparam_result != 1:
- print("[ID:%03d] groupSyncWrite addparam failed" % (DXL3_ID))
- # Syncwrite goal position
- dynamixel.groupSyncWriteTxPacket(group_num)
- dxl_comm_result = dynamixel.getLastTxRxResult(port_num, PROTOCOL_VERSION)
- dxl_error = dynamixel.getLastRxPacketError(port_num, PROTOCOL_VERSION)
- if dxl_comm_result != COMM_SUCCESS:
- print(dynamixel.getTxRxResult(PROTOCOL_VERSION, dxl_comm_result))
- elif dxl_error != 0:
- print(dynamixel.getRxPacketError(PROTOCOL_VERSION, dxl_error))
- # Clear syncwrite parameter storage
- dynamixel.groupSyncWriteClearParam(group_num)
- getch()
- while 1:
- # Read Dynamixel#1 present position
- dxl1_present_position = dynamixel.read2ByteTxRx(port_num, PROTOCOL_VERSION, DXL1_ID, ADDR_MX_PRESENT_POSITION)
- dxl_comm_result = dynamixel.getLastTxRxResult(port_num, PROTOCOL_VERSION)
- dxl_error = dynamixel.getLastRxPacketError(port_num, PROTOCOL_VERSION)
- if dxl_comm_result != COMM_SUCCESS:
- print(dynamixel.getTxRxResult(PROTOCOL_VERSION, dxl_comm_result))
- elif dxl_error != 0:
- print(dynamixel.getRxPacketError(PROTOCOL_VERSION, dxl_error))
- # Read Dynamixel#2 present position
- dxl2_present_position = dynamixel.read2ByteTxRx(port_num, PROTOCOL_VERSION, DXL2_ID, ADDR_MX_PRESENT_POSITION)
- dxl_comm_result = dynamixel.getLastTxRxResult(port_num, PROTOCOL_VERSION)
- dxl_error = dynamixel.getLastRxPacketError(port_num, PROTOCOL_VERSION)
- if dxl_comm_result != COMM_SUCCESS:
- print(dynamixel.getTxRxResult(PROTOCOL_VERSION, dxl_comm_result))
- elif dxl_error != 0:
- print(dynamixel.getRxPacketError(PROTOCOL_VERSION, dxl_error))
- # Read Dynamixel#3 present position
- dxl3_present_position = dynamixel.read2ByteTxRx(port_num, PROTOCOL_VERSION, DXL3_ID, ADDR_MX_PRESENT_POSITION)
- dxl_comm_result = dynamixel.getLastTxRxResult(port_num, PROTOCOL_VERSION)
- dxl_error = dynamixel.getLastRxPacketError(port_num, PROTOCOL_VERSION)
- if dxl_comm_result != COMM_SUCCESS:
- print(dynamixel.getTxRxResult(PROTOCOL_VERSION, dxl_comm_result))
- elif dxl_error != 0:
- print(dynamixel.getRxPacketError(PROTOCOL_VERSION, dxl_error))
- print("[ID:%03d] GoalPos:%03d PresPos:%03d\t[ID:%03d] GoalPos:%03d PresPos:%03d" % (DXL1_ID, dxl_goal_position[index], dxl1_present_position, DXL2_ID, dxl_goal_position[index], dxl2_present_position))
- if not ((abs(dxl_goal_position[index] - dxl1_present_position) > DXL_MOVING_STATUS_THRESHOLD) and (abs(dxl_goal_position[index] - dxl2_present_position) > DXL_MOVING_STATUS_THRESHOLD)):
- break
- # Change goal position
- if index == 0:
- index = 1
- else:
- index = 0
- # Disable Dynamixel#1 Torque
- dynamixel.write1ByteTxRx(port_num, PROTOCOL_VERSION, DXL1_ID, ADDR_MX_TORQUE_ENABLE, TORQUE_DISABLE)
- dxl_comm_result = dynamixel.getLastTxRxResult(port_num, PROTOCOL_VERSION)
- dxl_error = dynamixel.getLastRxPacketError(port_num, PROTOCOL_VERSION)
- if dxl_comm_result != COMM_SUCCESS:
- print(dynamixel.getTxRxResult(PROTOCOL_VERSION, dxl_comm_result))
- elif dxl_error != 0:
- print(dynamixel.getRxPacketError(PROTOCOL_VERSION, dxl_error))
- # Disable Dynamixel#2 Torque
- dynamixel.write1ByteTxRx(port_num, PROTOCOL_VERSION, DXL2_ID, ADDR_MX_TORQUE_ENABLE, TORQUE_DISABLE)
- dxl_comm_result = dynamixel.getLastTxRxResult(port_num, PROTOCOL_VERSION)
- dxl_error = dynamixel.getLastRxPacketError(port_num, PROTOCOL_VERSION)
- if dxl_comm_result != COMM_SUCCESS:
- print(dynamixel.getTxRxResult(PROTOCOL_VERSION, dxl_comm_result))
- elif dxl_error != 0:
- print(dynamixel.getRxPacketError(PROTOCOL_VERSION, dxl_error))
- # Disable Dynamixel#3 Torque
- dynamixel.write1ByteTxRx(port_num, PROTOCOL_VERSION, DXL3_ID, ADDR_MX_TORQUE_ENABLE, TORQUE_DISABLE)
- dxl_comm_result = dynamixel.getLastTxRxResult(port_num, PROTOCOL_VERSION)
- dxl_error = dynamixel.getLastRxPacketError(port_num, PROTOCOL_VERSION)
- if dxl_comm_result != COMM_SUCCESS:
- print(dynamixel.getTxRxResult(PROTOCOL_VERSION, dxl_comm_result))
- elif dxl_error != 0:
- print(dynamixel.getRxPacketError(PROTOCOL_VERSION, dxl_error))
- # Close port
- dynamixel.closePort(port_num)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement