2017年4月19日水曜日

I-O DataのWN-AC433UAをArch Linuxで使いAPを立てる(2017年4月版)

概要:以前の投稿で、いくつかリンクをいただいておりましたが、最近のカーネルでは新しいv5のデバイスドライバのほうがよさそうでした。パッケージは「aur/rtl8812au-v5-dkms-git」です。

TL;DR;


2017年3月末頃のLinux Kernel 4.10になって、いままでWi-Fiルータとして使っていたIntel NCU NCU5CPYH内蔵のWi-Fiチップ「Wireless-AC 3165」では起動時に
kernel: iwlwifi 0000:02:00.0: L1 Disabled - LTR Disabled
のエラーがあったり、APに接続してくるデバイスが6か7台目を超えるとマイクロコードのエラーを発生してドライバの再起動を繰り返し、最後にはカーネルパニックで死ぬ、ということになっておりました。

ファームウェア27が現在の最新のようですが、考えられる手を尽くすもどうにもならないので、いったんお蔵入りしていたWN-AC433UAを復活させることにしました。

ただ、いままで使っていたRealtekドライバ4.3.20ベースの「aur/rtl8812au_rtl8821au-dkms-git」が認識されず、同じチップでより新しい、バージョン5.1.5ベースのドライバが最終更新日2017年4月17日でしたので、これに入れ替えることにしました。

以前のドライバのアンインストール


まず、いままでのドライバをdkms removeしておきます。
sudo dkms status
すると、「rtl8812au_rtl8821au, 4.3.22_beta.r9.928e27f, ...」云々と出てくると思いますので、
sudo dkms remove rtl8812au_rtl8821au/4.3.22_beta.r9.928e27f --all
のような感じで「モジュール名/モジュールのバージョン番号」を指定してください。バージョン番号ですが、AURのページをみると、この4.3.22ではなく4.3.20が最新のようですね(ただし2016年9月11日以後更新がない)。

その後、yaourt -Rでアンインストールします。
yaourt -R rtl8812au_rtl8821au-dkms-git

新ドライバのインストール

yaourt -S rtl8812au-v5-dkms-git
コンパイルしてインストールすると、dkms addまで自動でやってくれます。
$ dkms status
rtl8812au-v5, 5.1.5, 4.10.10-1-ARCH, x86_64: installed
うまくインストールできているようです。ip linkすると、wlp0s20u1というデバイスが見つかると思います。

hostapdの設定


その前に、ブリッジデバイスを作っておきます。systemd-networkdを使っているので、

/etc/systemd/network/br0.netdev
[NetDev]
Name=br0
Kind=bridge
/etc/systemd/network/br0.network
[Match]
Name=br0
[Network]
Address=192.168.0.1/24
IPForward=yes
などとしておきます。sudo systemctl restart systemd-networkdすると生えてくるんでしょうか、むかし作ったときには再起動してしまったので不明です。 あと、以前はwlp0s20u1をbr0につないでおくという話だったような気がしますが、いまhostapdの解説を読むと、それは「やってはいけない」らしいです。なので、適当にIPアドレスを振っておきます。

/etc/systemd/network/usbwifi.network
[Match]
Name=wlp0s20u1
[Network]
Address=192.168.0.2
こんな感じでしょうか。

それで、iw listした結果からこのチップでサポートされている機能を探り、いま当方で動いているhostapd.confは以下の通りです。

/etc/hostapd/hostapd.conf
interface=wlp0s20u1
driver=nl80211
bridge=br0
ieee80211d=1
country_code=JP
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
ctrl_interface=/run/hostapd
ctrl_interface_group=0
ssid=設定するSSID
hw_mode=g
channel=7
beacon_int=100
dtim_period=2
max_num_sta=255
rts_threshold=2347
fragm_threshold=2346
macaddr_acl=0
auth_algs=3
ignore_broadcast_ssid=0
# IEEE 802.11n
ieee80211n=1
ht_capab=[HT40+][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40]
# IEEE 802.11ac
#ieee80211ac=1
#vht_capab=[HT40+][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40]
vht_oper_chwidth=0
wmm_enabled=1
wmm_ac_bk_cwmin=4
wmm_ac_bk_cwmax=10
wmm_ac_bk_aifs=7
wmm_ac_bk_txop_limit=0
wmm_ac_bk_acm=0
wmm_ac_be_aifs=3
wmm_ac_be_cwmin=4
wmm_ac_be_cwmax=10
wmm_ac_be_txop_limit=0
wmm_ac_be_acm=0
wmm_ac_vi_aifs=2
wmm_ac_vi_cwmin=3
wmm_ac_vi_cwmax=4
wmm_ac_vi_txop_limit=94
wmm_ac_vi_acm=0
wmm_ac_vo_aifs=2
wmm_ac_vo_cwmin=2
wmm_ac_vo_cwmax=3
wmm_ac_vo_txop_limit=47
wmm_ac_vo_acm=0
eap_server=0
own_ip_addr=127.0.0.1
wpa=2
#wpa_psk=暗号化されたパスフレーズ
wpa_passphrase=平文のパスフレーズ
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
ご武運を祈ります。

