追記

一往確認日記


2019年05月14日 [長年日記]

_ 読書 : コンビニ人間

コンビニ人間 | 村田 沙耶香 |本 | 通販 | Amazon

冒頭はコンビニ店員の手際の良い思考が描かれていて、なるほどそういう風に考えながら仕事してるんだと思っていたら、急に展開が変わってどうなるんだというのがずっと続いて、どんどん先が読みたくなり一気に読めてしまいました。


2019年05月08日 [長年日記]

_ シリンダーの例。 - PLCのRuby言語コントロールユニット(6)

PLCのソフトをラダーの代わりにRubyで書けたらという企画です。
今までの内容はこちらでご覧いただけます。

前回は簡単な入力がそのまま出力になったり、自己保持回路で試しました。

実際に試してみる。 - PLCのRuby言語コントロールユニット(5) - 一往確認日記(2019-04-29)

今回はシリンダー動作に関する回路で考えてみます。

前回同様に結果から

Rubyでも意図した様に動作させる事ができています。
後半に実際のタッチパネルでの使用を意識した配置で試しています。

Timerの置き換えからRubyらしい考え方 - PLCのRuby言語コントロールユニット(4) - 一往確認日記(2019-04-27)

でRubyで表現する場合に、シリンダーオブジェクトとして次の様に表現したらということを書いていました。

cs = CylinderSensor.new(x4, x5, 5)
m4 = cs.moved?
m5 = cs.returned?
m6 = cs.error?

今回はそれを実践したことになります。

最初にsetupでシリンダーを動作させるソレノイドとシリンダーセンサーのオブジェクトを生成しています。
SingleSolenoidとCylinderSensorクラスが肝となっています。
この中身については全く知る必要がなく使い方が分かっていれば良いです。

setup do |plc|
  sol = SingleSolenoid.new out:plc.dev.y0
  plc.add_device sol:sol
  cyl_sen = CylinderSensor.new solenoid:sol, moved_sensor:plc.dev.x2, org_sensor:plc.dev.x3, timeout:3.0
  plc.add_device cyl_sen:cyl_sen
end

plc.add_device sol:solで登録しているため以降はplc.solでソレノイドを扱う事ができる様になっています。

実際に制御する方ですが、plc.solの自己保持回路でx0でONさせてx1でOFFさせる様にしています。
センサーの状態を(4)で提案した様にメソッドで得られる様になっていて、m0〜m2に取り込んでいます。

sequence do |plc|
  plc.sol = (plc.x0 || plc.sol) && !plc.x1
  plc.m0 = plc.dev.cyl_sen.moved?
  plc.m1 = plc.dev.cyl_sen.returned?
  plc.m2 = plc.dev.cyl_sen.error?
end

こちらにもう少し詳しく説明しています。

thought_of_ladder_to_ruby/README_JA.md at master · ito-soft-design/thought_of_ladder_to_ruby · GitHub

今後は…

シリンダーが増えても下の様にどんどん登録していけるはずですし、

  plc.add_device sol0:SingleSolenoid.new(out:plc.dev.y0)
  plc.add_device sol1:SingleSolenoid.new(out:plc.dev.y1)
  plc.add_device sol2:SingleSolenoid.new(out:plc.dev.y2)
  plc.add_device sol3:SingleSolenoid.new(out:plc.dev.y3)

色んな役割をするクラスを追加して行けば良いはずです。
後々もっと深く考えてみます。


2019年04月29日 [長年日記]

_ 実際に試してみる。 - PLCのRuby言語コントロールユニット(5)

実際にRubyで制御することを試してみます。

どの様にしようかな…と考えるまでもなく、LadderDriveがあるので(やっててよかった)それとirBoardを組み合わせて試してみます。
(ここでは安全と速度については無視して進めます)

まずは結果から。 こんな感じで制御できています。
X0を押すとY0がONになり、X1を押すとY1がONになりX2を押すとY1がOFFになります。
右側にある白い画面でRubyプログラムを走らせています。

構成図

構成図

Mac Book Proでsequene_1.rbというプログラムを実行してPLCを制御します。 中身は動画で確認した動きになる様にこうなってます。(今までなんども出てますね)

require './plc_base'

sequence do |plc|
  plc.y0 = plc.x0
  plc.y1 = (plc.x1 || plc.y1) && !plc.x2
end

y0 = x0と書かせたかったのですが、plc.y0 = plc.x0で妥協しています。 この様に書けるのはplc_base.rbで頑張ってるからです。
それ以上にRubyが柔軟に書ける様な仕組みを持っているためですね。

irBoardでスイッチとランプの代わりをさせています。
実際に配線したりするのは大変なので便利です。
無料のLite版で試せますので、試したい方は使ってみてください。  

手順はこちらに書いています。(不足があれば追記します)

https://github.com/ito-soft-design/thought_of_ladder_to_ruby/blob/master/README_JA.md

irBoard Lite


2019年04月27日 [長年日記]

_ Timerの置き換えからRubyらしい考え方 - PLCのRuby言語コントロールユニット(4)

