2015年12月28日月曜日

温湿度気圧センサBMP280 Breakout基板について

BoschのBMP280温湿度気圧センサを使う例がいくつか紹介されていますが,試してみていくつかはまったのでメモ。

使用したのは,スイッチサイエンスさんオリジナルの「BMP280搭載 温湿度・気圧センサモジュール」であります。基板が青いので一瞬Adafruitかな?と思ってしまったのですが,Adafruitのは3.3Vレギュレータがついていて,あとピン配置も異なります。

配線ですが,使わないピンがないことに注意することが大事です。7ピンすべて,どこかにつなぐこと。具体的には,I2Cの場合,ピンを手前にしたときの並びで「SDO」を解放のまま使われている例が見られますが,これは「I2Cアドレスの選択ビット」になるので,必ずプルアップもしくはプルダウンしないと,I2Cアドレスがふらふらと変化して,変な値をランダムに出すことになります。
  • I2Cの場合,SDOはプルダウンで0x76,プルアップで0x77です。開放のままにしていると,両方のアドレスをふらふらします。
  • 右端のVioとVcoreの両方を3.3Vに接続しましょう。スイッチサイエンスのページではジャンパでつながっていると書かれていますが,手元の基板はそうなっていなくて,チップが動作しませんでした。
  • プルアップ抵抗は入れましょう。Raspberry Pi内蔵プルアップ抵抗があるからいいやと思っても,測定値がちゃんと得られていないように見えます。
それで,Arduino IDEからAdafruitのBMP280対応コードを入れると思いますが,内部でAdafruit_Sensor.hを読んでいて,これはライブラリ管理には登録されていないので,GitHubからZIPをダウンロードして,ZIPファイルからインストールする必要があります。

Raspberry Piの場合はPythonで試すと思いますが,python-smbusをパッケージマネージャ等から入れてから,Adafruit_Python_BMP280を入れることになると思います。GitHubのREADME.mdの記述通りにいろいろ入れようとすると,Python2.6が入ったりします。たぶん記述が古いので,python-smbusだけでよいはず。

あと,Adafruit_BMP280_Example.pyのなかでは,I2Cアドレスとして0x77が書かれているので,SDOピンをプルアップに変更するか,コードを0x76に書き換えるなどして,合わせる必要があります。エラーがどっと出るときは,アドレスが合わずにデバイスが見つかっていないときです。

設定ビットでは,オーバーサンプリング数やIIRフィルタの設定などします。スイッチサイエンスさんの説明がわかりやすいです。ただ,キャリブレーションの値の読み出しと計算については特に書かれていませんが,Boschのデータシートを見ると,出荷前にチップ内部のNVRAMに値が記録されているそうです。えらく大層な計算をしますが,精度を得るには必要なので,書かれている通りに補正計算ルーチンを使いましょう(もしくは使う言語に応じて移植しましょう)。固定小数点で計算する場合と浮動小数点計算する場合がありますが,精度が高々0.2%,湿度はもっと悪いのでどちらを使っても実用上の違いはないと思います。

それと,データシートを読まないと気づかないですが,湿度を得るまでのレイテンシは1秒かかります。1秒間隔で値を読みだすのはちとつらいと思います。

取り急ぎ,ご報告まで。

2015年12月17日木曜日

ownCloud 8で外部HDDをマウントして見せる別の方法

Another Solution for the Last Entry: Using Official Setting

There is another solution for mounting any folders out of data directory of ownCloud 8.

Please read carefully the document: Configuring External Storage (doc.owncloud.org)

Disclaimer:  The developer insists this "external storage support" is only for "Enterprise Edition".  This is only a report of my trial on open source edition of ownCloud 8.2.1.  I don't assure any occasions on you by following this procedure.

I tried by starting from writing configuration file because screen shots on the document looks not only for "Enterprise Edition".  But another document regarding to the GUI settings includes a "Enterprise Edition" logo in a screenshot.

After several trials, I could operate GUI screen even on the open source edition, but I don't describe the way for it.  One reason is a due diligence, but anyway I could not have yet making it clear how I reached at that point. 

Procedure with writing configuration file is following.  This is only a shortcut of the original document.
  1. Enable "External storage support" app.  One way is using Web GUI, another way is using ${owncloud}/occ command as described in the document.  Both works fine.  But before doing it, you might be better checking if your system already have "smbclient" command (from Samba3 package, etc) and PHP-FTP extension.  Either of these are missing, ownCloud shows warning messages on the admin screen.
  2. Compose "data/mount.json" file with a text editor.  My setting was like following:
{
  "user": {
    "tkamada": {
      "\/$user\/files\/Musics": {
        "class": "\\OC\\Files\\Storage\\Local",
        "options":  { "datadir": "\/Volumes\/HDD\/Musics" },
        "priority": 150
      }
    }
  }
}
The property "\/$user\/files\/foo" is a mount point of user's (in this case, "tkamada") ownCloud data folder, and the value of the other property "datadir" in "options" property is a real local directory path that you want to show.  In this case, it is an external drive mounted on the Mac as "/Volumes/HDD", which have a subfolder "Musics".

After saving your configuration file,  Reload the screen of ownCloud's Web app (or mobile app), Then you will see the "Musics" folder aligned with original "Documents" and "Photos" folders.

The GUI might be available right after procedure 1: activating external storage app,  Go "admin" screen, and try put "/" letter at the setting placeholder of external storage.  If you are lucky, you could choose one of supported external storages with selection menu.


前のエントリで書いたシンボリックリンクの方法以外に、外部フォルダその他各種ファイル共有をマウントする方法について書かれたドキュメントを発見しました。

「外部ストレージ」サポートはエンタープライズ版のみ、という目次になっていますが、読んでみるとGUI設定に関する説明のみであって(画面がオープンソース版と異なる)、手で設定ファイルを書く場合の文書は別のところにありました。試してみると、オープンソース版でもこの機能は動くようです。

また、運が良ければGUIからの設定も可能なようですが、どちらの場合も、管理画面(個人設定画面ではない)で作業をした場合のようです。不用意に個人設定をいじると設定が消滅し、最初からやりなおしになることがあるようです。

先に、設定ファイルを手書きする場合を述べますが、「外部ストレージ」サポートで、依存するものが足りずに管理画面に警告が出る状態の場合は、のちの設定で、この機能が停止に陥る場合があるようなので、smbclientコマンド(Samba3パッケージなど)とPHPのFTP拡張が入っていることを確認しておいたほうが無難かと思います。

設定ファイルを書くまでの手順はドキュメント「Configuring external storage (Configuration File)」にありますが、今回はローカルにあるディレクトリをマウントする場合に限って書いておきます。SMBやGoogle Drive, Dropbox等の設定は、ドキュメントに沿ってください。

以下、やってみた手順です。
  1. Web画面左上のアプリ追加「+」ボタンから、「無効なアプリ」にある、「External storage support」を「有効にする」ボタンを押します。このあとWebのホーム画面に戻ると、「ファイル」画面の左下に「外部ストレージ」が追加されます。これをクリックすると、「個人設定で追加できます」と言われますが、画面右上の自分のユーザ名メニューから「個人」を選んでいき、設定画面に追加された「外部ストレージ」GUIは、どこをクリックしても何も操作できませんでした。何度か試してみて、個人設定にいきなり入るのは避けたほうがよいようなので、ひとまず「クリックしない」方向で作業を進めるのがよいと思います。
  2. 次に、データ置き場である「data」フォルダの直下に、「mount.json」設定ファイルを作ります。名前の通り、JSON形式で記述します。例えば、/Volumes/HDD/Musics という外部HDD以下の音楽ライブラリを、"Musics"という名前で並べたければ、data/mount.jsonファイルの内容として、以下のように書くことになります。
{
  "user": {
    "tkamada": {
      "\/$user\/files\/Musics": {
        "class": "\\OC\\Files\\Storage\\Local",
        "options":  { "datadir": "\/Volumes\/HDD\/Musics" },
        "priority": 150
      }
    }
  }
}
トップレベルには、「group」「user」「特定ユーザ名(登録した人)」を書くことができるようです。それぞれ、登録したグループ、ユーザ、個別ユーザ、という意味に対応します。

今回は、「user」の下に自分のユーザ名を置くことにしました。

「user」セカンドレベルには、「all」あるいは特定ユーザ名を置くことができるようです。そこで、自分のユーザ名である"tkamada"を置きました。

その下は、外部ストレージの種類によって書き方がそれぞれあるようです。ローカルの場合は、まず、ownCloud側で見せたい場所をプロパティにして、その値として、マウント元の設定を書いていくようです。

"\/$user\/files"は、ownCloudの自分のホームディレクトリです。よって、"\/$user\/files\/Musics"と書けば、ホームディレクトリ直下のMusicsフォルダとして見せる、ということになります。

以下、値として3つのプロパティを持つオブジェクトを書くことになります。

"class": "\\OC\\Files\\Storage\\Local",

は、ローカルの場合の決め打ちです。PHPのクラス階層に相当するようです。

"options": { "datadir": "マウント元のフルパス" },

ですが、ローカルの場合、オプションは"datadir"のみということです。ここに、PHPのフルパスでマウント元を書きます。Windowsの場合、ドライブ名がどうなるか知らないので、PHPの仕様にしたがって書いてみてください。

"priority": 150

は、マウントの優先度を決める値とのことで、デフォルトは100で、大きいほど優先度が高くなるそうです。今回はよくわからないので、ドキュメントのサンプル値のままにしておきました。

以上で、Web画面を再読み込みすれば、設定が反映されてホーム画面に外部ストレージがマウントされている様子がわかると思います。ただし、内容が反映されるのは、データベースにすべてのファイルが登録されてからになるので、マウント元のライブラリが大きい(ファイルがたくさんある)場合は、しばらくかかります。

この先については条件を追い込んでいないのですが、管理画面に入ると、「外部ストレージ」という項目が追加されていて、GUI操作ができるようです。ひとまず、そのすぐ下にある「ユーザの外部ストレージを有効にする」のチェックを入れておくとよさそうです。この状態でGUIに設定を入力すれば、「mount.json」にも新しい設定内容が反映されるようです。

