wassup?

新ブログ→memo.wass80.xyz

mRubyの動くLED時計をESP32で作る [後編]

f:id:wass80:20190502132250p:plain

wass80.hateblo.jp

の後編です。

mRubyで時計のプログラムを書けるようにする

といっても,もくもくとAPIを実装するだけです。

用意したAPIはこれだけあります。

github.com

こういうプログラムをHTTPで書き込んで時計で実行できるようになりました。

i = 0

# ラインアート
lines = []
aline = [20, 10, 3, 8, 2, 3, 2, -1]

# 次の時間の線を生成する
def succ_line l
    x0, y0, x1, y1, dx0, dy0, dx1, dy1 = l[0], l[1], l[2], l[3], l[4], l[5], l[6], l[7]
    x0 += dx0; y0 += dy0; x1 += dx1; y1 += dy1
    (dx0 *= -1; x0 = 0) if x0 < 0
    (dy0 *= -1; y0 = 0) if y0 < 0
    (dx1 *= -1; x1 = 0) if x1 < 0
    (dy1 *= -1; y1 = 0) if y1 < 0
    (dx0 *= -1; x0 = 31) if x0 > 31
    (dy0 *= -1; y0 = 31) if y0 > 31
    (dx1 *= -1; x1 = 31) if x1 > 31
    (dy1 *= -1; y1 = 31) if y1 > 31
    [x0, y0, x1, y1, dx0, dy0, dx1, dy1]
end
8.times {|t|
  lines << aline
  aline = succ_line(aline)
}

time_format = "%H:%M"
message = "Welcome to KMC! Please Enjoy Yourself!"
# Loopの開始
Task::loop do
  # 描画削除
  Led::clear 0
  # 色指定 R, G, B (0 ~ 7)
  Led::color 0, 1, 0 
  lines.each {|l|
    # 線描画 x1, y1, x2, y2
    # 座標は(0 ~ 31, 0 ~ 31)
    Led::line l[0], l[1], l[2], l[3]
  }
  lines.shift()
  lines << succ_line(lines[-1])

  # フォント指定(番号)
  Led::font 2
  Led::color 7, 3, 3
  
  # 時刻更新
  Time::update
  
  # 文字出力 x, y, 文字列
  # Time::str(strftime文字列)
  Led::text 1, 12, Time::str(time_format)

  Led::font 0
  Led::color 5, 0, 5
  # 流れる表示 時間, 遅さ, y, 文字列
  Led::show i.div(2), 23, message
  
  Led::font 5
  # cmdで入力された文字列
  w = Task::cmd()
  Led::color 0, 5, 5
  Led::show i.div(2), 1, w 

  # [注意] Led::flushを実行しないと画面が更新されません。
  Led::flush
 
  i += 1
end

これは,[前編]の動画のプログラムです。 ラインアートを背景で動かしています。

mRuby拡張により配列や文字列を使えるので,普通のrubyプログラムのように書くことができます。

APIの実装

例えば Led::line の場合,

Cで実装されている部分はこのように,ブレゼンハムのアルゴリズムを持ってきます。

void b_line(int x0, int y0, int x1, int y1, int r, int g, int b) {
  mrb_int dx = abs(x1-x0), dy = abs(y1-y0),
          sx = (x0 < x1) ? 1 : -1, sy = (y0 < y1) ? 1 : -1,
          err = dx-dy;
 
  while (true){
    b_set(x0, y0, r, g, b);
    if (x0 == x1 && y0 == y1) break;
    mrb_int e2 = 2 * err;
    if (e2 > -dy) {
      err = err - dy;
      x0 = x0 + sx;
    }
    if (e2 < dx) {
      err = err + dx;
      y0 = y0 + sy;
    }
  }
}

mRubyの言葉に持ち上げます。

static mrb_value ledline(mrb_state* mrb, mrb_value self) { 
  mrb_int x0, y0, x1, y1;
  mrb_get_args(mrb, "iiii", &x0, &y0, &x1, &y1);
  b_line(x0, y0, x1, y1, p_r, p_g, p_b);
  return self;
}

そして Led::lineで呼べるように,環境に登録します

  struct RClass *Led = mrb_define_module(mrb, "Led");
  mrb_define_class_method(mrb, Led, "line", ledline, MRB_ARGS_REQ(4));

簡単ですね。

