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);なのはなぜだろう、とか思わない大人になりたいです)。

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

2014年11月10日月曜日

MacでownCloud

結論:

  • MacでownCloudは動く。ただしファイル名の扱いに注意(特にフォルダ作成はトラブルが生じうる)
  • MacPortsかHomebrewで入れたPHPとそれをCGIとして呼び出すWebサーバ(SSL証明書が必要)があれば、Webサーバの文書ディレクトリにソースを展開するだけ
  • SQLite3とPHPのsqlite拡張を入れればDBサーバ不要でさらに簡単


Bitcasaの実質値上げで、自分用に置いていたいろいろ自炊データなど1.4TBを引き上げているところなのですが、結局なぜクラウドを借りるかというと、HDDを増設することなく全部のデータを一貫して取り扱いたいわけで、そこに「定額・目安は1TBだけれど超えてもOK」というBitcasaは最適だったわけです。

ところが噂によれば、ペタバイト置くごく少数の客が使うだけで、1TB年額$100という見積りに沿った客がほとんどつかなかったから、1TB制限で年額2万円、それ以上は要お問い合わせという形でバランスとることになったというんですが、例えていうならば、ドリンクバーのみで何日も泊まりこむ客しかいない飲食店のような殺伐とした状態という話で、それではテコ入れやむなしと思った次第です。

ちょうど年度更新の時期で請求に身構えていたところなので、東芝の3TB 3.5" HDDが特価1万円弱の表示品(あとで税込み請求されてがっかり)を購入、ガワも買ってなんだか結構な出費になったものの、引き上げ準備ができて、通信制限と11月15日という期限におびえながら、できるところまでやってみようとしているところです。1.4TBを1ヶ月でダウンロードするのは結構勇気が必要です。アップロードは「次やったら契約解除するかんな」とISPから警告文書を郵送で頂戴したので、まあそのときは秒速4MBぐらいで一日かけて90GBぐらいクラウドにscpしたのでしょうがないんですが。

クラウドドライブのサービスでなにがいいかというと、僕としては、モバイルアプリでファイルの一覧が簡単にみえるところです。あれはもうあったかな、というのがすぐ確認できるところ。WebDAVでもいいけれど、閲覧性は専用アプリが上。GoodReaderとか正論をいう人は置いていきます。

というわけで、ownCloudです。以前、VPS上のFreeBSDで動かそうとして断念した記憶があるのですが、モバイルアプリ含めてトータルに使うとなると、軽く調べた範囲ではこれしかないのかな、という印象でした。

Community Edition」が無償で使えるサーバ側のソースなんですが、ダウンロード時に要件をみると、「Mac OS XはUNICODEの扱いに問題があるのでサポートしない」とあって、困ったな、と検索すると、なんだかバイナリを配布しているところがあって、でもそれ入れてみると勝手にApacheとMySQLを起動しようとしてすでにこのMacではNginxとMySQLが動いているのでエラーになったりして悲しい思いをしたりします。ownCloudのバージョンで、過去にMac OS Xサポートがあった頃があるのかと調べても、以前からサポートされていないし、将来的にやる気もないようです。

で、そのバイナリ配布元の文書を読むと、「うちはソースコードに一切手を入れていないから問題があったら開発元に言え」というわけです。ということは、Community EditionのソースはMacで使える。UNICODEの問題はあるけれど。

UNICODE云々というのは、WindowsからMacの共有フォルダにある日本語ファイル名をみるとすぐわかるわけですが(最近は事情が違うかもしれない)、Mac OS Xでは日本語の濁点、半濁点つきのひらがな、カタカナなどは、親文字に対してそれらとの合字で表現していて(つまり、親文字、合字指定、濁点等の3つで1文字を表す)、濁点や半濁点つきのグリフのコード(ひとつの文字)を指さないという、合理的なんだか不合理なんだかわからない方針で実装されているわけですが、これ奇妙なことに、ターミナルで日本語変換してファイル名入れると、日本語IMから入力する文字コードは正規化されたほう(合字でない、独立したグリフに対するコード)になるので、存在するファイル名とは表現が一致しなくて「File not found」、つまりMac OSのなかでも不整合があったりします。純正IM使ってないのでそっちはファイルシステムとあってるのかもしれないですが。それで、かつてのMacとWindowsのファイル共有の場合のように、合字指定を表すコードを単純に読み飛ばしてしまうと、親文字と濁点がわかれてしまい、半角カナを全角に引き伸ばした感じの間抜けな表示になるわけです。