ひとまず以上ですが、これはただ、「やってみたらできた」というだけでして、無保証です。開発側の主張は「外部ストレージサポートはエンタープライズ版のみ」ということなので、読まれて試されるとしても、営業妨害にならないよう穏便に進められるのがよいと思います。

2015年12月14日月曜日

OwnCloud 8でシンボリックリンクを有効にする方法

Simple Solution:

Comment out lines 343-345 in ${owncloud}/3rdparty/league/flysystem/src/Adapter/Local.php
that check if the file is link or not.  Please see following Japanese description part if you want to see what is the code regarding to.

Then, you will re-activate the function for following symbolic link within your local data folder in ownCloud 8.2.1.

Only those three lines are the part for blocking traversal of {sym,hard}links in current implementation.


やってみたらできたのでご報告。

OwnCloud 7までは、利用者の共有領域からシンボリックリンクで外部ディスクのフォルダやファイルを指してもデータベースに登録できたのですが、OwnCloudでは「禁止」となりました。

参照:ownCloud Does Not Follow Symlinks (ownCloud 8.0 Release Note)
ownCloud’s file scanner does not follow symlinks, which could lead to infinite loops. To avoid this do not use soft or hard links in your ownCloud data directory.
シンボリックリンクは適当に張っていくと無意識にループを作ってしまうことがあり、そんな状態のファイルシステムをたどってデータベースにファイル登録する作業をかけるとまずいという意図はよくわかります。でもそれはそれで使い勝手がよろしくない。

検索してみるといくつか質問があり、公式フォーラムでは、逆にライブラリ本体をownCloudの管理下に置いて、他のアプリ用に通常の場所からシンボリックリンク張って使ってますよという話が出ていたりするわけです。

しかし、外付けの大容量HDDに整理したライブラリがあるのに、そこにownCloud本体を置いて、data/${ユーザ名}/files以下に移動するというのもどうなのかと思って調べてみました。ちなみに、この場合はWebサーバ側の設定で外付けHDDに置いたownCloudをrootに設定するとか、Webサーバから見える適当な場所にシンボリックリンクを貼るとかすることになります。

それで、ownCloud 8では外部のクラウドと連携してownCloud側でまとめるようなアプリの実現に、PHPライブラリのLeague\Flysystemを最初から内蔵することで対応しておりました。Amazon S3, Dropbox, SFTP, WebDAV, Azureなど数多くの外部サービスをローカルファイルと同様のAPIでアクセスする設計であります。なんか、既存のDropBox, AWS, Google Drive, SMB対応とかぶってるような気がしないでもないですが、徐々に統合されていくのでしょうか。

FlysystemにおけるローカルファイルのモジュールはLOCALでありまして、ドキュメントに「ルートからのパスの一貫性を破壊するからリンクはサポートしない」ということが宣言されており、結局それをownCloud 8が引き継いでいるのが、シンボリックリンク非対応の真相でありました。逆に、ownCloud側の${owncloud}/lib/private/files/storage/local.phpではリンクの場合リンク先のパスを調べ直す処理が残っていて、ownCloudが積極的にリンクを排除することを現状ではやっていないようです。

ownCloud同梱のFlysystemでは、

${owncloud}/3rdparty/league/flysystem/src/Adapter/Local.php

がLOCALファイルシステムの実装でして、343〜345行目あたり、normalizeFileInfo(SplFileInfo $file)メソッドの先頭の、
if ($file->isLink()) {
    throw NotSupportedException::forLink($file);
}
の3行が該当部分という、わりとあっさりな結論。このforLink()メソッドはただエラーメッセージを含む例外オブジェクトを返すだけの簡単な処理であります。びっくり。

この状態でownCloud 8.2.1を初期設定からやり直すと、あらびっくり、シンボリックリンク追跡機能が復活です。しっかり、外付けHDDに構築したライブラリがモバイルアプリから参照でき、ダウンロードして再生することができました。

あんまりにもあんまりなので、遠からず、しっかりリンクを排除するよう改善されると思いますが、検索でいろいろ質問が出る割には簡単な話だったので、ご報告する次第です。

いや、これはあれですか、公然の秘密ってやつなんでしょうか。だとしたら野暮な話でありました。

2015年11月17日火曜日

SSL LabsでA+評価をもらえるWebのTLS設定

職場で公開している、とあるWebサーバのCA証明書をようやく入手できたので、TLS対応しました。

いまどきはどんな設定するんだろうと思い検索すると、「SSL Labsで検査する」というのがひとつの指標のようです。

よい検査結果を得るためには、というか、これだけサイバー攻撃が激しくなっているいまを生き抜くために、2015年秋現在では最低でも使えるプロトコルはTLSv1以上にするのはもちろんのこと、暗号の組も現時点で弱いことが確定したものは排除しなければならず、さらに最近見つかったDHのlogjam脆弱性にも対応しなければいけません。

まず暗号の組は

Guide to Deploying Deffie-Hellman for TLS

で。とても長くなってますが、そういう時代なんでしょう。

このなかで、dhparam.pemファイル作成については

logjam対策でやったことまとめ

が日本語なのでわかりやすいと思います(といっても、opensslで1行コマンドですが)。

ここまでやって「B評価」。レポートを読むと、セッション関係の設定を改めなければならないようです。Nginxの場合ですが、ssl_session_cacheをきちんと設定するのがよいようです。ここまででひとまず「A評価」。レポートを見ると、「HSTS Preload」という項目が無効らしいことが気になります。

つまり、80番につないできたら443に飛ばす設定をして、HSTS Preloadというらしいですが、httpスキームを入れてもブラウザが80番でなく、443番に勝手につなぎにいく相手を並べたJSONファイルがネット上にあって、それに関連する設定を加えるのと、ブラウザが随時読みに行くそのJSONファイルに登録してもらう作業が必要なようです。

もろもろありますが、「とりあえずNginxならこう書いておけ」という例が

Nginx Configuration for HSTS Preload

というページにありました。ただ、resolverに8.8.8.8と4.4.4.4を設定しているのはやめるべきだと思う。

ひとまずここまでやると、「A+評価」になりました。うれしいです。

SSL LabsさんでA+評価いただきました

とはいえ、ブラウザがHSTS Preloadしないよという行は残りますので、HSTS Preloadファイルへの追加登録依頼をしなければいけないわけですが、それは

HSTS Preloadを導入しよう

というブログエントリにしたがって、Webフォームから入力することになるようです。このとき、www.ではじまるサイトが必要なようですが、当方まだできていないので、これは後日対応しようと思います。

2015年11月15日日曜日

NTTフレッツ光のCTU設定変更(結局フレッツ光ネクストに契約切り替えたので意味なしエントリになりました:2015-12-15)

(追記:2015-12-15)フレッツ光プレミアムは新規契約打ち切り、フレッツ光ネクストというCTUいらない子な契約に切り替えていくようで、自宅もそうしたらとても快適になりました。

それから、以下の記述は10年ほど前に契約した当時の、住友電工のCTUにのみ該当するようで、クレーム後いったん予防交換といって工事屋さんが置いていった日立のCTUでは、デフォルトのパケットフィルタ設定は入っていないようでした。

CTUにつないでいたBuffaloのWi-Fiルータはフレッツ光のPPPoEリンク設定がデフォルトで入っていたようで、ほとんど何も考えずにISPのログイン設定するだけで終わったので、フレッツな人はみんなネクストに契約切り替えたほうがいいと思います。うちは集合住宅で光ケーブルが部屋まできていないので上限100Mbpsのままですけど、いままでがひどすぎたので劇的な改善であります。

工事料金無料、契約は「隼」(最大1Gbps)ではないので料金同じ、2年縛り割引もそのまま引き継ぐということで、特にこちらから申込書を書くこともなく、ただ契約変更通知が郵送されてきただけでした。工事屋さんは管理人室内の終端ボックスの配線付け替えとCTUの引取り、データリンクの確認と伝票の印刷だけしてお帰りになられました。簡単。

ひかり電話とかフレッツ・テレビ(スカパーHDとかがフレッツIPv6網で観られる)を契約するとそういう機能つきのNTTご提供ルータに交換するみたいですが、うちはシンプルにやっております。


自宅はNTT西のフレッツ光を使っていますが、どうも最近つながらない、よく切れるという症状で悩んでおりました。

困るのは、SSH接続がブツブツ切れることでして、これではサーバのメンテナンスもできません。コンパイル途中で切れるとか、インデックス作成中に切れるとかすると、shellが子プロセスもろとも落ちるので、ちっとも作業が進みません。

NTT西に電話して、機器や配線の電気的な点検を依頼するとか、週末なので問い合わせフォームしかなかったけれど某ISPのカスタマサポートに通信制限状況の問い合わせを投げてみるとかしてみましたが、そうしている間、瞬間的にIPアドレス重複のメッセージが現れたのをみつけて、どうもDHCPサーバになっているCTU(NTT用語で要するにPPPoEルータ)が怪しいと思い、設定を見なおしてみました。

まず、自分のMacのIPアドレスが使われるのはたまらないので、MACアドレス指定でスタティックなIPアドレス設定に変更。

そのあと、ログをみるわけですが、「不正アクセスログ」という画面ぐらいしかまともに時系列のログがないので開いてみたところ、「つながらない」と思っていた相手への接続をCTUが切断していました。現員は「SPIによる破棄」。へえ、そんな立派なものがと思いつつ、「なんで捨てるんだよ」という怒りにも似たやるせなさが。

検索すると、CTUのWAN側IPv4アドレスが「123から125の間で始まる場合」、つまり上から8bitが123-125のブロックの場合、一部のIPアドレスに対するパケット送信をSPIが破棄するという問題がある、という古い記事(しばらく前にファームウェアの更新があったけれど、それより古いという意味)がいくつか見つかり、「ファイアーウォールをオフにしてください」と書かれているサイトが複数ありました。

CTUの設定画面上、たしかにオフが誰でもわかる選択項目だけれど、それは乱暴ではないかと思いつつ。
CTUログイン直後の画面左にファイアウォール設定項目がある

とはいえ、「制限なし」は乱暴ではないかと思う。SPIは「詳細設定」のなか

ということで、SYN Flooding対策にはSPIほしい気もするけどどうなんだと思いながらも、現実にいまつながらない相手があり、家人のスマホらしきIPアドレスでも破棄されているので、これは手元のMacだけの問題ではないと思い、SPIを停止して様子をみることにしました。