辛い点

  • ESP32のメモリが足りないので,重いプログラムが動かない
    • slackから対局できるオセロ時計が作られたが,メモリ不足で最後まで対局できなかった。
  • 日本語のエンコードISO-2022-JPを選んでしまった。
    • 入れた日本語フォントがJISコードでの文字対応だったのでこのエンコードを選んだが,めんどくさいエンコードだった。
  • 最初 Led::flushLed::flash になっていた
  • なぜ整数の割り算 3/2が小数1.5に評価されてしまうんだろう…。ここでRubyとの非互換性ができてしまった歴史的経緯が知りたい。

部員が作ってくれたプログラムたち

この他にも様々プログラムを書いてもらえました。

現在のデフォルトの時計は,室内気温や天気の表示を行うものになっています。

室内気温の情報は昔に作ったこのシステムの情報を使っています。

wass80.hateblo.jp

感想

  • ESP32を扱うのはサンプルコードが豊富なので割と簡単。
  • はんだ付けとか実装のほうが難しい。
  • 実際に動くものができるのは楽しいので良いですね。
  • Exploitがめっちゃ簡単にできそうなコードをCだと書いてしまうので,安全なIoT開発手法はもっとほしい…
    • RustでESP32開発とかできたらいいんですが,まだLLVM backendがないんですよね。ほしい。

mRubyの動くLED時計をESP32で作る [前編]

マトリックスLEDでスマート時計を作る - Google スライド

作ったもの

  • LEDmatrixの時計
  • NTP時刻取得
  • HTTP GETで情報を受けられる
  • mRubyのプログラムをGETで入力できる

概要

LED matrix

f:id:wass80:20190430144912p:plain

  • KP-3232D
  • 32x32の3色LED
  • 合計3072個のLED
  • 4860円 つまり大体1LEDにつき1.5円

この16pinで入力する。

f:id:wass80:20190430145027p:plain

  • 横1列の点灯状態+点灯させる列を入力にとり光る。
  • 一度に1列しか光らないので,順次点灯させる。

これの制御にESP32をつないだ.

f:id:wass80:20190430145248p:plain

届いたその日に動いた。

f:id:wass80:20190430145310p:plain

木枠を作った。

f:id:wass80:20190430145540p:plain

きれい。

f:id:wass80:20190430145554p:plain

カラフルに光らせるために,高速で点滅するラインの中で何回光らせるかで制御している。

現在は8階調。人間の目で見える実態は4階調ぐらい?

フルカラーで光らせるためにはFPGAでゴリゴリ実装する必要がありますね…。

時計実装

ESP32のプログラムはこれ:

github.com

C言語をLinterも入れずに書いてしまったので,おそらく脆弱性が多量に含まれている. HTTPサーバーの部分が特に脆弱である可能性が高い.

NTP時刻取得

時計なのでsntpで時刻を取ってくるようにした。 wifiのサンプルコードとsntpのサンプルコードを持ってこれば動く。

ただ時々時刻がずれるので自動修正のコードを入れている。 はずだがまだ時々突然1時間以上ずれる。

HTTP GET

外からメッセージやプログラムを書き込むために使用。

slack botから文字列を入れると時計に表示される。

f:id:wass80:20190430150222p:plain

「八木までの各駅と、田原本新祝園、新田辺、大久保、桃山御陵前丹波橋に止まります。」みたいな文字列も流せて楽しい。

mRuby編

→ 後編: 楽しい時計プログラム編。

wass80.hateblo.jp

京大から京都駅までの移動で地獄の市バス206系統を避ける方法

206系統が辛い

祇園ー京都駅を結ぶ京都市バス206系統は過剰な混雑を起こします.

H28_市バス_営業係数 | 京都市オープンデータポータルサイト によると1日あたり28,287人が206系統利用します. 206系統は平日,123本のバスが予定されています. 1台で229人もの乗客をさばけるわけもなく,臨時バスがほぼ同じ数走っています.

そんな臨時バスが多少走ったところで206は全く快適なバスではありません. なるべく206に乗りたくない場合,様々な回避方法があります.

まとめ

京大から乗る場合は17系統か4系統を使うことを考えると良いです. 偶然にも,京大快速やHoopが使えるなら乗りましょう.

京都駅前から乗る場合は

  • 4系統と17系統(と205系統)の乗り場(A2)から来たバスに乗り込む.→急ぎならこれが最速&健全
  • 206系統の乗り場(D2)から臨時バスに期待して1本見逃す.→座れるが混雑は避けられない
  • 京阪の七条駅まで歩く.→確実だが疲れる.

