Scientific Journey

私の冒険記録。たまに回り道。

【PsychoPy】キーボード入力で画面に数字を表示する。

お久しぶりです。ええ、今回は心理学実験Buildingをしようという事で、
PsychoPyをぼちぼちいじっていきます。

内容

今回は実験全部という事ではなく、入力した数字を画面に表示させる処理を
PsychoPyのBuilder機能を使いまして、実装をします。

実行結果を先に見せるとこのような感じになります。
f:id:an-modoki:20160508210931j:plain:w100 f:id:an-modoki:20160508210925j:plain:w100 f:id:an-modoki:20160508210921j:plain:w100

数字の「1」「2」「3」「4」を入れるとその表示が出ます。

実装方法

- routine を作成。

中に以下のコンポ―ネントを次のプロパティ設定で入れます。

- keyboard component 1

start 0.0
stop duration 空欄
Force end of Routine チェック外す。
Allowed keys$ '1','2','3','4','q'

- code component

Begin Experiment

num = 0 

Each Frame

    if '1' in theseKeys:
        num = 1
    elif '2' in theseKeys:
        num= 2
    elif '3' in theseKeys:
        num= 3
    elif '4' in theseKeys:
        num= 4
- keyboard component 2

Allowed keys$ 'return'

- text component

stop 空白
Text $num

いかがでしたか。
次回は3ケタの数字入力とdelete機能を追加してみます。
それでは

【Processing+Arduino】加速度センサを傾けると音が鳴る。

加速度センサを傾けるとProcessing側で音が鳴ります。
傾けると何回も音が鳴っているので、改良しなければなりません....

回路図

Arduino側プログラム

//********************************
//加速度センサの値を取得するプログラム
//********************************
void setup()
{
// シリアルモニターの初期化をする
Serial.begin(9600) ;
}
void loop()
{
int i ;
long x,y,z;
//50回センサ値を読み込んで平均を算出
x=y=z=0;
for (i=0 ; i < 50 ; i++) {
x = x + analogRead(A0) ; // X軸
y = y + analogRead(A1) ; // Y軸
z = z + analogRead(A2) ; // Z軸
}
x = x / 50 ;
y = y / 50 ;
z = z / 50 ;
//int rotateX = (x-194)/0.72 - 90; //角度を求める式
int rotateX = (x-194)/0.72; //角度を求める式
//Serial.print(rotateX) ;
//Serial.print(" ") ;
//int rotateY = (y-338)/0.76 - 90;
//Serial.print(rotateY) ;
//Serial.println() ;
Serial.write('H');             // ヘッダの送信
Serial.write(highByte(rotateX)); // 上位バイトの送信
Serial.write(lowByte(rotateX));  // 下位バイトの送信
delay(50) ;
}


※ProcessingのソースコードのPdeファイルの場所にwavファイルを
格納してください。
・wavファイルはこちら(sound_file)のファイルの中身です!

Processing側プログラム

import ddf.minim.*;
import  processing.serial.*;

Minim minim;
AudioSample roller;
AudioSample foot;

Serial  serial;

void setup() {
  serial = new Serial( this, Serial.list()[0], 9600 );
  minim = new Minim(this);
  roller = minim.loadSample("roller.wav", 2048);
  foot = minim.loadSample("foot.wav", 2048); 
}

void draw() {
}

void serialEvent(Serial port) {  
  if ( port.available() >= 3 ) {  // ヘッダ + 上位バイト + 下位バイト で合計3バイト
    if ( port.read() == 'H' ) {  // ヘッダ文字を見つけたところから読み取る
      int high = port.read();   // 上位バイト読み込み
      int low = port.read();    // 下位バイト読み込み
      int recv_data = high*256 + low;  // 上位・下位を合体させる
      println(recv_data);  // 結果の表示
      if(recv_data> 100){roller.trigger();}
      if(recv_data< 80){foot.trigger();}
    }
  }
}
//void keyPressed() {
//  if (key == 'k') roller.trigger();
//  if (key == 's') foot.trigger();
//}

void stop() {
 roller.close();
 foot.close();
 minim.stop();

 super.stop();
}

【補足】Processingソースコード改良しました。

※傾けると1回WAVファイルが再生されます。
もう一度、水平にして傾けるとまたWAVファイルが再生されます。

import ddf.minim.*;
import  processing.serial.*;

Minim minim;
AudioSample roller;
AudioSample foot;

Serial  serial;

int Flag = 0;
int Flag2 = 0;

void setup() {
  serial = new Serial( this, Serial.list()[0], 9600 );
  minim = new Minim(this);
  roller = minim.loadSample("roller.wav", 2048);
  foot = minim.loadSample("foot.wav", 2048); 
}

void draw() {
}

