マトリョーシカ的日常

ワクワクばらまく明日のブログ。

31歳になった

 この一年はまったく本を読んでおらず、とんでもなく語彙が少なくなってしまった。それでも文章は書けるわけで、いったいこれを文章たらしめている物体はなんなのか、見当がつかない。31歳になった。

COVID-19

 やばくね? いろいろやばい。でも一個人ではどうすることもできないので、マスク手洗いうがいをがんばるしかない。社会がふにゃふにゃになってきているので、自分もふにゃふにゃにならないといけない。

勉強

 昨年とりくんだ技術士二次試験は筆記試験で落ちてしまった。再チャレンジはまだしない。いまはそれ以上にやりたいことが多すぎる。プログラミングとしてRubyとRailsに取り組んでいる。えいやとやりたい。

つくったもの

 なにかあるだろうか。技術書典はコロナの影響で流れてしまったが原稿は書いた。
FARMTORY JOURNAL vol.3 育てる食べる×テクノロジー 電子版 - farmtory - BOOTH

 あとはカップラーメンタイマーや春を感じるIoT、ハンコ押しロボット(もどき)などをつくった。

仕事

 コロナの影響で弊社もやばい。生き残れるかどうかわからない。自分の身は自分で守るしかない。ちょっと足回りを軽くしてやって、どこへでもいけるようにしないといけない。
 仕事でもIoTをやれるようになった。非常に楽しい。

子供

 二人目もだんだんと大きくなって、家中うるさい。あと十年はこの状態が続くのかな。コロナが落ち着いてたらみんなで旅行に行きたい。

オンラインサロン

 この一年でわたしの周りの環境が変わった。人生逆転サロンというオンラインサロンへ入会し、メンターになった。IoTの情報を発信している。ワクワクIoT講座も開講していて、いろいろがんばっている。あと、そこでRubyも勉強している。みんないいひと。みんなたのしい。

やりたいことリスト

 以前はやりたいことが腐るほどあったが、ただリストアップするだけではなにもできないことに気づいた。現実的な期限を設けないといけない。

 というわけで、31になってもがんばります!

 


Photo by Akhil Lincoln on Unsplash

近況の文章

 久しぶりに文章を書こうとしたら、世間はコロナばかりになっていた。感染者数は日々増えていて、企業にも休業要請がだされたりした。わたしたちも家にひきこもらないといけない。そのような世の中だ。私の勤めているところは、社員の一部を休業させながらなんとか回っている。いや、まわってないけど。

オンライン登壇

 ここ一ヶ月でオンラインイベントに参加するようになった。コロナの影響で、IT関係のイベントがすべてオンラインになったのだ。地方民の私としては、トーキョーが一気に身近なものになった気がする。ただ参加するだけではもったいないので、いくつかはオンライン登壇した。
 
【オンライン開催に変更】ビジュアルプログラミングIoTLT vol2 - connpass


【オンライン】M5Stackユーザーミーティング番外編【LINE Beacon化ハンズオン】 - connpass


 オンライン登壇は手軽で楽しい。会場へ移動することもないので、LTの5分が終わったら、すぐにこどもと遊ぶことが可能だ。これからはオンラインの時代になる。というよりオフラインは制限されていてなかなかできない。IoTの勉強会もオンライン上で開いてしまえばいい。そう思った。

cluseterVRがたのしい

 クラスターは、あのコロナのクラスターではない。バーチャルSNSと呼ばれているサービスだ。利用者は仮想空間でアバターを動かすことができる。VR機器がなくてもPC・スマホで利用することができる。たのしい。

 広島のclusterイベントにも参加した。たのしい。


 farmtory-labの紹介がclusterVRで行われていたので参加した。わっしょいやってる感があって、よかった。

 時代はなんかすごいはやさでかわっているらしい。わたしも変わらなくちゃいけない。生存しよう。
 

Photo by David Marcu on Unsplash

soracomでワクワク☆IoT生活  第2回「疑惑のバイナリ」


バイナリ通信を使ってみる

 人間の指が10本だったので、世界は10進数で溢れている。しかしながらPCの世界は2進数で表現される。彼らはON/OFFしかないのだ。(量子コンピュータは知らないが) だから、2進数を送ってやると都合が良い。

 さっと記事を書こう。前回の記事でUDP通信が使えるようになった。これを利用して、soracomにデータを送ることにした。今回は通信プロトコルだけでなく、通信するものごとも変更し、データ利用量を軽減しよう。バイナリデータを送るのだ。幸いなことにsoracomにはバイナリパーサというサービスが提供されている。バイナリデータを送ると、あちらでJSON形式のデータに変換してくれるのだ。

dev.soracom.io

