スイッチサイエンスマーケットプレイス Maker Awards 2021で作品賞を受賞しました
先日、スイッチサイエンス主催で「スイッチサイエンスマーケットプレイス Maker Awards 2021」が技研ベースにて開催されました。本イベントは、『スイッチサイエンスマーケットプレイス (委託販売)に出品されている900以上の商品の中から、今年最も優れた作品・メイカーを表彰するイベント』ということで開かれました。
こちらのイベントにてこの度、私が委託販売させていただいている「M5Stack用CO2モニターキット」が委託商品の中で今年一番売れた商品ということで、作品賞をいただきました!
私自身初めて委託販売した商品でこうした賞をいただくことができ大変光栄であるとともに、このコロナ禍における皆さんの二酸化炭素濃度への関心の高まりを感じました。
ことの始まりから委託販売に至るまで
M5Stack用CO2モニターキットについてのことの始まりは、コロナが一気に蔓延しテレワークが全国的に開始された頃の以下のツイートでした。
先日作ったCO2濃度モニタ見ながらテレワークしてるんだけど、1500ppmに近づくと一気に集中力が無くなる。換気すると5分程度で600ppm近くまで下がって、するとほんとにすぐ集中力が戻る。
— 水田かなめ (@kmizta) March 30, 2020
テレワークしてるみんな、換気しろ、換気。マジで大事。 pic.twitter.com/zlQYh821Qn
ちょうど仕事で強制テレワークとなり自宅の部屋で仕事をしなければならなくなったタイミングでした。
写真のデバイスはたまたま昔買って手元にあったCO2センサと、手元に転がっていたM5Stackをつないでみたものです。
これほど如実に換気が二酸化炭素濃度の低減に効くとは、実際に可視化するまで気づきませんでした。特に二酸化炭素は温度や湿度と違って体で感じにくいので、可視化することの重要性がよくわかります。
そこから約1年間は、このCO2モニタは家の冷蔵庫に貼り付けられて常に自宅の二酸化炭素濃度を表示していました。
ちょうどその頃会社で副業が全面解禁され、またMakerとして一段進んだ活動をしたいと思っていた私はこのモニタをキットとして販売することを考えます。色々なサイトを巡って調べましたが、たどり着いたのはスイッチサイエンスのマーケットプレイスでした。
スイッチサイエンスマーケットプレイス - スイッチサイエンス
やはりMakerとして馴染みのあるサイトであること、CO2モニタキットに興味を持ってもらえる人が多く訪れるであろうこと、また委託手数料の低さが理由です。
委託販売するにあたってサポートサイトを作ったり、梱包を考えたり値付けを考えたり、初めてでわからないことだらけでしたが、なんとか販売開始に辿り着くことができました。
授賞式でのLT資料
授賞式のLT資料がConnpassにて共有されています。 今回CO2モニタキットを作るにあたっての人生観などについて、資料にしましたのでもしよろしければ御覧ください。
2021年CO2モニタ事情
今年に入り、テレワークが定着して自宅環境を向上させたり、また店で密を避けたりするためにCO2モニタが急に脚光を浴びたように見えます。いろんなお店で見るようになり、少しずつ定着してきているようです。 私がM5Stack用CO2モニターキットを委託販売した頃は高価な業務用のモニタが少し市販されていたくらいだったのですが、今年に入って様々なメーカがモニタを販売し始めています。
中には粗悪なものもあるようで・・・。
二酸化炭素はその測定原理がいくつかあり、原理的に二酸化炭素を検出する方法(センサは一般的に高価)や、他の化合物濃度から二酸化炭素を推定する方法(センサは一般的に安価)があります。
最後に
M5Stack用CO2モニターキットですが、現在もスイッチサイエンスマーケットプレイスにて販売中です。
今や巷にいろいろなCO2モニタがありますが、本キットはM5Stackを使っていてアプリケーションのソフトウェアもGithubで公開しているので「家に余ってるM5Stackを有効利用したい」「自分で作りたい」「何なら自分仕様で作りたい」という方におすすめです。
もう一つ、Groveコネクタでつなげられるセンサ用にBreak Out Boxのキットも販売しています。Groveセンサのデータをオシロで見たり、配線を入れ替えてデバッグしたりするのに便利です。
RaspberryPiでCAN通信(ドーターボード回路図付き)
はじめに
最近、CAN通信を触る機会が増えてきました。
CAN通信が正しく行われているかを見るためのちょっとしたデバイスがあると便利なのですが、CANってUSBやUARTほどMakerの間で広く使われているわけではないので変換器みたいなデバイスの数が少ないです。
PCにつなげられるUSB-CAN変換器も売っていますが、ちゃんとしたやつはお値段が張りますね。
マイコンで作ってもいいですがドライバ実装するのも面倒だし・・・
そんなときのラズパイですね。今回は、ラズパイに子基板を乗っけてCAN通信を試せるようにしました。
備忘録がてら、ラズパイの設定、子基板の設計など書いていきます。
なお、ラズパイは4Bを使っています。
ラズパイ用CAN通信子基板
とりあえずCAN通信を試したい、通信内容を見たい、という目的だけなので、最低限必要な部品だけで作成します。
必要なICは以下の2種類です。
CANコントローラ(MCP2515)
CANプロトコルで流れてくるデータをSPIに変換してラズパイにデータを渡してくれるもの。外部クロックが必要。
マイコンによってはCANコントローラ機能内蔵のものもあります。(PIC18F26K83など)
ラズパイにはCANコントローラの機能はないので、外部にMCP2515のようなコントローラが必要です。
CANトランシーバ(MCP2562FD)
CANバスを流れるデータの物理層変換を行うもの。
CANは5Vで動いて、2.5Vを中心にした半二重差動通信なのですが、そのままではマイコンやコントローラで読み取りにくいので、こうしたトランシーバでTX/RXに分離して0-5Vに電圧を変えてあげます。
CANバスに直接つながるのはこいつ。
子基板回路
子基板の回路図は以下の通りです。
MCP2515の外部クロックには20MHzを加えていますが、ラズパイ側で設定できるので必ずしも20MHzである必要はないです。
CAN通信をするのに最低限必要な、電源とSPI周りだけをつないでいます。
こんな感じに実装。シルクは使わないので無視。
子基板はKitmillで削り出します。こういうちょっとした便利基板をちょっとした時間で少数作成するのに大変便利。お高い分仕事してくれます。
久々にキットミルちゃん
— 水田かなめ (@kmizta) August 14, 2021
はたらけはたらけー pic.twitter.com/KLjIqI0i0j
コーヒーを1杯飲んでいるうちに基板はできあがります。できあがったら部品をはんだ付けして完成。
Kitmillで両面基板を作るのはちょっとだるいので片面基板です。ちょっと不格好だけど動くからヨシ!
ラズパイの設定
子基板ができたら、ラズパイの設定をしていきます。
デバイスツリーの設定
ラズパイでCAN通信をする場合は、ラズパイのデバイスツリーオーバーレイを使ってMCP2515のドライバを有効化するのが簡単なようです。
/boot/config.txt の末尾に以下を追記して再起動します。
"oscillator=xxx"がMCP2515の外部クロック周波数です。
# enable MCP2515 dtparam=spi=on dtoverlay=mcp2515-can0,oscillator=20000000,interrupt=25 dtoverlay=spi-bcm2835
再起動が完了するとドライバが有効化されます。
正しく設定されたことの確認
子基板と正しく接続され、ラズパイと正しく通信できていることを確認します。
pi@raspi4b01:~ $ dmesg | grep -e CAN -e can [ 6.171851] CAN device driver interface [ 6.199752] mcp251x spi0.0 can0: MCP2515 successfully initialized.
起動時のメッセージにこんなメッセージが出ていればOKです。
CANインターフェース有効化
次に、CANインターフェースを有効化します。loopback onはCANパケットを外に出さずに内部でループバックする設定で、接続する相手がいないときに動作確認する際などに使います。まずはその設定で。
sudo ip link set can0 type can bitrate 500000 loopback on sudo ip link set can0 up
問題なければifconfigしたときにeth0などと並んでCANが現れます。
can0: flags=193<UP,RUNNING,NOARP> mtu 16 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 10 (不明なネット) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
動作確認(ループバック)
では、CAN通信の動作確認をします。パケットの送受信状況を監視するために、別にセッションを立ち上げてcandumpを起動します。
candump can0 -x
もし入っていなければcan-utilsをインストールしてください。-xオプションは、TX/RXなどの追加情報を出力するオプションです。詳細は以下のマニュアルページを参照ください。
Ubuntu Manpage: candump - manual page for candump 2018.02.0-1
パケット監視の準備ができたら、もとのセッションでパケットを送信します。以下の例では、ID123宛に0x1234ABCDというデータを送っています。
cansend can0 123#1234ABCD
candumpしている端末に以下のように表示されれば成功です。今回はループバックテストのため、送信したパケットと受信したパケットがどちらも表示されています。
RX/TXの次の数字がパケット中のID、次がDLC(データ長)、最後にデータが続きます。
このように見えればCAN通信のループバックテストは成功です。
can0 RX - - 123 [4] 12 34 AB CD can0 TX - - 123 [4] 12 34 AB CD
CANにもいくつか規格がありますが、CAN 2.0AではIDは11bit、データ長は最大8byteとなっています。
最後に
今回、ラズパイ用にCAN通信用のドーターボードを作ってループバックですが通信動作確認を行いました。
通信相手を作ったら、実際にパケットを投げ合う試験もしてみようと思います。
CAN通信について詳しく知りたい方は、この本がわかりやすくておすすめです。
それではごめんなすって。
参考:
Groveコネクタ用簡易Breakout Box (BoB) 作ってみた
はじめに
私は仕事柄、よく電子機器どうしを接続して疎通確認をするようなことをしているのですが、初めてつなぐような機器だと一発では疎通しない場合があります。
「電源は届いているのか?」「コマンドは正しく出ているのか?」「Ackは返っているのか?」など、テスタやオシロ、ロジアナなどで見てみたくなる場面が多くあります。
そうした時に使うのが"Breakout Box"(ブレイクアウトボックス)です。BoB(ビーオービー)などと呼ぶ場合もあります。
例えば以下の画像はWikipeadiaで"Breakout box"の項を見てみると出てくる画像ですが、こんな感じに入出力のコネクタと、大量のジャックがついています。
モノによってはそれぞれの導線を開閉するためのスイッチがついています。以下のサイトの商品を見ると、BoBがどんなものかよくわかります。
BoBの内部では、コネクタの全てのピンをジャックに取り出し、(スイッチが有る場合は)スイッチで全ての線を独立に開閉できるようにしてあります。
また、バナナケーブルで入れ違いに接続することで、一時的に信号を入れ替えることも可能です。ジャックからオシロで信号を見ることもできます。
このように、BoBは電子機器の接続試験を行う際のデバッグにとても便利なのです。
Groveモジュール用簡易BoB作ってみた
ここ最近、M5Stackの人気もありGroveで接続できるモジュールが非常に増えてきました。今では公式だけでも200個以上のモジュールがあるそうです。
私もよくGroveモジュールをつないで遊ぶのですが、うまく動作しないときがあります。そんなときに簡単に信号を取り出したり入れ替えたりできるとデバッグしやすいのになーと思うことも多くありました。
そこで、今回Groveモジュール用簡易BoBを作ってみました。
回路図は以下のとおりです。
写真の通り、Groveコネクタが左右についています。回路図を見るとわかるように、Groveコネクタからつながる4つの導線が全てバナナジャック上に取り出されています。
また、それぞれの線は独立してスイッチで開閉ができます。オシロスコープで見やすいように、チェック端子もつけてみました。
例えば、左側にM5Stack、右側にGroveモジュールをつなぎます。スイッチを全てCloseにすれば、動作したまま信号を取り出すことができます。
デバッグがとても便利になるのですが、何よりスイッチがたくさんついていると使っていてなんだかテンションが上ります。なぜ?
何だかモジュールの動作がおかしいぞ、と思った場合はまずは信号を取り出してオシロで見てみるのが良いでしょう。
クロックとデータが入れ違っているのでは?という場合は、スイッチでその2つの線をOpenにして、バナナケーブルでクロス配線することで一時的に信号線を入れ替えることができます。
もしこれで正しく動けば、回路やプログラムを直せば良い、ということがわかりますね。
さらに、Groveコネクタの隣にはワンタッチ端子台がついており、Groveに限らず任意の配線をつなぐことができます。I2CとかSPIとかUARTを接続してみても良いですね。よほどの大電流でなければ何でもOKです。
最後に
Groveモジュールを使った回路のデバッグのために簡易Breakout box(BoB)を作ってみました。
デバッグに限らず、信号線を取り出してオシロで見てみたりすると、どんな通信をしているのかがわかって面白いです。
デバッグのための道具は趣味ではあまり作らないのですが、あるといざというとき役立つかもしれませんね。
はんだ付けのときgootのマルチクランプを使うと捗るぞ
はじめに
だいぶ前ですが、町田のサトー電気でgootのマルチクランプST-85を見かけたので買ってみました。
しばらく使ってみて、はんだ付けの際にとても便利だったので紹介したいと思います。
マルチクランプ ST-85
これが我が家のST-85です。
その名の通りマルチに色んなものをいい感じに挟んでくれます。プリント基板、コネクタ、ケーブル・・・
この「いい感じに挟んでくれる」というのが大変に絶妙な力なのです。
両側にあるバネとグリップ部のゴムによって硬いものから柔らかいものまで「いい感じに」ホールドしてくれます。
グリップする力が強すぎると挟んだものを壊してしまったり、柔らかすぎるとハンダゴテで触ったときに外れてしまう可能性があります。
このマルチクランプはそういった心配を一切感じさせない、「絶妙な」ホールドを実現していました。
きっとこのマルチクランプの担当者はホールドに使うばね定数の選定に並々ならぬ情熱を注いだのだろうと思います。
はんだ付けを進めていくとだんだん挟める場所がなくなってきますが、端の方をちょっとクランプしただけでもそれなりにホールドしてくれてはんだ付けができます。(表面実装品くらいだったら挟んでも問題なさそうです)
また、使い終わった後は畳んでしまうことができます。場所を取らないので便利です。
おわりに
gootのマルチクランプST-85を買って使ってみました。はんだ付けの際、何でも「いい感じに」ホールドしてくれてとても便利です。
語彙力がなさすぎて「いい感じに」としか言えないのが悲しいところですが、いい感じにホールドしてくれます。
秋月電子その他電子部品店でも取り扱いがあるので、使ってみてはいかがでしょうか。
それではごめんなすって。
低酸素トレーニング用の酸素濃度自動制御システムを作りました
はじめに
昨年の冬から、高地トレーニング用の低酸素室に使う酸素濃度自動制御システムを作っていました。
ようやく安定稼働できるようになったので、紹介したいと思います。
ことの始まり
昨年冬、平塚にあるアスリートネット湘南の石井さん(@hiraspo)から声をかけていただきました。
石井さんはスポーツジムを運営されている方で、平塚にあるそのジムには日本でも珍しい「低酸素トレーニングルーム」があります。
低酸素トレーニングとは、高地トレーニングの環境を地上で再現して行うトレーニング方法です。(低酸素トレーニングという言葉はお話を聞くまで知りませんでした。 )
高地トレーニングや低酸素環境によるトレーニングの詳細は以下のアスリートネット湘南さんのウェブサイトをご参照ください。
トレーニングルームには低酸素環境を作るための低酸素生成装置とコンプレッサがあるのですが、比較的最近できたばかりで、昨年冬の段階ではバルブを手動で操作して所望の酸素濃度を作っていたそうです。
この酸素濃度に基づいたバルブ操作を自動化したいということでした。
とても面白そうだったので二つ返事で引き受けて、この酸素濃度自動制御システムの開発を開始しました。
システム概要
システム全体像はこんな感じです。
低酸素生成装置(図中のAltitudeMax)、タンク・コンプレッサは既存のものがありましたので、制御システムの役割は低酸素ラインと通常空気ラインの入っているバルブを自動で開閉することです。
主たるデバイスは図中の「メインコントローラ」「バルブコントローラ」になります。
メインコントローラは、酸素濃度の監視・モニタの表示・ユーザとのやりとり(酸素濃度設定など)を行います。また、バルブコントローラはメインコントローラから指令を受け取り、2つのバルブの開閉を行います。
トレーニングルーム内は低酸素を保つため個室になっており、外部とは無線でやり取りする必要がありました。そのため、メインコントローラとバルブコントローラ間はBluetooth(BLE)、メインコントローラとユーザ端末間はWifi(ルータを介したLAN)で接続しています。
今回、CPUはRaspberryPi Zero(メインコントローラ)とESP32(バルブコントローラ)を使用しました。
ラズパイゼロは小さいながらもBluetooth・Wifi・HDMIがついていて、今回はさほど高度な処理は行わないため選びました。ESP32はBluetoothがついていてかつ安価なため選びました。
メインコントローラ上ではFlaskでHTTPサーバが走っており、同一LAN内にいるユーザ端末からブラウザでアクセスすることで現在の酸素濃度を見たり、設定したりすることができます。
Flaskは以前インターホン遠隔解除装置で使ったことがあるものの、CSSに至っては全く触ったことがなかったので書籍を読んで勉強しながら実装しました。
Pythonフレームワーク Flaskで学ぶWebアプリケーションのしくみとつくり方
- 作者:掌田津耶乃
- 発売日: 2019/08/10
- メディア: 単行本
システムは使いながら改良していくことが予想されたため、メインコントローラはWifi経由でシステムアップデートができるようにしています。逆にバルブコントローラ側はアップデート機能はないため、メインコントローラの指令に従い単純にバルブをON/OFFするだけの機能としました。
現在はディスプレイの画面もこんな感じになっています。
初期バージョンをトレーニングルームに導入してから2~3ヶ月程度立ちましたが、順調に稼働しているようです。
おわりに
今回、低酸素トレーニング用の酸素濃度自動制御装置を開発しました。
複数のデバイスがスマホやディスプレイや外部のバルブとつながるシステムとあり、新しくいろんなことを勉強する必要がありましたがなんとか完成にこぎつけられてよかったです。
もしご覧の方で低酸素トレーニングシステムにご興味がある方は、アスリートネット湘南さんのウェブサイトから問い合わせいただけます。
また、今回の低酸素トレーニングシステムの開発のように、West Gate Laboratoryではこうしたシステムの受託開発もやっています。
ご興味のある方はTwitter(@kmizta)または問い合わせページからご連絡ください。
それではごめんなすって。
家の二酸化炭素濃度を1年間測り続けてわかったこと
はじめに
およそ1年前、テレワークが勤務先にも本格導入された頃、家に余っていたM5Stackを使ってCO2モニタを作りました。
先日作ったCO2濃度モニタ見ながらテレワークしてるんだけど、1500ppmに近づくと一気に集中力が無くなる。換気すると5分程度で600ppm近くまで下がって、するとほんとにすぐ集中力が戻る。
— 水田かなめ (@kmizta) March 30, 2020
テレワークしてるみんな、換気しろ、換気。マジで大事。 pic.twitter.com/zlQYh821Qn
これがその時のツイート、去年の3月30日です。
CO2モニタを作ることに特に大きなモチベーションがあったわけではありません。以前秋葉原で買ったCO2センサがあることを休日に思い出して作ったものでした。
2020年4月5日には機能をアップデートし、Ambientにログデータを上げられるようにしました。
このあたりからモニタを冷蔵庫に貼り付けて定常運用していたと思います。
それ以来およそ1年間、CO2濃度と合わせて温湿度を1分ごとにログしています。(時々機能テストなどで運用停止しています)
この記事では、1年間CO2モニタを使って二酸化炭素濃度を測り続けてわかったことについて書いています。そのほとんどは言われてみれば当たり前のことで、CO2モニタを作る前から定性的な知識としては知っていることでした。
ですが、実際にCO2濃度を可視化して、実生活とリアルタイムな値を見比べていくことでよりリアルな感覚として理解できた気がします。
なお、我が家は結構古い賃貸マンションで、24時間換気などのシステムは一切ついていません。以下に示す傾向は家の密閉度合いなどに影響されますので、ご注意ください。
データ全貌
全貌というほど大したデータではないですが、ここ1年間のデータがこちらです。
まずはCO2。
外気がおよそ400ppmと言われているので、そこが下限になります。それ以上の値は家の中での人間の活動によるものです。
続いて温度。
2021年1月ごろになってようやく温度校正をしたので、それ以前は少し高めに出てしまっています。一年を通した気温の上下が見て取れて、あぁあの夏は暑かったな、などと思い出します。
最後に湿度。
温度と同様、季節に応じた増減が見て取れます。やはり夏は圧倒的に湿度が高いことがわかります。2020年8月頃に凹が見られますが、多分湿度が限界で24時間窓を締め切ってエアコンをかけていたのだと思います。
また、冬でも平均40%程度の湿度を保っていますが、これは加湿器による効果が大きいです。
とまぁ1年のデータを並べるだけでもいろいろなことを思い出して面白いのですが、もう少し細かい、日常の気づきを書いていきます。
狭い部屋を締め切るとすぐにCO2濃度は上がる
テレワーク開始当時、まだ寒かったことや換気に対する意識が低いこともあって私はほとんど換気はしていませんでした。自室は6畳程度の和室なのですが、ふすまを締め切って仕事をしていました。
そんな密閉された狭い部屋に人間一人いると、ものの1時間程度でCO2濃度は1000ppmを超えてしまいます。さらにその状況が続くと、1500ppmにも達します。
デスクワークであれば呼吸は静かなものですが、それでもじわじわと溜まっていきます。いくらエアコンをかけようと空気清浄機を回そうとCO2濃度は下がりません。
CO2濃度が高くなると頭痛、眠気、倦怠感、注意力散漫などの症状が起きますが、私の場合1500ppm程度になると明らかに仕事に対する集中力が下がるのを感じました。
締め切った部屋で人が呼吸していればこうなるのは当たり前といえば当たり前なのですが、定量的に理解できたのはとても良かったと思います。
換気すればものの数分でCO2濃度は外気と同じ程度になる
まさに冒頭のツイートの画像がそれなのですが、窓を大きく開けて換気すれば、ものの数分で外気と同程度のCO2濃度に下がります。
ただし、換気の仕方は大事で、窓を開けるだけではなくて対面のふすまも開け、できればその先の部屋にある窓も開けて空気が通るようにした方が圧倒的に換気効率が良いです。1方向のみだとなかなか下がらなかったりします。
ドアを開けておけばそれほどCO2濃度は上がらない
狭い部屋を締め切っているとCO2濃度はあっという間に上がっていきます。逆に言うと、ドアを開け放っておけば、窓を開けなくともある程度CO2濃度上昇は抑えられます。
例えば、以下の図は実験的に6畳の部屋を締め切って仕事したときと、ふすまやドアをを開け放って仕事したときのCO2濃度です。空間を大きく取ると明らかに上昇が抑えられています。大々的な換気をしなくてもこれならなんとかなりますね。
季節によってはあまり頻繁に換気したくないこともあります。そういうときはできるだけ家の中のドアを開け放って、空間の体積を大きく取ることが大事なんですね。
ガス調理をするとあっという間にCO2濃度が上がる
うちのマンションはIHなどではなくガスコンロなのですが、窓を締め切ってガス調理をすると本当にあっという間にCO2濃度が1500~2000ppm程度に上昇しました。換気扇をつけていても窓が閉まっているとあまり換気されません。
例えば、こちらは確かテレワーク中の昼ごはんにパスタを作っていたときのCO2濃度。ガスコンロで10分弱加熱し続けている間にCO2濃度は急上昇します。調理後は換気必須です。
続いて、こちらは奮発してステーキを焼いていたとき。フライパンで焼いていたためCO2濃度は急上昇しています。
ひょっとしたら、ガスコンロではなくIHの鉄板とかで焼いていたらこうはならないのかもしれません。誰か検証してみませんか?
最後に
以上、CO2モニタを1年間使ってきた私の気づきでした。
読んでみるとごくごく当たり前のことばかりですね。でもその当たり前のことも頭で理解しているだけでは習慣にすることは難しいです。私も実際CO2モニタを使う前まで定期的な換気などは全くして来ませんでした。
実際に可視化して体感して効果を実感することで、自身の習慣にもなります。今では家族もモニタの数値を見て自発的に換気してくれるようになりました。
テレワークが普及して住環境を良くしたいニーズが増えてきたからか、この1年いろいろなところからCO2モニタが販売されているようです。
我が家で使っているM5Stackを使ったCO2モニタは現在スイッチサイエンスにてキットとして販売中です。githubでM5Stackに書き込むソースも公開しています。
我が家が狭いこともあり、私の電子工作はできるだけ生活の役に立って長く使えるものを目指していますが、このCO2モニタはまだまだ使う気がします。
自作キーボードを手動CNCコントローラにしてみた
はじめに
先日、Deign Solution Forumというイベントで講演をしたのですが、同時開催された抽選でなんと自作キーボードキットのSHIROが当たりました。
せっかくの初自作キーボードなので有効活用しようと思い、昨年末購入したCNCフライス、Kitmill CL100の手動コントローラにしてみました。
抽選で当たった自作キーボードを有効活用して、CNC手動コントローラにしてみた
— 水田かなめ (@kmizta) March 28, 2021
操作もだんだん慣れてきた pic.twitter.com/d16c1oytDo
自作キーボードに不慣れなこともあって、実際に使えるようになるまで色々手間取ったので備忘録がてら工程を記しておきます。
ファームウェアの作成
SHIROにはAVRマイコン(ProMicro)が搭載されており、ファームウェアを書き込んでPCに接続するとキーボードとして認識されます。
自分の好きなキーマップで動作させるには、AVRマイコン用のファームウェアを作成する必要があります。
方法には大きく2種類があります。私は後述の理由により②を使いました。
1.QMK Configuratorを使う
2.QMK Firmwareをダウンロードし、自分でビルドする
QMK Configurator
QMK Configuratorでは、様々な自作キーボードのファームウェアをGUIで自動的に作成することができます。
上記のページでKEYBOARDにSHIROを選択し、好きなキーの位置に好きな機能を割り当てることができます。
割当が完了したら、右上のCOMPILEを押すとファームウェアがコンパイルされ、終わり次第ダウンロードが可能になります。
ただ、今回CNCの操作をするために、Ctrl+Shift+Dというキーマップを使いたかったのですが、CtrlとShiftとキーを組み合わせる方法が見当たらなかったので、後述の自分でビルドする方法を使いました。
(QuantumにあるMod key combinationsというのがいわゆるShiftとかCtrlとかAltとかとキーを組み合わせる機能なのですが、その中にShift+Ctrlが見当たりませんでした)
QMK Firmware
上記の通りQMK Configuratorでは所望の機能が使えなさそうだったので、QMK Firmwareを使って自分でファームウェアをビルドすることにしました。
ファームウェアをビルドするにはまずは開発環境を作る必要があります。makeが使える環境で以下のリポジトリをクローンします。
私は普段Windows機のため、WSL上にクローンしました。
クローンできたら、qmk_firmware/keyboards/shiro/keymaps/に移動します。ここに自分用のキーマップを作成します。
デフォルトではdefaultとcheckというキーマップが入っています。defaultのキーマップは以下のようになっています。
layer_numberでレイヤごとに別機能が割り当てられていて、レイヤ自体はキーボード上部の3つのキーで切り替えられるようになっているようです。
KC_*というのがたくさんありますが、これがキー割り当てです。KC_ESCはエスケープを表します。
enum layer_number { _NUMBER = 0, _CURSOL, _MOUSE }; #define NUMBER TO(_NUMBER) #define CURSOL TO(_CURSOL) #define MOUSE TO(_MOUSE) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_NUMBER] = LAYOUT( NUMBER, CURSOL, MOUSE, KC_P7, KC_P8, KC_P9, KC_P4, KC_P5, KC_P6, KC_P1, KC_P2, KC_P3, KC_P0, KC_BSPC, KC_ENT ), [_CURSOL] = LAYOUT( NUMBER, CURSOL, MOUSE, KC_HOME, KC_UP, KC_PGUP, KC_LEFT, KC_ESC, KC_RIGHT, KC_END, KC_DOWN, KC_PGDN, KC_DEL, KC_BSPC, KC_ENT ), [_MOUSE] = LAYOUT( NUMBER, CURSOL, MOUSE, KC_CUT, KC_COPY, KC_PSTE, KC_UNDO, KC_FIND, KC_AGIN, XXXXXXX, XXXXXXX, XXXXXXX, KC_DEL, KC_BSPC, KC_ENT ), };
今回、"cnc"というキーマップを作るため、上記ディレクトリにdefaultのディレクトリをコピーし、名前をcncに変更しました。それができたら、フォルダ内のkeymap.cを修正します。
Kitmill CL100のキー割り当ては以下の通りでしたので、それをキーボードに適当に割り付けました。
機能 | 割当 |
---|---|
+X移動 | Right arrow |
-X移動 | Left arrow |
+Y移動 | Up arrow |
-Y移動 | Down arrow |
+Z移動 | Page up |
-Z移動 | Page down |
高速移動 | Shift+何か |
スピンドル回転 | Ctrl+D |
スピンドル停止 | Shift+Ctrl+D |
緊急停止 | ESC |
// cnc/keymap.c enum layer_number { _NUMBER = 0, }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_NUMBER] = LAYOUT( KC_ESCAPE, KC_ESCAPE, KC_ESCAPE, RCTL(KC_D), KC_NO, RCTL(RSFT(KC_D)), KC_LSHIFT, KC_NO, KC_PGUP, KC_NO, KC_UP, KC_PGDOWN, KC_LEFT, KC_DOWN, KC_RIGHT ), };
レイヤは1つだけにしています。
キーボードの上部3キーに緊急停止、その下にスピンドル開始/停止、下3段にXYZの割当をしています。
RCTL()
がRight Control+何かにあたります。Leftでも良いはず。
これは入れ子で書くこともできるので、Ctrl+Shift+Dをやりたければ、RCTL(RSFT(KC_D))
と書けばOKです。
細かいキーコードの記法についてはこちらを参照ください。
keymap.cを編集し、キー割り当てを終えたらコンパイルします。qmk_firmwareのディレクトリに戻ってmake shiro:cnc
します。全て問題なければ.buildディレクトリにshiro_cnc.hexができます。
ファームウェアができたらあとは書き込みなのですが、WSL上では書き込みができないのでhexファイルをWindows上に持ってきます。
ファームウェアの書き込み
ファームウェア(hexファイル)をWindows上に持ってきたらUSB経由で書き込みます。
簡単な方法としては、QMK Toolboxを使えばGUIで書き込める(はず)なのですが、どうにもリセットと書き込みのタイミングが合わず、断念。
仕方ないので、コマンドプロンプトから書き込みます。
コマンドプロンプトから書き込む場合はAVRDudeが必要なので、本家サイトからダウンロード、インストールしておきます。
USBケーブルでSHIROキーボードを接続し、リセットボタンを押すとCOMポートとして認識されますので、そのCOMポート番号をメモっておきます。
ちなみに、PortPopを入れると接続したり切断したときにバルーンが出るのでとても便利です。
github.com コマンドプロンプトで以下のコマンドを打つ「準備」をしておきます。
avrdude -p atmega32u4 -c avr109 -U flash:w:"D:\temp\shiro_cnc.hex":i -P COM2
※パス、COMポート番号は適宜書き換えます。
どうやらブートローダが認識される(書き込める)のはリセットを押してから短い間だけのようなので、一度キーボードを外し、再度接続してキーボードのリセットボタンを押します。
COMポートとして認識されたら、すかさずEnterを押して上記コマンドを打ちます。タイミングがうまく合えば、以下のようなメッセージが出てファームウェアが書き込めます。
Connecting to programmer: . Found programmer: Id = "CATERIN"; type = S Software Version = 1.0; No Hardware Version given. Programmer supports auto addr increment. Programmer supports buffered memory access with buffersize=128 bytes. Programmer supports the following devices: Device code: 0x44 avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature = 0x1e9587 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 "D:\temp\shiro_cnc.hex" avrdude: writing flash (22454 bytes): Writing | ################################################## | 100% 2.87s avrdude: 22454 bytes of flash written avrdude: verifying flash memory against D:\temp\shiro_cnc.hex: avrdude: load data flash data from input file D:\temp\shiro_cnc.hex: avrdude: input file D:\temp\shiro_cnc.hex contains 22454 bytes avrdude: reading on-chip flash data: Reading | ################################################## | 100% 0.67s avrdude: verifying ... avrdude: 22454 bytes of flash verified avrdude: safemode: Fuses OK avrdude done. Thank you.
ここまでくれば、晴れてキーボードとして使用することができます。やったね。
まとめ
抽選で自作キーボードが当たったので、それをCNCコントローラにするまでの記録でした。ファームウェアの作成、書き込みなどいろいろ便利ツールが出ているのですが、微妙に私の環境には合わず、結局泥臭いやり方になってしまいましたが、勉強になりました。
いろんな形のキーボードが出ているので、キーボード操作できる機器のオリジナルコントローラとして自作キーボードを使うのは面白いかもしれませんね。