XIAOでMacのスクリーンショット専用USBキーを作るDIY

じゃんくはっく
じゃんくはっく

スクショの専用キーがほしい!

Macだと、シフト+コマンド+3とかの?

ぴー
ぴー
じゃんくはっく
じゃんくはっく

Mac標準だとそうだけど、Skitchっていうスクショツール使ってるからシフト+コマンド+5だね。

いろんな需要があると思うからカスタマイズできるといいね

ぴー
ぴー

今回のDIYは、ちょっと実用的なものを作ろうかと思います

最近、はまっている小さくて安いArduino互換機、XIAOを使ってカスタマイズできるキーボードを作ろうと思います! 冒頭でも少し触れましたが、MacのスクショアプリでSkitchっていうツール使っているんですが、このスクショのショート専用のキーボードを作ろうかと。ショートカットは、シフト+コマンド+5ですが、3つもボタンを押さないといけないので、1ボタンだと助かります。

その後、Skitchの編集メニューから「画像をコピー」でクリップボードに入れてWordPressのローカルアプリに貼り付けるのが、一連の動きです。このショートカットがシフト+コマンド+C です。

構想では、この2つのボタンが専用であるといいなと。キャンセルしたいときにESCキーがあると便利かもしれませんね。

使えるUSBライブラリは?

TinyUSB Mouse and Keyboard library

https://github.com/cyborg5/TinyUSB_Mouse_and_Keyboard/

このライブラリは、Chris Youngさんが統合したTinyUSBです。以下で紹介されています。

Mouse and Keyboard Control Using TinyUSB and BLE

examplesを試したのですが、記述がわかりやすいし使いやすそうだったのでこれでやってみることにします。他にも、Seeedの紹介ページにAdafruitのライブラリを使った例がありますが、examplesを見た限りでは使いにくそうでしたのでこちらはパスです。

Seeeduino XIAOをUSBデバイス(TinyUSB)として使う

ライブラリを入れる

マスターのZIPをArduinoIDEから入れて、例題をやってみます。

ZIP : TinyUSB_Mouse_and_Keyboard

URL

Arduino IDEからライブラリをいれるのは、以下からです。

ZIPのライブラリを入れると、以下のように同じところから見えていると思います。

提供されたライブラリは、Macだと以下に入るようです。直接ここに入れてもOKです。

/Users/USERNAME/Documents/Arduino/libraries/

ちなみに、ArduinoIDE組込(デフォルトの)は以下です。

/Applications/Arduino.app/Contents/Java/libraries/

XIAOのボード関連は以下にあります。

/Users/USERNAME/Library/Arduino15/packages/Seeeduino/

ライブラリとか、PGのディレクトリ以下に格納しておいたほうが後からわかりやすいかもしれません。数年後、また動かそうとすると環境変わっていたりしますからね。その場合は、includeをダブルクオートで囲って記載すればカレントディレクリ(現在のディレクトリのこと)を参照します。

#include "TinyUSB_Mouse_and_Keyboard.h"

サンプルを動かしてみる

Macユーザーで、Launchpad のショートカットをF5にしていれば動作します。

$ git clone https://github.com/take-i/XIAO-USB-example.git
$ cd XIAO-USB-example/xiao_usb1/
$ open xiao_usb1.ino 

XIAOに書き込んで、見てください。ブラウザが起動して JunkHackのページが見えていれば成功です。

サンプル例では、Launchpadが開き、コマンドFで検索、英字モードに切り替えてterminalをタイプしてターミナルを開きます。ターミナルからはURLをオープンしています。macの場合、コマンドの修飾キーは以下のようにKEY_LEFT_GUIが相当します。WindowsだとWINキーです。

  // New terminal windows
  Keyboard.press(KEY_LEFT_GUI);
  Keyboard.write('n');
  Keyboard.releaseAll();

Keyboard.pressは、押しっぱなし状態になるのでKeyboard.releaseAll()でリリースします。delayを入れないと、速すぎて期待する動作にならないので適当に調整します。

4ボタンの専用キーボードを作る!

さて、サンプルはうまく動いたので実際にボタンをつけて日常的に使える状態にします。こんなコードにしました。

https://github.com/take-i/XIAO-USB-example/tree/master/ss-key

Pin接続は、A7 , A8 , A9 , A10 とGNDの5つです。なお、このPGは同時にボタンを押した時の考慮はしていませんのでご注意を。クリティカルなボタンの場合は、何かキーが押されている場合は違うキーの処理に入らないようにする必要があります。

筐体に組み込む!

3Dプリンターとメカニカルスイッチで作るのが面倒だったので、適当なジャンク品のキーボードを漁ってきました。

15年くらい前の無線キーボードです。エンターキーが無くなっているのは、子供に剥がされたからです。それ以来、使っていませんでしたがここに来て約に立ちそうです。

