2014年3月30日日曜日

C/C++ 処理の流れ その1

コンピュータでは色々な計算をして、適切なタイミングで計算結果を表示したり、音にしたりでI/Oに出力します。

その処理の流れには主に以下があります。
  1. 逐次実行
  2. ジャンプ
  3. サブルーチン
  4. 条件分岐
  5. 繰り返し
  6. 並列実行

逐次実行


逐次実行は一番基本的な処理の流れで、順番に処理をこなしていくだけです。C/C++言語も最終的にはCPUにおいて機械語で命令が実行されますが、音楽の手拍子のように決まったタイミングで命令が実行されていきます。この手拍子の速度がクロック周波数と言われるもので、基本的にはクロック周波数が速いということになり、パソコンの速度を示す指標に使われます(実際には1回の手拍子で2つの命令を実行することができたり、クロック周波数だけで速度は決まりません)。

C/C++言語では、基本的な実行は逐次実行となります。演算において、

    a = b + c + d;

とあれば、b と c の加算を行い、その結果と d の加算を行い、その結果をaに代入すると順番に実行されていきます(演算の順番については演算の優先順位と言うものが存在し、その順で実行されていきます)。

また、以下のように

    処理1;
    処理2;
    処理3;

とセミコロンで処理を分けた場合にも順に処理1、処理2、処理3と順番に実行されていきます。

ただし、処理が関数の場合、関数の中で並列実行がされている可能性があり、その場合は処理2が完全に終了する前に処理3が行われるケースもあります。最近のWindows8での Windows Store アプリ用の関数(WinRT API)は並列実行が基本となっているので注意が必要です。

ジャンプ


ジャンプは、処理を別の場所に飛ばすことになります。通常は後述の条件分岐と一緒に使うことになります。

C/C++言語では

 goto ラベル

とすることで、ラベルの位置にジャンプします。例えば以下のプログラムではlabel5というのがラベル名です。コロン(:)を付けることでラベル名であることを示します。

#include <stdio.h>

int main()
{
        printf("1\n");
        printf("2\n");
        goto label5;

        printf("3\n");
        printf("4\n");

        label5:
        printf("5\n");
        return 0;
}

このプログラムでは、1,2と表示したところで、label5にジャンプするので、3,4は表示されずに5が表示されます。

関数をまたぐ場合にジャンプを使用するには、setjmp.hを使用して、setjmp()関数、longjmp()関数を使用します。

C/C++言語では、構造化プログラミングと言って、処理を階層的に表し、入口と出口をはっきりさせる記述方法が奨励されており、その立場ではジャンプはあまり好ましくない手法とされています。しかし、使い方によってはよりプログラムを分かりやすくする場合もあり、一概に悪いとは言い切れないです。初心者はまずは使わない方が良いでしょう。

サブルーチン


プログラムを見やすくするために処理を一つにまとめたものをサブルーチンと言います。プログラミング言語によっては、単に処理をまとめた「サブルーチン」と、返り値を必要とする「関数」を別に扱う言語もありますが、C/C++言語では「サブルーチン」と「関数」は同じ扱いになっています。下記がその例で、func1とfunc2のサブルーチン(関数)を使っています。

#include <stdio.h>

void func1(void);

void func2(void)
{
        printf("func2 1\n");
        printf("func2 2\n");
        return;
}

int main()
{
        printf("main\n");
        func1();
        func2();
        printf("main end\n");
        return 0;
}

void func1(void)
{
        printf("func1 1\n");
        printf("func1 2\n");
        return;
}


main()関数からfunc1()関数とfunc2()関数に処理が飛び、それらの関数からreturnでmain()関数に戻ってきます。C/C++言語ではジャンプより、このようなサブルーチンを使って処理を移動することが奨励されています。

なお、func1, func2の前にあるvoidが返り値が無いことを示しています。return文でも返り値を書いていません(このように返り値が無い場合にはreturn文を省略しても良いです)。

