뇌파로 드론 조종: EEG 센서로 마이크로 레이싱 드론 날리기
부품 및 소모품
부품
수량
비고
아두이노 MKR1000
1
3.3V 로직, WiFi 내장
마이크로 레이싱 드론 + 컨트롤러
1
조이스틱 2개(4축) 타입
커패시터 100µF
4
로우패스 필터용
저항 220Ω
4
로우패스 필터용
점퍼 와이어
12
브레드보드
1
마인드웨이브 뉴로스카이 (MindWave NeuroSky)
1
EEG 헤드셋, 블루투스
필수 도구
납땜 스테이션 (납, 디솔더 펌프, 헬핑 핸드, 솔리드 와이어 등)
멀티미터
드라이버
소프트웨어 및 온라인 서비스
프로젝트 개요
배경
드론은 매력적입니다. 멋진 기술로 프로젝트를 할 기회가 생겨 '마음으로 드론 조종'이라는 소년의 꿈을 실현해보려 합니다. 기존 튜토리얼들은 드론 직접 제작이나 통신 프로토콜 해킹에 치우쳐 있어, 컨트롤러 PCB를 디지털로 해킹하는 가장 기초적인 방법 을 다루고자 합니다. 이 개념만 익히면 다양한 입력으로 드론을 제어하는 실험을 할 수 있습니다.
주의사항
드론이나 컨트롤러가 영구 손상될 수 있습니다.
이 튜토리얼은 이륙/착륙(스로틀)만 다룹니다. 방향 제어(요/피치/롤)는 다루지 않습니다.
EEG 센서 대신 다른 입력(조이스틱, 센서 등)도 가능하지만, 뇌파 제어가 가장 멋집니다!
필요 기술
납땜/디솔더링 경험이 필요합니다.
부품 리스트 요약
드론 + 컨트롤러
납땜 장비 일체
멀티미터
마인드웨이브 센서
아두이노 MKR1000
브레드보드, 100µF 커패시터 4개, 220Ω 저항 4개, 점퍼 와이어 12개, 악어 클립 와이어 6개(선택)
추가: 미지 저항 4개 (조이스틱 포트 풀업/풀다운용)
Phase 1: 드론 컨트롤러 PCB 분석 및 해킹
컨트롤러 케이스 개봉. 이 컨트롤러는 1.5V 배터리 2개(약 3.3V) 사용 → 아두이노 MKR1000 3.3V 출력과 호환. (다른 아두이노 사용 시 전압 초과 주의! 경험담: 보드 태워 먹음)
조이스틱 중간/최고/최저 전압 멀티미터로 측정해 기록.
조이스틱 부품(포텐셔미터) PCB에서 디솔더링.
조이스틱 +/− 단자 간 저항 측정 → 최대 저항값 확인.
조이스틱 +/− 자리에 측정된 저항값과 같은 저항(예: 10Ω) 납땜해 회로 완성.
PCB의 +(B+), -(B-), 각 조이스틱 신호 단자에 솔리드 와이어 납땜.
Phase 2: 디지털 PWM → 아날로그 전압 변환 (로우패스 필터)
아두이노 analogWrite()는 PWM(펄스 폭 변조) 신호를 출력하지만, 해킹된 PCB는 안정된 아날로그 전압을 기대합니다. DAC 칩이나 R-2R 래더 대신 로우패스 필터(RC 필터) 로 간단히 구현합니다.
저항(R)과 커패시터(C)로 구성: PWM 신호가 필터를 통과하면 평균 전압(아날로그 값) 출력. 단, 전압 변화에 시간이 걸림( 서서히 변함). 이 프로젝트에서는 부품 수 최소화와 원하는 출력 범위 확보를 위해 이 방식을 채택.
Phase 3: 아두이노 회로 구성
로우패스 필터 4개를 나란히 배치해 4축(스로틀, 요, 피치, 롤) 모두에 아날로그 전압 공급.
아두이노 PWM 핀(2,3,4,5) → 필터 → 컨트롤러 PCB 해당 신호 단자 연결. 표준 드론 레이아웃:
Throttle(스로틀) ← 왼쪽 스틱 상하
Yaw(요) ← 왼쪽 스틱 좌우
Pitch(피치) ← 오른쪽 스틱 상하
Roll(롤) ← 오른쪽 스틱 좌우
연결 확인 후 아두이노 스케치 업로드. 이제 아두이노가 배터리 역할을 하며 PWM으로 조이스틱 신호 모사. 이 상태에서 원하는 프로그램으로 드론 제어 가능.
Phase 4: 마인드 컨트롤 (Processing + 마인드웨이브)
마인드웨이브 드라이버 설치 (동봉 CD).
블루투스 페어링: 전원 버튼 3초 누르면 파란 LED 2회 점멸 → 검색 가능 상태.
Processing 실행. Jorge C. S Cardoso의 MindSet 라이브러리 다운로드 후 Processing 라이브러리 폴더에 압축 해제.
COM 포트 설정: 장치 관리자에서 아두이노 포트(Tools→Port), 마인드웨이브 포트(ThinkGear Connector Preferences→Options) 확인 후 코드에 반영.
receiver = new Serial(this, "COM10", 115200); // 아두이노
mindSet = new MindSet(this, "COM5"); // 마인드웨이브
Processing 스케치 실행. 집중도(Attention) 40% 이상이면 드론 이륙, 집중할수록 스로틀 상승. 마음 편히 하면 착륙.
결론
드론 컨트롤러(또는 일반 PCB)를 해킹해 새로운 입력을 주는 일이 얼마나 간단한지 보여드렸습니다. 이륙/착륙 외 다른 움직임도 실험으로 구현 가능합니다. 여러분의 멋진 작품을 기대합니다!
코드
Processing 마스터 (마인드웨이브 → 시리얼 전송)
/* Drone mind control
Neurosky MindSet 헤드셋에서 집중도 읽어 8비트 정수로 아두이노 전송
Created 21 March 2018 by Wesley Hartogs */
import processing.serial.*;
import pt.citar.diablu.processing.mindset.*;
Serial receiver;
MindSet mindSet;
int throttle = 0, yaw = 127, pitch = 127, roll = 127;
void setup() {
size(150, 500);
receiver = new Serial(this, "COM10", 115200);
mindSet = new MindSet(this, "COM5");
smooth();
strokeWeight(5); stroke(255); strokeCap(SQUARE); fill(255);
}
void draw() {
background(0);
line(0, height*0.60, width, height*0.60); // 40% 기준선
line(width*0.5, height, width*0.5, height*map(float(attentionLevel)/100, 0, 1, 1, 0)); // 집중도 바
throttle = int(map(attentionLevel, 40, 100, 30, 255));
throttle = constrain(throttle, 0, 255);
pitch = constrain(pitch, 0, 255);
roll = constrain(roll, 0, 255);
yaw = constrain(yaw, 0, 255);
if (receiver.available() > 0) {
println("attentionLevel: "+attentionLevel+" throttle: "+throttle+" yaw: "+yaw+" pitch: "+pitch+" roll: "+roll);
receiver.write("throttle: "+throttle+" yaw: "+yaw+" pitch: "+pitch+" roll: "+roll);
}
}
void keyPressed() { // K 또는 ESC로 비상 정지
if (key == 'k' || key == ESC) {
if (receiver.available() > 0) {
receiver.write("throttle: 0 yaw: 127 pitch: 127 roll: 127");
exit();
}
}
}
int signalStrenght = 0, attentionLevel = 0;
public void attentionEvent(int attentionLevel_val) { attentionLevel = attentionLevel_val; }
public void poorSignalEvent(int signalNoise) {
if (signalNoise == 200) println("Mindset is not touching your skin!");
signalStrenght = int(map(200-signalNoise, 200, 0, 100, 0));
println("Signal strength: " + signalStrenght + "%");
}
아두이노 스케치 (Drone Control)
/* Drone control: Processing에서 시리얼 수신 → 해킹된 컨트롤러로 PWM 출력
아두이노 MKR1000(또는 3.3V 아두이노) 전용
회로: 4x 로우패스 필터(100µF, 220Ω) + 해킹된 컨트롤러 */
int throttle = 0, yaw = 127, pitch = 127, roll = 127;
int throttlePin = 2, yawPin = 3, pitchPin = 4, rollPin = 5;
void setup() {
Serial.begin(115200);
pinMode(throttlePin, OUTPUT);
pinMode(yawPin, OUTPUT);
pinMode(pitchPin, OUTPUT);
pinMode(rollPin, OUTPUT);
}
void loop() {
if (Serial.available() > 0) {
throttle = Serial.parseInt();
yaw = Serial.parseInt();
pitch = Serial.parseInt();
roll = Serial.parseInt();
}
analogWrite(throttlePin, throttle);
analogWrite(yawPin, yaw);
analogWrite(pitchPin, pitch);
analogWrite(rollPin, roll);
}
회로도