ただ、SPIを止めるためには、「ファイアウォール詳細設定」という別立ての項目を設定して、とパケットフィルタリングのルールを自分で書く画面と同じところに入らなければならないわけです。
「詳細設定」画面の上にSPIの項目があるけれど、「編集」を押さなければならない仕様

ここでようやく選択できる。OKで前の画面に戻る
こうなると、普通のルータ同様に細かくルールを書かないとフィルタリングなしになるような気がするのですが、結論からいうとそうでもないようです。でも、ルールの書き方の規則がわかったので、以下続けます。

ルールは先頭(若い番号)から順に評価されます。なので、「全部閉じて開くものを指定する」か「全部開いておき、閉じるものを指定する」か、どちらかを最初に決めなければなりません。

それで、後者を選んだ場合、デフォルトは「全部閉じている」になります。よって、先頭に、全てを「許可」するルールを置かなければなりません。ルール番号は1がいいでしょうか。「IPバージョン」に「IPv4・IPv6」を選び、「プロトコル」を「すべてのプロトコル」に変更するのを忘れないでください。初期値は「IPv6」「TCP」です。

そのあと、Windowsのファイル共有関係の137-139と445を書いておけば十分なようです。念のため、以下の図では53/TCPと53/UDP(DNS)を拒否するルールを書いていますが、「不正アクセスログ」をみると、特にルールを書かなくても「NATによる破棄」を理由として、たいていの試みは失敗するような動作をするようです。少なくともWell Knownなポートに関してはSYNの時点で捨ててくれますし、そうでない怪しい443(HTTPS)からの接続とかは、宛先ポートによらずESTABLISHEDのところで捨ててくれます。したがって、ルールがなくてもそれなりにうまく制限してくれるのかもしれない。

しかし、443や53から接続する攻撃があるのに驚きました。ルールの書き間違いを期待しているんでしょうか。あるいは、送信元が80や443だと通してしまう誤ったフィルタが設定された商品があるんでしょうか。
特定のポートを制限するなら、先頭に「全部通過する」ルールを置く必要があるので注意
いずれにせよセッション有効時間が短いので、調べ物に時間をかけていると、せっかく入力したルールを保存できないまま、最初からやりなおしになるので、最小限の設定からはじめるのがいいと思います。

この画面には「戻る」ボタンしかありませんが、変更内容はメモリに保持されています。これを保存するには、「戻る」で現れたトップ画面の画面左にある「設定反映」ボタンを押さなければなりません。すると、いったん確認画面を経由したあと、再起動が必要な選択をしたから再起動してくださいというメッセージとともに、「再起動」ボタンが配置された画面に遷移します。再起動は1分ぐらいだと思います。ときどき適当なサイトにpingでも打ちながら待っていると、そのうち反応があります。いつまでたってもunreachableな場合は、おそらく1番ルールの「最初にすべての通信を許可する」ときに「すべてのプロトコル」を選ぶのを忘れていて、ICMPが通らなくなっています。

あとはお好みで調整してください。再起動の時点で「不正アクセスログ」を開くと、早くも多数の怪しいパケットを捨てたことがみてとれます。

ひとまずこれで様子見です。

2015年11月5日木曜日

Mac OS XのKeychainに対応するOpenSSHパッチがGiHubにありました

以前、Mac OS Xのキーチェーンアクセスに対応したOpenSSHのパッチについてのエントリを書きました。

El Capitanになり、入っていたMacPortsの全リコンパイルをなんとか終えてしばらくしてから、port -uv upgrade outdatedしたら、MacPortsのOpenSSHが7.1p1になりました。

Homebrewのほうはどうだろうと思ったら、メンテナンスされているパッチのリポジトリをGitHubで見つけました。

https://github.com/zoltansx/openssh-keychain

Homebrewの場合は、dups/opensshのkegをeditしろとのことで、追加すべきコードを含め、手順がReadme.mdに書かれております。

気になる方は、上記URLを参照してみてはいかがでしょうか。

当方で試してみたところ、無事7.0p1がコンパイルでき、キーチェーンアクセスに保存されたpassphraseを用いてssh接続できました。ありがたや。

2015年11月1日日曜日

Yosemite以後のMac OSでJavaインストールのダイアログを消すにはJDKを入れる

そのまんまですが、El CapitanでJava6を入れないで、やむなくOracle JREを入れたけれど、いつまでもインストールしろとうるさいので調べたら、こんなFAQがOracleにありました。

After I updated to Mac OS X 10.10 (Yosemite), why am I told to install Java after I already installed the latest Java?

回答は、「full JDKを入れろ」でありました。Java SEですね。見つかりにくいですが、たぶんこのへんからたどるとよいのでは。

たしかに、JREだけだと空のディレクトリがあちこちにあって、なんか変だなと思っておりました。環境変数JAVA_HOMEを設定すればjavaコマンドは動きますが、ダイアログはシステムが出しているわけで、ユーザ側の環境変数は関係ないはずで。

それで、Java SE入れて再起動すると、あたりまえですが特に環境変数JAVA_HOMEを設定しなくてもOracle Java 8が動きました。まあ、しのごの考えないで、さっさと再起動するのがいいような気がします。

一方、検索してみると、El Capitanのrootlessを解除してApple Java 6を入れる手順が説明されていますが、気持ちはわかりますがやめたほうがいいんではないかと思う次第。

AppleのJava 6サポートはEl Capitanが最後なんだそうです。Java 6依存のコードは、Oracle Javaの新しいコード(Java 8とか)で警告なくコンパイルできるよう、リファクタリングしなければいけませんね。いろいろめんどくさいですが。

2015年10月27日火曜日

GoPiGoとは

Raspberry Piでロボットカー制御、というので話題らしい、「GoPiGo」のサイトをみてみました。
GoPiGo Base Kit

とても見覚えのある感じのモータとタイヤ(ちっちゃいものくらぶの通販サイト参照)でありまして、いつのまにか欧州サイト他でも見かけるようになったので、さすがともんさんお目が高いと思うわけですが、それにレーザーカットした木製もしくはアクリル筐体、そしてRaspberry Piに載せるボードなんですが、なんとArduinoでした.

GitHubに回路以外の一式が掲載されているのですが、FirmwareのなかみはArduinoのスケッチです。しかも、GPIO上のシリアルポートで通信しておりまして、おんなじこと考える人はいるもんだなあと思った次第。

セットアップはGertboard使っておりまして、これはアナログはSPIでRaspberry Piに渡すので、そのへんの違いや、モータをドライブできる回路も乗っているので、わたくしが作成した簡易基板よりは豪華。
"Red Board"
GoPiGoは、電力が必要なのは車輪のモータだけのようなので、Gertboardの簡略版と思われる一方、赤外線リモコン対応などの追加もあるようです。でもまあ、がっつりと DIP版のATmega384Pが存在感を放っているあたり、好感がもてますね:)
Base Kitのパーツ一覧
上図はBase Kitですが、車輪にとりつけるロータリエンコーダ相当の溝を切った円盤もあり、対応言語によってはエンコーダの値をみてフィードバック制御可能なようにもなっているようです。PythonだとBluez使ってBluetooth接続したPS3リモコンにも対応している模様。サンプルもたくさんありますが、個人的にはJavaやNode.jsに対応したのがえらいなと思った次第。Pythonの簡単なソケット通信サンプルもあって、ソケットからロボットカーの操作もできるようです。
Starter Kit
Starter Kitだと、超音波距離センサとその首をふるサーボモータがついてくるようです。

あとオプションでRaspberry Pi純正カメラをつけてビデオストリーミングするようなPythonスクリプトがあり、PC側でモニタしたり、Raspberry PiでOpenCVを動かして画像認識するようなデモがあったりと、PythonではI2Cインタフェースを含めていろいろな材料を提供しているようです。

YouTube動画をみる限り、なかなかきびきびと動きますね。開発はVNCとファイル共有を併用し、PC側で編集したプログラムをファイル共有でRaspberry PiのPythonで実行するのをVNCの画面から操作しています。Avahi(mDNS)も動かして、IPアドレスでなく、名前で接続できるようなこともしています。

材料は特別なものはとくにないので、Arduinoやモータドライバを含めてある程度の材料が手元にあれば、GitHubのレポジトリからほぼ同様のものを作っていけるように思いました。

ゼロから工作していく感じが学習向けだと思うのですが、日本語対応という点ではScratchがありますが、Pythonほど情報提供されていないので、Python怖くない中高生や大学生にはおすすめできるけれど、そうでない人にはまだ敷居が高いのかもしれません。

2015年9月21日月曜日

いわゆるXcodeGhostについて

iPad AirをiOS 9にアップデートしようと久しぶりに電源を入れたら,iCloudやiMessageへのログインを繰り返し要求される事態が発生し,うんざりしておりました。公開初日だったのでAppleがとんでもなく混雑しているのは,iOS 9のダウンロード前の認証に10分ぐらいかかった時点で覚悟したわけですが,iCloudやiMessageの認証失敗もその関係かなと思っていたわけです。

日中のダウンロードを諦めて帰宅後,深夜に自宅で割と(それでもゆっくりと)ダウンロードが進むのを見ているうちに寝落ちしたので,目覚めてからは混雑解消したのか,すっきりとインストール以後は進みました。

インストールの間にもAppleの認証ステップがありますから,通信が混雑しているとインストール途中でプログレスバーがいつまでも動かない,ということが生じますが,それはなかった,ということです。

で,現象が解消して忘れていたのですがそこへXcodeGhostのニュース。各ニュースサイトで話題になっているのでご存知かと思いますが,細かいところまでよくまとまっているのが以下の記事かと思います。

それ以前に一般のニュースで,iCloudのパスワードを入れさせられる場合もある的な記述があり,「ゑ?」と思ったわけです。

ということで,Pangu作のチェッカを入れて確認しました。このへんは脱獄ニュースのTools4Hackさんが詳しい。Panguは脱獄ツールを作成,配布しているところですから当然でして,この界隈の修羅の様相を踏まえて,確からしい内容を選んで丁寧に解説されているのがこのサイトであります。
個人的には脱獄環境でMobile Safariの穴からiOS乗っ取られた過去があるので脱獄はめんどくさいと思ってやめましたが,iOSのセキュリティについては脱獄コミュニティがいちばん詳しく知っていて,Twitterなどでかれらが漏らす話が重要だったりするので,それをうまく掬って記事にしてくださるニュースサイトは見ております。

