ししかわです。
社員研修としてマイクロマウスを自作します。
記事一覧 – 元Web屋のマイクロマウス製作記 | RT MicroMouse
自作マウスの方針として、UIを主に担当する「コアモジュール」と、
マウスの走行やセンシングを担当する「マウスモジュール」に分けることを決めました。
まずは回路や基板の設計に入る前に、マウスモジュールを試作したいと思います。
選定した部品を1個ずつ動かして、仕組みや制御の仕方を勉強します。

今回は「マウスモジュール」側の環境構築をしました。
開発環境の検討
「マウスモジュール」の開発環境について、次のような要件があります。
- I2C、PWM、ADCを使ってモータ、エンコーダ、センサの値を読み出せる
 - 試作なので、後から他のSTM32マイコンに差し替えられる
 - 研修なので、ライブラリやフレームワークは動作原理が簡単に理解できる
 
要件1のために、マイクロマウスでよく使われているSTM32のマイコンを使うことにしました。
ただし、STM32の中でも、ピンの数や性能によってたくさんのバリエーションがあります。
まだ試作段階で後から使うマイコンを差し替える可能性があります(要件2)。
要件2を満たすためには、ドライバ部分(マイコンのレジスタにアクセスする処理)を抽象化するライブラリが必要です。
ArduinoなどはIoT界隈でも有名ですが、Arduinoは使いやすさと引き換えに抽象化の層がかなり厚くなっていて、
要件3に反しています。また、不具合が起きた時に原因を特定するのも大変です。
このような場合はマイコンのベンダが提供するライブラリ – STM32の場合はSTM32 HAL Library – を使うのがよいでしょう。
また、ビルドツールとエディタの選定にも要件3を重視します(ビルド時に何が起きているかをちゃんと把握したい)。
STM32公式の統合開発ツール(STM32CubeIDE)も提供されていますが、今回これは使いません。
代わりにシンプルなエディタであるVisual Studio Codeでコードを書き、MakefileとMakeコマンドでビルドします。
環境セットアップ
次の記事を参考にしました。
俺が考えた最強のSTM32開発環境構築(STM32CubeMX, OpenOCD, Semihosting, VSCode and C++) – Qiita
環境とバージョン
ハードウェア
- STM32 F103 Blue Pill Board
 - STLink v2
 
ソフトウェア
- Ubuntu: 18.04.3 LTS
 - GNU Make: 4.1
 - GNU Arm Embedded Toolchain: 6.3.1
 - OpenOCD: 0.10.0
 - VisualStudio Code: 1.41.1
 - STM32CubeMX: 5.4.0
 - STM32CubeF1: 1.8.0
 
開発ボードの準備
本格的な製作の際はKicad等の回路CADを使って基板を起こしますが、
最初は簡単な動作確認と勉強のために、STM32を搭載した開発ボードを使います。
Blue Pillと呼ばれる安価な開発ボードです。
入出力のピン数やCPUのクロック的には、今回の用途には必要十分な性能を備えています。
STLink v2というアダプタ経由でPCと接続してプログラムを書き込みます。
Blue Pill、STLinkともに秋葉原のShigezoneで購入しました。
部品との接続には別途、ブレッドボードとジャンパワイヤを使います。 Blue Pillのピンヘッダをあらかじめはんだ付けしておきます。

Blue Pill(画像上)とST Link v2(画像下)
GNU MakeとArm Embedded Toolchainのインストール
Arm Embedded ToolchainはPC上でArm用のプログラムをクロスコンパイルするためのツール群です。
$ sudo apt install build-essentials gcc-arm-none-eabi
OpenOCDのインストール
OpenOCD(On Chip Debgger)はPCからチップへのプログラム書き込みやデバッグを行うツールです。
$ sudo apt install openocd
VisualStudio Codeのインストール
私はエディタとしてVisualStudio Code(VSCode)を愛用しています。 Ubuntuの場合はaptからコマンド一発でインストールできます。
$ sudo apt install code
VSCodeはプラグインによって機能を拡張できます。 「C/C++」プラグインをインストールすると、コード補完などが効くようになります。
STM32CubeMXのインストール
STM32CubeMXはSTM32のプロジェクトをGUIで設定し、コード雛形を生成できるツールです。 下記の手順でインストールします。
- STM32CubeMXのダウンロードページにアクセスします
 

