中華STM32F4ボードで遊ぼう!
はじめに
STM32シリーズはARMアーキテクチャを気軽に扱えるたいへん人気のあるマイコンです!
本家ST社謹製のマイコンボード「Nucleoシリーズ」は数千円で買えるので、個人がホビー用途でも手を出しやすく、いろいろな電子工作系のブログでも見かけたりしますね!
さらにSTM32F103ボード(通称「bluepill」)だとAliExpressあたりで2ドル未満というアホのように安くて、それこそLチカだけ実験して使い捨てても全く惜しくないような値段(!?)で売られていたりします。しかも Arduino が扱えるので、AVRマイコンのArudinoからステップアップしたい…と思っている方々には最適なソリューションというわけですね。
…しかし!人間の欲望というものは限りが無いもので、bluepillの64KB-FROM/20KB-SRAMでは(AVRマイコン時代を考えれば十分に潤沢なリソースなのですが)、意外とすぐに不足気味になってしまうものです。今や猫も杓子もpython…の時代ですから、microPython だっていじくりたいじゃないですか!
じゃあ、STM32F4シリーズにステップアップしよう!
F4シリーズなら ARM-CortexM4 ですってよ。奥さん。(F103シリーズは ARM-CortexM3)
…というわけで…AliExpressを彷徨っていたら、面白そうなSTM32F4ボードを発見したのでした。しかも安い…(2020年5月現在で300〜500円くらい)。い…一応ST社のロゴが入っているので大丈夫でしょう〜(震え声)。
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 では、…とある理由で非常に安く売っているものがあります。
もちろん、母艦になるパソコンも必要です(^^;
そして、 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をくっつければ、意外と簡単に・安価で自作できちゃったりするんです!
せっかくマイコンボードを手に入れてからには、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メモリドライブが現れます。
ここに出てくる 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を手弁当で追加できる回路がありますので、もしゲットする機会があったらハンダ付けも楽しんでしまいましょう!
推奨されているのは、このあたりの安い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_flags
で ARDUINO_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 の方が人気ですよね…やっぱり…
投稿者の人気記事
-
phillowcompiler
さんが
2020/05/06
に
編集
をしました。
(メッセージ: 初版)
-
phillowcompiler
さんが
2020/05/06
に
編集
をしました。
-
phillowcompiler
さんが
2020/05/06
に
編集
をしました。
-
phillowcompiler
さんが
2020/11/21
に
編集
をしました。
-
phillowcompiler
さんが
2020/11/21
に
編集
をしました。
-
phillowcompiler
さんが
2020/11/21
に
編集
をしました。
(メッセージ: 2020.11.21追記)
-
phillowcompiler
さんが
2020/11/21
に
編集
をしました。
-
phillowcompiler
さんが
2020/11/21
に
編集
をしました。
-
phillowcompiler
さんが
2020/11/21
に
編集
をしました。
ログインしてコメントを投稿する