というわけで,上記記事の手順で,Mobile Safariからアプリをインストールして,開発者証明書プロファイルを「設定」アプリから「信頼」してあげれば動きます。エンタープライズ向け,企業などで社内業務用に開発されたものなど,一般公開されないアプリをインストールして動かす手順を踏む形。

開発者証明書はAppleに申請して,Appleの署名つきのものを取得しないとアプリが動かず,証明書の偽造はまだ確認されていない,できないことになっている,のだったと思うので,このアプリを動かす間だけ「信用」すればよいし,この画面で「信用」すると赤文字で「Appを削除」にかわるわけですが,実行後,ここをタップすれば証明書とアプリの両方が消えます。

結論ですが,わたくしのところでは,コメント欄で話題になっているCamScannerは手持ちはCamScanner+だったおかげか,感染しておりませんでした。というわけで問題なし。AppStore側も感染アプリのBAN(ストアからの削除)を積極的に進めているようなので,今後インストールするアプリに同じ不正コードが含まれている可能性は少ないのかなと思っています。(AppStoreからBANされていても,いまデバイスにインストールされているアプリまで消えるわけではないので,いま動いているiOSデバイスで確認することが大事です)

それで,XcodeGhostの該当コード部分がGitHubに上がって,めきめきスターの数が上がっております。スターは,いわゆる「お気に入り」機能です。ブックマークといってもいい。
たしかに,各種情報をとりまとめ,暗号化して情報収集サイトに送信する様子が見えます。README.mdが中国語なので読みにくいですが,英語に翻訳すればわかりやすい。文法が近いためか中国語から英語への翻訳精度は高いと思います。

Google翻訳の結果:
"XcodeGhost" Source clarification on the so-called "XcodeGhost" of

First of all, I XcodeGhost event to bring confusion apologize. XcodeGhost from my own experiments, without any threatening behavior, as detailed in the source code: https: //github.com/XcodeGhostSource/XcodeGhost

The so-called XcodeGhost is actually hard to force an unexpected iOS developers find: Modify Xcode compiler configuration text file specified code can be loaded, so I wrote the code above annex to try and upload it to your network disk.

All data in the code actually acquired basic app information: application name, application version number, system version number, language, country name, symbol developer, app installation time, device name, device type. In addition, you do not get any other data. Solemn note is required: for selfish reasons, I joined the advertising features in the code, hope can promote their applications (off the source code can be compared to the Annex do check). But in fact, from the beginning to the final shut down the server, I have not used the advertising function. And in 10 days ago, I have taken the initiative off the server and remove all data, but will not have any effect on anyone.
Willing rumors would stop the truth, the so-called "XcodeGhost", used to be a wrong experiment, after just completely dead code only.

It is emphasized that, XcodeGhost App will not affect any use, but does not obtain private data, only a dead piece of code.

Again sincerely apologize, wish you a pleasant weekend

2015年9月10日木曜日

なのぼ〜どAG 1.4(2015年8月版)が出ましたね(ちと保留.時間ができたら確認します)

(注:サイトをよく確認したんですが,4月末以後の1.4との明確な差が写真と手元の実物から確認できませんでした.通信の不具合が解消しているか,現在配布しているものを確認できないので,以下の記述を当面保留します 2015-09-10)


以前のブログエントリで述べてきた,2015年5月版の「なのぼ〜どAG 1.4」について,ともんさんと何度か質問と回答のやりとりを得ながら,割と孤独に学生の実習のためハックを重ね,いろいろと面白い成果を出すことができたのですが,報告書作成のため,あらためてサイトをアクセスしたら,2015年8月版1.4にアップグレードされていて,驚愕であります.

前のエントリもそこそこのアクセスがありまして,その内容もご参照いただいたのかと思いますが,当時の懸案事項というのか,7月から8月にかけて胃を痛めながら睡眠時間削って回避方法を探ったり,基板のパターンと回路図を眺めながら,わかる人にはわかるように仕込まれている隠れ仕様を発見しつつ学生の要望に対応してきたことが,全面的にクリアになったような印象です.

ここで最も大きいのはATmega8Lをクリスタル駆動にした大英断と賞賛したいです.5月版1.4は,前のエントリに書いたとおりATmega8L内蔵のRCクロックで動作していましたので,本当に不安定でした.一応温度補償回路内蔵というメーカーの仕様ですが,電源ケーブル,その日の温度,湿度,さまざまな理由でシリアル通信の条件がつねに変化し,120〜150分の授業の間にも動く時間と動かない時間があり,この夏は異様に蒸し暑かったのですが,エアコンあれども,日に日に不安定度が増していくようなありさまでした.

当方での使い方として,ドリトルとの間でつねにシリアル通信をする形をとったので,タイミングが不安定になるとデータが欠けたり化けたり,あとProlificのWindows版ドライバを強く疑っているのですが,連続してデータをやりとりすると,Windowsのレベルでドリトルの動作が停止したり,基板との通信が止まって基板が生きているのか死んでいるのかわからなくなる,ということが頻発して途方に暮れるのでありました.Scratchセンサーボードのスケッチは毎サイクルですべてのセンサデータの送信とモータ等の動作データ受信を繰り返すので,あるサイクルで失敗しても次のサイクルで回復するとか,Scratch側がバッファ持ってて多少遅れてもなんとかなるようでしたが,ドリトルのプログラムは間欠的に,ときにバースト的にデータをやりとりするので,データの欠落や化けはわりと致命的でした.

Prolificのチップですが,Mac版ドライバは非常に安定しており,5月版なのぼ〜どAG 1.4であっても,たまにまずいところだけ5〜10ms程度の待ち時間を入れてあげる程度で,Windowsのときのようなハングは一切生じておりませんでしたが,Windowsでは,随所に50ms以上のウエイトを入れて確率8割ぐらい,PCの個体によってはどうやってもお手上げで,その個体ではATmega168Pに8MHzのクリスタルを搭載した「スタディーノ」でさえ通信ができなかったりしました.

スタディーノで使われているのは中華クローン対策をしたTA版チップで,クローンされまくったHXAの後継であるHXシリーズとは設計が違うと思われるのに,とにかくだめなときはだめです.

WindowsのドライバはProlific公式サイトからダウンロードしたものも,Windows 8.1や10で自動インストールされるドライバも,挙動に違いはみられないように観察されました.

それから,なのぼ〜どAG基板裏のジャンパパターンのカットについて,前のエントリの何度かの更新で加筆していきましたが,公式サイトでも写真つきで説明が入り,わかりやすくなりました.僕の現在の死亡フラグが立った状態が落ち着いたら,具体的な使用例込みでこちらで報告したいと思います.

それから,Li-Po(リチウムポリマーバッテリー)について,充放電管理のチップを搭載したものを入荷されたということで,これもすばらしい.SparkFunもAdafruitも商品ラインナップは電池単体で,チップはLilyPadやFloraのようにArduino基板側に搭載されるか,Breakout基板として別途提供という形でした.国内はラジコン用でホビーショップから買う経路が安定しているようですが,小型軽量なLi-Poは小さなプロジェクト,特に身に付けるような作品をスマートに仕上げるには具合がいいので,3.7〜4Vあたりの動作の回路には積極的に使っていきたい感じですが,専用充電器じゃないと怖いよ,ということで手を出しにくいところだったかと思います.という意味で電池側にチップがあるのは楽でいいです.

ただ,Li-Poは充放電を繰り返しているうちに膨張していつか破裂するという宿命があり,それは避けられないこと,パッケージは柔らかいけれど衝撃等で内部に傷やひびが入るとボーイング787初期の燃焼事故のような感じでやっぱり燃えるので,荒っぽい使い方しないよう注意してほしいと思います.で,ちょっとでも危ない気配がしたら正しい回収先に出す.

YouTubeを「battery explosion」で検索すると,バッテリーケースやスマホ本体にナイフを打ち込んで爆発大炎上させるロックな動画がいっぱい出てきますが,よいこはまねしないでくださいね.

2015年8月17日月曜日

Yosemite 10.10.4とHomebrewのOpenSSH(追記:2015年11月5日)

(追記:2015-11-05 MacPortsの7.1p1対応、Homebrew用の7.1p1向けパッチの存在についてのエントリ書きました)

Mac OS X 10.11 El CapitanのPublic Betaも出てしばらくするのにこういう話で恐縮するわけですが,数日前に半日無駄につぶしたのが残念なので,同じ轍を踏む人がいないよう記しておくことにします。

まずみんなが困っていることが,Mac OS X Yosemite 10.10.4のOpenSSHは6.2p2であり,楕円曲線暗号を用いるECDSA対応がありそう(stringsするとecdsaの語は出てくる)けれど,鍵交換アルゴリズムにECDSA対応が入っていないためHost KeyにECDSAを使ったサイトに接続できないというところでありまして,結局使えない,ということであります。El Capitanは試していないので現状どうなっているのかわかりませんが,Beta 3のユーザがHomebrewしているところをみると,状況はかわっていないのかなと思われるところです(ここの末尾)。

ちなみに,Mac OS Xのsshのありがたいのは,launchdがログイン時に起動するssh-agentがパスフレーズをOSの「キーチェーンアクセス」により自動送信してくれることでありまして,通常ssh-addで明示的にパスフレーズを教えこむような手間を,ログインごとではなく,暗号鍵を作成し,最初に使うとき一回だけで終わらせてくれることにあります。とはいえ,そのコードは本家OpenSSHに反映される様子がなく,MacPortsでメンテナンスされているパッチを使って最新(に近い)OpenSSHを使うということになっておりました。

というわけで,MacPortsを使っている限りは,インストール時に+gsskexを指定することによって,Kerberos 5認証とセットでキーチェーンアクセス対応になるので,ssh-agentが/opt/local/bin以下にあるものを起動するよう,/System/Library/LaunchAgents/org.openbsd.ssh-agent.plist を書き換えて,そのあとログインしなおせばよい,ということでありました。

で,数日前に出た7.0p1に対してMacPortsでは,現状Kerberosはだめということで,キーチェーンアクセス対応パッチも通らない状況であるようです。いずれ誰かが調整してくれるのを待つしかない。

