RasPi  Desk

PythonでLED調光制御する

 (詳細は教則本に任せて概要を記述する、実際の操作は教則本:はじめてガイドを参照)


Python(パイソン)でLEDの調光制御をプログラムする

*プログラムを記述するにはテキストエディタが必要になる。
 RasPiのOSにGUIに馴染むいくつかのテキストエディタがあるが教則本にある Geany が
 プログラム開発では使い勝手が良いと思う。

*RasPi5のSPIインターフェースを無効にすること。
 → SPIモード切り替えページへ
 SPIインターフェースの設定が異なっていると以下のようなエラーが表示される


 ------------------------------------------------------------------------
 Pythonで組んだプログラムを簡易に動かす場合、RasPiOSに入っているPythonのインタープリタで
 動かすことになる。インタープリタとはPythonで書かれた命令文を1つずつ解釈しながら実行して
 いく形である。ゆえにインタープリタでは実行速度がC言語で組まれたものより遅くなる。

 サンプルプログラムの概要は、ADコンバータ(アナログ to デジタル変換)チップ、今回は
 MCP3008というICチップにて可変抵抗器(ボリューム)の可変値(電圧)をデジタル変換する
 そのデジタル変換値をRasPi5に取り込んでLEDの点灯するPWM比率に与えることにより
 LEDの明るさを変更する ⇒ 調光制御

<サンプルプログラムの動作手順>
  (続にいうフローチャートを文書化したもの)
 ------------------------------------------------------------------------
1.RasPi5のGPIOに関して使用するGPIOの初期設定を行う
  <関数 setup() >
 ・プログラムで使用するGPIOのピン番号はBCM対応とする
 ・SPIMOSI(SPIで使用するMasterOutSlaveIn)はBCM13で出力モード
 ・SPIMISO(SPIで使用するMasterInSlaveOut)はBCM9で入力モード
 ・SPICLK(クロック)はBCM11で出力モード(シリアルなビットデータを送受する周期信号)
 ・SPICS(ChipSel)はBCM8で出力モード(MCP3008 ADコンバータを使用状態にする)

 ・LED点灯で使用するBCM18は出力モード、最初はLowレベル(0V)にする
 ・LED点灯で使用するBCM18はPWMモードで変調周期は100ヘルツとする
 ・LED点灯端子 BCM18の動作を開始する
 ------------------------------------------------------------------------
2.GPIOを使ってADコンバータからch0の値を読み込む
  <関数 readadc() >
 ・ADコンバータの入力番号(ChNumber)が1〜7以外ならエラー値で戻る
 ・ChipSel端子をHighレベル(3.3V)にする(一度ChipSelを無効値にする)
 ・クロック信号をLowレベルにする
 ・ChipSel端子をLowレベル(0V)にする(ChipSelが有効値になる)

 ・ADコンバータに入力番号0のアナログ値(シングルエンドモード)読み込み命令を作成する
  命令バイト:StartBit + シングルエンドモード + ch0 を作成する
  今回の命令では2進数で 00011000 Hexで18H

 ・命令バイトを実際に送出するビットの並びに整える
  実際に送出する命令は2進数で 11000 の5ビットを頭から直列に送出する

 ・送出する命令ビットを先頭の1ビットずつSPIMOSI端子からクロックと共に送出する
   以下の動作を5回 繰り返す(11000 の5ビットをADコンバータのDinに送り込む)

    a.命令ビットの先頭が1ならSPIMOSI端子をHighにする
     命令ビットの先頭がビットが1ならSPIMOSI端子をLowにする

    b.送出するビットを左に1ビットシフトしておく

    c.クロックをHigh→Lowに変化させる(SPIMOSIの状態をADコンバータのDinから取り込む)

 ・取込データ値を0でクリアする(ここに1ビットずつシフトしながらAD変換値を受け取る)

 ・ADコンバータのDoutから送出されるデータ(ch0のAD値)をクロックと共に受領する
  (MCP3008データシートによるとDoutから12ビットのデータが送り出される)
   無意味な1ビット+Null(0)1ビット+ch0のAD値10ビット = 12ビット
   以下の動作を12回 繰り返す(Doutの状態をSPIMISOからRasPi5に取り込む)

    a.クロックをHigh→Lowに変化させる(ADコンバータのDoutにAD値の先頭ビットが出てくる)

    b.取込データを左に1ビットシフトしておく

    c.SPIMISO端子の状態をrasPi5に読み込む

    d.SPIMISO端子の状態がTrue(High)なら取込データの末尾ビットを1にする

 ・ChipSel端子をHighレベル(3.3V)にする(ChipSelが無効値になる)

 ・取込データを右に1ビットシフトする(Nullビットを取りch0のAD値10ビットを整列させる)

 ・取込データ値を関数の呼び元へ返す

 ------------------------------------------------------------------------
3.メイン処理
  <関数 main() >
 ・以下の処理を強制終了させるまで永遠に繰り返す

    a.readadc()を実行してch0のAD値10ビットを取得する

    b.ch0のAD値10ビットを0〜100の値に変換する

    c.LEDを点灯しているPWM比率に変換値(0〜100)を設定する

    d.時間0.5秒を経過させる

 ------------------------------------------------------------------------
4.異常終了処理
  <関数 destroy() >
 ・LEDのPWM動作を停止する
 ・LEDの点灯端子をLow(0V)にする(LEDを消えた状態にする)
 ・GPIOの終了処理

 ------------------------------------------------------------------------
4.プログラム開始処理
  <__main__>
 ・setup()を実行する
 ・異常処理の定義をする
 ・main()を実行する
 ・異常処理(ctrl+Cなどによる強制終了)の設定
    a.destroy()を実行して異常終了処理にて終了する前にGPIOの整理をする

 →プログラム終了

 ------------------------------------------------------------------------

 上記の処理をPythonで組んだサンプルプログラムを拡張子.pyのテキストファイルで
 保存する(例えば LedTest.py)

 ターミナル画面を開いて以下のコマンドを実行する
  ~$ python LedTest.py

 正常に動作したらターミナル画面に以下の表示が連続して出てくるはずである
  LightSensor ADC =0〜1023(duty:0〜100)

 ボリュームを回すと 0〜1023、0〜100 の値が変化する表示が出てLEDの明るさも
 変わるはずである

*プログラムのページにサンプルプログラムを載せているが あくまで自己責任で
 実行してください。これにより問題が発生しても当方では責任をとることはできません...