ownCloudのGitHubリポジトリのissue trackでは、ドイツ語のウムラウトの処理不整合で作成したフォルダが二重に見えたり、クライアントによってはそもそもフォルダ作成さえできないんだそうで、これは合字の扱いと正規化がもたらす不幸と直感するわけです。欧州のそうした文字でも、たしかにUNICODEでは合字でもよいものの、ウムラウトやアクサンなどがついたグリフとコードポイントもあるわけで、事情は日本語と同じだし、欧州全体では結構深刻だな、と思うところです。

当方の目的としては、既存ファイルの一覧がアプリからサクサクと見えればいいので、「データ」が「テ〝ータ」になろうが、別によくって、それならGo!というわけです。(結論を先にいうと、iOSアプリではこうならなかったので、Apple製品で閉じている限りはよさそう)

FreeBSDで苦労した頃はまだ出たてで、いまと構成が違うのかもしれないのと、こちらのスキルもいまと違うのでよくわからないのですが、ひとことでいうと、ownCloudはPHPアプリでしたと。つまり、特にコンパイル等の必要はなく、PHPに必要な拡張があって、SSL証明書つきのWebサーバがあればとても簡単だ、ということでした。

Mac OS X標準のPHPは長いこと使っていないので事情はわかりませんが、MacPortsやHomebrewで入れて運用しているPHPとそれをCGIとして使うWebサーバがあって、SQLite3とPHP-sqlite拡張が入っていれば(他にもgdとかいくつか拡張は必要ですが)、MySQLも使わないでさっくり動きます。

今回動かすまでに苦労したのは、すでに運用しているPHPアプリと証明書を共有するためサブディレクトリにaliasしようとしたら、よくある「FastCGIでPHPファイルのフルパスが間違って渡される(その結果、No input file specifiedの文字だけがブラウザに出る)」というところで、解決を諦めて、PHPアプリの本当のサブディレクトリに置いてしまったところ、ぐらい。正規表現が微妙に働いて、ownCloudから親のアプリに飛ばされることがあるけれど、iOSアプリでファイルを閲覧するには問題がないのでよしとしています。

結局、配布されているソースコードを所定のディレクトリに展開して、あとはWebブラウザから、そのディレクトリを指すURIを開いてやれば、管理者アカウントを作成する画面が開いて、それで設定完了、すぐ使えます。SQLiteのデータベースも小さくて、いい感じです。アップロードはPHPのファイルサイズ制限に引っかかるので(むやみにでかい値を設定すればいいというものでもないし)基本的にはしない前提で、Bitcasaから引き上げた外付けHDD内のデータがあるサブディレクトリをownCloudのアカウント用データフォルダ内にシンボリックリンクしてやると、ほどなくアプリから見えるようになって、目的は達成できました。

書き込みもするなら、シンボリックリンク先もユーザ「_www」で読み書きできないとまずいはずですが、とりあえずファイルの存在をみるだけならなにもしないでもOK(ユーザ「_www」から見えればよい)。

話を簡単にするポイントは、データベースはSQLiteを使うこと。MySQLやPostgresqlも使えるけれど、SQLite拡張をPHPに入れれば、ownCloud初期設定時に無条件でSQLiteを使うのでDBサーバに関する余計な作業がさっくり省略できます。

書くほうはどうするんだという話ですが、アプリで書き込みができるか試していないけれど、英数字のファイル名やフォルダ名なら大丈夫だろうということと、外部HDDへファイルを置くのはモバイルからは考えずに画面共有で普通にMac内の操作するか直接scpするので気にしない方針です。

2014年10月19日日曜日

YosemiteでMacPortsをコンパイルするにはXcode 6.1を入れる

Yosemiteいいですね。そういえば、6月以後、全くよそごとに手がつかなかったので、WWDCの録画も、iPhone 6などの発表イベントも、先日にイベントも、なにも見ていなかったんですけど、昨夜ようやく通して観まして、それで知ったんですが「Yosemite」は「ヨゥーセミリィ」と発音するんですね。