void serialEvent(Serial port) {  
  if ( port.available() >= 3 ) {  // ヘッダ + 上位バイト + 下位バイト で合計3バイト
    if ( port.read() == 'H' ) {  // ヘッダ文字を見つけたところから読み取る
      int high = port.read();   // 上位バイト読み込み
      int low = port.read();    // 下位バイト読み込み
      int recv_data = high*256 + low;  // 上位・下位を合体させる
      println(recv_data);  // 結果の表示
      if(recv_data> 100){
        if(Flag == 0){Flag = 1;}
        if(Flag == 1){roller.trigger(); Flag = 2;}
      }
      if(recv_data< 80){
        if(Flag == 0){Flag = 1;}
        if(Flag == 1){foot.trigger(); Flag = 2;}
      }
      if(recv_data >= 80 && recv_data <= 100){
        Flag = 0;
      }  
    }
  }
}
//void keyPressed() {
//  if (key == 'k') roller.trigger();
//  if (key == 's') foot.trigger();
//}

void stop() {
 roller.close();
 foot.close();
 minim.stop();

 super.stop();
}

【Processing】音声ファイルを再生する。

下準備

- Processingにminimをインポートします。

ツールバー→スケッチ→ライブラリをインポート→ライブラリを追加
→検索欄に「minim」をいれ検索する。
→Minim|An audio library....... と書いてあるところのライブラリをインストールする。

- WAVファイルを用意します。

 ・sound_file …roller.wavとfoot.wavが入っています。
 Processingソースコード、pdeファイルのところにdataフォルダを作り、
 中にroller.wavとfoot.wavをいれる。

Processingのソースコード

import ddf.minim.*;

Minim minim;
AudioSample roller;
AudioSample foot;

void setup() {
  minim = new Minim(this);
  roller = minim.loadSample("roller.wav", 2048);
  foot = minim.loadSample("foot.wav", 2048);
}

void draw() {
}

void keyPressed() {
  if (key == 'k') roller.trigger();
  if (key == 's') foot.trigger();
}

void stop() {
  roller.close();
  foot.close();
  minim.stop();

  super.stop();
}

【Arduino】加速度センサの値をProcessingに送る(1軸)

用意したもの

Arduino側プログラム

//********************************
//加速度センサの値を取得するプログラム
//********************************
void setup()
{
// シリアルモニターの初期化をする
Serial.begin(9600) ;
}
void loop()
{
int i ;
long x,y,z;
//50回センサ値を読み込んで平均を算出
x=y=z=0;
for (i=0 ; i < 50 ; i++) {
x = x + analogRead(A0) ; // X軸
y = y + analogRead(A1) ; // Y軸
z = z + analogRead(A2) ; // Z軸
}
x = x / 50 ;
y = y / 50 ;
z = z / 50 ;
//int rotateX = (x-194)/0.72 - 90; //角度を求める式
int rotateX = (x-194)/0.72; //角度を求める式
//Serial.print(rotateX) ;
//Serial.print(" ") ;
//int rotateY = (y-338)/0.76 - 90;
//Serial.print(rotateY) ;
//Serial.println() ;
Serial.write('H');             // ヘッダの送信
Serial.write(highByte(rotateX)); // 上位バイトの送信
Serial.write(lowByte(rotateX));  // 下位バイトの送信
delay(50) ;
}

Processing側プログラム

import  processing.serial.*;

Serial  serial;

void setup() {  
  size(400, 250);
  serial = new Serial( this, Serial.list()[0], 9600 );
}

void draw() {
  background(10);
}

void serialEvent(Serial port) {  
  if ( port.available() >= 3 ) {  // ヘッダ + 上位バイト + 下位バイト で合計3バイト
    if ( port.read() == 'H' ) {  // ヘッダ文字を見つけたところから読み取る
      int high = port.read();   // 上位バイト読み込み
      int low = port.read();    // 下位バイト読み込み
      int recv_data = high*256 + low;  // 上位・下位を合体させる
      println(recv_data);  // 結果の表示
    }
  }
}

【勉強会ノート】IDCFクラウドのサーバに温湿度・気圧センサーの値を送ってみた。

本エントリーは忘備録のために書きました。

OS環境はWindows8.1用です。

また、2016年サバフェスハンズで行ったことをまとめました。

 

[目次]

  1. 用意するもの
  2. 下準備(環境設定・サーバー構築)
  3. サーバにセンサ情報をアップロード

 

1. 用意するもの

  • WifiのつながるPC
  • ESP-WR00M-02(wifiモジュール)
  • 温湿度気圧センサー(BME280)
  • USBケーブル (PC-ESP接続)
  • 抵抗(10kΩ)ー茶黒オレンジ
  • ブレッドボード
  • ジャンパーピン

2. 下準備

