2017年12月4日月曜日

microbit で温度計(音とアニメーション付き)

micro:bit(マイクロビット) のJavaScript ブロックエティターで、音とアニメーション付き温度計を作ってみました。
簡単なスクリプトなのに、意外と覚えることが多かったので解説します。

ソースはこちら


まず、「ずっと」ブロック内で「LEDに表示」を使いアニメーションをさせています。
コードエディターであれば「basic.showAnimation()」を利用することができますが、ブロックは用意されていないので、このような方法を用いました。
なお、「LEDに表示」のインターバルは 400ms です。(400ミリ秒後に次のブロックへ処理が進みます)

そしてアニメーション後に「表示を消す」をおこなっています。
これをしないと、アニメーション最後の表示が、その後に実行される「文字列を表示」のスクロールに巻き込まれてしまいます。

「音を鳴らす」で音も出るようにしてみました。
これによりずっとビッビッ言うウザい温度計になりますw
なお、この音を聞くにはイヤホンなどを、端子0番と GND 端子に接続する必要があります。
私はワニクリップで本体が傷つかないようにネジを通して繋いでいます。
つなぎ方はシミュレーションを参考にしてください。
ただし結構大きな音なので、耳には付けないほうが良いです。

最後に温度を表示するように記述していますが、ポイントは「数を表示」ではなく「文字列を表示」を使っていることです。
温度の数字だけであれば「数を表示」で良いのですが、温度に単位(℃)として "C" を付けたかったので、数字 + "C" をして文字列化しているためです。

また、こっそり温度を -3 していますが、これはそもそも micro:bit が返す温度は micro:bit の CPU の温度なため、周辺の温度より少し高い数値が返されるからです。
そのため少し減らして、つじつまを合わせているのです;
必ずしも -3℃ することで正しい温度が取得できるわけではありませんが、私の生活環境下では概ね許容できる誤差で温度を表示してくれました。(^_^;)

おしまい

2017年11月26日日曜日

microbit の使い方などのまとめ

micro:bit(マイクロビット)を実際に使ってみて書いている備忘録です。
随時更新中です。

WEBサイト

電源の入れ方・電力供給方法

以下のいずれかで電源が入ります。
  • PC と USB(マイクロB)ケーブルで繋ぐ
  • 電源用コネクタと単4電池2本(1.5v × 2 = 3v)を繋ぐ
  • 3V 端子と GND 端子を利用して 3V の電源を供給する
  • 裏面の給電パッドへ直接つなぐ
https://www.kitronik.co.uk/blog/powering-your-bbc-microbit/

電源の切り方

文字通り電源を切るw(電池を抜くなど)
電源スイッチなどというものは存在しない!
PC じゃないから電ブチしていいみたい。

初めて電源を入れた時

予めちょっとしたプログラムが入っていて、それが実行されます。
  1. ハロー!
  2. Aボタンを押せ
  3. Bボタンを押せ
  4. シェイクしろ
  5. 傾けてドットを合わせろ
  6. グレイト!
  7. さぁコーディングしようぜ!
という流れのプログラムです。

リセット方法

裏側のボタンをぽちぃー
するとプログラムが最初から実行されます。

MICROBIT ドライブとして認識されない!

百均などの充電専用USBケーブルでは、電力供給はできるけど、ドライブとしては認識されないので注意。
ちゃんとデータ送受信が可能なケーブルを使いましょう。

Javascript と Python の違い

機能的な話ね。
Javascript でしかできないこと
  • LED に当たる光の明るさを取得
  • Bluetooth の利用
Python でしかできないこと
  • Speech モジュールの利用
  • 浮動小数点値の利用

Javascript エディターで気をつけること

どうやら正確には TypeScript らしい。
  • 1/5 も 4/5 も 0 が返される。(切り捨て)
  • 色々と使えないメソッドがある。(Math.ceil とか Array.slice() などなど)
    基本的にブロックが用意されていないものは使えない。
    コードエディタであれば複合代入演算子(+=とか)は使えるけど、ブロックエディタには戻れなくなる。
  • 配列のすべての要素は同じ型じゃないとダメ。
  • シミュレーターは必ずしも正確ではない。
    例えば「数を表示」ブロックを繰り返すと、数字が連続して表示されるが、実機では1画面分区切られて表示される。

