산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

PSoC 6 파이오니어 보드와 IoT 애드온 실드 마스터하기: 개발자 가이드

소개

PSoC 6은 사이프레스의 강력한 PSoC 시리즈 프로세서의 최신 제품입니다. PSoC 6 파이오니어 IoT 애드온 실드는 이 프로세서 라인과 관련된 개발 도구로, 온보드 디버거, 아두이노 호환 헤더, CapSense 위젯 등을 갖추고 있으며, 모두 PSoC 6 프로세서에 연결됩니다. 이 프로세서는 듀얼 코어 장치로, 공유 주변장치와 메모리 공간을 통해 연결된 Cortex-M0+ 저전력 프로세서와 Cortex-M4 고성능 프로세서로 구성됩니다.

이 튜토리얼에서는 파이오니어 보드와 파이오니어 애드온 실드를 사용하여 PSoC 6 장치의 기능을 확장하는 방법을 보여줍니다. BLE와 WiFi(XBee WiFi 모듈 사용)를 통해 라즈베리 파이와 통신하는 방법, 그리고 PSoC 4 BLE 파이오니어 보드와 PSoC 6 파이오니어 보드 간 BLE 통신 방법을 다룹니다.

필요한 자료

이 튜토리얼의 예제는 사이프레스나 Digi-Key에서 직접 구매할 수 있는 PSoC 6 파이오니어 키트용입니다.

당연히 파이오니어 애드온 실드도 필요합니다. XBee WiFi 모듈도 필요합니다. 설정에 따라 몇 가지 XBee WiFi 옵션이 있습니다: Trace, RP-SMA 커넥터(외부 2.4GHz 안테나 포함), 또는 Wire 안테나. 와이어 안테나가 있는 XBee가 가장 쉽습니다.

라즈베리 파이 3 스타터 키트도 필요합니다. 이것이 PSoC 6 파이오니어 보드의 통신 대상이 됩니다. 물론 파이 3을 별도로 구매하고 브레드보드, 점퍼 와이어, 저항, LED를 구할 수도 있지만, 스타터 키트가 뛰어난 가성비라 추천합니다.

하드웨어 개요

파이오니어 키트 IoT 애드온 보드의 기능을 자세히 살펴보겠습니다.

마이크로 SD 카드 슬롯 - 이 슬롯의 핀은 PSoC 6 BLE 파이오니어 보드를 포함한 대부분의 아두이노 호환 보드에서 SPI 주변장치에 매핑됩니다.

XBee 헤더 - 표준 XBee 풋프린트를 수용하도록 간격이 맞춰져 있습니다. 모든 공식 XBee 모듈과 호환됩니다.

Qwiic 커넥터 - SparkFun의 모든 Qwiic 모듈 지원을 추가합니다. 3.3V 공급.

MicroB USB 전원 커넥터 - 이 커넥터의 데이터 라인은 아무 것도 연결되지 않습니다. XBee 모듈용 3.3V 레귤레이터에 5V를 공급하며, 아두이노 헤더에서 오는 5V를 오버라이드하여 고용량 XBee 모듈(셀룰러, WiFi, Pro 모델 등)이 제대로 작동하도록 합니다.

D7 및 D9 버튼 - 핀 D7과 D9에 연결된 두 사용자 버튼 (PSoC 6에서는 P0.2와 P13.1, PSoC 4 BLE에서는 P1.0과 P0.4).

3.3V 레귤레이터 - 업스트림 공급 능력에 따라 최대 1.5A까지 공급 가능한 스위칭 모드 3.3V 전원 레귤레이터. 아두이노 핀의 5V 공급이나 MicroB 전원 커넥터에서 전력을 끌어옴. XBee 헤더에만 전원 공급.

레벨 시프트 버퍼 - 5V 신호를 3.3V 신호로 다운 컨버트. 3.3V 또는 5V 시스템에서 보드 사용 가능.

I2C 레벨 시프트 회로 - 필요시 I2C 신호를 3.3V에서 5V로 변환.

전압 공급 선택 점퍼 - I2C 레벨 시프트 회로의 변환 레벨 선택. 기본값 3.3V. 5V 시스템용으로 5V 설정. PSoC 4와 PSoC 6 파이오니어 BLE 보드 모두 3.3V 시스템.

XBee DIO5 LED - DIO5는 기본적으로 유용한 기능들로 설정되며, 특히 WiFi 모듈에서 구성된 WiFi 네트워크 연결 상태를 표시.

예제: PSoC 6 파이오니어 키트로 라즈베리 파이에 WiFi 통신

