De Reglo ICC (Independent Channel Control) peristaltische pomp van Masterflex Ismatec is een uiterst nauwkeurig instrument dat is ontworpen om ongeëvenaarde controle en nauwkeurigheid te bieden bij het doseren en overpompen van vloeistoffen. Het onderscheidt zich door de mogelijkheid om de richting en snelheid van maximaal vier kanalen onafhankelijk van elkaar te regelen, elk met unieke programma's voor starten, stoppen, kalibreren en meer.
Met een werkend debietbereik van 0,001 tot 35 ml/min per kanaal en instelbare pulsatieniveaus biedt deze pomp de flexibiliteit die nodig is voor een breed scala aan toepassingen. Dankzij de intuïtieve digitale interface en de computerkoppeling via RS-232 kunnen complexe pompsequenties worden samengesteld en kunnen meerdere pompen tegelijkertijd worden aangestuurd.
In deze blogpost gaan we bekijken hoe je de Reglo ICC-peristaltische pomp kunt aansturen met behulp van het seriële commandoprotocol van de Reglo ICC via twee programmeerplatforms: Python en Matlab.
INHOUDSOPGAVE
Waarom kiezen voor de Reglo ICC-peristaltische pomp?
De Reglo ICC-peristaltische pomp is veelzijdig en gebruiksvriendelijk, en is een uitstekende keuze voor het verwerken van vloeistoffen in zowel laboratoria als industriële omgevingen. Hier volgen enkele belangrijke voordelen:
- Onafhankelijke kanaalregelingvan maximaal vier kanalen, elk met een eigen programma, debiet en stromingsrichting, tegelijkertijd.
- Hoge nauwkeurigheid en reproduceerbaarheidzorgen voor een nauwkeurige en consistente vloeistofdosering door verschillen tussen buisjes tot een minimum te beperken.
- Instelbare pulsatie en debietbereik met 6, 8 of 12 rollen voor het instellen van de pulsatie en het debietbereik (meer rollen zorgen voor minder pulsatie en lagere debieten).
- Veelzijdige bedieningsmogelijkhedenvia de digitale interface of een ‘ RS-232 ’-aansluiting (maximaal acht pompen in serie).
- Uitgebreide bedrijfsmodi, waaronder continu doseren met een ingestelde snelheid, het doseren van een bepaald volume gedurende een opgegeven periode, het kalibreren van elk kanaal en nog veel meer.
Wat heb je nodig om met de Reglo ICC-pomp te communiceren?
Om met de Reglo ICC-peristaltische pomp te communiceren, hebt u een aantal belangrijke onderdelen nodig:
- Een Reglo ICC -pomp met een pompkop en een tube naar keuze,
- Een mini-USB- ofUSB -kabel of een DB9-connector (aangesloten op een RS-232 -besturingsmodule) die seriële communicatie mogelijk maakt en gegevensoverdracht tussen de spuitpomp en de computer mogelijk maakt,
- Een programmeerplatform (in dit geval Python en Matlab) of een terminalemulator,
- Een basiskennis van het seriële Reglo ICC-commando-protocol, dat hieronder 👇 wordt uitgelegd en uitgebreid wordt beschreven in de gebruikershandleiding van de pomp.
Hoe stel je de communicatiepoort in?
Voordat u gegevens kunt verzenden naar en ontvangen van de pomp, moet u de communicatiepoort correct instellen. Volg hiervoor de onderstaande stappen:
- Sluit de mini-USB-/USB -kabel of de DB9-connector aan op de seriële poort aan de achterzijde van de pomp en op de bijbehorende poort op de computer.
- Zet de pomp aan.
- Zoek de naam van de seriële poort op die aan de verbinding op uw computer is toegewezen (bijvoorbeeld COM4 voor Windows of /dev/ttyUSB0 voor Linux). Deze informatie vindt u doorgaans in Apparaatbeheer of via terminalopdrachten.
- Zorg ervoor dat de instellingen van de seriële poort overeenkomen met de specificaties van uw spuitpomp:
- 1 startbit,
- 8 databits,
- Pariteit: geen,
- 1 stopbit,
- een baudrate van 9600 bits/s.
- De vermelding ‘Remote mode’ op het scherm van de pomp bevestigt dat de verbinding tot stand is gebracht en geeft aan dat de pomp op afstand wordt aangestuurd door een computer via een USB 2.0-, Mini-B- of RS-232 -verbinding.
Het Reglo ICC-commando-serieelprotocol
Het Reglo ICC-opdrachtprotocol biedt een reeks opdrachten voor contrôle externe, ingedeeld in verschillende categorieën voor nauwkeurige bediening. Deze omvatten communicatiebeheer, bedrijfsmodi en instellingen, besturingsopdrachten, configuraties, kalibratie en meer.
Er zijn twee soorten berichten: antwoordberichten die door de pomp naar de pc worden verzonden, en verzoekberichten die door de pc naar de pomp worden verzonden. Alle berichten bestaan uit een reeks afdrukbare ASCII-tekens. Elk bericht wordt afgesloten met een carriage return of met een carriage return en een line feed.
Het Reglo ICC-commando-protocol dat wordt gebruikt voor de besturing van de Reglo ICC-peristaltische pomp, wordt hieronder samengevat. Meer informatie is te vinden in de gebruikershandleiding van de pomp.
Formaten van gegevenstypen
| Gegevenstype | Breedte | Eenheid | Bereik | Formaat |
|---|---|---|---|---|
| Richting | 1 | - | - | J = met de klok mee K = tegen de klok in |
| Discreet type 1 | 1 tot en met 4 | - | 0 tot 9999 | 1 tot en met 4 tekens in het tientallig stelsel. Niet-gebruikte cijfers worden niet weergegeven. |
| Discreet type 2 | 4 | - | 0 tot 9999 | 4 tekens in het tientallig stelsel. Rechts uitgelijnde waarde. Ongebruikte cijfers aan de linkerkant zijn nullen. |
| Discreet type 3 | 6 | - | 0 tot 999.999 | 6 tekens in het tientallig stelsel. Rechts uitgelijnde waarde. Ongebruikte cijfers aan de linkerkant zijn nullen. |
| Discreet type 4 | 10 | - | 0 tot 4294967295 | 10 tekens in het tientallig stelsel. Rechts uitgelijnde waarde. Ongebruikte cijfers aan de linkerkant zijn nullen. |
| Discrete type 5 | 3 | - | 0 tot 999 | 3 tekens in het tientallig stelsel. Rechts uitgelijnde waarde. Ongebruikte cijfers aan de linkerkant zijn nullen. |
| Discreet type 6 | 5 | - | 0 tot 99999 | 5 tekens in het tientallig stelsel. Rechts uitgelijnde waarde. Ongebruikte cijfers aan de linkerkant zijn nullen. |
| Fractionele type 1 | Variabele | - | - | XXXX.DD Variabele breedte van het gehele getal (XXXX). De decimale punt en twee cijfers rechts daarvan (.DD) worden altijd weergegeven. |
| Deel 1 | 7 | ml | - | mmmmEse ⇒ m.mmm × 10^se: mmmm — mantisse van 4 tekens Decimaalteken wordt afgeleid uit het eerste teken. E — het teken 'E' s — teken voor de exponent: + of - e — exponent van één cijfer |
| Tijdstype 1 | 1 tot en met 8 | 0.1s | 0 tot 35.964.000 (0 tot 999 uur) | 1 tot 8 tekens die de tijd aangeven. Ongebruikte cijfers worden niet weergegeven. |
| Tijdstype 2 | 8 | 0.1s | 0 tot 35.964.000 (0 tot 999 uur) | 8 tekens die de tijd aangeven. Rechts uitgelijnde waarde. Ongebruikte cijfers aan de linkerkant zijn nullen. |
Antwoordberichten
Een antwoordbericht is een bericht dat door de pomp naar de pc wordt verzonden als reactie op een verzoekbericht dat door de pc is verzonden. Dit kan de vorm aannemen van een status- of een gegevensantwoord.
Een statusbericht bestaat uit één ASCII-teken dat aangeeft of het commando al dan niet succesvol is uitgevoerd. De verschillende ASCII-tekens die de uitvoeringsstatus van het aangevraagde commando aangeven, staan in de onderstaande tabel.
| ASCII-teken | Definitie | In Hex | In het tientallig stelsel |
|---|---|---|---|
| * | commando succesvol uitgevoerd | 0x2a | 42 |
| # | commando niet succesvol uitgevoerd | 0x23 | 35 |
| + | positieve reactie die bij sommige opdrachten wordt gebruikt | 0x2b | 43 |
| - | negatieve reactie die bij sommige commando’s wordt gebruikt | 0x2d | 45 |
Er wordt een gegevensantwoord van de pomp ontvangen wanneer de pc parameterwaarden opvraagt. Dit antwoord bestaat uit één of meer gegevensparameterwaarden, gescheiden door spaties. Elke gegevensparameter in het antwoordbericht is een gegevenswaarde die door de pomp wordt teruggestuurd in een formaat dat in het verzoekbericht is gedefinieerd.
| Gegevensparameter 1 | [SP] | Gegevensparameter 2 | [SP] | … | Gegevensparameter n | [CR] | [LF] |
Verzoekberichten
De verzoekberichten zijn berichten die vanaf de pc naar de pomp worden verzonden. Hierop moet de pomp reageren met een antwoordbericht.
Een apparaatbesturingscommando (zoals hieronder weergegeven) bestaat uit een reeks afdrukbare ASCII-tekens en wordt afgesloten met een carriage return [CR] of een carriage return [CR] gevolgd door een line feed [LF]. Het is gericht aan een specifieke pomp/kanaal om bepaalde parameters op te vragen of in te stellen.
| Adres (1-4) | Opdrachtcode | Gegevensparameter 1 | [VB] | Gegevensparameter 2 | [VB] | … | Gegevensparameter n | [CR] | [LF] |
Bij een reeks pompen die in serie zijn geschakeld, loopt het adres van 1 tot 8 (het maximale aantal pompen dat tegelijkertijd kan worden aangestuurd). Wanneer slechts één pomp wordt aangestuurd, loopt het adres van 1 tot 4, afhankelijk van het aantal kanalen dat afzonderlijk wordt aangestuurd, zoals weergegeven in het besturingscommando hierboven.
De opdrachtreeks bestaat doorgaans uit één of twee tekens die het type opdracht aangeven. De gegevensparameters zijn optionele waarden die kunnen worden opgegeven bij het instellen van een parameterwaarde. Tot slot worden de gegevensparameters gescheiden door het verticaal streepje.
Er kunnen verschillende commando’s naar de pomp worden gestuurd met betrekking tot communicatiebeheer, pomp drive, bedrijfsmodi en instellingen, kalibratie en meer. Enkele van deze direct geadresseerde commando’s staan vermeld in de onderstaande tabel. Meer commando’s zijn te vinden en worden nader toegelicht in de gebruiksaanwijzing.
| Commando | Functie | Set/Get | Reactie van de pomp |
|---|---|---|---|
| H | Pomp starten | Set | * - : kanaalinstelling is niet correct |
| I | Pomp uitschakelen | Set | * |
| xI | Het pompen onderbreken (STOP in de toerental- of debietmodus) | Set | * |
| J | Stel de draairichting in op met de klok mee | Set | * |
| K | Stel de draairichting in op tegen de klok in | Set | * |
| xD | Rotatierichting ophalen | Download | J: met de klok mee K: tegen de klok in |
| xM | Stroommodus van pomp/kanaal ophalen | Download | L : Toerental M : Debiet O : Volume bij bepaald debiet G : Volume in de loop van de tijd Q : Volume + pauze N : Tijd P : Tijd + pauze |
| L | Stel de pomp/het kanaal in op de RPM-modus | Set | * |
| M | Stel de pomp/het kanaal in op de modus „Debiet” | Set | * |
| O | Stel de pomp/het kanaal in op de modus ‘Volume bij snelheid’ | Set | * |
| G | Stel de pomp/het kanaal in op de modus ‘Volume over tijd’ | Set | * - : kanaalinstelling is niet correct |
| S | Instelling van het debiet in RPM-modus (0,01 RPM). Discreet type 3. | Set | * |
| S | Haal de huidige snelheidsinstelling op in RPM | Download | Fractionele type 1 |
| f | Stel het debiet in RPM in de modus volume/tijd (mL/min) in. Volumetype 2 (vergelijkbaar met type 1, maar zonder het teken 'E'). | Set | Deel 1 |
| f | Haal de huidige volumestroom/tijdstroom (mL/min) op | Download | Deel 1 |
| xP | Pomp- en pauzetijd | Download | Tijdstype 1 |
| xY | Start de kalibratie op een kanaal | Set | * |
| xZ | Kalibratie annuleren | Set | * |
In de gedefinieerde verzoekberichten worden verschillende symbolen gebruikt om ASCII-tekens weer te geven. Een aantal daarvan staat in de onderstaande tabel.
| Symbool | Definitie | In Hex | In het tientallig stelsel |
|---|---|---|---|
| [CR] | regeleinde | 0x0d | 13 |
| [LF] | regeleinde | 0x0a | 10 |
| [SP] | spatie | 0x20 | 32 |
| [VB] | verticale streep | 0x7c | 124 |
| @ | het '@'-teken | 0x40 | 64 |
Voorbeelden van commando's
Om met de pomp te kunnen communiceren, moet men de verschillende commando’s begrijpen die de pomp accepteert en de benodigde commando-reeksen voor de besturingscomputer opstellen.
In de onderstaande tabel worden enkele voorbeelden van direct geadresseerde commando's weergegeven en toegelicht.
| Commando | Definitie | Reactie van de pomp | Definitie |
|---|---|---|---|
| 1H[CR] | Start kanaal 1 | * | Commando succesvol uitgevoerd |
| 4I[CR] | Stop kanaal 4 | * | Commando succesvol uitgevoerd |
| 2xD[CR] | Bepaal de richting van kanaal 2 | K[CR][LF] | De draairichting is tegen de klok in |
| 3J[CR] | Stel de draairichting van kanaal 3 in op met de klok mee | * | Commando succesvol uitgevoerd |
| 1xM[CR] | De bedrijfsmodus van kanaal 1 opvragen | L[CR][LF] | De huidige modus is RPM |
| 3G[CR] | Stel de bedrijfsmodus van kanaal 3 in op ‘volume over tijd’ | * | Commando succesvol uitgevoerd |
| 1S[CR] | drive -snelheid van kanaal 1 ophalen | 22,50[CR][LF] | Reactie in de vorm van „fractioneel type 1”. De snelheid van de drive bedraagt 22,5 RPM |
| 1S004500[CR] | Stel de snelheid van de drive van kanaal 1 in op 45 RPM. De snelheidsinstelling heeft een resolutie van 0,01 RPM (45 wordt weergegeven als 4500) in de vorm van een „discrete type 3” met een breedte van 6 tekens, waarbij ongebruikte cijfers aan de linkerkant worden aangevuld met nullen (=> 004500). | * | Commando succesvol uitgevoerd |
| 3f[CR] | Bepaal de pompsnelheid van kanaal 3 | 1275E+1[CR][LF] | Reactie in de vorm van een „volumetype 1“ (mmmmEse => m.mmmx10se):
|
| 3f1500-3[CR] | Stel de pompsnelheid van kanaal 3 in op 1,5 μL/min. Instelling van de pompsnelheid in de vorm van „volume type 2“ (mmmmse => m.mmmx10se). 1,5 µL/min = 1,500 × 10-3 ml/min, dus:
| 1500E-3[CR][LF] | Antwoord in de vorm van "volumetype 1". |
Hoe bedien je de Reglo ICC-pomp met IsmaTerm?
IsmaTerm is software waarmee de Reglo ICC-pomp kan worden bediend. Het is terminalemulatiesoftware die via een seriële poort v RS-232 met de pomp communiceert. Met IsmaTerm kan de pomp worden gestart en gestopt, kunnen de pompinstellingen worden ingesteld en opgevraagd, en kan de werking van de pomp worden geprogrammeerd. Het programma is compatibel met Windows-besturingssystemen en kan via deze link worden gedownload.
Om met de pomp te communiceren, start u de IsmaTerm-software, selecteert u de COM-poort die bij de pomp hoort en voert u de instellingen van de poort in om de eigenschappen ervan aan te passen (zoals te zien is in de onderstaande afbeelding). De standaard baudrate is 9600 bits/s, met 8 databits, 1 stopbit en geen pariteit.
In het IsmaTerm-venster kun je commando's invoeren om de pomp aan te sturen en de reacties ervan te bekijken. Bij deze commando's wordt onderscheid gemaakt tussen hoofdletters en kleine letters en ze moeten worden gevolgd door een regelterugloop (Enter-toets).
Het hieronder weergegeven IsmaTerm-venster toont enkele berichten die naar de pomp zijn verzonden en van de pomp zijn ontvangen, waarmee de pomp kan worden gestart of gestopt en de pompinstellingen kunnen worden ingesteld of opgevraagd. In dit voorbeeld wordt alleen kanaal 3 aangestuurd. Elk commando dat naar de pomp wordt verzonden, krijgt een antwoord terug (zie de betreffende berichten in de onderstaande afbeelding).
De commando's die zojuist in het IsmaTerm-venster zijn getoond, worden in de onderstaande tabel kort toegelicht.
| Commando | Definitie | Reactie van de pomp | Definitie |
|---|---|---|---|
| 3H | Start kanaal 3 | * | Commando succesvol uitgevoerd |
| 3xD | Bekijk de routebeschrijving | K{13}{10} | De draairichting is tegen de klok in {13} — carriage return [CR] {10} — line feed [LF] |
| 3J | Stel de draairichting van het kanaal in op met de klok mee | * | Commando succesvol uitgevoerd |
| 3xM | Haal de bedrijfsmodus van kanaal 3 op | L{13}{10} | De huidige modus is RPM |
| 3S | Bepaal het toerental in RPM | 10,00{13}{10} | Fractioneel type 1. Rotatiesnelheid van 10 RPM. |
| 3S002400 | Stel het toerental in op 24 RPM | * | Commando succesvol uitgevoerd |
| 3I | Stop kanaal 3 | * | Commando succesvol uitgevoerd |
Een aan de pomp doorgegeven besturingscommando wordt soms pas verkregen na enkele berekeningen en omrekeningen. Het is daarom belangrijk om alle benodigde commando’s klaar te hebben voordat de pomp in bedrijf wordt contrôle externe .
Bovendien is het eenvoudiger om deze besturingsopdrachten te schrijven en via een reeks (reeds opgestelde) codes naar de pomp te sturen met behulp van programmeerplatforms zoals Python en Matlab, dan om af en toe een opdracht te schrijven en via een terminalprogramma naar de pomp te sturen. Deze platforms maken niet alleen een eenvoudigere communicatie met de pomp mogelijk, maar ook een eenvoudigere externe communicatie met een reeks pompen, en maken het mogelijk om een pompprogramma te schrijven met lussen, pauzes, enz.
Hieronder worden codefragmenten voor seriële communicatie met Python en Matlab gegeven en toegelicht, die dienen als korte inleiding in de communicatie met de Reglo ICC-pomp via deze twee programmeerplatforms.
Hoe bedien je de Reglo ICC-pomp met Python?
De Reglo ICC-pomp kan op afstand worden aangestuurd met Python, wat meer flexibiliteit en gebruiksgemak biedt bij het uitvoeren van complexe pompprogramma’s met lussen, pauzes en variërende snelheden/debieten. Deze aanpak is met name nuttig bij de integratie van meerdere apparaten, omdat hiermee reeksen kunnen worden geautomatiseerd waarbij alle aangesloten apparatuur betrokken is.
In dit hoofdstuk laten we eerst zien hoe je de seriële poort opent en eenvoudige commando’s naar de pomp verstuurt met behulp van Python. Vervolgens wordt een speciale, op maat gemaakte Python-bibliotheek geïntroduceerd die gebruikmaakt van het Reglo ICC-commandoprotocol, waarmee je de seriële poort kunt openen en besturingscommando’s naar de Reglo ICC-pomp kunt versturen. We behandelen voorbeelden die laten zien hoe je de pomp start en stopt, de snelheid instelt, het debiet instelt, enzovoort, en bieden zo een praktische handleiding voor het gebruik van Python bij het aansturen van de Reglo ICC-pomp.
'''
------------------------------------------------
Writing/Reading Simple Commands to/from the Pump
------------------------------------------------
'''
import serial # Python module for serial communication
# Open the serial port with the data format corresponding to the Reglo ICC pump
ser = serial.Serial('COM5', 9600, parity=serial.PARITY_NONE, bytesize=8, stopbits=1, timeout=None, xonxoff=0, rtscts=0) # modify your COM#
### Start channel 3 of the pump
# Method 1
cmd = str(3) + 'H' + chr(13) # concatenate strings :
# 3 represents channel 3
# 'H' to start the channel
# 13 for the carriage return [CR]
ser.write(cmd.encode()) # write the concatenated string to ser
# Method 2
ser.write(f'{3}H{chr(13)}'.encode()) # write string literals to ser
read_data = ser.read(ser.in_waiting).decode()
# read all the available bytes from the serial port connection as a char vector
# The pump returns '*' after a successful execution of the command
### Read the rotation direction of channel 3
ser.write(f'{3}xD{chr(13)}'.encode()) # 'xD' to get the rotation direction
read_data = ser.read(ser.in_waiting).decode()
# The pump returns : K[CR][LF] --> counter-clockwise
### Change the rotation direction of channel 3 to clockwise
ser.write((str(3) + 'J' + chr(13)).encode()) # 'J' to set the direction to clockwise
read_data = ser.read(ser.in_waiting).decode()
# The pump returns '*' after a successful execution of the command
### Change the setting speed to 24 RPM
ser.write((str(3) + 'S002400' + chr(13)).encode())
# Setting speed has a resolution of 0.01 RPM so 24 RPM is assigned as 2400
# Discrete type 3 data has a width of 6 characters with unused digits to the left being zeros --> 002400
read_data = ser.read(ser.in_waiting).decode()
# The pump returns '*' after a successful execution of the command
### Stop channel 3 of the pump
ser.write((str(3) + 'I' + chr(13)).encode()) # 'I' to stop the channel
read_data = ser.read(ser.in_waiting).decode()
# The pump returns '*' after a successful execution of the command
Hieronder wordt de op maat gemaakte Python-bibliotheek gepresenteerd die gebruikmaakt van het Reglo ICC-commando-protocol. Deze bibliotheek maakt het mogelijk om complexe pompprogramma’s te maken, inclusief functies zoals pauzes, lussen, voorwaardelijke logica en meer, waardoor een eenvoudigere aansturing van een reeks pompen mogelijk wordt.
'''
------------------------------------------
Reglo ICC Peristaltic Pump Control Library
------------------------------------------
'''
import serial
import time
#---------------------------------------------------------------------------------#
# LIBRARY MANAGING THE COMMUNICATION WITH A REGLO ICC WITH 3 INDEPENDENT CHANNELS #
#---------------------------------------------------------------------------------#
class RegloICC:
# Initialize the pump
def __init__(self, COM):
self.COM = COM
# Open the serial port with the data format corresponding to the RegloICC pump
self.sp = serial.Serial(self.COM, 9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS)
self.direction = [0, 0, 0] # 0 = clockwise, 1 = counter-clockwise
self.mode = [0, 0, 0] # 0 = RPM, 1 = Flow Rate, 2 = Volume (over time), one can add here all other modes
self.speed = [0, 0, 0] # rotation speed for each channel in RPM mode
# Change the size of 'direction', 'mode' and 'speed' according to the total number of channels to control.
# In the case herein, 3 channels are being independently controlled
# Delete the pump
def __del__(self):
self.sp.close()
# Start the corresponding channel
def start_channel(self, channel):
command = f'{channel}H\r'.encode() # 'H' to start the channel
# \r for the carriage return [CR] required to tell the pump that the command is finished
self.sp.write(command) # write the command to the pump
time.sleep(0.1) # give the pump time to process the command after sending it before reading the response
return self.sp.read(self.sp.in_waiting).decode() # read the pump response
# Stop the corresponding channel
def stop_channel(self, channel):
command = f'{channel}I\r'.encode() # 'I' to stop the channel
self.sp.write(command)
time.sleep(0.1)
return self.sp.read(self.sp.in_waiting).decode()
# Set the rotation direction for a single channel
def set_direction(self, channel, direction):
if direction == 1:
command = f'{channel}K\r'.encode() # counter-clockwise
else:
command = f'{channel}J\r'.encode() # clockwise
self.sp.write(command)
self.direction[channel - 1] = direction # pyhton count starts from 0
time.sleep(0.1)
return self.sp.read(self.sp.in_waiting).decode()
# Get the rotation direction of a single channel
def get_direction(self, channel):
command = f'{channel}xD\r'.encode() # 'xD' to get the rotation direction
self.sp.write(command)
time.sleep(0.1)
# read the rotation direction from the corresponding channel
return self.sp.read(self.sp.in_waiting).decode()
# Set the speed for a single channel in RPM when in RPM mode
def set_speed(self, channel, speed): # in RPM, with speed less then 100
speed = max(min(speed, 100), 0) # speed between 0 and 100 RPM
speed_string = f'{int(speed):03d}{int((speed - int(speed)) * 100)}' # format speed explained below
command = f'{channel}S0{speed_string}\r'.encode()
self.sp.write(command) # set the speed for the corresponding channel
self.speed[channel - 1] = speed
time.sleep(0.1)
return self.sp.read(self.sp.in_waiting).decode()
#--------------------------------------------------------------------------------#
# SPEED_STRING EXAMPLE #
## Speed value : #
# speed = 123.456 #
# #
## Convert the integer part to a string with at least three digits : #
# integer_part = f'{int(speed):03d}'; ## --> Result: '123' #
# #
## Convert the decimal part to a string with two digits : #
# decimal_part = f'{int((speed - int(speed)) * 100)}'; ## --> Result: '45' #
# #
## Concatenate the two parts : #
# speed_string = f'{int(speed):03d}{int((speed - int(speed)) * 100)}'; #
## --> Result: '12345' representing 123.45 in fixed-point notation #
# #
## When the two strings are concatenated, the result is a string that represents #
## the original speed value in a fixed-point notation with three digits before #
## the decimal point and two digits after, without the decimal separator. #
#--------------------------------------------------------------------------------#
# Read out speed of a single channel in RPM when in RPM mode
def get_speed(self, channel):
command = f'{channel}S\r'.encode() # 'S' to get the setting speed in RPM
self.sp.write(command)
time.sleep(0.1)
return self.sp.read(self.sp.in_waiting).decode()
# Set the operational mode for a single channel (you can add all other modes)
def set_mode(self, channel, mode):
if mode == 0:
command = f'{channel}L\r'.encode() # RPM mode
elif mode == 1:
command = f'{channel}M\r'.encode() # Flow rate mode
else:
command = f'{channel}G\r'.encode() # Volume (over time) mode
self.sp.write(command)
self.mode[channel - 1] = mode
time.sleep(0.1)
return self.sp.read(self.sp.in_waiting).decode()
# Get the operational mode of a single channel
def get_mode(self, channel):
command = f'{channel}xM\r'.encode() # 'xM' to get the operational mode
self.sp.write(command)
time.sleep(0.1)
return self.sp.read(self.sp.in_waiting).decode()
#----------------------------------------------------------------------------#
# EXAMPLES ON HOW TO USE THE DEFINED CLASS TO CONTROL THE Reglo ICC PUMP #
#----------------------------------------------------------------------------#
### Initialize the pump with the specified COM port
pump = RegloICC('COM5') # Replace 'COM5' with your actual COM port
### Start channel 3
pump.start_channel(3)
### Get the rotation direction of channel 3
print(pump.get_direction(3))
### Set the rotation direction of channel 3 to clockwise
pump.set_direction(3, 0)
### Get the current operational mode of channel 3
print(pump.get_mode(3))
### Set the operational mode of channel 3 to RPM
pump.set_mode(3, 0)
### Get the current speed setting of channel 3
print(pump.get_speed(3))
### Set the setting speed of channel 3 to 24 RPM
pump.set_speed(3, 24)
### Stop channel 3
pump.stop_channel(3)
### Delete the pump object
del pump
Hoe bedien je de Reglo ICC-pomp met Matlab?
In dit hoofdstuk worden stukjes Matlab-code getoond die laten zien hoe je de seriële poort opent en hoe je besturingsopdrachten naar de pomp schrijft en verstuurt. Vervolgens wordt een ‘quick start’-adapterklasse gedefinieerd die speciaal is bedoeld voor het verwerken van Reglo ICC-opdrachten.
We zullen de coderegels doornemen die laten zien hoe je veelvoorkomende taken kunt uitvoeren, zoals het starten en stoppen van de pomp, het instellen van de snelheid, het bepalen van de draairichting, enzovoort.
%-------------------------------------------------
% Writing/Reading Simple Commands to/from the Pump
%-------------------------------------------------
%% Open the serial port with the data format corresponding to the Reglo ICC pump
sp = serialport('COM5',9600,'Parity','None','DataBits',8,'StopBits',1); % open the serial port
%% Start channel 3 of the pump (method 1)
cmd = strcat(num2str(3),'H',13); % concatenate strings :
% 3 represents channel 3,
% 'H' to start the channel
% 13 for the carriage return [CR]
write(sp,cmd,"uint8"); % write the concatenated string to sp
%% Start channel 3 of the pump (method 2)
fprintf(sp,'%s',strcat(num2str(3),'H',13)); % formats the concatenated string according to '%s' (character vector or string array) and writes it to sp
read_data = read(sp,sp.NumBytesAvailable,"char");
% read all the available bytes from the serial port connection as a char vector
%% Read the rotation direction of channel 3
cmd = strcat(num2str(3),'xD',13); % 'xD' to get the rotation direction
write(sp,cmd,"uint8");
read_data = read(sp,sp.NumBytesAvailable,"char");
%% The pump returns : K[CR][LF]. Change the rotation direction of channel 3 to clockwise
write(sp,strcat(num2str(3),'J',13),"uint8"); % 'J' to set the direction to clockwise
read_data = read(sp,sp.NumBytesAvailable,"char");
%% Change the setting speed to 24 RPM
write(sp,strcat(num2str(3),'S002400',13),"uint8");
% Setting speed has a resolution of 0.01 RPM so 24 RPM is assigned as 2400
% Discrete type 3 data has a width of 6 characters with unused digits to the left being zeros --> 002400
read_data = read(sp,sp.NumBytesAvailable,"char");
%% Stop channel 3 of the pump
write(sp,strcat(num2str(3),'I',13),"uint8"); % 'I' to stop the channel
read_data = read(sp,sp.NumBytesAvailable,"char");
%-----------------------------------------
% Reglo ICC Peristaltic Pump Adapter Class
%-----------------------------------------
%--------------------------------------------------------------------------------------%
% CUSTOM CLASS MANAGING THE COMMUNICATION WITH A REGLO ICC WITH 3 INDEPENDENT CHANNELS %
%--------------------------------------------------------------------------------------%
classdef RegloICC
%%% Define the class properties
properties
% Change the size of 'direction', 'mode' and 'speed' according to the total number of
% channels to control. In the case herein, 3 channels are being independently controlled
sp = []; % serial port
COM = ''; % input parameter: COM port to use for the pump
direction = [0 0 0]; % direction of rotation of each channel: 0 = clockwise, 1 = counter-clockwise
mode = [0 0 0]; % operational mode of each channel: 0 = RPM, 1 = Flow Rate, 2 = Volume (over time), one can add here all other modes (check Table 3)
speed = zeros(3,1); % rotation speed for each channel in case of RPM mode
end
%%% Define the class methods
methods
% Initialize the pump
function obj = RegloICC(COM)
obj.COM = COM;
obj.sp = serialport(obj.COM,9600,'Parity','None','DataBits',8,'StopBits',1); % open the serial port with the data format corresponding to the RegloICC pump
end
% Delete the pump
function obj = delete(obj)
delete(obj.sp);
obj.sp = [];
end
% Start the corresponding channel
function start_channel(obj,channel)
write(obj.sp,strcat(num2str(channel),'H',13),"uint8"); % 'H' to start the channel
% 13 for the carriage return [CR] required to tell the pump that the command is finished
pause(0.1); % give the pump time to process the command before reading the response
while obj.sp.NumBytesAvailable > 0 % clear the buffer
read(obj.sp, obj.sp.NumBytesAvailable, "char");
end
end
% Stop the corresponding channel
function stop_channel(obj,channel)
write(obj.sp,strcat(num2str(channel),'I',13),"uint8"); % 'I' to stop the channel
pause(0.1);
while obj.sp.NumBytesAvailable > 0
read(obj.sp, obj.sp.NumBytesAvailable, "char");
end
end
% Set the rotation direction for a single channel
function obj = set_direction(obj,channel,direction)
if direction == 1
write(obj.sp,strcat(num2str(channel),'K',13),"uint8"); % counter-clockwise rotation
pause(0.1);
while obj.sp.NumBytesAvailable > 0
read(obj.sp, obj.sp.NumBytesAvailable, "char");
end
else
write(obj.sp,strcat(num2str(channel),'J',13),"uint8"); % clockwise rotation
pause(0.1);
while obj.sp.NumBytesAvailable > 0
read(obj.sp, obj.sp.NumBytesAvailable, "char");
end
end
obj.direction(channel) = direction;
end
% Get the rotation direction of a single channel
function getDirection = get_direction(obj,channel)
write(obj.sp,strcat(num2str(channel),'xD',13),"uint8"); % 'xD' to get the rotation direction
pause(0.1);
getDirection = read(obj.sp,obj.sp.NumBytesAvailable,"char"); % read the rotation direction from the corresponding channel
end
% Set the speed for a single channel in RPM when in RPM mode
function obj = set_speed(obj,channel,speed) % in RPM, with speed 100
disp('Speed higher than maximum (100 RPM), reduced to maximum.');
end
speed = max(min(speed,100),0); % speed between 0 and 100 rpm
speedstring = strcat(sprintf('%03d',floor(speed)), num2str(floor((speed-floor(speed))*100))); % format speed explained below
obj.speed(channel) = speed; % set the speed for the corresponding channel
write(obj.sp,strcat(num2str(channel),'S0',speedstring,13),"uint8"); % write the speed to the corresponding channel
pause(0.1);
while obj.sp.NumBytesAvailable > 0
read(obj.sp, obj.sp.NumBytesAvailable, "char");
end
end
%----------------------------------------------------------------------------------%
% SPEEDSTRING EXAMPLE %
%% Speed value : %
% speed = 123.456 %
% %
%% Convert the integer part to a string with at least three digits : %
% integer_part = sprintf('%03d', floor(speed)); %% --> Result: '123' %
% %
%% Convert the decimal part to a string with two digits : %
% decimal_part = num2str(floor((speed - floor(speed)) * 100)); %% --> Result: '45' %
% %
%% Concatenate the two parts : %
% speedstring = strcat(integer_part, decimal_part); %
%% --> Result: '12345' representing 123.45 in fixed-point notation %
% %
%% When the two strings are concatenated, the result is a string that represents %
%% the original speed value in a fixed-point notation with three digits before %
%% the decimal point and two digits after, without the decimal separator. %
%----------------------------------------------------------------------------------%
% Read out speed of a single channel in RPM when in RPM mode
function getRPM = get_speed(obj,channel)
write(obj.sp,strcat(num2str(channel),'S',13),"uint8"); % 'S' to get the setting speed in RPM
pause(0.1);
getRPM = read(obj.sp,obj.sp.NumBytesAvailable,"char");
end
% Set the operational mode for a single channel (you can add all other modes)
function obj = set_mode(obj,channel,mode)
if mode == 0
write(obj.sp,strcat(num2str(channel),'L',13),"uint8"); % RPM mode
pause(0.1);
while obj.sp.NumBytesAvailable > 0
read(obj.sp, obj.sp.NumBytesAvailable, "char");
end
elseif mode == 1
write(obj.sp,strcat(num2str(channel),'M',13),"uint8"); % Flow rate mode
pause(0.1);
while obj.sp.NumBytesAvailable > 0
read(obj.sp, obj.sp.NumBytesAvailable, "char");
end
else
write(obj.sp,strcat(num2str(channel),'G',13),"uint8"); % Volume (over time) mode
pause(0.1);
while obj.sp.NumBytesAvailable > 0
read(obj.sp, obj.sp.NumBytesAvailable, "char");
end
end
obj.mode(channel) = mode;
end
% Get the operational mode of a single channel
function getMd = get_mode(obj,channel)
write(obj.sp,strcat(num2str(channel),'xM',13),"uint8"); % 'xM' to get the operational mode
pause(0.1);
getMd = read(obj.sp,obj.sp.NumBytesAvailable,"char");
end
end
end
%-------------------------------------------------------------------%
% Examples on how to use the defined class to control the Reglo ICC %
%-------------------------------------------------------------------%
%%% To start the communication and open the serial port %%%
% pump = RegloICC('COM5') % Replace 'COM5' with your actual COM port
%%% Start channel 3 %%%
% pump.start_channel(3)
%%% Get the rotation direction of channel 3 %%%
% pump.get_direction(3)
%%% Set the rotation direction of channel 3 to clockwise %%%
% pump.set_direction(3,0)
%%% Get the current operational mode of channel 3 %%%
% pump.get_mode(3)
%%% Set the operational mode of channel 3 to RPM %%%
% pump.set_mode(3,0)
%%% Get the current speed setting of channel 3 %%%
% pump.get_speed(3)
%%% Set the setting speed of channel 3 to 24 RPM %%%
% pump.set_speed(3,24)
%%% Stop channel 3 %%%
% pump.stop_channel(3)
%%% Delete pump %%%
% pump = delete(pump)
Conclusie
In deze blogpost hebben we de Reglo ICC (Independent Channel Control) peristaltische pomp geïntroduceerd en de basisprincipes van de programmering ervan ( contrôle externe ) onderzocht via twee platforms, Python en Matlab, met behulp van de Reglo ICC-commando’s. We hopen dat deze post een waardevolle gids vormt voor onderzoekers en ingenieurs die de Reglo ICC peristaltische pomp willen inzetten bij hun onderzoek en experimenten op het gebied van microfluïdica.
Blijf ons volgen voor meer inzichten, tutorials en praktische toepassingen in onze toekomstige berichten. Tot dan: veel plezier met pompen en coderen 💻!
📧 Mocht u vragen of opmerkingen hebben, neem dan gerust contact met ons op via support@darwin-microfluidics.com.