PCとシリアル通信

USB ケーブルでシリアル通信ができます。

Windows ではドライバをインストールする必要があるみたい。
micro:bit 挿しても未インストール時はこうでした。
インストールしたらこうなって COM3 として使えるようになりました。
なお、ドライバーをインストールする時に micro:bit が挿さってると怒られるので抜いとくこと。
古いドキュメントへ飛ばされたり 404 へ飛ばされたりするかもしれないけど、最終的に arm MBED のサイトから「mbedWinSerial_16466.exe」をダウンロードできれば正解と思われ。(MBED ってのは micro:bit の兄貴分みたいなやつらしい)
投稿時点ではこれが最新のページかな?

ボーレートは115200。
デバッグの為であればシリアル通信ができるフリーソフトなどを利用しましょう。
プログラムから利用したい場合は、
  • Python なら pyserial
  • Node.js なら Node-Serialport
  • Node-RED なら serial ノード
あたりを利用すると良いのではないでしょうか。しらんけど。

3V 端子から供給できる最大電流

公式サイトの安全のアドバイスからリンクされている虎の巻(PDF)では 100mA までと書かれている。

micro:bitの電源供給について
上記サイトでは 90mA まで、とのこと。

端子に使えるネジ(ボルト)やナットの種類

ネジって素材とかメッキとかアホみたいに種類があるので間違えて絶縁ネジとか買ってしまわないように注意。
  • 形:皿ネジ
  • サイズ:M3(長さはご自由に)
  • メッキ:ニッケル、クロメート(ユニクロ)
  • 素材:銅(黄銅、真鍮)、アルミ

Bluetooth で接続

AとBボタンを押しながら、リセットボタンを押すとペアリングモードになる。

micro:bitモバイルアプリの使い方

iPhone のブラウザでコーディングして、micro:bit のアプリで micro:bit へ送信できました。
Bluetooth を利用して micro:bit と通信する方法は勉強中(むずい)

2017年11月4日土曜日

音声認識 Speech to Text サービスの無料枠を比較

音声をテキスト化してくれるサービスの無料枠はどんなもんかまとめ。
2017年11月現在の情報です。

Google Cloud Speech API

60分まで無料(たぶん毎月)

Bing Speech API

毎月5000回無料(まじで?)
送れる音声データは15秒まで。

BlueMix Watson Speech To Text

毎月100分無料・30日使ってないと消される。
一度に送れる音声はストリーミングも一括送信も 100M まで。

docomo 音声認識API【Powered by NTTテクノクロス】

個人利用限定・AndroidとiOS用SDKのみなので試してない。

docomo 音声認識API【Powered by アドバンスト・メディア】

基本法人向けで開発キーの利用期間は90日間、とのことなので試してない。

2017年11月3日金曜日

at コマンドで秒を指定する方法

最近は cron がブイブイ言わせているようですが、1回きりの処理では at コマンドのほうがラクチンです。私は。

まぁ、そんなことはどうでもよくて、秒まできっちり指定したい場合には以下の方法が(環境によっては)使えるらしいです。

2017年12月01日15時00分30秒を指定したい場合。
$ at -t 201712011500.30
というように、「.」に続けて秒を指定すればOKらしいです。
-t オプションについてはググってください。

ただ、残念ながら Raspberry Pi の Raspbian では無視されてしまうようです。
(.30とか追加してもエラーにはならないが00秒で実行される)
なので実際に機能しているところは見たことありませんw

そもそも Raspberry Pi の Raspbian にはデフォで at コマンド入ってないので
$ sudo apt-get install at
する必要があります。

私は音声認識でタイマーをセットさせたかったので、0秒から59秒の sleep を含んだシェルを用意するという力技で解決しました。

2017年12月01日15時00分30秒を指定したい場合。
$ at -t 201712011500 -f ./timer30.sh
timer00.sh のなかには sleep と実行したいコマンドが記述されています。
かなり頭の悪い方法ですが cron でも使えるかもしれないです。(試してない)

