0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

micro:bitAdvent Calendar 2023

Day 22

MakeCode for micro:bit で C/C++プログラミング

Last updated at Posted at 2023-12-23

実は、

少し工夫をすると、 Microsoft MakeCode for micro:bit でも、 C/C++ によるプログラミングが可能です。

helloworld.cpp
image.png

必要なもの

Microsoft MakeCode for micro:bit 上で、C/C++によるプログラミングをするために、次のものが必要です。

  1. micro:bit(本体)
  2. GitHubアカウント

micro:bit(本体)

C/C++で開発したプログラムを実行するには、 micro:bit(本体) への転送が必要です。MakeCodeのシミュレーターでは、実行することができません(シミュレーションできません)。
micro:bit のバージョン毎に、ランタイム等が異なりますので、できれば、v1v2の2つを用意して、動作確認を行います。

micro:bit ランタイム nRF5
V1 dal Soft Device 110
V2 codal Soft Device 113

The micro:bit runtime DAL/CODAL (英語)

GitHubアカウント

Microsoft MakeCode for micro:bit では、作成したプロジェクトのソースコード一式を GitHub で管理することができます。また、C/C++プログラミングに必要なファイルを追加するために、 GitHub を使用します。
その為、GitHub への サインイン が必要になりますので、事前に GitHubアカウント を用意してください( サインアップ - https://github.com/signup )。

C/C++で Hello World!

Microsoft MakeCode for micro:bit文字列を表示 ブロックでは、その実行中(スクロール表示中)、順次実行がブロックされ、そのブロックの実行(スクロール表示)が完了するまで、次のブロックは実行されません(同期処理)。
C/C++プログラムの例として、この文字列表示をバックグラウンドで実行する showAsyncString ブロックをC/C++でプログラミングします。

プロジェクトの新規作成

Microsoft MakeCode for micro:bit で、 新しいプロジェクト を作成します。

ここでは、プロジェクト名を microbit-cpp にしました。

image.png

C/C++ファイルの追加

Microsoft MakeCode for micro:bit 上では、ts形式以外のファイルを追加できません。そこで、MakeCodeのプロジェクトをGitHubリポジトリに登録し、GitHub上で、ts形式以外のファイルを追加します。

次の手順で、C/C++ファイル等を追加します。

1.GitHubリポジトリを作成する
GitHubリポジトリを作成する アイコンをクリックします。
image.png

2.GitHubでサインイン
準備したGitHubアカウントでサインインします。
image.png

3.GitHubリポジトリを作成
リポジトリ名 を確認し、 つづける ボタンでGitHubリポジトリを作成します。
image.png

4.リポジトリを準備中
リポジトリが作成されるのを待ちます。
image.png

5.リポジトリ作成完了
リポジトリの作成が完了したら、 ローカルの変更はGitHubと同期されます アイコンをクリックします。
image.png

6.GitHubでリポジトリを開く
GitHubでリポジトリを開きます。 アイコンをクリックし、GitHubリポジトリを開きます。
image.png

7.GitHubリポジトリにファイルを追加
アイコンの Create new file をクリックし、ファイルを追加します。
image.png

8.helloworld.cppファイルを追加
ファイル名を helloworld.cpp とし、 Commit changes.. で追加を確定します。
image.png

9.Commit changes
Commit changes ボタンをクリックし、確定します。
image.png

10.ptx.jsonファイルを編集
GitHub上で、 ptx.json ファイルを編集し、 helloworld.cpp ファイルをプロジェクトに含めるようにします。
image.png

11.Commit changes
ptx.json ファイルの変更を確定します。
image.png

12.変更を取得(プル)
MakeCode上で、 変更を取得(プル) ボタンをクリックし、GitHub上での変更をMakeCode上のプロジェクトに反映します。
image.png

13.カスタムブロックの追加
JavaScriptモードにして、エクスプローラーの アイコンをクリックします。
image.png

14.新しいファイルの名前
新しいファイル名を helloworld.ts とし、 つづける ボタンをクリックします。
image.png

15.空のhelloworld.tsファイル
helloworld.ts ファイルが作成されたことを確認します。
image.png

16.変更をコミットしてプッシュ
変更をコミットしてプッシュ ボタンをクリックし、MakeCode上での変更をGitHubへ反映します。
image.png

17.GitHubリポジトリの確認
GitHubリポジトリを開くと、 helloworld.ts ファイルが追加されていることを確認できます。また、 ptx.json ファイルにも、 helloworld.ts の記述が追加されていることも確認できます。
image.png

C/C++プログラミング

helloworld.cpp ファイルで、C/C++プログラミングを行いますが、それを呼び出すための拡張機能(ブロック)のプログラミングも必要です。

次のように各ファイルでプログラミングします。

helloworld.ts
/**
 * Hello World blocks
 * icon: a Unicode identifier for an icon from the Font Awesome icon set.
 *       http://fontawesome.io/icons
 */
//% weight=100 color=#696969 icon="\uf1b2"
namespace helloworld {

    /**
     * Show string, async
     * @param text 非同期でスクロール表示する文字列
     */
    //% block
    //% shim=helloworld::showAsyncString
    export function showAsyncString(text: string): void {
        // for the simulator
        basic.showString(text)
    }

    /**
     * Stop animation
     */
    //% block
    //% shim=helloworld::stopAnimation
    export function stopAnimation(): void {
        // for the simulator
        basic.clearScreen()
    }
}
helloworld.cpp
#include "pxt.h"

namespace helloworld {
    
    //%
    void showAsyncString(String text) {
        uBit.display.scrollAsync(MSTR(text));
    }

    //%
    void stopAnimation() {
        uBit.display.stopAnimation();
    }
}

コンパイル

コンパイルは、 ダウンロード ボタンでHEX形式ファイルをダウンロードする際に、MakeCode内部で行われます。
ここで、 ダウンロード ボタンをクリックすると、 コンパイル(これには1分かかることがあります)... と表示され、コンパイルが行われます。

image.png

動作確認

C/C++のプログラムは、MakeCodeのシミュレーターでは、実行されません。HEX形式ファイルをダウンロードし、micro:bit本体に転送し、動作確認します。

ブロック例では、次のように動作します。

  1. Aボタンでは、文字列表示とメロディーが同時に実行されます。
  2. Bボタンでは、文字列表示が実行されてからメロディーが実行されます。

ブロック例
image.png

JavaScript
input.onButtonPressed(Button.A, function () {
    reset()
    helloworld.showAsyncString("Happy birthday!")
    music._playDefaultBackground(music.builtInPlayableMelody(Melodies.Birthday), music.PlaybackMode.InBackground)
})
input.onButtonPressed(Button.B, function () {
    reset()
    basic.showString("Hello!")
    music._playDefaultBackground(music.builtInPlayableMelody(Melodies.Dadadadum), music.PlaybackMode.InBackground)
})
function reset () {
    helloworld.stopAnimation()
    basic.clearScreen()
    music.stopAllSounds()
    basic.pause(100)
}
basic.showIcon(IconNames.Heart)

おわりに

Microsoft MakeCode for micro:bit でも、 C/C++ によるプログラミングが可能であることを確認しました。

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?