ひとつの設定ファイルでBand 1(2.4GHz帯)とBand 2(5GHz帯)両方を設定するのは面倒そうなので、Band 1のほう(802.11n)を生かしています。Band 2(802.11ac)の設定をする場合は、
hw_mode=a
channel=36
(チャンネル番号はWikipediaの項目を参照)のように置き換えることになると思います。

また、この設定でjournalctl -fのログをみているとちょっとうるさいので、logger_syslog_levelの値を34(大きいほど情報が減る)にしたほうがいいかもしれません。

このあと、iptablesでNATの設定したり、DHCP等の設定が必要ですね。「インターネット共有」のドキュメントを参照してください。

自宅用ではdnsmasqでDHCPサーバとDNSリレーを兼用するのが簡単だとは思いますが、多数の接続がある環境では不具合があるようなので、当方ではdhcpdunboundを設定しています。

2017年3月6日月曜日

秋月TB6612FNG使用デュアルモータドライバ基板について

2月27日に秋月を訪問したところ、TB6612FNG使用デュアルモータドライバ基板を発見、店頭にあったものの大半をおさえてしまった。「新製品なんで店頭在庫少なめ」という話だったけれど、いまサイトをみると、3日前に発売開始したばかりだったらしい。
TB6612使用 Dual DCモータードライブキット (K-11219) 
モータドライバは発熱が怖いので、どうしても十分な放熱面積を確保したモジュール基板を使いたくなってしまう。ところがSparkFunやPololuのブレークアウト基板はかなりいい値段になってしまうので、350円というのはとてもありがたい。

しかし、この基板はブレッドボードでの実験用という位置づけのようで、ロジック側の9ピンは、秋月細ヘッダピン(φ0.5)に合わせた穴サイズ、モータ用電源やモータはターミナルブロックに合わせて5.08mm間隔のピン間隔になっている。マイコン基板を製造して、そこに載せるにはなかなかつらい。特に、ターミナルブロックを載せるために、Pololuと較べて縦横10mm以上大きくなるのもやや難点(放熱的には有利だろうけれど)。

そこで、外形のどの位置にピンがあるのか、もちろん加工誤差があるので記述しても意味がないのだけれど、クリアランスの目安がほしかったので、ノギスをあて、だいたいの寸法を入れてみたのが下の図。
秋月の「取扱説明書」に、寸法を追加してみた図
穴径で、ターミナルブロック側はφ1.3と書いたけれど、秋月のピンヘッダで製造する基板に載せることを考えると、ピンヘッダは0.64SQなので、対角1.1mmと考えてφ1.2で十分かもしれないし、製造公差やめっき処理の種類によってはφ1.3がよいかもしれない。基板の実寸はφ1.2のようだった。ターミナルブロック本体の足はφ1.0とのこと(こちらの寸法図より)。

また、説明書には「JP1をショートすることによりSTBYをプルアップ可能」とありながら、この図ではJP1の位置が、文字のどちら側なのか見えにくいので、印をつけておいた。よくある、半円が向かい合ったジャンパパターンが基板にあるのが確認できたし、回路図でもR1(10kΩ)でプルアップする形なので、隣に並んでいるのは、まあそうなのかなと思う。ただ、ICと非常に近いので、はんだづけが苦手な人には、ここにはんだを盛るのはやや難しいかもしれない。

ひとつ気になるのは、C1(0.1uF)をVMとGNDの間に入れているのはよいとして、VCC側にCがなぜないのか疑問。データシート通りに、VCCとVM両方に0,1uFと10uFを並列に入れるのが無難かと思うところ。ブレッドボードで使う人は、3番(VCC)と、ひとつ置いた5番(GND)のところに、リードの積セラ0.1uFをはんだづけしておくといいんではないだろうか。