つーか
$ at -t 201712011500 -f ./timer.sh 30
とかいう感じに引数指定できないんですか?
なんかいい方法あったら教えてください。

2017年10月30日月曜日

ChatBot を無料で作れるツール・サービスまとめ

【この記事は書き途中だよ】
個人で利用できて無料プランがあるチャットボット作成サービスのまとめ。
2017年11月時点での無料プランの場合の情報です。
サービス名ボット数APIコール数インテント数
シナリオ数
エンティティー数
クエリー数
連携
Repl-AI11,000 コール/月制限なし制限なしLINE
Facebook
API
Watson Conversation510,000 コール/月2525API
hachidori210,000 コール/月20--LINE
Facebook
Dialogflow集中しなきゃOK無いっぽい無いっぽいGoogle Assistant
LINE
Facebook
Twitter
Slack
Dialogflow Web Demo
Kik
Skype
Spark
Telegram
Tropo
Twilio
Twilio Programmable Chat
Viber
Amazon Alexa(?)
Microsoft Cortana
API
一見すると Dialogflow 一択のようにも思えるが、実際使ってみると会話フロー構築で弱い面がある。
それぞれを使ってみたレビューは以下の通り。

Repl-AI

Watson Conversation

Conversation とプラットフォームを繋げるために別途アプリケーション・サーバーが必要。
LINE や Facebook などに簡単につなげる機能などは一切ないので、API を利用してなんやかんやできる知識が必要。
ただしその分、汎用性は高く、Conversation 開発ツールは非常に洗練されているため、複雑な会話フローにも柔軟に対応できる。
この開発ツールへは、WEBブラウザからアクセスでき、プログラミング知識がなくても扱えるようにできている。
プロフェッショナルな要求にも対応できる非常に高度なサービスを利用できるという点で、他のサービスとは一線を画する。

hachidori

Dialogflow

旧 Api.ai 。
そもそも無料しかない。
Dialogflow のボット(エージェント)数は GOOGLE PROJECT 依存なんだと思う。
その他、数に制限があるのかわからない。(無いっぽい)
インターフェイスは英語だが、日本語の処理には対応済み。
System Entities の豊富さが他の追随を許さない。
一問一答できれば良いチャットボットなら、これで充分。

2017年10月10日火曜日

Webデザイナー・クリエーター・プログラマーが Raspberry Pi を活用するために必要な知識

自分のための備忘録。
間違ってることも自信満々に書いてたりするぞ!
※このページは私が飽きるまで随時更新されます。

電圧と電流

よく水に例えられるが私は「電圧は水の高さ」という例えより(高さって位置エネルギーだよね……それが電圧?)下記サイトの水鉄砲の例えのほうが理解が早かった。
オームの法則 電気の資格とお勉強

電流は決まった量が流れるのではなく、回路に要求される分流れる、というイメージ。
電源側で制御するものではない。

直列と並列(分圧・分流)

電池を直列と並列にした場合や、抵抗を直列と並列にした場合などについて。

電池

  • 直列にすると電圧は足し算。
  • 並列にすると電圧は1個分で、容量が増える。

抵抗を直列

  • 抵抗値(合成抵抗)は単純に足し算
  • 電圧がそれぞれの抵抗値に合わせて割り振られる(入力より減る)
  • 電流は同一量

抵抗を並列

ラズパイの GPIO

扱える最大(?)電圧と電流

以下のサイトによると
第22回 Raspberry PiのGPIO概要 ツール・ラボ
電圧は

  • 読み取り(入力)時は0V~3.3V

電流は

  • GPIOピン1本あたりの最大電流は(入出力ともに)16mA
  • 複数本のGPIOピンを使用する場合、同時に流せる電流の合計は50mAまで
  • 目安としては、制限の半分、つまり8mA
という制限を厳守しないと壊れるらしいです。

プルアップ抵抗・プルダウン抵抗

Raspberry PiのGPIOは起動直後から内部プルダウンされている hnwの日記
GPIO 2 と GPIO 3 のみ 1.8KΩで他は 50KΩ らしい。
なんやかんやで GPIO 2 と 3 をプルダウンされた入力として使うことはできないらしい…らしい…らしい…

