RasPi  Desk

C言語でLED調光制御する

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


C言語でLEDの調光制御をプログラムする

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

*RasPi5のSPIインターフェースを有効にすること。
 → SPIモード切り替えページへ

 一度でうまくいかないときは再度モード切替の操作を行う必要がある

 ------------------------------------------------------------------------
 RasPi5ではgccコンパイラを使用する。
 GPIOを操作するライブラリとして lgpio を使用するので予めインストールしておくこと
 このライブラリを使用することによりSPIインターフェースなどの細かい制御が予め関数化
 されているのでC言語のプログラムでは関数を呼び出すだけでSPIを使用できる

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

<サンプルプログラムの動作手順>
  (続にいうフローチャートを文書化したもの)
 ------------------------------------------------------------------------
1.C言語のプログラムで使用するヘッダー類を記述する
 ・stdio.h stdlib.h lgpio.h

2.プログラムで使用する定数類を定義する
  SPI_BUS         0 :予め決まっている値
  SPI_SS0         0 :予め決まっている値
  SPI_SPEED       500000 :500khzのクロックで送受信する
  SPI_MODE        0 :予め決まっている値

 ・A/Dコンバータ MCP3008に関する定数定義
  MCP3008_CH0     0  : CH0の入力電圧をデジタル値に変換する

 ・RasPi5のGPIOに関する定数定義
  PI5             4  :Raspberry Pi 5 GPIO Chip no.
  LED0            18 :GPIO18 LEDを接続するピン番号

 ------------------------------------------------------------------------
3.ソース内に記述されている関数のプロトタイプ宣言を行う
  unsigned short Mcp3008RW(int hndAdc, unsigned char adcCh);

 ------------------------------------------------------------------------
4.C言語のプログラムにて最初に実行される関数main()を記述する
 ・変数定義
  int hndAdc; ADコンバータを扱うハンドル値
  unsigned short adcCode = 0; SPIで送受信するデータ名
  int cnt;   デバッグでAD変換の繰り返し回数を無限ではなく有限にするときの回数
  int hnd;  GPIOを扱うハンドル値
  int lflgOut=0;
  int iduty; LEDの点滅で使用するPWM値

 ・ライブラリlgGpiochipOpen関数にてRasPi5のハンドルを取得する

 ・ライブラリlgGpioClaimOutput関数にてLEDが繋がっているピンと動作形態を指定する

 ・ライブラリlgSpiOpen関数にてSPIの動作形態を指定してハンドルを取得する

 ・以下の処理を繰り返す(サンプルプログラムでは有限の繰り返し回数cntとしている)
   a.関数Mcp3008RW()にてMCP3008のch0に与えられている電圧のデジタル値を取得する
   b.デバッグとして取得した値を表示(2行のprintf())
   c.変数idutyに取得したADCデジタル値(10ビット)を0〜100の値に変換する
   d.ライブラリlgTxPwm関数にてLEDのPWM値を変数idutyに設定(これで明るさが変わる)
   e.ライブラリlguSleep関数にて0.5秒の時間を費やす
   f.繰り返し回数cntを-1する(この行をコメントにすると無限ループになる)

 (繰り返しから抜けてここから下の行を実行する)
 ・ライブラリlgGpioWrite関数にてLEDを消灯する

 ・ライブラリlgGpiochipClose関数にてSPIハンドルを開放する

 ・ライブラリlgSpiClose関数にてRasPi5のGPIOハンドルを開放する

 ・関数を抜けて処理を終了する

 ------------------------------------------------------------------------
5.<関数 Mcp3008RW() >
 ・ADコンバータIC MCP3008からSPIを通じてch0の電圧が変換されたデジタル値を取得する
 ・変数定義
  unsigned short adcCode = 0; MCP3008から取得したデジタル値
  char rxBuf[3]; MCP3008から受信するバッファ 3バイト
  char txBuf[3] = {1,0,0}; MCP3008に送信するバッファ 3バイト
    初期化する値=1バイト目:0x01 2バイト目:0x0 3バイト目:0x0

 ・MCP3008に送信するバッファにMCP3008に送る命令文字を設定
    設定する値=2バイト目:bit7   = ADCモード[single]の1
                bit6〜4= ADchの0

 ・ライブラリlgSpiXfer関数にて送信バッファの値(コマンド)をSPIを使ってMCP3008に送り
  MCP3008から受信バッファにAD変換されたch0のデジタル値を受信する

 ・受信したデジタル値からAD変換の有効値をadcCodeに取得する
  (2バイト目の下2ビットと3バイト目の8ビットで10ビットが有効値)

 ・関数を抜けてadcCodeの値を返す

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