とうふ荘の手記てき!

プログラムとか

M5StickCのesp-idfとArduinoライブラリとM5StickCライブラリを用いた環境構築

Arduino IDEを使わずにM5StickCをesp-idfに加えarduino-esp32M5StickCコンポーネントとした開発環境で、vscodeでプログラムします。

続きを読む

M5StickCのバッテリーでの動作時間

  • M5StickCとは
  • バッテリーでの動作時間を測ってみた
  • 測定結果

M5StickCを買いました。

M5StickCとは
  • 小型!
  • 画面がある
  • ESP32 Pico を搭載するためWiFiBluetoothが使える
  • ジャイロと加速度センサーが付いている
  • 腕時計マウンタが付いている(公式ショップでは付いていないバージョンもあるそうです)
  • (人によるとは思いますが)安い!

ことを特徴としたマイコンキットです。

www.switch-science.com

続きを読む

マイクロマウス(クラシック)がやりたい!

所属しているサークルの目標に、マイクロマウス競技に参加しよう!というものがあります。

今回、自分はマイクロマウス(クラシック)への参加を目指して期待製作を頑張っていきます。

その過程も以後書くことになるやもしれません。

マイクロマウスって?f:id:tofu-so-shioaji:20190815041738p:plain

マイクロマウスとは、マイコンを積んだ車輪が付いたロボット(必ずしもその限りではない)が、迷路を探索し所定のゴールへ到達するまでの速さを競います。

その際、プレイヤーは走行中のマウスに対しては迷路情報の入力といったものができず、マウスは搭載されているセンサーを頼りに迷路の構造を把握し、スタートからゴールまでの経路を計算して、その通りに走り抜けることになります。

レギュレーションとしては、前述の迷路情報の入力のほかに、内燃機関や外燃機関の使用、迷路の破壊や飛び越え、プレイヤーによる換装などが禁止されていますが、それ以外は基本的に自由です。

つまり、変形マシンや足で歩行するロボットでも問題ないということです。

現在、クラシック部門とハーフサイズ部門に分かれており、クラシックでの迷路1区画の大きさは18 cm × 18 cmでハーフサイズでの迷路1区画の大きさは9 cm × 9 cmになっており、クラシックサイズはより詰め込む必要がある上級者向けの部門だそうです。

2018年度の全日本大会を優勝した方の最短走行(迷路を把握し終えて最速で突っ走る走行)のすごい動画です。

マイクロマウス2018 クラシックマウスA(午後) Micromouse2018 Classicmouse A(p.m.) - YouTube

ちなみに、いらすとやに素材もあるようですよ

www.irasutoya.com

4つのソートアルゴリズムをGo言語で実装する

挿入ソート、マージソートヒープソートクイックソートについて知ったので、それらをGo言語で書いてみます。

github.com

続きを読む

ルネサスのマイコンをVSCodeを使ってプログラム、そしてCS+でビルド、Flash Programmerで書き込みを行う。



なんでVScodeルネサスマイコンをプログラミングするの?

f:id:tofu-so-shioaji:20190421193746p:plain

Renesasのマイコン(RXファミリなど)をプログラミングするためにはCubeSuite+(CS+)と呼ばれる統合開発環境を使うのですが、私自身、普段はVisual Studio Code(VSCode)と言われているエディターを使っています。

code.visualstudio.com

VScodeは入力補完や拡張機能、コードレンズなど多機能で、エディターとしても軽量な方です。(最近は重くなってきたかも?)

なので、プログラミング、ビルド、マイコンへの書き込みまでをVScodeから行う最低限の手順を備忘録も兼ねてまとめてみました。

ただ、私自身あまりCS+について分かっておらず、勘違いや設定漏れ等が存在する可能性が極めて高いです。その場合は指摘してもらえると幸いです。

ここではVSCodeやCS+のインストールや環境構築は省略します。

なお、今回は以下のような実行環境で実行しました。

  • Windows10
  • CS+ for CC V8.01.00
  • Rebesas Flash Programmer V 3.05.01 無償版
  • Visual Studio Code バージョン: 1.35.0

また、予め今回のディレクトリの構成を示しておきます。

フォルダ構造(ツリー)

***/Test     // プロジェクトフォルダ
│  Test.c     // ソースコード
│  Test.mtpj  // プロジェクトファイル
│ ***略***
│
├─.vscode       // VSCodeに関する設定などを保存するフォルダ
│ ***略***
│
├─DefaultBuild  // ビルドに関するデータを保管するフォルダ
│  Test.mot   // 書き込み時に用いるデータ
│ ***略***
│
└─Flash Programmer
    │  Flash Programmer   // FlashProgrammerのログ(実行時に自動作成)
    │
    └─Test              // Flash Programmeのプロジェクトフォルダ
            Test.rpj    // Flash Programmeのプロジェクトファイル