また、main()関数で、func1()関数が使用されていますが、func1()関数はmain()の後ろに書かれています。C/C++言語は上からプログラムが解釈されていくため、main()関数で突然func1()関数が出てきても理解できません。そのため、3行目でfunc1()という関数がどこかで書かれていることを示しています。

注意点としては、サブルーチンは機械語的になったときには、スタックというメモリ領域に返り値が覚えられるため、サブルーチンを入れ子にして使いすぎるとメモリをたくさん使用してしまう問題があります。


return文でのジャンプ


上述のように関数(サブルーチン)を終了するときには、return文を使用します。return文は処理の最後である必要はないですし、数も一つの関数に一つというわけではなく、いくつ書いても構いません。

しかし、構造化プログラミングの、一つの入口に一つの出口の観点からは関数においてreturn文は最後に一つにすべきとのルールもがある場合があります。実際にそのように作った方がリソースリークという問題は起きにくいです。

ただ、このルールもやり過ぎるとネストが深くなったり、かえってプログラムが見にくくなる場合もあります。

個人的には引数のエラーチェック等を関数の初めの方にに行い、エラーを返すような場合には、途中のreturn文を書いていいと思っています。そして、何より関数の行数を長くしすぎないことが重要です。

条件分岐処理や繰り返し処理はまた次回。


2014年3月17日月曜日

RAPIRO(ラピロ)

RAPIRO(ラピロ)というロボットを購入してみました。

ロボットというとディアゴスティーニの週刊ロビが有名かもしれません。ロビに比べてラピロは以下のような特徴があります。
  1. 安い(ラピロは約45,000円、ロビは全部で約150,000円)
  2. 組み立てが簡単(ラピロはモーター数が12軸、ロビは20軸程度らしい)
  3. シンプル(音声認識、会話、ゲーム機能など一切なし)、初期の動きも8種類のみ。
  4. Raspberry Piが搭載できる
  5. 勉強用(プログラミングが可能)
目的はロビと違っており、ロビがロボット自体を楽しむことに主眼が置かれているのに対して、ラピロは5番にあるように、ロボットを勉強することに主眼が置かれています。

さらに、Raspbery Piが搭載できたり、モータ制御にはオープンソースハードウェアであるArduinoが使用されていたり、パーツを3Dプリンタで作成出来たりと汎用性を最大限に考えられています。

悪く言えば、機能はロビに比べて非常に劣っていますが、勉強し、工夫することによっては色々なことができるようになる可能性を持ったものがラピロと言えるかもしれません。

ラピロの購入に際して


ラピロ自体はAmazonやスイッチサイエンスから購入が可能です。

組み立てにはNo.0,No.1のプラスドライバーが必要です。奥の細い所のネジ締めをするところが数カ所あるので、軸の長さが少し長めのがあった方が良いです。また少し力がいる所もあるので、グリップは太めの方がいいです。

また、単3電池5本が必要ですが、大きな電流が必要なようで、eneloopが奨励されています。私の場合通常の単3電池ではモーターが動かなかったため、下記の8個入りのeneloopを買い足しました。


ラピロを組み立ててみる


組み立て方法については、公式サイトに詳しく書かれているので、ざっくりと感想を含めて書いてみます。

中身全部は以下のようになっています。ガンダムなどのプラモデルより簡単そうに見えます。



まずは、モーターにシールを貼っていきます。大きいモータ6つ、小さいモーター6つにモーター側と端子側で同じ名前のシールを貼っていきます。大きい方には青いシールを小さい方にはピンクのシールを貼ります。なかなか綺麗に貼ることができず、いらついてしまいましたが、だいたい15分ぐらいです。


次は電池ボックスを組み立て、モータを接続し、軸の位置の初期化を行います。ここで公式サイトの説明ではモーターを全部繋いているのですが、とりあえず使った電池ではウィーンと音が鳴り続けて軸が動作する様子がなく、結局2つのモータずつをつないで初期化することにしました。上手く初期化されるなら一瞬で軸は動作します。抜き差しを何度もしたためか20分ぐらいここで、かけました。



