phillowcompiler が 2020年11月21日23時04分12秒 に編集
コメント無し
記事種類の変更
セットアップや使用方法
本文の変更
# はじめに 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](https://github.com/WeActTC/MiniF4-STM32F4x1) ### 遊ぶために他にも必要なもの STM32 ボード全体に言えることですが、ファームウェアを書き込むためのツールが必要になりますね。 - **USBケーブル**(現在絶賛普及中のTypeCでOK)。短い方が良い - **USB-シリアル変換器**(FT232RL)みたいなの。マイコン遊びに必須なので、秋月とかで買っておこう。 - **ST-Link**。あると何気に便利です。AliExpress では、[…とある理由](https://eetimes.jp/ee/articles/2001/28/news032.html)で非常に安く売っているものがあります。  もちろん、母艦になるパソコンも必要です(^^; そして、 [STM32CubeProg](https://www.st.com/ja/development-tools/stm32cubeprog.html) という、とってもユーザー甘やかしな書き込みツールがあるので、ありがたくダウンロードしてインストールしておきましょう〜。 ※インストールの方法については、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](https://arcade.makecode.com/) という天下のMicrosoftのソリューションがあります。 そしてMakeCodeで作ったゲームを実機にダウンロードして遊ぶという実に面白い遊び方があります。実機は別途購入することもできますが、この記事で紹介している中華STM32F4ボードに適当なTFT-LCDをくっつければ、意外と簡単に・安価で自作できちゃったりするんです!  せっかくマイコンボードを手に入れてからには、Lチカだけじゃなくて、もう一歩進んで何かしたい…と考えている人にとっては、ちょうどいい遊びになると思います! 詳しくは**↓拙著note↓**を参照してやってください。 [https://note.com/phillowcompiler/n/n8aacd9d7df3f](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](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**」ボードとして使えるようになりました! くわしくは →[こちら](https://docs.platformio.org/en/latest/boards/ststm32/genericSTM32F411CE.html) したがって、 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 が `~/.platformio/packages/tool-stm32duino/stm32flash ` フォルダーにある `stm32flash` がかなーり古いためで、STM32F411のデバイス情報が含まれたやつにビルドして差し替える必要がある。
これは `~/.platformio/packages/tool-stm32duino/stm32flash ` フォルダーにある `stm32flash` がかなーり古いためで、STM32F411のデバイス情報が含まれたやつにビルドして差し替える必要がある。
新しいの stm32flash のソースは、[このあたり](https://github.com/stm32duino/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` と差し替えてしまおう。 ---- **↓↓↓ 以下は古い情報です ↓↓↓** ただ、デフォルトではこのボードが使えないんですよね…。ちょっと設定がめんどいです。 対処方法は [このあたり](https://github.com/stm32duino/Arduino_Core_STM32/issues/876) に書いてあって、ボード定義ファイル(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](https://docs.platformio.org/en/latest/faq.html#faq-udev-rules) ※Arduinoの場合、ビルドしたファームを焼き焼きする前にボードの方をISPモード(BOOT0を押しながらリセット)にしておく必要があるでしょう。 # 最後に これだけで1〜2年は遊び倒せそうな(笑)、たいへんコスパの高い **中華STM32F4ボード** の紹介でした! …でも、最近はより性能が高くて、無線まで使えてしまう **ESP32** の方が人気ですよね…やっぱり…