10 포트 지원 PCBA 테스트 지그 – AT command, SPI 지원

AT Command 를 지원하는 아래와 같은 PCBA 모듈 제품 (Wi-Fi, 블루투스 모듈 등등) 개발 하거나, 이미 생산 중이라면 동시에 10개의 PCBA 모듈 기능을 검증하고, 테스트할 수 있는 PCBA 테스트 지그를 간단하게 소개한다. 공식 페이지는 여기 – https://twarelab.com/product

PCBA 모듈 예

PCBA 모듈이란 것은 아래 그림과 같은 소형 PCB 조립 모듈을 말한다. 요즘은 블루투스 모듈이나 Wi-Fi 모듈이 여기 범주에 포함된다. 이러한 대부분의 소형 PCBA 모듈 제품은 모듈을 제어하기 위한 명령을 주고 받는 인터페이스로 UART, RS232, SPI, 시리얼 등 몇 핀으로 통신을 할 수 있는 시리얼 인터페이스라고 불리는 핀을 통해 AT command 혹은 단순한 시리얼 커맨드를 이용하여 모듈의 기능을 제어 할 수 있도록 되어 있다.

![](assets/images/2023/02/image-11.png?resize=1378%2C360&ssl=1)
PCBA 모듈 예제

예를 들면, 위 그림에 언급된 WIZnet WizFi360과 ESP ESP8266 Wi-Fi 모듈들도 UART 를 이용한 명령(AT commands)을 지원하고 있다. 간단한 명령어 구성은 다음과 같다.

![](assets/images/2023/02/image-6.png?resize=669%2C451&ssl=1)
AT command examples – https://www.instructables.com/Get-Started-with-ESP8266-Using-AT-Commands-NodeMCU/

AT command 는 모듈에 Serial UART 를 연결하고, 위 테이블에 표현된 AT+RST 같은 문자열을 전달하면 모듈이 그에 맞는 동작을 수행해서 결과를 리턴해 주는 형태로, 모듈의 기능을 사용할 수 있게 하는 가장 간단한 방법이다.

테스트 지그 하드웨어

전체 하드웨어 모습은 아래 그림과 같다.

