def main(): parser = ArgumentParser(description='Set a dynamixel motor to' ' a "poppy-like" configuration. ' 'Only one motor should be connected!') parser.add_argument(dest='id', type=int, help='Dynamixel target #id.') parser.add_argument('-p', '--port', default=None, choices=get_available_ports(), help='Serial port, default: autoselect') parser.add_argument( '--log-level', default='ERROR', help='Log level : CRITICAL, ERROR, WARNING, INFO, DEBUG') parser.add_argument('--position', type=float, default=0.0, help='Position set to the motor (in degrees)') parser.add_argument('--angle-limit', type=float, nargs=2, default=[-150, 150], help='Angle limits of the motor (in degrees)') args = parser.parse_args() if not (1 <= args.id <= 253): leave('Motor id should be in range [1:253]!') log_level = args.log_level.upper() logger.setLevel(log_level) # First, we make sure that there is at least one available ports try: port = get_available_ports()[0] except IndexError: leave('You need to connect at least one dynamixel port!') print('Resetting to factory settings...') for br in [FACTORY_BAUDRATE, TARGET_BAUDRATE]: with DxlIO(port, br) as dxl: dxl.factory_reset() time.sleep(.5) print('Done!') print('Setting the motor to a "poppy" configuration') with DxlIO(port, FACTORY_BAUDRATE) as dxl: # We make sure that there was only one motor on the bus try: assert dxl.scan([1]) == [1] except AssertionError: leave('No motor found, check the connection!') except DxlError: leave('You should only connect one motor at' ' a time when doing factory reset!') if args.id != 1: print('Changing the id to {}...'.format(args.id)) dxl.change_id({1: args.id}) print('Changing the return delay time to {}...'.format(0)) dxl.set_return_delay_time({args.id: 0}) print('Changing the angle limit to {}...').format(args.angle_limit) dxl.set_angle_limit({args.id: args.angle_limit}) print('Changing the baudrate to {}...'.format(TARGET_BAUDRATE)) dxl.change_baudrate({args.id: TARGET_BAUDRATE}) time.sleep(.5) print('Done!') print('Now, checking that everything went well...') with DxlIO(port) as dxl: try: assert dxl.ping(args.id) assert dxl.get_return_delay_time([args.id]) == (0, ) except AssertionError: leave('Something went wrong with the settings of "Poppy-like"' ' motors configuration.\nThis is probably due to' ' a communication error. Please try again.') lim = dxl.get_angle_limit([args.id])[0] if not all(map(almost_equal, lim, args.angle_limit)): print('Angle limit incorrect set {} instead of {}'.format( lim, args.angle_limit)) dxl.set_goal_position({args.id: args.position}) while any(dxl.is_moving((args.id, ))): time.sleep(.1) pos = dxl.get_present_position((args.id, ))[0] if not almost_equal(args.position, pos): print('Target position not reached: {} instead of {}.'.format( pos, args.position)) print('Done!')
parser = argparse.ArgumentParser() parser.add_argument('-l', '--log-folder', type=str, required=True) parser.add_argument('-N', type=int, required=True) args = parser.parse_args() bp = args.log_folder if os.path.exists(bp): raise IOError('Folder already exists: {}'.format(bp)) os.mkdir(bp) available_ports = get_available_ports() port = available_ports[0] print('Connecting on port {}.'.format(port)) dxl = DxlIO(port) print('Scanning motors on the bus...') ids = dxl.scan() print('Found {}'.format(ids)) ids = ids[:1] print('Will use id: {}'.format(ids)) if dxl.get_return_delay_time(ids)[0] != 0: raise IOError('Make sure your motor has return delay time set to 0') print('Start testing !') print('Using "normal" pypot package...') def rw_pypot():
def main(): available_ports = get_available_ports() default_port = available_ports[0] if available_ports else None parser = ArgumentParser(description='Configuration tool for dynamixel motors ' 'WARNING: ONLY ONE MOTOR SHOULD BE ' 'CONNECTED TO THE BUS WHEN CONFIGURING!', formatter_class=ArgumentDefaultsHelpFormatter) parser.add_argument('--id', type=int, required=True, help='Chosen motor id.') parser.add_argument('--type', type=str, required=True, choices=dynamixelModels.values(), help='Type of the motor to configure.') parser.add_argument('--port', type=str, choices=available_ports, default=default_port, help='Serial port connected to the motor.') parser.add_argument('--return-delay-time', type=int, help='Set new return delay time.') parser.add_argument('--wheel-mode', type=bool, default=False, help='Set wheel mode.') parser.add_argument('--angle-limit', type=float, nargs=2, help='Set new angle limit.') parser.add_argument('--goto-zero', action='store_true', help='Go to zero position after configuring the motor') args = parser.parse_args() check(1 <= args.id <= 253, 'Motor id must be in range [1:253]') check(available_ports, 'Could not find an available serial port!') protocol = 2 if args.type in 'XL-320' else 1 DxlIOPort = DxlIO if protocol == 1 else Dxl320IO # Factory Reset print('Factory reset...') if protocol == 1: for br in [57600, 1000000]: with DxlIO(args.port, baudrate=br) as io: io.factory_reset() else: with Dxl320IO(args.port, baudrate=1000000, timeout=0.01) as io: io.factory_reset(ids=range(253)) print('Done!') factory_baudrate = 57600 if args.type.startswith('MX') else 1000000 # Wait for the motor to "reboot..." for _ in range(10): with DxlIOPort(args.port, baudrate=factory_baudrate) as io: if io.ping(1): break time.sleep(.5) else: print('Could not communicate with the motor...') print('Make sure one (and only one) is connected and try again') sys.exit(1) # Switch to 1M bauds if args.type.startswith('MX') or args.type.startswith('SR'): print('Changing to 1M bauds...') with DxlIO(args.port, baudrate=factory_baudrate) as io: io.change_baudrate({1: 1000000}) time.sleep(.5) print('Done!') # Change id print('Changing id to {}...'.format(args.id)) if args.id != 1: with DxlIOPort(args.port) as io: io.change_id({1: args.id}) time.sleep(.5) check(io.ping(args.id), 'Could not change id to {}'.format(args.id)) print('Done!') # Set return delay time if args.return_delay_time is not None: print('Changing return delay time to {}...'.format(args.return_delay_time)) with DxlIOPort(args.port) as io: io.set_return_delay_time({args.id: args.return_delay_time}) time.sleep(.5) check(io.get_return_delay_time([args.id])[0] == args.return_delay_time, 'Could not set return delay time to {}'.format(args.return_delay_time)) print('Done!') # Set wheel Mode if args.wheel_mode == True: print('Set wheel mode') with DxlIOPort(args.port) as io: io.set_control_mode({args.id :'wheel'}) time.sleep(.5) check(io.get_control_mode([args.id])[0] == 'wheel', 'Could not set wheel Mode') print('Done!') # Set Angle Limit if args.angle_limit is not None: print('Changing angle limit to {}...'.format(args.angle_limit)) with DxlIOPort(args.port) as io: io.set_angle_limit({args.id: args.angle_limit}) time.sleep(.5) check(all(map(lambda p1, p2: abs(p1 - p2) < 1., io.get_angle_limit([args.id])[0], args.angle_limit)), 'Could not change angle limit to {}'.format(args.angle_limit)) print('Done!') # GOTO ZERO if args.goto_zero: print('Going to position 0...') with DxlIOPort(args.port) as io: io.set_moving_speed({args.id: 100.0}) io.set_goal_position({args.id: 0.0}) time.sleep(2.0) check(abs(io.get_present_position([args.id])[0]) < 5, 'Could not go to 0 position') print('Done!')
if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('-l', '--log-folder', type=str, required=True) parser.add_argument('-N', type=int, required=True) args = parser.parse_args() bp = args.log_folder if os.path.exists(bp): raise IOError('Folder already exists: {}'.format(bp)) os.mkdir(bp) available_ports = get_available_ports() port = available_ports[0] print('Connecting on port {}.'.format(port)) dxl = DxlIO(port) print('Scanning motors on the bus...') ids = dxl.scan() print('Found {}'.format(ids)) ids = ids[:1] print('Will use id: {}'.format(ids)) if dxl.get_return_delay_time(ids)[0] != 0: raise IOError('Make sure your motor has return delay time set to 0') print('Start testing !') print('Using "normal" pypot package...')
import time from pypot.dynamixel import get_available_ports, DxlIO max_temp = 55 if __name__ == '__main__': ports = get_available_ports() if '/dev/ttyAMA0' in ports: ports.remove('/dev/ttyAMA0') for p in ports: print('Looking for motors on port "{}"'.format(p)) with DxlIO(p) as io: ids = io.scan(range(30)) print('Ids found: {}'.format(ids)) print('Setting max temperature to "{}C"...'.format(max_temp)) io.set_highest_temperature_limit({id: max_temp for id in ids}) print('Done.') time.sleep(1.0)