一方,Homebrewは哲学として,OSにあるものを極力使うという方針があり,OpenSSHもhomebrew-dupsをtapしてやらないと入らないようになっておりました。つまり,手順としては(7.0p1対応の現在)

  1. brew tap homebrew/dupes
  2. brew install openssh
以上,ということでして,いっとき存在した「OpenSSL 1.x系にするための--with-brewed-openssl」とか「キーチェーン対応のための--with-keychain-support」などのオプションはすべて外されており,逆に,「LibreSSLを使う--with-libressl」だけが唯一存在するオプションであります。とはいえ,上の手順でopenssl-1.0.2dも同時に入るので,OSの0.9.8zfを使うわけではないようです。

(ちなみにopensslとlibressl混在問題というのがあるらしく,まだ「混ぜるな危険」のようなので,libresslを入れるのは自己責任ということです)

これは要するに,10.10.4のssh使わないならMac OS Xと同等の動きを期待するなということでありまして,一般的なUNIXの流儀で使いなさいね,という判断であります。

かわりに,Funtoo Linux由来らしい,コマンドラインのkeychainというのがssh-agentの面倒をみるらしく,それ使えというコメントがあったり,解説している人もいますが,あんまり幸せになる感じがしませんでした。普通にssh-addしてるほうが安全な気がします。

ただ,Homebrewでキーチェーンアクセス対応しなくちゃやだ,という人は,6.2用に自作Formulaを公開している人もいるので,それをtapしてください。使いかたは,そこのREADME.mdにかかれている通り。入れ替えが終わったら,再起動して数分ほっとくのがよいようです(再起動後,launchdが出すエラーが/var/log/syslogにしばらく出ているけれど,そのうち落ち着くので)。落ち着くとlaunchdがキーチェーン機能つきのssh-agentを自動で起動してくれるようになります。

ただ,README.mdの末尾に書かれているスクリプトはあちこちで孫引きされてますが,全く意味がないので無視してください。

というのは,$(ssh-agent)と変数を参照してますがどこにも定義がないからexecしてもなにも起きないし,shellを落とすときにkillが走るようにtrapつけてますが,ssh-agentはlaunchdが管理しているので,shellには期待している環境変数SSH_AGENT_PIDがありませんから,killしたくても引数が空なのでなにも起きません。実害はないけれど全く無駄な処理が動く分だけ資源の無駄なんではないかと思います。

これに意味があるのはキーチェーンを使わない,つまり自分でssh-agentを立ち上げて,ssh-addで鍵を覚えてもらうときに意味がある記述です。ただ,いつ書かれたものかわからないけれど,いまならもっと簡単に書けます。bash前提にすると,
exec `ssh-agent -s`
function cleanup {
  ssh-agent -k
}
trap cleanup EXIT
が妥当ではないでしょうか。ただこれだとshellの数だけssh-agentが生まれてそれぞれ別のソケットを作るので,ターミナルを複数開くとshellごとにssh-addする形になってうれしくない。それよりは,最初にUNIXソケット決め打ちで-aオプションから指定することにしてそれを共通の環境変数SSH_AGENT_SOCKに持ち,一度起動したら,以後はssh-agentを起動しないほうがいいんではないかと思うところ。複数ユーザがいるなら,ユーザ名をソケット名に入れるのが妥当なんではと思ったり。

GNU screenやtmux使う人で,再接続したときに環境変数失ってssh-agentとお話できないのをごりごりする人がいるようですが,この考え方でスマートに解決できるんではないかとも思いますがどうでしょうか。

2015年6月23日火曜日

なのぼ〜どAG(2015年春版=V1.4)をArduino IDE 1.6.5でプログラムする(更新あり2015-09-10,2015-08-17, 2015-07-06, 2015-06-30, 2015-06-27)

新しい2015年8月版1.4のなのぼ〜どAGが出たので,ともんさんのサイトを参照しましょう.本エントリは以後更新しません)

(重要な訂正:D3,5,6はPWMできませんでした。よって使えるのはD9,10,11のみ)
(重要な訂正:PWM端子がM1とM2で逆に書いていたのを直しました2015-07-06)
(更新内容:基板の端子の接続をテスターで確認しました)

ともんさんが頒布されている、なのぼ〜どAGは、もともとScratchセンサーボード互換にWeDo相当のモータドライバを載せる用途で開発されてきたものだったはずですが、Arduino互換なので、とても安価なArduinoとして使いたいという方も多いかと思われます。

学生実習用に、モータドライバつきでCdS、マイクロフォン、スライダーボリューム、タクトスイッチを搭載したArduinoが送料込み2,000円というのはたいへんありがたいので、使わせていただくことにしました。

現在の最新版はV1.4だそうで、裏面を見るとたしかにそうシルクされています。(2015-06-30追記)

回路図も公開されているのですが、ロットごとに、ともんさんが支援している、その時々のOtOMOの活動(主に子ども向けScratchプログラム学習イベント活動)に合わせて設計がかわるようなので、特にソケットのあたりは現状に合っていなくてしばし迷うところでありました。また、Arduino IDEについて、古い情報を更新するエントリが見当たらなかったので書いてみる次第であります。

まず2015年春版(年内にロットがはけたら次の設計にかわるかもしれないので、仮にこう呼ぶことにします。追記2015-06-30:4月末以後はV1.4だそうです)の外見は、「なのか〜」の写真が該当するように思われます。具体的にいうと、サーボモータ端子はなくなって、アナログ入力A,B,C,Dと同じ並びにD11とVccがきて、超音波距離センサーがそのままささるようになっています。(テスターで確認:2015-06-27)

あと、M1, M2のモータ端子横の3本のうち、外の2本が基板を電池駆動する場合の電源端子であること、スルーホールのままの3端子が電池ボックスからの電源スイッチを取り付ける場所であることが、「なのか〜」の写真からうかがえます。残る1端子は、モータドライバのモータ用電源端子につながっています(テスターで確認:2015-06-27)。

まとめると、こうなると思います。
なのぼ〜どAG 2015年春基板と端子の割り当て

この写真は上のスルーホールにピンソケットがついていませんが、本来はつけた状態が完成品のようです。手仕事の部分が残っているようなので、値段もたいへん手頃ですしScratchセンサーボードとしては本来不要なところなので、それをとやかく言うのはよろしくないと思います。(追記2015-06-30)

なのぼ〜どAGはATmega8Lの8MHzクロックなので、ATmega168に対してFlashが半分(8kB)ということさえ注意すれば、学習用のプロジェクトには十分使えるのではないかと思われます。ATmega8というと、初期のArduino NGなど古い基板の印象ですが、Adafruitの最近のヒット作Gemma(ATTiny85使用)にむしろ近いのかもしれず、そう思うとなんとなくモダンに見えなくもない感じです。

ただ、ATmega8L内部クロックで動作しているので、外付けクリスタルで動作するArduinoに比べればタイミングが不安定なときがあり、基板バージョンごとに対策をとって安定度は増しているものの、ときにスケッチ書き換え失敗がないとはいえないようです。つまり、Scratchセンサーボードのスケッチを消すのは自己責任と考えるべきだと思いました。基板に搭載されているクリスタルは、回路図を見ればわかりますがPL-2303HXC用、つまりUSB用です。(追記2015-06-30)

さて、まずはArduino IDEで使えるようにするために、boards.txtに何を書くのかということですが、最近のなのぼ〜どAGはoptibootをbootloaderに使っている、つまりUno R3などと共通のコードベースで動いているのでわりと素直です。1.0.5用として公式ページに書かれているものにちょっと追記したら1.6.5でもうまくいきました。

こんな感じ。

atmega8o83.name=chibiDuino pro ATmega8 38400 optiboot

atmega8o83.upload.protocol=arduino
atmega8o83.upload.tool=avrdude
atmega8o83.upload.maximum_size=7680
atmega8o83.upload.speed=38400

atmega8o83.bootloader.tool=avrdude
atmega8o83.bootloader.low_fuses=0×94
atmega8o83.bootloader.high_fuses=0xDC
atmega8o83.bootloader.path=optiboot
atmega8o83.bootloader.file=optiboot_cp83.hex
atmega8o83.bootloader.unlock_bits=0×3F
atmega8o83.bootloader.lock_bits=0×0F

atmega8o83.build.mcu=atmega8
atmega8o83.build.f_cpu=8000000L
atmega8o83.build.core=arduino
atmega8o83.build.variant=standard
atmega8o83.build.board=AVR_ATMEGA8O83

これで次に気になるのは搭載されているセンサー類がどうなっていて、自由に使えるアナログ入力があるかという心配ですが、なのぼ〜どAGはアナログ端子8個の設定なので、実は結構余裕。

A0マイクロフォン(音量センサー)
A1「A」端子
A2「B」端子
A3「C」端子
A4「D」端子
A5CdS(光センサー)
A6スライダー可変抵抗器
A7タクトスイッチ

D5モーターM2制御1
D6モーターM2制御2
D7モーターM1制御1
D8モーターM1制御2
D9モーターM1 PWM
D10モーターM2 PWM

D2-D4とD11-D13は未使用です(超音波距離センサーはA1(=D15)とD11を使用するので、その場合は他の用途に使わない)。D3とD11がPWM対応なのは通常のArduinoと同じです(D3,5,6はPWMできないので普通のArduinoと異なることがわかりました:2015-08-17追記)。また、D13には通常のArduinoと同じようにチップLEDが接続されています。

なお、アナログ端子はすべて10kΩ(103)抵抗でプルアップされているので、学習用に分圧回路組ませたりしなくても、なにか抵抗値が変化するものを入れるだけで値の取得ができます。プルアップが困る場合,プルアップ抵抗値を変えたい場合は,裏側にジャンパパターンがありますので,そこをカットすればプルアップ回路の切り離しを行うことができます。1MΩでプルアップすれば,Makey Makeyのようなタッチセンサー風味のことも十分可能です。(追記2015-08-17)

あと、基板手前側のピン、普通のArduinoでは電源やアナログ入力端子が出ているところの上がスライダー可変抵抗器でふさがってしまっているので、「A」〜「D」で外に出してある端子を使うべし、ということになろうかと思います。電源周りはあちこちにVccとGNDが出ているので、それらを利用すればそれほど苦労はしないと思います。

