Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| modularpi:python:aipyhmi:index [2026/02/15 02:45] – [AI를 이용한 HMI(UI)개발 (Copilot AI + Qt Designer)] admin | modularpi:python:aipyhmi:index [2026/04/02 00:56] (current) – [✔ CFAD 상태 및 조건] admin | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== AI를 이용한 HMI(UI)개발 (Copilot AI + Qt Designer) ====== | ====== AI를 이용한 HMI(UI)개발 (Copilot AI + Qt Designer) ====== | ||
| - | 본 장에서는 **AI를 활용하여 Qt Designer로 설계한 HMI UI(.ui 파일)**를 기반으로 HMI 프로그램을 개발하는 방법을 설명합니다. | ||
| - | UI 화면은 .ui 파일을 통해 프로그램에 적용되며, | ||
| - | | + | 본 장에서는 |
| - | | + | |
| - | * AI를 활용한 개발 방식은 Vibe Coding 개념으로 구현 가능. | + | |
| - | ☞ //**Vibe Coding**은 개발자의 의도를 자연어로 | + | UI 화면은 '' |
| + | |||
| + | * **Qt Designer**: HMI 구성 화면 설계 (.ui 파일 생성) | ||
| + | * **VS Code Copilot**: '' | ||
| + | * **Vibe Coding**: 개발자의 의도를 자연어로 전달하고 AI가 생성한 코드를 검증/수정하는 직관적 개발 방식 | ||
| {{ : | {{ : | ||
| - | LOL** 본 예제 | + | > **프로젝트 |
| - | 또한 UI 기능을 항목별로 구분하여, | + | > 본 예제는 산업 현장 실무에서 사용되는 HMI 구성을 기준으로 제작되었으며, AI를 활용한 |
| - | =====1. Copilot 설치 ===== | + | ===== 1. Copilot 설치 ===== |
| - | Copilot Chat은 VS Code 내부에서 | + | Copilot Chat은 VS Code 내부에서 프로젝트 문맥을 이해한 상태로 대화형 AI 지원을 제공합니다. |
| - | * [[https:// | + | |
| - | * **코드 작성 도움, 기존 코드 설명, 리팩토링 / 버그 수정, | + | |
| - | GitHub Copilot AI를 설치하여 사용하기 위해서는 GitHub 계정 로그인 및 권한 승인이 필요합니다. 아래 절차에 따라 설치를 진행합니다. | + | |
| - | * 1. GitHub Copilot, GitHub Copilot Chat 확장 검색 및 설치 | + | |
| - | * 2. GitHub 계정 로그인 및 사용 권한 승인 | + | |
| - | * 3. Copilot 활성화 상태 확인 | + | |
| - | 설치와 GitHub 계정 로그인이 정상적으로 완료되면, | + | |
| - | {{ : | + | |
| - | =====2. main.py 에.ui 등록 ===== | + | |
| - | 프로젝트 구성 파일(.ui, main.py, 이미지 파일)을 동일한 프로젝트 폴더에 배치한 후, | + | |
| - | Vibe Coding(Ai) 방식을 활용하여 main.py 메인 프로그램을 작성하고 HMI 디자인 화면을 실제로 띄우는 방법을 설명합니다. | + | |
| - | * **프로젝트 구성** : main.py, .ui, 이미지 파일, 이미지가 포함된 Resource.qrc | + | |
| - | * **Agent 기능** : Copilot AI의 에이전트 기능을 사용하여 코드 생성을 적용할 수 있으며, 이를 통해 빌드 및 실행이 가능합니다. | + | |
| - | < | + | * [[https:// |
| - | === Vibe Coding(Ai) === | + | * **주요 기능**: 코드 작성 도움, 기존 코드 설명, 리팩토링, |
| - | Qt Designer로 제작한 CFNET_AI.ui 파일을 사용하여 UI를 실행할 수 있는 main.py 기본 | + | |
| - | 실행 환경은 Raspberry Pi 5의 Debian Bookworm | + | ==== 설치 절차 ==== |
| - | .ui 파일을 로드하여 메인 윈도우를 실행하는 최소한의 기본 구조 코드로 작성해 주시기 | + | - GitHub Copilot 및 GitHub Copilot Chat 확장 프로그램 검색 및 설치 |
| + | - GitHub 계정 로그인 및 사용 권한 승인 | ||
| + | - VS Code 우측 하단 상태바에서 **Copilot 아이콘** 활성화 확인 | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | ===== 2. main.py에 .ui 등록 ===== | ||
| + | |||
| + | 프로젝트 폴더에 '' | ||
| + | |||
| + | * **프로젝트 구성**: '' | ||
| + | * **방법**: Copilot Agent 기능을 사용하여 실행 가능한 코드 생성 | ||
| + | |||
| + | < | ||
| + | # === Vibe Coding (Ai) 프롬프트 예시 | ||
| + | # Qt Designer로 제작한 CFNET_AI.ui 파일을 사용하여 UI를 실행할 수 있는 main.py 기본 프로그램을 작성해 주세요. | ||
| + | # 실행 환경: Raspberry Pi 5 (Debian Bookworm), Python + PyQt5 | ||
| + | # .ui 파일을 로드하여 메인 윈도우를 실행하는 최소한의 기본 구조 코드로 작성 바랍니다. | ||
| </ | </ | ||
| - | {{ : | ||
| - | **-코드 | + | {{ : |
| - | {{ :modularpi:ai_copilot: | + | |
| - | \\ | + | **- 코드 적용:** Copilot이 생성한 코드는 |
| - | **-에러 처리 **: 기본 코드 생성 후 실행 시 아래와 같은 | + | |
| - | 이는 Resource.qrc 파일이 Python 파일로 변환되지 않아 import되지 않기 때문에 발생하는 문제입니다. | + | {{ :modularpi:python: |
| - | 해당 오류 역시 아래 절차에 따라 Vibe Coding(Ai) 방식으로 수정 및 빌드할 수 있습니다. | + | |
| - | < | + | **- 에러 처리 |
| - | === Vibe Coding(Ai) === | + | < |
| - | “에러 내용 복사” 후, | + | # === Vibe Coding (Ai) === |
| - | 해당 오류가 | + | # [에러 내용 복사] 후, 발생 원인과 수정 사항을 확인하여 |
| </ | </ | ||
| - | {{ :modularpi:ai_copilot:error.png |}} | + | |
| - | **- 수정 후 실행** | + | {{ :modularpi:python:aipyhmi: |
| - | {{ :modularpi:ai_copilot:form.png |}} | + | |
| - | Tip : 한글이 깨져서 표시될 경우, 한글 폰트를 추가로 설치해 주세요. | + | **- 결과 확인:** |
| + | {{ :modularpi:python:aipyhmi: | ||
| + | |||
| + | :::tip | ||
| + | **한글 깨짐 해결 방법** (터미널 입력): | ||
| * '' | * '' | ||
| * '' | * '' | ||
| * '' | * '' | ||
| - | =====3. HMI 동작로직 ===== | + | ::: |
| - | 현장 실무에서 사용되는 시스템 로직 조건을 기반으로, | + | |
| - | ==== ✔ 날짜•시간 표시 및 CFDO 동작 조건==== | + | ===== 3. HMI 동작 로직 구현 ===== |
| - | * 상단에 | + | |
| - | * 운전 / 정지 버튼 | + | ==== ✔ 날짜·시간 표시 및 CFDO 동작 조건 ==== |
| - | * 운전 | + | * 상단에 |
| - | {{ :modularpi:ai_copilot:3-1.png |}} | + | |
| - | < | + | * 두 버튼 모두 ON일 때 **Alarm 출력** 점등 |
| - | === Vibe Coding (Ai) === | + | |
| - | 1. date_time 객체에 현재 날짜와 시간을 표시한다(시계 기능). | + | {{ :modularpi:python:aipyhmi: |
| - | 2. CFRASP.py 모듈에서 | + | |
| - | 3. run_btn과 step_btn | + | < |
| - | 4. 토글 상태에 따라 2바이트 | + | # === Vibe Coding (Ai) 프롬프트 |
| - | 에 각각 | + | # 1. date_time 객체에 현재 날짜와 시간을 표시하는 |
| - | 5. run_btn 또는 step_btn의 | + | # 2. CFRASP.py 모듈의 CFNET 클래스를 |
| - | | + | # 3. run_btn, step_btn을 |
| - | 6. run_btn과 step_btn이 | + | # 4. run_btn은 cf_out |
| - | 그 외의 모든 경우(둘 중 하나라도 OFF 상태일 때)에는 alram_out 객체의 표시 이미지를 " | + | # 5. 상태 변경 |
| + | # 6. 두 버튼 | ||
| </ | </ | ||
| - | {{ :modularpi:ai_copilot: | + | |
| + | {{ :modularpi:python: | ||
| ==== ✔ CFDI 입력 상태 표시 및 알람 조건 ==== | ==== ✔ CFDI 입력 상태 표시 및 알람 조건 ==== | ||
| - | * 0.3초 주기로 CFDI의 입력 상태Lamp를 화면에 표시합니다. | + | * 0.3초 주기로 CFDI 입력 상태 |
| - | * CFDI의 | + | * 입력 |
| - | * CFDI의 | + | |
| - | {{ : | + | |
| - | < | + | |
| - | === Vibe Coding (Ai) === | + | |
| - | 1. 입력 읽기 | + | |
| - | cfnet.digitalRead(0)을 0.3초 주기로 반복 호출한다. | + | |
| - | 반환값은 **2바이트 정수 변수 cf_in**에 저장한다. | + | |
| - | 2. 입력 비트값에 램프 on/off 이미지 매칭 | + | {{ : |
| - | cf_in의 값을 CFDI_0_Value 객체에 16진수(0x0000) 형식으로 표시한다. | + | |
| - | 16비트 변수 cf_in의 i번째 비트 상태를 체크해서, | + | |
| - | (1=ON.png, 0=OFF.png)업데이트한다. | + | |
| - | 3. 알람 조건 처리 | + | <code python> |
| - | cf_in의 16비트 중 ON 상태인 비트 개수가 4개 이상일 때만 alram_in | + | # === Vibe Coding (Ai) === |
| - | 그 외 모든 경우 alram_in 객체의 표시 | + | # 1. 0.3초 주기로 cfnet.digitalRead(0)를 호출하여 cf_in 정수 변수에 저장. |
| + | # 2. cf_in 값을 | ||
| + | # 3. 16비트 각 비트 상태에 따라 lamp_IN_[i] | ||
| + | # 4. ON 상태 비트가 4개 이상이면 alram_in을 " | ||
| </ | </ | ||
| - | < | ||
| - | < | ||
| - | <iframe width=" | ||
| - | </ | ||
| - | </ | ||
| - | ==== ✔ CFDA 출력 제어 및 상태 조건 | ||
| - | * 전압 출력 조절 삼각 버튼 클릭 시 출력 값이 409 단위로 증가 또는 감소합니다. | ||
| - | * CFDA 출력 상태 데이터 값과 현재 출력 중인 전압 값을 화면에 표시합니다. | ||
| - | * 출력 전압이 **6 V 이상(데이터 값 2,457 이상)**일 경우, DA 알람을 발생시킵니다. | ||
| - | {{ : | ||
| - | < | ||
| - | === Vibe Coding (Ai) === | + | {{url> |
| - | 1. 변수 설정 및 초기화 | + | |
| - | 변수 cfda_ch0, cfda_ch1을 생성하고 초기값 0을 할당한다. | + | |
| - | 모든 변수의 유효 범위는 0에서 4095 사이이며, 계산 결과가 이 범위를 벗어날 | + | |
| - | 경우 최댓값(4095) 또는 최솟값(0)으로 고정한다(Clamping 처리). | + | |
| - | 2. 버튼 이벤트 | + | ==== ✔ CFDA 출력 |
| - | da[i]_up 버튼 클릭 시: cfda_ch[i] 값을 409 증가시킨다. (최대 4095 제한) | + | * 삼각 |
| - | cfnet.analogWrite(0, | + | * **6V 이상 |
| - | da[i]_down | + | |
| - | cfnet.analogWrite(0, i, cfda_ch[i]) 함수를 실행하여 출력한다. | + | |
| - | 3. 데이터 출력 및 표시 | + | {{ : |
| - | 버튼 클릭 후, 화면의 | + | <code python> |
| - | da[i]_v_value | + | # === Vibe Coding (Ai) === |
| + | # 1. cfda_ch0, ch1 변수 초기화 (범위 0~4095 Clamping 처리). | ||
| + | # 2. da[i]_up/ | ||
| + | # 3. da[i]_value 라벨에 정수 표시, da[i]_v_value에 | ||
| + | # 4. 어느 하나라도 2,457 이상이면 alram_da를 ' | ||
| + | </ | ||
| - | 4. 알람 조건 및 이미지 제어 | + | {{url> |
| - | 알람 활성화: cfda_ch0 또는 cfda_ch1 중 하나라도 값이 2,457 이상이면 | + | |
| - | alram_da 객체의 이미지를 **' | + | |
| - | 알람 해제: 두 변수의 값이 모두 2,457 미만이면 alram_da 객체의 이미지를 **' | + | |
| - | </ | + | ==== ✔ CFAD 상태 및 조건 ==== |
| - | < | + | * CFAD ch3 채널 입력값 화면 표시 |
| - | <iframe width=" | + | * 입력 전압 **5V 이상** |
| - | </ | + | |
| - | </ | + | |
| - | ==== ✔ CFAD 상태 및 조건 | + | |
| - | * CFAD 의 ch3 채널 입력 | + | |
| - | * CFAD 의 ch3 입력 상태 값을 기준으로, | + | |
| - | * 입력 전압이 **5 V 이상(50% | + | |
| - | {{ : | + | |
| - | < | + | {{ : |
| - | 1. 변수 설정 | + | |
| - | 변수 cfad_ch3, | + | < |
| - | 2. 상태값 화면 표시 | + | # === Vibe Coding (Ai) === |
| - | QLCDNumber | + | # 1. 100ms마다 cfnet.analogRead(0, |
| - | 3. 알람 로직 | + | # 2. QLCDNumber(adc_value)와 QProgressBar(adc_bar)에 |
| - | cfad_ch3값이 13,333 이면 alram_ad | + | # 3. cfad_ch3 값이 13, |
| - | 그 외의 모든 경우에는 alram_ad 객체의 표시 이미지를 " | + | </ |
| - | {{url> | + | {{url> |
| + | --- | ||
| [[..: | [[..: | ||
