[PYTHON] Automatisation des tests à partir de L-Chika (3) Incorporation d'un oscilloscope

1.Tout d'abord

Il s'agit de la troisième série d'automatisation de tests à commencer par L Chika.

Compte tenu de la situation récente d'économie d'énergie, la méthode d'éclairage de la LED à tester est passée de [Éclairage statique](https://www.google.co.jp/search?hl=ja&as_q= Éclairage statique) à [Éclairage dynamique](https: / /www.google.co.jp/search?hl=ja&as_q=dynamic lighting) sera modifié. Par conséquent, nous modifierons le banc de test afin que le jugement Go / No-Go puisse être effectué automatiquement en mesurant la tension d'éclairage et la fréquence d'éclairage de la LED avec un oscilloscope.

IMG_0603s.jpg

S'il vous plaît voir ici pour les articles jusqu'à présent.

  1. Automatisation des tests à partir de L Chika
  2. Automatisation des tests à partir de L Chika (2) Amélioration de la maintenabilité des scripts de test

2. Réparation de la cible de test

Passez d'un éclairage statique à un éclairage dynamique avec 1000 Hz et un rapport cyclique de 50%. tone (), [noTone ()](https://www.arduino.cc/reference/ En / language / functions / advanced-io / notone /) contrôle l'éclairage / l'extinction.

ArduinoLedLight.ino(Changer de pièce)


void Led::on(void)
{
    //digitalWrite(m_led_pin, HIGH);
    tone(m_led_pin, 1000);
}

void Led::off(void)
{
    //digitalWrite(m_led_pin, LOW);
    noTone(m_led_pin);
}

3. Réparation du testeur

--Ajoutez la commande suivante.

|commander|argument|une fonction |-----------+----------------+---- |open_dso |Aucun|-Importer PyVISA et ouvrir l'oscilloscope |dso |Commande VISA|・ Envoyer et recevoir des commandes vers et depuis l'oscilloscope
・ Inclus dans les données reçues","Est"-"Remplacer par |eval_dbl_eq|Valeur attendue(type double[^1])|・変数valがValeur attendueの値(type double)Égal à |eval_dbl_gt|Valeur standard(type double)|・変数valがValeur standard(type double)Évaluer si supérieur à |eval_dbl_lt|Valeur standard(type double)|・変数valがValeur standard(type double)Évaluer si plus petit

-Veuillez installer PyVISA [^ 2].

test-runner.py


#!/usr/bin/python3

#
# This software includes the work that is distributed in the Apache License 2.0
#

from time import sleep
import serial
import codecs
import csv
import sys
import visa

UNINITIALIZED = 0xdeadbeef

def serial_write(h, string):
    if h == UNINITIALIZED:
        print("UART Not Initialized.")
        return False
    else:
        string = string + '\n'
        string = str.encode(string)
        h.write(string)
        return True


def open_dso():
    rm = visa.ResourceManager()
    resources = rm.list_resources()
    #print(resources)
    for resource in resources:
        #print(resource)
        try:
            dso = rm.open_resource(resource)
        except:
            print(resource, "Not Found.")
        else:
            print(resource, "Detected.")
            return dso

    #Throw an error to caller if none succeed.
    return dso