下準備では以下のことをやります。

  • TeraTermのインストール→ver4.82を使いましたが、最新版でも問題ありません。
  • Arduino IDE(開発環境)のインストール→ver1.67を使用しました。
  • Arduino必要なライブラリのインストール(MQTTクライアント+JSON)
  1. Arduino IDE(開発環境)のインストール
    以下のWebページにインストール手順がわかりやすく書いてあります。

    Arduino IDE開発環境(ESP-WROOM-02開発ボード編) - Qiita

 補足)上記URLに書いてありますが、
 ESP8266ボードをArduinoIDEでマイコンボードとして選択できるようにします。

 2.Arduino必要なライブラリのインストール(MQTTクライアント+JSON)

  • スケッチ→ライブラリをインクルード→ライブラリ管理を選択
  • Filter your searchにで次のキーワードを入れる(ひとつづつね!)
    ・PubSubClient
    ・ArduinoJson
  • 該当するライブラリの枠内をクリックして最新版をインストールする。

 3.仮想サーバの構築
(IDCFクラウドのアカウント取得+仮想マシン起動+IPアドレス設定)

3.サーバにセンサ情報をアップロード

  1. 配線
    以下のように配線を行います。
    今度ちゃんとした回路図書きます(^^;;;)

    f:id:an-modoki:20160319225313j:plain

     

  2. Arduino側プログラム
    sndbme280.inoを使用する。
    Arduino側のプログラムの中で、
    // Wi-Fi APのSSID/Password
    const char *ssid = "xxxxxxxxxx";
    const char *password = "xxxxxxxx";
    // Server環境に関する設定
    const char *server = "xxx.xxx.xxx.xxx";
    がありますが、この部分は以下の条件の場合
  3. 以下のように書き換えてください。
    条件)PCがつないでいるwifi名→pekepeke
       PCがつないでいるwifi(pekepeke)のPassword→12345
       IDCFクラウドIPアドレス→123.123.123.123
    書換え後)
    // Wi-Fi APのSSID/Password
    const char *ssid = "pekepeke";
    const char *password = "12345";
    // Server環境に関する設定
    const char *server = "123.123.123.123";
    書き換えたらプログラムをESP-WPOOM-02に書き込みます。
  4. プログラムをESP-WPOOM-02に書き込み
    ArduinoIDEにおいて設定
    ツールツールの中で以下をESP-WPOOM-02に設定。
    項目初期値変更値
    Flash Mode DIO QIO
    Flash Frequency 40MHz 同左
    Upload Using Serial 同左
    CPU Frequency 80MHz 同左
    Flash Size 512K(64K SPIFFS) 4M(3M SPIFFS)
    Debug port Disabled 同左
    Debug Level None 同左
    Reset Method ck nodemcu
    Upload Speed 9600 115200
    port --- 開発ボードのCOM番号

    ※Upload Speedは、512000でも大丈夫のようだ。

  5. SSHリモートログイン(TeraTarm起動)+NodeRED起動
    TeraTermを起動してSSHリモートログインをします。
     ・[新しい接続]にて
      ・ホスト→IDCFクラウドIPアドレス
      ・サービス→SSHを選択。
     以上を設定してOKを押します。
     ・[SSH認証]にて
      ・ユーザ名(N):→root
           ・パスフレーズ(P):→root
           ・RSA/DSA/EDCSA鍵を使うを選択
       秘密鍵をクリックしてSSH Key:作成して
       ダウンロードしたものを選択(ディレクトリ入力)
    ・以上設定して、ログインできたら
       node-red
    と入力してNode-REDを起動します。

    ◎Node‐RED を起動する。
    ブラウザ(googleChromeIEなど)
     ・http://xxx.xxx.xxx.xxx:1880/
           xxx.xxx.xxx.xxx→IDCFクラウドIPアドレス
  6. NodeRED
    ・NodeREDにて三本線メニューバー→import
    →Clipboadにて
    Node-RED用フロー(flow/node-red-bme280-floe.txt)
    の内容を貼り付けます。
    →OKボタンを押します。

    f:id:an-modoki:20160319221442p:plain


    ・NodeREDにてDeplayボタンを押します。

     

  7. 実行結果
    debubタブに情報が提示されればOKです。

 

触覚(tactile)の錯覚を探している。

世の中には、「世界錯覚コンテスト」なるものが存在するらしい。

それで、世界錯覚コンテストの審査員をされていた先生が、

ワークショップ開いて案を出し合おうぜみたいになった。

 

今回はワークショップに臨む前に、ひとつ予習をかねて

触覚の錯覚(※触覚はここでは頭に生えているほうではなくて触るほう)

について思い当たるものをまとめてみた。

 

触覚の錯覚

ラバーハンドイリュージョン

これはかなり、有名なのではないでしょうか。
以下、概要。