PLCのソフトをラダーの代わりにRubyで書けたらという企画です。

Rubyらしい置き換え

それではどうだったら考えやすいかと切り替えて考えます。

Rubyはオブジェクト指向言語ですから、シリンダーセンサーというオブジェクトとしてとらえます。

cs = CylinderSensor.new(x4, x5, 5)
m4 = cs.moved?
m5 = cs.returned?
m6 = cs.error?

csというのがシリンダーセンサーオブジェクトです。 これはCylinderSensorというクラスから実態化したものです。 クラスとは何?ということになりますが、ここでは無視して進みます。 x4とx5のセンサー入力があって、5秒のタイムアウトが絡んでいる程度の認識でいいです。

m4はシリンダーが動作状態かどうかということですからcs.moved?で動作状態かどうか問い合わせて代入しているということになります。 m5、m4も同様です。

実際にmoved?やreturned?やerror?の中身はどうなっているか?ということは知る必要がなく、CylinderSensorクラスの中に隠蔽していて私がごりごり頑張ればいいだけの事です。(前回の例の様に分かりにくくにっているかもしれません)

ファンクションブロックの様なものと考えてもらえればなんとなくお分かりかと思います。


2019年04月26日 [長年日記]

_ Timerの置き換えからRubyらしい考え方 - PLCのRuby言語コントロールユニット(3)

前回はタイマーの置き換えで詰まってしまいました。

シリンダーセンサー

Image from Gyazo

Timerクラスを作ってブロックを使ってこんな感じでしようか? やっぱりラダーの方が簡単ですね。

t6 = Timer.new(5)

m4 = x4 && !x5
m5 = x5 && !x4
if (x4 && x5) || (!x4 && !x5)
  t6.start_if_not_started{|canceled|
    m6 = true unless canceled
  }
else
  t6.cancel
  m6 = false
end

タイマーの仕様を変えてちょっとスッキリした様なしない様な…

t6 = Timer.new(5)

m4 = x4 && !x5
m5 = x5 && !x4
t6 = (x4 && x5) || (!x4 && !x5)
m6 = t6.fired?

いきなり暗礁に乗り上げてしまいました。


2019年04月22日 [長年日記]

_ ラダーをRubyに置き換え - PLCのRuby言語コントロールユニット(2)

PLCのソフトをラダーの代わりにRubyで書けたらという企画です。

実際にRubyで置き換えた場合に、同時にいろんな事をさせようとすると排他処理を考える必要があります。
別々に動作している間でデータの塊をやり取りするときに、途中で値が変わってしまうと、予想もしていなかった動作になることがしばしばあります。
Rubyの場合はこの点が難しいところではないかと考えています。

ラダーの場合は順番に進んでいくのでスキャン単位で考えるとデータの塊が途中で変わってというのはあまり意識しなくてもいいところは利点です。

そういうのは後々考えるとしてRubyだとどんな感じになるかなというのを考えていきます。

単純にスイッチとランプを接続した回路

単純にスイッチを押している間ランプが点灯する回路で考えます。

Image from Gyazo

入出力デバイスX0, Y0は、Rubyでそのままx0, y0という変数としてアクセスできると仮定して、単純な代入になります。

y0 = x0

自己保持回路

ONスイッチでモーターが回転して、OFFスイッチで停止する回路で考えます。

Image from Gyazo

Rubyは論理演算ができるので、|| (or) と && (and) 演算子でそのまま表現できます。

y1 = (x1 || y1) && !x2

論理演算で置き換えればラダーそのままをRubyに置き換えられます。 ただ、デバイスが3つなのでまだ分かりますが、デバイスが増えてきたらラダーの方が断然分かりやすそうですね。

他の場合もこの置き換えで考えましょう。

シリンダーセンサー

Image from Gyazo

B接点は! (not)で表せますが、
はて、センサー異常はタイマーを使ってますが、Rubyではどうしましょうか…

次回への宿題とします。


2019年04月19日 [長年日記]

_ PLC向けRuby言語コントロールユニット(1)

以前はAmazonでPrime会員対象の書籍がKindleデバイスで月に1冊読めていたのですが、いつの間にかPrime Readingなるものがあって、結構な冊数の本が読めるようになっています。

それで目についた成功哲学を読んで

Amazon.co.jp: 成功哲学 eBook: ナポレオン・ヒル: Kindleストア

思考は現実化するを読んでいる最中です。

思考は現実化する_アクション・マニュアルつき | ナポレオン・ヒル | 個人の成功論 | Kindleストア | Amazon

さて、私が思考を現実化するかどうかは、後々結果が出ることでしょう。

本を読んで物事を進めるには熱意が力になるとあり、これは自分に欠けているところです。

この事で、Pokémon GOが出た時にすごい衝撃を受けたのを思い出しました。

当時スマホでGPSを多用するとバッテリーが持たないので、敬遠されるというような傾向がありました。
私が出しているアプリも100Kmマラソンを完走するためにバッテリーの消費を抑えるためにGPSを使わず、ゴールできるペースかどうか判断できるアプリを考えました。最低13時間は持たせないといけないので懸命な判断だったとは思います。