def main():
    is_passed = True
    val = str(UNINITIALIZED)
    dso = UNINITIALIZED
    uart = UNINITIALIZED
    arg = [""]

    with codecs.open('script.csv', 'r', 'utf-8') as file:
        script = csv.reader(file, delimiter=',', lineterminator='\r\n', quotechar='"')

        with codecs.open('result.csv', 'w', 'utf-8') as file:
            result = csv.writer(file, delimiter=',', lineterminator='\r\n', quotechar='"')

            for cmd in script:
                print(cmd)

                if "#" in cmd[0]:
                    pass

                elif cmd[0]=="sleep":
                    sleep(float(cmd[1]))
                    cmd.append("OK")

                elif cmd[0]=="open_dso":
                    try:
                        dso = open_dso()
                    except:
                        cmd.append("NG")
                        is_passed = False
                    else:
                        cmd.append("OK")

                elif cmd[0]=="dso":
                    try:
                        if "?" in cmd[1]:
                            val = dso.query(cmd[1]).rstrip().replace(",", "-")
                            cmd.append(val)
                        else:
                            dso.write(cmd[1])
                            cmd.append("OK")
                    except:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="open_uart":
                    try:
                        uart = serial.Serial(cmd[1], 115200, timeout=1.0, dsrdtr=1)
                        cmd.append("OK")
                    except:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="send":
                    ret = serial_write(uart, cmd[1])
                    if ret == True:
                        cmd.append("OK")
                    else:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="rcvd":
                    try:
                        val = uart.readline().strip().decode('utf-8')
                        cmd.append(val)
                        cmd.append("OK")
                    except:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="eval_str_eq":
                    if str(val) == str(cmd[1]):
                        cmd.append("OK")
                    else:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="eval_int_eq":
                    if int(val) == int(cmd[1]):
                        cmd.append("OK")
                    else:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="eval_int_gt":
                    if int(val) > int(cmd[1]):
                        cmd.append("OK")
                    else:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="eval_int_lt":
                    if int(val) < int(cmd[1]):
                        cmd.append("OK")
                    else:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="eval_dbl_eq":
                    if float(val) == float(cmd[1]):
                        cmd.append("OK")
                    else:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="eval_dbl_gt":
                    if float(val) > float(cmd[1]):
                        cmd.append("OK")
                    else:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="eval_dbl_lt":
                    if float(val) < float(cmd[1]):
                        cmd.append("OK")
                    else:
                        cmd.append("NG")
                        is_passed = False

                else:
                    cmd.append("#")

                print(cmd)
                result.writerow(cmd)

                if is_passed == False:
                    print("FAIL")
                    sys.exit(1)

    if is_passed == True:
        print("PASS")
        sys.exit(0)


main()

4. Script de test et générateur de script

4.1 Script de test (fonction unique)

Ajoutez le script de test suivant au dossier script-parts.

--La commande VISA est un exemple d'oscilloscope RIGOL. --Veuillez faire correspondre la chaîne de caractères du modèle de setup_dso.csv à votre modèle.

setup_dso.csv


#
# Setup DSO
open_dso,
dso,*IDN?
eval_str_eq,RIGOL TECHNOLOGIES-DS1104Z-XXXXXXXXXXXXXX-00.04.04.SP3

dso_write_timescale_200us.csv


#
# Timebase Scale 200us
dso,:TIMebase:SCALe 0.0002

dso_query_vmax_gt1700-lt1900.csv


#
# 1.80V +/- 0.10V
dso,:MEASure:VMAX? CHANnel1
eval_dbl_gt,1.70
eval_dbl_lt,1.90

dso_query_freq_gt995-lt1005.csv


#
# 1000Hz +/- 5Hz
dso,:MEASure:FREQuency? CHANnel1
eval_dbl_gt,995
eval_dbl_lt,1005

4.2 Générateur de scripts

Les deux points suivants ont été réparés.

script-generator.bat


REM script generator for LED Light Test Bench

set script_parts_dir=script-parts
set script_file_name=script.csv

Configuration du banc d'essai REM
copy /b %script_parts_dir%\setup.csv %script_file_name%

Configuration de l'oscilloscope numérique REM
copy /b %script_file_name% + %script_parts_dir%\setup_dso.csv
copy /b %script_file_name% + %script_parts_dir%\dso_write_timescale_200us.csv

La LED REM n'est pas allumée(La tension de la LED est inférieure à 200 mV)
copy /b %script_file_name% + %script_parts_dir%\eval_int_lt0200.csv