バイナリパーサの設定

 soracomのコンソール画面上でいろいろ設定する。soracom air のところでバイナリパーサをONにする。肝心のデータフォーマットは、バイナリパーサplaygroundを使うと、いい感じに決まる。
binary-parser-playground.soracom.io

 わたしはこんな風にしてみた。

flag_1:0:bool:7 flag_2:0:bool:6 flag_3:0:bool:5 flag_4:0:bool:4 Num:0:uint:2:1 


データ送信プログラム

 ATコマンドで送ってみよう。各種設定をして、以下のようにプログラムを作成した。

const char * host = "uni.soracom.io";
const int port = 23080;
int send_byte = 1

略

  modem.sendAT(GF("+USOCR=17"));
  delay(1000);
  modem.sendAT(GF("+USOCO="), 1, ",\"", host, "\",", port);
  delay(1000);
  modem.sendAT(GF("+USOST="), 1, ",\"", host, "\",", port, ",", send_byte);
  delay(1000);
  modem.stream.print("00001111");

取得したが…!?

やってみたのだが、なんかうまくいかない。データは送信されているが、期待するデータとは違うのだ。以下の表に示す。

送信データ 期待する受信データ 実際の受信データ
-------- -------- --------
00001111 xxxx No.3 xxoo No.0
11111111 oooo No.3 xxoo No.1
00000000 xxxx No.0 xxoo No.0
01111111 xooo No.3 xxoo No.0
00111111 xxoo No.3 xxoo No.0
00001111 xxxx No.3 xxoo No.0
00001111 xxxx No.3 xxoo No.0


左の4bitでo x のbool値を返し、右の2bitでナンバーを返すようにしていた。のだが、なんか違う。バイナリパーサplaygroundではうまくいくのにね。

もしかして、16進数?

 そこから小一時間悩み続けて、ふっと閃いた。「もしかして、文字列を送っちゃっているのか!?」そう。自分が2進数だと思っていたのは実は文字列の01だったのだ!!文字列の"0"や "1" はアスキーコードで以下のように表現される

"0" 
->  00110000

"1"
->  00110001

 これで先ほどの表の結果がかちりとわかった。あれは左の1bit目が0だったら「b00110000」を、 1だったら「b00110001」を返していた結果だったのだ。そうか!!

変換しよう

 そういうわけで、ATコマンドで送る前に2進数を16進数のアスキーコードに変換して送る必要があることがわかった。コードは以下のようになる。

int bit_state = B000000;
a_s = (int)bit_state;
key = (char)a_s;

modem.stream.print(key);

bit_stateはbitWriteなどを利用して所望のbitにしてしまおう。

 そうしてうまくいった。非常によかった。

おわり

 soracomのネタ、まだまだ尽きない。日々のインプットに、アウトプットの速度が負けそうだがなんとか頑張って記事を残していこう。

Photo by Meckl Antal on Unsplash

M5Stack 3GモジュールでUDP通信 〜ATを呼ぶもの〜

 m5stack + 3Gモジュール、とても良い。マイコン一つでデータをクラウドへ送信できるので非常に便利。でもさ、ちょっと通信量多すぎないか?


 12月は100回程度通信した時点ですでに500kiBほど使用していた。(写真は最近のデータも含む) 1回の送信で5KiB!? 多すぎ!!これはどういうことか。サポートへ問い合わせてみた。

当社では通信の秘密よりお客様の通信内容は確認できないのですが、500 KiB であれば極端に多いとは言えないかと存じます。(一部抜粋)


 毎度のことながら返答が早い。ありがとうございます。

 やはり通信プロトコルの影響が大きいのかもしれない。利用しているのはHTTPというもの。これはよくわかんないけど、送信するデータが多くなってしまうらしい。

 対してUDPというものがある。これはデータを送信しっぱなしなので、応答の確認はしないので信頼性は低い。しかし送るデータが軽量なので通信量が低く抑えられる。なるほど。追跡機能がついた宅急便か、ゆうメールかの違いというところか。

 あれ、でも今使っているTinyGSm はUDPには対応していないぞ。

 お問い合わせいただきありがとうございます。


 M5Stack 用 3G 拡張ボードが搭載する通信モジュール u-blox 社 SARA-U201 は UDP 通信に対応しておりますので、直接 AT コマンドを実行いただければ UDP もご利用いただけます。(おそらくご利用になっていると拝察する TinyGSM が UDP に対応しておりません。)


 詳細は AT コマンドのマニュアルをご参照くださいませ。具体的な実装方法などは当窓口からはご案内できませんが TinyGSM ライブラリの sendAT 関数を利用すると AT コマンドを実行いただけるようですのでご検討いただければと存じます。