のどれかの戦略を取るのがおすすめです.

以下はおすすめ順に紹介していきます.

17系統 (百万遍ー京都駅) 230円 25分

錦林車庫前ー…ー京大農学部前ー百万遍出町柳駅前ー…ー京都駅前

6,513人/日でそれなりの快適さがあります.

4系統 (出町柳駅前ー京都駅) 230円 25分

上賀茂神社前ー…ー出町柳駅前ー…ー京都駅前

こちらも7,297人/日でそれなりの快適さがあります

京大快速(百万遍ー京都駅) 230円 25分 (2020年3月19日廃止)

f:id:wass80:20190402182432p:plain

追記: 廃止されます. 京都市交通局:【令和2年3月スタート!】市バス新ダイヤ

出町柳駅前ー百万遍ー京大正門前ー京大病院前ー京都市役所前駅烏丸御池四条烏丸ー京都駅前

平日しか走っておらず,また意外と混み合っている路線です.

Hoop 25分 (京都大学前ー京都駅八条口)230円

f:id:wass80:20190402182920p:plain

京大病院前ー京都大学前ー河原町御池ー四条烏丸ー京都駅八条口 (帰りは四条河原町経由)

休日も午後から走っています. 東大路通を北へ走るため,停留所の場所が難しいです.

f:id:wass80:20190402183543p:plain

また,京都駅も八条口側につくので注意が必要です.

1日乗車券が使えません.

京阪 (出町柳ー七条 & 徒歩1km) 270円 7分+1km

1km歩くことが苦でないならばおすすめです.

地下鉄 (徒歩2km & 今出川ー京都) 260円 9分+2km

意外にも京阪に比べてこちらのほうが10円安いです.

今出川通バス & 地下鉄 (百万遍今出川乗り換えー京都)490円(370円) 20分

今出川通の徒歩2kmをバスに乗る戦略です. おそらく最速。ただし、コストが高い. 乗継割引の働くトラフィカやICの場合は370円になります.

京阪&奈良線 (出町柳東福寺乗り換えー京都駅) 270円+α

京都市内のJR切符を持っている場合は有効な手段です. ただし,奈良線が10分から12分間隔のため,意外と乗り換えに時間がかかることが多いです.

205系統 (河原町今出川ー京都駅) 230円 30分

これは市バスで最も乗客の多いバス.34,888人/日. 206と同様におすすめできないです.

ちなみに市バスは昼間割引共通回数券をバラ売りしている自販機の存在を使えうことで、ちょっと安くなります。 トラフィカも10%還元なのでお得です。

タクシー 2000円 20分

4人で乗ると1人500円なので, 悪い選択肢ではないですね。

短時間、シンプルなルールで遊べるボドゲ5選

ボドゲに触れたことない人向けに、いくつかおすすめします。

マジックメイズ

  • 2-8人 15分 リアルタイム協力ゲーム

f:id:wass80:20190318210547p:plain

仲間と協力して制限時間内に装備品を手に入れて脱出しろ!

  • 協力ゲーム: 全員勝利を目指すゲーム
  • リアルタイム: 手番の概念がない

協力する楽しさがすごい。1プレイごとに貯まる経験値を感じやすく良いバランス。 チームビルディングのネタにおすすめ。

(関連) エスケープ: サイコロをいっぱい振って脱出

(関連)パンデミック: 手番がある協力リソース管理ゲーム

ぶくぶく

  • 3-5人 30分 同時 バッティング

f:id:wass80:20190318210558p:plain

この島は天候によって浮かんだり沈んだり

  • 同時: じゃんけん
  • バッティング: 人と同じ行動をすると悪いことが起こる

1戦目は運が強いかもしれない。 しかし、2戦目は1戦目の隣のプレーヤーの手札で戦う。

(関連)トリックテイク全般: 手番がある

それは俺の魚だ

f:id:wass80:20190318210704p:plain

ライバルを狭い氷上に孤立させ、自分だけしか得られない氷上を作り魚を大量に獲得しよう!

運要素が一切ないので賢い人におすすめ

藪の中

  • 3-4人 20分 推理 ブラフ

f:id:wass80:20190318210715p:plain

殺人事件、三人の容疑者、真相は藪の中、にはならないアブストラクトな推理ゲーム

  • 推理: 人の振る舞いなどから真相を推理しよう
  • ブラフ: 嘘をつく

