9.音を検知する

クムクムプログラミング

プログラムで音を検知するには、マイクに対して発した音を検出することで「音が鳴った」ことを知ることができます。
クムクムでは胴体の右側(向かって左側)にある黒い部分がマイクです。

マイクで音を検知するための情報

VS CodeでPythonプログラムのプロジェクトやソースファイルを作成する方法については「5. VS CodeによるPythonプログラムの開発」を確認してください。

Pythonプログラムから直接QumcCommLib.dllを呼び出す場合は、「3.Qumcum PythonライブラリでコントロールできるAPI仕様(QumCommLib.dll呼出し)」にあるマイクの計測値を取得する”qumcomm_get_mic_value()”を確認してください。

Pythonプログラムからqumcum.pyを経由して呼び出す場合は、「2.Qumcum PythonライブラリでコントロールできるAPI仕様」にあるマイクの計測値を取得する”qumcum.get_mic_value()”を確認してください。

クムクムと接続する方法についての説明は、「4.クムクムとの接続~LEDの点灯」を参考にしてください。

Pythonプログラムから直接QumcCommLib.dllを呼び出す

コード全体はこのようになります。

※ここで、QumcCommLib.dllはこれから作成し、実行するPythonプログラムのコードと同じフォルダに置いていることを前提としています。

import os
import time
from ctypes import *

# DLLのフォルダにカレントディレクトリを追加します
os.add_dll_directory(os.getcwd())

# DLLをロードします
dll = cdll.QumCommLib

# COMポートの番号文字列を生成
port = c_char_p('COM5'.encode('utf-8'))

# Qumcumと接続
h = dll.qumcomm_connect(port, 115200)

mic_val = c_int()

for num in range(100):
dll.qumcomm_get_mic_value(h, byref(mic_val))
print(mic_val.value)
time.sleep(0.1)

# Qumcumから切断
dll.qumcomm_end(h)

19行目から22行目までが超音波センサから計測した値を取得する処理で下記の部分になります。

for num in range(100):
dll.qumcomm_get_mic_value(h, byref(mic_val))
print(mic_val.value)
time.sleep(0.1)

 

こちらはループを用いて100回計測を行っています。
ループの中でqumcomm_get_senser_value()を呼出し、mic_valに計測結果を取得してprint(mic_val.value)で取得した値を表示しています。
time.sleep(0.1)で0.1秒(100msec)ほど間隔を置いています。あまり頻繁に通信を行うとPCに負荷がかかるので負荷がかからないように100msecの間隔をとっています。

Pythonプログラムからqumcum.pyを経由して呼び出す

コード全体はこのようになります。

※ここで、QumcCommLib.dll、qumcum.pyはこれから作成し、実行するPythonプログラムのコードと同じフォルダに置いていることを前提としています。

import qumcum
import time

# Qumcumと接続
qumcum.connect("COM5")

mic_val = [0]

for num in range(100):
# Get Mic Value
qumcum.get_mic_value(mic_val)
print(mic_val[0])
qumcum.wait(0.1)

# Qumcumから切断
qumcum.end()

9行目から13行目までが超音波センサから計測した値を取得する処理で下記の部分になります。

for num in range(100):
# Get Senser
qumcum.get_sensor_value(mic_val)
print(mic_val[0])
qumcum.wait(0.1)

こちらはループを用いて100回計測を行っています。
mic_valは配列としています。pythonで関数から引数経由で値を取得するには配列などを用います。
ループの中でqumcum.get_sensor_value()を呼出し、mic_valに計測結果を取得してprint(mic_val[0])で取得した値を表示しています。
qumcum.wait(0.1)で0.1秒(100msec)ほど間隔を置いています。あまり頻繁に通信を行うとPCに負荷がかかるので負荷がかからないように100msecの間隔をとっています。