ここまでが準備で、本体の組み立てに入ります。まずは腰にモーターを3つとりつけ、その後に、足を取り付けて足の中にモーターを2つ入れます。モーターのネジ締めは締め過ぎるはダメとのことですが、グラグラしなければOKと思っています。足の中のモーター取り付けは少し苦戦しました。モーターの軸を初期化した位置から回転させずに理想の傾きで取り付ける必要があるためですが、私が不器用なだけで普通は問題ないと思います。50分ぐらい掛けて、腰下が完成です。


次に、腰の上に胸を取り付け、肩のモータを取り付け、腕を取り付けます。いきなり写真が完成に近づくのは、作るのに夢中になって写真を撮り忘れたためです。腕の辺りは苦戦はしませんでしたが、後から後悔することが2点ありました。一つは肩パーツの取り付け位置。公式の説明では「水平にはめ込めない場合は、後ろ手になる側に傾く角度で」とあるのですが、意識して後ろ手になる側に傾く角度で取り付けたほうが良かったです。もう一点はモーターを取り付け間違えたところです。きちんと確認したつもりだったのですが・・・。結局腕を作りなおして時間ロスすることになりました。ここでは40分ぐらいの時間が掛かっています。



そして、Arduinoの胸部に基板を取り付け、その基板にモーターを接続、背中にバッテリーを接続して、胸部の蓋を閉めます。モーター線が多いので挟まないように胸部に収めるのが少し難しいです。完成が見えてきました。ここで先ほど失敗した腕の作り直しも含めて50分ぐらい掛かっています。


残りの頭部は難しい取り付けもなく、20分ぐらいで完成です。


不器用な私でもだいたい3時間ぐらいで組み立てることができました。失敗などがなければもっと早く組み立てられたと思います。

Arduino IDEを使ってラピロを動かす


パソコンとラピロをつないで、プログラムを書き込んだり、指示をすることでラピロが動きます。プログラムを書き込むにはArduino IDEというソフトウェア開発環境を使います。まずは、Arduino IDEをインストールします。

Fedoraの場合は以下でインストール完了です。ドライバはインストールする必要は無かったです。Ubuntuでもyumではなくapt-getコマンドを使えば同等と思われます。FedoraでArduino IDEを起動したときに、dialoutとlockの権限の追加を聞かれた場合には、Addで追加してログインしなおしてください。

$ sudo yum install arduino

Windowsの場合には、Arduinoのダウンロードページから、最新版のWindows Installerをダウンロードして、インストールします。

ラピロの背中にあるmicroUSB端子からUSBケーブルでパソコンに繋ぎます。スマホとパソコンを接続するときにケーブルがそのまま使用できます。つなぐとラピロの目が光ります。 ここでラピロのバッテリーの電源を入れるとラピロのモーターが初期位置に移動します。

Arduino IDEのメニューの「ツール」→「シリアルポート」→「/dev/ttyUSB0」にチェックを入れてください。次にメニューの「ファイル」→「開く」からダウンロードしたRAPIRO_ver0_0.inoを開きます(このとき、RAPIRO_ver0_0.inoはRAPIRO_ver0_0のフォルダ内にある必要があります)。


ここで、trim[MAXSN]の部分でモータの微調整をします。入力する値はDegreeの角度のようです。ラピロの腕や足などが綺麗に正しい位置になるように数値を変更します。正しい位置になったかどうか確認するには、メニューの「ファイル」→「マイコンボードに書き込む」を実行します(ツールバーの左から2つ目のボタンも同じ意味です)。コンパイルが行われ、ボードにプログラムが書かれ、ラピロのモーターの位置か変わります。

微調整が終わったらメニューの「ツール」→「シリアルモニタ」でモニタ画面を開きます。ここで#M8を入力して、「送信」ボタンを押してください。赤く目がひかり、左手を降る動作をすればOKです。