第22回 Raspberry PiのGPIO概要 ツール・ラボ

電子回路シミュレータ

Tinkercad の circuits
旧123D Electronics Lab。要無料ユーザー登録。
見た目がきれいなのは良いが、ショートさせたりしても特に警告がないのでコワイ。
あとキレイに配線しにくい。

最も手軽だが、まあまあバグる時がある。
個人的には視覚的に分かりやすくて助かる。

EasyEDA
設定で日本語化できる。要無料ユーザー登録。使い込むには要課金。

パーツについて

もし「電子回路をマスターしたい」のではなく「ラズパイへ入出力機器を付けたい」だけなのであれば、個々のパーツの役割を詳細に把握し、回路を自作するよりモジュールを買ったほうが早い。(電子回路マスターへの道が険しすぎる;)
目的とする処理を電子回路とソフトウェア、どちらで処理させるのが現実的かの見極めが大事。
でも基本的なことは知っておいたほうが良い。

抵抗

電圧とか電流とか下げるときに使う。
いざ購入しようとした時に種類の多さにビビる。
まずは1/4wカーボン抵抗で、100Ω~1000Ω(1KΩ)を適当な区切りで用意しておけばいいかと。
1種類につき10個くらいしか使わないけど、1袋100個入りだったりする。
今の技術なら直接数値を記載することもできるであろうが、頑なに謎の色線で抵抗値を表す初心者キラー。

LED

なぜか初心者は最初にこれをチカチカさせることを推奨される。
これまた、購入しようとすると種類の多さにビビる。
そもそもオマエの使っているその赤いLEDは一体どれだと言いたくなるが、大抵はそんなことまで記載されていない入門書が大半。
実際には足が2本のならば、ほぼなんでもいい。

トランジスタ

このパーツについては以下のページがわかりやすいと思った。
足の並びは ECB (えくぼ)と覚えるのが良いらしい。
これが使えるようになると、電圧や電流の制限が厳しい Raspberry Pi でも、乾電池を使って色々できるようになるので楽しい。

リレー

物理的に「カチッ」って音がするのでビビる。
コイルを使っているのでダイオードを逆並列に接続する必要がある。
(切った瞬間にすごい電圧が流れるのを逃がす)
動かすためには大きな電流が流れることになり、ラズパイではあまり使用されないかも。

ダイオード


コンデンサ

種類多すぎ意味不明(・口・)

電解コンデンサ

LED みたいに極性(+と-)があるので間違えたらイカン破裂する。

パスコン(バイパスコンデンサ)(デカップリングコンデンサ)という使い方

直流電圧を安定させるために配置するコンデンサのこと。
そういう種類のコンデンサがあるのではなく、コンデンサの役割名。
安定した電源を供給したいものの近くに置くほど効果的。←物理的に近く?回路的に近く?

三端子レギュレータ

らくらく必要な電圧に降圧してくれるパーツ。
3V 用とか 5V 用とか色々ある。

人感センサー・PIR(RIP?)・焦電型赤外線センサー

そもそも色々な呼び名があって混乱する。
初心者はセンサーそのものではなく、センサー付きモジュールを購入すべき。
私が秋月さんで購入した SB412A は配線などがラズパイに近いと、なんらかの影響を受けてしまうのか、1分間隔(または高負荷時)で反応してしまうという不具合が出る。(要調査)

昇圧・降圧について

5V を 3V に下げたいとか上げたいとかのこと。

昇圧


降圧

ラズパイだとこっちのほうがよく使うかも。
色々方法がある。

三端子レギュレータを使う

最も簡単で安定らしい。
必要な電圧を出力してくれる種類を選べばいいだけ。

ダイオードを使う

ダイオード1個で 0.6V とか 0.7V 下がるので、それをいくつか直列で繋げて理想の電圧へ下げる方法。

抵抗を使う

つまり分圧するということ。
この方法だと降圧した先に繋がるものの抵抗(負荷)も考慮して組む必要がある。
そのため汎用性はなく、電流が変化するような回路には使えない。

プログラミング

Python

