UMEHOSHI ITA TOP PAGE    COMPUTER SHIEN LAB

[UMEHOSHI ITA]の制御で使っているIC「PIC32MX270F256B-I/SO」のフラッシュメモリには、テスト用プログラムが書き込まれいています。
これを利用したユーザー用のプログラムを「ウメ・エディットプログラム」と呼ぶことにします。
「ウメ・エディットプログラム」の開発では「umehoshiEditツール」が必要で、 その取得や最初の操作情報は、こちらを参照してください。

PC側のpythonで制御する。(録音を動作を行わせる例)

以下では、PCと[UMEHOSHI ITA]をUSBで接続して、 PC側のpythonプログラムで[UMEHOSHI ITA]動かします。
その通信例として、コンソールで入力した文字列を送信し、 その応答を受信したPCで文字列を表示する例を示しています。

次に「umehoshiEditツール」のビルドで得られる「ウメ・エディットプログラム」のHEXファイルを追加・編集して、 [UMEHOSHI ITA]に転送・実行を指示するファイルを作ります。
そして、そのファイルを転送するPythonプログラム例を示しています。

次に、「ウメ・エディットプログラム」を[UMEHOSHI ITA]に転送するPythonプログラムを変更して、 録音で得られた情報を再生、ファイル化、グラフ化する例を示しています。

最後に [UMEHOSHI ITA]の既存のADCの割り込み処理とTimer3の割り込みを、自前の関数に置き換えた 「ウメ・エディットプログラム」を Pythonの[UMEHOSHI ITA]転送プログラムで動作する例を示しています。

PCのコンソールでキー入力を[UMEHOSHI ITA]に送信して制御する。

PCのコンソールでキー入力した文字列を、接続している[UMEHOSHI ITA]へ送信し、 その応答文字列をコンソールに表示するPythonのプログラム例を示します。 「port = 'COM3'」の設定値は、接続したUSBのデバイス識別名に合わせて変更してください。

import threading # key_send_to_ume.py
from time import sleep
import serial # 参考: https://pyserial.readthedocs.io/en/latest/pyserial_api.html

usb= serial.Serial(port = 'COM3', baudrate = 115200,timeout = 10)
loop_flag=True

def read_loop():
    global loop_flag
    while loop_flag:
       b=usb.readline() # binary入力
       if(b == b''):
           print("End Thread") 
           loop_flag = False
           return
       print(b)
       #print(b.decode('utf-8'))

# スレッドに read_loop 関数を渡す
t_id = threading.Thread(target=read_loop)

# スレッドスタート 
s = input(">>>") # 例「G1080004000006C」
t_id.start()
while s != "" :
    usb.write(s.encode('utf-8')) # byteに変換して出力
    usb.write(b'\r\n')
    sleep(0.4)
    s = input(">>>")

loop_flag=False
usb.close()
実行のイメージを示します。USBからのserial入力処理を別スレッド行っています。
そしてキー入力文字列を、USBのserialへ出力する繰り返しを行っています。
(下記「G1080004000006C」がキー入力した部分で、0x80004000番地のメモリ表示指示です)
(base) >python sendtest.py
>>>G1080004000006C
b'G1080004000006C\r\n'
b':108000400000F0B2009D34A6009D00000000C7580000D0\r\n'
>>>
(キー入力でEnterだけを入力するか。または10秒以上入力しないと受信スレッドが終わります。)

「umehoshiEditツール」で作った「UME専用Hexファイル」をPythonプログラムで転送・実行する

「umehoshiEditツール」でビルドして得られたファイルに、実行指示を追加して、それを Pythonプログラムで転送・実行する例を示します。
簡単な例として、[UMEHOSHI ITA]側のプログラムは、
『D1のLEDの点灯/消灯を切り替えて「LED ON/OFF」の文字列をUSBへ送信する』 という目標です。このプログラム例を以下に示します。
「umehoshiEditツール」で作成してビルドします。)

#include <xc.h>
#include "common.h"

__attribute__((address( 0x80005000 ))) void test (void);
void test()
{
	_RB15 = ! _RB15;// 出力を反転  ★

	_send_string("LED ON/OFF\r\n");
}

これをビルドして得られたHEXデータと、実行で得られるコマンドを次のように一つのファイル(command.txt)にまとめます。
以下の  の部分がビルドで得られたファイルをコピーしたもので、 [UMEHOSHI ITA]へのプログラムやデータを転送する命令です。
以下の  の部分が[0x80005000]の絶対番地の関数を実行する命令で、「umehoshiEditツール」の[Excute]ボタンで得られる文字列です。


S108000500000E8FFBD271400BFAF1000BEAF21F0A00317
S10800050100088BF023C2061428C008042300100422CB7
S108000502000FF00443088BF033C20616294C47B827C63
S108000503000206162A400A0023CA44142340000428CC5
S1080005040000080033C6850642409F8400000000000EC
S10800050500021E8C0031400BF8F1000BE8F1800BD275B
S0880005060000800E0030000000032
S1080005068004C4544204F4E2F4F46460D0A0000000089
S1080005078000000000022222222222222222222222220
R00800050000061

上記は、プログラムやデータを転送するSから始まる指示と、Rから始まる指定アドレスの関数を呼び出す指示を含んだものとなります。
よって、これを前回のPython実行して、キー入力時に貼り付けると、プログラム転送と実行を同時にできることになります。

