PreciseFlex PF400

Hi,

I’m hoping to write a driver for the Precise Flex PF400. I noticed that PLR docs indicate a driver is coming soon-ish? Is there already a work in progress branch I can pull and contribute to? Or a defined ArmBackend base class in a branch?

Thank you,
Mike

2 Likes

Hey Mike, welcome to the forum!

We don’t have a driver or a branch for this yet. Please make one!

Hi @miikee,

Very happy to contribute to the development as well. Please let me know whether you want to make the branch or otherwise I’d make one in the next week - perfect timing :slight_smile:

The Brooks Automation PreciseFlex 400 comes (to my knowledge) in many variations:
4 Factors:

  • Horizontal reach
    • standard reach: 433 mm - becomes 579 mm w// standard gripper
    • extended reach: 588 mm - becomes 734 mm w/ standard gripper
  • Vertical reach
    • 400 mm
    • 750 mm
    • 1,160 mm
  • Integrated vision/Camera system
    • with camera
    • without camera
  • rail reach (when upgraded with the linear rail system):
    • 1 meter
    • 1.5 meter
    • 2 meter

I think we can set up a general preciseflex class that can use these design configurations as input during instantiation.

Which one do you have, so we know which one to start with? :slight_smile:

3 Likes

we also have one at retro, still in a box :see_no_evil_monkey:

it has no rails, no camera, and (by eye) 750 vertical reach.

I found this scheme in the user manual, which shows even more options than camillo shared:

our part number (PF00-MA-00400) does not conform to this format however!

anyway, always happy to help with development & testing as well!

1 Like

I don’t actually have a Precise Flex arm yet. I have some example client code, server code, and docs to build the driver from, for now. It should be enough to get some of the basics done until I can get access to a device.

Since there’s a few different forms, we can pick whatever form you’re working with. The 750 mm, no rail, no cam is probably a good starting point.

As for creating the branch, I don’t think I have the ability to create a branch on the PLR repo.

1 Like

sounds good! happy to test on our hardware! it hasn’t been used yet and won’t be in the immediate future, so plenty of opportunity for development!

You’d have to create a fork. See this for instructions:

and let me know if i can help with anything

1 Like

I started a branch on Cheshire Labs’ pyLabRobot fork:

This adds:

  • ArmBackend base class
  • PreciseFlexBackend
  • TCP(IOBase) class
  • Arm front end class

Nothing has been tested yet, but it’s a start.

2 Likes

wow! that was fast.

I look forward to testing it out, probably on Friday (tomorrow is quite busy)

If you want you can create a pull request easily from this page: Comparing PyLabRobot:main...Cheshire-Labs:dev-precise-flex-pf400 · PyLabRobot/pylabrobot · GitHub

I submitted a PR to the main branch with a warning in the backend’s docstring saying it hasn’t been tested yet.

Hopefully the code’s not too far off the mark. Blind coding without the device connected usually ends up being pretty buggy.

No rush on testing from my end. I don’t have access to the device anyways, so it’s mostly just a rough template to build out an Orca adapter on my end, for now.

Thank you for the help @rickwierenga and @CamilloMoschner !

2 Likes

This if fantastic @miikee!

I will be building this up further when I receive my SCARA :slight_smile:

Quick question: Have you added tests to ensure the functionality you need is checked during further development by the community?

I think it’s just a draft based on the documentation. I will write a test when I physically test it

1 Like

Hello, My name is Mike with Brooks Automation. I’d be happy to assist with API information and documentation for driver development.

3 Likes

that’s amazing! thank you so much!

Feel free to contact me on Linkedin: Mike Ouren - Brooks Automation | LinkedIn

2 Likes

@CamilloMoschner, I haven’t written tests yet. For now, it’s just a draft until there’s a device connected. I should be able to get access to an arm around mid-August, I think.

@mike, great! Thanks for the help! I’ll send you a connection request.

2 Likes

does anyone know if the robot has a self assigned IP? if so, what is it? if no, how to discover it?

where did you find to use port 10100

the user guide says “See the Setup and Operation Quick Start Guide for instructions on setting the IP address for the controller”

what is the ‘Setup and Operation Quick Start Guide’? i can’t find it

answer

user guide says “Open a browser in a PC that is connected to the robot via Ethernet. The user must know the IP address of the robot controller. Two common IP addresses are 192.168.0.1 and 192.168.0.10. The PC LAN interface address must be configured correctly (for example 192.168.0.100, with subnet mask 255.255.255.0).”

192.168.0.1 works for me (for web interface at least)

1 Like

port 3000 works for me for the api

nmap:

PORT     STATE SERVICE
21/tcp   open  ftp
23/tcp   open  telnet
80/tcp   open  http
3000/tcp open  ppp
3001/tcp open  nessus
1 Like
---------------------------------------------------------------------------
PreciseFlexError                          Traceback (most recent call last)
Cell In[3], line 2
      1 a = Arm(backend=PreciseFlexBackend(host="192.168.0.1", port=3000))
----> 2 await a.setup()

File ~/real/pylabrobot/pylabrobot/machines/machine.py:63, in Machine.setup(self, **backend_kwargs)
     62 async def setup(self, **backend_kwargs):
---> 63   await self.backend.setup(**backend_kwargs)
     64   self._setup_finished = True

File ~/real/pylabrobot/pylabrobot/arms/precise_flex/preciseflex_backend.py:23, in PreciseFlexBackend.setup(self)
     21 await self.io.setup()
     22 await self.power_on_robot()
---> 23 await self.attach()

File ~/real/pylabrobot/pylabrobot/arms/precise_flex/preciseflex_backend.py:159, in PreciseFlexBackend.attach(self)
    157 async def attach(self):
    158   """Attach the robot."""
--> 159   await self.send_command("attach 1")

File ~/real/pylabrobot/pylabrobot/arms/precise_flex/preciseflex_backend.py:223, in PreciseFlexBackend.send_command(self, command)
    221 await self.io.write(command.encode('utf-8') + b'\n')
    222 reply = await self.io.readline()
--> 223 return self._parse_reply_ensure_successful(reply)
...
    248   # if error is reported, the data part generally contains the error message
--> 249   raise PreciseFlexError(replycode, data)
    251 return data

PreciseFlexError: PreciseFlexError >>-2808: *Not allowed by this thread*