이 예제는 WiFi를 통해 라즈베리 파이에 신호를 보내는 방법을 보여줍니다. XBee WiFi 모듈 접근, PSoC 6의 두 코어 간 프로세스 간 통신, 라즈베리 파이에서 명령 수신 및 파싱 방법을 다룹니다.

일부 설정이 필요하므로 지금부터 살펴보겠습니다.

PSoC 6 파이오니어 키트 설정: 하드웨어

파이오니어 키트 측 설정은 간단합니다: XBee WiFi 모듈을 파이오니어 IoT 애드온 실드에 삽입하고, 실드를 파이오니어 키트 보드의 아두이노 헤더에 장착하세요.

라즈베리 파이 측은 더 많은 설명이 필요합니다. 라즈베리 파이에서 하드웨어와 소프트웨어 모두 설정해야 합니다.

PSoC 6 파이오니어 키트 설정: 소프트웨어

참고: PSoC 6 지원은 Creator 4.2 이상에서만 가능!

파이오니어 키트용 소프트웨어 프로젝트는 GitHub에서 제공됩니다.

PSOC 6 PIONEER KIT SOFTWARE DOWNLOAD

다운로드하고 압축을 풀면 PSoC Creator에서 예제(XBee_WiFi_Example)를 열 수 있습니다.

다른 작업 전에 "main_cm4.c" 파일을 열고 몇 가지 변경이 필요합니다. 다음과 같은 코드 섹션을 찾을 수 있습니다:
char ssid[] = "your_ssid_here";
char rpi_ip[] = "raspi_ip_here";
char ssid_pw[] = "wifi_pw_here";
int dest_port = 5000;
char encrypt_mode = WPA2;
분명히 네트워크 설정에 맞게 이 설정들을 변경해야 합니다. encrypt_mode 값은 WPA, WEP, WPA2 또는 (바라건대 안 그렇겠지만!) NO_SECURITY가 될 수 있습니다. rpi_ip는 점으로 구분된 쿼드(예: "10.8.253.193")로, 라즈베리 파이의 명령 창에서 "ifconfig"를 입력하고 "wlan0" 섹션을 보면 알 수 있습니다(아래 명령 창 열기 지침 참조).

보드를 프로그래밍하려면 포함된 USB-A to USB-C 케이블로 PC에 연결하세요. 툴바의 "Program" 버튼(아래 그림 참조)을 클릭하여 프로젝트를 자동으로 빌드하고 보드를 프로그래밍하세요.

대상 선택 창이 나타날 수 있습니다. "KitProg2" 목록 항목 아래의 어느 항목을 선택해도 플래시가 올바르게 프로그래밍됩니다.

라즈베리 파이 설정: 하드웨어

먼저 하드웨어 연결 방식을 살펴보세요:

보시다시피 LED(330옴 저항 포함)를 라즈베리 파이의 핀 3(GPIO 2)과 핀 6(그라운드)에 연결했습니다. 이를 통해 GPIO2를 토글하고 LED에서 결과를 확인할 수 있습니다.

라즈베리 파이 설정: 소프트웨어

최신 버전의 Raspbian(라이트 버전이 아닌 전체 설치)이 실행 중이고, 키보드, 마우스, 모니터, 로컬 WiFi 네트워크에 연결되어 있다고 가정합니다. 아니라면, 잠시 시간을 내어 설정하세요. 파이 설정 튜토리얼을 여기에서 확인할 수 있습니다.

라즈베리 파이 데스크톱부터 시작하세요. 다음과 비슷한 화면이 보일 것입니다:

화면 상단의 작은 로고(아래 그림 참조)를 클릭하여 명령줄을 여세요. 이 튜토리얼의 나머지 부분은 명령줄이 열려 있다고 가정합니다.

명령줄 창이 열립니다. 이를 통해 라즈베리 파이에 직접 명령 실행을 지시할 수 있습니다.

Flask 설치를 위해 다음 명령을 실행하고 Enter를 누르세요.
sudo pip install flask
명령줄 창에 많은 내용이 출력되고 마지막에 Flask가 라즈베리 파이에 설치됩니다.

다음 단계는 GitHub에서 이 프로젝트를 지원하기 위해 작성한 소프트웨어를 설치하는 것입니다. 명령은 다음과 같습니다:
git clone https://github.com/sparkfun/Flask_Tutorial
다시 텍스트가 명령줄을 스크롤하고 프롬프트가 돌아오면 설치 완료 표시입니다. 완료되면 다음 명령 입력:
sudo python Flask_Tutorial/Python/app.py
앱이 실행되어 파이오니어 보드로부터 TCP/IP 입력을 수신 대기합니다. 이제 IoT 실드의 D7과 D9 버튼을 눌러 라즈베리 파이에 연결된 LED를 켜고 끌 수 있습니다. 멋지죠!