以下で、ファイルを指定してそれを[UMEHOSHI ITA]に転送するPythonの プログラム(instruct.py)を下記に示します。
これを使えば、実行するだけで上記のプログラムを転送して実行できます。(上記内容をcommand.txtに記憶して実行します)

import sys # instruct.py
import serial
import threading
import numpy as np
from time import sleep

usb= serial.Serial(port = 'COM3', baudrate = 115200,timeout = 5)

def check_sum(s):
    ck = 0
    n = len(s)
    if n == 0: return
    for i in range(n-2):
        ck += ord(s[i])
        #print(ck)
        print(s[i] , end ="")
    print(' ',s[-2:] , end ="")
    ck += int(s[-2:] , 16)
    ck &= 0x0f
    print("チェックサム:", ck )
    if ck != 0 : 
        print("ファイルフォーマット・エラー")
        exit()

def file_send():
    fr=open('command.txt') # このファイル内容が転送対象です。
    while True:
        s = fr.readline()
        if s == "" :
            break
        s = s.strip()#前後空白を除く
        check_sum(s) # ファイルからの1行を確認し、表示
        if s.startswith('R'):
            input("実行スタートの Enter >>")
        usb.write(s.encode('utf-8')) # byteに変換して出力
        usb.write(b'\r\n') # [UMEHOSHI ITA]USBへ送信
        sleep(0.1)
        #usb.flush()
    fr.close()

# ファイル入力、USB送信 スレッドに file_send 関数を渡す
t_id = threading.Thread(target=file_send)
t_id.start()# ファイル入力、USB送信 スレッドスタート

usb_read_loop = True
while usb_read_loop:
    b=usb.readline() # binary入力
    if(b == b''):
        usb_read_loop = False
        break
    s = b.decode('utf-8')
    print("USB受信●",b)
    #print("USB受信●",s)

input("終了確認の Enter >>>")
usb.close()

実行前に、USBで[UMEHOSHI ITA]と接続し、そのポートがCOM3の場合のプログラムです。
異なる場合は、プログラムのCOM3を変更してくいださい。
また、このソースと同じ位置にcommand.txtを置かなければなりません。
このファイルを1行ずつ読んでは転送するプログラムです。
スレッドでファイルを1行ごとに読み取って、チェックサムのエラーがなければ、USBで[UMEHOSHI ITA]へ送信しています。
チェックサムエラーがあれば、そこでプログラムは終了します。
また、USBへの送信データが'R'から始まる実行指示の文字列であれば、[Enter]のキー入力を待ちます。
待つ間は、送信が行われないので、応答もありません。応答が無い状態が5秒続くと、プログラムは終わるようにメインのループが作られています。
メインのループで、USBからの応答文字列を受信してコンソール画面に表示しています。
下記にこの実行イメージを示します。

(base) C:\Microchip\umehoshiEdit2\samples\sound>python Instruct.py
S108000500000E8FFBD271400BFAF1000BEAF21F0A003  17チェックサム: 0
USB受信● b'S108000500000E8FFBD271400BFAF1000BEAF21F0A00317\r\n'
USB受信● b'SET:80005000\r\n'
S10800050100088BF023C2061428C008042300100422C  B7チェックサム: 0
USB受信● b'S10800050100088BF023C2061428C008042300100422CB7\r\n'
USB受信● b'SET:80005010\r\n'
S108000502000FF00443088BF033C20616294C47B827C  63チェックサム: 0
USB受信● b'S108000502000FF00443088BF033C20616294C47B827C63\r\n'
USB受信● b'SET:80005020\r\n'
S108000503000206162A400A0023CA44142340000428C  C5チェックサム: 0
USB受信● b'S108000503000206162A400A0023CA44142340000428CC5\r\n'
USB受信● b'SET:80005030\r\n'
S1080005040000080033C6850642409F8400000000000  ECチェックサム: 0
USB受信● b'S1080005040000080033C6850642409F8400000000000EC\r\n'
USB受信● b'SET:80005040\r\n'
S10800050500021E8C0031400BF8F1000BE8F1800BD27  5Bチェックサム: 0
USB受信● b'S10800050500021E8C0031400BF8F1000BE8F1800BD275B\r\n'
USB受信● b'SET:80005050\r\n'
S0880005060000800E00300000000  32チェックサム: 0
USB受信● b'S0880005060000800E0030000000032\r\n'
USB受信● b'SET:80005060\r\n'
S1080005068004C4544204F4E2F4F46460D0A00000000  89チェックサム: 0
USB受信● b'S1080005068004C4544204F4E2F4F46460D0A0000000089\r\n'
USB受信● b'SET:80005068\r\n'
S10800050780000000000222222222222222222222222  20チェックサム: 0
USB受信● b'S1080005078000000000022222222222222222222222220\r\n'
USB受信● b'SET:80005078\r\n'
R008000500000  61チェックサム: 0
実行スタートの Enter >>
USB受信● b'R00800050000061\r\n'
USB受信● b'START:80005000\r\n'
USB受信● b'LED ON/OFF\r\n'
終了確認の Enter >>>