u-blox cellular modules AT commands manual

https://www.u-blox.com/en/docs/UBX-13002752


ないならつくればいいじゃない!!

 そこでATコマンドの出番である。これはむかーしのモデムにも使われていた命令であり、送信などができる。じつは3Gモジュールの中に入っている sala u-bloxはこのATコマンドが実行できる。
 tinyGsmのコードをgithubから眺めるとそれらしいところがいくつかあった。

GitHub - vshymanskyy/TinyGSM: A small Arduino library for GSM modules, that just works

いでよATコマンド

プロトタイプ向けマイコンモジュール M5Stack と 3G 拡張ボードをセットアップする | Getting Started | SORACOM Users
まずはこのコードを実行する。m5stack 3gモジュールからsoracomハーベストへデータを送信する。10秒おきに。結構頻度が多いね。

ここでシリアルポートをのぞいてみよう。
....

ちょっとよくわからない。


というわけで、まずはATコマンドを見てみよう。いいのがあった。



C:\Users\ユーザ名\Documents\Arduino\libraries\TinyGSM\src\TinyGsmCommon.h

ここに入っているヘッダファイルを修正するらしい。

    void sendAT(Args... cmd) { \
    streamWrite("AT", cmd..., GSM_NL); \
    stream.flush(); \
    TINY_GSM_YIELD(); \
    /* DBG("### AT:", cmd...); */ \
  } \

 このコメントになっているのを表に出すらしい。

うわ、なんか出てきた!!! なんだこいつは。

貼り付けながら見てみよう

[751] ### AT: 
(中略)
[4044] ### AT: +CFUN=16
[7404] ### TinyGSM Version: 0.7.9
[7404] ### AT: 
(中略)
[9800] ### AT: E0
[9804] ### AT: +CMEE=2
[9811] ### AT: +CGMI
[9816] ### AT: +GMM
[9821] ### Modem: u-blox SARA-U201
[9822] ### AT: +CPIN?
[10829] ### AT: +CPIN?
[10836] ### AT: I
[15854] ### AT: +CGREG?
(中略)
[18405] ### AT: +CGREG?
[18413] ### AT: +UPSDA=0,4
[18422] ### AT: +CGATT=1
[18428] ### AT: +UPSD=0,1," soracom.io "
[18434] ### AT: +UPSD=0,2," sora "
[18439] ### AT: +UPSD=0,3," sora "
[18445] ### AT: +UPSD=0,7,"0.0.0.0"
[18449] ### AT: +UPSDA=0,3
[52031] ### AT: +UPSND=0,8
[52038] ### AT: +CGREG?
[52044] ### AT: +UPSND=0,0
[54088] ### AT: +USOCTL= 0 ,10
[54095] ### AT: +USOCR=6
[54101] ### AT: +USOSO= 0 ,6,1,1
[54106] ### AT: +USOCO= 0 ," beam.soracom.io ", 8888
connected.

なるほど。どうやら、

[起動後の時間] AT  

という流れらしい。

これとu-bloxのatコマンド一覧を眺めてみよう。

https://www.u-blox.com/sites/default/files/u-blox-CEL_ATCommands_%28UBX-13002752%29.pdf
呪文か。


以下のブログで紹介されているやりかたで、ATコマンドを打ちながら試していこう。
デバッグモードを使いながらやっていく

ATコマンドの紹介

AT: +CFUN=16

> Selects the level of functionality fun in the MT.
p45

なるほど。わからん。なにかのスイッチをリセットしているらしい。

AT: E0

全くの不明。

AT: +CGMI
AT: +GMM

製造社とモデルを表示してくれる。 p35

AT: +CMEE=2

これはエラーモードの設定。

 AT: +CPIN?
 AT: +CGREG?
 AT: I

 SIMにデバイスの保護がなされているかを確認。CGREGはGPRSネットワークの確認らしい。AT Iは製品情報が表示される。

よしよし。

AT: +UPSDA=0,4

指定されたPSDアクションを返すらしい。なんとことかわからない。

AT: +CGATT=1

GPRSへの接続をON-OFFしている。

AT: +UPSD=0,1," soracom.io "
AT: +UPSD=0,2," sora "
AT: +UPSD=0,3," sora "
AT: +UPSD=0,7,"0.0.0.0"

 パケットスイッチをなんか切り替えるらしい。パケット通信のなにかを設定しているのかな。

AT: +UPSDA=0,3

 パケットスイッチに関するアクションをしかけている。なんぞ。

AT: +UPSND=0,8
AT: +UPSND=0,0

 パケットスイッチに関する何かを確認している模様。

AT: +USOCTL= 0 ,10

