phillowcompilerのアイコン画像
phillowcompiler 2020年05月06日作成 (2020年11月21日更新)
セットアップや使用方法 セットアップや使用方法 閲覧数 13263
phillowcompiler 2020年05月06日作成 (2020年11月21日更新) セットアップや使用方法 セットアップや使用方法 閲覧数 13263

中華STM32F4ボードで遊ぼう!

はじめに

STM32シリーズはARMアーキテクチャを気軽に扱えるたいへん人気のあるマイコンです!

本家ST社謹製のマイコンボード「Nucleoシリーズ」は数千円で買えるので、個人がホビー用途でも手を出しやすく、いろいろな電子工作系のブログでも見かけたりしますね!
STMicroelectronics公式より

さらにSTM32F103ボード(通称「bluepill」)だとAliExpressあたりで2ドル未満というアホのように安くて、それこそLチカだけ実験して使い捨てても全く惜しくないような値段(!?)で売られていたりします。しかも Arduino が扱えるので、AVRマイコンのArudinoからステップアップしたい…と思っている方々には最適なソリューションというわけですね。

stm32duinoforum.comより

…しかし!人間の欲望というものは限りが無いもので、bluepillの64KB-FROM/20KB-SRAMでは(AVRマイコン時代を考えれば十分に潤沢なリソースなのですが)、意外とすぐに不足気味になってしまうものです。今や猫も杓子もpython…の時代ですから、microPython だっていじくりたいじゃないですか!

じゃあ、STM32F4シリーズにステップアップしよう!

F4シリーズなら ARM-CortexM4 ですってよ。奥さん。(F103シリーズは ARM-CortexM3)
…というわけで…AliExpressを彷徨っていたら、面白そうなSTM32F4ボードを発見したのでした。しかも安い…(2020年5月現在で300〜500円くらい)。い…一応ST社のロゴが入っているので大丈夫でしょう〜(震え声)。

AliExpress より

WeAct MiniF4 というのが正式名称らしいですけど、Black pill と呼んでいる人もいるらしい…。STM32F103シリーズにも「Black pill」というボードがあるので、非常に紛らわしいことこの上ないですね!

基本スペック

AliExpress で買えるこのボードは二種類あるようです。

  • STM32F401CCU6ボード:84MHz, 256KB-FROM, 64KB-SRAM
  • STM32F411CEU6ボード:100MHz, 512KB-FROM, 128KB-SRAM
    使えるペリフェラルは、SPI, I2C, I2S, ADC, USB, RTC …そしてもちろんUART(笑)

どちらを買おうか…と迷ったら、後者のSTM32F411ボードが絶対良いです。価格差は数百円です。後述のとおり、micropythonも使えますし、MakeCode Arcade 対応端末を作れたり…遊べる幅が全然違いますね。

さらに詳しいことは、以下の github リンクを参照されたし。
https://github.com/WeActTC/MiniF4-STM32F4x1

遊ぶために他にも必要なもの

STM32 ボード全体に言えることですが、ファームウェアを書き込むためのツールが必要になりますね。

  • USBケーブル(現在絶賛普及中のTypeCでOK)。短い方が良い
  • USB-シリアル変換器(FT232RL)みたいなの。マイコン遊びに必須なので、秋月とかで買っておこう。
  • ST-Link。あると何気に便利です。AliExpress では、…とある理由で非常に安く売っているものがあります。

AliだとSTLinkも何故か安い

