From bed49f6370bff14d80a685c37fea4d387f88295f Mon Sep 17 00:00:00 2001 From: Danny Staple Date: Sun, 26 Jan 2025 11:00:28 +0000 Subject: [PATCH 1/7] Add local install to ignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5d2aa39..8bc3617 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ __pycache__ *.pyc .idea *.dll +*.egg-info From 7dcd51accd48f10a885ae04cc44321e2522a8380 Mon Sep 17 00:00:00 2001 From: Danny Staple Date: Sun, 26 Jan 2025 12:16:32 +0000 Subject: [PATCH 2/7] Park demos for more fixing --- demos/key_ctrl.py | 40 +++++++++++++++++++++++++--------------- demos/simple.py | 13 +++++++++++++ 2 files changed, 38 insertions(+), 15 deletions(-) create mode 100644 demos/simple.py diff --git a/demos/key_ctrl.py b/demos/key_ctrl.py index f7503a9..7ea02b3 100644 --- a/demos/key_ctrl.py +++ b/demos/key_ctrl.py @@ -1,16 +1,21 @@ """key_ctrl - key based arm controller""" from functools import partial -import owi_maplin_robot_arm +import logging +import sys + import pygame from pygame.locals import * -import sys + +import owi_maplin_usb_arm as usb_arm def handle_key(arm, delay, key_map, key): def do_it(): if key in key_map: - print("Doing key ", key) - arm.move(key_map[key], delay) + message = key_map[key] + print("Key ", key, "Movement message", message) + + arm.move(message, delay) arm.safe_tell(do_it) @@ -18,22 +23,23 @@ def make_keymap(): """Bp - an initialised arm bitpattern. returns the keymap""" return { - K_z: owi_maplin_robot_arm.BaseClockWise, - K_x: owi_maplin_robot_arm.BaseCtrClockWise, - K_r: owi_maplin_robot_arm.CloseGrips, - K_f: owi_maplin_robot_arm.OpenGrips, - K_a: owi_maplin_robot_arm.ShoulderDown, - K_q: owi_maplin_robot_arm.ShoulderUp, - K_s: owi_maplin_robot_arm.ElbowDown, - K_w: owi_maplin_robot_arm.ElbowUp, - K_d: owi_maplin_robot_arm.WristDown, - K_e: owi_maplin_robot_arm.WristUp} + K_z: usb_arm.BaseClockWise, + K_x: usb_arm.BaseCtrClockWise, + K_r: usb_arm.CloseGrips, + K_f: usb_arm.OpenGrips, + K_a: usb_arm.ShoulderDown, + K_q: usb_arm.ShoulderUp, + K_s: usb_arm.ElbowDown, + K_w: usb_arm.ElbowUp, + K_d: usb_arm.WristDown, + K_e: usb_arm.WristUp, + K_l: usb_arm.LedOn} def key_loop(): km = make_keymap() try: - arm = owi_maplin_robot_arm.Arm() + arm = usb_arm.Arm() except AttributeError: print("Please make sure the arm is connected and turned on") sys.exit(1) @@ -53,7 +59,11 @@ def key_loop(): def main(): + logging.basicConfig() + usb_arm.logger.setLevel(logging.DEBUG) pygame.init() + pygame.display.set_mode([200, 200]) + print("Press z/x to turn the base motor") key_loop() diff --git a/demos/simple.py b/demos/simple.py new file mode 100644 index 0000000..c638fb1 --- /dev/null +++ b/demos/simple.py @@ -0,0 +1,13 @@ +import usb_robot_arm as usb_arm +import logging + +logging.basicConfig(level=logging.DEBUG) + +arm = usb_arm.Arm() + +arm.move(usb_arm.LedOn) +print("Wrist up") +arm.move(usb_arm.WristUp) +print("Wrist down") +arm.move(usb_arm.WristDown) + From 51593af2645183491a5ef4666f29211e795e7af0 Mon Sep 17 00:00:00 2001 From: Danny Staple Date: Sun, 26 Jan 2025 13:24:37 +0000 Subject: [PATCH 3/7] Sort out keyboard demos a bit --- .gitignore | 1 + demos/{key_ctrl.py => pg_key_ctrl.py} | 2 +- demos/sh_key_ctrl.py | 65 +++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) rename demos/{key_ctrl.py => pg_key_ctrl.py} (97%) create mode 100644 demos/sh_key_ctrl.py diff --git a/.gitignore b/.gitignore index 8bc3617..d0ad507 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ __pycache__ .idea *.dll *.egg-info +.vscode diff --git a/demos/key_ctrl.py b/demos/pg_key_ctrl.py similarity index 97% rename from demos/key_ctrl.py rename to demos/pg_key_ctrl.py index 7ea02b3..57a7f44 100644 --- a/demos/key_ctrl.py +++ b/demos/pg_key_ctrl.py @@ -1,4 +1,4 @@ -"""key_ctrl - key based arm controller""" +"""Pygame key_ctrl - key based arm controller""" from functools import partial import logging import sys diff --git a/demos/sh_key_ctrl.py b/demos/sh_key_ctrl.py new file mode 100644 index 0000000..80efc5e --- /dev/null +++ b/demos/sh_key_ctrl.py @@ -0,0 +1,65 @@ +"""Console keyboard based arm controller. +Requires readchar +""" +from functools import partial +import logging +import sys + +from readchar import readchar, key + +import owi_maplin_usb_arm as usb_arm + + +KEYMAP = { + 'z': usb_arm.BaseClockWise, + 'x': usb_arm.BaseCtrClockWise, + 'r': usb_arm.CloseGrips, + 'f': usb_arm.OpenGrips, + 'a': usb_arm.ShoulderDown, + 'q': usb_arm.ShoulderUp, + 's': usb_arm.ElbowDown, + 'w': usb_arm.ElbowUp, + 'd': usb_arm.WristDown, + 'e': usb_arm.WristUp, + 'l': usb_arm.LedOn +} + +def handle_key(arm, delay, pressed_key): + def do_it(): + if pressed_key in KEYMAP: + message = KEYMAP[pressed_key] + print("Key ", pressed_key, "Movement message", message) + + arm.move(message, delay) + arm.safe_tell(do_it) + + +def key_loop(): + try: + arm = usb_arm.Arm() + except AttributeError: + print("Please make sure the arm is connected and turned on") + sys.exit(1) + handle = partial(handle_key, arm, 0.5) + exit_key = key.ESC + + while True: + pressed_key = readchar() + if pressed_key == exit_key: + return + else: + handle(pressed_key) + +def main(): + logging.basicConfig() + usb_arm.logger.setLevel(logging.DEBUG) + print("Press z/x to turn the base motor") + print("Press a/q to move the shoulder up/down") + print("Press w/s to move the elbow up/down") + print("Press e/d to move the wrist up/down") + print("Press r/f to close/open the grips") + print("Press l to toggle the LED") + print("Press ESC to exit") + key_loop() + +main() From bb4ece95d31f54dd8d44d47a0699f145d9bb306b Mon Sep 17 00:00:00 2001 From: Danny Staple Date: Sun, 26 Jan 2025 16:59:18 +0000 Subject: [PATCH 4/7] Simplify --- demos/sh_key_ctrl.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/demos/sh_key_ctrl.py b/demos/sh_key_ctrl.py index 80efc5e..70bdae2 100644 --- a/demos/sh_key_ctrl.py +++ b/demos/sh_key_ctrl.py @@ -4,8 +4,9 @@ from functools import partial import logging import sys +import time -from readchar import readchar, key +from readchar import readkey, key import owi_maplin_usb_arm as usb_arm @@ -24,15 +25,12 @@ 'l': usb_arm.LedOn } -def handle_key(arm, delay, pressed_key): - def do_it(): - if pressed_key in KEYMAP: - message = KEYMAP[pressed_key] - print("Key ", pressed_key, "Movement message", message) - - arm.move(message, delay) - arm.safe_tell(do_it) +def handle_key(arm, pressed_key): + if pressed_key in KEYMAP: + message = KEYMAP[pressed_key] + print("Key ", pressed_key, "Movement message", message) + arm.move(message, 0.5) def key_loop(): try: @@ -40,15 +38,16 @@ def key_loop(): except AttributeError: print("Please make sure the arm is connected and turned on") sys.exit(1) - handle = partial(handle_key, arm, 0.5) + handle = partial(handle_key, arm) exit_key = key.ESC while True: - pressed_key = readchar() + pressed_key = readkey() if pressed_key == exit_key: return else: handle(pressed_key) + time.sleep(0.1) def main(): logging.basicConfig() From c1ba2d2a1631f6f9f1446d3330b1db8e572038e0 Mon Sep 17 00:00:00 2001 From: Danny Staple Date: Sun, 26 Jan 2025 17:13:15 +0000 Subject: [PATCH 5/7] Support simultaneous movement in pygame demo --- demos/pg_key_ctrl.py | 86 ++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 38 deletions(-) diff --git a/demos/pg_key_ctrl.py b/demos/pg_key_ctrl.py index 57a7f44..14974fe 100644 --- a/demos/pg_key_ctrl.py +++ b/demos/pg_key_ctrl.py @@ -8,54 +8,58 @@ import owi_maplin_usb_arm as usb_arm - -def handle_key(arm, delay, key_map, key): - def do_it(): - if key in key_map: - message = key_map[key] - print("Key ", key, "Movement message", message) - - arm.move(message, delay) - arm.safe_tell(do_it) - - -def make_keymap(): - """Bp - an initialised arm bitpattern. - returns the keymap""" - return { - K_z: usb_arm.BaseClockWise, - K_x: usb_arm.BaseCtrClockWise, - K_r: usb_arm.CloseGrips, - K_f: usb_arm.OpenGrips, - K_a: usb_arm.ShoulderDown, - K_q: usb_arm.ShoulderUp, - K_s: usb_arm.ElbowDown, - K_w: usb_arm.ElbowUp, - K_d: usb_arm.WristDown, - K_e: usb_arm.WristUp, - K_l: usb_arm.LedOn} +def handle_keys_held(arm): + pressed_keys = pygame.key.get_pressed() + pattern = usb_arm.Stop + if pressed_keys[K_z]: + pattern = pattern | usb_arm.BaseClockWise + elif pressed_keys[K_x]: + pattern = pattern | usb_arm.BaseCtrClockWise + if pressed_keys[K_a]: + pattern = pattern | usb_arm.ShoulderDown + elif pressed_keys[K_q]: + pattern = pattern | usb_arm.ShoulderUp + if pressed_keys[K_s]: + pattern = pattern | usb_arm.ElbowDown + elif pressed_keys[K_w]: + pattern = pattern | usb_arm.ElbowUp + if pressed_keys[K_d]: + pattern = pattern | usb_arm.WristDown + elif pressed_keys[K_e]: + pattern = pattern | usb_arm.WristUp + if pressed_keys[K_r]: + pattern = pattern | usb_arm.CloseGrips + elif pressed_keys[K_f]: + pattern = pattern | usb_arm.OpenGrips + if pressed_keys[K_l]: + pattern = pattern | usb_arm.LedOn + arm.tell(pattern) def key_loop(): - km = make_keymap() try: arm = usb_arm.Arm() except AttributeError: print("Please make sure the arm is connected and turned on") sys.exit(1) - handle = partial(handle_key, arm, 0.5, km) - exit_key = K_ESCAPE - while True: - for event in pygame.event.get(): - if event.type == QUIT: - pygame.quit() - return - if event.type == KEYDOWN: - if event.key == exit_key: + pygame.clock = pygame.time.Clock() + FPS = 50 + + try: + while True: + for event in pygame.event.get(): + if event.type == QUIT: + pygame.quit() return - else: - handle(event.key) + if event.type == KEYDOWN: + if event.key == K_ESCAPE: + pygame.quit() + return + handle_keys_held(arm) + pygame.clock.tick(FPS) + finally: + arm.tell(usb_arm.Stop) def main(): @@ -64,6 +68,12 @@ def main(): pygame.init() pygame.display.set_mode([200, 200]) print("Press z/x to turn the base motor") + print("Press a/q to move the shoulder up/down") + print("Press w/s to move the elbow up/down") + print("Press e/d to move the wrist up/down") + print("Press r/f to close/open the grips") + print("Press l to toggle the LED") + print("Press ESC to exit") key_loop() From 0c4d78289e7aa17838bee1b9ed45ac2f82425cd5 Mon Sep 17 00:00:00 2001 From: Danny Staple Date: Sun, 26 Jan 2025 17:14:21 +0000 Subject: [PATCH 6/7] Fix the simple demo --- demos/simple.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/simple.py b/demos/simple.py index c638fb1..8e24b36 100644 --- a/demos/simple.py +++ b/demos/simple.py @@ -1,4 +1,4 @@ -import usb_robot_arm as usb_arm +import owi_maplin_usb_arm as usb_arm import logging logging.basicConfig(level=logging.DEBUG) From f9878dac17b2eab93cc569b567aa09b9bf3bdbef Mon Sep 17 00:00:00 2001 From: Danny Staple Date: Sun, 26 Jan 2025 17:19:45 +0000 Subject: [PATCH 7/7] Use the symbolic request type --- owi_maplin_usb_arm/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/owi_maplin_usb_arm/__init__.py b/owi_maplin_usb_arm/__init__.py index e8417dd..d2e1ca9 100755 --- a/owi_maplin_usb_arm/__init__.py +++ b/owi_maplin_usb_arm/__init__.py @@ -73,7 +73,7 @@ def __init__(self): def tell(self, msg): """Send a USB messaqe to the arm""" - bmRequestType = 0x40 + bmRequestType = usb.TYPE_VENDOR bRequest = 6 wValue = 0x100 wIndex = 0