[아두이노] Chrome Dino 게임 자동화 🦖

hyoin·2025년 11월 9일
post-thumbnail

크롬 오프라인 시 나오는 공룡게임을 대신 플레이해주는 아두이노 장치를 만들어 봤다.
크롬에서 chrome://dino/ 를 검색하면 나온다.

기술 스택: Arduino Uno, 조도 센서, 서보 모터


1. 공룡게임 분석

먼저, 공룡게임의 기본 동작을 관찰했다.

  • 장애물을 피해 최대한 오래 달리는 것이 목표다.
  • 장애물은 나무, 두 종류다.
  • 나무는 바닥에 고정되어 있고, 새는 세 가지 높이(바닥/ 몸/ 머리 위)로 날아온다.
  • 중요한 점은, 모든 장애물은 점프만으로 피할 수 있다.
    몸쪽으로 오는 새도 점프 타이밍, 조도 센서 위치만 잘 맞추면 통과 가능하다.
  • 700점이 넘어가면 게임의 색상이 반전되어 밤 모드로 전환된다.

이 관찰 결과, “빛의 변화로 장애물을 인식하고, 일정 조건에서 점프(스페이스바)를 트리거하면 된다”는 결론을 얻었다.


2. 구현 방법

1. 장애물 인식

조도 센서를 이용해 빛의 밝기를 지속적으로 측정한다.
게임 화면에서 장애물이 등장하면 화면이 순간적으로 바뀌기 때문에, 조도값에 차이가 발생하면 이를 장애물 등장으로 판단한다.

2. 공룡 조작

서보모터를 이용해 점프 동작을 구현했다.
기본적으로 서보모터의 축이 일정 각도로 회전하도록 설정했고,
장애물이 감지되면 모터가 빠르게 회전 → 스페이스바 입력으로 이어지는 구조다.

3. 하드웨어 구조


조도 센서는 모니터에 밀착시켜야 하므로 따로 전선을 빼뒀다.


3. 시행착오

1. 조도 센서 연결 문제

위치를 조정하다가 조도 센서 선이 끊기는 일이 많았다.
절연테이프로 고정해봤지만 접촉 불량이 잦았다... 계속 조심히 다뤄야 했다.

2. 인식 범위 조정

센서를 화면에 너무 밀착시키면 시야가 좁아져서 나무와 새를 각각 인식하지 못했다.
화면에서 약간 띄워 설치하니 훨씬 안정적으로 인식됐다.

3. 하드웨어 튜닝의 어려움

결국 가장 많은 시간을 쓴 건 코드가 아니라 하드웨어 조정이었다....
센서 각도, 밝기 민감도, 서보모터의 반응속도 같은 물리적 요소를 잡는 데 꽤 애를 먹었다.


4. 소스 코드

처음에 생각해 뒀던 '밝기 변화로 장애물 인식', '서보 모터 조정'을 구현했다.
위 구상만으로 실제 실행을 해보면, 센서 값이 일정치 않은 문제 때문에 장애물이 없는 상황(점프를 뛰어서 공룡이 공중에 있는 상황)에서도 서보모터가 동작하곤 했다. 그래서 쿨다운 시간을 추가했다.

#include <Arduino.h>
#include <Servo.h>

const int LIGHT_PIN = A0;
const int DELTA_THRESHOLD = 80;
const unsigned long COOLDOWN_MS = 200;

Servo servo;
int pos = 0;
int prev_light = 0;
bool prev_is_tree = false;
unsigned long last_trigger_time = 0;

void setup() {
  Serial.begin(9600);
  servo.attach(9);
  servo.write(0);

  prev_light = analogRead(LIGHT_PIN);
}

void loop() {
  unsigned long now_time = millis();
  int light = analogRead(LIGHT_PIN);
  int diff = abs(light - prev_light);
  
  bool is_tree = (diff > DELTA_THRESHOLD);

  if (is_tree && !prev_is_tree && (now_time - last_trigger_time > COOLDOWN_MS)) {
    Serial.println("Detected!!");
    pos += 45;
    servo.write(pos);
    delay(100);
    pos -= 45;
    servo.write(pos);

    last_trigger_time = now_time;
  }

  prev_is_tree = is_tree;
  prev_light = light;

  delay(10);
}
profile
배워야 할 게 많은 개발자... 하지만 공부를 포기하지 않지!!

0개의 댓글