M5StackのCardKBのファームウェアを書き換える

電子工作

M5StackのCardKBユニットをマイコン向けJR-100エミュレータのキーボードとして使うために、CardKBのファームウェアを書き換える手順をまず確立してみます。

CardKBとは

M5Stackで使うためのキーボードユニットです。写真の上がM5Stack BASIC、下がCardKBです。M5StackとはI2C(アドレス0x5F)で通信します。接続にはGROVEケーブルを使用します。CardKB上にはキー入力をI2Cで送信するためのファームウェア実行用としてATmega328Pが搭載されています。

組み込まれているファームウェアでは、キーボードを押して離したタイミングで、キーコードがM5Stackに送信するようプログラムされています。シフトキー(↑の表示があるキー)や記号入力用のキー(Symキー)、ファンクションキー(Fnキー)などの特殊キーの押下はCardKBのファームウェア内で処理され、特殊キー自体のキーコードはM5Stackに送信されません。

エミュレータの実行においては、特殊キーを含むすべてのキーに対して、キーを押す、キーを離す、というイベントを拾う必要があるため、既定のファームウェアそのままでは使えません。CardKBには幸いISPのパッドが用意されており、ファームウェアを書き換えることができます。本記事ではファームウェアを書き換える方法について記します。

前提条件

  • Arduino IDEがセットアップされている。
  • Arduino UNO用のシリアルポートドライバがパソコンにインストールされている。

ISPポート

CardKBの公式ドキュメントでISPパッドの配置が公開されています。基板左下にある6個のパッドがそれで、左から順にVCC, RST, SCK, MISO, MOSI, GNDとなります。

1 2 3 4 5 6
VCC(+5V) RST SCK MISO MOSI GND

ここに6ピンのピンヘッダをはんだ付けして、ブレッドボードに刺さるようにしておきます。はんだ付けする代わりに、スルーホール対応のジャンパーワイヤー(秋月のC-09830など)を使っても良いですが、何度もワイヤーを抜き差しするような使い方であれば、はんだ付けの方が基板を痛める心配が無くて良いでしょう。

Arduino ISPの設定

CardKBのファームウェアはM5StackのGitHubで公開されています。コードを見るとArduinoで作成されているようです。そこでArduino UNOを使ってファームウェアの開発環境を作ってみることにします。まずArduino UNOをライターとして動作させるために、次のような回路を作成します。LEDは無くても構いませんが、ちゃんとISPとして動作しているかを確認するために配線しています。なお実験では抵抗入りのLED(秋月のI-12517, I-12518, I-12520など)を使って部品点数を削減しています。

これを実際に配線したものが下の写真です。イメージ図とは部品の配置が異なることに注意してください。

 

配線が終わったら、Arduino UNOのISPプログラムを書き込みます。Arduino IDEを起動して、ファイル > スケッチ例 > 11.Arduino ISP > Arduino ISP の順に開き、Arduino UNOに書き込みます。書き込みに成功すると、3つのLEDが緑、黄色、赤の順に点灯し、最後にハートビートLED(赤)が点滅します。これでISPとしての動作が可能となりました。

CardKBへのファームウェアの書き込み

いよいよCardKBにファームウェアを書き込みます。手始めに購入直後に書き込まれているファームウェアと同じものを書き込んでみます。

1. ファイルの準備

GitHubからCardKeyBoard.inoをダウンロードして、CardKeyBoardフォルダに格納します。

$ mkdir CardKeyBoard
$ https://raw.githubusercontent.com/m5stack/M5-ProductExampleCodes/master/Unit/CARDKB/firmware_328p/CardKeyBoard/CardKeyBoard.ino

CardKeyBoardフォルダをArduino IDEで開きます。

2. Arduino IDEの設定

開いたソースコードを修正せずにそのままCardKBに書き込みます。スケッチメニューで以下のように設定します。

  • ボード: Arduino Pro or Pro Mini
  • プロセッサ: ATmega328P (3.3V, 8MHz)
  • シリアルポート: Arduino UNOが接続しているパソコンのシリアルポート
  • 書き込み装置: Arduino as ISP (Arduino ISPという似て非なるものがあるので注意)

CardKBへの書き込み

スケッチメニューから「書込装置を使って書き込む」を選んで、プログラムのコンパイルと書き込みを実行します。書き込み中は書き込み中LED(緑)が点灯します。本来は正常に書き込みが完了すると再びハートビートLED(赤)の点滅状態になるはずなのですが、私の環境ではエラーLED(黄)が点灯します。一応この状態でも以下のようにIDEのメッセージエリアではエラーは出ていないので問題ないはずですが……。

avrdude: Version 6.3-20190619
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch

System wide configuration file is "/Users/kenichi/Library/Arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf"
User configuration file is "/Users/kenichi/.avrduderc"
User configuration file does not exist or is not a regular file, skipping

Using Port : /dev/cu.usbmodem144401
Using Programmer : stk500v1
Overriding Baud Rate : 19200
AVR Part : ATmega328P
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PC2
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :

Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 20 4 0 no 1024 4 0 3600 3600 0xff 0xff
flash 65 6 128 0 yes 32768 128 256 4500 4500 0xff 0xff
lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00

Programmer Type : STK500
Description : Atmel STK500 Version 1.x firmware
Hardware Version: 2
Firmware Version: 1.18
Topcard : Unknown
Vtarget : 0.0 V
Varef : 0.0 V
Oscillator : Off
SCK period : 0.1 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "/var/folders/bq/507cz0h16dj96s1jyyj1zcnr0000gn/T/arduino_build_756748/CardKeyBoard.ino.hex"
avrdude: writing flash (7518 bytes):

Writing | ################################################## | 100% 8.22s

avrdude: 7518 bytes of flash written
avrdude: verifying flash memory against /var/folders/bq/507cz0h16dj96s1jyyj1zcnr0000gn/T/arduino_build_756748/CardKeyBoard.ino.hex:
avrdude: load data flash data from input file /var/folders/bq/507cz0h16dj96s1jyyj1zcnr0000gn/T/arduino_build_756748/CardKeyBoard.ino.hex:
avrdude: input file /var/folders/bq/507cz0h16dj96s1jyyj1zcnr0000gn/T/arduino_build_756748/CardKeyBoard.ino.hex contains 7518 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 4.59s

avrdude: verifying ...
avrdude: 7518 bytes of flash verified

avrdude done. Thank you.

4. 動作確認

CardKBをM5Stackに接続し直して、問題なく動作するかを確認します。テスト用にM5Stackのサンプルプログラムを使用するのが良いでしょう。問題なければ、ファームウェアの改造に取り掛かりましょう!

コメント

タイトルとURLをコピーしました