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

커스텀 4×4 틱택토 방문카드 PCB – 설계, 제작, 코드 가이드

개요

이 튜토리얼은 4×4 틱택토 게임으로도 사용할 수 있는 명함 크기의 커스텀 PCB 제작 과정을 안내합니다. 앞면에는 EDISON SCIENCE CORNER 로고, 소셜 미디어 아이콘, 유튜브 채널로 연결되는 QR 코드가 표시됩니다. 카드를 뒤집으면 ATmega328, 네오픽셀 LED, 택트 스위치로 구동되는 완벽하게 작동하는 게임 회로가 나타납니다.

부품 및 소모품

항목수량
Microchip ATmega328P‑AU1
네오픽셀 RGB LED 스트립 (WS2812B)16개 (4×4)
택트 스위치, 상부 작동형16개
커스텀 PCB (JLCPCB)1개
아두이노 우노 (프로그래밍용)1개
USB 마이크로 암커넥터1개
커패시터 22 pF (0805)2개
커패시터 100 nF (0805)2개
저항 1 kΩ (0805)3개
저항 10 kΩ (0805)1개
16 MHz 크리스탈1개
LED (SMD 0805)2개

필요한 도구 및 장비

앱 및 온라인 서비스

1단계: PCB 설계 및 제작

EasyEDA를 사용하여 표준 명함 크기인 89 mm × 50 mm 보드를 설계하고 4×4 틱택토 매트릭스를 라우팅했습니다. 회로도는 ATmega328을 핵심 마이크로컨트롤러로 사용하며 16개의 WS2812B LED와 16개의 택트 스위치를 통합합니다. 레이아웃을 완료한 후 거버 파일을 내보내 JLCPCB에 업로드했습니다. 0.8 mm 두께의 검은색 보드로 제작되었으며, 2주 만에 도착했고 취미 프로젝트용으로 예상되는 품질을 충족했습니다.

2단계: 부품 준비

위의 부품 목록을 참조하세요. 모든 부품은 일반적이고 저렴하며 Digi-Key, Mouser, AliExpress 등의 전자 부품 유통업체에서 구매할 수 있습니다.

3단계: 납땜 조립

USB 마이크로 암커넥터부터 납땜을 시작하고, ATmega328과 주변 수동 부품을 장착합니다. 다음으로 네오픽셀 LED 스트립을 납땜하고 각 LED를 해당 택트 스위치와 정렬합니다. 16개 스위치 모두 방향에 주의하며 조심스럽게 납땜합니다. 숙련된 취미 제작자 기준 약 1시간 소요됩니다.

4단계: 프로그래밍

USB를 통해 보드를 PC에 연결합니다. 아두이노 IDE를 사용하여 다음 스케치를 업로드하세요:

코드 다운로드

이 스케치는 16개 LED 배열을 초기화하고, 4×4 키패드 매트릭스의 키 입력을 처리하며, 간단한 승리 판정 로직을 구현합니다. 플레이어 1은 녹색 LED, 플레이어 2는 파란색 LED를 사용합니다. 승리 시 해당 색상으로 보드가 깜빡이며, 무승부 시 빨간색으로 깜빡입니다.

5단계: 플레이 및 활용

카드를 뒤집어 게임 면을 확인하세요. 버튼을 누르면 해당 LED가 점등됩니다. 클래식 틱택토 규칙을 따르지만 4×4 그리드와 색상 표시기가 적용되었습니다. 컨퍼런스와 네트워킹 행사에서 대화의 물꼬를 트는 독특한 휴대용 게임을 즐겨보세요.

소스 코드

이 프로젝트에 사용된 전체 아두이노 스케치(C/C++)입니다. 키패드 처리, LED 제어, 승리 판정 로직이 포함되어 있습니다.

#include <Keypad.h> 
#include <FastLED.h> 
#define LED_PIN 5 
#define NUM_LEDS 16 
#define LED_TYPE WS2812B 
#define COLOR_ORDER GBR 
#define BRIGHTNESS 30 
CRGB leds[NUM_LEDS]; 
int player = 1; 
char board[16] = {'1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16'}; 
char key; 
int moveCount = 0; 
const byte ROWS = 4; 
const byte COLS = 4; 
char hexaKeys[ROWS][COLS] = {{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'*','0','#','D'}}; 
byte rowPins[ROWS] = {A0,A1,A2,A3}; 
byte colPins[COLS] = {A4,A5,2,3}; 
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 

