Sciencemadness Discussion Board
Not logged in [Login ]
Go To Bottom

Printable Version  
Author: Subject: Using a computer to control a pump/motor using whatever means possible
BromicAcid
International Hazard
*****




Posts: 3112
Registered: 13-7-2003
Location: Wisconsin
Member Is Offline

Mood: Legitimate

[*] posted on 8-2-2016 at 16:22
Using a computer to control a pump/motor using whatever means possible


What I have is a Masterflex L/S peristaltic pump. What I want to do is to be able to control the speed of the pump using the computer. Amusingly enough the company that sells these pumps, Cole-Parmer, used to sell the software to do so but it has only a few reviews, all of them bad, and it has since been discontinued:

Masterflex Linkable Instrument Control Software, CD-ROM

Anyway, I don't need any sort of fancy interface. Attached is the diagram showing the pin outputs for the DB-25 input on the back of the pump. I have taken a DB-25 cable, stripped the leads and messed around with hot-wiring the thing to get it to do my bidding. What my thought is, is that the pump can be controlled using an input voltage from 0-10V to determine the speed. If I can setup a digital potentiometer to regulate that voltage and control it using the computer I should be in, right?

But this is where I say I know hardly anything about this, it took me several hours of searching to be able to be able to propose that scenario in the previous sentence using the correct terminology (hopefully). I am hoping that one of the more technically inclined members of this website can point me in a more concrete direction. I get the feeling that I am going to need Arduino or Raspberry Pi to control the thing but I don't know exactly where to start.

The current output that the program I am trying to use gives currently is a integer from 100-1500 but I can adjust that in the program. Still, that is what I have to work with on interface. This is low priority for me (my last post on the programming end of this project was 8 months ago) but it's still something that bugs the heck out of me. That I can browse these webpages for a couple hours a day and still be pulling my hair in frustration. It seems like such a simple thing, how do I use a computer to control a voltage output (or the crux of the matter, how do I control a pump) but I have had few leads on the subject.

Please, just any help focusing me in the right direction would be appreciated. If you say "I know this can be done with Pi." At least that might be a place to start.

This is a continuation of my project started in Help with Python program to control pump via electronic eye feedback. In that thread users (mostly mayko) helped troubleshoot a python script that I found in the literature to get it to run on my computer. Once I get this thread posted I will go back to that thread and put up the final script.

Pump Inputs.jpg - 84kB

Edit: Changed the title of the thread.

[Edited on 2/9/2016 by BromicAcid]




Shamelessly plugging my attempts at writing fiction: http://www.robvincent.org
View user's profile Visit user's homepage View All Posts By User
m1tanker78
International Hazard
*****




Posts: 685
Registered: 5-1-2011
Member Is Offline

Mood: No Mood

[*] posted on 8-2-2016 at 17:33


Let me see if I understand this correctly...

Your pump has control circuitry which converts an analog voltage to speed? 0 volts = off and 10 volts = max speed?

No modern microcontroller or FPGA will directly output 10V. Either can, however, control a DAC (Digital to Analog Converter) which can be amplified to raise the voltage swing or match the impedance of the pump controller. You can also easily implement a PWM (Pulse Width Modulator), boost and match, etc.

In the meantime, you might want to look for PWM and DAC on the search engine. Either one will convert a digital value into an analog voltage with proper filtering and matching. A digital potentiometer is basically a low resolution DAC. Does the pump provide some sort of feedback to indicate RPM?

EDIT:
I hadn't seen the image you attached. That helps a lot! You do have a tachometer output and it seems you can not only control the speed with a voltage source but also with a current source. What isn't clear to me is how CW/CCW is controlled. My guess is that you provide 5V at the 'prime gnd ref' pin then the direction and speed of the motor is centered around 5V. 5V would then be 'not running', 0V would be max speed CW and 10V would be max speed CCW (or vice-versa).

[Edited on 2-9-2016 by m1tanker78]




Chemical CURIOSITY KILLED THE CATalyst.
View user's profile View All Posts By User
BromicAcid
International Hazard
*****




Posts: 3112
Registered: 13-7-2003
Location: Wisconsin
Member Is Offline

Mood: Legitimate

[*] posted on 8-2-2016 at 18:02


m1tanker78, thank you for your help! I will look into the ideas that you suggested and post back here if I can figure anything out.

By the way, do you mention controlling the pump speed with a variable current rather than voltage because it is easier that way?




Shamelessly plugging my attempts at writing fiction: http://www.robvincent.org
View user's profile Visit user's homepage View All Posts By User
m1tanker78
International Hazard
*****




Posts: 685
Registered: 5-1-2011
Member Is Offline

