正月にGSR計測器を自作してみたので、作り方を記録しておきます。正直、おもちゃみたいなものですが、プログラミングの知識がない人でも簡単に作ることができます。便利な世の中になったもんだ。
手を動かす前に
ガルバニック皮膚反応(GSR)とは?
そもそもガルバニック皮膚反応 (GSR) とはなんぞや?という話ですが、発汗等で変化する皮膚上の電気抵抗の変化を指すらしいです。ほかにも皮膚コンダクタンス反応(SCR)、皮膚電位活動(EDA)と呼ばれる。この、皮膚上の電気抵抗の変化を「情動状態」を反映する指標とすることで、直接観測できない「心 (内的過程)」を推測する道具として用いられることが多いみたいです。一番GSR計測システムの一番ポピュラーな例は「うそ発見器」でしょうか。うそをつくとドキドキしたり汗かいたりして、皮膚の電気抵抗が下がるという理屈です (ほんとかな?)。別の指標として、皮膚ポテンシャルというのもあるらしい。今回はGSRで統一します。
今回の目的
GSRセンサ、Arduino、Pythonを使って、GSR計測システムを作ります。このシステムでは、GSRを計測、表示、記録することができます。
今回必要なもの
- PC (PythonとArduino IDEをインストール)
- Arduino本体と付属品
- GSRセンサ
PythonとArduino IDEは使用するOSのバージョンに合ったものを各自インストールして下さい。PythonもArduino IDEもいずれも無償です。Arduino本体と付属品は、下図のようなスターターキットで十分です。GSRセンサに関しては、スイッチサイエンスから購入できて、マニュアルも製品ページから見ることができます。 プログラムも含めて丁寧に説明が書かれています。ぜひ参照ください。
ハードウェアの準備
これも製品ページからダウンロードできるマニュアルに書いてありますが、GSRセンサからは電極へ向かう線以外に4本線が伸びています。黒: GND、赤: 5V、白: 使わない、黄: A0です。下の写真のように、それぞれArduino本体の対応する端子 (GNDはGND、5Vは5V、A0はアナログ入力) に接続してください。電極付きの指カバーを人差し指と中指にはめて、Arduino本体をPCにUSB接続したらハードウェアの準備は完了です。

ソフトウェアの準備
Arduino側コード
ハードウェアの準備が整ったら、Arduino IDEを起動して、Arduino本体がGSRを計測するためのプログラムを書き込みます。このプログラムでは、GSRセンサからのアナログ入力を受けて、それをシリアル通信でPCに送るという命令をしています。Arduino IDEでコードが書けたらArduinoへの書き込みをお忘れなく。
実は、GSRを計測して表示する、だけならArduinoだけで十分です。自分の指にGSRセンサの電極カバーを装着した状態で、Arduino IDEのUI上部にあるメニューバーの「ツール>シリアルプロッタ」を開くと、GSRが変化している様子が別のウィンドウに表示されます。
// I recommend that you visit http://wiki.seeedstudio.com/Grove-GSR_Sensor/
// The original program is there
// Copyright (c) 2008-2016 Seeed Development Limited (www.seeedstudio.com / www.seeed.cc)
//使用する変数を宣言
const int GSR = A0;
int sensorValue = 0;
int gsr_average = 0;
void setup(){
//シリアル通信のレートを指定する
Serial.begin(9600);
}
void loop(){
long sum=0;
//エラー回避のため10回計測し、その平均を取得
for(int i=0;i<10;i++)
{
sensorValue = analogRead(GSR);
sum += sensorValue;
delay(5);
}
gsr_average = sum/10;
Serial.println(gsr_average);
}
Pythonコード
GSRの計測と表示だけなら上記コードでも十分ですが、今回は測定したGSRをPythonを使って記録しておいて、計測が終わった後にプロットするというプログラムを書いてみましょう。ArduinoからPythonへGSRの情報を持ってくることで、Pythonで書かれた別のプログラムの途中にGSRの計測を埋め込むことができます。例えば、被験者にいくつかの質問に回答してもらう課題を遂行中にGSRを計測する、なんてことも可能です。
# reference:
# https://opuktr.hatenablog.com/entry/2018/08/16/194416
import numpy as np
import matplotlib.pyplot as plt
import serial
import datetime
def queue(Src, Data):
Dst = np.roll(Src, -1)
Dst[-1] = Data
return Dst
GSRS = [0]*100
i = 0
# 'COM5' is the port for Arduino in my environment
# Please check your port number for it
Ser = serial.Serial('COM5', 9600)
while(i != 100):
GSR = float(Ser.readline().rstrip().decode(encoding = 'utf-8'))
TimeStamp = datetime.datetime.today()
print(TimeStamp.strftime("%Y/%m/%d %H:%M:%S"))
print(GSR)
GSRS = queue(GSRS, GSR)
i += 1
Ser.close()
print("END")
plt.plot(GSRS)
plt.show()
実行してみよう
ここまでのステップをまとめます。ぜひ実行してみてください。
- Arduino本体とGSRセンサをジャンパーワイヤで接続する
- Arduino IDEのコードをArduinoへ書き込む (シリアルプロッタで確認)
- Pythonでコードを書き、実行 (プロットした図を確認)

Pythonでプロットすると、こんなグラフが描けるはず
今回はGSRセンサを使ったGSR計測と記録でしたが、ご紹介したプログラムでは、「Arduinoがアナログ入力を受けて、シリアル通信を介してPythonで読み込む」という作業を実行しています。センサを変えれば他の生理指標計測システム(脈拍、心拍、呼吸数など)や、圧計測システム、光計測システムなど様々なものに応用できます。
スイッチサイエンスのページを覗いてもらうと、数多くのセンサ類が安価で販売されているので、ぜひオリジナルの計測システムを作って、身近なデータを役立ててみてください。