#M0で初期値に戻ります。#M1〜#M9まで動作がありますので、試してみてください。歩く動作もあります。

ところで、普通に立っているだけでもモーター音がジーと鳴り続けることがあるのが気になります。調整がうまくいっていないからだろうか・・・

Raspberry PIを接続する


ここから頭脳であるRaspberry Piを接続します。まずはRaspberry PiがRAPIROで使えるようにセットアップをします。 OSはRaspberry Piで一番一般的なRaspbianを入れます。OSの入れ方はここなどを参考にしてください。

Raspberry PiとラピロのArduinoとはUARTというシリアルポート(ピンはTXD,RXD)を使用します。このシリアルポートは初期状態ではコンソールでログインできるように設定されているので無効化して、ラピロのみに使えるようにします。

/boot/cmdline.txtが以下のように

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait

なっているのを

dwc_otg.lpm_enable=0 rpitestmode=1 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait

と変更します。また、/etc/inittabにおいて、以下の

TO:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

なっている行を

#TO:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

のように先頭に#をつけて無効化します。

また、ラピロが無線で動作するように、WiFiの設定をしておきます。私が使用したWiFiアダプタはPLANEXの無線LAN USBアダプタ 150Mbps GW-USNANO2Aです。これはドライバのインストールも要らず楽です。また白色で小さいのでラピロの外観にも合うのではないかと思います。RAPIRO公式ではBT-Micro3H2Xが使われていたようでしたが、残念ながら売り切れでした。





Wifiの設定はデスクトップにある「Wifi Config」アイコンから起動するソフトで行えば簡単です。Scanボタンで無線LANアクセスポイントのリストが出るので、選んでパスワードの設定を行うのみです。



IPアドレスは自動で振られますが、大体同じ番号になるのでIPアドレスを控えておくと後で接続しやすいです。例えばIPアドレスが192.168.1.10であるとして今後説明をします。

設定が終わったら、一旦電源を切り、ラピロの頭の中にRaspberry Piをセットします。6本ケーブルの黒い部分を奥にして、一番手前左側の6本のピンに指します。ちなみにここから電源供給もされるようです。



これで、ラピロの電源をいれるとRaspberry Piも起動します。WiFiでネットワークが繋がっていれば、SSHでRaspberry Piに入れるため、遠隔操作ができるようになります。

Fedora等のLinuxからSSHでラピロのRaspberry Piにつなぐには以下のようにします。パスワードが聞かれますので初期のままであればraspberryと入れてください。WindowsではTera Term等のSSHクライアントソフトを使ってください。

$ ssh pi@192.168.1.10

動作をさせるためにRaspberry PiからラピロのArudinoにコマンドを送るにはシリアル通信をしますが、今回はcuコマンドを使ってみます。まずはcuコマンドをインストールします。

$ sudo apt-get install cu

cuコマンドを使ってArduinoに接続します。

$ cu -s 57600 -l /dev/ttyAMA0

Connectedと表示され、接続がされたら後は#M8など先ほどのようにコマンドを打ち込んでください。打ち込んだ文字が表示されないタイミングがありますが、気にしないでください。 cuコマンドを終了したい場合には、Enterキー,~(チルダ)キー、.(コンマ)キーを順に押してください。それとラピロの電源を切る前に、sudo haltのコマンドでRaspberry Piを終了しておいたほうが安全です。 これでラピロが遠隔操作できたと思います。Nexus5のようなAndroidスマホでは、ConnectBotというSSHクライアントがGoogle Playから無料でインストールできますので、Androidからラピロを操作することもできます。

ラピロの基本的な設定は以上です。この後はカメラを付けたり、センサーを付けたり、Raspberry Pi側やArduino側のプログラムを変えて動作を増やしたり、色々と楽しめるのではないかと思います。

2014年3月9日日曜日

子供用PCとしてRaspberry Piをすすめてみる

Raspberry Pi をおすすめする理由