Mood: No Mood

[*] posted on 8-2-2016 at 18:32


Not necessarily easier. If your motor speed is a function of voltage (and what I asserted before is true), you must supply the circuit a [edit] virtual ground ideally 1/2 Vmax.

The linear current source might simplify using, say, a microcontroller with fewer external components to control the motor. There may be a clever way to do it nearly directly though I still don't understand the CW/CCW control. I'll check some specs and get back. If you come across any other literature -- maybe for a different manufacturer -- post it here.

[Edited on 2-9-2016 by m1tanker78]




Chemical CURIOSITY KILLED THE CATalyst.
View user's profile View All Posts By User
m1tanker78
International Hazard
*****




Posts: 685
Registered: 5-1-2011
Member Is Offline

Mood: No Mood

[*] posted on 8-2-2016 at 20:04


Looking over the product manual:
http://www.masterflex.com/Assets/manual_pdfs/masterflex-ls-i...
I envisioned something completely different. I see now that you're trying to automate the operation with input from a float position. Disregard the business about the virtual ground reference. The device has an internal ADC which converts the 0-10V to a digitized speed (flow control) setting. It would seem that when the 'prime' mode is active, the voltage reference is disregarded and it runs at full speed...

Included in the manual is a truth table for each mode of operation. I assume you based your hot-wiring trials on that. I don't fully understand what is meant by 'dispense' and 'continuous'. You could probably get away with controlling the analog reference with a single transistor and a handful of passive components. The transistor would be driven by a filtered PWM or possibly directly from a DAC which I understand are commonly standard to arduino and other microcontrollers.

If you don't mind running the pump at a constant speed and triggering when level gets below certain point and stopping when level reaches or exceeds that point then you can just rig the analog input to your desired flow rate (say 7V) and control the pump with the START/STOP pin. Where you see 'CLOSED' in the literature, it refers to the pin being grounded. Where you see 'OPEN', it means the pin is left floating. A floating state can be achieved by setting the micro pin to high impedance (or hi-z). This mode of operation would be dead easy and you can implement some measures in your Python script to prevent the pump from starting/stopping continuously if the liquid is sloshing or the imaging script produces noisy results.

If I understand correctly, the CW/CCW operates similarly. I'll need to take another look though.




Chemical CURIOSITY KILLED THE CATalyst.
View user's profile View All Posts By User
phlogiston
International Hazard
*****




Posts: 1350
Registered: 26-4-2008
Location: Neon Thorium Erbium Lanthanum Neodymium Sulphur
Member Is Offline

Mood: pyrophoric

[*] posted on 9-2-2016 at 05:01


Yes, the manual indicates the CW/CCW is an open collector pin. When this pin is grounded the pump is driven CCW.

I also believe the current control pin is the easiest option. It allows you to operate from a single 5V supply with very few components.
You could simply connect 8 pins of a microcontroller/raspberry/whatever directly to the pump current control pin with 8 resistors in R2R ladder style. Outputting a byte on the 8 pins then sets the pump speed.

Bromic, what is the format of the data that is written to the serial port?




-----
"If a rocket goes up, who cares where it comes down, that's not my concern said Wernher von Braun" - Tom Lehrer
View user's profile View All Posts By User
BromicAcid
International Hazard
*****




Posts: 3112
Registered: 13-7-2003
Location: Wisconsin
Member Is Offline

Mood: Legitimate

[*] posted on 9-2-2016 at 15:23


Quote: Originally posted by phlogiston  
Bromic, what is the format of the data that is written to the serial port?


The program uses pySerial for communications. When the program is run the following defaults are used:


Quote:

pump1.port = (int(raw_input('Please enter the serial port number (COMM X) of the first pump.')) - 1)
pump1.baudrate = int(4800)#int(raw_input('Please enter the baudrate of the first pump.'))
pump1.open()
#pump1.write('on \x0D')
config_dict[1] = raw_input('Please select the configuration of the first pump. (1 = heavy phase pumped out, 2 = light phase pumped out)')
time.sleep(0.15)
pump1.write('FLOW:100 \x0D') #initial flow rate; flow is in units of microliters per minute (100 = 0.1 mL/min)

spd_dict = {1:1000, 2:1000, 3:1000} #1 = pumpspeed_1, 2 = pumpspeed_2, 3 = pumpspeed_3
ser_dict = {1:pump1, 2:pump2, 3:pump3}


After finding that information relating to the serial port in the program I actually looked up what Serial Data Format meant. Are you looking for: "number of data bits - parity type - number of stop bits"? If so I do not see that defined in the program. I looked up some of the other programs using pyserial and they define that in the program itself but I don't see anything here.

