4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

前回の記事の最後に予告した通り、今回から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チカまでの手順です。

  1. Raspberry Pi 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で公開されているソースコードは、以下の通りです。


/**
 * 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-に載っている例を使って解説したいと思います。

4
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?