Scientific Journey

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

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

Xperia touch のマイクから外部の音を取得

f:id:an-modoki:20190502065416p:plain
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);
}

実行結果


www.instagram.com

最近、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を使ってみるよ!

トグルスイッチでやってみたい事

f:id:an-modoki:20170706155130j:plain
今回はこの生協で買ってきたON-OFF-ONトグルスイッチを使ってみたいと思います。
このトグルスイッチを切り替えて、Arduinoの動作を切り替えようと思います!

実際にやってみた事

トグルスイッチを切り替えると、シリアル通信で表示されるメッセージが切り替えられるよ。
f:id:an-modoki:20170706154956p:plain

配線方法

夏バテで配線図を書く気力がないです。すみません。
f:id:an-modoki:20170706155023j:plainf:id:an-modoki:20170706155029j:plainf:id:an-modoki:20170706155034j:plainf:id:an-modoki:20170706155039j:plain

プログラム

こちらが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】Textコンポーネントにて、文字列と変数の中の文字列を一緒に表示する。

Textコンポーネントの表示について

今まで、変数の中の文字と、Text コンポーネントに直接書き込んだものを
一緒に表示する方法がわかりませんでした。
が解決したので書きます。

用意するもの

  • BodySite.xlsx

内容はこのような感じで書く
f:id:an-modoki:20161027080721p:plain

実装

Text コンポーネントの中身

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

  • 文字列の中身
"Put "u'%s'" on display" % $Body_site

繰り返し条件trialsの中身

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

結果

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

この表示がHand,Forearm....と繰り返します。

【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

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

Worst Pain

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

Time

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

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

flowの設定

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

  • trialsの中身

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

結果

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

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

【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)

※カッコ内は今回設定した名前です。
f:id:an-modoki:20161026091626p:plain

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)

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

  • Text component (Worstpain)

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

実行結果

画面

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

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

Excelファイル

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

rating.responseが0.61になっています。
もし0から100で評価をしたいのであれば、100倍すればOKです。