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

아두이노 테니스 게임: 네오픽셀·9DoF 센서·블루투스로 만드는 가상 라켓 체험

프로젝트 개요

15×10 네오픽셀 매트릭스를 디스플레이로, 9DoF IMU 센서가 장착된 라켓 컨트롤러를 블루투스로 연결해 즐기는 1인용 테니스 게임입니다. 공이 화면 안쪽(원근감 표현)으로 다가오고, 라켓 스윙을 감지하면 공이 튕겨 나가는 방식입니다. 파이썬 스크립트가 블루투스-시리얼 중계 역할을 수행합니다.

시스템 아키텍처 (3파트 구성)

  1. 디스플레이 보드: 아두이노 나노 + 네오픽셀 150개(15×10) + 게임 로직 수행
  2. 라켓 컨트롤러: 아두이노 나노 + SparkFun 9DoF 센서 스틱(LSM9DS1) + HC-05 블루투스 모듈 + 9V 배터리
  3. 마스터 라우터(PC): 파이썬 스크립트로 블루투스 COM 포트와 매트릭스 시리얼 포트 간 데이터 중계

게임 규칙 및 로직

하드웨어 상세

디스플레이 보드

라켓 컨트롤러

소프트웨어 구현

1. 매트릭스 코드 (아두이노 나노 - 디스플레이)

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include <EEPROM.h>

#define PIN 6
#define EEPROM_ADR 0x50
#define HS_ADR 0x04

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(15, 10, PIN,
  NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800);

int ball_x = 7, ball_y = 2, radius = 1, r_incr = 1;
bool isSwung = false;
int ball_x_dir = 1, ball_y_dir = 1;
bool isDirRight = true;
int score = 0, COM_score = 0, highscore = 0;
int framerate = 50;
unsigned long lastFrame = 0;
uint16_t colors[] = {matrix.Color(255,0,0), matrix.Color(0,255,0), matrix.Color(150,200,0)};

void setup() {
  Serial.begin(9600);
  matrix.begin();
  matrix.fillScreen(0);
  highscore = EEPROM.read(HS_ADR);
  // 시작 화면: 하이스코어 표시 등
}

void loop() {
  if ((lastFrame + framerate) < millis()) {
    update_frame();
    lastFrame = millis();
  }
}

void update_frame() {
  int serial_data = Serial.parseInt();
  isSwung = (serial_data != 0);

  // 공 이동 및 충돌 판정 로직 (생략: 원본 참조)
  // ...
  // 화면 갱신
  matrix.fillScreen(0);
  matrix.fillCircle(ball_x, ball_y, radius, colors[2]);
  matrix.show();
}

2. 라켓 코드 (아두이노 나노 - 컨트롤러)

#include <Wire.h>
#include <SparkFunLSM9DS1.h>

LSM9DS1 imu;
#define PRINT_SPEED 10
unsigned long lastPrint = 0;
float accelx = 0, accely = 0;

void setup() {
  Serial.begin(9600);
  imu.settings.device.commInterface = IMU_MODE_I2C;
  imu.settings.device.mAddress = 0x1E;
  imu.settings.device.agAddress = 0x6B;
  if (!imu.begin()) while(1);
}

void loop() {
  if ((lastPrint + PRINT_SPEED) < millis()) {
    if (imu.accelAvailable()) imu.readAccel();
    lastPrint = millis();
  }
  accelx = imu.calcAccel(imu.ax);
  accely = imu.calcAccel(imu.ay);

  if (accelx <= -1.5 || accelx >= 1.5 || accely <= -1.5 || accely >= 1.5) {
    Serial.print('1'); // 스윙 감지 신호 전송
    delay(600);        // 디바운스
  }
}

3. 파이썬 중계 스크립트 (PC)

import serial, time

matrix_port = "COM3"   # 디스플레이 보드 시리얼 포트
raquet_port = "COM9"   # 블루투스 가상 COM 포트

matrix = serial.Serial(matrix_port, 9600)
racquet = serial.Serial(raquet_port, 9600)
time.sleep(10)  # 아두이노 리셋 대기

while True:
    data = racquet.read()
    if data == b'1':
        print("Hit detected")
        matrix.write(b'1')
        time.sleep(1)  # 디바운스 (시리얼 버퍼 32바이트 보호)
    time.sleep(0.05)

제작 팁 & 주의사항

확장 아이디어

회로도

제공된 프리칭 회로도 2장(매트릭스 보드, 라켓 보드) 참고. 네오픽셀 데이터 라인에 330~470Ω 저항, 전원 라인에 1000μF 커패시터 권장.

마무리

아두이노 2대, 네오픽셀, IMU 센서, 블루투스만으로 놀랍게 완성도 높은 아케이드 스타일 테니스 게임을 만들 수 있습니다. 메이커 페어나 교육용 시연 프로젝트로도 훌륭하며, 파이썬 중계 레이어 덕분에 무선 컨트롤러 구현이 매우 단순해집니다. 직접 만들어 보며 임베디드 게임 프로그래밍의 재미를 느껴보세요!

제조공정

  1. 아두이노 나노 33 BLE 센스에서 Edge Impulse로 구현하는 TinyML 언어 감지기
  2. 아두이노 나노와 MPU-6050으로 실시간 자이로스코프 게임 만들기
  3. 아두이노 디지털 주사위: LCD 기반 랜덤 넘버 제너레이터 만들기
  4. 아두이노 아이언맨 제작: 부품, 센서, 단계별 가이드
  5. 아두이노와 블루투스로 만드는 스마트 물건 찾기 'Find Me'
  6. 아두이노 릴레이 제어 가습기 자동화 – 고전압 안전 설계
  7. 아두이노 소나 & 프로세싱으로 실시간 거리 측정 및 시각화
  8. MobBob: 아두이노 로봇 직접 만들기, 안드로이드 스마트폰으로 매끄럽게 제어
  9. 아두이노 나노로 만드는 오디오 반응형 책상 무드등 (주소 지정 LED)
  10. 아두이노 나노와 네오픽셀 매트릭스로 만드는 네온 퐁 게임