製造予定の基板では、いつもモジュールを基板上に実装するときに使っている、秋月のロープロファイルピンヘッダ(7.7mm)の足を一本ずつ抜くか、モジュール側だけ切るかしたのをモータ側に使って高さを合わせようと思っている。ソケットは使わない予定だが、使いたい方は、対応したロープロファイルのピンソケットと、細ピンヘッダはICソケットが合うそうなので、丸ピンソケットを使われるのがよいのではないかと思う。

2016年12月14日水曜日

Mac OS Sierradでのボリューム修復

もう5年を超えるMac miniを業務のメインマシンとして使っているのですが、一昨年ドライブをいろいろと交換して、なんとか継続使用中です。

もう新しいマシンを購入できる予算がないので工夫するわけですが、昨夜自宅からつながらないなあと思ったら、起動前の白い画面で固まっておりました。っていうかいつ再起動したんだ。

いちばんつらかったのがTimeMachine用ドライブが認識しなかったことですが、これはDisk UtilityのFirst Aidでなんとかなりました。

一方、別の外付けドライブがFist Aidでどうにもならず、検索したんですが、起動ディスクが認識しないときの古い話で、「single user modeでfsck -fyを繰り返す」というのですが、Sierraにはどちらのオプションもありません。

試行錯誤したところ、
# fsck_hfs -l ファイルシステム名
で、なんとかなりました、とりあえず。「-l」は、マウント中でも強制チェックするためのもののよう。

まだまだ問題が出そうですが、ひとまずこちらへメモ。

2016年9月11日日曜日

FT231XS(SSOP20タイプ)のピン配置図

まさか公式データシートにピン配置図がないとは...

あんまりびっくりしたんで、パワポで作図してみました。
FT231XSのピン配置(SSOP20タイプ)
ご参考まで。データシートを読めば誰でも作れる図だと思いますので、ご自由にお使いください。

This is a pin layout of FTDI FT231XS which is missing in official FTDI's datasheet.

You may use this freely because anyone can draw this by reading the datasheet.

DISCLAIMER:
LICENSE of this picture:  AS-IS.
I don't have any warranty to the correctness of this picture.  Use at your own risk.

2016年9月10日土曜日

Eagleで作るドリルデータがgerbvでよく見えない件→解決

いまだにEagleの無償コースを使っています。KiCadのいま、とか、Altiumのクラウド版CircuitMakerなどに全くついていけていません。クラウド版CircuitMakerについては、日本語ではガレスタさんの詳しい解説がありますね。

というわけで今回のプロジェクトもEagleなのでして、しかもいまさら感のある内容ですが検索してもなかなかわからなかったので、こちらに書くことにしました。

Eagleで作ったガーバーファイルをプレビューするにはMacならgerbvが定番だと思うのですが、ここで問題になるのがドリルデータがちゃんと見えない件。基板製造会社さんはドリルデータ作成にexcellon.camを使ってくださいとだいたい書かれていますが、できたガーバーファイルをgerbvでプレビューすると、ドリル穴が見えないぐらいちっちゃくて不安になるパターンでありました。コールセンターに電話して確認する感じで。それもどうかということで、調べてみました。

ドリルの問題については、OSH社のサポートページがよくまとまっています。
Common Errors with Drill Files - OSH Park Docs
んで、「EXCELLON24を使え」というんですが、それがどこにあるかは書いてありません。それで検索しつつさまよっていたところ、「Eableのbinの下にあるeagle.defを見ろ」と書かれた呪いがありまして、早速たしかめてみると、いわゆるWindowsの設定ファイルの形式でありました。つまり、角括弧の見出しのあとに、「キーワード=値」がずらっと並ぶもので、たくさん見出しがあるんですが、そのなかに、「EXCELLON」と「EXCELLON_24」があったわけです。

このふたつのどこが違うかというと、ResXとResYが10倍違っていて、EXCELLONは100000、EXCELLON_24は10000でありました。加工機の精度に合わせてあるんだと思うのですが、他のデータを作るGERBER_RS274Xは10000なのでして、gerbvがそっちに合っているのかなと思った次第です。低い方の数値でも工場が保証する加工精度には十分見合っているようなので、camファイルをコピーして、EXCELLON_24に書き換えておきました。具体的には、4行目を
Device="EXCELLON_24"
のように、「_24」を追記しただけ、ということであります。