春、新しい学年に、そろそろ子供用にパソコンでも買おうか、と考える人もいるかもしれません。しかし、どんなのを買おうかと悩むかもしれません。選択肢の一つとしてRaspberry Piをおすすめしてみます。

こんな方にRaspberry Piをおすすめします。
  1. 子供に価格の高いものは不要と考えている方
  2. パソコンばかりになって勉強しなくなるのではないかと心配な方
  3. コンピュータに慣れさせるだけでなく、コンピュータを学び、勉強させたい方
  4. ソフトウェアだけでなくハードウェアも勉強させたい方
Rapberry Piは、もしテレビがあり、USBキーボード、USBマウスがあるようであれば、本体のみの購入でよく、全部で1万円もかかりません。非常にリーズナブルです。万が一子供が使わなくても損とは感じないかと思います。

パソコンでンターネットやゲームで遊んでばかりになるのではないかと言う点では、色々と出来てしまいますが、Flash Playerが出来なかったり、遅かったりとWindowsではなく、大したことができないので不便なところが逆に役に立つのではないかと思います。 使ってくれない可能性もあるのですが・・・。

それと危ないWebサイトに行かせないためのフィルタリングなどは無いので、ルーター側で制限する必要があるかもしれません。

コンピュータの知識は今や必須です。Raspberry Piは元々教育用で、子供用のプログラミングから、本格的なプログラミングまでできるようになっています。プログラマーにならなくても事務等の仕事でもマクロなどで知識は活かせます。それに「プログラム」自体が物事の手順などの考え方を教えてくれます。

Raspberry Piが他のパソコンと違う点として、GPIO(General Purpose Input/Output)と言う端子などハードウェアと簡単につなぐ仕組みがあることです。このことで、電子工作の勉強にも繋がります。

Raspberry Piがどんなものか紹介しますので、参考にしてください。

Raspberry Pi の購入は?


Raspberry Piは家電屋さんでは売っていません。Amazon等のサイトで購入できます。Raspberry Piはパソコン本体のみしか無いため、必要であれば、USBキーボード、USBマウス、HDMIケーブル、SDHCカード(4GB以上)、電源を買ってください。以下は例です。

一緒の物を買う必要はないですし、すでに同種のを持っているのであれば、それを使用してください。私はすでに持っている物を使用したので、下記の動作保証はできません。


必要な物説明
Raspberry PiRaspberry Pi 本体です。裸でも問題ないと思いますが、気になるのであれば、ケースもありますので購入してください。
Raspberry Pi その2Raspberry Pi 本体とOSインストール済みのSDカードのセットです。ケース有りも選べます。OSインストール済みは私は買ったことがないので、使用方法はこのブログとは異なるかもしれません。
電子工作キット 電子工作の勉強用です。白い板がブレッドボードといい、ハンダ付けなどが無しで簡単に電子工作が試せます。

必須ではないですが、今回のRaspberry Piの使用例に使用します。私はキットでなく、個別で買っているのでブログでの紹介は別物を使っていますが、同等のことが出来ると思われます。
電源microUSBで5Vで700mA以上の供給ができる物であれば、何でも良いです。大抵のスマホ用のAC充電器であれば、問題ないです。例(→)のAC充電器は1Aです。
SDカード32GB4GB以上であれば、良いですが値段も安いですし、大きめのほうがいいです。
ネットワークケーブル無線も可能ですが、今回は有線ケーブルでネットワークを接続することとします。
SDカードリーダーWindows、Mac OS X、Linux等でSDカードにOSを入れます。SDカードスロットがある機種の場合には、それを使えばよいですし、無い機種の場合には、USBのアダプターがありますので、それを使用します。Amazonでは安いのが無かったのですが、アダプターは例の(→)よりもっと安い物もあります。安物で十分です。
モニタまたはテレビRaspberry Piのセットアップ時に表示を行います。PCのモニタまたはHDMI端子のあるテレビでも良いです。地デジ対応テレビであれば、大抵HDMI端子が付いていると思われます。もう無いかもしれませんが、アナログコンポジットでも良いです。
HDMIの接続ケーブルテレビにつなぐ場合にはHDMIの通常のケーブルで良いです。PCのモニタにつなぐ場合には、HDMIをDVIに変換するケーブルが必要になるかもしれません。私はPCのモニタにDVIで接続したため、例の(→)ケーブルを持っていたので使用しました。
USBマウスUSBマウスなら何でも良いです。トラブルを避けるなら有線の方が良いです。例(→)はなるべく安いを選びましたが、もっと安いのがあるかもしれません。
USBキーボードUSBキーボードなら何でも良いです。トラブルを避けるなら有線の方が良いです。例(→)はなるべく安いを選びましたが、もっと安いのがあるかもしれません。