- 「ソフトウェア入手」をクリックします
 - ライセンス契約をよく読んで「同意」をクリックします
 -  STのアカウントを作成、または氏名とEmailアドレスを入力してダウンロードします
- STの他のツールもダウンロードするたびに同じ入力を求められるので、アカウントを作っておいたほうが楽です
 
 - ダウンロードしたzipを解凍して「SetupSTM32CubeMX-5.4.0.linux」を実行します
 

- ダイアログに従ってインストールします
 - インストールされたディレクトリ(デフォルトでは$(HOME)/STM32CubeMX)を開き「STM32CubeMX」を実行します
 

CubeMXのトップ画面が表示されればOKです。
プロジェクト雛形の設定
CubeMXを使ってコードの雛形を出力します。 今回はマウスモジュール開発のために必要最低限である、
- Blue Pillに搭載されたマイコン(STM32F103C8)を使う
 - Makefileを使ってビルドする
 
という設定をします。
- CubeMXの上部メニューから「File > New Project」を選択します
- マイコン(MCU)の選択ダイアログが表示ます
 
 

- 検索欄に「stm32f103c8」と入力し、検索結果の中から「STM32F103C8」をダブルクリックします。
- 選択したマイコンでプロジェクトが新規作成されます。
 
 

- 続いて上部タブから「Project Manager」を選択します。
 - Project Manager のページで次の設定を変更します
- Project
- Application Structure→Advanced
 - Toolchain / IDE→Makefile
 
 - Code Generator
- STM32Cube MCU packages and embedded software packs→Copy all used libraries into the project folder
 
 
 - Project
 - これで設定完了です。「GENERATE CODE」をクリックして、出力先ディレクトリを選択します。
 - 出力先ディレクトリをVisualStudio Codeで開きます。
 - ファイルが次のような構成になっていればOKです。
 

フラッシュ書き込みの設定
プロジェクト直下にOpenOCDの設定ファイル(openocd.cfg)を作成します。
telnet_port 4444
gdb_port 3333
source [find interface/stlink-v2.cfg]
source [find target/stm32f1x.cfg]
init
proc flash_elf {elf_file} {
reset
halt
flash write_image erase $elf_file
verify_image $elf_file
echo "flash write_image ($elf_file) complete"
reset
exit
}
これで、次のコマンドでBlue Pillのフラッシュへのプログラム書き込みができます。
openocd -f ./openocd.cfg -c "flash_elf build/{プロジェクト名}.elf"
なお、このようなコマンドはVSCodeのタスクとして登録しておくと、ショートカットキーから実行できるようになり便利です。
(本記事では省略。参考記事を参照)
Lチカ
プロジェクト一式の動作確認のためにLチカをやってみましょう。 Blue PillのPC13ピンにはLEDが付いていますので、これをGPIOを使って光らせます。
- CubeMXの「Pinout&Configuration」画面を開きます。
- ここで入出力ピンの設定が行なえます。
 
 - PC13ピンをクリックし「GPIO_Output」を選択します。 

 - 「GENERATE CODE」をクリックします。
 
生成された雛形にGPIOを初期化するコードが追加されているのが確認できます。
// Src/main.c
/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
/*Configure GPIO pin : PC13 */
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
あとはメインループの中でGPIOの出力をオン・オフするコードを書くだけです。
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* 中略 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
- PC→STLink→Blue Pill を接続します。STLinkとBlue Pillは4本のジャンパワイヤで「3.3V」「SWIO」「SWCLK」「GND」をそれぞれ接続します。
 

- Blue PillのBOOT0ジャンパピンを1に差し替えてRESETボタンを押します。
 - VSCodeのコンソールからmakeコマンドを実行します。
 
$ make all $ openocd -f ./openocd.cfg -c "flash_elf build/stm32_mouse.elf"
- BOOT0ジャンパピンを0に差し替えてRESETボタンを押します。
 - PC13のLEDがチカチカしていたら成功です!
 

次回からはこのプロジェクトをベースに、センサやモータなどの部品を制御していきます。
