La pompe péristaltique Reglo ICC (Independent Channel Control) de Masterflex Ismatec est un instrument de haute précision conçu pour offrir un contrôle et une exactitude inégalés dans la distribution et le transfert de fluides. Elle se distingue par sa capacité à contrôler indépendamment la direction et la vitesse de jusqu'à quatre canaux, chacun avec des programmes uniques pour le démarrage, l'arrêt, l'étalonnage, et plus encore.
Avec une plage de débit de fonctionnement de 0,001 à 35 mL/min par canal et des niveaux de pulsation personnalisables, cette pompe offre la flexibilité nécessaire pour une variété d'applications. L'interface numérique intuitive et la connectivité informatique RS-232 permettent la création de séquences de pompage complexes et le contrôle simultané de plusieurs pompes.
Dans cet article de blog, nous allons explorer comment contrôler la pompe péristaltique Reglo ICC à l'aide du protocole de commande série Reglo ICC via deux plateformes de programmation : Python et Matlab.
TABLE DES MATIÈRES
Pourquoi choisir la pompe péristaltique Reglo ICC ?
La pompe péristaltique Reglo ICC est polyvalente et user-friendly, ce qui en fait un choix privilégié pour la gestion des fluides en laboratoire comme en milieu industriel. Voici quelques-uns de ses principaux avantages :
- Contrôle Indépendant des Canaux pour jusqu'à quatre canaux, chacun avec son propre programme, ses débits et ses directions simultanément.
- Haute Précision et Reproductibilité assurant une distribution de fluide précise et constante en minimisant les différences entre les tubes.
- Pulsation et débit réglables avec 6, 8 ou 12 galets utilisés pour ajuster la pulsation et le débit (un nombre accru de galets réduit la pulsatilité et les débits).
- Options de Contrôle Polyvalentes via son interface numérique ou une connexion RS-232 (jusqu'à huit pompes en série).
- Modes de Fonctionnement Complets incluant la distribution continue à un débit défini, la distribution d'un volume sur une période spécifiée, le calibrage de chaque canal, et bien plus encore.
De quoi avez-vous besoin pour communiquer avec la pompe Reglo ICC ?
Pour communiquer avec la pompe péristaltique Reglo ICC, vous aurez besoin de quelques composants clés :
- Une pompe Reglo ICC avec une tête de pompe et un tube de votre choix,
- Un câble mini-USB/USB ou un connecteur DB9 (câblé à un module de contrôle RS-232) permettant la communication série et le transfert de données entre le pousse-seringue et l'ordinateur,
- Une plateforme de programmation (Python et Matlab dans le cas présent) ou un émulateur de terminal,
- Une compréhension de base du protocole série de commandes Reglo ICC expliqué ci-dessous 👇 et détaillé dans le guide d'utilisation de la pompe.
Comment configurer le port de communication ?
Avant de pouvoir commencer à envoyer et recevoir des données de la pompe, vous devez configurer correctement le port de communication. Voici les étapes à suivre :
- Connecter le câble mini-usb/usb ou le connecteur DB9 au port série à l'arrière de la pompe et au port correspondant sur l'ordinateur.
- Allumez la pompe.
- Identifiez le nom du port série attribué à la connexion sur votre ordinateur (par exemple, COM4 pour Windows ou /dev/ttyUSB0 pour Linux). Vous pouvez généralement trouver cette information dans le gestionnaire de périphériques ou en utilisant des commandes de terminal.
- Assurez-vous que les paramètres du port série correspondent aux spécifications de votre pousse-seringue :
- 1 bit de début,
- 8 bits de données,
- Parité : aucune,
- 1 bit d'arrêt,
- un débit en bauds de 9600 bits/s.
- Le mode à distance sur l'écran de la pompe confirme une connexion réussie, indiquant que la pompe est contrôlée à distance par un ordinateur via une connexion USB 2.0, Mini-B ou RS-232.
Le protocole de commande série Reglo ICC
Le protocole de commande Reglo ICC offre une gamme de commandes pour le contrôle externe, classées en types distincts pour une manipulation précise. Celles-ci incluent la gestion de la communication, les modes et réglages opérationnels, les directives de contrôle, les configurations de réglage, le calibrage, et bien plus encore.
Il existe deux types de messages. Les messages de réponse sont envoyés de la pompe au PC et les messages de requête sont envoyés du PC à la pompe. Tous les messages sont composés d'une chaîne de caractères ASCII imprimables. Chaque message est terminé par un retour chariot ou un retour chariot et un saut de ligne.
Le protocole de commande Reglo ICC utilisé pour contrôler la pompe péristaltique Reglo ICC est résumé ci-dessous. Plus de détails sont disponibles dans le manuel d'utilisation de la pompe.
Formats des types de données
| Type de données | Largeur | Unité | Plage | Format |
|---|---|---|---|---|
| Direction | 1 | - | - | J = sens horaire K = sens anti-horaire |
| Type discret 1 | 1 à 4 | - | 0 à 9999 | 1 à 4 caractères en base 10. Les chiffres inutilisés ne sont pas renvoyés. |
| Type discret 2 | 4 | - | 0 à 9999 | 4 caractères en base 10. Valeur justifiée à droite. Les chiffres inutilisés à gauche sont des zéros. |
| Type discret 3 | 6 | - | 0 à 999999 | 6 caractères en base 10. Valeur justifiée à droite. Les chiffres inutilisés à gauche sont des zéros. |
| Type discret 4 | 10 | - | 0 à 4294967295 | 10 caractères en base 10. Valeur justifiée à droite. Les chiffres inutilisés à gauche sont des zéros. |
| Type discret 5 | 3 | - | 0 à 999 | 3 caractères en base 10. Valeur justifiée à droite. Les chiffres inutilisés à gauche sont des zéros. |
| Type discret 6 | 5 | - | 0 à 99999 | 5 caractères en base 10. Valeur justifiée à droite. Les chiffres inutilisés à gauche sont des zéros. |
| Type fractionnaire 1 | Variable | - | - | XXXX.DD Largeur variable de la partie entière (XXXX). Point décimal et deux chiffres à droite (.DD) toujours fournis. |
| Volume de type 1 | 7 | mL | - | mmmmEse ⇒ m.mmm × 10^se: mmmm — mantisse de 4 caractères Point décimal inféré après le premier caractère. E — caractère 'E' s — signe de l'exposant : + ou - e — exposant à un seul chiffre |
| Type de temps 1 | 1 à 8 | 0.1s | 0 à 35964000 (0 à 999 h) | 1 à 8 caractères représentant l'heure. Les chiffres inutilisés ne sont pas renvoyés. |
| Type de temps 2 | 8 | 0.1s | 0 à 35964000 (0 à 999 h) | 8 caractères représentant l'heure. Valeur justifiée à droite. Les chiffres inutilisés à gauche sont des zéros. |
Messages de réponse
Un message de réponse est un message envoyé de la pompe au PC en réponse à un message de requête envoyé par le PC. Il peut prendre la forme d'un statut ou d'une réponse de données.
Un message de réponse de statut est un seul caractère ASCII qui indique si la commande a été exécutée avec succès ou non. Les différents caractères ASCII qui indiquent le statut d'exécution de la commande demandée sont représentés dans le tableau ci-dessous.
| Caractère ASCII | Définition | En Hex | En Base 10 |
|---|---|---|---|
| * | Commande exécutée avec succès | 0x2a | 42 |
| # | La commande n'a pas été exécutée avec succès | 0x23 | 35 |
| + | réponse positive utilisée pour certaines commandes | 0x2b | 43 |
| - | Réponse négative utilisée pour certaines commandes | 0x2d | 45 |
Une réponse de données est reçue de la pompe lorsque des valeurs de paramètres sont demandées par le PC. Elle est composée d'une ou plusieurs valeurs de paramètres de données délimitées par des espaces. Chaque paramètre de données dans le message de réponse est une valeur de données renvoyée par la pompe dans un format défini par le message de requête.
| Paramètre de données 1 | [SP] | Paramètre de données 2 | [SP] | … | Paramètre de données n | [CR] | [LF] |
Messages de requête
Les messages de requête sont des messages envoyés du PC à la pompe. Ceux-ci doivent être répondus par un message de réponse de la pompe.
Une commande de pilotage d'appareil (comme indiqué ci-dessous) est composée d'une chaîne de caractères ASCII imprimables et terminée par un retour chariot [CR] ou un retour chariot [CR] et un saut de ligne [LF]. Elle est adressée à une pompe/un canal individuel pour obtenir ou définir certains paramètres spécifiques.
| Adresse (1-4) | Code de commande | Paramètre de données 1 | [VB] | Paramètre de données 2 | [VB] | … | Paramètre de données n | [CR] | [LF] |
Dans le cas d'un bus de pompes "en chaîne", l'adresse va de 1 à 8 (nombre maximal de pompes contrôlées simultanément). Dans le cas où une seule pompe est contrôlée, l'adresse va de 1 à 4, correspondant au nombre de canaux contrôlés indépendamment, comme présenté dans la commande de contrôle juste au-dessus.
La chaîne de commande est généralement composée d'un ou deux caractères indiquant le type de commande. Les paramètres de données sont des valeurs optionnelles qui peuvent être fournis lors de la définition d'une valeur de paramètre. Enfin, le caractère barre verticale délimite les paramètres de données.
Différentes commandes peuvent être adressées à la pompe concernant la gestion des communications, le drive de la pompe, les modes et réglages opérationnels, la calibration, et plus encore. Certaines de ces commandes directement adressées sont listées dans le tableau ci-dessous. D'autres commandes peuvent être trouvées et détaillées dans le manuel d'utilisation.
| Commande | Fonction | Définir/Obtenir | Réponse de la pompe |
|---|---|---|---|
| H | Démarrer la pompe | Régler | * - : réglage du canal incorrect |
| I | Arrêter la pompe | Régler | * |
| xI | Interrompre le pompage (STOP en mode RPM ou débit) | Régler | * |
| J | Régler le sens de rotation sur horaire | Régler | * |
| K | Régler le sens de rotation sur anti-horaire | Régler | * |
| xD | Obtenir le sens de rotation | Obtenir | J : sens horaire K : sens anti-horaire |
| xM | Obtenir le mode actuel de la pompe/du canal | Obtenir | L : RPM M : Débit O : Volume à un débit donné G : Volume sur une durée Q : Volume+Pause N : Temps P : Temps+Pause |
| L | Régler la pompe/le canal en mode RPM | Régler | * |
| M | Régler la pompe/le canal en mode Débit | Régler | * |
| O | Régler la pompe/le canal en mode Volume à un débit donné | Régler | * |
| G | Régler la pompe/le canal en mode Volume sur une durée | Régler | * - : réglage du canal incorrect |
| S | Réglage du débit en mode RPM (0,01 RPM). Type discret 3. | Régler | * |
| S | Obtenir le réglage de vitesse actuel en tr/min | Obtenir | Type fractionnaire 1 |
| f | Définir le débit en tr/min en mode volume/temps (mL/min). Type de volume 2 (Similaire au type 1 sans le caractère 'E'). | Régler | Volume de type 1 |
| f | Obtenir le débit actuel en volume/temps (mL/min) | Obtenir | Volume de type 1 |
| xP | Obtenir le temps de pause du pompage | Obtenir | Type de temps 1 |
| xY | Démarrer la calibration sur un canal | Régler | * |
| xZ | Annuler l'étalonnage | Régler | * |
Différents symboles sont utilisés pour représenter les caractères ASCII dans les messages de requête définis. Certains d'entre eux sont présentés dans le tableau ci-dessous.
| Symbole | Définition | En Hex | En Base 10 |
|---|---|---|---|
| [CR] | Retour chariot | 0x0d | 13 |
| [LF] | Saut de ligne | 0x0a | 10 |
| [SP] | espace | 0x20 | 32 |
| [VB] | Barre verticale | 0x7c | 124 |
| @ | Caractère '@' | 0x40 | 64 |
Exemples de commandes
Pour communiquer avec la pompe, il faut comprendre les différentes commandes qu'elle accepte et préparer les chaînes de commande nécessaires pour l'ordinateur de contrôle.
Dans le tableau ci-dessous, quelques exemples de commandes à adressage direct sont présentés et expliqués.
| Commande | Définition | Réponse de la pompe | Définition |
|---|---|---|---|
| 1H[CR] | Démarrer le canal 1 | * | Commande exécutée avec succès |
| 4I[CR] | Arrêter le canal 4 | * | Commande exécutée avec succès |
| 2xD[CR] | Obtenir la direction du canal 2 | K[CR][LF] | Le sens de rotation est antihoraire |
| 3J[CR] | Définir le sens de rotation du canal 3 dans le sens horaire | * | Commande exécutée avec succès |
| 1xM[CR] | Obtenir le mode de fonctionnement du canal 1 | L[CR][LF] | Mode actuel : RPM |
| 3G[CR] | Définir le mode de fonctionnement du canal 3 en mode volume par temps | * | Commande exécutée avec succès |
| 1S[CR] | Obtenir la vitesse de drive du canal 1 | 22.50[CR][LF] | Réponse sous la forme de "type fractionnaire 1". La vitesse de drive est de 22,5 tr/min |
| 1S004500[CR] | Définir la vitesse de drive du canal 1 à 45 tr/min. Le réglage de la vitesse a une résolution de 0,01 tr/min (45 attribué comme 4500) sous la forme d'un "type discret 3" avec une largeur de 6 caractères, les chiffres inutilisés à gauche étant des zéros (=> 004500). | * | Commande exécutée avec succès |
| 3f[CR] | Obtenir le débit de pompage du canal 3 | 1275E+1[CR][LF] | Réponse sous la forme d'un « volume de type 1 » (mmmmEse => m.mmm x10se) :
|
| 3f1500-3[CR] | Définir le débit de pompage du canal 3 à 1,5 µL/min. Réglage du débit de pompage sous la forme de "type de volume 2" (mmmmse => m.mmm x10se). 1.5 µL/min = 1.500x10-3 mL/min, donc :
| 1500E-3[CR][LF] | Réponse sous la forme d'un « volume de type 1 ». |
Comment contrôler la pompe Reglo ICC en utilisant IsmaTerm ?
IsmaTerm est un logiciel qui permet de contrôler la pompe Reglo ICC. C'est un logiciel d'émulation de terminal qui communique avec la pompe via le port série RS-232. IsmaTerm peut être utilisé pour démarrer et arrêter la pompe, définir et récupérer les paramètres de la pompe, et programmer son fonctionnement. Il est compatible avec les systèmes d'exploitation Windows et peut être téléchargé via ce lien.
Pour communiquer avec la pompe, lancez le logiciel IsmaTerm, sélectionnez le port COM correspondant à la pompe et entrez les paramètres du port afin de modifier ses caractéristiques (comme illustré dans la figure ci-dessous). Le débit en bauds par défaut est de 9600 bits/s, avec 8 bits de données, 1 bit d'arrêt et aucune parité.
Dans la fenêtre IsmaTerm, il est possible de saisir des commandes pour contrôler la pompe et visualiser ses réponses. Ces commandes sont sensibles à la casse et doivent être suivies d'un retour chariot (touche Entrée).
La fenêtre IsmaTerm présentée ci-dessous affiche des messages envoyés et reçus de la pompe, permettant de démarrer/arrêter la pompe et de définir/récupérer ses paramètres. Dans cet exemple, seul le canal 3 est contrôlé. Chaque commande envoyée à la pompe reçoit une réponse de celle-ci (messages visés dans la figure ci-dessous).
Les commandes qui viennent d'être présentées dans la fenêtre IsmaTerm sont brièvement expliquées dans le tableau ci-dessous.
| Commande | Définition | Réponse de la pompe | Définition |
|---|---|---|---|
| 3H | Démarrer le canal 3 | * | Commande exécutée avec succès |
| 3xD | Obtenir la direction | K{13}{10} | Le sens de rotation est antihoraire {13} — retour chariot [CR] {10} — saut de ligne [LF] |
| 3J | Définir le sens de rotation du canal dans le sens horaire | * | Commande exécutée avec succès |
| 3xM | Obtenir le mode de fonctionnement du canal 3 | L{13}{10} | Mode actuel : RPM |
| 3S | Obtenir la vitesse de consigne en tr/min | 10.00{13}{10} | Type fractionnaire 1. Vitesse de rotation de 10 RPM. |
| 3S002400 | Régler la vitesse à 24 tr/min | * | Commande exécutée avec succès |
| 3I | Arrêter le canal 3 | * | Commande exécutée avec succès |
Une commande de contrôle communiquée à la pompe est parfois obtenue après certains calculs et conversions. Il est donc important de préparer toutes les commandes nécessaires avant de démarrer le contrôle externe de la pompe.
De plus, il est plus facile de faire écrire et communiquer ces commandes de contrôle à la pompe via un ensemble de codes (déjà préparés), en utilisant des plateformes de programmation telles que Python et Matlab, que d'écrire et d'envoyer une commande de temps en temps à la pompe via un programme de terminal. Ces plateformes permettent non seulement une communication plus facile avec la pompe, mais aussi une communication externe plus aisée avec un bus de pompes et permettent d'écrire un programme de pompage avec des boucles, des pauses, etc.
Des extraits de code de démarrage rapide pour la communication série utilisant Python et Matlab, servant de brève introduction à la communication avec la pompe Reglo ICC via ces deux plateformes de programmation, sont fournis et expliqués ci-après.
Comment contrôler la pompe Reglo ICC en utilisant Python ?
La pompe Reglo ICC peut être contrôlée à distance à l'aide de Python, offrant une plus grande flexibilité et commodité pour l'exécution de programmes de pompage complexes avec des boucles, des pauses et des vitesses/débits variables. Cette approche est particulièrement utile lors de l'intégration de plusieurs dispositifs, car elle permet l'automatisation de séquences impliquant tous les équipements connectés.
Dans cette section, nous montrerons d'abord comment ouvrir le port série et envoyer des commandes simples à la pompe en utilisant Python. Ensuite, une bibliothèque Python personnalisée dédiée, qui utilise le protocole de commande Reglo ICC, sera introduite, permettant d'ouvrir le port série et d'envoyer des chaînes de commande de contrôle à la pompe Reglo ICC. Nous couvrirons des exemples montrant comment démarrer et arrêter la pompe, définir la vitesse, définir le débit, etc., offrant un guide pratique pour l'utilisation de Python afin de contrôler la pompe Reglo ICC.
'''
------------------------------------------------
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
Ci-dessous est présentée la bibliothèque Python personnalisée qui utilise le protocole de commande Reglo ICC. Cette bibliothèque permet la création de programmes de pompage complexes, incluant des fonctionnalités telles que les pauses, les boucles, la logique conditionnelle, et bien plus encore, facilitant ainsi le contrôle d'un bus de pompes.
'''
------------------------------------------
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
Comment contrôler la pompe Reglo ICC en utilisant Matlab ?
Cette section présentera des extraits de code Matlab, montrant comment ouvrir le port série, écrire et envoyer des chaînes de commandes de contrôle à la pompe. Ensuite, une classe d'adaptateur de démarrage rapide est définie spécifiquement pour la gestion des commandes Reglo ICC.
Nous allons parcourir des lignes de code qui démontrent comment effectuer des tâches courantes telles que le démarrage/l'arrêt de la pompe, le réglage de la vitesse, l'obtention du sens de rotation, etc.
%-------------------------------------------------
% 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)
Conclusion
Dans cet article de blog, nous avons présenté la pompe péristaltique Reglo ICC (Independent Channel Control) et exploré les bases de son contrôle externe via deux plateformes de programmation, Python et Matlab, en utilisant l'ensemble de commandes de communication Reglo ICC. Nous espérons que cet article servira de guide précieux pour les chercheurs et les ingénieurs souhaitant utiliser la pompe péristaltique Reglo ICC dans leurs recherches et expériences en microfluidique.
Restez à l'écoute pour plus d'informations, de tutoriels et d'applications pratiques dans nos futurs articles. D'ici là, bon pompage et bon codage 💻!
📧 If you have any questions or feedback, please feel free to contact us at support@darwin-microfluidics.com.


