การประเมินฮาร์ดแวร์ใช้ซอฟต์แวร์ต่อไปนี้
- Audacity (ติดตั้งใน PC)
- MATLAB (ติดตั้งใน PC)
- แอปทดสอบการสัมผัส (ติดตั้งใน DUT)
ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อกำหนดของระบบได้ที่ Audacity สำหรับ Windows, Audacity สำหรับ Mac และ MATLAB
ตั้งค่า Audacity
ต้องตั้งค่า Audacity เพื่อรับอินพุตจากการ์ดเสียง Sound Blaster ที่อัตราการสุ่มตัวอย่างข้อมูลที่แน่นอน หลังจากเชื่อมต่อ Sound Blaster กับพอร์ต USB ของคอมพิวเตอร์แล้ว ให้เปิด Audacity แล้วทำตามวิธีการต่อไปนี้
เลือกสาย (USB Sound Blaster HD) เป็นแหล่งที่มาของไมโครโฟนอินพุตโดยเชื่อมต่อเอาต์พุต CCLD เข้ากับพอร์ตอินพุต Line In ของ Sound Blaster
รูปที่ 1 การเลือกอินพุตไมโครโฟน
ตั้งค่าอัตราการสุ่มตัวอย่างเป็น 48 kHz โดยเลือก 48000 ในเมนูอัตราโปรเจ็กต์
รูปที่ 2 การตั้งค่าอัตราการสุ่มตัวอย่าง
ดาวน์โหลด MATLAB
ดาวน์โหลดไฟล์ MATLAB
แตกไฟล์และหา
Effect1NEffect2_V1p0_2020PM.m
(สำหรับเอฟเฟกต์ 1 และเอฟเฟกต์ 2) และEffect3_V1p0_2020PM.m
(สำหรับเอฟเฟกต์ 3)
ตั้งค่าแอปทดสอบในโทรศัพท์
ส่วนนี้จะอธิบายวิธีตั้งค่าแอปทดสอบในโทรศัพท์
เตรียมพร้อมสําหรับแอปทดสอบ
- คัดลอกซอร์สโค้ดจากบล็อกโค้ด Java และ Kotlin ด้านล่าง โปรดเลือกวิธีที่เหมาะกับคุณที่สุด
- เขียนโค้ดของคุณเองตามพารามิเตอร์ GUI ที่แสดงในรูปที่ 3 ปรับรายละเอียดของซอร์สโค้ดของเลย์เอาต์ให้ตรงกับโทรศัพท์ของคุณหากจำเป็น
ตรวจสอบว่า GUI มีปุ่มที่คลิกได้ 3 ปุ่มและตัวบ่งชี้ภาพเพื่อกำหนดพื้นที่ที่จะหาตัวตรวจวัดความเร่ง
- พื้นที่ที่ใช้ตัวตรวจวัดความเร่งจะแสดงพื้นที่จริงของหน้าจออุปกรณ์ที่นิยมใช้มือแตะ
- ในระหว่างการวัดนี้ คุณสามารถเลื่อนตัวตรวจวัดความเร่งภายในพื้นที่สีฟ้าครามเพื่อหาพื้นที่ของหน้าจอที่บันทึกสัญญาณแรงที่สุด
ติดตั้งรหัสในอุปกรณ์ Android
ขอแนะนำให้ตั้งค่าโหมดการไปยังส่วนต่างๆ ของระบบเป็นโหมดท่าทางสัมผัส หากตั้งค่าโหมดเริ่มต้นเป็นปุ่ม
- การตั้งค่าโหมดท่าทางสัมผัสช่วยให้คุณวางมาตรวัดความเร่งที่ด้านล่างของโทรศัพท์ได้มากที่สุดโดยไม่รบกวน GUI การนำทางระบบของโทรศัพท์
ซอร์สโค้ด Java
package com.example.hapticeffectassessment;
import static android.os.VibrationEffect.EFFECT_CLICK;
import android.graphics.Color;
import android.os.Bundle;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private static final long oneShotTiming = 20;
private static final int oneShotAmplitude = 255;
private static final long[] waveformTimings = {500, 500};
private static final int[] waveformAmplitudes = {128, 255};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Vibrator vibrator = getSystemService(Vibrator.class);
// Click R.id.button1 button to generate Effect 1
findViewById(R.id.button1).setOnClickListener(
view -> vibrator.vibrate(VibrationEffect.createPredefined(EFFECT_CLICK)));
// Click R.id.button2 button to generate Effect 2
findViewById(R.id.button2).setOnClickListener(
view -> vibrator.vibrate(VibrationEffect.createOneShot(oneShotTiming, oneShotAmplitude)));
// Click R.id.button3 button to generate Effect 3
findViewById(R.id.button3).setOnClickListener(view -> {
vibrator.vibrate(VibrationEffect.createWaveform(waveformTimings, waveformAmplitudes, -1));
// See quick results of Effect 3
Button button = (Button) view;
if (vibrator.hasAmplitudeControl()) {
button.setText("Effect 3: PASS");
button.setBackgroundColor(Color.GREEN);
button.setTextColor(Color.BLACK);
} else {
button.setText("Effect 3: FAIL");
button.setBackgroundColor(Color.RED);
button.setTextColor(Color.WHITE);
}
});
}
}
ซอร์สโค้ด Kotlin
package com.example.hapticeffectassessment
import android.graphics.Color
import android.os.Bundle
import android.os.VibrationEffect
import android.os.VibrationEffect.EFFECT_CLICK
import android.os.Vibrator
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
class MainActivityKt : AppCompatActivity() {
private val oneShotTiming: Long = 20
private val oneShotAmplitude = 255
private val waveformTimings = longArrayOf(500, 500)
private val waveformAmplitudes = intArrayOf(128, 255)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val vibrator = getSystemService(Vibrator::class.java)
// Click button1 to generate Effect 1
button1.setOnClickListener {
vibrator.vibrate(VibrationEffect.createPredefined(EFFECT_CLICK))
}
// Click button2 to generate Effect 2
button2.setOnClickListener {
vibrator.vibrate(VibrationEffect.createOneShot(oneShotTiming, oneShotAmplitude))
}
// Click button3 to generate Effect 3
button3.setOnClickListener {
vibrator.vibrate(
VibrationEffect.createWaveform(waveformTimings, waveformAmplitudes, -1))
// See quick results of Effect 3
if (vibrator.hasAmplitudeControl()) {
button3.text = "Effect 3: PASS"
button3.setBackgroundColor(Color.GREEN)
button3.setTextColor(Color.BLACK)
} else {
button3.text = "Effect 3: FAIL"
button3.setBackgroundColor(Color.RED)
button3.setTextColor(Color.WHITE)
}
}
}
}
ซอร์สโค้ดของเลย์เอาต์ (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button1"
android:layout_width="350dp"
android:layout_height="60dp"
android:layout_marginStart="32dp"
android:layout_marginTop="5dp"
android:layout_marginEnd="32dp"
android:text="Effect 1"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button2"
android:layout_width="350dp"
android:layout_height="60dp"
android:layout_marginStart="32dp"
android:layout_marginTop="5dp"
android:layout_marginEnd="32dp"
android:text="Effect 2"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button1" />
<Button
android:id="@+id/button3"
android:layout_width="350dp"
android:layout_height="60dp"
android:layout_marginStart="32dp"
android:layout_marginTop="5dp"
android:layout_marginEnd="32dp"
android:text="Effect 3"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button2" />
<View
android:id="@+id/divider"
android:layout_width="363dp"
android:layout_height="1dp"
android:layout_marginStart="32dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="32dp"
android:background="?android:attr/listDivider"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button3" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="363dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/divider">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitXY"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/bluebar" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
รูปที่ 3 ติดเครื่องตรวจวัดความเร่งตามบริเวณที่แนะนำใน GUI