上記では、「python Instruct.py」と実行すると、command.txtファイル内容の命令を [UMEHOSHI ITA]へ転送しています。
このファイル内の'R'から始まる命令行がある所で、「実行スタートの Enter >>」のキー入力で一時停止します。
ここで、Enterキー入力で、この'R'から始まる'R00800050000061\r\n'が送信され、 [UMEHOSHI ITA]で80005000番地からの実行を始めます。
その実行で、'LED ON/OFF\r\n'の受信文字列を表示しています。

録音プログラム

[UMEHOSHI ITA]側で、このページ で示したようにCN8にコンデンサーマイクロホン(ECM)を取り付けている前提です。
CN8のコンデンサーマイクロホンより、8Kspsで1024×4=4096個サンプリングしてはUSBへ出力する繰り返しのプログラムです。
転送する[UMEHOSHI ITA]のプログラムは、ume_rec_play_cmd_adc4.txtに記憶しておいて、 pythonでそのプログラム転送して実行させる例を示します。
set_adc_exe(4, 1);の命令により、4ブロック(1が1024ワード)を無限にサンプリングさせています。 そして、これを止めるstop関数を0x80006000番地位置に定義しています。(この命令で開始すれば、Timer3を停止)
なおpythonでは、[UMEHOSHI ITA]から受信したデータで、音の再生も行います。

以下のソースファイルが[UMEHOSHI ITA]用です。
「umehoshiEditツール」で作成してビルドします。)
#include <xc.h> // ADC4.c
#include "common.h"

#define AdrStart	0x80005000
#define AdrStop	0x80006000

__attribute__((address( AdrStart  ))) void start (void);
void start()
{
	_RB15 = ! _RB15;// 動作確認用のD1 LEDの点灯を反転
	PR3=2499;	//サンプリング周波数を 8KHzに指定するパラメタ
	// (1/8000)/(1/40e6)/2-1=2499
	_set_adc_mode(1, 0);// CN8のAN0端子だけでサンプリングする。出力はバイナリモード 
	_set_adc_exe(4, 1);// 4ブロックのサンプリング(1/8000*1024*4=0.512秒)を繰り返す
	T3CONbits.ON = 1; // timer3を開始
}

__attribute__((address( AdrStop))) void stop (void);
void stop()
{
	T3CONbits.ON = 0; // すぐにtimer3を停止
	//AD1CON1bits.ON = 0; //ADC モジュールを無効にする(b15)
	IFS0CLR = _IFS0_AD1IF_MASK; // Clear ADC interrupt flag  
	IFS0CLR = _IFS0_T3IF_MASK; // Clear the timer3 interrupt status flag
	//AD1CON1bits.ON = 1; //ADC モジュールを有効にする(b15)
}
上記をビルドして得られるコードと、その実行開始命令「R00800050000061」を追加した内容を下記に示します。
S108000500000E8FFBD271400BFAF1000BEAF21F0A00317
S10800050100088BF023C2061428C008042300100422CB7
S108000502000FF00443088BF033C20616294C47B827C63
S108000503000206162A480BF023CC3090324200A43AC88
S10800050400000A0023C644242340000428C01000424E9
S1080005050002128000009F840000000000000A0023CF9
S108000506000604242340000428C040004240100052405
S10800050700009F840000000000080BF033C000A6294BE
S10800050800001000424C47B827C000A62A421E8C00394
S1080005090001400BF8F1000BE8F1800BD270800E0036D
S04800050A00000000000CB
S108000600000F8FFBD270400BEAF21F0A00380BF033C1D
S108000601000000A6294C47B027C000A62A488BF023C6D
S1080006020000010033C341043AC88BF023C00400324B2
S108000603000341043AC21E8C0030400BE8F0800BD2772
S0880006040000800E0030000000033
S10800050A400000000002222222222222222222222221A
R00800050000061
上記内容をファイル(ume_rec_play_cmd_adc4.txt)に記憶して、pythonの実行位置に配置します。
これを読み取って、転送して実行するpythonのソース(ume_rec_play.py)を以下に示します。
import threading # ume_rec_play.py
import serial # https://pyserial.readthedocs.io
import numpy as np
from collections import deque
from time import sleep
import pyaudio
import matplotlib.pyplot as plt

numb_word_in_block=1024 * 4 # 4096個サンプリングしてはUSBへ出力する繰り返し
# この数が、一回のグラフ化、再生、wav書き込み対象となる。_set_adc_exe(4, 1);の4は一致する。

SamplingRate = 8000 # 8KHz
AmplificationRate = 32 # 増幅率
flag_playing = True # 再生フラグ
path="test.wav"

''' barray の16bitリトルエンディアンバイト列から、未圧縮でpathのサウンドファイルを作る'''
import wave
wavefile = wave.open(path, 'wb') # waveファイルをバイナリ保存用として開く。
wavefile.setnchannels(1) # モノラル(単一の音信号)
wavefile.setsampwidth(2) # 2byteのデータ群と録音する指定
wavefile.setframerate(SamplingRate) # サンプリングレート

usb = serial.Serial(port = 'COM8', baudrate =  115200) # COMの番号は、デバイスマネージャで確認して合う様に変更
#usb = serial.Serial(port = 'COM8', baudrate = 921600,timeout=10)