‎「ゴールイン!」をApp Storeで

今できる方法でなんとか実現しようとしたのです。

ところがPokémon GOはバッテリーのことはおかまいなしです。 iPhone本体だと2時間がせいぜいでしたが、足りないところは補えばいいとばかりにモバイルバッテリーを併用して(しかも数個)長時間プレーする人が続々と出てきました。

始めにこんな風になったらいいなという世界観があって、技術的に足りなくても補う方法はどうにでもなるという結果を目の当たりにしたのでした。

ここでescalatorから初めてladder_driveとやってきたことを振り返ると(中途半端で中断してますが)、今できる事から積み上げてきていて、最終的にしたいことからはるか遠回りしているのではないかと思ったわけです。

自分は何をしたかったのかというのを今一度考え直してみました。

元々はラダーでプログラミングするのは自分にとっては面白くないし、もっと分かりやすく効率よく出来ないものかなというのが出発点です。

例えばRubyのような言語でできたらもっと楽しく効率的にできるのではないかと考えたのです。 C言語コントロールユニットというC言語でプログラムできるユニットがありますが、仮にRuby言語コントロールユニットというものができれば実現するわけです。 しかし、今はこれを実現するすべはないわけでそこからスタートすることは考えなかったわけです。

Rubyで書ければいいのにということですから、最初からRubyで始めればよかったことでした。 ということで、本当にRubyでできればいいのか今後検証していきたいと思います。


2019年04月12日 [長年日記]

_ M5STACKでIoT水位計 (3)

M5STACKでプログラミングするための開発環境構築についてはGithubの方にありましたので、興味のある方はご覧ください。

M5Stack - A series of modular stackable development devices

水位計ということなんですが、単純に水位で検索したら下の水位センサーが見つかって、だいぶ前に買っていました。

WINGONEER 5PCS水位センサーArduino用液体水滴検出器

予定の水位になったら知らせる程度にしか考えてなかったので、これで良いかと思っていました。
予備実験では、水位を正確に図る感じではなく水に接しているかどうか程度の判断ができるくらいでした。
名称をよく見ると水滴検出とありますので、やはりという感じです。

電源のない田んぼの中で、更に通信手段を考えたら実現性が乏しいく、センサーについてもこの様にあまりよく考えていないこともあり棚上げにしていました。

しかし、いざやってみようとなってから改めて考えてみて、超音波センサーがいいんじゃないかと思いつきました。

超音波センサーはSEEEDのこちらを購入しました。

Grove-超音波距離測定センサー | SEEED

これより安いものもありますが、

超音波距離センサモジュール HC-SR04 - スイッチサイエンス

計測中に出力がロックして計測できなくなる症状が確認された

とありました、避けました。

つづく


2019年04月07日 [長年日記]

_ M5STACKでIoT水位計 (2)

M5STACKはCPUとしてESP32を使っていますがArduinoの開発環境が使えてArduinoとして扱えるのでライブラリーなどそのまま使えたりします。

液晶も付いていて、サンプルにテトリスやフラッピーバードがあって、さながらゲーム機の様です。

テトリス

フラッピーバード

そのテトリスのソースコードを見てあまりにも短いので驚いています。
マイコンに興味を持ったのはゲームですが、今ではゲームを作ったりということもないんですが、びっくりしたのでRubyとかiOSでテトリスを実装してみたいという気になっています。

Tetrisのソースコード

M5STACKはWiFiやBluetoothの機能も含まれていて、インターネットや周辺機器とも接続しやすい様になっている様です。

いろいろ漁って適当にプログラムしてましたが、githubにサンプルやピンアサインなどまとまった情報がありました。

M5Stack · GitHub


2019年03月23日 [長年日記]

_ M5STACKでIoT水位計 (1)

M5STACKというデバイスを昨年知って、Ambientのブログでもよく出てきているので、年末に入手していました。
(Ambientを運営しているアンビエントデーター株式会社の下島さんは月刊誌InterfaceでM5STACKの連載をしています。)

実は兼業農家でして、僅かばかりですが田んぼがあります。
水管理はほとんど親がしていましたが、年々関わる回数がが増えてきているので、IoTで水位など記録したりしたいと常々思っていました。

しかし、電源の確保とデータ通信の問題があり、棚上げしていました。
昨年のIoT公開セミナーに登壇した時に、さくらインターネットの法林さんがsakura.ioの通信モジュールを紹介していてひょっとするとこのモジールを使うとうまく行くのではないかという事で、まずは試してみようというところです。

使うマイコンは何がいいか思案するところですが、M5STACKがどうも使い勝手が良さそうです。

整理されていない田んぼなので、自動で入水、止水したりすることは考えておらず、水を止めるタイミングを知れればいいかなという程度です。
ゴミが詰まって全然水が入っていないということもあるので、アラートを出したりという事も考えています。

Amazon Echo と連動できたりしても面白いかと思います。

企画倒れになってしまうということもありますが、できるところまでやってみようと思います。