ver2系と3系があるけど、3でいいと思うよ。
なんかみんなこれ使ってる。

Node-RED

私はこっち使ってます。
Raspbian に標準インストールされてるけど、肝心な node.js が古いため、ドキュメントの指示通りインストールし直したほうがフルに機能が使えるようになって捗る。
指示通りにターミナルにbashコマンドをコピペして実行すれば、後は勝手にやってくれます。
既存の設定やフローも維持してくれるので安心だぞ。

USB

電源として利用したい場合

そもそも USB からの電力供給は規格で 5V で 100mA~500mA と決まっている様子。(たぶん USB2.0までの話)
ただし、色々なページを見る限り USB ホストへ「これくらい電力使うよ」と申告したりする手続きをしないで、こそーり電源としてのみ拝借する場合は 100mA までに制限しておくのが無難な様子。

USB Raspberrypi.org
USBポートは電源ではありません Dai ISHIJIMA's Page
USB端子から5ボルトを取る方法 作る人(つくるんちゅ)日記

音楽・動画の再生

最初から入っている OmxPlayer を使えば GPU が利用できるのでスムーズな再生が期待できるらしいです。

PLAYING AUDIO ON THE RASPBERRY PI
PLAYING VIDEO ON THE RASPBERRY PI
OMXPLAYER: AN ACCELERATED COMMAND LINE MEDIA PLAYER

ただし、OpenGL を使用するため Linux 一般で使われている(当然ラズパイでも使われている)ALSA の設定は無視される。
たとえば GUI で音量を変えても OmxPlayer で再生しているメディアには影響がない。

ALSA

サウンド関係を一手に管理しているものらしい。
ALSA を使用して再生したり録音したり音量設定したりするには以下のようなコマンドを使う。
aplay
arecord
alsamixer
詳しくはググれ。

2017年9月20日水曜日

RPGツクールから自宅のWEBカメラを操作する

気は確かか?とか言われそうですが確かです。

昨今、あらゆる技術やサービスの敷居か下がってきていると感じたので、それらを組み合わせて何かできないかと考えた結果、このようなことになってしまいましたw

本件で使用した主なツールは以下のようなものです。
■ハードウェア
Raspberry Pi 3
■サーバーソフトウェア
Node-RED
■ゲーム作成ツール
RPGツクールMV

いずれも学習コストの低さが売りのツールなので、マニュアルとかを見ればすぐに扱えるようになると思います。
難易度的にも差はないと思うので、既にどれかひとつでも扱えるのなら、他のツールも余裕なはずです。
つまり、もしあなたがツクールでゲームを作れる根性があるのなら Raspberry Pi と Node-RED を駆使した IoT(モノのインターネット)くらい余裕な時代になったわけですよ!(暴論)

ラズパイとウェブカメラと百均のスピーカーとカービィとカービィ

出来上がったモノの紹介

ゲーム内で然るべき操作をすると、自宅のウェブカメラが撮影を行い、ゲーム上でその写真を確認することができます。


実動版を公開しても良かったのですが、Raspberry Pi で他のこともやりたいし、いつまで自宅で動かしてるかも分からないので、サーバー処理だけ除いたモノを公開しています。

とてもよくわかる構成と撮影の流れ

私が渾身の力を込めて描いた構成図をご覧ください。
わ け わ か ら ん w
一応説明いたしますと、インターネットより上が自宅です。
Raspberry Pi がサーバーで、その中で Node-RED が動いていて、ゲームやら画像やらをプレイヤーに配信する、という構成で、ゲームからは以下のような流れで撮影が行われます。
  1. プレイヤーがゲーム内で撮影ボタンを押す
  2. すると、ゲームから Node-RED に XMLHttpRequest で HTTPリクエストが発生
  3. リクエストを受け取った Node-RED が撮影と画像の更新の Linux コマンドを実行
  4. その後、プレイヤーが写真を見るイベントを実行したら、ゲームのエラー表示要素「ErrorPrinter」を利用して画像を表示する
あ、図中のRPGツクールMVとは、RPGツクールMVで作られたHTML5形式のゲームということですよ。念のため。

もうちょっと詳しく

