

ABX00087 UNO R4 WiFi 개발 보드
Arduino UNO R4 WiFi + ADXL345 + Edge를 이용한 크리켓 샷 인식
충동
이 문서는 ADXL345 가속도계와 Edge Impulse Studio를 탑재한 Arduino UNO R4 WiFi를 사용하여 크리켓 슛 인식 시스템을 구축하는 전체 워크플로를 제공합니다. 이 프로젝트는 가속도계 데이터 수집, 머신러닝 모델 학습, 그리고 실시간 슛 분류를 위해 학습된 모델을 Arduino에 다시 배포하는 과정을 포함합니다.
이 프로젝트에서 고려된 크리켓 샷:
– 커버 드라이브
– 스트레이트 드라이브
– 풀샷
1단계: 하드웨어 요구 사항
– 아두이노 우노 R4 와이파이
– ADXL345 가속도계(I2C)
– 점퍼 와이어
– 브레드보드(선택 사항)
– USB Type-C 케이블
2단계: 소프트웨어 요구 사항
– Arduino IDE(최신)
– Edge Impulse Studio 계정(무료)
– Edge Impulse CLI 도구(Node.js 필요)
– Adafruit ADXL345 라이브러리
3단계: ADXL345 배선
다음과 같이 ADXL345 센서를 Arduino UNO R4 WiFi에 연결합니다.
VCC → 3.3V
접지 → 접지
SDA → SDA (A4)
SCL → SCL (A5)
CS → 3.3V(선택 사항, I2C 모드용)
SDO → 플로팅 또는 GND
4단계: IDE 센서 준비
Arduino IDE에 센서 라이브러리를 설치하는 방법은?
아두이노 IDE 열기
도구 → 라이브러리 관리…를 열고 Adafruit ADXL345 Unified Adafruit Unified Sensor를 설치합니다.
(LSM6DSO 또는 MPU6050이 있는 경우: SparkFun LSM6DSO, Adafruit LSM6DS 또는 MPU6050을 적절히 설치하세요.)
5단계: 데이터 수집을 위한 Arduino 스케치
이 스케치를 Arduino UNO R4 WiFi에 업로드하세요. Edge Impulse를 위해 가속도계 데이터를 CSV 형식(x,y,z)으로 ~18Hz로 스트리밍합니다.
#포함하다
#포함하다
Adafruit_ADXL345_통합 가속 =
Adafruit_ADXL345_통합(12345);
무효 설정() {
직렬.시작(115200);
if (!accel.begin()) {
Serial.println("ADXL345가 감지되지 않았습니다");
동안 (1);
}
accel.setRange(ADXL345_RANGE_4_G);
}
void 루프() {
센서_이벤트_t e;
accel.getEvent(&e);
직렬.인쇄(e.가속.x);
직렬.print(“,”);
Serial.print(e.가속도.y);
직렬.print(“,”);
Serial.println(e.acceleration.z);delay(55); // ~18Hz
}
Edge Impulse 설정

6단계: Edge Impulse에 연결
- Arduino 시리얼 모니터를 닫습니다.
- 다음 명령을 실행하세요: edge-impulse-data-forwarder –frequency 18
- 축 이름을 입력하세요: accX, accY, accZ
- 장치 이름을 Arduino-Cricket-Board로 지정하세요.
- Edge Impulse Studio의 '장치'에서 연결을 확인하세요.


7단계: 데이터 수집
Edge Impulse Studio에서 → 데이터 수집:
– 장치: Arduino-Cricket-Board
– 센서: 가속도계(3축)
– 씨amp길이: 2000ms(2초)
– 주파수 : 18Hz
최소 40초 이상 기록하세요amp학급당:
– 커버 드라이브
– 스트레이트 드라이브
– 풀샷
데이터 수집 Examp레
커버 드라이브
장치: Arduino-Cricket-Board
레이블: 커버 드라이브
센서: 3축(accX, accY, accZ)을 가진 센서
Samp길이: 10000ms
주파수 : 18Hz
Examp원시 데이터:
accX -0.32
accY 9.61
accZ -0.12
스트레이트 드라이브
장치: Arduino-Cricket-Board
레이블: 스트레이트 드라이브
센서: 3축(accX, accY, accZ)을 가진 센서
Samp길이: 10000ms
주파수 : 18Hz
Examp원시 데이터:
accX 1.24
accY 8.93
accZ -0.42
풀샷
장치: Arduino-Cricket-Board
레이블: 풀샷
센서: 3축(accX, accY, accZ)을 가진 센서
Samp길이: 10000ms
주파수 : 18Hz
Examp원시 데이터:
accX 2.01
accY 7.84
accZ -0.63 
8단계: 임펄스 설계
열기 충동을 생성하세요:
입력 블록: 시계열 데이터(3축).
창 크기: 1000ms 창 증가(스트라이드): 200ms 활성화: 축, 크기(선택 사항), 주파수 18.
처리 블록: 스펙트럼 분석(움직임에 대한 스펙트럼 특징이라고도 함). 윈도우 크기: 1000ms 윈도우 증가(스트라이드): 200ms 활성화: 축, 크기(선택 사항), 모든 기본값을 우선적으로 유지합니다.
학습 블록: 분류(Keras).
저장을 클릭합니다. 
기능 생성:
스펙트럼 분석으로 가서 매개변수 저장을 클릭한 다음, 훈련 세트에 대한 기능 생성을 클릭합니다.