ラバーハンドイリュージョン 1998 Botvinick & Cohen

  • 被験者は椅子に座り、片腕を机の上におく。被験者自身の腕が被験者から見えないように衝立で隠し、被験者の前にゴム製の手のおもちゃを本物の腕と並行に置く。そして、実験者が本物の手と偽物の手を同期して筆で触る。たったこれだけの作業で、被験者は偽物の手がまるであたかも本人自身の手のように感じるようになってしまった。

 ベルベットハンドイリュージョン

テニスやバドミントンのラケットを手にしたときに気づいた人がいるかもしれない。

ベルベットハンドイリュージョンは、金網または硬い網を両方の手のひらではさみ、両手ごと動かすと、表現しようのないやわらかい感覚を得られる。

f:id:an-modoki:20160307162801p:plain

画像は(http://www.psych.or.jp/meeting/proceedings/75/contens/poster/pdf/2AM085.pdf)から引用しました。

Fishbone tactile illusion

f:id:an-modoki:20160307163247p:plain

これは、背景に比べて出っ張っている魚の骨があります。

魚の骨の中心を指でなぞるとへこんでいるように感じられる錯覚です。

本当は背景よりも魚の骨のほうが出っ張っているのに不思議ですね。

くしの錯覚

f:id:an-modoki:20160307210036j:plain

旅行や出張で泊まったホテル、旅館においてあるくしを図のように触ってみるとくしの先端が
実際は横に触れているのに縦に動いているように感じられます。

視覚効果と触覚

どんな学術的名前がついているのかはわからないが、
最近はこのようなものにも触覚の錯覚が取り入られている。

安室奈美恵のGolden TouchのMV

安室奈美恵 / 「Golden Touch」 (from New Album「_genic」) - YouTube

動画に指を置いているとなんだか自分は画面越しにいろんなものを触っているような

感覚になってしまう。

動きがあって面白い。

 

「指を置く」

以前に多感覚シンポだっけ(?)にいって話を聞いてきた。

人は触覚、経験の蓄積によってどのようなもののさわり心地かをある程度感じているらしい。

この「指を置く」は一枚の絵の上に自分の人差し指や手を置いてみる。

すると、あたかも自分の指が絵の中に書いてある絵に作用しているようなそんな

感覚が得られる。

触っているような感じもきそうな感じだ。

www.amazon.co.jp

音と触覚

手のすりすり

f:id:an-modoki:20160307211249j:plain

マイクの前で手をこすりつけて、ヘッドホンで、

手のすりすりの音を手と手が擦れた音ではなく、

金属と金属が擦れた音のような音を聞くと

手と手が違う素材になっているような感じがする。

触れ方と触覚

2本の指で触れると.........?

これにも錯覚の名前がついていないorしらない。

まず、人差し指、中指、薬指があって、人差し指、薬指の2本で

冷たい場所を触って、中指は温度の違うところにおいてみる。

すると、その真ん中の中指がなぜか人差し指、薬指と同じように
冷たいように感じられる。

 

この本でもかなり錯覚のことについても触れているので、ぜひ読んでみてください。

www.amazon.co.jp

 

最近はまっているアドラー心理学について

外も寒くて、家の暖かいコタツが自分の心の癒しどころだった2月。

ある日、本屋を散策していると、「アドラー心理学」に出会った。

 

読むといいと、お勧めされた啓発本がなかったので、

本屋にせっかくきたのでアドラー心理学に関する本を購入した。

 

今回は購入した
「アルフレッド・アドラー-人生に革命が起きる100の言葉」(小倉広 著)
から印象に残った部分をピックアップしてみようと思う。

 

感情には隠された目的がある。

時々、私の理性がぶっ飛んで、こんな行動を起こしてしまった。

感情のままに怒ってしまった。不安だバイトに行きたくない。

 

などの感情と理性の葛藤が起こるが、アドラーはすべてにおいて、

目的が存在しているからこそ感情が沸き起こるのだそうだ。

また、感情も理性はぐるで、すべては同じ目的に帰結するために

沸き起こるものだそうだ。

性格は今この瞬間に変えられる。

死ぬ2日前まで、変えられるらしい。

変えるには感情の表面的なことではなくて、どうして自分が

そういう性格をしているのかという根本的な考えかたを変えればよいそうだ。

ex)おとなしい性格→人に嫌われるから人に話しかけずにいる→人に嫌われないよ

幸せになる唯一の方法は他者への貢献

これはボランティアにも通じるようなやつだなと私は思う。

自分の生きる意味を模索したら、人に会って、人のために行動すれば、

なんか幸せな心になるかもしれない。

 

というわけで以下の本から、抜粋してみました。

www.amazon.co.jp

 

また、本屋にいったら「嫌われる勇気」を読んでみたいなと思います。

www.amazon.co.jp