# test-platform-service **Repository Path**: cloud-time/test-platform-service ## Basic Information - **Project Name**: test-platform-service - **Description**: Universal test platform is a test platform for testing incoming PCBA circuit boards, supporting GPIO, ADC, PWM, IIC, SPI, CAN, UART, TMC2209 and other MCU peripheral circuit detection. - **Primary Language**: Python - **License**: GPL-3.0 - **Default Branch**: test-box - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 1 - **Created**: 2022-09-06 - **Last Updated**: 2025-04-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # test-platform-service #### 介绍 - 通用测试平台是针对PCBA进线电路板的测试平台,支持GPIO、ADC、PWM、IIC、SPI、CAN、UART、TMC2209等MCU外围电路检测。 - 该平台分为service端和klipper端,此为service端代码,主要负责整个测试流程的控制,实现Klipper进程创建销毁、自动烧录、记录测试log、异常测试项显示等; - Klipper端基于开源3D打印平台Klipper实现,根据测试场景将所有通用的测试逻辑内聚成测试项命令,方便Service端以JSON配置文件的形式组合使用这些测试项命令,快速支持新PCBA检测; - 此外,Linux主机通过USB转CAN与测试底板MCU和被测PCBA MCU通信;烧录使用OpenOCD+DAPLink的方案实现; #### 软件架构 - 通用测试平台的代码由Service服务端和 Klippy Host端和Klippy MCU端构成 - Service 负责管理 Klippy host 进程的启动与销毁,以及整个测试流程的实现 - Klippy Host 负责各种 MCU 资源的控制,实现与MCU外设的交互 - Klippy MCU 则是实现具体的底层逻辑和交互接口 **Service 端** - controller2021-system - factory(生产相关文件) - cfg_scripts(openocd 配置文件) - display_log(显示模块log文件) - firmware(iqc固件 和 出厂固件) - tool(合成 boot.bin 和 app.bin 工具) - openocd.py(openocd 烧录工具) - log - klippy_log(klippy端运行log文件) - service_log(service端运行log文件) - src - hosts - klipper_admin.y(klippy can admin通信机制) - klippy.py(klippy 启动入口) - manager(通用测试平台功能模块) - can_admin.py(基于 klipper_admin.y 实现的封装) - display.py(service端的显示) - identify.py(被测板识别) - no_power.py(无电测试实现) - program.py(烧录相关接口) - entry.py(service 启动入口) - test_manager.py(实现全部测试流程) - test_scripts - 0000.json(通用脚本,用于加载被测板脚本前使用) - SPA0006.json(具体被测板的测试脚本) - ...... - autoboot.sh(开机自启流程) - config.json(service 和 klippy 通用配置文件,会根据被测板自动修改) **Klippy host 端** - controller2021-klipper - config - testbox(所有被测板的模板配置文件) - template-spxxxx.cfg - klippy - extras(功能模块) - imu.y(imu_check命令接口) - sm_display.py(显示与上下移动) - sm_current_detection.py(cnc电流检测和pwm控制) - sm_gxht3x.py(干燥箱温湿度传感器检测) - sm_iqc.py(串口通信检测) - sm_tester.py(通用测试平台IQC测试入口) - klippy.py(klippy 启动入口) - mcu.py(mcu 与 klippy host 交互) - reactor.py(协程调度器) - scripts - can_bus_query.py(查询CAN总线上的mcu uuid) **Klippy MCU 端** - controller2021-klipper - src(MCU源码) - generic - can_bus.c(can admin 命令) - serial_irq.c(serial_check 命令的MCU代码) - stm32 (底层外设控制接口) - sm_st7920(can admin 控制的st7920显示内容) - …… **Service 主要测试流程** - IQC测试流程(拨码开关ID1为0) - 扫描底板直到底板在线 - 根据拨码加载对应被测板测试脚本 - 无电测试(如果有) - 烧录IQC固件(如果需要) - 扫描被测板直到被测板在线 - 启动 Klippy host 进程 - Klippy启动后解析测试脚本 - 创建测试执行流 - 等待 Service 发送开始测试 - 等待 Klippy Ready 并开始测试 - 获取测试结果 - 销毁 Kippy进程并烧录出厂固件(如果需要) - 等待换板重新开始测试 - 烧录器流程(拨码开关ID1为1) - 扫描底板直到底板在线 - 根据拨码加载对应被测板测试脚本 - 烧录出厂固件 - 等待重新开始 #### 安装教程 - 该平台运行于Linux环境下,需要在任意Linux主机安装环境 - 安装openocd ``` sudo apt install openocd ``` - clone & 安装 klipper ``` git clone https://gitee.com/scotthsl/klipper.git ~/klipper/scripts/install-debian.sh ``` - clone 通用测试平台程序并切换到test-box分支 ``` mkdir iqc cd iqc https://gitee.com/cloud-time/test-platform-service.git https://gitee.com/cloud-time/test-platform-klipper.git ``` - 设置用户拥有串口使用权限以支持串口检测 ``` sudo usermod -aG dialout minipc ``` - 设置程序开机自启,将 autoboot.sh 路径添加到 testbox.service ``` # add this absulote path to /etc/systemd/system/testbox.service # /home/minipc/iqc/test-platform-service/autoboot.sh sudo cp /etc/systemd/system/klippy.service /etc/systemd/system/testbox.service sudo vim /etc/systemd/system/testbox.service sudo systemctl daemon-reload sudo systemctl enable testbox.service ### # sudo systemctl start testbox # sudo systemctl status testbox # sudo systemctl stop testbox # or add this absulote path to /etc/profile ``` #### 使用说明 **测试命令** - io_set:设置 io 电平 - cmd :指定测试项命令 - pin :指定控制的引脚,带 slave 前缀的为被测板 MCU 的引脚 - default :指定引脚初始化电平,默认 0(可选) - value :指定执行到该命令时引脚的输出电平 - delay :表示输出电平后延时等待的时间,单位 S(可选) - describe:对测试项命令的描述(可选) - `{"cmd":"io_set","pin":"PD14","delay":0.5,"value":1.0,"default":0.0} ` - `{"cmd":"io_set","pin":"slave:PA9","delay":0.5,"value":1.0,"delay":0.5,"default":0.0}` - io_check:检测 io 电平 - cmd :指定测试项命令 - pin :指定读取的引脚,带 slave 前缀的为被测板 MCU 的引脚 - value :指定执行到该命令时引脚的电平是否为该值 - describe:对测试项命令的描述(可选) - `{"cmd":"io_check","pin":"PD0","value":0.0}` - adc_check:检测 adc读回的值是否在范围内 - cmd :指定测试项命令 - pin :指定 adc 引脚,带 slave 前缀的为被测板 MCU 的引脚 - min_value:adc 检测的下限,单位 V - max_value:adc 检测的上限,单位 V - gain:放大倍数,adc读回的值会转化为 0-1 之间的百分比数值,即 adc 引脚 3.3V 读回 1 - describe:对测试项命令的描述(可选) - `{"cmd":"adc_check","pin":"slave:PA3","min_value":0.635,"max_value":0.9711,"gain":3.3}` - delay:延时 - cmd :指定测试项命令 - time :指定延时时间,单位 S - describe:对测试项命令的描述(可选) - `{"cmd":"delay","time":"0.2"}, #200ms` - stepper_move:电机控制测试,需要在 klippy host端的 template-spxxxxx.cfg 配置引脚 - cmd:测试项命令 - name:配置项别名 - pos:转动距离 - acc:加速度 - speed:转速 - describe:对测试项命令的描述(可选) - ``` #/home/orangepi/testbox/controller2021-klipper/config/testbox/template-spb0010.cfg [manual_stepper stepper_p1] step_pin = PB4 dir_pin = PB3 #enable_pin = slave:PB7 step_distance = .125 velocity = 100 accel = 5000 ``` - `{"cmd":"stepper_move","name":"stepper_p1","pos":50,"acc":1000,"speed":150},` - tmc_uart_check - imu_check:imu 芯片通讯检测,需要在 klippy host端的 template-spxxxxx.cfg 配置引脚 - cmd:测试项命令 - describe:对测试项命令的描述(可选) - ``` #/home/orangepi/testbox/controller2021-klipper/config/testbox/template-spb0010.cfg [imu] imu_en = 1 cs_pin = slave:PB12 spi_bus = spi2 ``` - `{"cmd":"imu_check"}` - serial_check:串口通信检测,主要用于被测板 ch340 芯片检测,需要在 klippy 端 make menuconfig 选择对应的串口,波特率为 115200,串口检测目前同时只能使用一个 - cmd:测试项命令 - describe:对测试项命令的描述(可选) - `{"cmd":"serial_check","describe":"PC_USART"},` - cs_adc_set:adc 设置,与 pwm_set 配合使用,用于 cnc 无刷电机电流检测 - cmd:测试项命令 - pin :指定 adc 引脚,带 slave 前缀的为被测板 MCU 的引脚 - sample_ticks:采样周期,单位 us - sample_count:采样多少次取平均 - reset_ticks:每两次采样间的间隔时间 - min_value:原始采样值,0 - 4095 - max_value:0 - 4095 - error_check_count:连续多少次采样值不在范围内时报错 - ``` #每1ms采一次,共40次取平均获得一次有效值进行判断 {"cmd":"cs_adc_set","pin":"slave:PA4","sample_ticks":1000,"sample_count":40,"reset_ticks":0, "min_value":15,"max_value":75,"error_check_count":5}, ``` - pwm_set:脉冲输出设置,与 cs_adc_set 配合使用,用于 cnc 无刷电机驱动 - cmd:测试项命令 - pin:软件 pwm 输出引脚 - cycle:脉冲周期 - duty:占空比 - count:输出脉冲数 - sample_start:cs_adc_set配置的 adc 在500个脉冲后开始检测 - `{"cmd":"pwm_set","pin":"slave:PA8","cycle":0.0001,"duty":0.2,"count":1000,"sample_start":500},` - over_current_protect_init - over_current_check - over_current_protect_en **新检具适配** - 在 /home/orangepi/testbox/controller2021-system/src/manager/identify.py 新增 ID 以支持新检具 - ID1:模式选择,0为 iqc 模式,1为烧录器模式 - ID2:板类型,0位模组,1为主控或其他 - ID3 - ID8 :具体的 id,最多同时支持64种不同的被测板 - 如 SPB0010 IQC检具 ID1- ID8 拨码表示:0 0 001101 - 如 SPB0010 烧录检具 ID1- ID8 拨码表示:1 0 001101 - ``` # ID1: 0:IQC mode 1:Programmer mode # ID2: 0:sm_module 1:other_module # ID3 - ID8: id_bit4 - id_bit0 (A total of 64) test_board_id = [ # ID2:0 sm_module { 13: "SPB0010", #fdm_2extruder 14: "SPB0017", #laser_10w 15: "SPB0007", #cnc_200w }, # ID2:1 other_module { 0:"SPA0006", #a400_kernel 1:"SPA0007", #a400_power 2:"SPJ0003", #j1_3dp adapter plates 3:"SPJ0014", #j1_main_board } ] ``` - 在 /home/orangepi/testbox/controller2021-system/test_scripts/ 下新增对应检具的测试脚本 - json 脚本有一些通用的配置仅需要少量修改 - 修改 pcba_info > slave 的 name 和 dev_id - 修改 display 的 log_path - 修改 program 的 iqc_firmware 和 factory_firmware ``` #/home/orangepi/testbox/controller2021-system/test_scripts/SPB0010.json { "pcba_info":{ "slave":{ "name":"SPB-0010", "dev_id":13, #若是无MUC被测板则 dev_id 为 “None” "hardware_version":"V1.0", "software_version":"V1.0.0" }, "master":{ "name":"SPT-0036", "dev_id":1536, "hardware_version":"V1.0", "software_version":"V1.0.0", "specific":{ "start_pin":"PG8", "slave_power_ctl_pin":"PG9", "led_ng_pin":"PG11", "led_pass_pin":"PG10", "key_a_pin":"PG13", "key_b_pin":"PG14", "key_c_pin":"PG15", "id_0":"PG0", "id_1":"PG1", "id_2":"PG2", "id_3":"PG3", "id_4":"PG4", "id_5":"PG5", "id_6":"PG6", "id_7":"PG7" } } }, "display":{ "cs_pin":"PB12", "sclk_pin":"PB13", "sid_pin":"PB15", "log_path":"./factory/display_log/SPB-0010/display.log", #显示屏显示log路径 "save_error_info":1 #是否保显示屏显示的错误信息 }, "program":{ "/* platform */":"This property can be assigned the value of RaspberryPi or Ubantu", "platform":"RaspberryPi", "flash_driver":"stm32f1x", #stm32f1x 或 stm32f4x "enable":1, #使能烧录 "initial_sn":1000, #出厂烧录起始SN码 "max_sn":100000, #出厂烧录最大SN码 "address":"0x8005010", #出厂烧录SN码存放地址 "lock_enable": 0, #无用,默认iqc 不加锁,出厂加锁 "iqc_firmware":"./factory/firmware/SPB-0010/iqc_firmware.bin", "factory_firmware":"./factory/firmware/SPB-0010/factory_firmware.bin" }, "test_items":{ "iqc":{ "@no_power":[ #无电测试,加@表示屏蔽不使用 { "test_object":"left_hot_end", "test_cmds":[ ] } ], #on_power_first 先执行,一个test_object就是一个执行流,每个执行流之间并行执行 #on_power_later 在 on_power_first 执行完后执行,通常可以在 on_power_first执行一些冲突的测试项命令, #在 on_power_later 并行执行不冲突的执行流 "on_power_first":[ { "test_object":"left_hot_end", "test_cmds":[ ] } ], "on_power_later":[ { "test_object":"MOTOR_MOVE", "test_cmds":[ ] }, { "test_object":"MOTOR_MOVE", "test_cmds":[ ] } ] } } } ``` - 在 /home/orangepi/testbox/controller2021-system/factory/firmware/ 下增加对应检具的 iqc 固件 iqc_firmware.bin 和出厂固件 factory_firmware.bin - iqc固件可在 klippy端命令行使用 make menuconfig 进行配置 - 根据被测板MCU选择对应芯片 - GD32F103 对应 STM32F103 - GD32F407 对应 STM32F407 - 晶振根据被测板MCU晶振选择,通常GD32F103是8M,GD32F305是8M/25M,GD32F407是25M - 模组类被测板(SPBxxxx)bootloader offset 需要选择 snapmaker bootloader - 主控类被测板(SPAxxxx)bootloader offset 需要选择 no bootloader - 如果被测板需要进行串口检测,则需要在 communication interface 选择相应串口并配置波特率为115200 - 根据被测板的CAN引脚选择相应的CAN接口,波特率配置为 500000 - 通用测试底板固件配置 - 芯片选择 STM32F103 - bootloader offset 需要选择 snapmaker bootloader - 根据被测板的CAN引脚选择相应的CAN接口,波特率配置为 500000 - 在 /home/orangepi/testbox/controller2021-klipper/config/testbox/ 下增加对应检具的模板配置文件 template-spxxxxx.cfg,service 端程序运行时根据该模板生成实际使用的配置文件(run-spxxxxx.cfg) - 配置说明 ``` #template-spxxxxx.cfg #测试底板MCU配置,固定配置 [mcu] canbus_uuid: c025be35657f # canbus_interface = can0 #被测板MCU配置,自动生成,可忽略 #[mcu slave] #canbus_uuid = ea6e0599a237 #canbus_interface = can0 #固定配置 [printer] kinematics: none max_velocity: 300 max_accel: 3000 #显示配置,固定配置 [display] lcd_type = snapmaker_st7920 cs_pin = PB12 sclk_pin = PB13 sid_pin = PB15 display_group = snapmaker_test_group #固定配置 [display_data snapmaker_test_group title] position = 0, 0 text = Ready #电机配置,根据实际硬件配置引脚,如有电机控制才需要加入 [manual_stepper stepper_p1] step_pin = slave:PB13 dir_pin = slave:PB12 #enable_pin = slave:PB2 step_distance = .125 velocity = 100 accel = 5000 [manual_stepper stepper_p2] step_pin = slave:PC2 dir_pin = slave:PC1 #enable_pin = slave:PB2 step_distance = .125 velocity = 100 accel = 5000 #电机控制芯片为 tmc2209 时配置 [tmc2209 stepper_p1] uart_pin = slave:PD9 select_pins = slave:PB15,slave:PD10,slave:PD11 microsteps = 16 run_current = 1.0 hold_current = 0.5 uart_address = 3 sense_resistor = 0.1 [tmc2209 stepper_p2] uart_pin = slave:PD9 select_pins = slave:!PB15,slave:PD10,slave:PD11 microsteps = 16 run_current = 1.0 hold_current = 0.5 uart_address = 3 sense_resistor = 0.1 #imu 配置,如有imu芯片检测时加入 [imu] imu_en = 1 cs_pin = slave:PB12 spi_bus = spi2 #调试用,固定配置 [sm_tester] debug = off test_type = iqc ``` #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)