もちろん、母艦になるパソコンも必要です(^^;
そして、 STM32CubeProg という、とってもユーザー甘やかしな書き込みツールがあるので、ありがたくダウンロードしてインストールしておきましょう〜。
※インストールの方法については、OSによって一癖あります(^^;。詳しくはググるべし。

もちろんSTM32F4ボードはブートローダーというものを書き込まなくても、USBから書き込めるはずです。
プログラムを書き込むモード(ISPモード)に入るには、「BOOT0ボタン」を押しながらリセットをかけることによってできるのですが…


……
…筆者の環境では、なっかなか上手くDFUモードに入ってくれないことが多いですね…

それで、公式(github)にはこんなことが。

DFU Mode: Use the data line to connect to the computer. If there is an unrecognized problem, you can heat the chip appropriately (25°C) and then re-enter the ISP mode

あったかくして…

ですって(笑
筆者の場合、とにかくLinuxの dmesgコマンド を使って逐一確認しながら、DFUモードに入ったかどうかを確認していました…。めんどくさい場合はおとなしく ST-Link か、USB-Serial(めちゃくちゃ書き込み遅いですが;;;;)を使いませう…

そしたら…どうやって遊ぶんだい?

提案1:MakeCode Arcade 対応コンソールにする

現在、小中学校のプログラミング教育必修化という(未だに何をやればよくわかっていない)やつで ビジュアルプログラミング が大ブレイク中です。そいつでサクっとレトロゲーム風ゲームが作れる MakeCode Arcade という天下のMicrosoftのソリューションがあります。

そしてMakeCodeで作ったゲームを実機にダウンロードして遊ぶという実に面白い遊び方があります。実機は別途購入することもできますが、この記事で紹介している中華STM32F4ボードに適当なTFT-LCDをくっつければ、意外と簡単に・安価で自作できちゃったりするんです!

筆者が自作したMakeCode Arcade端末。よく見るとアラが目立つw

せっかくマイコンボードを手に入れてからには、Lチカだけじゃなくて、もう一歩進んで何かしたい…と考えている人にとっては、ちょうどいい遊びになると思います!

詳しくは↓拙著note↓を参照してやってください。
https://note.com/phillowcompiler/n/n8aacd9d7df3f

提案2:microPythonで遊ぶ

最近のPython人気は凄まじい限りで、今はマイコンのプログラミングでもPythonが使えちゃったりするんですね!

とりあえず、どんなものかサクっと試して・遊んで・学習してみたいですよね!(しかもお金をあまりかけずにw)もちろん、このボードでできてしまいます。

下記リンクの「irmware_internal_rom_stm32f411_v1.12-35.hex」を CubeProg で書き込むだけ。
https://github.com/WeActTC/MiniF4-STM32F4x1/tree/master/STM32F411CEU6-Black-Board/SDK/micropython

書き終わったらUSBケーブルでパソコンに繋ぐと、おなじみの疑似USBメモリドライブが現れます。

内部ROMだと容量いっぱいいっぱい

ここに出てくる main.py に適当なスクリプトを書いて保存すれば動くというわけですね。たとえばこう(笑)

import pyb
led = pyb.LED(1)
while True:
    led.toggle()
    pyb.delay(1000)

※これだと永遠に終わらなくなってしまうので、main.py をいじくりなおして while ループを解消してあげましょう!

もちろん、REPL だって使えます。PuTTY などのシリアルコンソールで繋いで、Enter を押し込めば、馴染み深い>>> が現れるので、コマンドを書いて遊べますね。

>>> myled = pyb.LED(1)
>>> myled.on()
>>> myled.off()

こんな感じ。

それにしても、内部ROMだと容量が心もとないですね…
この中華STM32F4ボードには、SPI-FlashROMを手弁当で追加できる回路がありますので、もしゲットする機会があったらハンダ付けも楽しんでしまいましょう!

さあ、ここにFlashROMをハンダ付けするんだ…

推奨されているのは、このあたりの安いSPI-Flashです。適当なのをどうぞ…。モジュール化されているやつの方が楽そうではありますね…
キャプションを入力できます
※外付けFlashROMを追加した場合、microPythonのファームウェアも変わります。

提案3:Arduinoで遊ぶ

結局はここに戻ってきてしまうのかもしれません…。設定が少し大変なのですが、なんだかんだで先人たちの膨大な資産を活用できるのは大きいのです。
Arduino-IDEでも、Platformioでもお好きなのをどうぞ。

なお、筆者はWindowsではUSBドライバーを入れるのがめんどくさいのでやってませんw たぶんZadigとかいじるやつ…。くわしくはググってください(無責任w)

Arduino-IDEの場合

環境設定→追加のボードマネージャのURLに
https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json
を追加して、ボードマネージャに「STM32」で検索すれば、この中華STM32F4ボードの情報もインストールされるようになっています。
ボード情報をインストールしてしまえば、「ツール」から…

  • ボード:Generic STM32F4 Series
  • Board Part Number:Black Pill F401CC

…を選んでしまえばおk(F411CEU6ボードでも問題なくビルド&書き込みができます)
キャプションを入力できます

PlatformIOの場合

筆者はArduino-IDEのトロさに辟易してしまったので、最近はこっちを使うことが多いですね。

★2020.11月追記
以前はこのボードはデフォルトで使えなかったのですが、見事「genericSTM32F411CE」ボードとして使えるようになりました! くわしくは →こちら

したがって、 platfomio.ini は以下のとおり。

[env:nv:genericSTM32F411CE]
platform = ststm32
board = genericSTM32F411CE
framework = arduino
upload_protocol = serial
build_flags =
 -D ARDUINO_BLACKPILL_F411CE

build_flagsARDUINO_BLACKPILL_F411CE を define するのを忘れずに!
upload_protocol は 指定しなければ serial なので、適宜 stlink などを指定することになるだろう。

Linux からアップロードできない場合!

Linuxからupload_protocol = serialで書き込もうとすると…

Unknown/unsupported device (Device ID: 0x431)

などと怒られることになる(T-T。
これは ~/.platformio/packages/tool-stm32duino/stm32flash フォルダーにある stm32flash がかなーり古いためで、STM32F411のデバイス情報が含まれたやつにビルドして差し替える必要がある。

新しいの stm32flash のソースは、このあたり から拾ってこよう。
普通に make と叩けば、stm32flash ができあがるはずだ。こいつを使えばSTM32F411も扱えるようになる。

$ ./stm32flash /dev/ttyUSB0 
stm32flash STM32duino_0.5.1

https://github.com/stm32duino/stm32flash

Interface serial_posix: 57600 8E1
Version      : 0x31
Option 1     : 0x00
Option 2     : 0x00
Device ID    : 0x0431 (STM32F411xx)
- RAM        : Up to 128KiB  (12288b reserved by bootloader)
- Flash      : Up to 512KiB (size first sector: 1x16384)
- Option RAM : 16b
- System RAM : 30KiB

上記 tool-stm32duino フォルダ以下にあるstm32flash と差し替えてしまおう。


↓↓↓ 以下は古い情報です ↓↓↓
ただ、デフォルトではこのボードが使えないんですよね…。ちょっと設定がめんどいです。

対処方法は このあたり に書いてあって、ボード定義ファイル(jsonファイル)を、platformioフォルダ(Linuxだと ~/.platformio ですね)以下にある「boards」フォルダーに突っ込んでやればいいらしい。

※jsonファイルは上記リンクからも入手できるけど、以下のとおり。

{
  "build": {
    "core": "stm32",
    "cpu": "cortex-m4",
    "extra_flags": "-DSTM32F4xx -DSTM32F411xE",
    "f_cpu": "100000000L",
    "mcu": "stm32f411ceu6",
    "variant": "PILL_F401XX"
  },
  "connectivity": [
    "can"
  ],
  "debug": {
    "jlink_device": "STM32F411CC",
    "openocd_target": "stm32f4x",
    "svd_path": "STM32F40x.svd"
  },
  "frameworks": [
    "arduino",
    "cmsis",
    "stm32cube"
  ],
  "name": "BlackPill F411CE",
  "upload": {
    "maximum_ram_size": 131072,
    "maximum_size": 524288,
    "protocol": "stlink",
    "protocols": [
      "jlink",
      "stlink",
      "blackmagic",
      "serial",
      "dfu"
    ]
  },
  "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f411ce.html",
  "vendor": "ST"
}

そして、platform.ini を以下のように書いてあげればいい(USBから書き込む場合)。

[env:blackpill_f411ce]
platform = ststm32
board = blackpill_f411ce
framework = arduino

upload_protocol = dfu
upload_port = anything

↑↑↑ 古い情報終わり ↑↑↑


※Platformio 全般に言えることとして、Linuxだと変なUSBドライバを入れなくて済むのですが、最初に /etc/udev/ のルールを書いておく必要があります。

その方法は以下のリンクに書いてあるので、がんばって設定しましょう!
https://docs.platformio.org/en/latest/faq.html#faq-udev-rules

※Arduinoの場合、ビルドしたファームを焼き焼きする前にボードの方をISPモード(BOOT0を押しながらリセット)にしておく必要があるでしょう。

最後に

これだけで1〜2年は遊び倒せそうな(笑)、たいへんコスパの高い 中華STM32F4ボード の紹介でした!

…でも、最近はより性能が高くて、無線まで使えてしまう ESP32 の方が人気ですよね…やっぱり…

2
ログインしてコメントを投稿する