ごきげんよう、ちゃまおです。
前回の記事の最後に予告した通り、今回からRaspberry Pi Picoの-getting started-を使って色々解説したいと思います。
用意するもの
-
Raspberry Pi Pico
これが無いと何も始められません。 -
プログラミング環境
Raspberry Pi公式としては、(当たり前ですが)Raspberry Piが良いみたいです。
私は、Windows10搭載のノートパソコンを用意しました。 -
USBケーブル
Raspberry Pi Pico側にMicro USB Type Bが必要です。USBのバージョンは1.1をサポートしています。100均の物でも問題ありませんが、通信機能付きが必要です(私自身、電子工作を始めた頃は、充電専用と、通信機能付きの2種類のUSBが存在している事を知りませんでした)。
(注)Raspberry Pi Picoのデータシートp.10によると、最大5.5Vの入力電圧までは大丈夫なので、パソコンのUSBポートとRaspberry Pi Picoを接続する事は可能です。ただし、お使いのパソコンによっては5.5V以上出ている可能性があり、それによる機器の破損等は自己責任でお願いします。
Raspberry Pi Picoがサポートしているプログラミング言語と、この記事で扱う言語
Raspberry Pi Picoは、C/C++とMicro Pythonでプログラミング開発を行う為のSDK(Software Development Kit)が用意されています。
私は普段からC言語を使っている為、この記事で扱う言語は、基本的にはC言語とします(Pythonは多少読めるので、もしかしたら解説するかも知れません)。
Raspberry Pi PicoでLチカ
前置きが長くなりましたが、早速1つプログラムを動かしてみましょう!
今回は、Lチカを行います。Lチカとは「LEDをチカチカ光らせる」の略称で、電子工作の基本にはおすすめです。
ちなみに、余談ですが、LEDには極性(プラスとマイナス)があって、間違った接続をするとLEDが爆発します…非常に危ないです…私はトラウマになりました。
これから行うLチカは、既にRaspberry Pi Picoに埋め込まれているLEDを、USB経由で送られたプログラムで光らせる為、非常に安全です。以下、Lチカまでの手順です。
-
Raspberry Pi Picoの-getting started-の「Getting Started C/C++ Blink an LED」のページを探します(パソコンからだとリンク先でタブになっているかと思います)。
-
「Download UF2 file」をクリックして、UF2ファイルをパソコンにダウンロードします。Raspberry Pi Picoで何かしらのプログラムを動かす時は、拡張子が".uf2"となっている必要があります。
-
Raspberry Pi Picoのスイッチ(近くにBOOTSELと書かれています)を押しながら、パソコンとUSB接続します。既に何かしらのプログラムを入れている場合、そのプログラムは消えてしまうので、必要に応じてパソコンに残しておくのが良いです。
-
ダウンロードしたUF2ファイルを、Raspberry Pi Picoのフォルダにコピー&ペースト(あるいは、ドラッグ&ドロップ)します。
以上の手順を行って、Raspberry Pi Picoがチカチカ光れば成功です。公式のGetting startedのページには分かりやすいアニメーションが載っていますので、間違える事は無いかなと思います。
Lチカのソースコード
GitHubで公開されているソースコードは、以下の通りです。
/**
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "pico/stdlib.h"
int main() {
const uint LED_PIN = 25;
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
while (true) {
gpio_put(LED_PIN, 1);
sleep_ms(250);
gpio_put(LED_PIN, 0);
sleep_ms(250);
}
}
プログラミング初心者の方だと、意味不明な文字の羅列にしか見えないと思いますので、なるべく丁寧に解説していきます。深い事を考えず、「ふーん、そうなんだ」くらいの軽い気持ちで読んで頂くのが良いと思います。
Lチカのソースコード解説
ソースコードの中身を詳しく解説する前に、最も単純化したC言語の基本構造をお見せします。
#include <"ヘッダファイル名">
int main(){
hogehoge;
}
最初の行で、ヘッダファイルと呼ばれるファイルを読み込む(#includeする)事が大切です。ヘッダファイルは拡張子が".h"となっており、「プログラミングに必要な機能を呼び出すよ」と言う役割をしています。
Lチカプログラムの場合#include "pico/stdlib.h"
となっており、"pico/stdlib.h"
と言う名前のヘッダファイルを読み込んでいます。ちなみに、C言語に標準として用意されているヘッダファイルを読み込む時は、ヘッダファイル名を<>で囲みます(例えば```#include```)が、自作のヘッダファイルを読み込む時は囲みません。
int main(){}
の部分は、メイン関数と呼ばれており、名前の通り、メインとなるソースコードを記述していきます。メイン関数の中身をhogehoge;
としましたが、これは技術系・情報系の記事で割とよく見る書き方で、「適当な内容を書いてね」と言う意味です。
メイン関数の中の最初に出てくるconst uint LED_PIN = 25;
は、「Raspberry Pi Picoに搭載されているGPIOピン25番をLED_PINと言う名前で定義するよ」と言う意味です。Raspberry Pi Picoには、GPIO (General Purpose Input Output)ピンと呼ばれるピンがあって、センサー等と接続する事で、Raspberry Pi Picoから制御が出来ます。ピンの番号と役割は、Raspberry Pi Picoのデータシートp.5に記載されており、LEDの所に"GP25"が割り振られています。
ソースコードに戻りますが、先程の部分を一般化すると、const 型名 変数名 = 変数の値;
となります。通常、変数は値が変わるものですが、constを付ける事によって、値の変わらない(変えられない)定数として扱う事が出来ます。今回の場合、LEDのGPIOピンは固定されているのでconstを使っているのだと思います。また、変数名の前には、使用する変数の値に対応した型を定義する必要があります。C言語の場合、整数値を使うならint型、小数点も使いたいならfloat型やdouble型が代表的です。今回の場合、uint型が使われていますが、マイナスも含めた整数値を使いたいならint型、プラスのみの整数値を使いたいならuint型だと思ってもらって大丈夫です。(参考)データ型の範囲。
続いて、gpio_init(LED_PIN);
とgpio_set_dir(LED_PIN, GPIO_OUT);
の説明をします。
それぞれRaspberry Pi PicoのC/C++ SDKのp.107とp.109に使い方が書かれていますが、ざっくり言うと
gpio_init(LED_PIN);
は「LED_PINを初期化するよ」と言う意味です。
gpio_set_dir(LED_PIN, GPIO_OUT);
は...すみません、十分に理解できていませんが、構造としてはgpio_set_dir(GPIOの番号, 論理の出力);
となっていて、「論理の出力は、outならtrue, inならfalseを返す」ようになっています。GPIOピンを使って電子工作をするときは、GPIOピンを入力(In)として使うのか、出力(Out)として使うのかを定める必要があり、今回の場合は「25番のGPIOビンをOutとして使うからtrueを返す」と言う意味だと私は理解しました。
さて、最後はちょっと長めのコードになっていますね。
while (true) {
gpio_put(LED_PIN, 1);
sleep_ms(250);
gpio_put(LED_PIN, 0);
sleep_ms(250);
}
これは繰り返し文(while文)と呼ばれていて、一般化すると以下のようになります。
while (条件) {
hogehoge;
}
ある(条件)を満たしている間、hogehoge;
を繰り返し実行すると言う意味です。
今回の場合、(条件)としては、「論理がTrue」になります。0 or 1でも良いのですが、True or Falseで論理表現する事はプログラミングあるあるかなーと思います。
while文の中身は4行ですが、前半2行と後半2行はgpio_put
の中の数字が違うだけで、基本構造は同じです。gpio_put(LED_PIN, 1)
に関しては、Raspberry Pi PicoのC/C++ SDKのp.108に使い方が書かれていますが、「LED_PINをhighにするよ」と言う意味です。もっと分かりやすく言うと、「LEDが接続されているGPIOピンのスイッチONにしてLED光らせるよ」と言う意味です。
逆に、gpio_put(LED_PIN, 0)
は「LEDが接続されているGPIOピンのスイッチOFFにしてLED消すよ」と言う意味です。このコードがある事により、物理的なスイッチをつけなくてもLEDの制御が出来ます。
sleep_ms(250)
に関しては、Raspberry Pi PicoのC/C++ SDKのp.205に使い方が書かれていますが、「250ms待つよ」と言う意味です。sleep_ms(1000)
とすれば1000ms、すなわち、1秒の待ち時間が発生します。この待ち時間があってLEPを光らせたり消したりしているので、LEDがチカチカしているように見えます。
解説は以上となります、お疲れ様でした。
次回予告
次回もRaspberry Pi Picoの-getting started-に載っている例を使って解説したいと思います。