【Processing】Android プログラミング Xperia Touchのマイクから値を取得する
Xperia touch のマイクから外部の音を取得

Xperia touch 外観 マイクは上部、ボタンのならびにある。
かなりエラーに引っかかったので、今回は忘備録のような感じです。
Processing 側コードを書く
// WARNING! Be sure that your Sketch have active this permissions:
// RECORD_AUDIO
// WRITE_EXTERNAL_STORAGE
import android.app.Activity;
import android.os.Bundle;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
short[] buffer = null;
AudioRecord audioRecord = null;
int SAMPLING_RATE = 11025;
float volume = 0;
int bufSize;
void setup() {
// calculate buffer size
bufSize = AudioRecord.getMinBufferSize(
SAMPLING_RATE,
AudioFormat.CHANNEL_IN_STEREO, //CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT) * 2;
// AudioRecord settings
audioRecord = new AudioRecord(
MediaRecorder.AudioSource.MIC,
SAMPLING_RATE,
AudioFormat.CHANNEL_IN_STEREO,
AudioFormat.ENCODING_PCM_16BIT,
bufSize);
audioRecord.startRecording();
buffer = new short[bufSize];
}
void draw() {
background(200);
int bufferReadResult = audioRecord.read(buffer, 0, bufSize);
// for trouble shooting when android device doesn't work. Check error code following link
// https://developer.android.com/reference/android/media/AudioFormat
// println( bufferReadResult);
volume = 100;
for (int i = 0; i < bufferReadResult; i++) {
volume = Math.max(Math.abs(buffer[i]), volume);
}
text("" + volume, 100, 100);
//draw a box if you blow the mic
if(volume>300)rect(10,10,20,20);
//println(volume); // for output on the console
}
void stop() {
audioRecord.stop();
audioRecord.release();
audioRecord = null;
}
AndroidManifest.xmlのセッティングをする
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="">
<uses-sdk android:minSdkVersion="17" android:targetSdkVersion="26"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application android:icon="@drawable/icon" android:label="">
<activity android:name=".MainActivity" android:theme="@style/Theme.AppCompat.Light.NoActionBar.FullScreen">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
Xperia touch 側のセッティングをする
マニフェストに書いた許可が新しいAndroidのバージョンだとうまく権限が変更されないそうなので、こちら側も変更しておきます。
アプリケーションの権限を許可する。
一回、processingで書き込みをすると設定のAppsの中に保存したPeocessingのコード名のアプリケーションとして、
入っているので、そこをタップ
Apps ← [アプリケーションの名前] ← permissions <- Microphone とStrage を許可に変更
マイクのセッティング
設定 ← Accessory settings ← Mic sensitivity <- Highに変更
これで、もう一度processing側を書き込むと私の場合はうまくいきました。
使用環境
- Processing 3.3.5
- Android OS ver 7.1.1
Arduino ADXL345 が動いた!!
今回使用するのはADXL345加速度センサです!
日本で秋月にて購入をしましたADXL345を使ってI2Cで加速度を図ってみたいと思います。
配線
配線ですが、秋月で購入の場合は主にADXL345の4個所に配線すればいい感じでした。
しかも、内部抵抗が10KΩはいっているので特にプルアップの回路にしなくても大丈夫です。
まずVSSとVDDをつなげる
| ADXL 345 | Arduino Uno |
|---|---|
| GND | GND |
| VDD | 3.3V |
| SCL | A5 |
| SDA | A4 |
このような感じになります。
コード
こちらのサイトよりADXL345を同じく動かしている方から拝借させていただきました。
いろいろ試してみましたが、このサイトのコードのみが動いてくれました。
#include <Wire.h>
// デバイスアドレス(スレーブ)
uint8_t DEVICE_ADDRESS = 0x1D;
// XYZレジスタ用のテーブル(6byte)
uint8_t RegTbl[6];
void setup() {
Serial.begin(9600);
// マスタとしてI2Cバスに接続する
Wire.begin();
// DATA_FORMAT(データ形式の制御)
Wire.beginTransmission(DEVICE_ADDRESS);
// DATA_FORMATのアドレス
Wire.write(0x31);
// 「最大分解能モード」 及び 「±16g」 (0x0B == 1011)
Wire.write(0x0B);
// 「10bit固定分解能モード」 及び 「±16g」にする場合 (0x03 == 0011)
// Wire.write(0x03);
Wire.endTransmission();
// POWER_TCL(節電機能の制御)
Wire.beginTransmission(DEVICE_ADDRESS);
// POWER_CTLのアドレス
Wire.write(0x2d);
// 測定モードにする
Wire.write(0x08);
Wire.endTransmission();
}
void loop() {
// XYZの先頭アドレスに移動する
Wire.beginTransmission(DEVICE_ADDRESS);
Wire.write(0x32);
Wire.endTransmission();
// デバイスへ6byteのレジスタデータを要求する
Wire.requestFrom(DEVICE_ADDRESS, 6);
// 6byteのデータを取得する
int i;
for (i=0; i< 6; i++){
while (Wire.available() == 0 ){}
RegTbl[i] = Wire.read();
}
// データを各XYZの値に変換する(LSB単位)
int16_t x = (((int16_t)RegTbl[1]) << 8) | RegTbl[0];
int16_t y = (((int16_t)RegTbl[3]) << 8) | RegTbl[2];
int16_t z = (((int16_t)RegTbl[5]) << 8) | RegTbl[4];
// 各XYZ軸の加速度(m/s^2)を出力する
Serial.print("X : ");
Serial.print( x * 0.0392266 );
Serial.print(" Y : ");
Serial.print( y * 0.0392266 );
Serial.print(" Z : ");
Serial.print( z * 0.0392266 );
Serial.println(" m/s^2");
delay(100);
}
実行結果
最近、paper workがおおすぎて、半田づけの腕が落ちたかもしれない。
もともとそんなに上手じゃないのでかなりぐちゃぐちゃですね。
近日、周波数特性を自動で計測できるMatlabコードを作るかもしれません。
参考サイト
参考サイトの皆様、ありがとうございます。
www.petitmonte.com
忘備録:論文の図を作成する際の注意
指導教官によるガイドライン
以下、図を作成する際にはIllustrator にて、気をつけるべきことをまとめてみた。
- 画像サイズ
- width = 83mm(single column)
- width = 170mm(double column)
- Font Size > 7pt
- text Myriad Pro
- Line width > 0.75
- Reduce number of color
図作成したら、指導教官に送って、意見をもらうのが一番早い方法
ON-OFF-ON トグルスイッチとArduinoを使ってみるよ!
トグルスイッチでやってみたい事

今回はこの生協で買ってきたON-OFF-ONトグルスイッチを使ってみたいと思います。
このトグルスイッチを切り替えて、Arduinoの動作を切り替えようと思います!
実際にやってみた事
トグルスイッチを切り替えると、シリアル通信で表示されるメッセージが切り替えられるよ。

配線方法
夏バテで配線図を書く気力がないです。すみません。




プログラム
//ON-OFF-ONのトグルスイッチの切り替えによって動作を変える
int val,val2 = 0; // トグル:読み取った値を格納する変数
int n, n2, n3 = 0; // トグル:読み取った特定値の回数をカウント
int Flag = 0; // トグル:どの切り替えがされているかが格納
void setup() {
Serial.begin(9600); // シリアル通信の初期化
}
void loop() {
val = analogRead(3); // アナログピンを読み取る
val2 = analogRead(5); // アナログピンを読み取る
if(val == 673 || val == 674){
n ++;
if(n >= 5){
n = 0;
n2 = 0;
n3 = 0;
Flag = 1;
}
}
if(val2 == 673 || val2 == 674){
n2++;
if(n2 >= 5){
n = 0;
n2 = 0;
n3 = 0;
Flag = 2;
}
}
if(val != 673 && val2 != 673){
n3++;
if(n3 >= 10){
n = 0;
n2 = 0;
n3 = 0;
Flag = 0;
}
}
//トグルOFF
if(Flag == 0){
Serial.println("OFF");
}
//トグルA3 ON
if(Flag == 1){
Serial.println("A3 ON");
}
//トグルA5 ON
if(Flag == 2){
Serial.println("A5 ON");
}
}
【PsychoPy】制限時間内にMagnitude Estimationさせる。
制限時間付きのMagnitude Estimation法の実装
前回に引続き、Magnitude Estimation法 第二弾。
今度は60秒間の5秒毎にどれくらい痛いかの反応を取ります。
実装
コンポーネントの配置

各コンポーネントの設定について
rating
カスタム
marker=u'triangle', size=1.5, pos=[0.0, -0.4], low=0, high=1, precision=100, showValue=False, markerExpansion=0, scale=u'', singleClick=True, showAccept=False, textColor='Gray', markerColor='Black'
No Pain

Worst Pain

Time

- 文字列の部分
u'%d' % $(6-trialClock.getTime())
flowの設定

- trialsの中身

結果


【PsychoPy2】Magnitude Estimation法をAnalog Scaleで反応をとる。
今回はBuilder ModeのみでPsychoPyでMagnitude Estimation法を実装します。
今回使用したのは、PsychoPy2のv1.84.0です。
Magnitude Estimation方の評価の仕方は、Analog Scaleでの軸を表示して、
実験参加者の感じた量の大きさを推定して、評価してもらいます。
以下にMagnitudeEstimation法の解説があるので、参考にどうぞ。
http://www.sd.seikei.ac.jp/blog/wp-content/uploads/2012/03/5df02368bb90b47ac174222c938f0a91.pdf
では、早速実装します。
今回は0をNo Pain、1をWorst Painとします。
実装(Builder Mode)
1. コンポーネント設定
以下のコンポーネントをルーチンの中に配置します。
上から順に
- Rating Scale (rating)
- Text component (NOpain)
- Text component (Worstpain)
※カッコ内は今回設定した名前です。

2. コンポーネントの中身の設定
次に各々のコンポーネントの設定。
- Rating Scale (rating)
プロパティ>カスタムに以下を記述します。
marker=u'triangle',size=1.5, pos=[0.0, -0.4], low=0, high=1, precision=100, showValue=False, markerExpansion=0, scale=u'', singleClick=True, showAccept=False, textColor='Gray', markerColor='Black'
- Text component (NOpain)

- Text component (Worstpain)