# 再生関連用 ---------------ここから
audio = pyaudio.PyAudio()
stream=audio.open(format = pyaudio.paInt16, # 2byteのデータ群と録音や再生する指定
   channels = 1, # チャンネル数(1入力)
   rate = SamplingRate, # サンプリングレート 例 sample/sec=8000
   frames_per_buffer = numb_word_in_block * 2,#1回の処理で使うサイズは1024 × 2 = 2048byte
   input = False, #録音は使わない 
   output = True) # 再生をTrueにする。これをFalseにして、上のinput=Trueにすると、(記憶中に再生音がでなくなります)

queue = deque() #再生待ち行列
lock = threading.Lock() # Lockモジュール生成

def set_data(data):# 再生データをキューにセットする。
    lock.acquire() # 排他制御開始
    queue.append(data)
    lock.release() # 排他制御解除

fig, ax = plt.subplots(figsize=(10, 2),dpi=100) # FigureとAxes object取得
xlist = [x for x in range(numb_word_in_block)]
lines, = ax.plot(xlist, xlist)  #Line2D (縦軸範囲はここで決まる)
ax.set_ylim((-2**15, 2**15)) # Y軸の描画範囲
plt.title("Right click to finish")

def onclick(event): # マウスをクリックしたときに
    global flag_playing # 再生フラグ
    if event.button == 3: # 右クリックか?
        flag_playing = False
        plt.cla() #メソッドは現在の軸をクリアし
        plt.clf() # 現在の図形をクリア
        plt.close() # 閉じる 

plt.connect('button_press_event', onclick)#マウスをクリックしたときにonclick関数を呼ぶ
# (pyplotの閉じる処理のイベント処理が不明なので、右クリックで終了する方法にした)

def plotting( xlist, ylist): # リアルタイム描画用(繰り返しが必要)
    lines.set_data(xlist, ylist) # 描画データを更新する  
    plt.pause(.00000000001) # 引数を小しても、一定以下は速くならない。
 
def playing():# 再生スレッド関数
    while flag_playing:
        if len(queue) == 0:
            #sleep(0.0001)
            sleep(0.00000001)
            #print(" wait ", end="")
            continue
        lock.acquire() # 排他制御開始
        data=queue.popleft()
        lock.release() # 排他制御解除
        stream.write(data)  # ストリームへの書き込みで、これで音が出力される。
        #print(data)

snd_id = threading.Thread(target=playing)
snd_id.start() # 再生スレッド起動
# 再生関連用 ---------------ここまで

def file_send(): # プログラム転送と開始、終了のスレッド関数
    fr=open('ume_rec_play_cmd_adc4.txt')
    while True:
        s = fr.readline()
        if s == "" :
            break
        s = s.strip()#前後空白を除く
        print(s)
        if s.startswith('R'):
            input("実行スタートの Enter(pyplotの右クリックで終了) >>")
        usb.write(s.encode('utf-8')) # byteに変換して出力
        usb.write(b'\r\n') # [UMEHOSHI ITA]USBへ送信
        sleep(0.01)
    fr.close()

# ファイル入力、USB送信 スレッドに 上記file_send_exit 関数を渡す
t_id = threading.Thread(target=file_send)
t_id.start()# ファイル入力、USB送信 スレッドスタート

status_adc=0 # 0:待機、1:個数取得してADCデータ受信

buffer=np.zeros(numb_word_in_block,np.int16) # 再生用バッファ
idx_sample=0 # バッファ内記憶位置

loop_count=0
while flag_playing:# 再生フラグ
    b=usb.readline() # binary入力
    #print(b)
    if(b == b''):
        break
    s = b.decode('utf-8')
    s = s.strip()#前後空白を除く
    if s == "ADC_START0":
        status_adc = 1
        channel_bits = 0x1
    elif s == "ADC_START1":
        status_adc = 1
        channel_bits = 0x2
    elif s == "ADC_START":
        status_adc = 1
        channel_bits = 0x3
    elif status_adc == 1:
        status_adc = 0
        numb = int(s, 16) # 16進数の受信データ(16ビット/ワード)の数 (2ブロック指定は、2048)
        print("ワード受信数:", numb, end="")
        if ((channel_bits != 1) and (channel_bits != 2)) :
                print("CHANNELSは1または2で、設定エラーCHANNELS:", channel_bits)
                exit()
        loop_count += 1 
        b = usb.read(numb << 1) # 一括読み取り数 この例では=numb << 1=2048<<1=4096byte

        tbuff=np.frombuffer(b, dtype="int16")  #2バイト、リトルエンディアンで変換
        print(tbuff.shape,"がADC受信ワード情報 loop数:",loop_count)

        if AmplificationRate == 1:
            plotting( xlist, tbuff ) # オリジナル描画
            set_data( b ) # USB受信データを加工しないで、キューに記憶
            wavefile.writeframes( b ) # USB受信データを加工しないで、wavファイル化
        else:
            tbuff2 = (((tbuff-512) *AmplificationRate ) ).astype(np.int16)
            plotting( xlist, tbuff2 ) # 描画
            bytearray = tbuff2 .tobytes()
            set_data( bytearray ) 
            wavefile.writeframes( bytearray ) #wavファイル化
        #
        idxs = np.where(tbuff < 0)[0] # タプル先頭要素
        if len(idxs) > 0: # 送信が間に合わなくて送れなかったデータ数が負の回数だけあった時の処理
            print(idxs[0] , "番目の抜け数:" , -tbuff[ idxs[0]  ])
            exit()