いや、アメリカは去年3回行って、大陸横断する感じで都合結構な滞在期間だったんですが、ほとんど観光らしきことしてないんで、いわゆる観光地のことは全然知らないんです。逆に庶民とか貧困な人たちの生活感覚みたいなのはすごく身体に入ったというか、普通の観光客や企業の海外滞在なんかでお膳立てされた生活している人よりよっぽどアメリカ人化したかもしれない。その勢いで語ると、Apple本社所在地の「Cupertino」も人によって違うけど、だいたい「クパーティノ」か「キュパーティノ」でして、辞書に載ってる「クパチーノ」はメヒカーノ(メキシコ人、つまりスペイン語)に近いんだと思うわけです。

あ、すみません、枕が長すぎました。でもまだ枕が続くんですがすみません。

そのMac OS X 10.10 Yosemiteなんですけど、9月に突然MacBook Air (mid 2011)のSSDがおかしくなりまして、家人拝み倒してMBPの、SSDが128GBでRetinaであること以外は最低スペックのを急遽購入させていただいたので、偶然空いた(Target Disk Modeでは起動できたので、Thunderbolt経由でマウントして内容を移行したあと、MBA側のパーティション壊して再フォーマットし、Internet Recoveryかけてやったら、一応起動した)MacBook AirがあったのでPublic Betaに参加しつつ、全くフィードバックせず、無事先日の公開となりました。

さてようやく本題です。

実は最終のPublic Betaでは、Chromeの安定版が数分固まることがあるという不具合があったんですが、固まるだけでほっとくと元に戻るので、Googleに報告すべきなのかAppleに報告すべきなのか判然としないまま、まあいいや緊急事態ではないから、という感じでありましたが、さすがに公開版のYosemiteではそんなことはありませんでした。「iOS 8公式魔改造の結果大炎上」(とまでは言ってないけど、先日のプレゼンでTim CookだったかCraigだったか忘れてしまいましたが『feedback』を苦笑交じりに連発する形でいいいわけしてましたね)に乗じて「人柱乙」と半笑いの人たちもおりますが、全く問題ないと思っております。

ただ、App Storeに載って大人気とかでもない限り、普通のサードパーティはしょうがないわけで、MacPortsも数日遅れのYosemite対応でありまして、少なくともいまのところは問題が若干あります。

まず、OSのバージョンが上がると全部コンパイルし直す感じになる(いままでそうでなくて済んだんだけど、最新の2.3.2では強制でそうなる)わけですが、CMakeのコンパイルで止まります。検索するといっぱい出てくるんですが、エラーの内容は、

Mac OS 10.10のSDKがないぞ
なわけです。

えっ、と思って入っているXcodeのバージョンをみると6.0.1で、Mac App Storeの最新もこれなんですが、iOS 8とSwift対応はしているのですが、よくみるとターゲットSDKは10.9、つまりMavericksなのです。

それで検索してみると、どうもXcode 6 betaのどこかで10.10のSDK入りがあったようで、ここからダウンロードしろというわけですが、

Xcode 6.1 available shortly
でありまして、そこに、「latest OS X and iOS SDKs」と添え書きがあって不安になるわけです。

しかし、意を決して「Additional Tools」の「View downloads」を選択すると、トップに「Xcode 6.1」があり、説明にもbetaとかGMとかそういうのはなくって、どうも公式っぽいです。が、Mac App Storeにある最新は6.0.1。

それでも、こちらはupgrade途中で環境が壊れて困っているので、そのままdmgをダウンロードして置き換えて、

sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
sudo xcode-select --install
なんかしてあげて、Command Line Toolsも10.10用に設定してあげると、無事コンパイルが進んでいるようです。

というわけで、いま泣いている人は試してみてください。

ちなみに、Xcode 6.1はいま現在、日本語ロケールに対応した表示がありません。メニューその他、表示は全部英語です。だから日本向けには公開されていないのかな、と思います。

2014年7月26日土曜日

Raspberry PiのGPIOソケット直結のArduinoを自作してみた

