HOME  >>  LED電子工作集 > R-3 AD変換とSPI通信

R-3 AD変換とSPI通信

■ はじめに

 今、RaspberryPiに挑戦している。 Windows10 とファイルのやり取りを容易化するため、今回はファイルサーバーをインストールした。 そしてAD変換とSPI通信の演習も実施した。 尚、今回から見出しに使用してきた「テスト」と言う言葉を、「演習」という言葉に変更しました。 この方がしっくり行くと考えたからです。

 

■ 演習5: ファイルサーバーの設定

 これまでは、Windows10 とファイルのやり取りをUBSメモリを使用して実施していた。 問題無く実施出来ていたが、ラズパイからUBSメモリを取り出す時に、いつも「正式な手続きを踏んでください」とのメッセージが出ていた。 そこでネットに記されていたコマンド命令で実施するも失敗ばかりであった。 そこで、ファイル共有のために、ファイルサーバーを設定することにした。

 我が教則本ではラズパイとPCの連携は、WwbIOPi を使用している様子です。 これは第9章で勉強予定ですが、ネットワーク構成図によると、Webサーバーとしての機能を待たせるようです。 ファイルサーバーとWebサーバーの機能の違いは理解できますので、ファイルサーバー機能を持たせることにしました。

 とはいっても、その方法をネットで検索した結果、ツール・ラボさんの記事にその方法が記載されていましたので、この方法を試してみることにしました。 詳しくは、「第14回 Raspberry Piのファイルサーバ設定をする」 を参照ください。 使用するファイルサーバーソフトは、「Samba」というパッケージです。 この方の説明は丁寧でしたので、その通りに実施した結果は、問題無くファイルサーバーを設定することが出来ました。

 なお、自分のネットワークは、パソコン台の上方に光通信用端末と電話用端末を置いてあり、この光通信用端末に Wi-Fi ルータを接続しています。 そしてこのルータを介して有線配線によりパソコンと接続し、ラズパイやスマホは、この Wi-Fi ルータを介して接続しています。 下左の写真。 

     

 ファイルサーバーソフトSamba を設定後の、Windows10 のエクスプローラの外面の一部を右上に示す。 ドライブZにラズパイの pi フォルダが表示されていることが分かります。 このフォルダの中身を下に示す。

 ラズパイのファイルにアクセスできるようになったので、ここからコピー&ペーストでファイルの交換が実施できます。 ただし、テキストファイルの場合、Linux 系のファイル記述が一部異なっているとのことですので、テキストファイルは、メモ帳ではなくてワードパットで開く様にしています。 この報告書のプログラムファイルの記述内容は、こうして転記しています。

 

■ 演習6: AD変換とSPI通信の演習

 教則本の6章ではAD変換によるアナログ値の利用として説明されています。 ラズパイにはアナログ入力端子が無いので、アナログ値を扱う場合には、ADコンバータを使用してアナログ値をデジタル値に変更し、ラズパイ本体にはシリアル通信を使って取り込む必要があります。

 教則本にならって、ADコンバータとして16ピンを持つ12ビットADコンバータ MCP3208-CI/Pを使用した。 このコンバータは8チャンネルのAD変換チャネルを待ち、12ビット即ち 4096 までのデジタルまで変換できる豪勢なコンバータなのである。 Arduino では 1024 までしか対応していなかったので、4倍の精度のAD変換が出来ることになります。 さて、その使い道は?

 また、シリアル通信は3線式のSPI通信を使用していますので、この通信手段の演習にもなっています。

********** 省略 *******************
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
  if adcnum > 7 or adcnum < 0:
  *****  実装部は省略 *********

GPIO.setmode(GPIO.BCM)
SPICLK = 11
SPIMOSI = 10
SPIMISO = 9
SPICS = 8
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICS, GPIO.OUT)

try:
 while True:
  inputVal0 = readadc(0, SPICLK, SPIMOSI, SPIMISO, SPICS)
   print(inputVal0)
   sleep(0.2)
************* 省略 *******************************

 また、回路図について今後のために作成しておくことにした。 ライブラリーにはラズパイや MCP3208-CI/P が無かったのでこれも新しく作成した。 下の図を参照ください。 回路には 6.4 項のフォトレジスタを用いた回路も組み込んでいます。

 回路をブレッドボードに組んだ状態を下左に示す。 ラズパイの40本もあるピンの位置は、基盤に記号が記されていないので、いちいち位置を数えていく必要がありました。 そこで紙をピンに突き刺してその紙に記号を書き込んでおきました。 下右の写真。

 さて、プログラムですが、その要点を右上に示す。 GPIO 8 〜 11 までのピンはSPI 通信に使用するもので、その初期設定を実施しています。 プルグラムの本体部分は、関数 readadc を実行してそれをプリントアウトするだけの簡単なものです。 また、関数 readadc を定義している部分は、いろいろなコマンドを使って、シリアル通信で送られてきたビットデータを切り出して、目的のデータを取り出すように記述されているようです。

 しかし、初心者には、まだこの実装部分を理解する必要は無いので、そのまま信じて記述しておきなさいと教則本の著者は述べており、内容の説明もありませんでした。 このため、小生も手抜きしております。

>>> ========================= RESTART ============================
>>> 
Warning (from warnings module):
  File "/home/pi/06-01-print.py", line 43
    GPIO.setup(SPICLK, GPIO.OUT)
RuntimeWarning: This channel is already in use, continuing anyway.
 Use GPIO.setwarnings(False) to disable warnings.
*********** 以下省略 ************

 さて、プログラムを実行させると、問題無く走っていましたが、右に示す様に何やら警告が出ていました。 SPI用として指定した4本のピンは既に使われているのだと言うのです。

 そこで、再起動してコマンドにて、$ gpio readall を実行しピンのモードを調べてみると、「 ALT0 」 状態であると言ってきました。 何ですかねこれは? ネットにて探しましたが、どこにもその説明らしきものを見つける事ができませんでしたので、この警告を無視することにしました。

 

********** 省略 *******************
try:
    while True:
        inputVal0 = readadc(0, SPICLK, SPIMOSI, SPIMISO, SPICS)
        inputVal1 = readadc(1, SPICLK, SPIMOSI, SPIMISO, SPICS)
        print(inputVal0)
        print(inputVal1)
        if inputVal1 < inputVal0:
            GPIO.output(LED, GPIO.HIGH)
        else:
            GPIO.output(LED, GPIO.LOW)
        sleep(0.5)
************* 省略 ******************

■ 演習7: フォトレジスタを用いる

 次に6.4 項の「フォトレジスタを用いた回路」を実施する。 そのままでは面白くないので、可変抵抗値との比較でLEDを点滅させるkとにした。 プログラムを右に示す。

 

  ****************  続く  **************************