通信を許可している。10はTCP通信の許可らしい。

AT: +USOCR=6

ソケットを作っている。6はTCP通信のソケット。

AT: +USOSO= 0 ,6,1,1

ソケットのオプションを設定している。

AT: +USOCO= 0 ," beam.soracom.io ", 8888

ソケットへ接続している。


UDP通信をするにはどうすればいいか

 というわけで、上のコマンドを行った後にpayloadをpostしてやればHTTPはできる。では、UDPはどうすればできるか。以下の通りだ。

AT +USOCR=17

AT +USOCO=1,"uni.soracom.io",23080

AT +USOST = 1,"uni.soracom.io",23080,1,"1"

UDPソケットをつくり、ポートを指定。そうしてバイトを送信する!!
こんなかんじ。そして、TinyGSMを使用しているなら、harvestへ送信したプログラムに以下のコードを追記すればATコマンドが送信できる。

modem.sendAT(GF("+USOCR=17"));
  delay(1000);
  modem.sendAT(GF("+USOCO="), 1, ",\"", host, "\",", port);
  delay(1000);
  modem.sendAT(GF("+USOST="), 1, ",\"", host, "\",", port, ",", 1);
  delay(1000);
  
  modem.stream.print("0");

やったね!


通信量の比較

 かなり下がった! 2月は800回ほどデータ送信をしたが、全体の通信量は130KiBくらい。一回あたり160Biくらいか。前の5KiBに比べたら約1/30になった。うれしいなぁ。

次回予告

 さて、なんとかUDP通信はできたのだが、バイナリの様子がどうもおかしい。バイナリパーサーを通じて観測すると、0だと思って送信したものが0じゃなかったのだ。

次回、「疑惑のバイナリ〜アスキーコードの行方〜」

お楽しみに!!



Photo by eberhard grossgasteiger on Unsplash

分かっちゃいるけど、やるのは難しい /「エッセンシャル思考」


 書き始めが冬のことばかりになっている気がして、私自身が寒さを求めているのだなと感じた。それくらい今年の冬は暖かい。始発の電車で会社に向かう時、冷えた手を缶コーヒーで温めたりもしたいが、そういうほどでもない。だから私はセブンカフェのコーヒーを買うのか。あれおいしいよね。関係ないね。

 エッセンシャル思考を読んだ。目標を明確に!余分なことはしない!そうすればOK!そういう本だ。「そんなのわかっているよ」という声も聞こえるが、これはただわかっているだけではダメだ。実践を伴って初めて価値が生まれる。本を読んで、少しずつエッセンシャルな形が身についてきたので、記録しておく。

 まずは本質的な目標を定める必要があった。これはワクワクして、具体的なものがいいらしい。私はひとまず「IoTで10万円稼ぎたい!」とした。次に不要なものを捨てることにした。この捨てるというのは難しいのだが、なにか新しいことを始めるなら、なにかを捨てなければならない。私は自分に降りかかる仕事のうち、後輩に任せられることは任せることにした。これで自分のやりたい本質的な仕事(社内IoT化)に集中することができた。

 なにも後輩に全部投げるわけではない。目標と期日は明確に伝えた。具体的な方法は後輩も知っていたので、あまり細かく注文するのはやめた。重要だったり、期日が短い仕事は進捗を細かく追う必要があるが、それも最低限にした。時々フォローはするが、いまのところ案外うまく回ってきている。彼も着実に成長しているのだ。すばらしい。私はIoTをやるぞ。

 仕事で身につけたIoTスキルを個人活動でも生かせるようにしたい。そのために職場の仕事はIoTだけになるように努力している。

 捨てることができてきたら、自分のパフォーマンスを高めることを考える。エッセンシャル思考では睡眠時間の確保をうたっている。私は少し睡眠時間が少なかったので、会社の昼休みに10分ほど寝るようにした。これはどう変わっているかよくわからない。ただ、健康に対する意識は変わった。今までは風邪をひいいたら治すくらいにしか考えていなかったが、今は風邪を引く前に体をコントロールするようにしていている。睡眠、運動、野菜、瞑想。瞑想はいらないか。

 あとはバッファをとる。ひたすらバッファをとる。予想してた時間の1.5倍をとるといい、と本に書いてあった。そういうわけで2,3日で終わりそうなことを1週間で行うような計画を立てた。やってみると、突発的な別のことがらや不具合がおこって、ほんとうに1.5倍の時間で収束することもあった。すごい。バッッファすごい。

 エッセンシャル思考は楽しい。楽しいことだけに集中して日々を過ごしていたい。

(Photo by Dan Meyers on Unsplash)

エッセンシャル思考 最少の時間で成果を最大にする