Raspberry Pi(ラズペリーパイ)を使い、組み込みソフトウェアを理解するシリーズ第2回。
ラズパイにLEDを繋ぎ、python(パイソン)で書いたプログラムでLEDを点灯・消灯させてみます。通称「Lチカ」と呼ばれているようです。
ラズパイ、初めてpython使ってみた
お勉強用のお手軽さは認めるが、何かコレジャナイ感が強い pic.twitter.com/QbZvU7kXjB— Initial JJ (@initial_jj) 2020年9月9日
今回はプログラムと制御するハードウェアの説明、また、プログラミング言語について基礎知識が深まるよう説明を進めます。
序章はコチラ。
www.initial-jj.com
Linuxや組み込みソフトウェアで遊んでみたい方は、下記キットがオススメです。
プログラミング言語について
プログラミング言語は多種多様あります。BASIC, C, C++, Java, Perl, Ruby, COBOL, FORTLAN, Pascal etc.
その中でpythonという言語があります。
プログラム作成方式には大きく2種類あり、インタープリタ型とコンパイラ型に分類されます。
コンピュータを動かすプログラムは、最終的には「0と1」の組み合わせで表現され、これをマシン語(機械語)と言います。
ですが、人間が最初から「0と1」を組み合わせたマシン語を書く事は不可能です。
余談ですが、80年代前半はCPUも処理も今よりも簡単だった為、プログラムを書かずに直接マシン語を書ける人もいました。特殊技能ですが。
そこで、人間が理解できるプログラミング言語が次々と開発され、これらの書式に則りプログラムを書き、コンピュータ(CPU)が理解できるマシン語に変換、実行させます。
今回紹介するpythonは、インタープリタ型のプログラミング言語です。
インタープリタ型とは
インタープリタ型とは、コンピュータがプログラムを逐次解釈しながら実行する方式の事です。
インタープリタはソースコードの1行目から順に、CPUが理解できる形式に変換しながらプログラムを実行します。
従って、仮に100行のソースコードを書いたとしてその80行目にエラーが存在した場合、79行目まで処理が進みますが、80行目でエラーが発生してプログラムの実行は終了します。
インタープリタ型のメリットは、プログラムが完成していなくても実行できる点です。
デメリットは、逐次解釈する為、処理速度が遅い事です。
例えば3Dゲームは非常に複雑な演算をしています。視点、光源設定、テクスチャマッピング等、オブジェクトを描画する為に高度な演算を繰り返してリアルな画像を描画しています。このようなプログラムを1行ずつ解釈して実行した場合、処理が遅い為にスムースに表示できず、画面がカクついてゲームになりません。
高速処理を求められるソフトウェアや、ハードウェアの性能を引き出すソフトウェアは、後述のコンパイラ型でプログラム作成されます。
コンパイラ型とは
コンパイラと呼ばれるツールがソースコードを翻訳し、コンピュータが実行できる形式(実行ファイル)を生成する方式です。
コンパイラにソースコードを読ませると、マシン語に近いアセンブリ言語に変換されます。
次に、アセンブラというツールがアセンブリ言語を翻訳し、オブジェクト・ファイルを生成します。
最後に、リンカーというツールがオブジェクト・ファイルを結合して、実行形式ファイルを生成します。
コンパイラ型のメリットは、実行ファイルが高速動作する点です。
デメリットは、全てのソースコードからエラーが無くなるまでプログラムを実行できない事です。途中まで作ったから、そこまでのテストをしよう、という事はできません。
プログラム説明
ソースコード
# filename : lblink.py import RPi.GPIO as GPIO import time GPIO.setmode( GPIO.BCM ) GPIO.setup( 2, GPIO.OUT ) for x in xrange( 5 ): GPIO.output( 2, True ) time.sleep( 0.5 ) GPIO.output( 2, False ) time.sleep( 0.5 ) GPIO.cleanup()
プログラムの説明
GPIO(General Purpose Input/Output)の略で「汎用入出力」というピンを制御します。
プログラムの内容は、
- GPIO 2pinを出力設定にする (GPIO.setup())
- GPIO 2pin の出力ON(HI出力)してLEDを点灯
- 0.5秒ウェイト(sleep)
- GPIO 2pin の出力をOFF(LO出力)してLEDを消灯
- 0.5秒ウェイト(sleep)
- 上記を5回繰り返す (for x in xrange( 5 ))
となっています。
プログラムを全く知らない方でも、何となくわかって頂けるのではないかと思います。
pythonはライブラリが豊富に揃っているのでimport で使いたい機能を宣言し、あとは用意されているAPIを使うだけです。
これがpythonの気軽さであり、学習用と言われる所以です。
今回はGPIO 2pinを使いました。
GPIOの仕様(=説明書)を理解しないと制御ができないので、多少は調べる必要があります。
ここにラズパイのGPIO仕様がありました。
GPIO – Raspberry Pi Documentation より
LEDを駆動するだけなので、電圧は3.3V pinから取ればOKです。抵抗は470Ωを繋いでいます。
抵抗無しでもLEDは点灯しますが、電流が流れすぎるとLED寿命が縮まるので、電流値を下げる為に挟んでいます。
GPIOは何番pinを使っても構いませんが、今回は2番pinを使いました。
わかりにくいですが、白を2番pin、黒をGND(グランド)と接続しています。
2pinは GPIO2(SDA)と書かれています。
これは、汎用入出力pin以外にハードウェアが持っている機能の1つ、SDAの端子として使えるpinである事を意味しています。
SDAとはI2C通信(「アイスクエアシー」や「アイツーシー」と読む)に使う信号線の1本です。
Fritzingという回路図作成ツールを使い、配線を図示しましたので参考にして下さい。
GPIOについては次回詳細説明をする予定ですが、制御仕様(データシート)はラズパイ公式サイトから入手できます。
https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/BCM2835-ARM-Peripherals.pdf
(Raspberry Pi Documentation より)
pythonでプログラミングする場合、GPIO制御もライブラリが用意されているので、データシートを読む必要は無く、GPIO出力pin配置だけ調べればプログラムが書けます。プログラミングの楽しさを知るには丁度良い言語だと思います。
そして、これが前回の序文で話したソフトウェアの「上位側」にあたるプログラムです。
デバイスの制御はGPIO.*() という命令文を使うだけでできてしまいます。デバイスの制御方法を知らなくても数行のソースコードでLチカを実現できます。
プログラムの実行方法
ターミナルでpythonを実行。
$ python lblink.py
プログラムの実行結果
ラズパイ、初めてpython使ってみた
お勉強用のお手軽さは認めるが、何かコレジャナイ感が強い pic.twitter.com/QbZvU7kXjB— Initial JJ (@initial_jj) 2020年9月9日
次回は、LチカをC言語で実装してみようと思います。
C言語で書く場合、データシートを理解しないと実装できません。ライブラリの使用は最低限に抑え、どのようにデバイス制御を行うのかにフォーカスを当てたいと思います。
ご覧いただき、ありがとうございました。
ランキングに参加しています。ポチッと押して去って頂けると、私のビビリ症が治る気がします。
にほんブログ村
人気ブログランキング
コメント