Raspberry Piから、「Arduinoのプログラムと同じように書いて、Arduinoのシールドをそのまま使えるようにする拡張カード」は結構出ているようだ。重要なのは、Arduino用のシールドとして販売されている基板をRaspberry Piから利用するということで、Arduinoそのものが途中にいるわけではない。
商品として、せっかくのRaspberry Piの機能を犠牲にして間にArduinoをはさむような間抜けなものは出したくない、というのは当然だと思うし、使いたいのはシールドになっているセンサーその他のデバイスであってATmegaマイコンではない、のが普通だと思う。

というわけで、その「普通ではないほう」をやりました。といっても、Arduino IDEからプログラムするほうはまだできていないので、中間報告というか、ざっくり「ドリトルの教科書に書かれている、『Arduinoの利用』」がそのまま使えるようにしました、ということであります。

ドリトルはArduinoとはシリアル通信するので、Raspberry PiのGPIOにせっかく出ているいろいろな端子は全く使わず、電源とシリアルのみを使うという豪勢なんだか貧乏なんだかわからないソリューション。

回路は、Arduino Unoから電源関係とUSB関係を取り除いた、ATmega328P周辺と、レベルコンバータがわりの分圧抵抗だけという簡単構成。というか、手ハンダで受講生人数分を揃えるのに余計な作業は避けなければならないという事情。

基板は、いわゆるバニラシールド基板でよいわけだけれども、試しに秋月が扱っている長方形のユニバーサル基板(200円)を使ってみることにした。というのは、秋月オリジナルのバニラシールドは、USB B端子などにあたる部分はスルーホールにせず、SMD用パターンにして「うっかりミス」に配慮されているのだけれど、僕はArduinoそのものを作るので、基板全体を使いたいということ、特に、今年は多分間に合わないけれど、モータドライバICを載せるスペースを確保しておきたいという希望があったから。ただし、その長い部分はV字カットが基板に入っており簡単に折れるよう配慮されているので、それをまたぐようにGPIO用2x13メス端子を取り付けて折れないようにした。

ATmega328Pへのブートローダー及びドリトル用スケッチの書き込みは、手持ちのAVR ISP mkIIを使って、手持ちのUnoのATmegaを差し替えながら直接書き込んでおいた。なんだか普通じゃないと感じる人は正常で、あとで説明するけれども自作Arduino(USBなし)基板はシリアル関係で問題を起こすので、ISPから直接書き込むのがいちばん安定していたから。ブートローダーはUno用で全く問題がない。optiboot優秀です(Uno R3以後のもの)。FTDIかどうかに関係なく、きちんと書けます。

とりあえず第一号
第一号機はご覧のとおりであります。GPIOの端子を前後逆につけてしまったので、Arduino部分はRaspberry Piの基板の外に出てしまったけれど手遅れなのでこれはこのままとする感じ。

それで、何度やってもシリアル関係がどうにも正常に通信できず何日も悩んでいたのだけれど、値段をけちってセラロックにしていたのを、ふと思い立って横に作ってあったクリスタルのブレッドボード用基板をつないだらあっさり解決してしまいました。

秋月の値段ならセラロックをわざわざ選ぶ意味はないのだけれど、基板等の発注時にクリスタルを入れるのを忘れていたので、大須で調達しようとすると、国産品だと120円とかするのでひよったのが失敗の原因だったのか、なにか別の偶然だったのかはわからないわけですが、シリアルまわりで他と通信する可能性がある場合にはクリスタルを選ぶのをとりあえずおすすめしておきます。セラロックのときはFTDIとさえ通信できなかったんで、ハズレのセラロックだったのかもしれないけれど、ある種の教訓として心に刻むことにしました。

せっかくなので、ドリトルとお話ができている状態のビデオも掲載しておきます。


アナログポートにはなにもつながっていないので適当な値が出るのですが、この速度で実行できるのはOracle Java SE 8のおかげです。OpenJDKではこの3分の1以下の速度になってしまいます。

それで一応、Eagleで回路図と両面基板のレイアウトなんかもしたのでつけておきます。時間ないのにバカじゃないかと自己嫌悪するわけですが。

いま回路図みたらなんか一部壊れてますな。それはともかく、右の謎パーツは、SparkFunがEagle用ライブラリとして提供しているシールド基板でして、これを置くと、基板レイアウトのときに、シールド基板内部に部品が収まるように配置できてちょっとうれしかったりするわけです。左はGPIO端子です。GPIO 17をDTR(書き込み完了等のリセット)に使えという話なんで、そうしてます。

