UMEHOSHI ITA TOP PAGE COMPUTER SHIEN LAB
[UMEHOSHI ITA]の制御で使っているIC「PIC32MX270F256B-I/SO」のフラッシュメモリには、テスト用プログラムが書き込まれいています。
これを利用したユーザー用のプログラムを「ウメ・エディットプログラム」と呼ぶことにします。
「ウメ・エディットプログラム」の開発では「umehoshiEditツール」が必要で、
その取得や最初の操作情報は、こちらを参照してください。
以下では、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]へ送信し、 その応答文字列をコンソールに表示する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入力処理を別スレッド行っています。
(base) >python sendtest.py
>>>G1080004000006C
b'G1080004000006C\r\n'
b':108000400000F0B2009D34A6009D00000000C7580000D0\r\n'
>>>
(キー入力でEnterだけを入力するか。または10秒以上入力しないと受信スレッドが終わります。)
「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]から受信したデータで、音の再生も行います。
#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の実行位置に配置します。
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]へ送ることで、割り込み終了するようにしています。
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]側プログラムがスタートして 録音を繰り返します。