Rasberry Pi のOSをSDカードに入れるには?


通常のパソコンを購入すると、WindowsなどのOSが入っています。Raspberry Piの場合は最初にOSが入っていないので、親御さんのPCでOSを入れてあげる必要があります(面倒な方はインストール済みSDカードを購入してください)。その手順について説明します。
  1. SDカードをフォーマットするソフトをダウンロードして、解凍したフォルダのsetup.exeを実行してインストールします。
  2. 上記ソフトを起動して、SDカードをフォーマットします。時間はかかりますが、オプションで上書きフォーマット,論理サイズ調整ONにした方が確実です。
  3.  Raspberry Piのサイトから、NOOBS_v1_3_4.zipをダウンロードしてください。色々とダウンロードする種類がありますが、このNOOBSというのは、もし何かあったときにはOSの再インストールが簡単にできます。子供だからと管理者権限を奪うと勉強にならないこともありますが、壊してしまう危険性も大きいので、この方法が便利です。
  4. NOOBS_v1_3_4.zipをSDカード上に解凍してください。
  5. これでSDカードの準備は完了です。

Raspberry Piのセットアップは?


  1. 以下の画像を参考にして、それぞれを接続してください。Raspberry Pi は電源スイッチが無く、電源線をつなぐとすぐに起動します。そのため、電源は最後につないでください。

  2. 電源を入れるとSDカードの容量拡張が始まります(時間がかかります)。その後にRaspberry PiのNOOBSが起動します。 ここの下側のところで言語の設定ができるので、日本語に設定をして、真ん中のメニューではRaspbianを選択してインストールを行ってください。
  3. インストールが始まり、以下のように完了します。OKを押すと再起動します。
  4. 以下のように画面が出たら何もせず、Tabキーで<Finish>を選択してEnterキーを押してください。
  5. これで完了です。(日本語入力ができませんが、それについてはまた後で) 

Raspberry Pi の使い方は?


(1)起動
起動するとメッセージが流れて、「raspberrypi login:」と表示されます。ここで「pi」と入力しEnterキーを押すと、「Password:」と表示されるので「raspberry」と入力し (入力した文字は見えません)、Enterキーを押します。次に「pi @raspberrypi ~ $」と表示されるので、「startx」と入力してEnterを押してください。
Windowsに似た画面が表示されたと思います。Windowsと操作も似ているので、特に順応性の高い子供であれば、使用に問題ないと思います。

(2)終了
画面上のシャットダウンアイコンから、終了できます。または、コマンド入力画面において「sudo halt」と入力してEnterキーを押します。

(3)インターネット
Midoriと言うブラウザが入っていますので、それを使用します。Google chromeのフリー版であるchromiumもインストールすれば使えます。どちらにしても非常に遅いです。

(4)ソフトウェアのインストール
LXTerminalというコマンドライン表示ツールがあります。ここでapt-getと言うコマンドを使うことで様々なソフトウェアをインストールすることができます。

(5)日本語入力のインストール
「sudo apt-get install scim-anthy」と実行して、一度ログアウトして「startx」でウィンドウ画面にすると日本語が入力できるようになります。


日本語入力は Windowsと同様で全角/半角キーで切り替えることができます。

Raspberry Pi でGPIOを試してみる