プロジェクトを作成する

まずは、CS+でプロジェクトを作成します。

この時、「プロジェクト名のフォルダを作成する」にチェックを入れておいてください。後述のビルド、書き込みはこれを前提とした設定にしています。

VSCodeで開く

プロジェクト作成のために起動したCS+は終了させ、作成したプロジェクトのフォルダを右クリックから「Open with Code」を選択して、VSCodeでフォルダを開きます。

f:id:tofu-so-shioaji:20190402204821p:plain
フォルダをVSCodeで開いた状態

左側のリストで編集したい、ファイルを選んでプログラムを行います。

C/C++言語のプログラムを行う際、C/C++拡張機能を持っていない人はソースファイルを開いた際に拡張機能を入れるよう通知が出るはずです。

VSCodeをCS+向けに設定する
文字コードの設定

VSCodeのデフォルトの文字コードは「UTF-8」ですが、CS+は「Shift-JIS」でファイルを生成します。なので、VSCode側の設定でShift-JISのコードとして読み込むようにします。

Ctrl+,と入力し、設定を開き、「ワークスペースの設定」を選択するとその設定は現在開いているフォルダ内だけに適用されます。

その状態で「encoding」と画面上部の検索窓に入力して検索すると「Files: Encoding」という設定がヒットするはずです。これを「shiftjis」に変更すると、VSCodeが「Shift-JIS」でファイルを開くようになります。

iodefine.hに手を加える

CS+のプログラムをVSCodeで開く際に困るのが、CS+特有のキーワードをコード補完機能がうまく認識してくれないことです。

iodefine.hに記述されているSYSTEMPORT0といったレジストリにアクセスするための構造体のフィールドには予測変換機能が働かないどころか、文法エラーであると認識してしまいます。

これの原因は、SYSTEMの定義に書かれている__evenacessというキーワードがRenesasのコンパイラ特有のもので、VSCodeはこれを文法ミスであると認識するようです。よって、VSCodeがこのキーワードを認識出来ないようにします。(正確にはマクロで問題のキーワードを空白として認識させます。)

「iodefine.h」の先頭部分に以下の定義を追記します。

#ifndef __RX62NIODEFINE_HEADER__
#define __RX62NIODEFINE_HEADER__
#pragma bit_order left
#pragma unpack

#ifdef _VSCODE // 追記部分
#define __evenaccess
#endif
***略***

そして、Ctrl+Shift+Pでコマンドパレットを開き、「C/C++」等を入力すると、「edit configurations(JSON)」が候補に出てくるので、それを選択して、C/C++のプロパティを設定するファイル「c_cpp_properties.json」を開きます。

このファイルに_VSCODEを定義し、IntelliSense実行時のみ、キーワードを無視し、コンパイラがビルドする際は無視しないようにします。

***略***
 "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE",
                "_VSCODE"
            ],
***略***

これで、レジストリへアクセスする構造体の入力補完が使えるようになります。

f:id:tofu-so-shioaji:20190402213341j:plain
入力補完機能

インクルードパスを追加

CS+のライブラリが読み込まれるようにインクルードパスを追加します。

設定は同じく「c_cpp_properties.json」に設定します。

***略***
"includePath": [
                "${workspaceFolder}/**",
                "{CS+のインストール先}/Renesas Electronics/CS+/CC/CC-RX/V3.01.00/include"
            ],
***略***

Windowsでは一般的な「\(バックスラッシュ)」はディレクトリの区切り文字としては使用できません。「/」か「\\」に置き換えます。

ビルドをVSCcodeから実行できるようにする

VSCodeには作業を自動実行するためのタスクという機能があります。同じくCtrl+Shift+Pでコマンドパレットを開き、「Tasks」と入力すると、「タスクの構成(Configure Task)」が候補に出てくるのでそれを選択してから「テンプレートからtaks.jsonを生成」→「others」を選択し「tasks.json」を開きます。

最初に設定ファイルを作成した際のテンプレートは「Hello」と表示するコマンドを実行するだけなので消してしまっても問題ありません。代わりに以下のように記述します。

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Build", // ビルドタスク
            "type": "shell",
            "command": "{CS+のインストール先}\\Renesas Electronics\\CS+\\CC\\CubeSuite+.exe",
            "args": [   // 引数指定
                "/bb",   // ビルドを実行
                "${workspaceRoot}\\${workspaceRootFolderName}.mtpj",    // プロジェクトファイル(.mtpj)をディレクトリから指定する
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
 ]
}

