質問: readAdc(ch) #chの値を上記の関数で数値に変換 print(data1) #値の表示 time.sleep(0.5) #0.5秒に1回データを計測する. 以下の2点がただいま詰まっているところです。 ・spi.xfer2()とはどういう意味なのか、また引数を3つとっているがそれぞれのどういう役割なのか ・8+channelとは何なのか、なぜ4bitシフトさせるのか 10bit 8ch ADコンバータ「MCP3008」を使用しています。 ご教授お願いいたします。
回答: XxkanakoxXさん、 まず、SPI通信の確認 Wikipediaの説明から、 マスターとスレイブがあって、マスターは、クロック(SCLK)の生成ととスレーブセレクト(SS)をLOWにしてデバイスを選択、 * MISO (MasterInSlaveOut マスター入力 スレーブ出力) * MOSI (MasterOutSlaveIn マスター出力 スレーブ入力) の2つのピンで同時に通信を行います。 次に、MCP3008のデータシートでデータのやり取りの仕方を見ます。英語ですが. page 18のFigure 6-1の図がこのチップでの通信のやりかたで、3バイトで通信を行います。 D_INがMCP3008への入力で、D_OUTが、MCP3008からの出力です。 D_INに送るデータですが、 * 1バイト目: 8bit目にStartの1を送るので、 0x01 を入力します。 * 2バイト目: SGL/DIFFは、Single-End-Input(1) か pseudo-differential input(0)のモード選択ですが、GNDとCH間を測るでしょうから、=1で D2/D1/D0で、Ch番号の指定、下位4ビットは、XXXXとなってて、特に指定なしです。 なので、(( (1<<3) + Ch ) << 4) が、2バイトの入力. [ (1<<3) => 8 です。 ] * 3バイト目: MCPからの出力を受け取るだけなので、0 としています。(これをいれないと、SCLKが作られないので.) 同様に、D_OUT側ですが、2バイト目の下位2ビットと、3バイト目で、10ビットのデータになる、とのことで、 ((adc[1] & 3) << 8) + adc[2]) となります。 その次、pythonのspidevをみます。下の方にChip-Selectの制御の違いがかいてありますね。 > > - xfer(list of values[, speed_hz, delay_usec, bits_per_word]) > > Performs an SPI transaction. Chip-select should be released and reactivated between blocks. Delay specifies the delay in usec between blocks. > > > - xfer2(list of values[, speed_hz, delay_usec, bits_per_word]) > > Performs an SPI transaction. Chip-select should be held active between blocks. > > > で、質問の件ですが、 > > ・spi.xfer2()とはどういう意味なのか、 > > > ↑の説明にかいてあるとおりのCS(=SS)制御の仕方で通信する関数。 > > また引数を3つとっているがそれぞれのどういう役割なのか > > > 引数はリスト1つ。で、MCP3008との通信に必要な3バイト分が入ってます。 > > ・8+channelとは何なのか、なぜ4bitシフトさせるのか > > > ↑で説明したとおり、MCP3008の通信仕様、ですね。 追記: XxkanakoxXさん、 `((SGL_DIFF << 3) | ((D2<<2) | (D1 << 1) | D0) ) << 4` * `SGL_DIFF = 1` * `((D2<<2) | (D1 << 1) | D0)` => Channel番号 で、どうでしょう? データシートの図と見比べてみてください