I2CはA5がSCL, A4がSDAですが、スライダーボリュームの横にA5が出ているので、こことアナログ「D」(A4)を活用すればなんとかなるかもしれません。ただしA4はプルアップをありがたく利用させていただくとしても,A5にはCdSがつながっているので、CdSに光が入らないよう、しっかり覆いをかぶせて高抵抗(1MΩぐらいになるはず)を保つか、確実なのは基板裏のA5とシクルされた部分のパターンをカットしてCdSを切り離す(追加2015-07-06,打ち消し線追加2015-08-17)べきと思います。どちらもA4は基板上で10kΩでプルアップされているのでそちらのI2Cのプルアップ抵抗外付け不要ですが,A5はパターンカットによりプルアップを失いますから,それを補う必要はあります(文章訂正2015-08-17)。

2015年6月6日土曜日

Yosemiteに入れてしまったApple Java 6を片付ける方法

Yosemite登場の10.10.0では、なにかと以下のダイアログが出てうるさく、AppleからJava SE 6をダウンロードしてインストールした方もおられると思います。
でも、10.10.3であるいまは、消してしまってもたいてい大丈夫なようです。おさらばしましょう。

Apple Java SE 6を入れた状態は、こうなっているはずです。
$ pkgutil --pkgs |grep -i java
com.apple.pkg.JavaEssentials
com.apple.pkg.JavaForMacOSX107
com.apple.pkg.JavaMDNS
com.apple.pkg.JavaSecurity
com.apple.pkg.JavaTools
ちなみに、Vanillaな(素の)Mac OS X 10.10.3でこれをやると、以下のようになります。
$ pkgutil --pkgs |grep -i java
com.apple.pkg.JavaEssentials
com.apple.pkg.JavaTools
つまり、間の3つを消せばよいということですね。

それで、pkgutilコマンドで削除できればよいのですが、できません。rubyでこのコマンドを書かれた方がいらっしゃるのでありがたく使わせていただくことにします。
$ wget https://raw.githubusercontent.com/niw/profiles/master/bin/rm_pkg_files
$ chmod +x rm_pkg_files
どこか適当にpathの通っているところに置いておくとよいかと思います。

というわけで、消してしまいましょう。ついついbashのfor文を書きたくなりますが、わかりにくくなるのでひとつひとつ順番に。
$ rm_pkg_files com.apple.pkg.JavaForMacOSX107
$ pkgutil --forget com.apple.pkg.JavaForMacOSX107
$ rm_pkg_files com.apple.pkg.JavaMDNS
$ pkgutil --forget com.apple.pkg.JavaMDNS
$ rm_pkg_files com.apple.pkg.JavaSecurity
$ pkgutil --forget com.apple.pkg.JavaSecurity
これでさようなら。pkgutil --forgetで、pkgの一覧から出ないようにするのを忘れないことと、先にforgetしてしまうとrm_pkg_filesは、pkgutil --filesの結果を使うので「消せなくなる」という悲しいことが生じるので、こちらを先に実行するようにしてくださいね。

for文で書くと、どっちがどっちかあまり考えずにワンライナーでやってしまい後悔する(あらためてAppleからダウンロードしてインストールしなおすはめに)ことになりますはい。

Oracle Java 8を完全にアンインストールする

類似のエントリはいくつかあるようですが、vanillaな(素の)Mac OS X YosemiteからOracle JRE 8をインストールした差分で作業したので、たぶん現状これが完全なのではないかと思います。

まず、JavaUpdateやHelper-Toolの起動がlaunchctlに設定されているので、unloadしておきます。そうすればマシンを再起動しなくてよい。
$ sudo launchctl unload /Library/LaunchDaemons/com.oracle.java.JavaUpdateHelper.plist
$ sudo launchctl unload /Library/LaunchDaemons/com.oracle.java.Helper-Tool.plist
念のため確認しておきます。
$ sudo launchctl list | grep -i oracle
何も表示されなければOK。unloadでエラーになるとかで、上のコマンドの結果が空にならないなら、以下のplist削除をしてからマシンの再起動です。

というわけで、これらの起動用plistは削除しておきましょう。
$ sudo rm /Library/LaunchDaemons/com.oracle.java.JavaUpdateHelper.plist
$ sudo rm /Library/LaunchAgents/com.oracle.java.Java-Updater.plist
場合によっては他にもOracle関係のplistが散らばっているかもしれないので、/Library/LaunchDaemons/com.oracle.* や /Library/LaunchAgents/com.oracle.* をみて、あれば消去しておきます。

あと、Helper-Toolの設定plistがあるので、それを消します。
$ sudo rm /Library/Preferences/com.oracle.java.Helper-Tool.plist
また、自分のhome以下にもoracle関係がいろいろ置かれているかもしれません。~/Library/LaunchAgents/com.oracle.* を調べて、あれば消します。

~/Library 以下には、JavaやOracleというディレクトリがあるかもしれませんので、あればそれらもrm -rして消してしまいます。

次に、「システム環境設定」のJavaの項目を消去します。
$ sudo rm -r /Library/PreferencePanes/JavaControlPanel.prefPane
これで「システム環境設定」を起動すると、Java項目が消えているのが確認できるはず。

次に、Oracle版のjavawsが/Libary/Application Support以下に置かれているので、それを消します。
$ sudo rm -r /Library/Application\ Support/Oracle
自分のhome以下のLibrary/Application Support以下にもJavaやOracleがありますので、消します。
$ rm -r ~/Library/Application\ Support/{Java,Oracle}
これでようやく、Oracleの「アンインストール方法」に書かれている作業をして、キレイにおさらばです。でも、自動アップデートしなくてもいいからいまのJava環境をとっておきたければ、以下のコマンドライン引数のディレクトリ下にあるHome以下をどこかにコピーしておけば、環境変数JAVA_HOMEがそこを指すようにするだけで動きます。そのあたりの動きについては別のエントリで。
$ sudo rm -r /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
ひとまず片付きました。

Mac OS Xのjavaは環境変数JAVA_HOMEで切り替えられる

Mac OS Xには、最初から/usr/bin以下にJDK 6相当のコマンドがずらりと入っておりまして、なんだこりゃと思うわけですが、なかなか面白い挙動をしたのでご報告。

Javaをインストールしていない状態でこれらを実行すると、例のダイアログが出ますね。
Javaが入っていないと出るいつものダイアログ
それで「詳しい情報...」をクリックするとOracleからダウンロードしてインストールするよう指示されるので、普通の人はそうするんだと思いますが、それでもなお、何かコマンドを実行するとこのダイアログが出てきて混乱するわけです。

そのとき、Apple Java SE 6を入れるとおさまるわけですが、Oracle Java 8はどうやって実行するの? という疑問が残ります。

それで調べてみると、環境変数JAVA_HOMEで実行先を指定するのが正しいようです。そこで、~/.profileあたりに
export JAVA_HOME="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home"
と書いて
$ . ~/.profile
などとして読むとか、試すだけならいま開いているshellで実行してもよいわけですが、そうするとあら不思議、
$ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
というわけで、Oracle Java 8が/usr/bin/javaから呼び出されるというわけです。

開発者なら、Oracle JDK 8を入れると思うので、そうすれば、Java 6時代のコマンドapt以外は全部Oracle Java SE 8で置き換えられるのでわりと幸せです。Java 8にしかないコマンドもあるので、/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/binをpathに入れるとかしたくなる人もいるかもしれません。

ちなみに、Oracle JRE 8を入れて環境変数JAVA_HOMEを設定して、JDKにしかないコマンドを実行するとどうなるか。例えばjavacなんかですね。
$ javac
Unable to locate an executable at "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/javac" (-1)
環境変数の先を実行しようとしてコマンドがないのでエラーになる、という動作をします。正しい動作です。

ところが、これに沿っていない困ったコマンドがひとつだけあります。/usr/libexec/java_homeです。
$ /usr/libexec/java_home
Unable to find any JVMs matching version "(null)".
No Java runtime present, try --request to install.
なんと、Apple Java SE 6を探しに行って、ないからインストールせよというわけです。まあ、Appleご謹製のコマンドなんでしょうがないですが、古い時代の、AppleがMac OS版Java公式配布をしていた時代に作られたソフトウェアでは、このコマンドでJavaの存在をチェックしているものがあるかもしれません。やめてもらいたいんですが開発止まってたらだめですね。どうにかならんもんでしょうか。

ついでなので、java_homeコマンドをもう少し深堀りしてみます。
$ /usr/libexec/java_home -h
Usage: java_home [options...]
    Returns the path to a Java home directory from the current user's settings.

Options:
    [-v/--version   ]       Filter Java versions in the "JVMVersion" form 1.X(+ or *).
    [-a/--arch      ]  Filter JVMs matching architecture (i386, x86_64, etc).
    [-d/--datamodel ]     Filter JVMs capable of -d32 or -d64
    [-t/--task      ]          Use the JVM list for a specific task (Applets, WebStart, BundledApp, JNI, or CommandLine)
    [-F/--failfast]                  Fail when filters return no JVMs, do not continue with default.
    [   --exec       ...]   Execute the $JAVA_HOME/bin/ with the remaining arguments.
    [-R/--request]                   Request installation of a Java Runtime if not installed.
    [-X/--xml]                       Print full JVM list and additional data as XML plist.
    [-V/--verbose]                   Print full JVM list with architectures.
    [-h/--help]                      This usage information.
ふむふむ、--execを通してやればよいのかと、環境変数JAVA_HOMEがOracle Java 8を指している状態で試してみます。
$ /usr/libexec/java_home -exec java
Unable to find any JVMs matching version "(null)".
No Java runtime present, try --request to install.
がーん! というか、やっぱりApple Java SE 6があることが前提なようです。

両方入れて、java_homeがうまく切り替えてくれるかは確かめておりませんが、注意喚起の意味でご報告する次第です。「java_homeには罠がある

2015年6月2日火曜日

Studuinoを深堀りしてみる

タイトルに即した内容だけ先に書いておきます。