ご参考になれば。

2016年8月28日日曜日

ATmega32U2のMinimus32開発環境―Windows編

さきほどのMinimus32について、プロジェクトのサイトが見つかりましたので最初にご報告。
projects/minimus32 - rlab.org.uk
連合王国でしたのですね。さすが小さなものがお好みなお国柄。あと、同じく連合王国のリーズにあるハックスペースさんでも情報提供が。
Minimus - wiki.leadshackspace.org.uk
MAXIMの1Wireプロトコルの実装by pbrookさんが紹介されています。I2Cがなくても俺たちには1Wireがあるという心意気でしょうか。

それで、WindowsのArduino IDE 1.6.11ではどうだろうと試してみたところ、ZIPを展開した状態ではどうもうまくいかなくて、インストーラで入れた1.6.11に、Surreallitylabsさんの1.6対応の一式を、Macと同様にぶっこんだあと少し調整したら、一応なんとかなっているようです。

  1. c:\Program Files(x86)\Arduino\hardware の下に、minimumというフォルダを作成して、上のをZIPでとってきて展開した「avr」フォルダをそのなかに放り込みます。
  2. 念のため、boards.txtの冒頭に、arduino側と同じ一行「menu.cpu=Processor」を書いておきます。
  3. コンパイルしてみるとplatform.txtの記述が古いよといいつつ終えるのですが、気持ち悪いのでarduino側にあるものをコピーして入替えます。
これで、Arduino IDEを起動すると、ちゃんとMinimus32がCPUとして選べて、コンパイルまで成功します。あ、もし3.3V版にしているのでしたら、先ほどのエントリの内容にしておいてください。

転送、って言ってませんが、avrdudeが一時的に作成されているはずのhexファイルが「見つからない」という理由以上終了し、呼び出したArduino IDE側がJavaランタイムのスタックトレースを吐いてしまいます。

様子がよくわからないので、コマンドプロンプトを開いて、そこからarduino_debug.exeを起動して同じことをやると、不思議なことに、hexファイルを見落とすことなく書き込みまできれいに完了してしまいました。よくわかりませんが。

ということで、まあこれで当面の目的は達成できるのでよしとして、困ったのが、COMポートの番号増加であります。書き込み終了と同時に、USBの抜き差しの音が出たんで嫌な予感がしたんですよね。

なんとなく、シリアルポートが開いた状態で、avrdudeが書き込みを行うときにCPUのリセットをかけてしまうと、Windowsの都合で、開いた状態のポートが消える前に新しいポートを作ろうとして、番号が上がってしまうというではないかと疑っているところです。

ATmega32U2にArduinoのbootloaderを書き込んでArduino IDEが使えるようにした(追記:2016年9月10日)

とある事情から、ATmega32U2をArduino化する必要があり、いろいろと困っておりましたが、解決したので記録を兼ねてご報告。

まずATmega32U2がArduinoになるのか、ということですが、「ATmega32U2にはADCもI2Cもない」。アナログ入力がないわけです。それらが揃っているのはU4のほう。U4はArduino Leonardoに始まり、各種のボードが販売されているものの、U2は機能不足だから商品化するメリットないよね、と納得しました。(追記 2016-09-10:データシート見ると,A0に対するコンパレータはあるようです。端子にAIN0に対してAIN1〜6がMUX経由でコンパレータにつながっている図がありました。ピン配置をみると,Port D(PD1,4-7)がアナログ入力ですね。PC2にAIN2が飛んでいますけど)

とはいえU2ちっちゃいしピン数もU4より少なくて値上がりしたとはいえまだ秋月で400円だし、もう撤退できない状況があるので、検索をGoogleに変更してみたところ、わりとあっさりとkosakailabさんのブログエントリがヒットしまして、
ATmega32U2でArduinoモドキを作る - kosakailab
Minimus32というプロジェクトがあり、一部販売も(?)されたことがあるらしいことを知りました。

