先日公開した、Chromebook・Windows・Mac・各種スマホで使えるwebUSBの技術を用いたプログラミング教材ですが、Arduinoで開発していてオープンソースにしていることで、様々なカスタマイズが可能です。これから数回にわたって、改良方法について説明していきます。
今回は初回と言うことで、比較的簡単な内容をいくつか説明していきます。
アナログ入力にセンサを追加
A0~A3がアナログ入力になっていると説明しましたが、ここに何かデバイスをつないでみましょう。何か手ごろなセンサが無いか周辺を漁ってみたところ、Panasonicの人感センサが見つかりました。

https://akizukidenshi.com/catalog/g/gM-12313/
これをArduinoで使う方法も検索して見つけたので、このセンサを試してみようと思います。
https://qiita.com/FireFoxCorp/items/0b56d672bc9abcbd5ef6
上記の記事によると、このセンサはセンサ出力をプルダウンする必要があるようで、センサ以外に10kΩの抵抗が必要になります。これをブレッドボードの回路図に入れると次のようになります。

人感センサを接続したら、アプリから接続してセンサ1の数値を見て見ましょう。センサに反応がある(ON)と214、反応が無い(off)と0の数値に変化します。

この人感センサの特性として、検出範囲が割と幅広いので、センサの正面から多少ずれた位置にも反応するようです。また、反応時に0と214がチラチラ変化したり、一度ONになったらoffになるまでしばらく時間がかかるなどの特徴があります。他には、人を検出してもその人が離れずにその場にとどまった場合は、まだ人がいるのにoffになるようです。プログラム作成時にはこれらの特性を考慮する必要がありそうですね。
他にもアナログセンサは色々な種類が売られているので、興味があるものを探して取り付けてみて下さい。
気圧情報を使えるようにする
搭載しているBME280には、温度・湿度以外に気圧も取得できていますが、数値が255を超えるので、デフォルトではメモリマップに出していません。実はファームウェアではvoid bme280_task()の関数で気圧もローカル変数で取得していますが、その場で捨てていてメモリマップ領域に代入していません。
//BME280(温湿度/気圧センサ)を読み込んでメモリマップに数値を代入する関数 void bme280_task() { double temp_act = 0.0, press_act = 0.0,hum_act=0.0; signed long int temp_cal; unsigned long int press_cal,hum_cal; readData(); temp_cal = calibration_T(temp_raw); press_cal = calibration_P(pres_raw); hum_cal = calibration_H(hum_raw); temp_act = (double)temp_cal / 100.0; press_act = (double)press_cal / 100.0; hum_act = (double)hum_cal / 1024.0; memmap[TEMP] = (int) temp_act; memmap[HUM] = (int) hum_act; /*Serial.print("TEMP : "); Serial.print(temp_act); Serial.print(" DegC PRESS : "); Serial.print(press_act); Serial.print(" hPa HUM : "); Serial.print(hum_act); Serial.println(" %"); */ }
実は上記の関数内で、変数temp_actに気温、変数hum_actに湿度、変数press_actに気圧がそれぞれ求まっていますが、メモリマップ(配列変数memmap)には気温・湿度だけ代入しています。これはもったいないので、使えるようにしてみましょう。
真っ当に気圧を使えるようにするなら、255以上の数値に対応させた上で、メモリマップに新しく「気圧」の項目を増やすのが本筋ですが、そうなるとプログラミングアプリ側にもある程度大きな変更が必要になるため、初級編でできる範囲を考えて、次のような変更にしたいと思います。
- 8個ある変数の一つを気圧の値に変える
- 本来の気圧の1/10の値にして0~255に収める(例:1000hpa=100)
さて、この仕様に応じてソースをどう改変すればよいでしょうか?先に答えを書いてしまうと次のように1行追加します。
temp_cal = calibration_T(temp_raw); press_cal = calibration_P(pres_raw); hum_cal = calibration_H(hum_raw); temp_act = (double)temp_cal / 100.0; press_act = (double)press_cal / 100.0; hum_act = (double)hum_cal / 1024.0; memmap[TEMP] = (int) temp_act; memmap[HUM] = (int) hum_act; memmap[VAR8] = (int) (press_act/10); //この行を追加する
8個の変数のうち、多分一番使われないであろう末尾の変数8に気圧の値を割り当てます。press_actで求まるのは実際の気圧値(1000前後)なので、÷10をして100前後の値に収めています。メモリマップへの代入時には浮動小数点型(double)から整数型(int)にキャストします。
プログラムを書き換えたら、ビルド・書き込みして実際の数値を確かめてみましょう。

現在は気温25℃、湿度58%、気圧1010hPaだとわかる。
気圧は気温・湿度以上に変化させづらく体感もしづらいですが、気象庁のwebページから現在の天気図を見ると、なんとなく今の位置の気圧が把握できるので、これと見比べてみてください。
https://www.jma.go.jp/bosai/weather_map/

