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の値を返す
------------------------------------------------------------------------