で、躓いたのでメモをする。
if 〔探索値〕 in 〔リスト名/辞書名/タプル名〕: 〔探索値がリスト/辞書のキー/タプル中にあったときの処理〕
ここで 〔探索値〕の添字を返すメソッド
〔リスト名〕.index(探索値)
を用いると存在しない場合に ValueError を返して、例外処理を書かないとコードの進行が止まる。辞書の〔キー〕・〔値〕のペアの〔値〕の中から探索するには
if 〔探索値〕 in 〔辞書名〕.values(): 〔探索値が辞書の値の中にあったときの処理〕
で、躓いたのでメモをする。
if 〔探索値〕 in 〔リスト名/辞書名/タプル名〕: 〔探索値がリスト/辞書のキー/タプル中にあったときの処理〕
ここで 〔探索値〕の添字を返すメソッド
〔リスト名〕.index(探索値)
を用いると存在しない場合に ValueError を返して、例外処理を書かないとコードの進行が止まる。辞書の〔キー〕・〔値〕のペアの〔値〕の中から探索するには
if 〔探索値〕 in 〔辞書名〕.values(): 〔探索値が辞書の値の中にあったときの処理〕
自分用の覚書。ようやく pigpio の spi_open() と spi_xfer() のパラメータの与え方が分かったので、Python と C のミニマルコードをメモしておく。
参考にしたサイト
tomosoft.jp
#! /usr/bin/env python # -*- coding: utf-8 -*- # # Raspberry Pi 3B から MCP3208 を利用するコード (終了は Ctrl-C) # # ピンの接続 # Raspberry Pi 3B MCP3208 # [19] GPIO_10 SPI_MOSI -> [11] D_IN # [21] GPIO_09 SPI_MISO <- [12] D_OUT # [23] GPIO_11 SPI_CLK -> [13] CLK # [24] GPIO_08 SPI_CE0_N -> [10] ~CS/SHDN # # MCP3208 の [1]CH0 のA/D変換値(0~4095)を表示する # # 参考にしたサイト (2018年10月27日アクセス) # http://abyz.me.uk/rpi/pigpio/python.html # pigpio library: Python Interface # https://tomosoft.jp/design/?p=10477 # TomoSoft: pigpioによるI2CとSPIインタフェースの実装 # 注: MCP3208 は12bitのA/Dコンバータだが testspi.py では # そのうちの上位10bitのデータ(0~1023)を利用していた。 # import time import pigpio slct = 0 # +1 +1 # SPI接続機器の番号 chip select baud = 50000 # 通信速度 flag = 0 # +256 # bin(256) = 0b100000000 は Aux SPI の利用フラグ adch = 0 # MCP3208のCH0の番号 pi = pigpio.pi() hndl = pi.spi_open(slct, baud, flag) # デバイスオープン try: while True: cmnd = ( 0b00011000 + adch ) << 2 c, raw = pi.spi_xfer(hndl,[cmnd,0,0]) # 最初の要素が命令の入力 # # [0][1][1][D2][D1][D0][0][0] # | | | | | # | | 読み出しチャネルの指定 # | 1: シングルエンド # [スタートビット] # data = ((raw[1] & 0b11111111) << 4) + \ ((raw[2] & 0b11110000) >> 4) print(c,raw,bin(data),data) time.sleep(1) except KeyboardInterrupt: pi.spi_close(hndl) pi.stop()
参考にしたサイト
Raspberry Pi 3とADS7843を使ってタッチスクリーンの情報を受け取る(Cでpigpioを使ってSPI通信→Nodejs) - Qiita
gpio - pigpio spiXfer in C++ - Raspberry Pi Stack Exchange
/* pigpio の spiOpen(), spiXfer() を利用する最小限コード Raspberry Pi 3B と MCP3208 の接続は上の Python コードと同じ 動作: A/Dコンバータを1秒間隔で10回読んで、表示する(終了は自動) 参考にしたサイト https://qiita.com/yuji_miyano/items/e86150759818c3c12fa4 https://raspberrypi.stackexchange.com/questions/79127/pigpio-spixfer-in-c/79128#79128 */ #include <stdio.h> #include <unistd.h> #include <pigpio.h> int main (void) { if ( gpioInitialise() < 0 ) { printf("gpioInitialise() failed\n"); } else { printf("gpioInitialise() succeeded\n"); int slct = 0;//+2 // SPI接続機器の番号 chip select int baud = 50000; // 通信速度 int flag = 0;//+256 // 256: Aux SPI の利用フラグ int hndl = spiOpen(slct, baud, flag); if ( hndl < 0 ) { printf("spiOpen() failed\n"); } else { printf("spiOpen() succeeded\n"); int count = 0; while ( count < 10 ) { int adch = 0; // MCP3208のCHの番号(0-7) char txBuf[3]; // 読み出し命令, AD変換データの入れ物 txBuf[0]= ( 0x18 + adch ) << 2; txBuf[1]= txBuf[2]= 0; spiXfer(hndl,txBuf,txBuf,3); // pigpio: SPI読み出し int data = // 読み出したバッファからの移し替え ( txBuf[1] & 0xff ) << 4 | ( txBuf[2] & 0xf0 ) >> 4; printf("%d %d\n",count,data); count++; sleep(1); } spiClose(hndl); } gpioTerminate(); } }
あまりにもへんてこな動きをした台風だったので*1、2018年7月28日21時の天気図と衛星画像を簡単にまとめてみた。低気圧は反時計回りの渦なのだが、今回は上空10,000m位の高さにかなり強くて大きな低気圧があって、衛星画像を見ても日本の南におおきな渦が回っているのが見える。*2
見たところ台風12号はこの上空の低気圧の流れに流されて西へと向かう奇天烈な軌道を取ったようにみえる。藤原の効果*3というときは主に同じ高度の2個の渦の相互作用を考える(例えば英語版Wikipediaにあるように2個の台風の融合)ようだが、今回は「上下2層」の相互作用なので、「融合」は無くて「吹送(みたいな何か)」が起きたのか。
*2:この季節にこのような場所と高度にこのような低気圧ができるのが珍しいことかどうかは知らない。
import pygame import numpy pygame.init() screen = pygame.display.set_mode((240,180)) pygame.display.set_caption("My Game") font=pygame.font.SysFont('Calibri',25,True,False) clock = pygame.time.Clock() posRect= [120-10, 90+10, 20, 20] posRect0= [120-5, 90+5, 10, 10] x=0 y=0 x0=0 y0=0 score=0 timeRemain=600 try: j = pygame.joystick.Joystick(0) j.init() print( 'Joystickの名称: ' + j.get_name()) print( 'ボタン数 : ' + str(j.get_numbuttons())) except pygame.error: print('Joystickが見つかりませんでした。') done = False while not done: screen.fill((255,255,255)) for event in pygame.event.get(): if event.type == pygame.QUIT: done = True if event.type == pygame.JOYAXISMOTION: u , v = j.get_axis(0), j.get_axis(1) if int(u*10)+int(v*10) != 0: x= x + int(u*10) y= y + int(v*10) if x > 100: x= 100 if x < -100: x= -100 if y > 80: y= 80 if y < -80: y= -80 posRect= [120-10+x, 90-10+y, 20, 20] r= numpy.random.rand(2) speed= 0.5 x0= x0 + int(r[0]*20-10)*speed y0= y0 + int(r[1]*20-10)*speed if x0 > 100: x0= 100 if x0 < -100: x0= -100 if y0 > 80: y0= 80 if y0 < -80: y0= -80 posRect0= [120-5+x0, 90-5+y0, 10, 10] if (x0 - x)**2 + (y0 - y)**2 < 150: score= score + 1 pygame.draw.rect(screen, (255,0,0), posRect, 2) pygame.draw.rect(screen, (0,0,255), posRect0, 2) timeRemain= timeRemain - 1 text= font.render(str(score)+' '+str(timeRemain),True,(0,0,0)) screen.blit(text,[0,0]) pygame.display.flip() if timeRemain == 0: pygame.time.wait(10000) done = True clock.tick(10) pygame.quit()
参考にしたページ
Joystickの入力を取得する - 強火で進め
Program Arcade Games With Python And Pygame Chapter 5: Introduction to Graphics
これが万能の指数の底 の由来。(Jakob Bernoulliのアイディア)桁を一つ増やす操作で1にどんどん近づくから、指数の底は正の数。
まずはじめに京大の説明に抗議したい。説明資料*1に曰く:
従って、耳の動作原理を理解している解答者が、「音波の強弱は圧力変化の大小を意味している」と考えることは自然である。ただし…
とあるが、なぜ
だから天下の秀才を集めるる京大としては、これを理解しているレベルの学生を取ります。だからこの点では出題ミスにはあたりません
という論理ではないのか?
以下の計算をした結果、持った感想はこうだ:
「いえ、奴はとんでもないものを盗んでいきました」
「…?」
「物理学のココロです」
京大の出題ミスに対するリリース資料の中に「マイクロフォンには、変位 (速度) を検出するタイプのものも存在する」という記述がある*2。そしてこれが「出題ミス」の根拠となっている*3。これはよしだひろゆき氏の資料*4を下敷きにしたのではないかと考えられる。あらきは寡聞にしてそんなマイクロフォンの存在を知らない(検索してもなかなか見つからない)。そこで変位の大きさを具体的に求めてみて、どんな振動をするのか調べてみた。データの参照は可能な限りわざと Wikipedia を参照する。
まず「音の大きさ」を60dBとする。この大きさは環境庁の騒音基準*5において「相当数の住居と併せて商業、工業等の用に供される地域」の昼間の騒音の基準値である。目安としては「静かな乗用車, 普通の会話, 洗濯機(1m), 掃除機(1m)」*6とある。まずdBをPaに換算する。音圧の定義*7より、である。ここで
は人間の最小可聴値*8
である。これを解いてとなる。*9
次に0度C, 1気圧の乾いた空気の密度は*10, 音速は*11であるから、変位の空間微分*12はとなる。
ここで聞いている「音の高さ」を440Hzに設定する。この音はラジオの時報の音として誰もが知るピッチの音である*13。この音の波長はである。この値を用いて変位を概算するととなる。つまり
60dB, 440Hzの音の変位の大きさは0.1ミクロン程度(ちなみに大腸菌の短軸が0.4~0.7μmくらい*14*15)
ということだ。
60dB程度の音響の場で100nmのオーダーの流体の振動を(もちろん流れを測るのだからマイクロフォンのカバー無しで流体中に直接に晒して)捉えられるダイアフラムを持ったマイクロフォンをご存知の方はあらきにご連絡を!*16
さらに計算を進める。変位を基にして速度の大きさを求めてみる。となる。この値を基に、(熱力学的な圧力ではなく)空気の変位に基づく力(全圧=ゲージ圧+動圧の動圧の部分)大きさのオーダーを評価してみる。
この値を安直に解釈すると
60dB程度の音による変位の振幅に基づいた「音の大きさ」は、ヒトの可聴最小音の1万分の1くらい(およそ-40dBくらい)
となる。「定在波の変位の腹の音」が「聞こえる」とは到底思えない。なぜこんな屁理屈を「出題ミス」の要因として持ち出すのか?*17
高校物理の範囲ならむしろ「開管の共鳴」を持ち出すべきではないのか?「開管の共鳴」には次の特徴がある:
- 「入射波」「反射波」がある(だから定在波が立っている。しかも音の反射に「固い物質」は必ずしも要らない例になっている)
- 管に関して音源と反対側に音が伝わる(これは「壁の向こうに音が伝わる」問題設定と一貫している)
したがって問題の状況は「開管の共鳴」とのアナロジーを取れるから「圧力に関して固定端反射」という推論をやれるだけの材料が高校物理にあるし、京大が欲しい学生はこういう推論もできる(だから何の「固定端」かで迷う)人ではないだろうかとも思う。
私は音響は素人であり、先のエントリを見てもわかるようにおバカなので、みなさまの御叱正を賜りたい。
*1:http://www.kyoto-u.ac.jp/ja/admissions/events_news/office/kyoiku-suishin-gakusei-shien/nyushi-kikaku/news/2017/documents/180201_2/04.pdf
*2:京大, ibid.
*3:ちなみに「開管の共鳴」を高校で教えていることをすっかり忘れて、卵と壁?あるいは京大の音波の問題を解いてみた - あらきけいすけのメモ帳というお間抜けなエントリを書いたあらきは、現在、「京大の問題は、壁の反射条件が一意に決まらないので、出題ミスだった(だから京大の「ミスへの理屈」はダメだが、「対処」は正当である)」という意見に変わっている。反射条件の話はそのうちエントリを書きたい。
*4:https://www.dropbox.com/s/qf5ps8v23nccr96/resume.pdf?dl=0
*6:騒音値の基準と目安 | 騒音調査・測定・解析のソーチョー
*9:ちなみに大気圧はおよそなので音の圧力は約0.0000002気圧である。
*12:Sound pressure - Wikipedia
*15:[2018.3.6追記]大気圧程度だと平均自由行程が68nm(平均自由行程 - Wikipedia)なので、音の変位の大きさは分子運動が「見える」サイズ、すなわち連続体(分子運動の平均値)としての流体の変位を測りたくても、個別の分子の運動の平均値と揺らぎが見えてしまい、瞬間の「変位」は確定できないのではないか?
*16:[2018.3.8追記]そもそも論として、流体の「変位」「速度」「加速度」を考えると、加速度は「流体のぶつかった相手(例えばダイヤフラムや圧電素子)」にかかった力(音圧)の反作用として測れる。速度は熱線流速計 microflown で測れる(丁寧で親切なコメントに感謝!)。変位は流体の位置を測らねばならないから、連続体としての流体の動きに追随する何か(追跡用の粒子など)を観測しないと測れないのでは?だから「100nm程度の変位を測るためのマイク」というものをなかなか想像できないのである。
*17:あらきは吉田氏には「マイクロフォンの実在」に関する挙証責任があり、それを未だ果たしてはいないと考えている。
どういう理路で説明するんだろう?
そもそも論としては「点音源近似が破綻する音源近傍の振る舞いを問うてしまった」というところなのだが(いま「固定端反射」は問題になっていないと予想している)、何を「正解」とし、何をその根拠として説明するかを知りたい。先の僕のエントリは「点音源近似が音源近傍で破綻することに目をつぶって、速度ポテンシャル(あるいは圧力)の分布を用いた位相差当てゲームを音源まで拡張できれば解ける」という主張であった。
もし京大の理路が「音源の近傍で「変位」の「腹」があることも考えられる」というものであったら、その根拠となる実験事実が示されない限り、納得しないだろう。というのも、音波を「保存系」「圧縮性で渦無しの流体」「音波は線形近似」で考え、ベルヌーイの定理の保存量の各項を評価すると*1、線形近似という前提条件からとなって、速度の振幅のピークを圧力のノイズの影響を受けずに(理屈の上ではの「節」ではあるが)計測するのは無理じゃないかと思うのだ。つまり理屈の上では変位の振幅はピークを持つかもしれないが、少なくとも「教室でもできそうな実験」の範囲でこの「変位の振幅最大に伴う音」を検出するのは無理ではないかと思うのだ。
会見の詳報を待ちたい。
*1:[2018.2.3]速度ポテンシャルの項の質量密度の見落としを修正。kamokaneyoshiさま、ご指摘ありがとうございます。