ここからは「おいらもやってみたい!」とかいう奇特な方へ向けた情報をダラダラと提供します。

それぞれどうやって入手するの?

2017年9月現在の情報です。

Raspberry Pi

買いましょう。
ラズパイ正規総代理店のアールエスコンポーネンツと契約を結んだ個人向けの正規代理店の Raspberry Pi Shop by KSY(ややこしいw)での購入をおすすめします。(アフィとか無いから素直にクリックしとけ)
Amazon などと比較しても安いことが多いです。

私は Raspberry Pi 3(5,000円くらい)を使用しましたが、恐ろしく安い Raspberry Pi Zero(700円くらい)とかでも可能なはずです。
初心者はACアダプターなども含まれるセットを買うのが無難です。

流行っているのでネットや本で多くの情報を得ることができます。
でも古い情報には注意です。(OSガー、ニホンゴガー、とかいう問題はもはや過去のもの)
あと、やたらコマンドを打たせたがるページが多いですが、ほとんどの作業は GUI 上でも行なえるので、CLI 恐怖症の人も安心だぞ(ちょっとウソです)

ちなみに公式サイトはこちら(英語が読めない人は Chrome の翻訳機能で頑張れ)

Node-RED

ラズパイの標準 OS 「Raspbian」に、もとから含まれています。
詳しくはこちら→Node-RED日本ユーザ会 : ドキュメント
比較的情報が少ないのがネック。

RPGツクールMV

税別7,980円。買いましょう。
ただし、まれに Steam で 80%OFF とかしているため買い時が難しいですw
詳しくはこちら→RPGツクールMV

ゲーム(ツクール)からどうやって XMLHttpRequest を送っているの?

PNDK_HttpRequest プラグインを利用しています。
◆プラグインコマンド:PNDK_HR clear
◆プラグインコマンド:PNDK_HR send http://sample.com:1880/shoot/
という感じに、リクエストを投げっぱなしにしてるだけです。

どうやってゲーム内に画像を表示しているの?

ぶっちゃけゲーム内じゃないんですよね。
ツクールは元々、エラー表示のために「ErrorPrinter」という ID をもつ <p> 要素が HTML 内に用意されているので、そこに <img> 要素を突っ込んでるだけです。
イベントコマンドの「スクリプト」で直接以下のような javascript を書いています。
【注】このBlogの制約で<>は全角になっています!
var elem = document.getElementById("ErrorPrinter");
elem.innerHTML = "img src='http://sample.com:1880/rpg/www/photo.jpg'";
消すときは以下のようなスクリプトを実行させています。
var elem = document.getElementById("ErrorPrinter");
elem.innerHTML = "";

え?なんでツクール使ってんの?HTML と JS でいいじゃん。

使いたかったからDEATH!

どうやってラズパイからWebカメラに撮影させてるの?

ラズパイに fswebcam パッケージをインストールして Node-RED の exec ノードで fswebcam コマンドを利用して撮影と画像更新を行っています。
こんな感じ("写真を取って撮って保存"のところ)です↓
Node-RED で作ったフロー

ウェブサーバーは?

Node-RED の設定で httpStatic を指定しています。
指定したディレクトリに HTML とか JPEG とかを置いています。
詳しくこちら→ Node-RED日本ユーザ会 : 設定

ちなみに自鯖にはダイナミックDNSを利用

ダイナミックDNS(DDNS)のサービスは mydns.jp を利用しています。
先の Node-RED のフローの"1時間毎にDDNS更新"のところで IP を通知しています。

はんだ付けとかするの?

せーへんせーへん。
USB とか差し込むだけやで。

ポート開けるんだよね?

せやで。
Node-RED の初期設定での使用ポートは 1880 だに。
お使いのネットワーク機器の設定が必要たい。

最後に

べつに何千円もかけて部屋を覗かれるゲームを作りたかったわけではないですよ。ええ。

ラズパイに人感センサーとか赤外線リモコンモジュールとか追加してみたり、Node-RED で WebSocket サーバー動かしてツクールにオンライン要素追加してみたり色々やりたいことがあるので、またなんか作ったら公開したいと思います。