Allumez le relais REM et
copy /b %script_file_name% + %script_parts_dir%\operation_relay_on.csv
REM 1.La tension d'éclairage LED est supérieure à 1700 mV et inférieure à 1900 mV
copy /b %script_file_name% + %script_parts_dir%\dso_query_vmax_gt1700-lt1900.csv
REM 2.La fréquence d'éclairage LED est supérieure à 995 Hz et inférieure à 1005 Hz
copy /b %script_file_name% + %script_parts_dir%\dso_query_freq_gt995-lt1005.csv

Le relais REM est désactivé et la tension de la LED est inférieure à 200 mV.
copy /b %script_file_name% + %script_parts_dir%\operation_relay_off.csv
copy /b %script_file_name% + %script_parts_dir%\eval_int_lt0200.csv

5. Résultat de l'exécution du test

result.csv


# setup
# wait for if restart Arduino Uno
sleep,2,OK
#
# Open UART
open_uart,COM3,OK
#
# model and version check
send,i,OK
rcvd,Arduino Test Bench Ver.100,OK
eval_str_eq,Arduino Test Bench Ver.100,OK
#
# relay assigned Pin number check
send,p,OK
rcvd,12,OK
eval_int_eq,12,OK
#
# Setup DSO
open_dso,,OK
dso,*IDN?,RIGOL TECHNOLOGIES-DS1104Z-XXXXXXXXXXXXXX-00.04.04.SP3
eval_str_eq,RIGOL TECHNOLOGIES-DS1104Z-XXXXXXXXXXXXXX-00.04.04.SP3,OK
#
# Timebase Scale 200us
dso,:TIMebase:SCALe 0.0002,OK
#
# eval_int_lt0200
send,v,OK
rcvd,0,OK
eval_int_lt,200,OK
#
# relay ON
send,n,OK
sleep,1,OK
#
# 1.80V +/- 0.10V
dso,:MEASure:VMAX? CHANnel1,1.840000e+00
eval_dbl_gt,1.70,OK
eval_dbl_lt,1.90,OK
#
# 1000Hz +/- 5Hz
dso,:MEASure:FREQuency? CHANnel1,9.999999e+02
eval_dbl_gt,995,OK
eval_dbl_lt,1005,OK
#
# relay OFF
send,f,OK
sleep,1,OK
#
# eval_int_lt0200
send,v,OK
rcvd,0,OK
eval_int_lt,200,OK

6. Conclusion

Le jugement Go / No-Go basé sur le résultat de la mesure de l'oscilloscope peut être automatisé par Python \ (^ o ^) /

[^ 1]: Python float est un nombre à virgule flottante double précision, mais en général, float est simple précision et double est double précision, il est donc écrit en double type ici. [^ 2]: Le site officiel fournit des instructions d'installation à l'aide de la commande pip. De plus, la procédure que j'ai installée dans l'environnement Miniconda avec la commande conda est [ici](https://qiita.com/pbjpkas/items/bd483d4773468e26414c#22-python%E5%AE%9F%E8%A1%8C%E7% 92% B0% E5% A2% 83).

Recommended Posts

Automatisation des tests à partir de L-Chika (3) Incorporation d'un oscilloscope
Automatisation des tests à partir de la caméra Web intégrée L-Chika (5) et de l'OCR
Créez un environnement pour l'automatisation des tests avec AirtestIDE (Astuces)
Jugement des nombres premiers avec Python
Renforcez avec le test de code ⑦
Renforcez avec le test de code ⑨
Renforcez avec le test de code ③
Renforcez avec le test de code ⑤
Jugement des nombres premiers avec python
Python à partir de Windows 7
GRPC commençant par Python
Renforcez avec le test de code ②
test de coopération de balises python
Renforcez avec le test de code ①
Automatisation des tests pour le travail
Renforcez avec le test de code ⑧
Renforcez avec le test de code ⑨
La vraie valeur de l'automatisation Terraform à partir d'Oracle Cloud