これは、CubeSuite+.exeをコマンドラインから引数をつけて実行するタスクです。group以下の設定によりこのタスクがビルドタスクであると認識されます。

(後述しますが、Ctr+Shift+Bのショートカットでビルドタスクは実行できます。)

実行の際、${workspaceRoot}はプロジェクトフォルダまでの完全なパスに置換されます。

${workspaceRootFolderName}はプロジェクトフォルダ名に置換されます。

commandでCubeSuite+.exeファイルが存在するディレクトリを指定します。

プロジェクトの新規作成時、プロジェクトフォルダ名とプロジェクト名を一致させておくことが前提です。

タスクを作成したら、Ctrl+Shift+Bでビルドタスクを実行します。成功すると以下のように表示されます。

f:id:tofu-so-shioaji:20190402223617j:plain
ビルド成功時のコンソール

VSCode内の左側のエクスプローラーからも「DefaultBuild」フォルダが作成され、.motファイルも生成できているのが確認出来ると思います。

Flash ProgrammerでVSCodeからでも書き込めるようにする

VSCodeでプログラミングを行い、ビルドの実行もVSCodeから行えるようになりました。最後にマイコンmotファイルを書き込む操作もVSCodeから呼び出せるようにします。

まず、Renesas Flash Programmerを開いて、新規プロジェクトを作成し、マイコンの選択、(Flash Programmerにおける)プロジェクト名の決定とディレクトリの指定、マイコンとの通信方式と周波数を指定し、初回の通信を行います。

今回は、CS+のプロジェクトフォルダ内に「Flash Programmer」というフォルダを作成し、その中にCS+のプロジェクト名と同一名のプロジェクトを作成することにします。(プロジェクトを作成する際に指定したディレクトリにプロジェクト名のフォルダが作成されるようです。)

また、初回の通信が終わった後に開く画面で、使用するmotファイルを選択し、プロジェクトを保存したらFlash Programmerは閉じてしまっても大丈夫です。

f:id:tofu-so-shioaji:20190609010453j:plain
Flash Programmerの新規プロジェクト作成画面の一例

tasks.jsonをコマンドパレットやエクスプローラーから開いて、以下のように設定を追加します。

"label": "Flash",を含む一連の設定が追加部分です。

{
    ***略***
    "tasks": [
        {
            "label": "Build", // ビルドタスク
            []
        },
        {
            "label": "Flash", // マイコンへの書き込み
            "type": "shell",
            "command": "{Flash Programmerのインストール先})\\Renesas Electronics\\Programming Tools\\Renesas Flash Programmer V3.05\\RFPV3.exe",
            "args": [   // 引数を指定
                "/silent",   // GUI非表示で起動
                "${workspaceRoot}\\Flash Programmer\\${workspaceRootFolderName}\\${workspaceRootFolderName}.rpj", // プロジェクトファイルが存在するディレクトリ
                "/log",  // ログを保存する
                "Flash Programmer/Flash Programmer.log", // ログを保存する場所
            ],
         }
    ]
}

"command"ではFlash Programmerがインストールされているディレクトリと、その中にある実行ファイルRFPV3.exeをフルパスで指定します。

また、RFPV3.exeを実行する際の引数リストargsFlash Programmerのプロジェクトファイルを指定しています。