What exactly does a CW/CCW pin do? Looking up CW/CCW I could only find that it meant clock wise / counter clock wise and that it controlled the direction of the motor.

@m1tanker78: Yes, 'prime mode' is to get the pump primed so it runs all out. Dispense mode lets you put in a go-to time and when it is triggered it will run for that amount of time and stop (so there is one trigger for it). The continuous mode is exactly that, the pump turns on and keeps running. My hot wiring of this involved using two reed switches and putting a magnet in a float at the interface. When the level of the interface got high enough it would trigger the continuous run at the speed that I defined in the pump. If the volume dropped the magnet would go out of range of the switch and stop. If the volume continued to climb I had the second reed switch hot wired to the prime option and it would run the pump at full speed to lower it back to the continuous switch. It works but it's not pretty although it is similar to what you propose as an alternate method as well.

You mentioned the PWM in your first post and I did not think that it could be applied directly to the pump since it is trying to convert that voltage into a run speed so if it was trying to stop and start it rapidly it would not settle on an average but just confuse it. But now that you mention smoothing the output it reminds me of when I was trying to make a AC to DC converter and had to smooth the output to make it continuous. That just wasn't something I understood immediately. I was however somewhat lost looking up DAC, it seems the vast majority of what I could find online was related to using DAC for music/headphones/CD players, etc. However as I dug deeper I found I am getting closer to the right path:

http://www.instructables.com/id/Serial-Controlled-Variable-S...

http://spacetinkerer.blogspot.com/2011/02/motor-speed-contro... (Using Arduino)

That got me looking more at Arduino projects which brought me to this page:

http://playground.arduino.cc/Main/InterfacingWithHardware

Which has a whole section on motor control. It looks like a lot of the motor control is for DC motors which ends up controlling the voltage, if I am limiting my upper end voltage to the maximum voltage of the pump control signal I should be able to use something like this.

Sorry for the ramblingness of this post, it really is just a stream of thought as I go through ideas. Anything either of you have to add would still be appreciated but I think I at least have a direction to go in for the moment.




Shamelessly plugging my attempts at writing fiction: http://www.robvincent.org
View user's profile Visit user's homepage View All Posts By User
BobD1001
Hazard to Others
***




Posts: 182
Registered: 29-3-2013
Member Is Offline

Mood: No Mood

[*] posted on 9-2-2016 at 15:38


I would take out the existing motor, put in a stepper which can easily be controlled via computer, and calibrate its output per rotation. Since rotations can be precisely controlled through steppers, it should make it quite easy.
View user's profile Visit user's homepage View All Posts By User
Twospoons
International Hazard
*****




Posts: 1174
Registered: 26-7-2004
Location: Middle Earth
Member Is Offline

Mood: A trace of hope...

[*] posted on 9-2-2016 at 16:11


http://www.phidgets.com/products.php?category=0&product_...

problem solved?
These guys have a rather interesting portfolio of simple interface devices. I've used their relay board - very simple to get going.

[Edited on 10-2-2016 by Twospoons]




Helicopter: "helico" -> spiral, "pter" -> with wings
View user's profile View All Posts By User
chemrox
International Hazard
*****




Posts: 2953
Registered: 18-1-2007
Location: UTM
Member Is Offline

Mood: LaGrangian

[*] posted on 9-2-2016 at 17:49


Nice thread- lots of good input! I'm thinking the power demands would outweigh the possible benefits. Thanks to all who contributed! I look forward to the read. I have a two part system that might serve the need; temperature controller inline with a water flow monitor. The latter only makes sure the condenser doesn't get overloaded. Sometimes I also put a timer in the line. The parts were cheap and used via ebay. I have an extra part or two so if you need to prevent a catastrophe drop me a line. Guarantees are provided. I bet Doc Bob has some of the same gear too.



"When you let the dumbasses vote you end up with populism followed by autocracy and getting back is a bitch." Plato (sort of)
View user's profile View All Posts By User
m1tanker78
International Hazard
*****




Posts: 685
Registered: 5-1-2011
Member Is Offline

Mood: No Mood

[*] posted on 9-2-2016 at 19:49


Quote: Originally posted by BobD1001  
I would take out the existing motor, put in a stepper which can easily be controlled via computer, and calibrate its output per rotation. Since rotations can be precisely controlled through steppers, it should make it quite easy.

It's very likely that the pump is already driven by a stepper motor.

