ランチにPicoはいかがでしょうか～第1話　Blink an LED～

ごきげんよう、ちゃまおです。

[前回の記事](https://qiita.com/Chamaotaku/items/eae2921efd3f97b9d125)の最後に予告した通り、今回から[Raspberry Pi Picoの-getting started-](https://www.raspberrypi.org/documentation/pico/getting-started/)を使って色々解説したいと思います。

# 用意するもの
- Raspberry Pi Pico
これが無いと何も始められません。

- プログラミング環境
Raspberry Pi公式としては、(当たり前ですが)Raspberry Piが良いみたいです。
私は、Windows10搭載のノートパソコンを用意しました。

- USBケーブル
Raspberry Pi Pico側にMicro USB Type Bが必要です。USBのバージョンは1.1をサポートしています。100均の物でも問題ありませんが、<font color = "red">通信機能付き</font>が必要です(私自身、電子工作を始めた頃は、充電専用と、通信機能付きの2種類のUSBが存在している事を知りませんでした)。
<font color = "red">(注)[Raspberry Pi Picoのデータシート](https://datasheets.raspberrypi.org/pico/pico-datasheet.pdf)p.10によると、最大5.5Vの入力電圧までは大丈夫なので、パソコンのUSBポートとRaspberry Pi Picoを接続する事は可能です。ただし、お使いのパソコンによっては5.5V以上出ている可能性があり、それによる機器の破損等は自己責任でお願いします。</font>

# 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チカまでの手順です。

1. [Raspberry Pi Picoの-getting started-](https://www.raspberrypi.org/documentation/pico/getting-started/)の「Getting Started C/C++ Blink an LED」のページを探します(パソコンからだとリンク先でタブになっているかと思います)。

2. 「Download UF2 file」をクリックして、UF2ファイルをパソコンにダウンロードします。Raspberry Pi Picoで何かしらのプログラムを動かす時は、拡張子が".uf2"となっている必要があります。

3. Raspberry Pi Picoのスイッチ(近くにBOOTSELと書かれています)を押しながら、パソコンとUSB接続します。既に何かしらのプログラムを入れている場合、そのプログラムは消えてしまうので、必要に応じてパソコンに残しておくのが良いです。

4. ダウンロードしたUF2ファイルを、Raspberry Pi Picoのフォルダにコピー＆ペースト(あるいは、ドラッグ＆ドロップ)します。

以上の手順を行って、Raspberry Pi Picoがチカチカ光れば成功です。公式のGetting startedのページには分かりやすいアニメーションが載っていますので、間違える事は無いかなと思います。

# Lチカのソースコード

[GitHubで公開されているソースコード](https://github.com/raspberrypi/pico-examples/blob/master/blink/blink.c)は、以下の通りです。

```cpp

/**
 * 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言語の基本構造をお見せします。

```cpp
#include <"ヘッダファイル名">

int main(){
    hogehoge;
}
```

最初の行で、ヘッダファイルと呼ばれるファイルを読み込む(#includeする)事が大切です。ヘッダファイルは拡張子が".h"となっており、「プログラミングに必要な機能を呼び出すよ」と言う役割をしています。

Lチカプログラムの場合```#include "pico/stdlib.h"```となっており、```"pico/stdlib.h"```と言う名前のヘッダファイルを読み込んでいます。ちなみに、C言語に標準として用意されているヘッダファイルを読み込む時は、ヘッダファイル名を<>で囲みます(例えば```#include<time.h>```)が、自作のヘッダファイルを読み込む時は囲みません。

```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のデータシート](https://datasheets.raspberrypi.org/pico/pico-datasheet.pdf)p.5に記載されており、LEDの所に"GP25"が割り振られています。

ソースコードに戻りますが、先程の部分を一般化すると、```const 型名 変数名 = 変数の値;```となります。通常、変数は値が変わるものですが、constを付ける事によって、値の変わらない(変えられない)定数として扱う事が出来ます。今回の場合、LEDのGPIOピンは固定されているのでconstを使っているのだと思います。また、変数名の前には、使用する変数の値に対応した型を定義する必要があります。C言語の場合、整数値を使うならint型、小数点も使いたいならfloat型やdouble型が代表的です。今回の場合、uint型が使われていますが、マイナスも含めた整数値を使いたいならint型、プラスのみの整数値を使いたいならuint型だと思ってもらって大丈夫です。(参考)[データ型の範囲](https://docs.microsoft.com/ja-jp/cpp/cpp/data-type-ranges?view=msvc-160)。

続いて、```gpio_init(LED_PIN);```と```gpio_set_dir(LED_PIN, GPIO_OUT);```の説明をします。

それぞれ[Raspberry Pi PicoのC/C++ SDK](https://datasheets.raspberrypi.org/pico/raspberry-pi-pico-c-sdk.pdf)の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を返す」と言う意味だと私は理解しました。

さて、最後はちょっと長めのコードになっていますね。

```cpp
while (true) {
        gpio_put(LED_PIN, 1);
        sleep_ms(250);
        gpio_put(LED_PIN, 0);
        sleep_ms(250);
    }
```

これは繰り返し文(while文)と呼ばれていて、一般化すると以下のようになります。

```cpp
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](https://datasheets.raspberrypi.org/pico/raspberry-pi-pico-c-sdk.pdf)の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](https://datasheets.raspberrypi.org/pico/raspberry-pi-pico-c-sdk.pdf)のp.205に使い方が書かれていますが、「250ms待つよ」と言う意味です。```sleep_ms(1000)```とすれば1000ms、すなわち、1秒の待ち時間が発生します。この待ち時間があってLEPを光らせたり消したりしているので、LEDがチカチカしているように見えます。

解説は以上となります、お疲れ様でした。

# 次回予告

次回も[Raspberry Pi Picoの-getting started-](https://www.raspberrypi.org/documentation/pico/getting-started/)に載っている例を使って解説したいと思います。