kosakailabさんがGitHubリポジトリとbootloader作成の手がかりを示してくださっているほか、こちらMinimus32解析サイトで部品や回路図などが書き起こされていることで、一通りのなかみはわかりました。
pbrook/minimus-arduino - GitHub
実際のところ、5V電源で16MHzのクロックを使うなら、すでにhexが置いてあるのでコンパイルする必要はないんですが、3.3V動作にする都合でクロックを8MHzに変更する必要があり、Makefileを書き換えてコンパイルする必要があった次第。
データシートの26.3項に、「安全動作圏」を示したグラフがあり、8bitのAVRマイコンでは3.3Vでは10MHz以下のクロックにしなければなりません。Arduinoでは3.3V製品としてSparkFun製Arduino Pro Miniの3.3V版があり、それに合わせて8MHz設定が公式ライブラリに追加されているので、3.3V動作の場合、8MHzのクリスタル一択です。
bootloaderコンパイルにはLUFAが必要だよ、と書かれています。Unoが搭載しているUSB-UART変換にいまはATmega8U2が使われていますが、かつてはATmega16U2が使われていたこともあり、それらには、LUFAが活用されているようです。
オフィシャルサイトは「(2013)」と但し書きがついていますが、GitHubリポジトリは今年も更新されているようです。ともかくも、LUFAは、USBつきAVR開発支援軽量ライブラリとのこと。

さてそんじゃあbootloader作るべし、となるのですが、minimusプロジェクトが3年前で止まっているので、ちと工夫が必要でした。

まず、pbrookさんのレポジトリですが、Forkとjoinのグラフをみると、2年前にSurrealityLabsさんが手を加えたのがいまの最新っぽく見えました。
SurrealityLabs/minimus-arduino - GitHub
これを開くといきなり「avr」しか見えなくて不安になりますが大丈夫、全部入ってます。

よって、ここからgit clone。あとLUFAですが、最新のリポジトリからもってきたものはいろいろ構成がかわっているようで、コンパイルが通らず、Makefileに書かれていた111009(2011年10月9日版)を公式サイトからダウンロードしてくるのが簡単でした。

配置ですが、avr-gccなどツールチェインをArduino IDEから借りるのが手っ取り早いので、すでにインストールしてあるArduino IDE 1.6.11に組み込んでしまうのが話が早いです。あと、Windowsではmakeをどうするの、とかよくわからなかったのでコンパイルはMacでやりました。実はBash on Ubuntu on Windows 10でがんばってみたんだけど断念。いま思えばLinux用Arduino IDEから拾えばよかったのかも。

コンパイルに必要な変更は、Makefileの「F_CPU = 16000000」を8000000に変更するだけ。あと、bootloaderはCaterinaを使っていて、USBのVID/PIDは、Arduino LLCのVIDとLeonardoのPIDが書かれたままになっていますが、目をつぶってそのままに。おかげでlsusbすると「Arduino SA Leonardo ( CDC ACM, HID)」と出ますが、まあそういうことであります。

pbrookさんのWikiには、Arduino IDEのhardware/avr以下を置き換えろみたいな乱暴なことが書かれていますが、そうするとMacの場合、Arduino IDEが上がらなくなってしまいました。

で、Windowsのほうではどうだろうと、SurrealityLabsさんのplatform.txtには1.6.0と書かれているので1.6.0でがっつり置き換えると、まあ起動はしましたが、bootloaderを書こうとすると、「書き込み装置の選択をしろ」的なメッセージが出て先に進みません。AVRISP mkIIを使っているので、それを選択してあるんですが、どうもだめ。

そこで再び検索すると、こんなブログエントリがありまして
Arduino IDE on Windows with Minimus32 Profile
なんだか、「一式固めといたよ」としてZIPファイルがリンクされていました。ですが、これを展開するとバッチファイルがありまして、Arduino IDE 1.0.5をダウンロードしてそこに置き換えのツールチェインとpbrookさんのリポジトリのZIPを配置する、というような仕立てになっておりました。

それができた状態で、Macで作ったhexファイルをもとのものと置き換えるものの、こちらではbootloaderを書き込もうとするとJavaのランタイムエラーが出てだめでした。Windows 10(1608版)なんですが。

もうこれはavrdudeのコマンドラインでいくしかないかな、と思いつつ、「もしやMacでこれと同じ構成にしたらうまくいくんではないか?」と思ったところ、うまくいきました。

Arduino IDEの設計は全くわかっていないんですが、hardware以下にarduinoというフォルダがあるところを、上のバッチファイルで作成した1.0.5版では、minimusというフォルダを隣に作り、pbrookさんの一式はこちらにまるっと入れるという仕上がりになっていて、既存のファイル、特にboards.txtなんかは一切書き換えていないのですが、起動したArduino IDEではきちんとminimus以下のboards.txtの内容が反映されていたわけです。