@Bromic: Yeah, I should have been more explicit. You'd want to shunt the AC and pass DC. If your computer has an available parallel port and the only function of the interface will be to control the motor speed plus maybe motor direction, how about bypassing the uC and going with a resistor ladder and good old bit banging through the parallel port? It's been many years since I hacked together an external parallel port interface. There are 8 data lines plus other control signals that can certainly be repurposed for other things like direction control, start/stop.

The difference between a DAC (in the case of a resistor ladder) and PWM is that PWM will operate from a single pin whereas DAC will require one pin per bit. An 8-bit DAC will provide 256 discrete output levels. Each additional bit doubles the resolution. A 10-bit DAC can output 1,024 discrete levels. There is a point of diminishing return -- the pump's ADC may sample the analog voltage at only 8 bit resolution, for example. Resistor tolerance and losses will also limit the practical resolution.

The downside to PWM is that there always tends to be some ripple. Good filtering can remove much of the ripple but increases the time it takes for the analog voltage to swing from one value to another. Another downside is that PWM generally requires a fast clock. Higher resolution PWM requires an even faster clock. Depending on your driving logic, PWM can consume quite a good chunk of 'processing time' on a uC. I haven't messed around with uC's in a while so I may be speaking in vain.

Hopefully this will help you make a decision or at least narrow your research scope.




Chemical CURIOSITY KILLED THE CATalyst.
View user's profile View All Posts By User
phlogiston
International Hazard
*****




Posts: 1350
Registered: 26-4-2008
Location: Neon Thorium Erbium Lanthanum Neodymium Sulphur
Member Is Offline

Mood: pyrophoric

[*] posted on 10-2-2016 at 02:41


Ok, the way I see it your problem boils down to constructing a device that will interpret the data stream coming from the serial port and output a 0-10V voltage or 4-20 mA current to control the pump.

This task can clearly be divided in two subtasks (divide and conquer):

1. interpreting the serial data stream
2. Generate a control voltage (0-10V) or current (4-20 mA)

I would try to solve them in this order.

Ad 1) Sorry to confuse you with the poorly defined 'serial data format'.
There are two pieces of information here. Firstly, there is the format that specifies the baud rate, the number of start, stop and parity bits etc. This needs to be matched between sender and receiver to allow them to exchange data in the first place.
Then, when the devices are able to communicate, the second piece of information is what data is exactly being send. ie. what is the meaning of the bytes being send? This can be learned from inspecting your python script which I haven't found time to do yet. I'll come back to this once I found time.
As an example, it could be human-readable tekst consisting of comma-separated ascii numbers describing the required flow rates, or it could be a stream of binary numbers specifying the flow rate, or any of an unlimited number of other things.

Your computer-pump interface needs to interpret this data stream and determine the appropiate pump control from it.
Possibly, the python script can be modified to greatly simplify this task.

Ad 2) There is no need to figure out yourself how to drive motors with speed control yourself, or to replace the motor in the pump. A perfect motor with a speed control circuit is already in your pump and the manufacturer has conveniently provided an external interface that only needs a control voltage or current.
All it needs is a voltage of 0-10V or, alternatively, a current between 4-20 mA for stop-full speed.

There are numerous ways to generate this voltage or current and several have been mentioned (a DAC, a resistor ladder, a PWM, etc). All of these will work, and not very difficult to implement. There are some subtle advantages or disadvantages to each such as component count or need of a second power supply, but those are details that will not be difficult or expensive to resolve later.




-----
"If a rocket goes up, who cares where it comes down, that's not my concern said Wernher von Braun" - Tom Lehrer
View user's profile View All Posts By User
JJay
International Hazard
*****




Posts: 3440
Registered: 15-10-2015
Member Is Offline


[*] posted on 10-2-2016 at 03:19


You could actually get away with just using the parallel port and SIPO registers, latches, etc. You could use an Arduino instead of the parallel port, but you'd still have to do some programming, and there are an awful lot of outputs to deal with... most Arduinos would require additional circuitry to handle that many inputs and outputs, so it would be more costly and somewhat more effort than using the parallel port.
View user's profile View All Posts By User
phlogiston
International Hazard
*****




Posts: 1350
Registered: 26-4-2008
Location: Neon Thorium Erbium Lanthanum Neodymium Sulphur
Member Is Offline

Mood: pyrophoric

[*] posted on 10-2-2016 at 04:38


Well, yes if the python code can be modified to use the parrallel port, it could be as simple as connecting 8 pins of the parallel port directly to the current control input of the pump using 8 resistors in an R2R configuration.

No arduino needed, just 8 cheap resistors.




-----
"If a rocket goes up, who cares where it comes down, that's not my concern said Wernher von Braun" - Tom Lehrer
View user's profile View All Posts By User

  Go To Top