void setup(){ 
  Serial.begin(9600); 
  LEDS.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS); 
  FastLED.setBrightness(BRIGHTNESS); 
  // 기능 확인을 위해 모든 LED를 녹색, 파란색으로 순차 점등
  for(int i=0;i<3;i++){ 
    for(int j=0;j<NUM_LEDS;j++) leds[j] = (i%2==0) ? CRGB::Green : CRGB::Blue; 
    FastLED.show(); 
    delay(500); 
  } 
  FastLED.clear(); 
} 

void loop(){ 
  key = customKeypad.getKey(); 
  if(key && player==1){ 
    int idx = keyToIndex(key); 
    leds[idx] = CRGB::Green; 
    FastLED.show(); 
    board[idx] = 'X'; 
    if(checkWinner('X')){ 
      announceWinner(1); 
    } 
    player = 2; 
    delay(1000); 
  } 
  if(key && player==2){ 
    int idx = keyToIndex(key); 
    leds[idx] = CRGB::Blue; 
    FastLED.show(); 
    board[idx] = 'O'; 
    if(checkWinner('O')){ 
      announceWinner(2); 
    } 
    player = 1; 
    moveCount++; 
    delay(1000); 
  } 
  if(moveCount==8){ 
    announceDraw(); 
  } 
} 

int keyToIndex(char k){ 
  switch(k){ 
    case '1': return 0; 
    case '2': return 1; 
    case '3': return 2; 
    case 'A': return 3; 
    case '4': return 4; 
    case '5': return 5; 
    case '6': return 6; 
    case 'B': return 7; 
    case '7': return 8; 
    case '8': return 9; 
    case '9': return 10; 
    case 'C': return 11; 
    case '*': return 12; 
    case '0': return 13; 
    case '#': return 14; 
    case 'D': return 15; 
  } 
  return -1; 
} 

bool checkWinner(char mark){ 
  const int lines[10][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}, 
    {0,4,8,12},{1,5,9,13},{2,6,10,14},{3,7,11,15}, 
    {0,5,10,15},{3,6,9,12}}; 
  for(auto &line: lines){ 
    if(board[line[0]]==mark && board[line[1]]==mark && board[line[2]]==mark && board[line[3]]==mark){ 
      return true; 
    } 
  } 
  return false; 
} 

void announceWinner(int p){ 
  CRGB color = (p==1) ? CRGB::Green : CRGB::Blue; 
  while(true){ 
    for(int i=0;i<NUM_LEDS;i++) leds[i] = color; 
    FastLED.show(); 
    delay(500); 
    FastLED.clear(); 
    FastLED.show(); 
    delay(500); 
  } 
} 

void announceDraw(){ 
  while(true){ 
    for(int i=0;i<NUM_LEDS;i++) leds[i] = CRGB::Red; 
    FastLED.show(); 
    delay(1000); 
    FastLED.clear(); 
    FastLED.show(); 
    delay(500); 
  } 
}

회로도

커스텀 4×4 틱택토 방문카드 PCB – 설계, 제작, 코드 가이드

모든 설계 파일, BOM, 코드는 다운로드 가능합니다.

제조공정

  1. 아두이노 나노와 MPU-6050으로 실시간 자이로스코프 게임 만들기
  2. 스마트 홈 연동을 위한 다중 위치 온도 센서 시스템
  3. 아두이노 나노로 37개 LED 룰렛 게임 만들기
  4. DIY 아두이노 USB 게임 컨트롤러 - 나만의 고성능 게임패드 만들기
  5. 아두이노 듀(Due) 터치스크린으로 만드는 틱택토(Tic-Tac-Toe) 게임
  6. MotionSense: 아두이노와 ESP8266으로 만드는 스마트 침입 감지 시스템
  7. 3D 프린터 화재 예방: 스마트 센서 안전 시스템
  8. 픽셀 체이서: 아두이노 나노로 만든 인터랙티브 원탭 LED 게임
  9. 아두이노 기반 척력 자기 부상: 간단 회로 & DIY 가이드
  10. CoroFence 열화상 감지기: Panasonic Grid-EYE & PIR 센서 IoT 연동