Studuinoのライブラリを眺めたり回路図を眺めたりしていて、どうもこれはArduino Pro 3.3V 8MHzなんではないかと思って、boards.txtのbootloaderファイル名の定義を見たら、optiboot_pro_8MHz.hexでして、ずばりでした。ただ、昔買ったPro基板のbootloaderはスケッチを書き込んだあと、オートリセットがかからず手でリセットボタンを押して時間内に書き込み開始しないといけなかったのですがStuduinoはちゃんとオートリセットするわけで、なんだろうと思っていたら、Adafruit創業者Lady Adaのbootloader hackを反映しているようですね。ATmega328向けその他含めてTyler Cooper (Mr. Ada)の署名記事に改稿されてますけれども。bootloaderに歴史あり。

Ms. Limor Fried(MIT Media LabでMEとってるんですね)の足跡というのか、Arduino.cc版ハードウェア生産拠点がAdafruitになった理由は十分と納得した次第であります。

さて以下、タイトルに反してあまりStuduinoの話ではないわけですが、カタログを丹念に調べていて気づいた点についてうだうだと。

まず、Studuinoのダウンロードサイトですが、突然の充実に驚いた次第。まず、ドキュメントがたくさん。あと、Arduino 1.6.4に公式対応したり、更新情報のリンクがついたりと、利用しやすくなりました。

それで、多数の新しいドキュメントのなかで、5月のカタログに掲載されていない「可視光通信対応環境」あたりにおののくわけでして。地味に「ブロックプログラミング環境」の1.x版(いつのまにか、新センサーモジュール類対応の2.x系がある)がありまして、その使用法が書かれているわけです。

これは学校のWindows PCでインストール一切禁止になっていてUSBドライバが入れられないケースは多々あるわけですが、その対策として、記憶によればスズキ教育ソフトがかつて「キューブカート」というロボットカー制御プログラミング学習セットを販売していたときに初めて商品として実装したやつなんではないかと思うわけです。もし違っていたらすみません。一応ダウンロードサイトが残っていたのでリンクしておきます。で、どうやるかというと、当時ですとCRTですが、要するにPCの画面に黒背景に白い四角を2個点滅させて、シリアルでデータを表示するのをフォトトランジスタやCdS等でロボットカーの制御基板が読み取って、それでPC側で作成したプログラムを転送するしくみ。ざっくり考えると片方がクロックでもう一方がデータだろうと、SPIみたいにだらだら流せばいいんだろうなというように想像するわけです。

そういう懐かしい手法がいまだに有効というか必要とされるところに愕然としながらもいろいろ深堀りしていたら、アーテックにも歴史あり。「PCプログラミングロボ」というのがありました。こちらはCdSを子どもが自分ではんだづけして、紙工作した窓に貼り付けて、それを画面にはりつけてプログラムの転送する形。んで、そのプログラミング環境がStuduinoの「アイコンプログラミング環境」そのものの画面であったという発見がこのエントリのひとつ。

新たに開発したにしてはどうも地味な扱いだなと思っていたわけですが、過去の資産というか、これで長年授業実践していた先生方をこちらに引き寄せるために必要だったんだなーと思った次第。でもその四角点滅の「可視光通信転送」はScratchのみで実現して、Scratchへの移行を促す戦略なのかとほのかに思ったりしました。正しいと思います。

あともうひとつ。StuduinoでDCモータやサーボモータを制御してロボットを組み立てるわけですが、アーテックは自前のプラスチックブロック「アーテックブロック」というのがありまして、実際に組んでみるとLEGOブロックの精度がいかに驚異的なのかということにしみじみするわけですが、それはともかく作例に倒立振子の写真があって、大きな車輪を使っているのですが、それはRobotistというアーテックのロボット制御ブロックキットには入っていないわけです。あるのは小さな黒いプーリーとゴム輪で、プーリーは回転軸をもつブロックに組み付けられるようになっていますが、それだけ。大きな車輪は赤いのですが、そもそも赤系統のブロックは「ロボティスト T.Rex」とか小学生向け風味のほうであって、中学生以上向けのシリーズは青白系のブロックなわけです。

でも、カタログをじっくり見ていたら単品販売してました。「ギヤ大 30歯 8ピース」(どうも8個入りらしい)と「タイヤゴム Φ70mm 2ピース」(2個入りらしい)の組み合わせと同じ形をしていました。タイヤゴムはトレッドが入っていかにも倒立振子を比較的楽に安定させるのに必要な路面との摩擦が十分にありそうです。ゴム輪では簡単に滑ってしまいそうな心配があるのと、ギヤードモーターの回転数では十分細かな制御ができそうな径がないということもあります。ゴム輪に対応するプーリーはΦ38mmだそうです。

2015年5月16日土曜日

YosemiteとArduino IDE 1.6.4でStuduinoを使う

Arduino IDE 1.6.4が出ました。そこで、前のエントリと重複しますがStuduino対応にするための手順を書いておきます。

まず、StuduinoはUSB-シリアル変換にProlificのPL-2303TAを使っているので、「PL-2303 Mac OS X Driver Download」のページから最新のデバイスドライバを入手してインストールしてください。

次にArduino IDE 1.6.4ですが、入れてすぐの状態で、一度は起動しておいてください。きちんと確認していないのですが、インストールした状態で(起動せずに)以下の変更を加えたら、なぜだか「Arduino.appは壊れています。ゴミ箱に入れる必要があります。」というダイアログが出てしまいました。逆に、一度でも起動しておけば、以下の変更を加えても大丈夫なようです。