このタイプのキーボードはノートPCと同じで、キーボードの下はフィルムのメンブレンスイッチになっています。これにジャンパー配線するのは厳しいので、端っこのパーツを使うことにしました。

こっちは基盤があって、なんとかなりそうです。キーボード筐体をグラインダーで切断し、左側部分を使うことにしました。こんな感じ。

配線はこんな感じ。XIAOは小さいので、ほんと助かります。

黒い線がGNDで、それ以外はボタンからのプリント基板の配線からジャンパー線を出して使っています。

こんな感じで、無線キーボードの上に置いてあります。

右側からESC、スクショ、スクショのコピー、https://www.canva.com/ を開く の4機能を持たせてあります。今もこの記事を書いているときにこのボタンを使っていますが、かなり便利ですね! canvaを割り当てているのは、ブログ記事のサムネイルをいつもここで作るからです。今回はこんな感じかな?

Macからはこんな感じで認識されています。

キーボードの修飾キーにも、出ていますね

MacのKeycodeを確認

※追記
MacだとどんなKeycodeがタイプされるのか確認しておきたかったので、macosで動作するキーロガーのソースを少し修正してDecで数字を出すように改修したものが以下にあります。

Mac OS X Keylogger

https://github.com/take-i/keylogger-macos

オリジナルは、アトランタのアプリ開発者、ケーシー・スカボローさんが作ったものです。簡単に使い方を記載しておきます。

$ sudo touch /var/log/keystroke.log
$ sudo chmod 644 /var/log/keystroke.log
$ git clone https://github.com/take-i/keylogger-macos.git && cd keylogger-macos/
$ make
$ sudo ./keylogger

ログは以下のパスに数字で出力されます。

$ tail -f /var/log/keystroke.log

たとえば、Macのキーボード配列の場合、F3キーはMission Controlのキーとなり、Keycodeは、160となります。F3の場合は99です。純正キーボードの場合は、以下のようにキーボード設定に「F1、F2などのキー標準のファンクションキーとして使用」のチェックボックスがでます。社外キーボードの場合、これはでないようです。

DIYキーボードをUSB接続したとき、macのキーボードだと認識させてMission Controlのコードとして認識させるようにする方法を模索したのですが、ちょっとよくわかりませんでした。また、いつか再チャレンジしたときに覚書として書いておきます。

まとめ

今回、なんとなくわかった・わからなかったのは以下となります。

