Balance (Windows...par la fenêtre)

Highland.png

Voici un petit programme de communication entre un ordinateur et une balance électronique. Lors d'une pesée au bureau, cela permet d'afficher sur grand écran (via un vidéoprojecteur) le résultat de la mesure.

Dans sa version 1.0, il peut communiquer avec les modèles suivants :

  - ADAM Highland (modèle HCB1002, mais d'autres modèles pourraient convenir)

  - PRECISA 125A

Le fichier à télécharger : Balance_V1.zip

Mode d'emploi pour la balance ADAM Highland :

Pour la balance ADAM Highland, la connexion se fait par un câble USB. C'est en fait de la communication série (la balance comporte un circuit intégré de conversion USBsérie).

Il faut s'assurer que les paramètres de communication de la balance et ceux du logiciel sont bien compatibles. Voici la façade de la balance Highland :

facade_highland.png

1- Allumer la balance et appuyer sur le bouton "Mode" pendant la phase d'autotest de la balance

2- L'afficheur affiche "F1 UNT" : appuyer sur "Mode" pour avoir "F3 SEr"

3- Appuyer sur "Tare" pour entrer dans ce menu : la balance affiche "S USb" ou "S 232" selon qu'elle est en mode USB ou en mode série (RS232). Le bouton mode permet de passer d'un mode à l'autre -> choisir le mode "S USb" et appuyer sur "Tare" pour valider

4- Dans le menu suivant, choisir le mode "P1 Prt" si ce n'est déjà fait, à l'aide du bouton "Mode". "Tare" permet de passer au menu suivant

5- On y règle la vitesse de communication : choisir "b 9600" avec le bouton "Mode". Valider avec "Tare".

6- Là on choisit le protocole de communication : "8 n 1" toujours avec le bouton "Mode" et on valide avec "Tare".

7- Enfin on choisit le format d'affichage "For 2".

Eteindre et allumer de nouveau la balance. Tous ces réglages restent conservés...donc plus besoin d'y revenir. En cas de problème de communication, reprendre la procédure décrite pour vérifier.

Brancher le câble USB sur la balance et lancer le logiciel : la balance sera vue comme un port USB<->série (ttyUSB).

- Sélectionner ce port,

- Cliquer sur le bouton "Ouvrir"

- Démarrer les mesures en cliquant sur "Marche/Arrêt"...

- On refermera le port avant de quitter le logiciel.

 

 

Mode d'emploi pour la balance PRECISA 125A

On utilise ici un câble série 25 broches mâle vers 9 broches femelle, suivi éventuellement d'un câble de conversion USB série (exemple : Câble USB-série FTDI UC232R-10 ) pour se connecter sur un port USB du PC.

Pas de paramétrage sur la balance.

Lancer le logiciel : la balance sera vue comme un port série (tty) ou USBsérie (ttyUSB).

- Sélectionner ce port,

- Cliquer sur le bouton "Ouvrir"

- Démarrer les mesures en cliquant sur "Marche/Arrêt"...

- On refermera le port avant de quitter le logiciel.

 Le même objet sur la PRECISA 125 :

Precisa.png

Remarque : on peut ouvrir plusieurs instances du logiciel pour piloter plusieurs balances. Voilà de quoi introduire la notion de précision !

 Pour les curieux, voici le code source :

  1. #!/usr/bin/python
  2. #-*- coding: iso-8859-15 -*-
  3.  
  4.  
  5. # Copyright 2014 Vincent LE MIEUX
  6.  
  7. # Contact : vlemieux@laboiteaphysique.fr
  8.  
  9. # La version la plus récente de ce programme se trouve
  10. # sur le site de l'auteur : www.laboiteaphysique.fr
  11.  
  12. # Ce programme est un logiciel libre ; vous pouvez le redistribuer ou le modifier suivant
  13. # les termes de la GNU General Public License telle que publiée par la Free Software Foundation ;
  14. # soit la version 3 de la licence, soit (à votre gré) toute version ultérieure.
  15.  
  16. # Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE ;
  17. # sans même la garantie tacite de QUALITÉ MARCHANDE ou d'ADÉQUATION à UN BUT PARTICULIER.
  18. # Consultez la GNU General Public License pour plus de détails.
  19.  
  20. # Vous devez avoir reçu une copie de la GNU General Public License en même temps que ce programme ;
  21. # si ce n'est pas le cas, consultez <http://www.gnu.org/licenses>.
  22.  
  23. from __future__ import division
  24. from gi.repository import Gtk, GObject
  25. import os, sys
  26. import serial
  27. import string
  28. from time import sleep
  29. import glob
  30.  
  31. class BALANCE:
  32. def __init__(self):
  33.  
  34. self.builder = Gtk.Builder()
  35. self.builder.add_from_file("balance.glade")
  36.  
  37. #recuperation des widgets utilises par le programme :
  38. self.lbAff = self.builder.get_object("lbAff")
  39. self.lbModele = self.builder.get_object("lbModele")
  40. self.btTare = self.builder.get_object("btTare")
  41. self.tgOnOff = self.builder.get_object("tgOnOff")
  42. self.btOuvrir = self.builder.get_object("btOuvrir")
  43. self.btFermer = self.builder.get_object("btFermer")
  44. self.btQuitter = self.builder.get_object("btQuitter")
  45. self.btRafraichir = self.builder.get_object("btRafraichir")
  46. self.comboPort = self.builder.get_object("comboPort")
  47. self.comboModele = self.builder.get_object("comboModele")
  48.  
  49. self.lb_etat = self.builder.get_object("lb_etat")
  50. self.lb_etat.set_text("Connexion non établie")
  51.  
  52.  
  53. self.builder.connect_signals(self)
  54.  
  55. window = self.builder.get_object('window')
  56. window.show_all()
  57.  
  58. self.lister_ports()
  59.  
  60. #initialisations :
  61. self.Mesurer = False
  62. self.sortie =""
  63. self.port_serie = " "
  64. self.port_choisi = " "
  65.  
  66. self.comboModele.set_active(0) # ModÚle Adam Highland par défaut
  67. self.btFermer.set_sensitive(False)
  68. self.btTare.set_sensitive(False)
  69. self.tgOnOff.set_sensitive(False)
  70.  
  71. def on_comboModele_changed(self,widget):
  72. self.modele = self.comboModele.get_active()
  73. self.lbModele.set_text(self.comboModele.get_active_text())
  74.  
  75. if self.modele == 0 : # ModÚle Adam Highland par défaut
  76. self.lbAff.set_text('xxxx.xx g')
  77. self.delai = 2000
  78. self.debit = 9600
  79. self.data_format = serial.EIGHTBITS
  80. self.stop = serial.STOPBITS_ONE
  81. self.parite = serial.PARITY_NONE
  82. self.tare = 'Z' + '\r' + '\n'
  83.  
  84. if self.modele == 1 : # Balance Precisa 125
  85. self.lbAff.set_text('xxx.xxxx g')
  86. self.delai = 2000
  87. self.debit = 9600
  88. self.data_format = serial.SEVENBITS
  89. self.stop = serial.STOPBITS_ONE
  90. self.parite = serial.PARITY_EVEN
  91. self.tare = 'T' + '\r' + '\n'
  92.  
  93. def lister_ports(self) :
  94. list_port = glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyS*')
  95. i = 0
  96. while i < len(list_port):
  97. self.comboPort.append_text(list_port[i])
  98. i=i+1
  99.  
  100. def lecture(self) :
  101. if self.timer_id is not None:
  102. self.modele = self.comboModele.get_active()
  103. if self.modele == 0: # cas du modÚle Adam Highland
  104. self.port_serie.write('P' + '\r' + '\n')
  105. sleep(0.5)
  106. chaine = ""
  107. data = []
  108. n_data = self.port_serie.inWaiting()
  109. print n_data
  110. if n_data > 0 :
  111. for i in range (n_data) :
  112. data.append(ord(self.port_serie.read(1)))
  113. chaine += chr(data[i])
  114. index = chaine.find('g')
  115. if index <> -1 :
  116. self.sortie = chaine[index - 14 : index -12] + chaine[index -7 : index +2]
  117. self.lbAff.set_text(self.sortie)
  118.  
  119. if self.modele == 1: # cas du modele Precisa 125A
  120.  
  121. chaine = ""
  122. data = []
  123. n_data = self.port_serie.inWaiting()
  124. print n_data
  125. if n_data > 0 :
  126. for i in range (n_data) :
  127. data.append(ord(self.port_serie.read(1)))
  128. chaine += chr(data[i])
  129. index = chaine.find('g')
  130. if index <> -1 :
  131. self.sortie = chaine[index - 13 : index + 2]
  132. self.lbAff.set_text(self.sortie)
  133. self.port_serie.flushInput()
  134. return True
  135. else:
  136. return False
  137.  
  138. def on_tgOnOff_toggled(self,widget):
  139. if widget.get_active():
  140. self.timer_id = GObject.timeout_add(self.delai, self.lecture)
  141. self.btFermer.set_sensitive(False)
  142. self.btQuitter.set_sensitive(False)
  143. self.btTare.set_sensitive(True)
  144. else:
  145. self.timer_id = None
  146. self.btTare.set_sensitive(False)
  147. self.btFermer.set_sensitive(True)
  148.  
  149.  
  150. def on_btTare_clicked(self,widget):
  151.  
  152. self.port_serie.write(self.tare)
  153.  
  154. def on_btRafraichir_clicked(self,widget):
  155. #Rafraichir la liste des ports série disponibles
  156. self.comboPort.remove_all()
  157. self.lister_ports()
  158.  
  159. def on_btOuvrir_clicked(self,widget):
  160. #ouverture du port s�©rie choisi:
  161. # recuperation des parametres choisis :
  162. self.port_choisi = self.comboPort.get_active_text()
  163.  
  164. try:
  165. # activation/desactivation de widgets :
  166. self.comboPort.set_sensitive(False)
  167. self.comboModele.set_sensitive(False)
  168. self.btRafraichir.set_sensitive(False)
  169. self.btFermer.set_sensitive(True)
  170. self.btOuvrir.set_sensitive(False)
  171. self.btQuitter.set_sensitive(False)
  172. self.btTare.set_sensitive(False)
  173. self.tgOnOff.set_sensitive(True)
  174.  
  175.  
  176. #ouverture du port serie :
  177. self.port_serie = serial.Serial(
  178. port=self.port_choisi,
  179. baudrate = self.debit,
  180. bytesize = self.data_format,
  181. parity = self.parite,
  182. stopbits = self.stop,
  183. timeout=2
  184. )
  185. self.lb_etat.set_text("Etat : balance connectée")
  186. #vidage du port :
  187. self.port_serie.flushInput()
  188.  
  189.  
  190. except :
  191. self.comboPort.set_sensitive(True)
  192. self.btOuvrir.set_sensitive(True)
  193. self.btRafraichir.set_sensitive(True)
  194.  
  195. #self.bt_fermer.set_sensitive(False)
  196. self.ouvert = False
  197. msg = "Erreur lors de l'ouverture du port série : ce port n'est peut-être pas valide, ou bien vous n'avez pas les droits pour accéder aux ports séries"
  198. dialog = Gtk.MessageDialog(None, 0, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK, msg)
  199. # Montre le dialog
  200. dialog.run()
  201. # Destruction du dialog
  202. dialog.destroy()
  203.  
  204. def on_btFermer_clicked(self,widget):
  205. #fermeture du port série ouvert
  206. try :
  207. if self.port_serie.isOpen() == True:
  208.  
  209. self.port_serie.close()
  210. self.comboPort.set_sensitive(True)
  211. self.comboModele.set_sensitive(True)
  212. self.btOuvrir.set_sensitive(True)
  213. self.btRafraichir.set_sensitive(True)
  214. self.btFermer.set_sensitive(False)
  215. self.btQuitter.set_sensitive(True)
  216. self.btTare.set_sensitive(False)
  217. self.tgOnOff.set_sensitive(False)
  218.  
  219. self.lb_etat.set_text("Etat : balance déconnectée")
  220. self.lbAff.set_text('xxx.xx g')
  221.  
  222.  
  223. except :
  224. msgFermer = "Erreur lors de la fermeture du port série !"
  225. dlgFermer = Gtk.MessageDialog(None, 0, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK, msgFermer)
  226. dlgFermer.run()
  227. dlgFermer.destroy()
  228.  
  229. def on_btQuitter_clicked(self,widget):
  230.  
  231. Gtk.main_quit()
  232.  
  233. def destroy(window, self):
  234.  
  235. Gtk.main_quit()
  236.  
  237. def main():
  238. app = BALANCE()
  239. Gtk.main()
  240.  
  241. if __name__ == "__main__":
  242. sys.exit(main())
  243.  

This site uses cookies. Some of the cookies we use are essential for parts of the site to operate and have already been set. You may delete and block all cookies from this site, but parts of the site will not work.