무슨 일이 일어나고 있을까? 1부: 파이오니어 키트

화면 왼쪽의 Workspace Explorer 프레임을 보세요. 이를 따라가며 중요한 파일들과 전체 프로젝트와의 연관성을 강조하겠습니다.

Workspace Explorer가 잘 안 보이나요? 이미지를 클릭하면 확대됩니다.

프로젝트 최상위 레벨에는 6개 항목이 있습니다: 회로도("TopDesign.sch"), 설계 전체 리소스("XBee_WiFi_Example.cydwr"), Cortex-M0+ 코어 관련 소스 파일("CM0p (Core 0)"), Cortex-M4 코어 관련 소스 파일("CM4 (Core 1)"), 두 코어 간 공유 파일("Shared Files"), IDE가 생성한 지원 파일("Generated_Source").

이 프로젝트의 회로도는 매우 간단하며, 몇 개의 LED, 스위치, XBee WiFi 모듈과 데이터를 주고받는 UART로 구성됩니다. LED는 현재 구현에서는 사용되지 않습니다.

.cydwr 파일 내용은 건너뜁니다. 이 파일에는 회로도에 사용된 신호의 핀 할당, 클록 생성, 코어 구성 상수가 포함됩니다. 원하시면 직접 살펴보세요. 대부분 자명할 것입니다.

목록을 따라 내려가면 Cortex-M0+ 소스 파일에 도달합니다. 이 하위 도메인의 최상위 레벨에는 5개 항목이 있습니다: "Header Files", "Source Files", 그리고 다른 3개 파일. 우리는 "Header Files"와 "Source Files" 하위 도메인의 내용만 신경 쓰면 되고, 사실 그곳의 단 하나의 파일인 "main_cm0p.c"만 중요합니다. 여기에는 Cortex-M0+ 프로세서에서 실행되는 코드의 main() 함수가 있습니다.

워크스페이스 구조에서 추측했듯, 두 개의 완전히 분리된 코드베이스가 두 개의 다른 코어를 위해 실행됩니다. "main_cm0p.c"는 Cortex-M0+ 코어 코드의 진입점이며, 이 코어가 Cortex-M4 코어를 시작합니다. Cortex-M4 코어에도 유사한 하위 도메인이 있으며 유사한 파일들이 있고, 다시 "Header Files"와 "Source Files" 하위 도메인만 신경 쓰면 됩니다.

마지막으로 "Shared Files" 섹션이 있습니다. 이 파일들 대부분은 자동 생성되지만, "ipc_common.c"와 "ipc_common.h" 파일은 예외입니다. 이 파일들은 이 프로젝트를 위해 개발된 프로세스 간 통신 헬퍼입니다.

Cortex-M0+ 메인 파일

중요한 내용을 강조했으니 이제 중요한 코드 비트들을 하나씩 살펴보겠습니다. "main_cm0p.c" 파일부터 시작합니다. 이 파일은 시스템을 위해 Cortex-M0+ 코어가 수행하는 모든 활동을 처리합니다: 두 개의 푸시버튼 모니터링하고 하나가 눌리면 Cortex-M4에 신호 전송.

그러나 이는 보이는 것만큼 간단하지 않습니다. Cortex-M4가 처리를 마치면 신호를 클리어할 수 있어야 하므로, 여러 프로세스가 같은 데이터에 접근합니다. 한 프로세스가 다른 프로세스가 같은 데이터를 변경하려는 중간에 데이터를 변경하려고 하면 어떻게 될까요? 이를 다루기 위해 "ipc_common" 파일에 설정된 보호된 읽기/쓰기 시스템을 사용합니다.

이게 어떻게 작동하는지 이해하려면 먼저 IPC 채널 개념을 이해해야 합니다. IPC 채널은 세마포어를 사용하여 한 프로세스에서 다른 프로세스로 데이터를 쓰되, 두 코어 간 충돌이 없음을 보장합니다. 각 코어의 애플리케이션 실행 시작 시 실행 중에 사용될 IPC 채널의 엔드포인트를 설정해야 합니다. 다음 두 줄의 코드를 고려해보세요:
IPC_STRUCT_Type *D9IpcHandle;
D9IpcHandle = Cy_IPC_Drv_GetIpcBaseAddress(7);
첫 번째 줄은 IPC 채널의 특성을 정의하는 구조체 포인터를 생성합니다. 두 번째 줄은 해당 구조체가 시스템 IPC 채널 7의 특정 메모리 위치를 가리키도록 설정합니다. 채널 0-6은 시스템 용도로 예약되어 있으므로 채널 7을 사용합니다.