ということで、Macの1.6.11でも同様に、hardware/minimusというフォルダを作り、一式をそこに放り込み、LUFA-111009も放り込んでMakefileavr-gcc等を呼び出すパスの追記やLUFAのパスを現状に合わせます。それから、macOSの認証を通すために一度無改造のままArduino.appを起動してからなかみの変更をする必要がありますが、最初の起動時に、ボード設定その他をJSON形式で ~/Library/Arduino15 以下に置くので、それをリセットするために、このフォルダごと消しておきます。

そして、とても大事なことなんですが、3.3Vにしたので、boards.txtに記述するAVRのフューズビットの設定を変更し、ブラウンアウト(電圧低下)検出 の電圧を3Vから2.7Vにしておかないと不安です。フューズビットは書き込み時にavrdudeのコマンドラインをArduino IDEが生成するときboards.txtを参照するので、その16進の値を理解して、適切に設定した内容を書いておかなければなりません。

ここで、AVR Fuse Calculatorの出番です。ところが検索してもATmega32Uシリーズが入っているものがなかなかありませんが、なんとか見つけました。
Engbedded Atmel AVR® Fuse Calculator - Electronics-Base.com
で、「AVR Part Name」はATmega32U2ですからすぐ終わるわけですが、あとが困ります。わかんねえ。データシート全部読むのめんどい。

Atmelのデータシートの作りも不親切で、Fuse Bitについてまとめた項目がないんですよ。機能の説明があって、そこにFuse Bitはこう設定する、という部分的な表がばらばらにあるので、一覧できない。全部嫁ということになる。

まあいいや、ということで、既存のboards.txtでATmega32U4が採用されているものと、Minimus32の設定を見比べつつ、上の計算機の値をポチポチしてみると、Minimus32とU4採用Arduinoのfuse bitの設定は同じだということに気づくわけです。Yún, Leonardo, Micro, Esplora, Lilypad USB、どれとも共通です。すると問題になるのはBODの電圧設定のみで、それはextendedの項目であり、5V版である既存設定では3.0V。U2の場合選べるのは最低2.7Vしかないので、そこだけを変更。すると、0xf8が0xf6になるだけだ、という結論が導かれました。

ということで、既存のminimus32の設定を複写して、minimus32v33とかクラス名を変更したところで、name=Minimus 32 (3.3V)とか書いて、bootloader.extended_fuses=0xf6と書き換えます。あと、build.f_cpu=8000000L も忘れずに変更しておきます。build.usb_productにも「3V3」を追記して、これでおしまい。

参考までに、作ってみた部分を掲載しておきます。
#############################################################

minimus32v33.name=Minimus 32 (3.3V)
minimus32v33.vid.0=0x2341
minimus32v33.pid.0=0x0036
minimus32v33.vid.1=0x2341
minimus32v33.pid.1=0x8036
minimus32v33.upload.tool=avrdude
minimus32v33.upload.protocol=avr109
minimus32v33.upload.maximum_size=28672
minimus32v33.upload.speed=57600
minimus32v33.upload.disable_flushing=true
minimus32v33.upload.use_1200bps_touch=true
minimus32v33.upload.wait_for_upload_port=true

minimus32v33.bootloader.tool=avrdude
minimus32v33.bootloader.low_fuses=0xff
minimus32v33.bootloader.high_fuses=0xd8
minimus32v33.bootloader.extended_fuses=0xf6
minimus32v33.bootloader.file=caterina/Caterina-Minimus.hex
minimus32v33.bootloader.unlock_bits=0x3F
minimus32v33.bootloader.lock_bits=0x2F

minimus32v33.build.mcu=atmega32u2
minimus32v33.build.f_cpu=8000000L
minimus32v33.build.vid=0x2341
minimus32v33.build.pid=0x8036
minimus32v33.build.usb_product="Minimus32 3V3"
minimus32v33.build.usb_manufacturer="Arduino"
minimus32v33.build.board=MINIMUS32
minimus32v33.build.core=minimus
minimus32v33.build.variant=minimus32
minimus32v33.build.extra_flags={build.usb_flags}
追記するのは、minimusフォルダ以下のboards.txtだけでよいです。arduino以下には一切触りません。

