어릴 적부터 특별한 능력, 생각으로 물건을 움직이거나 날아다니는 능력을 갖고 싶었습니다. "마음의 힘"으로 물건을 움직이려 했지만 당연히 실패했습니다. 네, 저는 스타워즈 광팬이지만 전자공학과 프로그래밍도 좋아해서 이 두 가지를 결합해 놀라운 프로젝트를 만들어보기로 했습니다.
주요 개념은 다양한 뇌파를 사용하여 사용자가 로봇, PC의 커서, 집의 조명 온/오프를 제어할 수 있게 하고, 마이크로컨트롤러(파티클 포톤)가 사용자의 뇌파에 대한 온라인 분석을 생성하는 것입니다. 이는 질병, 스트레스, 졸음 상태를 감지하는 완벽한 방법입니다. 이것은 사람들이 삶을 더 잘 살게 돕고, 감정을 제어하는 법과 항상 행복하게 지내는 법을 배우게 할 수 있습니다. 인간 두뇌는 균형이 필요하며, 건강하려면 잠자고, 생각하고, 움직여야 합니다. 파티클 포톤과 파티클 창립자들이 만든 웹서버를 사용하여 사람들이 자연스러운 두뇌 균형을 찾도록 도울 수 있습니다. 어린 시절의 꿈이 이 프로젝트로 이끌었고, 제가 만든 것에 매우 기쁩니다.
하지만 스타워즈와 포스를 잠시 제쳐두더라도, 이 장치는 게으른 사람들이나 팬만을 위한 것이 아닙니다. 매일 장애와 싸우는 사람들에게 능력을 되돌려주기 위해 만들어졌습니다. 내가 설계한 로봇은 휠체어와 같은 방식으로 작동하며, 홈 오토메이션 시스템은 사용자가 움직일 수 없어도 조명이나 TV를 제어할 수 있게 돕습니다. PC 컨트롤러 모드는 건강한 사람들에게도 유용할 수 있습니다. 우리 모두 생각만으로 컴퓨터 게임을 하거나 인터넷 서핑을 하고 싶을 것입니다.
프로젝트 스토리에 대한 짧은 소개 영상 시청:
직접 만들어보고 싶으신가요? 여기 이 프로젝트에 대해 알아야 할 모든 것을 설명하겠습니다. 코드, 회로도, 자세한 지침을 공유하니 납땜 인두를 예열하세요…
프로젝트 뒤에 숨은 과학
뇌파도(EEG)는 뇌의 전기적 활동을 기록하는 전기생리학적 모니터링 방법입니다. 일반적으로 비침습적이며, 두피를 따라 전극이 배치되지만, 특정 응용 분야에서는 침습적 전극이 사용되기도 합니다. EEG는 뇌의 뉴런 내 이온 전류로 인한 전압 변동을 측정합니다. 진단 응용은 일반적으로 EEG의 스펙트럼 내용, 즉 EEG 신호에서 관찰할 수 있는 신경 진동 유형(일명 "뇌파")에 초점을 맞춥니다. (위키피디아 감사) 하지만 우리는 두 가지 매우 정확한 값을 사용할 것입니다:
알파(Alpha): 7Hz~14Hz 주파수 범위. 눈 감기와 이완 시 나타나며, 눈 뜨기나 정신적 노력 시 약해집니다.
베타(Beta): 15Hz~약 30Hz 주파수 범위. 낮은 진폭의 베타는 활발하고 바쁘거나 불안한 사고 및 적극적인 집중과 관련이 있습니다.
작동 원리
이 프로젝트를 구현하기 위해 4개의 마이크로컨트롤러를 사용했습니다: 아두이노 메가, 아두이노 레오나르도, 우노, 파티클 포톤. 메가는 헤드셋에서 신호를 수신하고 분석한 후 다른 장치로 명령을 전달하는 프로젝트의 두뇌입니다. 모든 데이터를 포톤으로 전달하여 웹서버를 생성합니다. 레오나르도는 PC의 마우스를 제어하고, 우노는 IR(적외선 신호)을 수신하여 로봇을 제어합니다. 앞서 말했듯 이 장치는 3가지 다른 것(원하면 더 많이 프로그래밍 가능)을 제어할 수 있습니다. 이제 이 3가지를 채널이라고 부르겠습니다. 눈을 감는 것으로 이 채널들을 전환합니다:
눈을 1-2초 감기: 홈 오토메이션 기능으로 전환
눈을 2-4초 감기: 로봇 컨트롤러 모드로 전환
눈을 4-6초 감기: 마우스 컨트롤러 모드로 전환
홈 오토메이션 기능을 위해 릴레이를 사용했습니다. TV, 전구, 벽면 콘센트 등 원하는 것을 연결할 수 있습니다.
무선 헤드셋
장난감 해킹을 좋아해서 뇌파를 감지해 귀를 움직이는 Necomimi라는 뇌파 감지 장난감을 구매했습니다. 이것은 제가 본 가장 쓸모없는 장난감이지만, 내부에는 뇌파를 읽고 노이즈를 필터링하여 매우 좋은 신호를 주는 작은 칩이 있습니다. UART(시리얼) 인터페이스로 작동하므로 약간의 해킹으로 아두이노가 뇌파를 읽을 수 있습니다. 이 헤드셋의 역할은 뇌파를 중앙 서버로 무선 전송하는 것입니다. 아무도 머리에 케이블을 원하지 않으므로 편안하고 사용자 친화적인 헤드셋을 만들었습니다.
아래로 내려가서 이 장난감을 분해하고 무선 블루투스 헤드셋으로 만드는 방법을 확인하세요.
사용 방법
측정 가능한 두 가지 eSense 값(NeuroSky 값)이 있습니다: 0-100의 명상(meditation)과 0-100의 주의력(attention). 집중할수록 주의력 값이 높아집니다. 이완할수록 명상 레벨이 높아집니다.
시스템은 생각으로 작동하며, 다른 것은 필요 없고 집중하거나 이완하는 법만 배우면 됩니다. 일주일 실험 후 저는 주의력 값을 매우 정확하게 제어할 수 있게 되었습니다. 의식적으로 주의력 레벨을 약 15, 39, 65, 90으로 설정할 수 있습니다. 각자 자신의 값 제어 방법을 찾아야 합니다. 감정과도 잘 작동했습니다. 사랑, 우정, 분노, 두려움을 생각하면 값에 매우 좋은 대비가 나타납니다.
시스템을 켜려면 마이크로 USB 케이블을 아두이노 레오나르도에 연결하세요. 이렇게 하면 마우스도 제어할 수 있고(원한다면), 시스템에 5볼트 500mA를 공급합니다.
홈 오토메이션 시스템 제어
홈 오토메이션 모드로 전환되면 주의력 레벨을 70 이상으로 올려 첫 번째 릴레이 켜기, 명상 레벨을 70 이상으로 올려 두 번째 릴레이 켜기, 둘 다 70 이상으로 올려 세 번째 릴레이 켜기. 약간 까다롭지만 마인드 트레이닝 후 불가능하지 않습니다. 이미 켜져 있다면 같은 명령으로 끕니다(켜져 있을 때 다시 70에 도달하면 끔). 시스템이 완료되면 릴레이 모듈에 고전압 장치(조명, TV, PC, 쿨러 팬 등)를 연결할 수 있습니다.
마우스 제어
커서는 감정으로 제어됩니다. 주의력 레벨이 25 미만: 왼쪽 이동, 25-50: 오른쪽 이동, 50-75: 위쪽 이동, 75-100: 아래쪽 이동. 명상 레벨을 높여 클릭합니다. 앞서 말했듯 주의력 레벨은 감정으로 쉽게 제어할 수 있습니다(저의 경우).
로봇 제어
로봇에는 정지, 좌회전, 전진의 세 가지 상태만 있습니다. 왜 두 가지 이동 옵션만 있나요? 이 두 방향만으로 로봇을 원하는 어디든 이동시킬 수 있기 때문입니다. 명상 레벨로 로봇을 회전시키고, 원하는 방향에 도달하면 로봇을 정지시킨 후 주의력 레벨로 전진하세요. 초보자도 주의력/명상 값을 잘 제어하지 못해도 이 로봇으로 놀 수 있는 더 좋은 제어 방법입니다.
내 계획
이것은 예전 계획 사진이지만 성공했기에 결과에 매우 만족합니다. 헤드셋은 BT(블루투스) 신호를 전송하여 아두이노 메가가 수신 바이트를 분석하고 사용자의 생각에 따라 다양한 기능을 제어합니다. 이 많은 데이터를 전송하는 최적의 방법을 찾는 것이 매우 어려웠지만, WiFi 대신 블루투스를 선택했습니다. 처음에는 파티클 포톤을 데이터 전송기로 사용하려 했지만, 그 작은 녀석이 웹서버 제작에 더 나은 역할을 맡게 되었습니다. 이것이 전체 프로젝트에서 가장 큰 변경이었습니다. 직접 만든 아두이노 모듈을 사용했는데, 직접 회로 설계하는 것을 좋아하기 때문입니다. 온라인으로 이 모듈들을 구매하거나 저와 함께 직접 만드실 수 있습니다.
배우고 실험한 반년
이 프로젝트에 많은 노력을 들였고, 거의 반년 전에 시작했지만 포톤 덕분에 속도가 빨라졌습니다. 그들의 대시보드 사용이 매우 쉬웠습니다. 인터넷에 EEG 장난감 해킹 튜토리얼이 많아 조금 도움이 되었지만, 추가 기능은 없었습니다. 그래서 이 Necomimi 장난감을 해킹하고 창의력을 발휘해 LED 깜빡임보다 훨씬 더 많은 기능을 가진 이 장치를 만들었습니다. 즐기시길 바랍니다!
시작해봅시다!
Necomimi 장난감 해킹
이 EEG 장난감을 블루투스로 데이터 전송하도록 수정하려면 케이스를 분해하세요. 나사는 스티커 아래에 있습니다. 스티커와 장치 뒷면을 제거하면 내부에 작은 회로가 있습니다. 메인 회로 아래에 있는 것이 Neurosky TGAM 칩입니다. 이것은 4개의 헤더 핀으로 메인 마이크로컨트롤러 보드와 연결되어 있으므로 납땜 인두로 이 회로를 조심스럽게 제거하세요. 이제 GND 핀, VCC 핀, T 핀에 세 개의 와이어를 납땜하세요. T 핀은 57600 보드레이트의 송신 핀으로, 데이터 패킷을 마이크로컨트롤러로 전송합니다. 하지만 저는 이것을 직접 HC-06 슬레이브 BT 모듈에 연결했습니다. HC-06은 9600 보드레이트로 설정되어 있지만 걱정하지 마세요, 이 문제를 해결할 것입니다. 세 개의 와이어를 납땜했다면 직접 충전식 전원을 내장할 수 있습니다. 저는 500mAh 리튬 이온 배터리, USB 충전 회로, 5V 승압 회로, 두 개의 저항(100Ω, 200Ω)을 사용하여 칩과 블루투스 모듈에 완벽한 3.4볼트 전원을 공급했습니다. 헤드셋에 필요한 회로를 만들려면 회로도를 따르세요. 회로가 완료되면 블루투스 모듈을 설정하세요.
칩에 대하여
Neurosky ThinkGear AM은 필터링, 증폭, 시리얼 인터페이스를 통한 데이터 전송을 위해 설계되었습니다. 더 많은 정보는 여기.
회로도 / 전자회로
아래 지침과 그림을 따라 직접 무선 EEG 헤드셋을 만드세요.
500mAh 리튬 이온 배터리, 안정적인 전압 생성을 위한 5V 승압 모듈, 안정적인 3.3볼트로 전압을 낮추기 위한 100Ω과 200Ω 저항이 필요합니다. 전원 공급과 블루투스 모듈로 데이터 전송을 위해 암 헤더 핀을 납땜했습니다.
가장 중요한 부분은 "T" 핀을 블루투스 모듈의 "RX"에 연결하는 것입니다. 이것이 우리 프로젝트에 생명을 불어넣습니다.
블루투스 모듈 설정
HC-06: 먼저 "HC_06_Bluetooth" 스케치를 아두이노 우노에 업로드한 다음 회로도대로 블루투스 모듈을 연결하세요. 이 회로도는 Artronix 팀 웹사이트에서 찾았으며 유용해 보였습니다.
아두이노 IDE의 시리얼 모니터를 열고 아두이노가 BT 모듈을 설정할 때까지 기다리세요. 이제 블루투스 모듈이 57600 보드레이트로 설정되었습니다. 이 해킹된 블루투스 Necomimi 장난감은 모든 Neurosky 앱과 호환됩니다. 많은 BCI(뇌-컴퓨터 인터페이스) 앱을 시도해 볼 수 있습니다.
이 앱들을 사용하여 뇌파와 주의력, 명상 같은 값 제어하는 법을 배울 수 있습니다. 많은 멋진 게임을 시도할 수 있지만, 이 앱들을 추천합니다(PC, iOS, Android 호환):
"HC_05_Bluetooth"를 사용하여 앞서와 같은 방식으로 아두이노에 업로드하세요. HC-05의 "EN" 핀을 아두이노의 3v3에 연결하세요. 안드로이드 스마트폰으로 BT 모듈의 주소를 확인하여 코드에 작성하세요. 코드에서 ":"(콜론)을 ","(쉼표)로 변경하세요.
코드에서 주소를 다음과 같이 변경하세요:
20:15:09:15:17:82 ==> 2015,09,151782 이렇게 하면 HC-05 모듈이 주소를 인식할 수 있습니다. 일부 ":"는 필요 없으므로 그대로 두세요.
// HC-05 설정
void setup() {
Serial.begin(9600); // 기본 HC-05 보드레이트
delay(1000);
Serial.print("AT");
delay(1000);
Serial.print("AT+VERSION");
delay(1000);
Serial.println("AT+ROLE=1"); // HC-05를 마스터 모드로 설정
delay(1000);
Serial.println(" AT+LINK=여기에_주소_복사"); // 모듈이 자동으로 연결됨
delay(1000);
Serial.print("AT+UART=57600,1,0"); // 보드레이트를 57600으로 설정
Serial.begin(57600);
}
void loop() { }
이제 두 모듈이 서로 연결되어야 합니다. 문제가 있으면 이 링크를 클릭해 자세히 읽어보세요.
원격 제어 로봇
저렴한 로봇을 만들기 위해 TV 리모컨에 사용되는 38kHz IR 기술을 사용했습니다. 아마존에서 로봇 섀시를 구매했습니다. IR 수신기는 오래된 TV에서 회수했고 아두이노도 아마존에서 구매했습니다. 부품 링크는 하드웨어 섹션에 추가했습니다.
모터 드라이버 회로
필요한 부품:
나사 단자 2개
L293D IC
헤더 핀 3개
90도 헤더 핀 9개
1kΩ 저항
적색 LED
와이어
PCB 보드
일부 구리 와이어를 사용하고 회로도를 따라 IC의 핀을 헤더 핀에 연결했습니다. 어느 핀이 어느 헤더 핀에 연결되는지는 중요하지 않으며, 어디에 연결했는지 기억만 하면 됩니다. LED는 저항과 직렬로, 5V VCC와 병렬로 연결됩니다.
섀시 조립
이 단계는 매우 쉬웠습니다. 드라이버와 약간의 공예 기술로 5분 만에 프레임을 만들었습니다. 이제 모터 드라이버 회로를 만들 차례입니다. 모터를 제어하기 위해 두 개의 모터를 구동할 수 있는 L293D IC를 선택했습니다. 회로도를 보고 회로를 만드세요.
부품을 아두이노에 연결
점퍼 와이어를 사용하여 센서와 모터 드라이버를 아두이노에 연결했습니다.
아두이노 핀 ==> 모터 드라이버
4 ==> 15
5 ==> 10
6 ==> 7
7 ==> 2
VIN ==> 8
5V ==> 1, 9, 16
GND ==> 4, 5, 13, 12
L293D 모듈의 회로도를 보고, 위와 같이 핀을 아두이노 우노에 연결하세요. 아두이노의 5V 핀을 1, 9, 16 핀에 연결하여 IC의 모터 드라이버 기능을 활성화해야 합니다. 마지막으로 나사 단자로 모터에 전원을 공급하세요.
코드 작성…
IRremote 라이브러리를 사용하여 38kHz 적외선 신호를 읽고 디코딩한 후 로봇을 움직이는 코드를 만들었습니다. (코드 섹션에서 라이브러리 다운로드).
코드에 설명을 추가했지만 핵심은 메인 서버에서 오는 IR 신호를 디코딩하고, 사용자가 원하는 것에 따라 모터를 움직여 로봇을 전진시키거나 좌회전시키는 것입니다. 코드 다운로드: "Robot_Code". 아두이노에 업로드하면 로봇이 완성됩니다.
메인 서버 (아두이노 메가, 레오나르도, 포톤)
서버는 무선 헤드셋에서 들어오는 데이터 패킷을 읽습니다. 설정된 BT 모듈을 사용하여 헤드셋과 서버 간 연결을 보장합니다. 아두이노 메가는 회로의 두뇌로, 모든 것이 이 마이크로컨트롤러에 연결됩니다: 블루투스, 적외선 송신 LED, 웹서버, 마우스 컨트롤러. 코드는 약간 복잡하지만 이해를 돕기 위해 설명을 추가했습니다.
케이스
심플하지만 멋집니다. 18x15cm 플레이트 두 개를 자르고 사포로 가장자리를 매끄럽게 다듬었습니다. 나사로 서로 연결했습니다.
릴레이 회로
필요한 부품:
2n2222 트랜지스터 (3개)
게르마늄 다이오드 (3개)
330Ω 저항 (3개)
1kΩ 저항 (3개)
5V 릴레이 (3개)
훅업 와이어
헤더 핀
PCB 보드
천 마디 말보다 한 장의 그림이 낫습니다. 회로도를 보고 부품을 PCB에 어떻게 연결해야 할지 확인하세요. "Signal" 핀이 아두이노에서 신호를 받으면 릴레이가 켜집니다. 트랜지스터는 릴레이에 충분한 전력을 보장하기 위해 신호를 증폭합니다. 37-38-39 핀을 사용하여 각 릴레이의 HIGH-LOW 레벨을 제어합니다.
케이스에 부품 장착
플렉시글라스 케이스에 부품을 설치하기 위해 양면 흰색 테이프를 사용했습니다. 보기 좋고 회로를 케이스에 단단히 고정합니다.
서버 회로
이 서버는 소프트웨어 기반이므로 회로 제작이 어렵지 않습니다. (아래 회로도 참조). 마이크로컨트롤러에 전원을 공급하고 그들 사이의 연결만 만들면 됩니다. IR LED는 디지털 핀 D3에, 릴레이는 37-38-39에 연결됩니다. 아두이노 메가의 D16은 포톤의 RX로, D18은 레오나르도의 RX로 연결됩니다.
로봇과의 연결
IR LED는 디지털 핀 D3에 연결되고 IRremote 라이브러리로 로봇에 코드를 전송합니다. 꽤 간단합니다. 로봇 코드의 IR 코드와 같아야 합니다. 완료했다고 생각되면 카메라로 테스트해보세요. 적외선 빛은 사진에서 보라색으로 보이며, 카메라는 IR 빛을 감지할 수 있습니다. 이 트릭은 항상 작동합니다.
코드
소프트웨어 파트의 "Arduino_Mega_Server" 코드를 사용하세요.
코드 작성하면서 많이 고생했습니다. 세 개의 서로 다른 마이크로컨트롤러를 프로그래밍해야 해서 큰 도전이었습니다. IRremote, Brain, SoftwareSerial, Mouse 라이브러리를 사용했습니다(소프트웨어 파트에서 다운로드 링크 참조). 하지만 이제 코드가 완성되어 작동하므로 여러분의 마이크로컨트롤러에 업로드하기만 하면 됩니다. .ino 파일을 다운로드하거나 IDE에 코드를 복사/붙여넣기하여 사용하세요. 파티클 포톤용 코드는 브라우저 IDE를 통해 업로드해야 합니다. Particle Build에 등록하고 노트북을 마이크로컨트롤러에 연결하세요. 거의 자동으로 이루어져서 정말 놀랐습니다. 디바이스 ID 번호만 추가하면 됐습니다.
코드 업로드 전에는 RX/TX 핀에 아무것도 연결되지 않았는지 확인하세요. 블루투스 모듈을 메가에서, 메가를 레오나르도와 포톤에서 분리하세요.
마우스 컨트롤러
웹서버
프로젝트에 IoT(사물인터넷) 기능을 추가하고 싶어서 파티클 포톤을 사용하여 온라인 데이터 로거를 만들었습니다. 장치로 무엇을 하느냐에 따라 포톤은 개인 서버를 생성하고 클라우드에 데이터를 기록합니다.
처음엔 무서워 보일 수 있지만, 스트레스 상태 감지(주의력 레벨이 급격히 오르내림)나 수면 필요 감지(명상 레벨이 항상 80 이상)를 상상해보세요. 이 웹서버는 더 건강한 삶을 사는 데 도움이 될 수 있습니다.
파티클에는 Particle.publish(); 구문으로 어떤 종류의 데이터든 게시할 수 있는 온라인 대시보드도 있습니다. 대시보드 개발자들에게 큰 "감사"를 전해야 합니다. 우리에게 많은 시간을 절약해 주었습니다.
브라우저에서 코드 작성?
웹페이지에서 코드를 작성하는 것이 흥미로웠지만, 일반 IDE와 같은 방식으로 작동했습니다. 코드가 무선으로 업로드되었습니다. 이 마이크로컨트롤러는 모든 사람의 도구상자에 매우 유용한 도구가 될 것입니다.
뇌파로 로봇만 제어하고 싶은 사람들을 위한 빠른 업그레이드
전체 프로젝트를 만들고 싶지 않고, 뇌파로 제어되는 로봇만 원하신다면? 초보자라도 걱정하지 마세요. 여러분을 위해 생각했습니다. 아두이노 미니 프로와 IR LED, 물론 헤드셋만 있으면 로봇을 제어할 수 있는 설명이 있는 코드를 만들었습니다. 많은 독자가 간단하고 재미있는 주말 프로젝트를 원한다는 것을 알기에 여기에 설명과 코드를 제공합니다.
소프트웨어 섹션의 "RobotControlllerHeadset" 코드를 사용하세요. 미니 프로(또는 아두이노 우노)의 D3 핀에 IR LED를 연결하고 NeuroSky 칩의 T 핀을 아두이노의 RX 핀에 연결하세요. 3.3V 또는 5V로 전원 공급하면 완료입니다. 로봇을 만든 후 헤드셋에 이 코드를 사용하세요:
#include <IRremote.h>
#include <IRremoteInt.h>
#include <Brain.h>
IRsend irsend;
Brain brain(Serial);
const int ledPin = 3;
long interval = 500;
long previousMillis = 0;
int ledState = LOW;
int medValue;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(57600);
}
void loop() {
if (brain.update()) {
Serial.println(brain.readCSV());
medValue = brain.readMeditation();
}
if (brain.readSignalQuality() == 0) {
if (medValue > 65) {
irsend.sendNEC(0xFF10EF, 32);
delay(40);
}
if (brain.readAttention() > 65) {
irsend.sendNEC(0xFF18E7, 32);
delay(40);
}
}
}
IoT 제다이가 되기 (테스트)
여기서 설명한 모든 것을 만든 후 남은 것은 단 하나: 시도해보기입니다. 마음의 힘, 뇌의 뉴런에 있는 포스의 힘을 사용하세요. 작은 로봇을 움직이고, 집을 제어하고, 생각으로 모든 것을 제어하세요…
이제 당신은 진짜 IoT 제다이가 되었습니다!
이 장치에는 많은 기능이 있고 가지고 놀기 매우 재미있습니다. 하지만 앞서 말했듯 단순한 장난감이 아닙니다, 생물학과 전자공학을 결합하여 매일 장애와 싸우는 사람들이 자연스러운 능력을 되찾도록 도울 수 있는 장치를 만들었습니다.
로봇은 쉽게 제어할 수 있고, 릴레이도 큰 도전이 아닙니다. 마우스를 제어하려면 주의력 레벨 제어하는 법만 배우면 됩니다. 사진에서 저는 뇌파로 앱을 종료하려 시도하고 있습니다. 더 많은 연습이 더 나은 경험을 보장합니다.
시청해 주셔서 감사합니다!
내 프로젝트가 마음에 드셨기를 바라며, 댓글로 의견을 남겨주세요. 장치에 대한 영상을 만들고 싶었지만 코딩이 어려워 짧은 영상을 만들 시간이 없었습니다. 곧 유튜브 채널에 올리고 이 프로젝트 프레젠테이션도 업데이트하겠습니다.
포스가 항상 당신과 함께하길!
코드
파티클 포톤 코드
로봇 컨트롤러 코드
HC_05_Bluetooth.ino
마우스 컨트롤러 코드
Arduino_Mega_Server
RobotControllerHeadset.ino
파티클 포톤 코드
// "Use the Force... Or your Brainwaves?" 프로젝트용 웹서버 코드
// 사용자의 뇌파 명상 및 주의력 레벨에 대한 통계 생성
// 완벽하게 작동하는 파티클 대시보드 덕분에 코드가 매우 간단함
int att;
int med;
int function;
void setup() {
Serial.begin(9600);
}
void loop() {
Spark.publish("Attention", String(att) + "%");
delay(2000);
Spark.publish("Meditation", String(med) + "%");
delay(2000);
Spark.publish("Last Function", String(function));
delay(2000);
if (Serial.available() > 0) {
char c = Serial.read();
}
delay(10);
switch(c) {
case 'a': att = 10; break;
case 'b': att = 20; break;
case 'c': att = 30; break;
case 'd': att = 40; break;
case 'e': att = 50; break;
case 'f': att = 60; break;
case 'g': att = 70; break;
case 'h': att = 80; break;
case 'i': att = 90; break;
case 'j': att = 100; break;
case 'k': med = 10; break;
case 'l': med = 20; break;
case 'm': med = 30; break;
case 'n': med = 40; break;
case 'o': med = 50; break;
case 'p': med = 60; break;
case 'q': med = 70; break;
case 'r': med = 80; break;
case 's': med = 90; break;
case 't': med = 100; break;
case 'x': function = "Home Automation"; break;
case 'y': function = "Robot Controller Mode"; break;
case 'z': function = "Mouse Controller"; break;
}
}
로봇 컨트롤러 코드
// "Use the Force or your Brainwaves?" 프로젝트용
#include <IRremote.h>
int IRpin = 3;
IRrecv irrecv(IRpin);
decode_results results;
int motor_pin1 = 4;
int motor_pin2 = 5;
int motor_pin3 = 6;
int motor_pin4 = 7;
void setup() {
irrecv.enableIRIn();
pinMode(motor_pin1, OUTPUT);
pinMode(motor_pin2, OUTPUT);
pinMode(motor_pin3, OUTPUT);
pinMode(motor_pin4, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (irrecv.decode(&results)) {
irrecv.resume();
}
if (results.value == 0xFF18E7) { // 전진
digitalWrite(motor_pin1, LOW);
digitalWrite(motor_pin2, HIGH);
digitalWrite(motor_pin3, LOW);
digitalWrite(motor_pin4, HIGH);
Serial.println("Go Forward!");
}
if (irrecv.decode(&results)) {
irrecv.resume();
}
if (results.value == 0xFF4AB5) { // 후진
digitalWrite(motor_pin1, HIGH);
digitalWrite(motor_pin2, LOW);
digitalWrite(motor_pin3, HIGH);
digitalWrite(motor_pin4, LOW);
Serial.println("Go Backward!");
}
if (irrecv.decode(&results)) {
irrecv.resume();
}
if (results.value == 0xFF10EF) { // 좌회전
digitalWrite(motor_pin1, HIGH);
digitalWrite(motor_pin2, LOW);
digitalWrite(motor_pin3, LOW);
digitalWrite(motor_pin4, HIGH);
Serial.println("Turn Left!");
}
if (irrecv.decode(&results)) {
irrecv.resume();
}
if (results.value == 0xFF5AA5) { // 우회전
digitalWrite(motor_pin1, LOW);
digitalWrite(motor_pin2, HIGH);
digitalWrite(motor_pin3, HIGH);
digitalWrite(motor_pin4, LOW);
Serial.println("Turn Right!");
}
if (irrecv.decode(&results)) {
irrecv.resume();
}
if (results.value == 0xFF38C7) { // 정지
digitalWrite(motor_pin1, LOW);
digitalWrite(motor_pin2, LOW);
digitalWrite(motor_pin3, LOW);
digitalWrite(motor_pin4, LOW);
Serial.println("Stop!");
}
}
HC_05_Bluetooth.ino
// HC-05 설정
void setup() {
Serial.begin(9600);
delay(1000);
Serial.print("AT");
delay(1000);
Serial.print("AT+VERSION");
delay(1000);
Serial.println("AT+ROLE=1"); // HC-05를 마스터 모드로 설정
delay(1000);
Serial.println(" AT+PAIR=여기에_주소,9"); // 자동 연결
delay(1000);
Serial.print("AT+BAUD7"); // 보드레이트 57600 설정
Serial.begin(57600);
}
void loop() { }
마우스 컨트롤러 코드
// Imets Tamas의 "Use the Force... Or your Brainwaves?" 프로젝트용 코드
// 아두이노 메가에서 오는 시리얼 신호에 따라 마우스 커서 이동
#include <Mouse.h>
void setup() {
Serial.begin(9600);
Mouse.begin();
}
void loop() {
if (Serial.available() > 0) {
char inByte = Serial.read();
switch (inByte) {
case 'u': Mouse.move(0, -8); break; // 위
case 'd': Mouse.move(0, 8); break; // 아래
case 'l': Mouse.move(-8, 0); break; // 왼쪽
case 'r': Mouse.move(8, 0); break; // 오른쪽
case 'c': Mouse.click(MOUSE_LEFT); break; // 좌클릭
}
}
}
Arduino_Mega_Server
/* "A Tool for the Mind" 프로젝트용 아두이노 메가 코드 by Imets Tamas, 2016년 2월 2일
이 코드는 뇌파 센서에서 들어오는 블루투스 시리얼 신호를 분석, 정리, 전달함
자유롭게 수정하되 크레딧은 유지해주세요. 변수 값에는 가족 이름의 문자를 사용했으며 원하면 변경 가능: I. M. E. T. S.
자세한 내용: https://www.instructables.com/member/Imetomi/ 또는 https://www.hackster.io/Imetomi */
#include <VirtualWire.h>
#include <SoftwareSerial.h>
#include <Brain.h>
#include <LiquidCrystal.h>
#include <IRremote.h>
int led = 13;
int medled = 50;
int attled = 51;
int blinkled = 52;
char robot;
IRsend irsend;
SoftwareSerial mouse(18, 19); // 레오나르도 보드로
SoftwareSerial webserver(16, 15); // 파티클 포톤으로 (웹서버 생성용)
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Brain brain(Serial); // 블루투스 모듈을 통해 하드웨어 시리얼로 뇌파 읽기
int closedeye = (brain.readLowAlpha());
int attention = (brain.readAttention());
int brainsignal = (brain.readSignalQuality());
int meditation = (brain.readMeditation());
int alpha = (brain.readHighAlpha());
int lightatt;
int lightmed;
int blinklength;
int prevsignal = 0;
void setup() {
mouse.begin(9600);
webserver.begin(9600);
Serial.begin(57600); // Necomimi의 비트/초율
lcd.begin(16, 2);
pinMode(led, OUTPUT);
pinMode(attled, OUTPUT);
pinMode(medled, OUTPUT);
pinMode(blinkled, OUTPUT);
pinMode(37, OUTPUT);
pinMode(38, OUTPUT);
pinMode(39, OUTPUT);
lightatt = map(attention, 0, 100, 0, 255);
lightmed = map(meditation, 0, 100, 0, 255);
}
void robotmode() {
if (brain.update()) {
if ((blinklength > 0) && (blinklength < 2000)) {
loop(); // 로봇 컨트롤러 모드 종료
}
if (attention > 70) {
irsend.sendNEC(0xFF18E7, 32); // 전진
webserver.println("g");
delay(40);
}
if (meditation > 70) {
irsend.sendNEC(0xFF10EF, 32); // 회전
webserver.println("q");
delay(40);
}
}
}
void loop() {
if (brain.update()) {
analogWrite(attled, lightatt);
analogWrite(medled, lightmed);
if ((closedeye > 30000) && (alpha > 30000)) {
digitalWrite(blinkled, HIGH);
blinklength = millis();
} else if ((closedeye < 30000) && (alpha < 30000)) {
digitalWrite(blinkled, LOW);
blinklength = 0;
}
if ((blinklength > 0) && (blinklength < 2000)) {
webserver.println("a");
delay(40);
robotmode();
}
if ((blinklength > 2001) && (blinklength < 4000)) {
webserver.println("a");
delay(40);
relay();
}
if ((blinklength > 4001) && (blinklength < 6000)) {
webserver.println("a");
delay(40);
mousecontrol();
}
Serial.println(brain.readCSV());
}
}
void relay() {
webserver.println("");
if (brain.update()) {
if ((blinklength > 0) && (blinklength < 2000)) {
loop(); // 릴레이 컨트롤러 모드 종료
}
if (attention > 70) {
digitalWrite(37, HIGH);
webserver.println("g");
prevsignal = 1;
}
if (meditation > 70) {
digitalWrite(37, HIGH);
webserver.println("q");
prevsignal = 1;
}
if ((1000 > blinklength) && (blinklength > 0)) {
digitalWrite(37, HIGH);
webserver.println("qj");
prevsignal = 1;
}
if ((attention > 70) && (prevsignal == 1)) {
digitalWrite(37, LOW);
webserver.println("q");
prevsignal = 1;
}
if ((meditation > 70) && (prevsignal == 1)) {
digitalWrite(37, LOW);
webserver.println("qj");
prevsignal = 1;
}
if ((1000 > blinklength) && (blinklength > 0) && (prevsignal == 1)) {
digitalWrite(37, LOW);
webserver.println("a");
prevsignal = 1;
}
}
}
void mousecontrol() {
webserver.println("z");
if (brain.update()) {
if (0 < attention && attention < 25) {
mouse.println('l'); // 왼쪽
webserver.println("a");
}
if (26 < attention && attention < 50) {
mouse.println('r'); // 오른쪽
webserver.println("c");
}
if (51 < attention && attention < 75) {
mouse.println('u'); // 위
webserver.println("f");
}
if (76 < attention && attention < 100) {
mouse.println('d'); // 아래
webserver.println("h");
}
if (meditation > 70) {
mouse.println('c'); // 클릭
webserver.println("t");
}
}
}
RobotControllerHeadset.ino
#include <IRremote.h>
#include <IRremoteInt.h>
#include <Brain.h>
IRsend irsend;
Brain brain(Serial);
const int ledPin = 3;
long interval = 500;
long previousMillis = 0;
int ledState = LOW;
int medValue;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(57600);
}
void loop() {
if (brain.update()) {
Serial.println(brain.readCSV());
medValue = brain.readMeditation();
}
if (brain.readSignalQuality() == 0) {
if (medValue > 65) {
irsend.sendNEC(0xFF10EF, 32);
delay(40);
}
if (brain.readAttention() > 65) {
irsend.sendNEC(0xFF18E7, 32);
delay(40);
}
}
}