【PsychoPy】キーボード入力で画面に数字を表示する。
お久しぶりです。ええ、今回は心理学実験Buildingをしようという事で、
PsychoPyをぼちぼちいじっていきます。
内容
今回は実験全部という事ではなく、入力した数字を画面に表示させる処理を
PsychoPyのBuilder機能を使いまして、実装をします。
実行結果を先に見せるとこのような感じになります。
数字の「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軸)
用意したもの
- 加速度センサ(ADXL335)
- Arduino Uno
- ブレッドボード
- ジャンパーピン(オス‐オス)
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. 用意するもの
- WifiのつながるPC
- ESP-WR00M-02(wifiモジュール)
- 温湿度気圧センサー(BME280)
- USBケーブル (PC-ESP接続)
- 抵抗(10kΩ)ー茶黒オレンジ
- ブレッドボード
- ジャンパーピン
2. 下準備
下準備では以下のことをやります。
- TeraTermのインストール→ver4.82を使いましたが、最新版でも問題ありません。
補足)上記URLに書いてありますが、
ESP8266ボードをArduinoIDEでマイコンボードとして選択できるようにします。
- Arduino IDE起動→ツールバー→ファイル→環境設定
- 環境設定からsettingsタブを開く
- Additional Board Maneger URLsに以下を入力
http://arduino.esp8266.com/stable/package_esp8266com_index.json - 次にツールバー→マイコンボード→ボードマネージャーでesp8266 by ESP8266 Communityを検索しver2.1.0を選択
2.Arduino必要なライブラリのインストール(MQTTクライアント+JSON)
- スケッチ→ライブラリをインクルード→ライブラリ管理を選択
- Filter your searchにで次のキーワードを入れる(ひとつづつね!)
・PubSubClient
・ArduinoJson - 該当するライブラリの枠内をクリックして最新版をインストールする。
3.仮想サーバの構築
(IDCFクラウドのアカウント取得+仮想マシン起動+IPアドレス設定)
- IDCFクラウドのアカウント取得
以下のURLに手順が書いてあります。※登録時にクレジットカード必要
- 仮想マシン起動+IPアドレス設定
以下のURLに手順が書いてあります。
IDCFクラウドでコミュニティテンプレートから仮想マシンを作成しよう - Qiita
この過程で生成する。
・IDCFクラウドのIPアドレス
・SSH Key:作成し、ダウンロードする
を取っておきます。
3.サーバにセンサ情報をアップロード
- 前回の続きから
・IDCFクラウドのIPアドレス
・SSH Key:作成してダウンロードしたもの
以上を用意しておきます。 - 以下のハンズオン用ダウンロードURLからDownLoadZipにて
ダウンロード解答します。
GitHub - arigadget/esp-handson: Hands on contents for Server Festa 2016
以下のプログラムを使います。
・sndbme280.ino
・Node-RED用フロー(flow/node-red-bme280-floe.txt)
- 配線
以下のように配線を行います。
今度ちゃんとした回路図書きます(^^;;;)
- 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";
がありますが、この部分は以下の条件の場合 - 以下のように書き換えてください。
条件)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に書き込みます。 - プログラムを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でも大丈夫のようだ。
- 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 を起動する。
ブラウザ(googleChrome、IEなど)
・http://xxx.xxx.xxx.xxx:1880/
xxx.xxx.xxx.xxx→IDCFクラウドのIPアドレス - NodeRED
・NodeREDにて三本線メニューバー→import
→Clipboadにて
「Node-RED用フロー(flow/node-red-bme280-floe.txt)」
の内容を貼り付けます。
→OKボタンを押します。
・NodeREDにてDeplayボタンを押します。
- 実行結果
debubタブに情報が提示されればOKです。
触覚(tactile)の錯覚を探している。
世の中には、「世界錯覚コンテスト」なるものが存在するらしい。
それで、世界錯覚コンテストの審査員をされていた先生が、
ワークショップ開いて案を出し合おうぜみたいになった。
今回はワークショップに臨む前に、ひとつ予習をかねて
触覚の錯覚(※触覚はここでは頭に生えているほうではなくて触るほう)
について思い当たるものをまとめてみた。
触覚の錯覚
ラバーハンドイリュージョン
これはかなり、有名なのではないでしょうか。
以下、概要。
ラバーハンドイリュージョン 1998 Botvinick & Cohen
- 被験者は椅子に座り、片腕を机の上におく。被験者自身の腕が被験者から見えないように衝立で隠し、被験者の前にゴム製の手のおもちゃを本物の腕と並行に置く。そして、実験者が本物の手と偽物の手を同期して筆で触る。たったこれだけの作業で、被験者は偽物の手がまるであたかも本人自身の手のように感じるようになってしまった。
ベルベットハンドイリュージョン
テニスやバドミントンのラケットを手にしたときに気づいた人がいるかもしれない。
ベルベットハンドイリュージョンは、金網または硬い網を両方の手のひらではさみ、両手ごと動かすと、表現しようのないやわらかい感覚を得られる。
画像は(http://www.psych.or.jp/meeting/proceedings/75/contens/poster/pdf/2AM085.pdf)から引用しました。
Fishbone tactile illusion
これは、背景に比べて出っ張っている魚の骨があります。
魚の骨の中心を指でなぞるとへこんでいるように感じられる錯覚です。
本当は背景よりも魚の骨のほうが出っ張っているのに不思議ですね。
くしの錯覚
旅行や出張で泊まったホテル、旅館においてあるくしを図のように触ってみるとくしの先端が
実際は横に触れているのに縦に動いているように感じられます。
視覚効果と触覚
どんな学術的名前がついているのかはわからないが、
最近はこのようなものにも触覚の錯覚が取り入られている。
安室奈美恵のGolden TouchのMV
安室奈美恵 / 「Golden Touch」 (from New Album「_genic」) - YouTube
動画に指を置いているとなんだか自分は画面越しにいろんなものを触っているような
感覚になってしまう。
動きがあって面白い。
「指を置く」
以前に多感覚シンポだっけ(?)にいって話を聞いてきた。
人は触覚、経験の蓄積によってどのようなもののさわり心地かをある程度感じているらしい。
この「指を置く」は一枚の絵の上に自分の人差し指や手を置いてみる。
すると、あたかも自分の指が絵の中に書いてある絵に作用しているようなそんな
感覚が得られる。
触っているような感じもきそうな感じだ。
音と触覚
手のすりすり
マイクの前で手をこすりつけて、ヘッドホンで、
手のすりすりの音を手と手が擦れた音ではなく、
金属と金属が擦れた音のような音を聞くと
手と手が違う素材になっているような感じがする。
触れ方と触覚
2本の指で触れると.........?
これにも錯覚の名前がついていないorしらない。
まず、人差し指、中指、薬指があって、人差し指、薬指の2本で
冷たい場所を触って、中指は温度の違うところにおいてみる。
すると、その真ん中の中指がなぜか人差し指、薬指と同じように
冷たいように感じられる。
この本でもかなり錯覚のことについても触れているので、ぜひ読んでみてください。
最近はまっているアドラー心理学について
外も寒くて、家の暖かいコタツが自分の心の癒しどころだった2月。
ある日、本屋を散策していると、「アドラー心理学」に出会った。
読むといいと、お勧めされた啓発本がなかったので、
本屋にせっかくきたのでアドラー心理学に関する本を購入した。
今回は購入した
「アルフレッド・アドラー-人生に革命が起きる100の言葉」(小倉広 著)
から印象に残った部分をピックアップしてみようと思う。
感情には隠された目的がある。
時々、私の理性がぶっ飛んで、こんな行動を起こしてしまった。
感情のままに怒ってしまった。不安だバイトに行きたくない。
などの感情と理性の葛藤が起こるが、アドラーはすべてにおいて、
目的が存在しているからこそ感情が沸き起こるのだそうだ。
また、感情も理性はぐるで、すべては同じ目的に帰結するために
沸き起こるものだそうだ。
性格は今この瞬間に変えられる。
死ぬ2日前まで、変えられるらしい。
変えるには感情の表面的なことではなくて、どうして自分が
そういう性格をしているのかという根本的な考えかたを変えればよいそうだ。
ex)おとなしい性格→人に嫌われるから人に話しかけずにいる→人に嫌われないよ
幸せになる唯一の方法は他者への貢献
これはボランティアにも通じるようなやつだなと私は思う。
自分の生きる意味を模索したら、人に会って、人のために行動すれば、
なんか幸せな心になるかもしれない。
というわけで以下の本から、抜粋してみました。
また、本屋にいったら「嫌われる勇気」を読んでみたいなと思います。