작은 모델을 훈련시키다
Classifier(Keras)로 가서 다음과 같은 간단한 구성을 사용하세요.
신경망: 1~2개의 밀집층(예: 60 → 30), ReLU
시대: 40–60
학습률: 0.001–0.005
배치 크기: 32
데이터 분할: 80/20(훈련/테스트)
데이터 저장 및 학습
홀드아웃 세트를 사용하여 모델 테스트를 평가하고 확인합니다.
혼동 행렬을 검사합니다. 원과 위쪽이 겹치면 더 다양한 데이터를 수집하거나 조정합니다.
스펙트럼 매개변수(창 크기/잡음 플로어).
9단계: Arduino에 배포
배포로 이동:
Arduino 라이브러리를 선택하세요(C++ 라이브러리도 가능합니다).
EON 컴파일러를 활성화하여(사용 가능한 경우) 모델 크기를 줄입니다.
.zip을 다운로드한 다음 Arduino IDE에서 스케치 → 라이브러리 포함 → .ZIP 라이브러리 추가… 이렇게 하면 ex가 추가됩니다.ampStatic 버퍼와 Continuous 버퍼가 유사합니다. File → 예amp레 →
프로젝트 이름 – Edge Impulse. Arduino UNO EK R4 WiFi + ADXL345용 추론 스케치입니다.
10단계: Arduino 추론 스케치
#포함하다
#포함하다
#포함하다 // Edge Impulse 헤더로 교체
Adafruit_ADXL345_통합 가속 =
Adafruit_ADXL345_통합(12345);
정적 bool debug_nn = false;
무효 설정() {
직렬.시작(115200);
while (!Serial) {}
if (!accel.begin()) {
Serial.println("오류: ADXL345가 감지되지 않았습니다");
동안 (1);
}
accel.setRange(ADXL345_RANGE_4_G);
}
void 루프() {
부동 소수점 버퍼[EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE] = {0};
(size_t ix = 0; ix < EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE; ix +=
3) {
uint64_t 다음_틱 = 마이크로() + (EI_CLASSIFIER_INTERVAL_MS *
1000) )
센서_이벤트_t e;
accel.getEvent(&e);
버퍼[ix + 0] = e.가속도.x;
버퍼[ix + 1] = e.가속도.y;
버퍼[ix + 2] = e.가속도.z;
int32_t 대기 = (int32_t)(다음_틱 – 마이크로());
(대기 > 0) 지연 마이크로초(대기);
}
signal_t 신호;
int err = numpy::signal_from_buffer(버퍼,
EI_CLASSIFIER_DSP_입력_프레임_크기, &신호);
if (err != 0)을 반환합니다.
ei_impulse_result_t 결과 = {0};
EI_IMPULSE_ERROR res = run_classifier(&신호, &결과,
디버그_nn);
if (res != EI_IMPULSE_OK)를 반환합니다.
(size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
ei_printf("%s: %.3f ", 결과.분류[ix].레이블,
결과.분류[ix].값);
}
#EI_CLASSIFIER_ANOMALY == 1인 경우
ei_printf("이상: %.3f", result.anomaly);
#끝
ei_printf(“\n”);
}
예 출력amp르 :
팁:
EI_CLASSIFIER_INTERVAL_MS를 데이터 포워더 주파수와 동기화하세요(예: 100Hz → 10ms). Edge Impulse 라이브러리는 임펄스에서 이 상수를 자동으로 설정합니다.
연속 감지(슬라이딩 윈도우)를 원하시면 Continuous ex에서 시작하세요.ampEI 라이브러리에 포함되어 있으며 ADXL345 읽기에서 교체되었습니다.
곧 비디오 튜토리얼을 추가할 예정입니다. 그때까지 계속 지켜봐 주세요. https://www.youtube.com/@RobuInlabs
아직도 의심이 남는다면 Edged Impulse의 이 영상을 확인해보세요. https://www.youtube.com/watch?v=FseGCn-oBA0&t=468s

문서 / 리소스
![]() |
Arduino ABX00087 UNO R4 WiFi 개발 보드 [PDF 파일] 사용자 가이드 R4 WiFi, ADXL345, ABX00087 UNO R4 WiFi 개발 보드, ABX00087, UNO R4 WiFi 개발 보드, WiFi 개발 보드, 개발 보드, 보드 |