以下、アーテックのライブラリを再度入れてください。Studuino/Studuino.cppに最近変更が入っています。ただし、比較を代入と間違える誤りが、別のところで再現しているので、以下の訂正をしておいたほうがいいと思います。
*** Studuino.cpp.orig 2015-04-07 19:09:40.000000000 +0900
--- Studuino.cpp 2015-05-16 19:29:18.000000000 +0900
***************
*** 813,819 ****
  {
    if(axis == X_AXIS) {
      return bt_result.accX;
!   }else if(axis = Y_AXIS) {
      return bt_result.accY;
    }else {
      return bt_result.accZ;
--- 813,819 ----
  {
    if(axis == X_AXIS) {
      return bt_result.accX;
!   }else if(axis == Y_AXIS) {
      return bt_result.accY;
    }else {
      return bt_result.accZ;
ライブラリの置き場所はお好みで。ご自身のプロジェクトディレクトリのlibraries以下でもよいですし、/Applications/Arduino.app/Contents/Java/libraries 以下でも。

最後にboards.txtの書き換えですが、以前と同様に、以下を末尾に追記する形でよいようです。ファイルの場所は、/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/boards.txt です。
proo.name=Studuino (3.3V, 8 MHz) w/ ATmega168
proo.upload.tool=avrdude
proo.upload.protocol=arduino
proo.upload.maximum_size=15872
proo.upload.speed=115200
proo.bootloader.tool=avrdude
proo.bootloader.low_fuses=0xc6
proo.bootloader.high_fuses=0xdd
proo.bootloader.extended_fuses=0x02
proo.bootloader.path=optiboot
proo.bootloader.file=optiboot_pro_8MHz.hex
proo.bootloader.unlock_bits=0x3F
proo.bootloader.lock_bits=0x0F
proo.build.mcu=atmega168
proo.build.f_cpu=8000000L
proo.build.core=arduino:arduino
proo.build.variant=arduino:standard
proo.build.board=AVR_PROO
他のボードの設定を読むと、1.6.4では新たなプロパティが加えられているようですが、ひとまず以前のまま(これ)で動いています。

2015年4月4日土曜日

YosemiteとArduino IDE 1.6.3でStuduinoを使う

前のエントリを出した翌日にArduino IDE 1.6.3が出たのと、4月1日付けでアーテックのArduino IDE用ライブラリが更新されたので、新たに書き起こします。

ちなみに、「スタディーノとはなにか」は、前のエントリをご参照ください。

Arduino IDE 1.6.3では、ライブラリマネージャとボードマネージャを使う方向が一応完成したようで、1.6.2の混乱した状況は「なかったこと」になっているようです。一応、1.6.2の設定のままでも動くようになっているようですが、将来的にどうなるのかわからないので、思い切って ~/Library/Arduino15 以下は、必要なもののバックアップをとった上でごっそり捨ててしまったほうがよいように思います。

それでArduino IDE 1.6.3を再起動すると、~/Library/Arduino15 以下は以下の内容だけになります。
  • library_index.json
  • package_index.json
まじかよって感じですが、JSONで記述された、それぞれライブラリマネージャとボードマネージャが参照する設定ファイルのようです。

あと、何か設定を変えたりスケッチを編集するなどすると、これまで通りのpreferences.txtもできます。

それで、これらに追記してライブラリマネージャやボードマネージャで対応できるようにすればいいかと思いきや、ボードはArduino IDEのパッケージとして組込みなので、「ボードだけの設定はない」わけです。ライブラリも、アーテックはひとまとめにして提供しているので、簡単に追記というわけにいかない。せめてlibraries以下でないようにしてくれればいいのに。

結局、/Applications/Arduino.app以下が再び整理されて、一通り展開されたものが入っている形に戻ったので、そちらに手を加えればよいことになりました。

まず、boards.txtは、以下のところになりました。アーキテクチャが増えたので、アーキテクチャごとのディレクトリ以下(今回はavr以下)になります。
/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/boards.txt
 このファイルの末尾あたりに以下を追記します。
proo.name=Studuino (3.3V, 8 MHz) w/ ATmega168
proo.upload.tool=avrdude
proo.upload.protocol=arduino
proo.upload.maximum_size=15872
proo.upload.speed=115200
proo.bootloader.tool=avrdude
proo.bootloader.low_fuses=0xc6
proo.bootloader.high_fuses=0xdd
proo.bootloader.extended_fuses=0x02
proo.bootloader.path=optiboot
proo.bootloader.file=optiboot_pro_8MHz.hex
proo.bootloader.unlock_bits=0x3F
proo.bootloader.lock_bits=0x0F
proo.build.mcu=atmega168
proo.build.f_cpu=8000000L
proo.build.core=arduino:arduino
proo.build.variant=arduino:standard
proo.build.board=AVR_PROO
アーテックのライブラリは、新しいセンサ類(Bluetoothシリアル、赤外線リモコン受信器、カラーセンサ、超音波距離センサ、温度センサ、ジャイロ・加速度センサ)のドライバが追加され、APIドキュメントも4月1日付で改訂されています。Webには何のアナウンスもないので、開いてみて初めて気づくという仕様です。

そこで、新しい「Studuinoライブラリセット」(libraries.zip)をアーテックのサイトからダウンロードしてunzipします。すると、libraries以下に、
  • ColorSensor
  • IRremoteForStuduino
  • MMA8653
  • MPU6050
  • Studuino
 の5つのディレクトリができるので、これを
/Applications/Arduino.app/Contents/Java/libraries
以下に移動します。これで完了。もし、以前のライブラリを自分のプロジェクトディレクトリ以下に置いていた方は、そちらを置き換えるか、消しておかないとコンパイラが「ライブラリが複数ある」といってエラーを出しますのでご注意ください。

ついでですが、Studuinoの下のexamplesは消滅したので、Blinkを試すことはできなくなりました。

記憶にあるものと同内容を再現するなら、こうなるかと思います(delay()使っていたのをboard.Timer()に直しました)。
#include"arduino.h"
#include<Arduino.h>
#include<Servo.h>
#include<Wire.h>
#include<MMA8653.h>
#include<MPU6050.h>
#include<ColorSensor.h>
#include<IRremoteForStuduino.h>
#include"Bluetooth.h"
#include"Studuino.h"
Studuino board;
 
void setup() {
  board.InitSensorPort(PORT_A4, PIDLED);
}
 
void loop() {
  board.LED(PORT_A4, ON);
  board.Timer(1000);
  board.LED(PORT_A4, OFF);
  board.Timer(1000);
}
このスケッチをBlinkの名称で保存し、/Applications/Arduino.app/Contents/Java/libraries/Studuino の下にexamplesディレクトリを作成し、そこに移せば「ファイル」→「スケッチの例」 メニューにStuduinoが現れて、以前と同じになります。

2015年3月31日火曜日

YosemiteとArduino IDE 1.6.2でStuduinoを使う(訂正あり)

(追記:2015-04-04 Arduino IDE 1.6.3対応と、アーテックのライブラリ更新について、次のエントリに書きました。以下は参考までにしていただき、新しいほうをご参照ください)



東大阪の学校向け教材メーカー、アーテックのスタディーノ(Studuino)という、Arduinoとモータドライバを一枚にした基板があり、一般向けに秋月共立が取り扱っていることもあり、結構お使いの方がいらっしゃるようで、ブログエントリをたくさん見かけました。

上でショップ名に商品のリンク貼ってるんですが、値段がそうとう違うのは、企業向けと学校向けでボリュームが違うから卸の価格も違うんだろうと。どっちがどっちかは想像にお任せする感じで。

スタディーノはクロック8MHzのATmega168、USB-シリアルにProlificのPL-2303TAを使っていて、モータドライバ(Toshiba TB6552FNG)と大量のピンヘッダやコネクタ分の価格を、CPUのスペックを落としたり安価なUSBデバイスを使うことで補っている雰囲気なのが特徴かと思います。(商品紹介ページ

ピンヘッダが大量にあるのは、通常のピンソケットとは別に、すべてのI/Oに電源ラインがセットになっていて、3ピンソケットのケーブルで入出力デバイスを接続できる設計だからです。カタログを教材販売店からいただいたのですが、以下のモジュールが専用品としてラインナップされていて、プラスチックブロックに入っており、他にキューブ型などいろいろなプラスチックブロックの組み立てでロボット風味の工作ができるように考慮されています。レゴっぽいといえばそうかもしれない、というところです。

ちなみに上からサーボモータまで全部盛りセットは「Robotist Advance」になるので学校関係の方でいろいろ試してみたい方(特に加速度センサが必要な方)におすすめしておきます。「計測と制御キット」のシリーズや「うきうきロボットプログラミング」のセットには加速度センサが入っているものはいまのところないようです。
  • タッチセンサ(押しボタン風味。ストローク5mmぐらい)
  • 圧電スピーカ
  • LED(赤、緑、青、白)
  • 赤外線フォトリフレクタ(Rhom RPR-220
  • フォトトランジスタ(Siemens SH309)
  • 音センサ(ECM+アンプIC、現物がないので未確認)
  • 加速度センサ(Freescale MMA8653FC
  • DCモータ(ギヤードモータ)
  • サーボモータ(いわゆる超小型サイズでトルク3kgらしい)
  • 温度センサ(Microchip MCP9700
  • 赤外線リモコン受信器
  • カラーセンサ(AMS-TOAS TCS3414CS)
  • 超音波距離センサ(HC-SR04)←Parallax Inc. "Ping))"の中華コピーの代表かと
  • ジャイロ・加速度センサー(Invensense MPU-6050
  • Bluetoothシリアル(Robotech RBT-001)―プラスチックブロックなし
  • 技適なしBluetooth 2.0+EDR←...

上記パーツはどれも基板に実装されていて、日圧のPHの4ピンソケットがついてます。実際に使うのは2〜4ピンなわけですが、スタディーノ側が3ピンソケットになったケーブルを使い、4ピンはI2C接続のみなので、3ピン2列のソケットでA4, A5, VCC, GNDに接続することになるわけです。専用ケーブルは一応I/Oラインはグレー、電源は±どちらも黒、になっていて逆刺ししないよう色で区別するようになっているので念のため(僕は最初間違えてから気づきました)。

DCモータ端子も外部電源端子もPHの2ピンです。モータと電源の関係では、モータ用電源とロジックの電源は小さなダイオード通して共通(ロジック側はレギュレータで3.3Vにしている)なので、モータドライバの発熱を心配するほどの使い方は考えられていないと思います。純正電池ケースが単3形(AA)電池3本用なので、アルカリ電池で4.5Vとか二次電池で3.6Vとか、そういう使い方の範囲にとどめて、たくさん電流流したい人はシールドの利用を考えるべきでしょう。また、サーボの電源もモータと共通です。

普通のArduinoと言われるUnoは、クロック16MHzのATmega328、USB-シリアルはATmega8U2というUSBつきの小さなAVRを使ってCDCクラスのデバイスを実装しているので、Mac OS XやLinuxではドライバのインストール不要で勝手にデバイスが生えますが、スタディーノはメーカー製チップを使っているのでメーカーのデバイスドライバが必要です。

前書きが長くなりましたが、そういうわけで、YosemiteとArduino IDE 1.6.2で使うためのメモを書いておこうと思いました。

まず最初にはまるのがデバイスドライバだと思います。Prolificは昔いろいろと苦労させられた方が多いと思いますが、なにかあったら、最新のデバイスドライバを探すことが第一だと思います。その際、末尾の型番がいろいろありますが、スタディーノで使っているのはTAなので、以下のリンクから、TA対応の最新版をダウンロードしてください。アーテックのダウンロードページにあるものは最新とは限らないです。(いま現在掲載されているものでもYosemiteでも動くらしいですが、僕のところではデバイスが生えませんでした。バージョン番号はかわっていませんが、plistの変更があったのかもしれません)
Prolific PL-2303のページ
初めてProlificのドライバを入れる方への注意ですが、Mac OS Xの場合kextなのでkextloadコマンド叩けばいいはずなのに、インストーラはマシンを再起動させます。なんとかならんものか。

アーテック側で用意されている、Scratch 1.4を魔改造(ほめてます)した開発環境にはArduinoのコンパイラとライブラリが入っているので、Scratchでプログラムする分にはこれ以上特に考えなくてもわりとサクサク動いて面白いのですが(ダウンロードページにScratchライセンスとGPLv2ライセンスでソースコード全部が置いてあるので読むと楽しいです)、Arduino IDEを使うには、作業が必要です。

アーテックのページには、Arduino IDE 1.0.5を使う方法が書いてありますが、こちらはAdafruit版やらいろいろ入っているせいかどうも動きがおかしく、これを書いているいま最新の1.6.2で使えるようにしました。

まず、標準のArduino IDEはこのボードを知らないのでboards.txtに追記が必要ですが、1.x(0以外)以後は構成がかわったようで、ユーザのホームディレクトリ側を書き換えればよいようです(「ツール」→「ボード」→「Boards Manager...」というメニューがありますが、使うのは1.6.3以後を待て、のようです)。以下のところにありました。
~/Library/Arduino15/packages/arduino/hardware/avr/1.6.2/boards.txt
で、この末尾にでも、以下の内容を追記します。
proo.name=Studuino (3.3V, 8 MHz) w/ ATmega168
proo.upload.tool=avrdude
proo.upload.protocol=arduino
proo.upload.maximum_size=15872
proo.upload.speed=115200
proo.bootloader.tool=avrdude
proo.bootloader.low_fuses=0xc6
proo.bootloader.high_fuses=0xdd
proo.bootloader.extended_fuses=0x02
proo.bootloader.path=optiboot
proo.bootloader.file=optiboot_pro_8MHz.hex
proo.bootloader.unlock_bits=0x3F
proo.bootloader.lock_bits=0x0F
proo.build.mcu=atmega168
proo.build.f_cpu=8000000L
proo.build.core=arduino:arduino
proo.build.variant=arduino:standard
proo.build.board=AVR_PROO
 アーテックの用意しているboards.txtに加えて、proo.upload.tool=avrdudeを書かないと、「書き込むツールがわからん」と言って転送エラーで止まります。proo.build.board=AVR_PROOについては大阪電気通信大学の兼宗先生からご教示いただきましたが、たしかに他のボードに倣って追記しておいたほうがよさそうです。

そのあと、アーテックのページにある「Studuinoライブラリセット」のzipを展開して、プロジェクトディレクトリ下に作ったlibrariesなり、/Applications/Arduino.app/Contents/Java/libraries 以下なりお好みのところに移動します。これで完了。

サンプルとしてBlinkが用意されているので、「ファイル」→「スケッチの例」→「Studuino」→「Blink」を開いて、コンパイル、書き込みができることを確認してください。このサンプルはA4で点滅するので、A4端子にLEDを接続する必要があることに注意、です。下手にArduinoの経験があるとD13が点滅するんだろうと思ってしまいますが、スタディーノの流儀にしたがい、APIドキュメントにしたがって書かれたスケッチです(そのわりにboard.timer(1000);でなくdelay(1000);なのはなぜだろう、とか思わない大人になりたいです)。

というわけで、ひとまずセットアップについて書いてみました。