それでArduino IDE 1.6.11を起動して、ボードの選択をすると、ちゃんとArduinoとMinimusでカテゴリが分けられて選択できるようになりました。よくできてる。
ボード選択メニューの下に追加された
この状態で、「ええい、ままよ」と彼岸島な心で「ブートローダーの書き込み」を選択すると、さっくりと書き込まれまして、USBデバイスを再認識したアラーム音がmacOSから鳴りました。ちゃんとシリアルポートも選べます。でかした! ヤンヤヤンヤ

ためしにスケッチを書いて、コンパイルと転送が通るかも試します。といっても、いまは何もないので、SerialオブジェクトがUSBに割り当てられているのを使って、IDEのシリアルモニタから入力があったら"Hello"を印刷する簡単なスケッチを作り、コンパイルと転送してみました。なにやら「Minimusには対応していません」な警告が3つぐらい出ましたが、そのままコンパイルを終えて書き込みまでさくっと完了しました。感動。

USBの標準速度が57600bpsになっているので、Serial.begin(57600); などと書き、シリアルモニタの設定も57600bpsにして適当な文字を入れ、「送信」ボタンを押すと、"Hello"が出ました。動いているようです。これで、追加の回路も載せて制御できる見通しが立ちました。よかったよかった。

なんですが、ひとつ回路について重大なことを書くのが遅くなりました。このブログエントリは流れ的にソフトウェアの話でいったん完結させるしかなかったので、最後ですが、自作されようとする方のために、また自分の作業記録として、書かなければなりませんので、ここに記します。

Minimus32の解析サイトに回路図がありますが、これをみると、普通のArduinoには見慣れない「HWB」というタクトスイッチがあります。pbrookさんのWikiにも図があって、リセットと隣合わせに並んでいるようです。そして、データシートを見ると、2ページのピン配置図では13番ピンに、「#HWB」なる端子があります(#は負論理)。さらに、他のU4を使ったArduinoでもフューズビット設定で、「Hardware Boot Enable」にチェックを入れています。「ハードウェアブート」はArduinoにおいて重要らしい。

Minimus32の商品(?)では、まじめにそのボタンをつけているんですが、U4を使った他のArduinoにそんなボタンはありません。なんでだろうと思ってデータシートを読むと、「HWBがLのときにRESETがUPするとハードウェアリセットがかかる」とありました。めんどくせえ。それで、手持ちのArduino Nanoの回路図をみたところ、HWBのラインは10kΩの抵抗を通してプルダウンされており(GNDに接続)、わざわざ「USB RESET EN」と書かれていました。HWBをプルダウンしておけば、リセットラインのL→Hの瞬間にリセットがかかるわけで、「これでいいのだ」ということのようです。よって、このピンはプルダウンしておきました。

それから、Minimus32はあえてICSP端子を設けていません。が、最初にbootloaderを書くにはICSPの6端子を用意しておいたほうが便利なわけでして、僕はつけておくことにしました。U2だと15ピンがSCK、16ピンがMOSI、17ピンがMISOと、SPI端子が連続しているので作りやすいと思います。

あと、要注意な点として、Minimusのピン配列は普通のArduinoとはだいぶ違います。pbrookさんのWikiの図必携。

具体的には、HardwareSerialSerial1)はD2がRx、D3がTxですし、D6, D7はUSBの送受信表示のLEDに使われています。D8はHWBで今回はプルダウンされたまま。さらにU2の制約として、タイマーは0(16bitカウンタ)と1(8bitカウンタ)の2つしかないのでPWMは4つですが、D1, D17がタイマー0、D19とD21がタイマー1という配置。

タイマーという点では、標準ライブラリのServo()はタイマー1を使うのでたぶん動くと思いますが、タイマー0はmills()delay()など時間関係の関数のために保留されていて、analogWrite()は使えるよう考慮されているものの、Tone()のために使うことはできず鳴りません。ためしにD1を指定してみたものの、コンパイルは通っても実際には鳴りませんでした。

ただ、タイマー1で音を出すライブラリはいくつかあるようなので、Servo()に興味がなく、音を出したいという用途にはそれらを使うのだろうと思います。
最初のは正確な音程とコードのシンプルさ追求、2番目はタイマー出力2ピン両方をスピーカーにつなぐ形での音質追求、最後のはタイマー0のプリスケーラを1にして(分周しない)、超音波まで出せて音量調節まで実現するかわりに時間関数は破綻してよしとするなど、標準ライブラリに物足りない人向けのようです。

長くなりましたが、こちらからは以上です。