Comment ajouter des invites opérateur aux tests matériels
De nombreux tests de fabrication mélangent des mesures automatisées avec des étapes manuelles. L'opérateur doit charger un DUT, actionner un interrupteur, effectuer une inspection visuelle ou saisir une valeur. OpenHTF gère cela via des invites opérateur qui mettent le test en pause, affichent un message et collectent éventuellement une saisie. Ce guide explique comment ajouter des invites à vos tests et les afficher via l'interface opérateur TofuPilot.
Quand utiliser les invites
| Situation | Exemple |
|---|---|
| Chargement du DUT | « Placez la carte dans le montage et fermez le clamp » |
| Inspection visuelle | « Vérifiez l'absence de ponts de soudure sur le connecteur J1 » |
| Mesure manuelle | « Lisez l'étiquette et saisissez le code de lot » |
| Action physique | « Appuyez sur le bouton reset du DUT » |
| Décision go/no-go | « La LED s'allume-t-elle en vert ? » |
| Vérification de sécurité | « Vérifiez que le capot de sécurité est fermé » |
Les invites maintiennent l'opérateur dans le flux du test. Il voit l'instruction dans la même interface qui affiche les mesures et les résultats réussite/échec.
Prérequis
- Python 3.10+
- OpenHTF installé (
pip install openhtf) - SDK Python TofuPilot installé (
pip install tofupilot)
Étape 1 : Ajouter une invite simple
L'invite la plus simple affiche un message et attend que l'opérateur le confirme.
import openhtf as htf
from openhtf.plugs import user_input
@htf.plug(prompts=user_input.UserInput)
def phase_load_dut(test, prompts):
"""Attendre que l'opérateur charge le DUT."""
prompts.prompt(
"Placez la carte dans le montage de test. "
"Fermez le clamp et appuyez sur Entrée."
)Le test se met en pause à cette phase jusqu'à ce que l'opérateur réponde. Dans l'interface opérateur de TofuPilot, l'invite apparaît sous forme de carte avec le message et un bouton de confirmation.
Étape 2 : Collecter une saisie texte
Ajoutez text_input=True pour collecter une valeur auprès de l'opérateur. La chaîne retournée peut être stockée comme mesure.
@htf.plug(prompts=user_input.UserInput)
@htf.measures(
htf.Measurement("lot_code").with_args(docstring="Code de lot saisi par l'opérateur"),
)
def phase_enter_lot_code(test, prompts):
"""Demander à l'opérateur de scanner ou saisir le code de lot."""
lot = prompts.prompt(
"Scannez le code-barres du code de lot sur l'emballage.",
text_input=True,
)
test.measurements.lot_code = lotÉtape 3 : Utiliser les invites pour l'inspection visuelle
Combinez une invite avec une mesure pour enregistrer le résultat de l'inspection par l'opérateur.
@htf.plug(prompts=user_input.UserInput)
@htf.measures(
htf.Measurement("visual_result").equals("PASS"),
)
def phase_visual_inspection(test, prompts):
"""L'opérateur vérifie les défauts cosmétiques."""
result = prompts.prompt(
"Inspectez la carte sous grossissement. "
"Tapez PASS si aucun défaut trouvé, ou FAIL si des défauts sont présents.",
text_input=True,
)
test.measurements.visual_result = result.strip().upper()Étape 4 : Ajouter des invites entre les phases automatisées
Mélangez des phases avec invites et des phases automatisées dans le même test. L'opérateur voit un flux continu : les mesures automatisées s'exécutent, puis une invite apparaît, puis d'autres mesures automatisées.
from openhtf.util import units
@htf.measures(
htf.Measurement("supply_voltage_V")
.in_range(minimum=4.9, maximum=5.1)
.with_units(units.VOLT),
)
def phase_power_check(test):
"""Automatisé : mesure de la tension d'alimentation."""
test.measurements.supply_voltage_V = 5.01
@htf.plug(prompts=user_input.UserInput)
def phase_flip_board(test, prompts):
"""Demander à l'opérateur de retourner la carte pour le test face inférieure."""
prompts.prompt(
"Retournez la carte de sorte que la face inférieure soit vers le haut. "
"Appuyez sur Entrée quand vous êtes prêt."
)
@htf.measures(
htf.Measurement("bottom_connector_resistance_mOhm")
.in_range(maximum=100)
.with_units(units.OHM),
)
def phase_bottom_test(test):
"""Automatisé : mesure de la résistance du connecteur face inférieure."""
test.measurements.bottom_connector_resistance_mOhm = 38.5Étape 5 : Connecter à TofuPilot
Assemblez toutes les phases. Les phases avec invites sont rendues automatiquement dans l'interface opérateur TofuPilot. Aucune configuration supplémentaire n'est nécessaire.
from tofupilot.openhtf import TofuPilot
test = htf.Test(
phase_load_dut,
phase_enter_lot_code,
phase_power_check,
phase_visual_inspection,
phase_flip_board,
phase_bottom_test,
)
with TofuPilot(test):
test.execute(test_start=lambda: input("Scanner le numéro de série : "))Bonnes pratiques
| Pratique | Pourquoi |
|---|---|
| Gardez le texte de l'invite court (1-2 phrases) | Les opérateurs lisent en diagonale, ils ne lisent pas des paragraphes |
| Utilisez des verbes à l'impératif (« Placez », « Appuyez », « Scannez ») | Des instructions claires réduisent les erreurs |
| Une action par invite | Ne demandez pas à l'opérateur de faire trois choses à la fois |
| Validez la saisie opérateur | Utilisez .equals() ou .matches_regex() sur la mesure |
| Placez les invites aux pauses naturelles | Entre les séquences automatisées, pas au milieu d'une mesure |
| Évitez les invites inutiles | Chaque invite ajoute du temps de cycle. Automatisez ce que vous pouvez. |