usb.write("R00800060000060\r\n".encode('utf-8')) #終了コマンド送信
sleep(1)
wavefile.close()
audio.terminate()
stream.stop_stream()
stream.close()
usb.close()

usbで接続して上記を「python ume_rec_play.py」と実行すると、 "test.wav"のファイル(16byte解像度8KHzモノラル)のファイルを生成し、 キューにデータがあれば書き込みを続けるplaying()の再生スレッドが実行を始めます。
そして、file_send関数のスレッド起動で 「ume_rec_play_cmd_adc4.txt」のコマンドが、[UMEHOSHI ITA]に転送され始まります。
そして最後の'R〜行'の直前で「実行スタートの Enter(pyplotの右クリックで終了>>」 のプロンプトでキー入力待ちになります。
(一方、メインスレッドはUSB受信の繰り返しで待機状態になっています。)
ここで、[Enter]キーを入力すると、起動命令(R00800050000061)を送信されて、[UMEHOSHI ITA]のプログラムが起動します。
それにより、USBよりADCの処理が行われてデータが送信されてきますが、メインスレッドの受信で、 numb_word_in_blockの設定(1024 * 4)分のデータを取得ごとにset_data関数で再生キューに記憶し、plotting関数で描画処理を行い、 wavefile.writeframesでサウンドファイルに書き込みします。
(AmplificationRateが1以外であれば、その倍率で増幅した処理に分岐しています。)
以下が、plotting関数による描画された画面です。(numb_word_in_blockワード受信ごとに更新されます。)
この画面のウインドウを右クリックすると、 flag_playing をFalseにしてプログラムを終了するようにしています。
この終了時に、"R00800060000060\r\n"を[UMEHOSHI ITA]へ送ることで、割り込み終了するようにしています。


umehoshi ita (テスト・ウメ・フラッシュ)のADCデフォルトプログラムを書き換えて使う。

ADCデフォルトプログラムを書き換え方法はこのページを参照してください。
このページで作成したhexファイル使って 次の内容のファイル('ume_rec_play_cmd_adc4.txt')を用意します。
これはADCデフォルトの割り込み処理を、AN1に限定(2倍のサンプリングが可能)した処理に置き換えて動作する例で、 様々なシステムに応用するヒントを示しています。

S04800080000000000000D9
S04800080040000000000D5
S04800080080000000000D1
S048000800C0000000000C6
S04800080100000000000D8
S04800080140000000000D4
S04800080180000000000D0
S048000801C0000000000C5
S04800080200000000000D7
S04800080240000000000D3
S04800080280000000000CF
S048000802C0000000000C4
S04800080300001000000D5
S108000500000E8FFBD271400BFAF1000BEAF21F0A00317
S10800050100088BF023C2061428C008042300100422CB7
S108000502000FF00443088BF033C20616294C47B827C63
S108000503000206162A400A0023C804042340080033CD3
S10800050400020516324000043AC00A0023C78404234D0
S1080005050000080033CB8526324000043AC80BF023C96
S10800050600087130324200A43AC00A0023C64424234B9
S1080005070000000428C020004242128000009F84000F3
S1080005080000000000000A0023C604242340000428CF4
S108000509000040004240100052409F840000000000011
S10800050A00080BF033C000A6294C47B027C000A62A465
S10800050B00081BF033C109062940400027C109062A49D
S10800050C00081BF033C109062948428027C109062A48A
S10800050D00081BF033C4090628C01000424049C827C82
S10800050E000409062AC81BF033C4090628C04DE027C4E
S10800050F000409062AC80BF033C000A62940100042496
S108000510000C47B827C000A62A421E8C0031400BF8F5B
S1080005110001000BE8F1800BD270800E00300000000BF
S108000600000E8FFBD271400BFAF1000BEAF21F0A00316
S10800060100000A0023C604242340000428C04000424EC
S1080006020002128000009F840000000000021E8C003EE
S1080006030001400BF8F1000BE8F1800BD270800E00372
S04800060400000000000D7
S108000512000F0FFBD270C00BEAF21F0A0031000C4AF1E
S10800051300081BF023C1090428C800042302B100200BF
S108000514000FF0042300400C2AF0400C28F08004010A1
S1080005150000000000081BF023C7090428CFFFF43307D
S1080005160000180023C088043A46114000800000000F7
S10800051700081BF023CF090428CFFFF43300180023C4B
S108000518000088043A41000C28F0420428C00044228BB
S088000519000210040140000000042
S1080005198001000C28F0820438C0200022408006210D2
S10800051A800000000000180023C0C80428CFFFF432483
S10800051B8000180023C0C8043ACA614000800000000B9
S10800051C8001000C28F042040AC1000C28F0020428C8A
S10800051D8000000C2AF0000C28F010042240000C2AF8A
S10800051E8000000C38F020002240200621400000000F4
S10800051F8000000C0AF1000C28F0020438C1000C28F7A
S108000520800082043AC1000C28F0000C38F002043AC8B
S1080005218000180023C0C80428C0C00401000000000DF
S1080005228000180023C0C80428CFFFF43300180023C73
S108000523800108043A40180023C108043940180023CCE
S108000524800088043A40180023C0C8040AC1000C28F8D
S1080005258000020458C1000C28F0420428C0180033CAD
S108000526800088063941000C48F802A05002110A200BC
S1080005278004010020021108200000043A41000C28FE9
S1080005288000420428C010043241000C28F042043ACB3
S10800052980088BF023C0010033C341043AC21E8C00379
S10800052A8000C00BE8F1000BD270800E003000000009C
S10800052B800D8FFBD272400BFAF2000BEAF21F0A003FA
S10800052C8002800C4AF80BF023C200A428C211840006E
S10800052D8000180023C148043AC0180023C1480428C99
S10800052E800640042281A004010000000000180023CEE
S10800052F8001480428C64000324231862000180023CC7
S108000530800148043AC0180023C1880428C01004324BB
S1080005318000180023C188043AC0180023C1880438CA2
S1080005328000180023C1480428C2A10620006004010DC
S1080005338000000000088BF023C00400324341043ACC1
S108000534800ED150008000000000180023C188040ACBF
S1080005358002800C28F1420428C1000C2AF2800C28F70
S1080005368000820438C02000224060062140000000005
S10800053780088BF023C00400324341043ACED15000886
S1080005388000000000000A0023CB44142340000428CDA
S10800053980009F84000000000001400C2AF1400C28FA7
S10800053A80032004228060040100000000088BF023CD3
S10800053B80000400324341043ACED15000800000000CB
S10800053C80000A0023C944142340000428C00040424CA
S10800053D80009F8400000000000060040140000000006
S10800053E80088BF023C00400324341043ACED15000878
S10800053F800000000001000C28F1800438C00A0023CB6
S108000540800A84142340000428C261062000100422CDA
S108000541800FF0042301800C2AF0180023C3080428C8B
S10800054280033004010000000002800C28F00040324FC
S108000543800102043AC00A0023C5C4242340000428CAD
S1080005448002800C48F09F840000000000000A0023CBC
S108000545800A44142340000428C0080033CCC576424A3
S10800054680009F84000000000001800C38F01000224DC
S108000547800070062140000000000A0023C9C414234E1
S1080005488000000428C5400042409F8400000000000EC
S10800054980000A0023CA84142340000428C1000C38FA0
S10800054A8000400638C2120600009F8400000000000E4
S10800054B80000A0023CA44142340000428C0080033CAF
S10800054C800DC57642409F84000000000000180023CB1
S10800054D80001000324008043AC0180023C308040ACAE
S10800054E8000180023C1C8040ACE415000800000000B2
S10800054F8001000C28F0000438C1000C28F0400428C8E
S1080005508002B10620049004014000000000180023CFE
S1080005518001C80428C9C004014000000000180023CCE
S1080005528001C8040AC0180023C01000324308043ACAB
S10800055380000A0023CA44142340000428C0080033CBD
S108000554800E057642409F84000000000000180023CD1
S108000555800008040AC1000C28F1000428C22004010BE
S108000556800000000001000C28F100040AC1000C28FBB
S1080005578000C00428C15004010000000002800C28FCF
S1080005588001020438C1000C28F0C00428C18006200AC
S108000559800121800001000C28F040043AC1000C28FA6
S10800055A8001400438C030002240F00621400000000EC
S10800055B8001000C28F0400428C401802001000C28FA4
S10800055C800040043AC7C1500080000000080BF033C9F
S10800055D800000A6294C47B027C000A62A42800C28F61
S10800055E80002000324082043AC1000C28F0800428CA0
S10800055F8000A0040140000000080BF033C000A6294B3
S108000560800C47B027C000A62A41000C28F0C0040AC68
S1080005618002800C28F02000324082043AC1000C28F9F
S108000562800000040ACE4150008000000000180023CDF
S108000563800208040ACDF150008000000002800C28FA7
S1080005648000820438C0180023C248043AC2800C28F8A
S1080005658000C20438C0180023C288043AC0180023C96
S1080005668002480448C0180023C2880428C2800C38F88
S1080005678008022040021108200401002002110620019
S10800056880000004294201E027C0180023C2C8043A4A8
S1080005698000180023C2C8042840400410400000000EB
S10800056A8000180023C01000324048043AC1000C28FAA
S10800056B8001800428C0180033C2C80638421206000B6
S10800056C80009F84000000000001000C28F0000428CBE
S10800056D800010043241000C28F000043AC2800C28F93
S10800056E8000C20428C010043242800C28F0C2043AC7B
S10800056F8001000C28F0000428C0F0042300C004014AB
S108000570800000000001800C38F0100022408006214F5
S1080005718000000000000A0023CA44142340000428CDE
S1080005728000080033CDC57642409F8400000000000BF
S1080005738002800C28F0C20438C2800C28F1020428C78
S1080005748002A10620006004014000000002800C28FE4
S1080005758000C2040AC2800C28F02000324082043AC91
S1080005768000180023C2080428C010043240180023CCF
S108000577800208043AC0180023C2080428C02004228B6
S108000578800AEFF40140000000000A0023C98414234A1
S1080005798000000428C0004042409F8400000000000ED
S10800057A80088BF023C00400324341043AC21E8C00379
S10800057B8002400BF8F2000BE8F2800BD270800E00352
S04800057C80000000000BA
S10800057CC000D0A4144435F5354415254310D0A00008F
S04800057DC000D0A000089
S0C800057E0004144435F454E440D0A00000033
S10800057EC003080008004000000010000000100000017
S08800057FC00008000803000000015
R00800050000061

これは、ADC_8K_AN1_4B.cをビルドして 作ったhexファイル内容の最後に起動命令(R00800050000061)を追加して作ったファイルです。
これを、ume_rec_play.pyと同じ場所に配置して次のように実行します。

R:\umehoshi_pc\adc_work>python ume_rec_play.py
S04800080000000000000D9
S04800080040000000000D5
S04800080080000000000D1
S048000800C0000000000C6
S04800080100000000000D8
S04800080140000000000D4
S04800080180000000000D0
S048000801C0000000000C5
S04800080200000000000D7
S04800080240000000000D3
S04800080280000000000CF
S048000802C0000000000C4
S04800080300001000000D5
S108000500000E8FFBD271400BFAF1000BEAF21F0A00317
S10800050100088BF023C2061428C008042300100422CB7
S108000502000FF00443088BF033C20616294C47B827C63
S108000503000206162A400A0023C804042340080033CD3
S10800050400020516324000043AC00A0023C78404234D0
S1080005050000080033CB8526324000043AC80BF023C96
S10800050600087130324200A43AC00A0023C64424234B9
S1080005070000000428C020004242128000009F84000F3
S1080005080000000000000A0023C604242340000428CF4
S108000509000040004240100052409F840000000000011
S10800050A00080BF033C000A6294C47B027C000A62A465
S10800050B00081BF033C109062940400027C109062A49D
S10800050C00081BF033C109062948428027C109062A48A
S10800050D00081BF033C4090628C01000424049C827C82
S10800050E000409062AC81BF033C4090628C04DE027C4E
S10800050F000409062AC80BF033C000A62940100042496
S108000510000C47B827C000A62A421E8C0031400BF8F5B
S1080005110001000BE8F1800BD270800E00300000000BF
S108000600000E8FFBD271400BFAF1000BEAF21F0A00316
S10800060100000A0023C604242340000428C04000424EC
S1080006020002128000009F840000000000021E8C003EE
S1080006030001400BF8F1000BE8F1800BD270800E00372
S04800060400000000000D7
S108000512000F0FFBD270C00BEAF21F0A0031000C4AF1E
S10800051300081BF023C1090428C800042302B100200BF
S108000514000FF0042300400C2AF0400C28F08004010A1
S1080005150000000000081BF023C7090428CFFFF43307D
S1080005160000180023C088043A46114000800000000F7
S10800051700081BF023CF090428CFFFF43300180023C4B
S108000518000088043A41000C28F0420428C00044228BB
S088000519000210040140000000042
S1080005198001000C28F0820438C0200022408006210D2
S10800051A800000000000180023C0C80428CFFFF432483
S10800051B8000180023C0C8043ACA614000800000000B9
S10800051C8001000C28F042040AC1000C28F0020428C8A
S10800051D8000000C2AF0000C28F010042240000C2AF8A
S10800051E8000000C38F020002240200621400000000F4
S10800051F8000000C0AF1000C28F0020438C1000C28F7A
S108000520800082043AC1000C28F0000C38F002043AC8B
S1080005218000180023C0C80428C0C00401000000000DF
S1080005228000180023C0C80428CFFFF43300180023C73
S108000523800108043A40180023C108043940180023CCE
S108000524800088043A40180023C0C8040AC1000C28F8D
S1080005258000020458C1000C28F0420428C0180033CAD
S108000526800088063941000C48F802A05002110A200BC
S1080005278004010020021108200000043A41000C28FE9
S1080005288000420428C010043241000C28F042043ACB3
S10800052980088BF023C0010033C341043AC21E8C00379
S10800052A8000C00BE8F1000BD270800E003000000009C
S10800052B800D8FFBD272400BFAF2000BEAF21F0A003FA
S10800052C8002800C4AF80BF023C200A428C211840006E
S10800052D8000180023C148043AC0180023C1480428C99
S10800052E800640042281A004010000000000180023CEE
S10800052F8001480428C64000324231862000180023CC7
S108000530800148043AC0180023C1880428C01004324BB
S1080005318000180023C188043AC0180023C1880438CA2
S1080005328000180023C1480428C2A10620006004010DC
S1080005338000000000088BF023C00400324341043ACC1
S108000534800ED150008000000000180023C188040ACBF
S1080005358002800C28F1420428C1000C2AF2800C28F70
S1080005368000820438C02000224060062140000000005
S10800053780088BF023C00400324341043ACED15000886
S1080005388000000000000A0023CB44142340000428CDA
S10800053980009F84000000000001400C2AF1400C28FA7
S10800053A80032004228060040100000000088BF023CD3
S10800053B80000400324341043ACED15000800000000CB
S10800053C80000A0023C944142340000428C00040424CA
S10800053D80009F8400000000000060040140000000006
S10800053E80088BF023C00400324341043ACED15000878
S10800053F800000000001000C28F1800438C00A0023CB6
S108000540800A84142340000428C261062000100422CDA
S108000541800FF0042301800C2AF0180023C3080428C8B
S10800054280033004010000000002800C28F00040324FC
S108000543800102043AC00A0023C5C4242340000428CAD
S1080005448002800C48F09F840000000000000A0023CBC
S108000545800A44142340000428C0080033CCC576424A3
S10800054680009F84000000000001800C38F01000224DC
S108000547800070062140000000000A0023C9C414234E1
S1080005488000000428C5400042409F8400000000000EC
S10800054980000A0023CA84142340000428C1000C38FA0
S10800054A8000400638C2120600009F8400000000000E4
S10800054B80000A0023CA44142340000428C0080033CAF
S10800054C800DC57642409F84000000000000180023CB1
S10800054D80001000324008043AC0180023C308040ACAE
S10800054E8000180023C1C8040ACE415000800000000B2
S10800054F8001000C28F0000438C1000C28F0400428C8E
S1080005508002B10620049004014000000000180023CFE
S1080005518001C80428C9C004014000000000180023CCE
S1080005528001C8040AC0180023C01000324308043ACAB
S10800055380000A0023CA44142340000428C0080033CBD
S108000554800E057642409F84000000000000180023CD1
S108000555800008040AC1000C28F1000428C22004010BE
S108000556800000000001000C28F100040AC1000C28FBB
S1080005578000C00428C15004010000000002800C28FCF
S1080005588001020438C1000C28F0C00428C18006200AC
S108000559800121800001000C28F040043AC1000C28FA6
S10800055A8001400438C030002240F00621400000000EC
S10800055B8001000C28F0400428C401802001000C28FA4
S10800055C800040043AC7C1500080000000080BF033C9F
S10800055D800000A6294C47B027C000A62A42800C28F61
S10800055E80002000324082043AC1000C28F0800428CA0
S10800055F8000A0040140000000080BF033C000A6294B3
S108000560800C47B027C000A62A41000C28F0C0040AC68
S1080005618002800C28F02000324082043AC1000C28F9F
S108000562800000040ACE4150008000000000180023CDF
S108000563800208040ACDF150008000000002800C28FA7
S1080005648000820438C0180023C248043AC2800C28F8A
S1080005658000C20438C0180023C288043AC0180023C96
S1080005668002480448C0180023C2880428C2800C38F88
S1080005678008022040021108200401002002110620019
S10800056880000004294201E027C0180023C2C8043A4A8
S1080005698000180023C2C8042840400410400000000EB
S10800056A8000180023C01000324048043AC1000C28FAA
S10800056B8001800428C0180033C2C80638421206000B6
S10800056C80009F84000000000001000C28F0000428CBE
S10800056D800010043241000C28F000043AC2800C28F93
S10800056E8000C20428C010043242800C28F0C2043AC7B
S10800056F8001000C28F0000428C0F0042300C004014AB
S108000570800000000001800C38F0100022408006214F5
S1080005718000000000000A0023CA44142340000428CDE
S1080005728000080033CDC57642409F8400000000000BF
S1080005738002800C28F0C20438C2800C28F1020428C78
S1080005748002A10620006004014000000002800C28FE4
S1080005758000C2040AC2800C28F02000324082043AC91
S1080005768000180023C2080428C010043240180023CCF
S108000577800208043AC0180023C2080428C02004228B6
S108000578800AEFF40140000000000A0023C98414234A1
S1080005798000000428C0004042409F8400000000000ED
S10800057A80088BF023C00400324341043AC21E8C00379
S10800057B8002400BF8F2000BE8F2800BD270800E00352
S04800057C80000000000BA
S10800057CC000D0A4144435F5354415254310D0A00008F
S04800057DC000D0A000089
S0C800057E0004144435F454E440D0A00000033
S10800057EC003080008004000000010000000100000017
S08800057FC00008000803000000015
R00800050000061
実行スタートの Enter(pyplotの右クリックで終了) >>
ワード受信数: 4096(4096,) がADC受信ワード情報 loop数: 1
ワード受信数: 4096(4096,) がADC受信ワード情報 loop数: 2
ワード受信数: 4096(4096,) がADC受信ワード情報 loop数: 3
ワード受信数: 4096(4096,) がADC受信ワード情報 loop数: 4
ワード受信数: 4096(4096,) がADC受信ワード情報 loop数: 5
ワード受信数: 4096(4096,) がADC受信ワード情報 loop数: 6
ワード受信数: 4096(4096,) がADC受信ワード情報 loop数: 7
ワード受信数: 4096(4096,) がADC受信ワード情報 loop数: 8
ワード受信数: 4096(4096,) がADC受信ワード情報 loop数: 9
ワード受信数: 4096(4096,) がADC受信ワード情報 loop数: 10
ワード受信数: 4096(4096,) がADC受信ワード情報 loop数: 11
・・・・・
実行スタートの Enter(pyplotの右クリックで終了) >>での[Enter]入力で[UMEHOSHI ITA]側プログラムがスタートして 録音を繰り返します。
この画面の右クリックでプログラムが終了します。
終了時に、"R00800060000060\r\n"の命令をUSBで送って[UMEHOSHI ITA]の送信を止めています。
以上で、8KHzモノラルの「test.wav」が実行ディレクトリに作られています。
(PC側のUSB送信能力によっては、この連続録音が失敗する可能性があります。 その場合は"xx番目の抜け数:??" のエラー表示が出て、途中でプログラムが停止します。)