![](https://twarelab.com/images/product/img_structure1.svg)

카메라

테스트 제품 이력 추적을 위한 QR 코드 인식을 위한 카메라 부분이다. 제품에 QR 코드를 부착해서 생산하는 경우, 자동으로 인식하여 각각 개별 모듈에 자신의 QR 시리얼을 기록하는 기능을 제공한다.

Fixture 보드 부분

앞서 살펴본, 사용자 모듈이 직접 접촉 되는 부분이다. 기존의 지그들이 개발하는 모듈 별로 새로 만들어야 하는 단점을 없애기 위해 만든 부분이다. 이 보드 부분만 교체하면 여러가지 모듈을 하나의 지그에서 사용할 수 있다.

![](assets/images/2023/02/image-7.png?resize=291%2C150&ssl=1)

접촉된 핀에서 발생하는 시그널은 제어 모듈로 전달 되어 사용자 테스트 작업을 가능하게 한다. 접촉된 핀을 통해 UART AT Command 를 수신 할 수 있고, 다양한 GPIO 를 통해서도 모듈의 기능을 다양하게 검증, 테스트 할 수 있다. 예를 들어 보면,

  • UART 로 명령 전달 및 결과 수신
  • 리셋 핀 제어
  • GPIO 핀 상태 확인

등의 동작을 아주 쉽게 수행할 수 있다.

그리고, 10개의 모듈을 동시에 테스트할 수 있도록 접촉 핀이 충분히 준비 되어 있다. 한 모듈당 20개의 핀을 통해 동시에 개별 테스트를 진행할 수 있다. 현재 준비되어 있는 보드들은 아래와 같다. 아주 저렴한 비용으로 모듈 별 지그를 만들 수 있다.

![](assets/images/2023/02/image-9.png?resize=1130%2C481&ssl=1)

제어 모듈 (제품 후면)

10개의 모듈의 20핀 시그널을 받아서 독립적으로 처리해 부는 제어 모듈이 장착된 제어 보드가 있다. 이 보드를 통해 테스트 하고 싶은 PCBA 모듈의 기능을 바로 테스트해 볼 수 있다. 하나의 PCBA 모듈에 할당된 최대 20핀에서 지원되는 인터페이스는 아래와 같다.

  • UART
  • SPI
  • I2C
  • GPIO

그리고, SWD 를 이용한 Flash programmer 기능도 가지고 있어 10 포트 병렬 프로그래머의 형태로 활용이 가능하도록 구성되어 있다.

따라서, PCBA 개발자들은 단순히 여기에 명시된 인터페이스와 맞는 것만 있으면 별도의 전용 지그를 개발 하지 않고도, PCBA 모듈 전용 테스트 프로그램, Programmer, 기능 디버깅/검증 지그 시스템을 손쉽게 구축할 수 있다.

Django – Formview login required URL 변경

일반 함수에서는 @login_required 데코레이터를 사용하지만, FormView 같은 곳은 아래와 같이 @method_decorator(login_required … 이런식으로 사용한다.

from django.utils.decorators 
import method_decorator

@method_decorator(login_required, name='dispatch')
class CollaboratorView(View):

기본적인 함수 사용법은 많이 있지만, Formview 마다 로그인이 안되었을 때 각각 다른 페이지로 보내고 싶을 때가 있다. 이때 페이지를 지정하는 방법을 검색해서 남겨둔다.

@method_decorator(login_required(login_url="login_message"), name="dispatch")
class ShippingProductFWUpdateView(BSModalUpdateView):

  • login_url=”url이름” 을 파라메터로 넣어주면 된다.
  • 물론 url이름 에 정의된 부분은 url.py 등에 아래처럼 정의가 미리 되어 있어야 한다.
urlpatterns = [
    path("", index, name="index"),
    ...    
path("login_message", login_message_view, name="login_message"),

참고 페이지

Django – modelform 사용자 필드 추가 – 필드 순서 변경 방법

그냥 model 에 사용된 필드만 쓰면 별 고민이 없는데, 꼭 쓰다보면 사용자 정의 필드를 넣어줘야 할 때가 있다. 이때마다 생각이 안나서 일단 정리

필드를 그냥 변수 정의하듯이 정의해서 사용하면 된다.

class ShippingProductUpdateForm(BSModalModelForm):    title = ""    update_firmware_version = forms.CharField(label=_("*업데이트버전"), widget=forms.TextInput(attrs={"readonly": True}))    class Meta:        model = ShippingProduct        fields = ["product", "serial", "status", "version", "update_firmware_version", "date_shipping", "shipping_company"]        labels = {            "shipping_company": _("출고회사"),            "product": _("*상품"),            "serial": _("*시리얼"),            "status": _("*상태"),            "date_shipping": _("*출고일"),        }        widgets = {            "shipping_company": forms.Select(attrs={"class": ""}),            "product": forms.Select(attrs={"class": "", "placeholder": "상품"}),            "serial": forms.TextInput(attrs={"class": ""}),            "version": forms.TextInput(attrs={"readonly": True}),            "update_firmware": forms.TextInput(attrs={"readonly": True}),            "status": forms.Select(attrs={"class": ""}),            "date_shipping": forms.DateInput(attrs={"type": "date", "required": True}),        }    def __init__(self, *args, **kwargs):        super().__init__(*args, **kwargs)        self.title = "출고상품 수정"        self.fields["update_firmware_version"].initial = self.instance.update_firmware.version

필드 순서는 class Meta: 부분에 fields 에 적힌 순서대로 보여주니까 사용자 정의 필드도 여기에 이름을 추가하면 된다. 간단

참고 사이트