みなさん、こんにちは。
最近、私の中ではかなり盛り上がっているMSX。前回、Linux環境からmsxtermを使ってMSX0に接続し、簡単なホールセンサーの値を読み取る方法をご紹介しました。
今回はその続編として、より実用的なIoTデバイス制作に挑戦します。ターゲットは、現代のオフィスや自宅で気になる「空気の汚れ(空気質)」です。MSX IoT BASICを駆使して、ガスセンサーを動かしてみましょう!
準備編
MSX0(M5Stack Core2ベース)の真骨頂は、I2C通信にさえ対応していれば、最新のセンサーをIoT BASICで制御できるところにあります。今回は、二酸化炭素(eCO₂)と総揮発性有機化合物(TVOC)を測定できるTVOC/eCO2 ガスセンサユニット(SGP30)を使います。比較的安価で入手性も高いセンサーです。
必要なハードウェア
- MSX0 Stack
2026年1月現在、新品での入手は困難ですが、近々クラウドファンディングで新型のMSX0 Tab5が発表される見込みです。 - SGP30 センサーユニット(M5Stack用などのGrove互換品がおすすめ)
- I2Cケーブル(Port Aに接続します)
接続は非常にシンプルです。MSX0のPort A(赤いポート)にSGP30を差し込むだけ。内部的には、I2Cバスを通じてアドレス 0x58 で通信が行われます。
実装 – MSX IoT BASIC によるプログラム
動作を確認できるソースコードを作成しました。前回の記事を参考に以下の内容を AIR_QUALITY.BAS として保存し、msxterm で流し込んでみてください。
10 SCREEN 0:WIDTH 40:CLS
20 N$="device/i2c_a/58"
30 GOSUB 1000:'Initialize SGP30
40 '--- Main Loop ---
50 C$=CHR$(&H20)+CHR$(&H08):'Measure IAQ Command
60 _IOTPUT(N$,C$)
70 FOR J=1 TO 100:NEXT J:'Wait for measurement
80 _IOTGET(N$,S$)
90 IF LEN(S$)<9 THEN GOTO 50
100 GOSUB 2000:'Process Data
110 FOR K=1 TO 500:NEXT K:'Wait for next read
120 GOTO 40
1000 '--- Initialization ---
1010 PRINT "Initializing SGP30..."
1020 C$=CHR$(&H20)+CHR$(&H03):'IAQ_INIT
1030 _IOTPUT(N$,C$)
1040 FOR J=1 TO 500:NEXT J
1050 PRINT "Wait 15s for baseline..."
1060 FOR K=1 TO 1500:NEXT K:'Mandatory wait
1070 RETURN
2000 '--- Data Parsing ---
2010 E1=ASC(MID$(S$,1,1)):E2=ASC(MID$(S$,2,1))
2020 T1=ASC(MID$(S$,4,1)):T2=ASC(MID$(S$,5,1))
2030 EV=(E1*256)+E2:'eCO2 Value
2040 TV=(T1*256)+T2:'TVOC Value
2050 CLS:LOCATE 5,10
2060 PRINT "eCO2 : ";EV;" ppm"
2070 LOCATE 5,11
2080 PRINT "TVOC : ";TV;" ppb"
2090 IF EV>1000 THEN LOCATE 5,13:PRINT "!! VENTILATE !!"
2100 RETURN
コードの解説 – MSX IoT Basicならではのテクニック
MSX IoT Basicでセンサーを扱うには、いくつか「お作法」があります。
- I2Cのバイナリ送信
SGP30へのコマンド(例:0x2008)は、CHR$(&H20)+CHR$(&H08)のように文字列として組み立てて_IOTPUTで送信します。 - 変数名の2文字制約
MSX IoT BASICでは変数名の先頭2文字しか識別されません。EV= Estimated Value (eCO2)TV= TVOC Value のように、短く意味の通る名前を付けるのがコツです。
- データ解析(Big-Endian)
センサーから返ってくるデータは高位バイト(MSB)・低位バイト(LSB)の順です。EV=(E1*256)+E2の計算式で、2つの8ビットデータを1つの数値に復元しています。
このコードをベースにエラー処理などを追加したソースコードをGitHubに公開していますので、よかったらこちらも参考ください。
SGP30 TVOC & eCO2 Sensor Reader for MSX0
実行結果と数値の読み方
プログラムを実行すると、15秒の待機(ベースライン学習)のあと、画面に数値が表示されます。
- eCO2(二酸化炭素相当量)
400〜1,000 ppm程度なら正常です。1,500を超えると「空気が悪い」状態ですので、窓を開けましょう。
ただし、eCO2(二酸化炭素相当量)は、あくまで水素濃度などから「推定」した値です。実際のCO2値と比較すると誤差が多いのでご注意を。正確な換気指標が必要な場合は、NDIR方式のセンサー(SCD30など)が必要です。
- TVOC(総揮発性有機化合物)
タバコの煙や芳香剤、アルコール消毒液などに敏感に反応します。においセンサーとしての使い道があるかもしれません。
もし数値が 400 と 0 から動かない場合は、センサーを指で軽く仰いでみたり、少し息を吹きかけたりして反応を確かめてみてください。
AIを活用したMSX IoT Basic開発
今回のプログラム、実はベースのロジックをChatGPTに出力させ、GitHub Copilotで「MSX IoT BASICの制約」に合わせて手直しさせたものです。
「I2Cのコマンドはこれ。MSX0の
_IOTPUTを使って、変数名は2文字以内で書いて」
このようにAIに指示を出すことで、複雑なデータシートを読み解く時間を大幅に短縮できます。「最新のAIに、古のBASIC拡張言語の制約をコンテキストで与え、最新のセンサーを制御させる」。このギャップこそが、MSX0開発の醍醐味かもしれません。
MSX0 Tab5 のクラウドファンディングももうすぐ始まるはず。ぜひみなさんも手に入れてMSX0を使い倒してください!
本日も最後までお読みいただきありがとうございました。
それでは、よいMSXライフを!




ピンバック: MSX IoT BASIC 失敗学 – MAX30100で気づいた「BASIC向けセンサー」の選び方 - ビューローみかみ