超適当に書いた回路図

それなりにがんばってみた基板レイアウト
GPIO用ソケットの1番ピンがへんなところに行ってますがこれは裏返したり回転したりしているうちにこうなっただけで、ワイヤの配置はたぶんあっているはずであります。

それと、受動部品とLEDがSMDになってるのはもちろんスルーホールがめんどくさいからでして、ユニバーサル基板でもこれからは手持ちのSMDパーツを使っていく予定です。ATmegaがそうなっていないのは、作った基板間違ってたとかの非常時でもCPUを救出できるようにしたかったからであります。自信あればTeensy互換(USB内蔵のATmega使用)とか余裕ぶっこきの設計にしてもいいんですけどね。

2014年7月18日金曜日

完全設定したRaspbianもしくはSDカードの内容のバックアップ方法

Raspberry Pi用に作成したSDカードだが、さまざまなカスタマイズを加えたものを増産したいという場合に、SDカード全体のイメージファイルを作成して別のカードに書く、ということを考えるかもしれない。しかし、市販されているSDカードの容量は意外と末尾が微妙に異なっており、あるカードから作ったイメージが別のカードに入らないことが往々にして生じる。
また、そもそも未使用部分が多いであろう場合に、カード全体をイメージにするのが適当なのだろうか、という素朴な疑問もある。

そこで、日本Ejectコマンド研究会会長にしてRaspberry Pi界の重鎮である、あっきいさんが書かれた、「NOOBS用カスタムOSイメージの作成」に触発を受け、実験してみたところうまくいったので報告しておく。

前提としてここでは、なにか別のSDカードに複製したい、オリジナルのSDカードがあり、さらに未使用もしくは再度利用する可能性のないSDカードがもう1枚があることを前提とした記述とする。

このためには、ext4ファイルシステムを理解するOSということで、Linuxマシンが必要となる。僕はUbuntu 14.4のマシンを用意した。

Ubuntuマシンに、オリジナルのSDカードを挿入すると、自動的に各パーティションすべてを一気にマウントしてくれる。それはつまり、bootパーティションであり、rootパーティションである。rootパーティションは、Raspbianのバージョンにも依存するかと思うけれど、6月20日版の場合、rootパーティションにはラベルがなく、 UUIDが直接マウントポイントになってしまう。

ここで、以下のようなコマンドを入力する。
# cd /home/xxxx/boot ←xxxxは自分のユーザ名
# tar cvpf ~/boot.tar .
# cd ../root  ←もしくは長いUUIDのフォルダ名
# tar cvpf ~/root.tar .
内容まるごとUbuntu側にバックアップすることになる。

次に、新しいSDカードにそれを入れたいのだが、Raspbianの設定に合ったパーティションの設定しなおしから始まる。

gpartedは、Linuxでは非常に便利な、ディスクパーティションエディタだと思う。Ubuntu側にapt-get install gpartedで入れておく。

最初はOSがSDカードをマウントした状態で、gpartedを起動する。すると、ドライブを/dev/sdbに切り替えられるので、ここでようやく[パーティション]→[アンマウント]でマウントを外してパーティション設定ができるようになる(外さなくてもできるときもあるようだけれどあまり深く調べていない)。

Raspbianのパーティション構成は、以下の通り。

  1. 先頭4MB―未使用
  2. 56MB―bootパーティション(fat16フォーマット)
  3. 残り(4GB SDカードなら、3260MB)―rootパーティション(ext4フォーマット)
  4. 未使用が若干残る
この構成でパーティションを切り直せば、新品のSDカードであってもあとは簡単だ。

バックアップした内容を、SDカードに書き込む。
# cd /media/ユーザ名/boot
# tar xvpf ~/boot.tar
# cd ../root ←もしくはUUID名。UUIDだと見づらいから、パーティションを切るときに「root」のラベルを付けておくとよいと思う。
# tar xvpf ~/root.tar
これであとは、syncでもなんでもしてSDカードをアンマウントして、Raspberry Piに挿し直せばすぐに起動することができる。おそらく、4GBより大きなSDカードに対しても有効だと思う。