ラズパイでビットフィールドを練習しよう!

スポンサーリンク

こんにちは!駆け出しエンジニアのまっきーです。

前回、ビットフィールドについて解説を行いました。そこで今回は実際にビットフィールドを利用して、LEDとスイッチの制御を行います。

前回の記事はこちら

目標

タクタルスイッチを押すとLEDが光るプログラムを作成する。(ビットフィールドを利用)

使用するもの

  • RaspberryPi3B+
  • 赤色LED
  • タクタルスイッチ
  • 抵抗(今回は1kΩを使用します)

スイッチなどの部品はこちらに付属していたものです。

*スイッチが5つしか入っていませんので注意してください。

回路図

上の表のように、スイッチとLEDを対応付けます。

ビットフィールド復習

前回、共用体とビットフィールドを使うことで、ビットまたはバイト単位でデータを操作できるということを学びました。詳しくはこちらの記事を参照してください

共用体とビットフィールドの定義はこのように簡潔に行うことができます。

このビットフィールドのビット、バイトのアクセス方法はこのようにできます。

・ ビット: SW.BIT.B0 SW0 のビット参照。
・ バイト: SW.BYTE SW0 から SW7 のバイト参照。

ソースコード1

著者のソースコードを参考にして記述しました。しかし、うまくいきませんでした。

そこで、79行目のようにデバッグをしてみると、

スイッチをいくら押しても反応することはありませんでした。

ビットフィールドはコンパイラによってメモリ割り付けの順序が変わります。これが原因かもと思ったのですが、どのビットも1がたたなかったので違います。

そこで、プルアップ抵抗(PUD_UP)にしてみたところ

スイッチを押すことによって反応することが確かめられました。

プルアップ抵抗(負論理)のバージョンにして書き直してみます。

ソースコード2

このコードで点灯させることができました。

ソースコード解説

・Sw8bit()関数

変数kに読み取ったスイッチの状態(0or1)を代入しています。

for文を使って、最上位ビットのsw[7]からSW.BYTEに格納しています。

イメージとしては下のような感じです。

・無限ループの中身

Sw8bit()関数を呼び出し、SWビットの状態をLEDのビットに代入しています。

負論理にしたのですこし計算がややこしくなっています。(LEDは1で点灯、0で消灯のため)

論理演算ですが、実際に適当な値を当てはめてみると考えやすいです!

まとめ

ビットフィールドを用いてLEDの点灯消灯を行いました。

確実にこの時のようにシンプルに実装した方がわかりやすいですね。ビットフィールドについては、ここまで実装できればもう問題なく使えると思います。

先ほども少し書きましたが、ビットフィールドのメモリ割り付けはコンパイラに依存しますので移植性があまり高くありません。このような理由からあまり使われていないようです。

今回は以上です。ありがとうございました!

参考サイトはこちら 参考書籍「C言語ではじめる」 RaspberryPi  徹底入門」

タイトルとURLをコピーしました