今回は{CS+のプロジェクトとフォルダ}\\Flash Programmer\\{CS+プロジェクトと同一名のフォルダ}\\{CS+プロジェクトど同一名のFPのプロジェクトファイルのようになっています。

あえて、このように制約を課すことで、設定ファイルをコピペするだけで使えるようにします。

次にCtrl+Shift+Pでコマンドパレットを呼び出し、「Tasks」と入力して「タスクの実行」→「Flash」→「タスクの出力をスキャンせずに続行」を選択すると、コマンドが実行されます。

しかし、RFPV3.exeはほとんど実行結果を出力しないため、うまく行ったのかすごくわかりにくいです。そこでタスク作成時に設定しておいた、ログを読みに行きます。

f:id:tofu-so-shioaji:20190609015054j:plain
Flashタスクの実行結果。すごく分かりにくい。

タスクを実行してから暫く待つと「Flash Programmer」フォルダ内にFlash Programmer.logというログファイルが現れているはずです。これを開くと、Flash Programmerの実行結果がわかります。

f:id:tofu-so-shioaji:20190609015920j:plain
Flash Programmerのログファイルの例

以上で、無事にVSCodeだけでルネサスマイコンにプログラミングをして、コンパイルと書き込みまですることができました。

設定のまとめ

設定方法のみを以下にまとめます。

フォルダ構造(ツリー)

***/Test     // プロジェクトフォルダ
│  Test.c     // ソースコード
│  Test.mtpj  // プロジェクトファイル
│ ***略***
│
├─.vscode       // VSCodeに関する設定などを保存するフォルダ
│ ***略***
│
├─DefaultBuild  // ビルドに関するデータを保管するフォルダ
│  Test.mot   // 書き込み時に用いるデータ
│ ***略***
│
└─Flash Programmer
    │  Flash Programmer   // FlashProgrammerのログ(実行時に自動作成)
    │
    └─Test              // Flash Programmeのプロジェクトフォルダ
            Test.rpj    // Flash Programmeのプロジェクトファイル

.vscode/settings.json

{
    "files.encoding": "shiftjis"
}

iodefine.h

***略***
#ifndef __RX62NIODEFINE_HEADER__
#define __RX62NIODEFINE_HEADER__
#pragma bit_order left
#pragma unpack

#ifdef _VSCODE // 追記部分
#define __evenaccess
#endif
***略***

.vscode/c_cpp_properties.json

***略***
"includePath": [
                "${workspaceFolder}/**",
                "D:/Program Files (x86)/Renesas Electronics/CS+/CC/CC-RX/V3.01.00/include"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE",
                "_VSCODE"
            ],
***略***

.vscode/tasks.json

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Build", // ビルドタスク
            "type": "shell",
            "command": "{CS+のインストール先}\\Renesas Electronics\\CS+\\CC\\CubeSuite+.exe",
            "args": [   // 引数指定
                "/bb",   // ビルドを実行
                "${workspaceRoot}\\${workspaceRootFolderName}.mtpj",    // プロジェクトファイル(.mtpj)をディレクトリから指定する
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "label": "Flash", // マイコンへの書き込み
            "type": "shell",
            "command": "{Flash Programmerのインストール先}\\Renesas Electronics\\Programming Tools\\Renesas Flash Programmer V3.05\\RFPV3.exe",
            "args": [   // 引数を指定
                "/silent",   // GUI非表示で起動
                "${workspaceRoot}\\Flash Programmer\\${workspaceRootFolderName}\\${workspaceRootFolderName}.rpj", // プロジェクトファイルが存在するディレクトリ
                "/log",  // ログを保存する
                "Flash Programmer/Flash Programmer.log", // ログを保存する場所
            ],
         }
    ]
}

Kicadの部品リスト(BOM)をExcelにするソフトウェア

Kicadの回路図エディタ(Eeschema)で出力した部品リスト(BOM)のXMLファイルをExcelに変換するソフトウェアです。

既に同様のものはたくさんインターネット上で入手できます。

インストール方法

こちらから実行ファイルを入手できます。 github.com

実行方法
bom-xml2excel.exe {XMLファイル} --out {出力するEXCELファイル名}

特別便利な機能とかはありませんが、使ってもらえると幸いです。

【C言語】自作ソート関数が配列を並べ替える様を眺める

概要

勉強でソート関数を作ったのですが、それだけだと味気なかったので、手塩にかけた関数がソートする様を見ることのできる関数を作りました。

アルゴリズムによっては対応できないものがあったり、並べ替える対象を決める処理を視覚化できるわけではないので、実用性はほぼありません。観賞用です。
(対応するのもint型の配列を並べ替えるものです。)  

使用例

バブルソート

f:id:tofu-so-shioaji:20190101161710g:plain
バブルソート

クイックソート

f:id:tofu-so-shioaji:20190101161719g:plain
クイックソート

ソースコード

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "sort_visualize.h"
#define ARRAY_NUM 10

void bubble_sort(int*, int);

/*
int型配列を監視して、ソートの様子を表示するプログラム
*/
int main() {
    int arr[ARRAY_NUM] = { 24, 33, 22, 10, 22, 12, 55, 10, 100, 12 };
    start_sort(bubble_sort, arr, ARRAY_NUM);

    return 0;
}

/*一般的なバブルソート*/
void bubble_sort(int* arr, int arr_num) {
    for (int i = 0; i < arr_num; i++) {
        for (int j = 0; j < arr_num - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                visualize_swap(arr + j, arr + j + 1);  /*入れ替え*/
            }
        }
    }

    return;
}
ソースコード・用法
  1. 下のソースコードsort_visualize.csort_visualize.をインクルードします。
  2. 自作のソート関数内で入れ換えるタイミングでインクルードした入れ替え関数visualize_swapを用いて入れ換えるように作ります。
  3. 作成した関数と入れ換える対象となる配列とその要素数をインクルードしたstart_sort関数に引数として渡して実行します。

gist0e2ed927b2407ab720ace9bc59f2c375

Go言語でも書いてみたいなぁ