騙し騙されがわかりやすいゲーム。 取れる行動が2択なのが良い。

(関連)ファブフィブ: ブラフゲーム

ツインイット

f:id:wass80:20190318210727p:plain

同じ絵柄のカードを見つけて誰よりも先に指させ!

同じ絵柄を素早くとるだけという単純なルールだけで人を困惑させる訳のわからない絵柄が魅力的。

(関連)おばけキャッチ: 指定されたものをすばやく掴む

マウンテン遭難記

これは部内のKibelaに公開していた記事の移植です。名前は適当に置き換えました

23:55に起きた。08:50に名古屋に行くことを決めた。

f:id:wass80:20190318210126p:plain

喫茶マウンテンに無事9人が集合した。 人々が思い思いに注文する。 メロンスパ、バナナスパ、バナナスパもう一つ、メロンスパ、きのこパスタ、メロンスパ、厚化粧の大。

厚化粧の大はなかったので中になった。

自分は、抹茶小倉スパを注文した。あれだけ有名なんだから味に僅かな期待はあった。 ついでにミニサボテンスパ(お試し)が500円だったので頼んだ。朝から大したものを食べていなかったので正しい選択だと思った。

注文が来始めた。はじめはメロンスパ。 Aさんが食べ始める。苦難の表情を浮かべる。 湯気の上がる真緑のパスタからは異常なほど強いメロンの香料の匂いがする。

そのメロンスパが後2つやってきた。 Bくんも苦労していた。 Cさんは余裕そうだった。

バナナスパもやってきた。生クリームとさくらんぼでトッピングされたバナナとスパゲッティ。 スパゲッティが必要なのか?

キノコパスタがやってきた。 思慮深いDの注文だ。 太麺のパスタは焼きそばのようだった。

自分のミニサボテンパスタが届いた。 Dのきのこパスタと同じ量あった。 味は普通のケチャップ味のナポリタン。 ピーマンの代わりにサボテン。 ウチワサボテンは酸味が少しあること以外は癖の少ない食材なので、あまり違和感はなかった。 f:id:wass80:20190318210102p:plain

まだこの時は余裕があったので、サボテンスパの半分を苦しむAさんのメロンスパと交換した。

初めて食べるメロンスパは最悪だった。 決してすすってはいけない。 端で嗅いでいた匂いが甘さをまとって現実になる。 正直おいしくなかった。

更に抹茶小倉スパが机に押しこまれてきた。つらい。

f:id:wass80:20190318210039p:plain

メロンスパの衝撃の後だと麻痺するのか、 食べられると一瞬思った。 続く箸はなかった。食べ続けるには甘すぎる。 かき氷にかかるはずだった抹茶シロップがあまりにも過剰。

この後の記憶はあまりない。最後まで食べきれなかったのでDに2,3口食べてもらった。

京都観光 (鉄道博物館,京都水族館)

春休み,ふらっと出かけたい気分だったので, 梅小路にある施設に出かけた.

入館料は2施設セットになったものが学生2300円.

鉄道博物館

梅小路公園の西側にある.もともと梅小路蒸気機関車館があり,リニューアルされた. f:id:wass80:20190315190003p:plain

鉄道博物館は必ず開店凸をしたほうが良いと言われている. なぜならば,目玉の1つである鉄道シミュレータの体験は抽選であるからである.

1時間毎に抽選が行われ,抽選参加権利は入場につき1回しか存在しない. 多くの子供が来る時間だとかなり確率が下がってしまう

現に自分とついてきた友達は共に落ちた.

それはそうと,展示は楽しんだ.

古そうなマルスf:id:wass80:20190315190614p:plain

実際に押せるSOSボタン f:id:wass80:20190315190651p:plain

ボタンで動かせる転換器 f:id:wass80:20190315190714p:plain

など,割と見どころが多くて楽しかった.

これも後で気づいたのですが, SLに乗りたいのならば,入場してすぐ展示の方に行かずSLのほうに行って時刻表を確認しましょう. 我々は諦めました.

寄り道,市電カフェ

鉄道博物館京都水族館の中間地点にある,実際の市電を改造したカフェ. 雰囲気がよかった.

f:id:wass80:20190315190841p:plain

名物のカタカタつりわぱん(250円)とソフトクリーム(300円)を食べた

f:id:wass80:20190315190935p:plain

市電カフェとは別に,休憩所として車両が置かれていた.

f:id:wass80:20190315191142p:plain