다음으로 다른 코어에 이 IPC 채널과 연관된 메모리 주소를 알려야 합니다. 이 함수 호출이 그 역할을 합니다.
while(Cy_IPC_Drv_SendMsgPtr(D9IpcHandle, CY_IPC_NO_NOTIFICATION, &D9Button) != CY_IPC_DRV_SUCCESS);
D9Button은 코드 앞부분에서 설정된 변수입니다. 함수 호출은 while() 루프로 감싸져 있는데, 다른 프로세스(즉, Cortex-M4 코어에서 실행되는 코드)가 이 정보를 수신했음을 확인할 때까지 함수 호출을 반복하기 위함입니다. 또한 변수의 락이 해제되어 Cortex-M4가 포인터 값 읽기를 마쳤음을 나타낼 때까지 대기합니다.
while(Cy_IPC_Drv_IsLockAcquired(D9IpcHandle));
마지막으로 애플리케이션의 무한 루프로 진입하며, 여기서 커스텀 함수 ReadSharedVar()와 WriteSharedVar()가 다른 코어와 버튼 상태를 통신하는 공유 변수 업데이트를 처리합니다. 이 함수들은 나중에 자세히 다루겠습니다.

Cortex-M4 메인 파일

Cortex-M4 main() 함수에서는 Cortex-M0+ main() 함수에서 했던 것과 같은 일부 연산을 IPC 채널 설정 관점에서 반복합니다.
IPC_STRUCT_Type *D9IpcHandle;
D9IpcHandle = Cy_IPC_Drv_GetIpcBaseAddress(7);
이게 완료되면 Cortex-M0+ 프로세스에서 보낸 메시지를 "잡기" 위한 코드를 호출해야 합니다. 이 메시지에는 접근할 공유 변수의 주소가 들어 있습니다.
while (Cy_IPC_Drv_ReadMsgPtr(D9IpcHandle, (void *)&D9Button) != CY_IPC_DRV_SUCCESS);
다시 while() 루프로 감싸서 Cortex-M0+에서 메시지가 전송될 때까지 계속 호출합니다. 그런 다음 해당 IPC 채널의 락을 해제하여 Cortex-M0+ 프로세스가 계속 작업하고 향후 IPC 채널을 사용할 수 있음을 알립니다. 이 호출은 한 번만 발행하면 락이 해제되므로(반복하여 락 해제 확인 필요 없음) while() 루프로 감쌀 필요 없습니다.
Cy_IPC_Drv_LockRelease(D9IpcHandle, CY_IPC_NO_NOTIFICATION);
이 모든 것이 완료되면 XBee WiFi 실드를 설정하여 로컬 네트워크에 접속해야 합니다. 예제에 잘 문서화되어 있어 여기서는 코드를 중복하지 않겠습니다.

애플리케이션 코드를 실행하는 무한 루프에서 다시 커스텀 함수 ReadSharedVar()와 WriteSharedVar()를 호출하여 Cortex-M0+ 코어와 공유되는 버튼 상태를 담은 변수에 접근합니다. 이 함수들이 무엇을 하는지 자세히 살펴보겠습니다.

Read More Info……

Using the PSoC 6 Pioneer Board with the Pioneer IoT Add-on Shield

제조공정

  1. 기상 관측소를 CWOP와 통합하기: 실용 가이드
  2. Acconeer A111 펄스 레이더를 라즈베리 파이에 통합하기: 실전 가이드
  3. IoT와 MQTT 시작하기: 코드 없는 ESP8266 튜토리얼
  4. 브리지 실드(Bridge Shield)로 스마트 로봇 만들기 - 라즈베리 파이 & 아두이노 통합
  5. 고피고(GoPiGo) v2 윈도우 10 IoT 코어 라즈베리파이 3 확장 프로젝트
  6. IoT 생태계에서 시각 데이터의 힘 발휘하기
  7. IoT로 현장 서비스 혁신: 예측 유지보수와 ROI 향상
  8. 스마트 시티가 IoT, 마이크로서비스, 대시보드로 효율적 자산 관리하는 법
  9. IoT 월드: 버티카의 IoT 분석을 위한 빅데이터 솔루션 내부
  10. Hitachi Lumada IoT 플랫폼: 스마트 제조 위한 산업 인사이트 통합