電子工作の初歩でLチカ(LEDチカチカ)と言うものがあります。それを行います。昔は電子工作というとハンダづけなどが必要でしたが、今はブレッドボードという白い板に線を挿すだけ安全に電子工作が行えます。

GPIOの端子については以下のURLに図があります(今はRevision2です)。

http://www.raspberrypi-spy.co.uk/2012/06/simple-guide-to-the-rpi-gpio-header-and-pins/

この図のGROUND(PINの6番)とGIPO17(PIN11番)の間にLEDが挟まるように配線してみましょう。下の画像です。見にくくてすみません。念の為、抵抗をいくつか入れています。


ブレッドボードは上側a〜f, 下側g〜lまでが内部で縦側につながっています。また下の2段は横側につながっています。

この画像ではRaspberry PiのPIN6番とブレッドボードのf30をつなぎ、それが内部でLEDの足の短い側(LEDには向きがあり、短い側がGROUNDである必要があります)のa30につながります。LEDの足の長い方がa29に刺さっており、そこからd29〜d25間が抵抗で繋がり、e25からg25までがまた抵抗でつながっています。そしてl25からPIN11番につながっています。

LEDをチカチカさせる方法は色々とあるのですが、一番簡単なのがコマンドで行う方法です。下の画像のように入力してください。最初の2行は準備です。3行目でLEGが点灯するはずです。4行目でLEDが消灯します。


少しコマンドを解説します。Linuxではハードもファイルとして表現されます。それが"/sys/class/gpio/〜"です。そこに書き込みをすることで、ハードへの出力ができます。

"sudo"は、管理者権限で実行することを意味しています。ハードへの出力は管理者権限がいるためです。

"echo"は通常は表示のコマンドです。その後に指定した文字を画面に出力するのですが、">"のリダイレクトによって、"/sys/class/gpio/gpio17/value"等にに出力をするようにしています。

他にもC言語などのプログラミング言語でLチカをさせるプログラムを書いたり、ドライバーと作ったりと色々派生できると思います。
私は電子工作は得意でないので、この後どう進むとよいのかわかりませんが、勉強のお役にたてたら幸いです。

2014年3月2日日曜日

Firefox OS を試してみる

Firefox OS の状況


Mobile World Congress 2014というモバイル関連の世界見本市が行われました。先進国にはスマートフォンが行き渡ったこともあり、新興国向けのスマートフォンが注目を浴びています。

その中でもFirefox OSで25ドル(約3000円)のスマートフォンが出ると言うことで、大きなニュースにもなっていました。Nexus 5は性能もよく満足していますが、ここまでの機能が必要かと問われると少なくとも私は不明です。時代が進むうちに安い端末もそれなりの性能となり、電卓が100円で買えるように、スマホもとんでもなく安いものになるのかもしれません。

低価格というとAndroidもKitkat(Android 4.4)では512Mバイトのメモリでも動作するようになり、低価格向けに進んでいます。Firefox OSがAndroidに勝つのは非常に難しいでしょう。しかし、以下の利点があります。
  • Firefox OSは真のオープンソース。Androidは、OSのバージョンの互換性のために「Google Play開発者サービス」 に使用しているが、これはオープンでない。さらにGoogleの様々なサービスを使うには契約が必要で無料でもない。Androidのソースへの介入もGoogle以外は基本的にはできない。
  • FirefoxOSはWebベース。Webの知識は多くの人が持っており、アプリ開発が楽。
現在Androidのシェアは約80%で非常に強いです。しかしオープンなWebと言うのも強いです。ブラウザと言えば、Internet Explorerが90%以上のシェアの時代がありましたが、Firefoxはそれを崩してきた過去の実績があります。Firefox OSでも長く続ければ活路が見つかるかもしれません。

使いたいアプリがあるかが重要でしょうが、日本では定番のLINEもすでに出ていますし、今後に期待したいです。

パソコンに Firefox と Firefox OS Simulatorをインストールする


