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だそうです。