・Seeed XIAOは簡単にキーボード・マウスのデバイスが作れる
・スイッチOn,OffタイプであればPinの数分、キーは作れる(最大、11Key)
・ライブラリは、TinyUSB Mouse and Keyboard libraryが使いやすかった
・KeycodeというのがUSBの仕様で決まっているようです(hut1_12v2.pdf
・こっちのUSB仕様書のほうが新しいかな?(hut1_21_0.pdf
・macの場合は、Mac OS X Keylogger を少し手直しすれば番号がわかる
・しかし、USBの仕様書とは違う値が帰る(例:F3は、macだと10進で160または99、USB仕様書では、60)
・PGの定義は、0xC4で10進だと196
ここによれば、0x88以上は、その値から0x88を引いた数(10進だと136)となるようです。つまり、196-136=60 なるほど!PGの定義からは謎がとけました
・しかし、macのkeycodeは違う値を出す。ここがよくわからない
・おそらく、macはkeycodeのマッピングテーブルを持っているのだろう
・または、キーボード種類によってF3はMission ControlになるようOSがマッピングしているのだろう
・keycodeとUSBデバイスのレイアウトの関係はまだ奥が深そうだ
・フィルムのメンブレンスイッチって自作できないかな?
・アルミテープとラミネートフィルムで作れないかな?

あとがき

作ってみて、実際に使ってみたらすごく具合がいいです。USBデバイスをこんなに簡単に作れるとは、驚きですね。いつか、本格的なキーボード作りもしてみたいです。40%キーボードとか小さくて可愛いので使ってみたいんですが、何から手をつけていいのかよくわかりません。あと、薄いMacのキーボードに手が馴染んでしまったのでという理由もあります。

まぁ次キーボード作る機会もあると思うので、その時は自作したいですね。

著者にメッセージ

間違いのご指摘など、コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。

Arduino Nano互換機に書き込めないだと!

じゃんくはっく
じゃんくはっく

5年振りにArduino Nano(互換機)を触ったら書き込みできなーい!

あら、壊れたのかしら?

ぴー
ぴー
じゃんくはっく
じゃんくはっく

「マイコンボードに書き込もうとしましたが、エラーが発生しました。」と出るのよ

アリエクでまた買えば

200円くらいでしょ?

ぴー
ぴー

いやはや、5年も触っていないといろいろ完璧に忘れています。ArduinoNanoという小さなArduino があるんですが、それにLチカでも書き込んで動作確認しようとしたら、書き込めずエラーが出てしまいました。持っているNano互換機はこれです。

JunkHack : arduino hello world! 投稿日: 2015年3月15日
6年くらい前の記事で、$3でアリエクでポチったもの

https://hack.gpl.jp/2015/03/15/arduino-hello-world/

今回のエラーログは以下のようになります。

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 "/Applications/Arduino1.8.12.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf"
         User configuration file is "/Users/junkhack/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/cu.wchusbserial14120
         Using Programmer              : arduino
         Overriding Baud Rate          : 115200
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
::(省略)
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00

avrdude done.  Thank you.

マイコンボードに書き込もうとしましたが、エラーが発生しました。
このページを参考にしてください。
http://www.arduino.cc/en/Guide/Troubleshooting#upload

通信が出来ていないような感じですね。キーワード「avrdude: stk500_recv(): programmer is not responding」でググってみるとブートローダーが壊れたとか、いろいろ出て来て壊れたのかなと。でも、実は違うようです。

プロセッサ:ATmega328P(Old Bootloader)を選べば大丈夫!

Arduino / micro:bit / M5Stick勉強会の電録簿
ボード・アップデートで書き込みエラー

http://www.umek.topaz.ne.jp/mameduino/boardupdate_error/

このサイトによれば、どうやら、ボード設定メニューのプロセッサー種別選択のサブメニューにて「ATmega328P(Old Bootloader)」を選択するだけでいいようです。

はい、ちゃんと書き込めました。どうやら、Nanoの新しいやつは、通信速度が112.5kbps ということで、古いNanoは57.6kbpsということのようです。

ブートローダーを新しくすることもできるようで、もう一台arduinoがあれば以下のように書き込めるようです。

Arduino as ISP and Arduino Bootloaders

https://www.arduino.cc/en/Tutorial/BuiltInExamples/ArduinoISP

また今度やってみようかな。今日はいろいろ違う目的がありますので。

いや、こういうのはわかった時に即実行が良いですね。ブログのネタにもなるし少し休憩後、書き込んでみました。

UnoをISPにしてNanoに書き込みする!

こういうのは全体の流れを把握するのが大事です。大きくは以下と理解。

(1) UnoをISPにして、Nanoに書き込む
  → 手持ちにUnoがあったのですが、それ以外でもOK
(2) まず、UnoにArduinoISPのスケッチを書き込む
  → スケッチ例>11.ArduinoISP>ArduinoISP
    ※書き込んだら、次に配線をしますのでUSBを外します
(3) UnoとNanoを配線する
  → 配線は6本
(4) IDEのツールからブートローダーを書き込む
  → UnoをUSBでPCに接続。その後書き込みます

(1) UnoをISPにして、Nanoに書き込む

ISPとは、インサーキットシリアルプログラマーということで、ICSPとも略されるようですね。基板に繋いだまま内蔵メモリにプログラムを書き込むことを言うようです。今回の例だと、Nanoのブートローダーを書き込むにあたり、UnoをISPにして書き込むわけです! 

(2) まず、UnoにArduinoISPのスケッチを書き込む

アリエクで昔、本物のUnoをポチっていました。裏が白い基板のです。

まずは、ISPのスケッチをIDEから引っ張りだしてきて、Unoに書き込みます。

スケッチ例 > 11.ArduinoISP > ArduinoISP

次に配線しますので、USBを外しておきます。

(3) UnoとNanoを配線する

配線は6本で、こんな感じです。写真ではUSBが接続さていますが書き込みが終わったときに撮ったからです。配線するときは、外してやってくださいね。

ISP UNO 書込ターゲットNANO
D13 D13
D12 D12
D11 D11
D10 RST
+5V +5V
GND GND

実体配線図だとこういうことですね。

さて、書き込みましょうか! USBをUno(ISP)に接続します。

(4) IDEのツールからブートローダーを書き込む

ツールからボート、プロセッサ、シリアルポート、書込装置を程よく選択して「ブートローダを書き込む」でOKです。ログには以下のように流れました。

/Applications/Arduino1.8.12.app/Contents/Java/hardware/tools/avr/bin/avrdude -C/Applications/Arduino1.8.12.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf -v -patmega328p -cstk500v1 -P/dev/cu.usbmodem14111 -b19200 -Uflash:w:/Applications/Arduino1.8.12.app/Contents/Java/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega328.hex:i -Ulock:w:0x0F:m 

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 "/Applications/Arduino1.8.12.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf"
         User configuration file is "/Users/junkhack/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/cu.usbmodem14111
         Using Programmer              : stk500v1
         Overriding Baud Rate          : 19200
Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of lock verified
avrdude: reading input file "0xFD"
avrdude: writing efuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude: 1 bytes of efuse written
avrdude: verifying efuse memory against 0xFD:
avrdude: load data efuse data from input file 0xFD:
avrdude: input file 0xFD contains 1 bytes
avrdude: reading on-chip efuse data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of efuse verified
avrdude: reading input file "0xDA"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xDA:
avrdude: load data hfuse data from input file 0xDA:
avrdude: input file 0xDA contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0xFF"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xFF:
avrdude: load data lfuse data from input file 0xFF:
avrdude: input file 0xFF contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified

avrdude done.  Thank you.

         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.02s

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 "/Applications/Arduino1.8.12.app/Contents/Java/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega328.hex"
avrdude: writing flash (32768 bytes):

Writing | ################################################## | 100% 0.00s

avrdude: 32768 bytes of flash written
avrdude: verifying flash memory against /Applications/Arduino1.8.12.app/Contents/Java/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega328.hex:
avrdude: load data flash data from input file /Applications/Arduino1.8.12.app/Contents/Java/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega328.hex:
avrdude: input file /Applications/Arduino1.8.12.app/Contents/Java/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega328.hex contains 32768 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 32768 bytes of flash verified
avrdude: reading input file "0x0F"
avrdude: writing lock (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of lock written
avrdude: verifying lock memory against 0x0F:
avrdude: load data lock data from input file 0x0F:
avrdude: input file 0x0F contains 1 bytes
avrdude: reading on-chip lock data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of lock verified

avrdude done.  Thank you.

新しいブートローダをNanoで確認

今書き込んだNanoの動作確認です。ボード設定メニューのプロセッサー種別選択のサブメニューにて「ATmega328P」を選択します。Old Bootloaderじゃないやつです。

LEDブリンクをNanoに書き込み! 以下がログですが、115200kbpsで通信していますね。

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 "/Applications/Arduino1.8.12.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf"
         User configuration file is "/Users/junkhack/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/cu.wchusbserial14120
         Using Programmer              : arduino
         Overriding Baud Rate          : 115200
         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 : Arduino
         Description     : Arduino
         Hardware Version: 3
         Firmware Version: 4.4
         Vtarget         : 0.3 V
         Varef           : 0.3 V
         Oscillator      : 28.800 kHz
         SCK period      : 3.3 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file "/var/folders/f1/5d6ycdnj6v58mcq9kn4b3ksm0000gn/T/arduino_build_539320/Blink.ino.hex"
avrdude: writing flash (924 bytes):

Writing | ################################################## | 100% 0.48s

avrdude: 924 bytes of flash written
avrdude: verifying flash memory against /var/folders/f1/5d6ycdnj6v58mcq9kn4b3ksm0000gn/T/arduino_build_539320/Blink.ino.hex:
avrdude: load data flash data from input file /var/folders/f1/5d6ycdnj6v58mcq9kn4b3ksm0000gn/T/arduino_build_539320/Blink.ino.hex:
avrdude: input file /var/folders/f1/5d6ycdnj6v58mcq9kn4b3ksm0000gn/T/arduino_build_539320/Blink.ino.hex contains 924 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.45s

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

avrdude done.  Thank you.

flash verified が出ていますね。うまくいったようです! ログをよく見てみるとファームウェアバージョンは4.4ということのようです。

Hardware Version: 3
Firmware Version: 4.4

まとめ

今回、なんとなくわかったのは以下となります。

・ブートローダが古ければ、Arduino を書込機器(ISP)にして新しくできる
・古いArduinoなら、プロセッサー種別選択で「ATmega328P(Old Bootloader)」を選択
・違いは、通信速度のようです。それ以外の違いはまだ不明

あとがき

5年も使っていなかったので、扱いが悪くて壊れたのかな? と思っていましたが、対応方法があってよかったです! まさかブートローダが新しくなっていてIDEから古いのを選択しないとダメだとは思っていませんでした。壊れていなくてよかったです。

5年経過しているので、いろいろな環境が変わっていますね。5年前よりいろいろ進化しているので、ハマることもあるかもですが以前より楽しいことができそうな気がします。

著者にメッセージ

間違いのご指摘など、コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。

久しぶりに一目惚れしたArudio互換機のSeeeduino XIAO

じゃんくはっく
じゃんくはっく

可愛すぎて一目惚れしました!

ぽっ! きゃー

ぴー
ぴー
じゃんくはっく
じゃんくはっく

・・・いや、ぴーちゃんの事じゃなくて、SeedのXIAOっていうArduio 互換機のことよ。

こんなチビっこいマシンに負けたのか・・・w

ぴー
ぴー

サムネでもわかるとは思いますが、これ全体のフォルムがかわいいんですよね。あと想像よりもちっさいんです。親指くらいの大きさなんですよ。発売は去年の3〜6月ごろだったみたいですが、今頃発見です。

3個入りパッケージで1,750円!

Wiki Seeeduino Xiaoをはじめよう

https://wiki.seeedstudio.com/jp/Seeeduino-XIAO/

Seeedの日本語版のWikiもありますので、大きさなどはそちらでどうぞ。上の写真は3個入りのをアマゾンからゲットしました。3個入りで1800円弱です。1つ600円ってとこですかね。

中身! 想像より、ちっちゃい!親指に乗りますよ。

ESP32と遊んでからだいぶ月日が経ちましたが、大きさはそのくらいです。ブレッドボードに刺さるのでPinつけてすぐ楽しめますね!

まずはボードをじろじろと見る!

Type-Cコネクタが付いていて、端面がスルーホールになっていて面実装も考慮されていますね。このType-Cコネクタは6ピンタイプじゃなくて12ピンです。あと、LEDらしきものが4つ付いています。

金属のカバーで覆われていますので、その中が気になるところですがまずは、PIN番号が表からわかるようにシールを貼っておきました。なかなか気が利いていますね! Seeedさん、このプロダクトをリリースするにあたりいろいろ気合いが入っているようです。

裏面を見ると、SMD実装したときのVIN,GNDがありますね。4つの丸いのは、なんでしょうか?

調べてみると、英語版Wikiによれば、Newバージョンだとこの丸いのが4つあるようです。

Seeed 英語版Wiki:hardware-overview

Wiki

どうやら、SWCLK (PA30) と SWDIO (PA31) のGPIOのようです。

qita : Seeeduino XIAO 背面パッドをGPIOとして使う

https://qiita.com/nanase/items/37ecca24aee8fbd4492e

だいぶ時間が経過しているので、先輩たちがあれこれ情報をあげていてくれて助かりますね。

やっぱり、Type-C が付いているところがうれしいです。接続しやすいですからね!

動作確認

Type-Cケーブル(スマホでいつも使っているやつね)をPCに繋げて、おもむろにXAIOに繋げてみます。ケーブルのほうが重いので、本体が浮きます! 

オレンジ色のLEDがピカピカしてますね!

とりあえずLチカ

Arudio IDEを使って、Lチカでもやってみます。SeeedのWikiにしたがってIDEは仕込みんでおきます。久しぶりすぎて書き方、だいぶ忘れちゃいました。

この2つのブルーLEDは、RX/TXのLEDなんですがIDEからも定義されているので、光らせることができるようです。デジタル出力だけかなと思っていましたが、アナログでもいけるようですね。

//setup()内の処理は最初の一回だけ行われる
void setup() {
  pinMode(PIN_LED2, OUTPUT );//Pinを出力用に設定
  pinMode(PIN_LED3, OUTPUT);
  int led_pw = 255; // 明るさ(通常とは逆) 明るい0 - 255暗い
}

void loop() {
  rx_led2( 2 ); //明るさ調整ステップ
  rest();
  tx_led3( 2 ); //明るさ調整ステップ
  rest();
}

// RXとLED 基盤側の青LED
void rx_led2(int n){
  int led_pw = 255;
  //点滅周期
  for (int i=0;i < 255;i++ ) {
    analogWrite(PIN_LED2, led_pw );
    led_pw = led_pw + n;
    if( led_pw ==   0 ) n =  n;
    if( led_pw == 255 ) n = -n;
    delay( 5 );//だんだん暗くなる速度
  }
//  digitalWrite(PIN_LED2, HIGH ); //通常とは逆 LOW で点灯、HIGH で消灯
analogWrite(PIN_LED2, 255 );// LED Off 上より暗くなる
}

// TXのLED USBコネクタ側の青LED
void tx_led3(int n){
  int led_pw = 255;
  for (int i=0;i < 255;i++ ) {
    analogWrite(PIN_LED3, led_pw );
    led_pw = led_pw + n;
    if( led_pw ==   0 ) n =  n;
    if( led_pw == 255 ) n = -n;
    delay( 5 );
  }
analogWrite(PIN_LED3, 255 );// LED Off
}

void rest() {
    delay( 500 );
}

いろんな値を書き換えて遊んでみてください。

注意点としては、HIGHとLOWが逆なのと、255が暗く、0が明るい状態となるようです。これは仕様なのかバグなのか? Seeedさん、これは修正してほしいです。

XIAOはどんなスペックなのか?

このボード、一目惚れして速攻買ったのでどんなスペックかまだよくわかっていません。改めて、記載してみます。

製品名称 Seeeduino XIAO
マイコン ARM Cortex-M0+ CPU(SAMD21G18) 
動作電圧 3.3V
デジタル I/O ピン 11
PWM Pins 10
アナログ I/O ピン 11
フラッシュメモリ 256 KB
SRAM 32KB
EEPROM
クロックスピード 48 MHz
大きさ 23.5mm x 17.5mm
価格 $4.90

だいぶarduinoから離れていて、このあたり疎いのですがどうやら ATSAMD21は、アーキテクチャーはARM Cortex-M0+ CPU(SAMD21G18) のようです。Arduino Zero・M0 Proっていうボードにも使われているやつみたいですね。SAMD21系のarduinoとか表現されている感じです。または、単にSAMD系Arduinoとか。

ARM CORTEX-M0+

https://www.arm.com/ja/products/silicon-ip-cpu/cortex-m/cortex-m0-plus

メジャーなArduino との比較表です。自分は、Nanoシリーズ互換機か、Pro Miniが好きです。安いからw

ボード マイコン 動作電圧 Digital I/O PWM Analog I/O Flash Memory SRAM EEPROM クロックスピード 大きさ 価格
Arduino Nano v3 ATmega328 5V 22 6 8 32KB 2KB 1KB 16MHz 45 mm x 18 mm $45.90
Seeeduino Nano ATmega328 5V 22 6 8 32KB 2KB 1KB 16MHz 45 mm x 18 mm $6.90
Arduino Micro ATmega32u4 5V 20 7 12 32KB 2.5KB 1KB 16MHz 48 mm x 18 mm $24.90
Arduino Pro Mini ATmega328 5V / 3.3V 14 6 6 32KB 2KB 1KB 8 /16MHz 33 mm x 18 mm $9.95
Trinket M0 ATSAMD21 3.3V 5 2 3 256KB 32KB 48MHz 27mm x 15.3 mm $8.95
Seeeduino XIAO
ATSAMD21
3.3V 11 10 11 256KB 32KB 48MHz 23.5mm x 17.5mm $4.90

NanoやProMiniの互換機は、アリエクで200〜300円くらいなんですが、それと比べると600円は高いかもしれませんが、倍以上のスペックはありますね。

こうして比較してみると、コスパがいいんじゃないでしょうか。まぁ、こんな高スペックは必要ないっていう用途もあるんで使い所次第ですかね。

今後に備え応用例や試したことなどメモ

発売からもうすぐ1年経過するので、どんな応用例があるかリサーチしてみました。また、開発する上で役立ちそうなメモをしておきます。

Seeed:Seeeduino XIAO Resources Roundup. What will be your next project idea made by Seeeduino XIAO?

リンク

まず、オフィシャルのSeeedのブログでいくつか紹介されています。その中から独断と偏見で面白そうなプロジェクトをピックアップ。

MIDIをコントロールできるので、オリジナルコントローラとかセンサー駆動の楽器とか?

サイトでは、違うボードを使っていますがXIAOでも同じことが可能。画像や図形を組み合わせて空中にお好みの絵を投影する装置。

PovRanian 装置

PovRanian (ポブラニアン):画像や図形を組み合わせて空中にお好みの絵を投影する装置

これ作りたいなー!

エアロバイクでストリートビュー進みたい!! (その3)(Seeeduino XIAO化してみた)

ツールのUSB Stack は、 TinyUSBを選択とな。ほほー。

あれこれ調査していると、PlatformIOも対応しているようです。まだ試していませんが、メモしておきます。

開発環境:PlatformIO Seeeduino XIAO

USBホストライブラリSAMD

SeeedのWikiにあるやつですが、リンク先だけメモしておきます。

Seeeduino XIAOをUSBデバイス(TinyUSB)として使う

Seeeduino XIAO の使い方

カムロボの顔用基板を作ってみた [Xiao版]

Seeeduino XIAOを使って二酸化炭素測定する SparkFunライブラリVer

fritzingのパーツ

Seeeduino XIAOのタッチ入力

Seeeduino XIAOのデジタル入力

Seeeduino XIAOのデジタル出力

Arduinoで超音波センサHC-SR04の使い方【距離測定】

ArduinoでOLED

シリアルLED(WS2812B)をArduinoで制御

【Seeeduino XIAO】RS232cから受信した信号をUSB HIDで送信してみる

Seeeduino XIAO でPWM調光のLチカとI2CのLCDを使ってみる

いろいろありますねー。こんなこともできるみたいです。

Seeeduino XIAO マイコンで TOPPERS を始めよう

TOPPERS/R2CAというマルチタスク処理ができる

Seeeduino_XIAOでArduino Keyboard.h互換ライブラリを利用してMicrosoft Teamsミュートキーを作製する

楽しそうなのがいっぱいありますね。

XIAOを組み込んでいるハードウェア作家さんもいましたよ!

XIAO DAP
Seeeduino XIAO をメインコントローラとした、DigitalAudioPlayer

https://sites.google.com/view/chikoidac/home/xiao_dap

まだ販売はされていないとのことですが、販売されたら組み立てKITを買ってみたいです!

まとめ

今回、なんとなくわかったのは以下となります。

・XIAOはコスパ最高でないか!
・Type-Cが良い!
・Arduino IDE 互換で、SAMD21系のarduino
・本家では、Arduino Zero・M0 Proに使われている
・3.3v動作でクロックが速く、フラッシュメモリも多い
・しかしEEPROMがないようです フラッシュメモリに保存する?
・USB関連のプロダクトやシリアル通信系の応用とか相性良さそう
・SMD実装がやりやすい(ので、基板設計して使うのとか良いですね)

あとがき

このボード、本当に小さくて応用次第では面白い組込ができそうだなーと感じています。まずは3つあるので、何か実用的な何かを1、2つ作ってみたいですね。1つは、開発用にしておいて残りは実験的に何か実際に作ってみようと思います。まずは、できそうなことからやってみましょうか!

著者にメッセージ

間違いのご指摘など、コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。

ロジックアナライザでI2C 信号を見ると

INA226 と arduino の I2C 信号をロジックアナライザで見てみました。

コードは前回と同じものです。1秒ごとに4つのデータをゲットしています。

1

トリガは、SDA にかけました。Hi から Low になって信号が行くようです。

まず、I2C アドレス0x40 のレジスタ 0x02 を投げて、値が帰ってくる流れが見えます。読み出しには、1.7ms ほどかかっていることがわかりました。ビットの信号は、4us 程度のようです。SDAでビットが立っているのを判別しているようです。

 

たとえば、最初は INA226_REG_BUSVOLTAGE  (0x02) を読み出しているようで、値は16進数で 0x0E9E が帰ってきています。10進数では、3742 でこれに1.25 を掛けたものが mV になるので、4677.5 mV = 4.6775V ということですね。精度は、0.1mV ということです。

 

I2C のリアルタイムな生データを見るのは今回が初めてです。なかなか、IC同士で通話している感じがおもしろいですね。

1000分の1,2秒で、データを読み取っていて、0 と 1 の Hi と Low の信号のやり取りでそれをやっているというのが目で見えてわかりやすいです。ロジックアナライザって偉い存在ですね。

 

▼まとめ

・INA226 と arduino の I2C 信号を見てみた

・SDA の LOW にトリガーをかけて採取。

・スレーブアドレス+データ領域を指定すると、対応するスレーブから値が帰ってくる

・SCL にビットデータが流れ、SDA にデータ流れる感じ。両方ともHi になった部分が ビットが立つ感じ。

・ビット のHi になる時間は、4us ほど。

・1つのレジスタの読み出しには、1.7ms ほどかかる。

・呼び出しから応答までの間隔は、1ms ほど。0.7ms でデータをやり取りしている。合計で1.7ms

・安物のロジックアナライザでも十分現象を観察できた。

INA226 を arduino nano で

もう1月も終わりですね。なんだか速く月日が経つような気がします。

さて、今日は 先日作った INA226 の電流電圧センサーを I2C で arduino nano クローンにて計測してみました。

前回の調査で見つけた、ポーランドのサイトにいいチュートリアルがありました。

Korneliusz Jarzębskiのサイト
Dwukierunkowy cyfrowy czujnik prądu/mocy INA226

github
Arduino-INA226
https://github.com/jarzebski/Arduino-INA226

このGitHub のsimple のソースにライブラリを配置し、

./INA226_simple
├── INA226.cpp
├── INA226.h
└── INA226_simple.ino

INA226.cpp の記述を以下に変更。25mR のシャント抵抗の設定をします。

#include "INA226.h"
::
void setup() 
{
::
  // Calibrate INA226. Rshunt = 0.025 ohm, Max excepted current = 4A
  ina.calibrate(0.025, 1);
::

配線は以下のようにしました。ちょっとわかりにくいですが、Arduino の A5(SCL) と A4(SDA) をつないで、GND と 3.3V を VSS に入れます。あとは、負荷を電流計測にハイサイド側に付ける感じです。

arduino_ina226

シリアル通信を開くと、以下のようになっています。

Initialize INA226
-----------------------------------------------
Mode:                  Shunt and Bus, Continuous
Samples average:       1 sample
Bus conversion time:   1.100ms
Shunt conversion time: 1.100ms
Max possible current:  3.28 A
Max current:           3.28 A
Max shunt voltage:     0.08 V
Max power:             117.96 W
-----------------------------------------------
Bus voltage:   4.67875 V
Bus power:     0.01250 W
Shunt voltage: 0.00007 V
Shunt current: 0.00300 A

Bus voltage:   4.68125 V
Bus power:     0.01250 W
Shunt voltage: 0.00007 V
Shunt current: 0.00300 A

Bus voltage:   4.67750 V
Bus power:     0.01250 W
Shunt voltage: 0.00007 V
Shunt current: 0.00300 A

PC からのUSB 電圧は4.67V 程度のようです。3mA で12.5mW ということがわかりました。ちゃんと計測できているようですね。

arduino だと装備からLCDなどに出す用途で使えそうですね。データをどこかに飛ばすものであれば、ESP8266 が良さそうです。

 

IC 回路の電圧は3.3V でも5V でもOKです。LEDの負荷を arduino の 3.3V から取って計測してみると以下のようになりました。

Initialize INA226
-----------------------------------------------
Mode:                  Shunt and Bus, Continuous
Samples average:       1 sample
Bus conversion time:   1.100ms
Shunt conversion time: 1.100ms
Max possible current:  3.28 A
Max current:           3.28 A
Max shunt voltage:     0.08 V
Max power:             117.96 W
-----------------------------------------------
Bus voltage:   3.26875 V
Bus power:     0.00500 W
Shunt voltage: 0.00004 V
Shunt current: 0.00150 A

Bus voltage:   3.27000 V
Bus power:     0.00500 W
Shunt voltage: 0.00004 V
Shunt current: 0.00150 A

Bus voltage:   3.26875 V
Bus power:     0.00500 W
Shunt voltage: 0.00004 V
Shunt current: 0.00160 A

 

ちょっとコードを追加して、レジスターの値を取ってみました。

Initialize INA226
-----------------------------------------------
Mode:                  Shunt and Bus, Continuous
Samples average:       1 sample
Bus conversion time:   1.100ms
Shunt conversion time: 1.100ms
Max possible current:  3.28 A
Max current:           3.28 A
Max shunt voltage:     0.08 V
Max power:             117.96 W
-----------------------------------------------
INA226_REG_CONFIG          (0x00):16679 ---
INA226_REG_SHUNTVOLTAGE    (0x01):30 ---
INA226_REG_BUSVOLTAGE      (0x02):3749 ---
INA226_REG_POWER           (0x03):5 ---
INA226_REG_CURRENT         (0x04):30 ---
INA226_REG_CALIBRATION     (0x05):2048 ---
-----------------------------------------------
Bus voltage:   4.68250 V
Bus power:     0.01250 W
Shunt voltage: 0.00007 V
Shunt current: 0.00300 A

レジスター値は10進です。アベレージの回数とかも定数があるので便利ですね。

精度は、0.1mA  のようですね。PCB のあまり部分で作ったモジュールでも結構遊べました。あと、小さなパーツの半田付けの練習にもなりました。

 

▼参考サイト

http://denshi-kousaku.fan.coocan.jp/report030.html

 

▼まとめ

・ライブラリ便利!

・INA226 モジュールを使って、arduino で i2c にて電流電圧を簡単に取れる

・精度は、シャント抵抗次第で、0.025R だと0.1mA(100μA) の精度になるようです

・GND はIC回路と共通で測定で、電圧を測定する場合は、IC の VBUS 8pin に計測電圧をかける

・LSB とは一般的には、最下位ビットのことで、least significant bit の頭文字。

・これの分解能力は16ビットなので、0.025R だと電流は0.1mA で電圧は 1.25mV

・とりあえず、十分な精度です。

コントローラーABできました

目玉おやじの胴体はボタンになってもらうので、切り落とします。

写真 1

ボリュームは、使ってないデットストックのをジャンク箱から見つけました。頭を削って調整します。

写真 2

まだ、配線してない状態ですが収まりは良さそう。

写真 3

続いて、携帯灰皿のコントローラ加工。こっちは、半固定抵抗で頑張ってもらいます。筐体は白にペイント済みです。

素材は、灰皿部分はアルミで出来ているので基盤を丸くけずり、ベース部分を作りました。半固定抵抗の柄には、グルースティックをつけてあります。

写真 4

USBケーブルを通し、スイッチを配線します。

写真 5

で、くみ上げてついにボール型のコントローラーAとBが出来ました!!

写真 1

1つは、マクドナルドのおもちゃを流用。そして、もうひとつは携帯灰皿を利用しています。携帯灰皿のほうは、蓋を開けるとホイールコントローラとスイッチが見えてなかなかかっこいいです。

写真 2

本体のケースはまだですが、プレイした感じ。

写真 3

来週くらいにはケースできるといいかなぁ。ぼちぼちと作っていきます。

写真 4

かなり面倒な作業がありましたが、なんとかコントローラが出来ましたよ。

arduino で pong 完成までもう少しです。

 

あと、100円ショップでケースになりそうなものを物色してきました。前回作ったESP12 の温度湿度照度のデバイスを入れようかなと。新幹線のと、レゴ風のケースとどちらかにしようかと。

写真 1

温度センサーは出さないといけないので、レイアウトに迷います。

写真 2

真ん中の車両はモーターも付いています。100円ショップは工作材料の宝庫です。