Firefox OSでもNexusシリーズの様な開発用ハードウェアであるFirefox OS Flameが発表されました。日本でも使えるといいのですが、技適の問題もあり出ない可能性が高いです。Nexus 5にFirefox OSを入れる方法もあるのですが、ネットもできなさそうです

できることは限られますが、簡単にFirefox OSを試すのであれば、パソコンで試すのが一番です。WinodwsでもMac OS XでもLinuxでも試すことが可能です。

まずはFirefoxのサイトよりFirefoxのダウンロードをし、インストールします。指示に従えば簡単だと思います。画面は英語表示ですが、Windowsでのインストール手順はここに書いてあります。

次にFirefox OS Simulatorのアドオンのサイト「Firefoxの追加」を行いダウンロードしてインストールします。



ダウンロードには時間がかかりますが、以上で完了です。

Firefox OS Simulatorを使ってみる


FirefoxのメニューのWeb開発の中に「Firefox OS Simulator」が追加されているので選択します。




するとFirefox OS SimulatorのSimulator Dashboardタブが出るので、ここで左側のSimulatorがStoppedの所をクリックするとFirefox OS Simulatorが起動します。



操作感はiPhoneに似ている気がします。一番下の家のアイコンマークがホームボタンです。左右にフリックしてみたり、ブラウザを起動してみたり、してみてください。なんとなく使い方は分かると思います。英語ですが、残念ながら日本語には対応していませんでした(中国語には設定できます)。
 
それと私のWindows XPの環境では動作が不安定でした。Fedora 20では問題ないのですが。

Firefox OS のアプリを試してみる


「Marketplace」のアイコンからアプリがインストールできます。


Pacman Canvas(Beta)(少し著作権的に危なそうですが)を試してみました。操作がしにくかったりはありますが、問題なく動作します。



なお、Firefox OSのアプリだけなら、 PC版FirefoxやAndroid版Firefoxでも使用可能です。PC版では、Firefox Marketplaceのサイトから。Android版では、メニューの「ツール」→「アプリ」ー「Firefox Marketplaceを閲覧」からインストールして使用することができます。(Android版ではLINEはインストールできないようでした。)





Firefox OS のアプリを作ってみる


非常に簡単にですが、Firefoxのアプリも作ってみます。いつものHello Worldです。C:¥testのフォルダを作成し、その下に、2つのテキストファイルindex.htmlとmanifest.webappを作成してください。また128x128の画像ファイルicon-128.pngを作成してください。

index.htmlは以下のようにHello Worldを表示するのみのHTMLファイルです。Webページを作成したことがある方なら内容は問題なく理解できると思います。

<html lang="ja">
  <head>
     <meta charset="UTF-8" />
     <title>Hello</title>
  </head>
  <body>
    Hello World!
  </body>
</html>


manifest.webappはFirefox OSのアプリでアプリの情報を記述するJSON形式のファイルです。

{
  "name" : "Hello",
  "description" : "Hello アプリケーション",
  "launch_path" : "/index.html",
  "icons": {
    "128" : "/icon-128.png"
  }
}

2つのファイルはUTF-8の文字コードで保存するようにしてください。icon-128.pngは適当に作成してください。私はGIMPでonoonoと描いただけの画像を作成しました。

ファイルが作成されたら、Firefox OS Simulator のSimulator Dashboardタブの上中にある「Add Directory」でC:¥test¥manifest.webappを選択します。


するとシミュレータに起動して、アプリがインストールされ、アプリが実行されます。


もし、なんらかのWebアプリがあるのであれば、Firefoxアプリにするにはmanifest.webappを追加するのみです。一度お試しください。

私は「HTML5でつくるFirefox OS アプリケーション開発入門」を購入しました。アプリの作成方法/デバッグの仕方/アプリのリリースなどの基礎知識や、電話帳/アラーム/アプリ連携/バックグラウンド処理/通知/位置情報のサンプルもあり充実した本になっています。



その他、詳しくはMozillaの開発者用ののWebページを参照してください。