この日はなんと運が良く,運転台を触らせてもらうことができた. 貴重な体験ができて楽しかった. f:id:wass80:20190315191152p:plain

京都水族館

海のない京都市にできた水族館 施設も小さいが,それぞれのコーナーがそれなりに凝って展示してあり,楽しめた. f:id:wass80:20190315191300p:plain

オオサンショウウオは群れます. f:id:wass80:20190315191408p:plain

ペンギンは可愛いです. f:id:wass80:20190315191421p:plain

ペンギンのサービス精神が非常に旺盛.f:id:wass80:20190315191510p:plain

タツノオトシゴ f:id:wass80:20190315191534p:plain

伊勢海老.これは完全に食材.というかほかもどれも美味しそうに見える. そう言うとドン引きされた. f:id:wass80:20190315191833p:plain

クラゲ f:id:wass80:20190315191551p:plain

また群れているオオサンショウウオ f:id:wass80:20190315191608p:plain

一番大きいオオサンショウウオで25,720円らしいですね.ほんのちょっとだけほしい.

楽しかったので出た直後に再入館した.

これはおそらく百合. f:id:wass80:20190315191703p:plain

いっぱいペンギンのぬいぐるみがあったのでペンギンタワーを作った. f:id:wass80:20190315191804p:plain

どちらの施設も結構楽しんだ. 梅小路京都西駅が間もなく開業するのでアクセスも良くなる. これからの京都駅周辺の開発に期待.

東京見物 (明治大学博物館,近代科学資料館,アビス謎解き)

東京見物の2日目のログ.

1日目はこちら.

wass80.hateblo.jp

明治大学博物館

いくつか展示があるが,その中でも有名なのが拷問器具の展示.

ギロチンや, f:id:wass80:20190315182000p:plain

アイアンメイデンがあった. f:id:wass80:20190315182036p:plain

下のほうの針はガバガバなので,人を中に縛って使うのか,それともそもそも実用に供されず,脅しのためにあるのか. f:id:wass80:20190315182211p:plain

別の展示ゾーンには自動織物のためのジャカード織り機のパンチカードがあった. この機械,本当によくできている. f:id:wass80:20190315182356p:plain

寄り道: 500円記念硬貨交換

銀行にいって手持ちの500円玉を記念硬貨に換えてもらった. バイメタルの硬貨かっこいい f:id:wass80:20190315182534p:plain

近代科学資料館

東京理科大学にある博物館.

計算尺が用途ごとに大量にあってよかった. f:id:wass80:20190315183004p:plain

ここの展示の見どころの1つは,タイガー計算機に触れる展示. f:id:wass80:20190315183041p:plain

タイガー計算機はこのように中身が歯車でできている. f:id:wass80:20190315183131p:plain

上の表示窓に足したい数値を入力し, 計算機右側の大きいレバーを1回転させると下の結果窓にその数値が足される仕組みである.

レバーを逆回転させると逆に数値が引かれる. よくできた仕組みである.

さらに,出力窓を左右にシフトする機構や,出力窓の数値を入力窓に戻す機構がすべて歯車でできており,非常に面白い.

一通りマスターして,複雑な割り算もできたところで満足した.

他にもタイプライターをジャムらせたり, f:id:wass80:20190315183606p:plain

大量の真空管を眺めることができた. f:id:wass80:20190315183643p:plain

ある日は,微分解析機の実演をやっているらしく,是非見たかった. f:id:wass80:20190315183655p:plain

3月末でリニューアルのため休館するらしい.

www.tus.ac.jp

下には秋山仁の数学体験館があった. こちらもしっかり遊び倒したが,写真撮影不可だったため,省略する.

アビス謎解き

すでに結構歩いたあとだったが,必ずやりたいことがまだだった.

メイドインアビスの新宿街歩き謎解きである.f:id:wass80:20190315183955p:plain

新宿のまちなかを歩いて謎解きをするものである.(1000円)

すでにこの時疲れ切っていたが,ナナチがlineで指示してくれるだけで異常なほどのやる気が湧いてきたので良かった.

流石に謎解きの様子の画像はだせないので, 点字タイルを張っている様子です.

f:id:wass80:20190315184611p:plain

楽しかった.

岡むら屋

前から気になっていた岡むら屋の牛めしをかっこんだ

これはスゴ盛り肉めしなので790円.美味しかった.ただ,ご飯大盛りにしないとバランスがちょっと悪い. f:id:wass80:20190315184642p:plain