計測値が101(≒1010hPa)で場所が大阪だったので、概ね一致する
ChromeにArduino IDEを入れてみる
改良とは若干異なりますが、ChromebookにArduino IDEを導入する方法について調べてみると、今は開発環境自体は無償で利用でき、ソース・ライブラリの取得と教材本体への書き込みまで一通り実行できたので、ここでその流れを紹介したいと思います。
最初に注意事項ですが、Chromebook全般のことは把握できていませんが、機種によっては、搭載CPU等ある程度ハードウェアの差異があるようで、ここで説明している事項が必ずしもすべてのChromebookで再現できるという保証はありません。
CPUの種類の確認
ChromebookではLinux用のArduino IDEを使うようですが、Linux用Arduino IDEには、以下の4種類が存在します(2021年9月現在)。この中から、利用しているChromebookのCPUの種類に応じて正しいものを選択します。
- Linux 32bit
- Linux 64bit
- Linux ARM 32bit
- Linux ARM 64bit
ChromebookのCPUの調べ方ですが、下記記事のようにブラウザに「chrome://system」と入力し、表示される詳細項目の「cpuinfo」を見る方法があるようです。
しかし、今回使用したChromebookではいまいち種類が把握できませんでした。

困ったので、この情報は置いといてChromebook自体の機種名(Lenovo Chromebook S330)でweb検索をかけてみると、CPUの名前が「MediaTek MT8173」と言うことがわかりました。続いてこのCPU名で検索すると、種類はARM 64bitであることがわかりました。
Arduino IDEのインストール
続いてArduino IDE本体をダウンロードしてインストールしていきます。ここからの手順は、下記のwebページを参考にしました。
https://chromebook.nomad-life.net/1916777/【メモ】chromebookにarduinoをインストール
まずはArduino IDE本体のダウンロードです。先程調べたCPUの種類に応じて正しい物を選択します。ちなみにダウンロード時に寄付を聞かれますが、「JUST DOWNLOAD」を選択して無償でダウンロードします。

ダウンロードしたら、Chromebookの設定を開いてLinuxをONにします。ONに切り替えるのに若干時間がかかります。

LinuxをONにしたら、「ファイル」の画面の左側にLinuxのフォルダが表示されるようになるので、先程ダウンロードしたArduino IDEのファイル(arduino-x.x.x-linux~~~.tar.xzみたいな名前)を、ダウンロードフォルダからLinuxフォルダにコピーします。

次に、Linuxのターミナル画面を開きます。アプリ一覧からLinuxのターミナルを選びます。LinuxをONにしたときに、最後に自動的に開くこともあるようです。開いたら、先に紹介した導入方法のURLのように、sudoから始まる以下のコマンドを実行します。ただし、後半の「arduino~」の所は実際にダウンロードしたファイル名に合わせて書き換えます。
「sudo tar -C /opt -xf arduino」まで入力したら、TABキーを押すと正しいファイル名で自動的に埋めてくれると思います。
$ sudo tar -C /opt -xf arduino-1.8.16-linuxaarch64.tar.xz
インストールが完了したら、アプリ一覧からArduino IDEを実行できるようになります。アプリ一覧では、Linuxアプリの中に入っているようです。

ファームウェアのソースの取得とライブラリのインストール
本教材のファームウェアのソースを取得するには、gitによるクローンかzipファイルのダウンロードのいずれかですが、Chromebookにおいては、前者は入っていない気がするし、後者もどこにファイルができるか・開けるか等怪しかったので、今回はArduino IDEを起動して開かれるスケッチの上に、github上のソースのページから内容をコピペしました。
https://github.com/vstoneofficial/webusb_programland/blob/master/webusb_leonard.ino
まあ実際にはファイルをDLする方法で問題無い気がしますが、ここは各自好きな方法を選んでください。
続いてライブラリのインストールです。MIDIUSBは、前回の説明と同じくライブラリの管理で「MIDI USB」と検索して見つかるものをインストールすればOKです。
webUSBは、下記のURLからサンプルコード一式をzip形式でダウンロードするところまでは同じです。
https://github.com/kimio-kosaka/webUSB-arduino
ダウンロードしたら、「ファイル」を開いて、ダウンロードしたファイルをダブルクリックすると中身が見られるようになります。その状態で「libraries」内の「WebUSB」フォルダを、Linuxフォルダ内にある「Arduino/libraries」フォルダにコピーしてください。

教材本体の接続とポート設定・書き込み
続いて、教材本体をChromebookと接続して、ポート番号を設定し、ファームウェアをビルド・書き込みします。
教材本体をChromebookに接続すると「USBデバイスが検出されました。Pro Micro 5VをLinuxに接続するには、設定を開いてください」(メッセージ内容は異なる場合があります)と表示されるので、その下の「LINUXに接続」をクリックしてください。

「LINUXに接続」をクリック
その状態でArduino IDEのシリアルポート設定を開くと「/dev/ttyACM0(Arduino Leonard)」のように表示されるので、そのポートを選択してください(Chromebookの機種によっては名称が異なったり、そもそも認識しない可能性があります)。ついでにボードの種類をArduino Leonardに忘れず設定しておきましょう。

準備ができたらビルド・書き込みを開始します。書き込み中は、何度か「USBデバイスが検出されました。」の表示が出る場合がありますが、毎回「LINUXに接続」をクリックしてください。

うまく書き込みが完了すれば、Chromebookでの開発環境構築は完了です。
次回予告
初級者でも容易にできるところとしては、ざっとこれくらいだと思います。今回の内容で興味を持った方は、他にも色々な拡張・改変をお試しください。次回はモータの追加・プログラミングアプリ側の改変(改変したものをどうやって使えるようにするか)等、少しステップアップした内容を説明したいと思います。