Translate

2016年5月27日金曜日

Arduino Yunをはじめよう (Arduino社ドキュメント)を翻訳してみた


Ciao関連のドキュメントを勝手翻訳していると、
やはり Arduino Yun というボード自身の基礎知識が
どうしても必要になってくる。

これまでマニュアルも読まず使っていたツケを
そろそろ生産するときか..

ということで、いまさらだが
Arduino Yunの Getting Startedにあたるドキュメント


Getting Started with the Arduino Yún

を勝手翻訳してみた。
以下、参考にする場合はat your own riskでお願いします。


------

Arduino Yunをはじめよう


Arduino Yunは、ほかのもの(Arduino系のボード)とは異なるボードです。プログラミングはArduino Leonardoと大変似ており同じプロセッサATmega32U4を使っていますが、それとは別にプロセッサAtheros AR9331が追加されており、こちらではLinuxおよびOpenWrtワイヤレススタックが動作しています。USB経由での32U4へのプログラミングはArduino Leonardoと同じです。一度Yunに対してWiFiネットワークへの接続設定を行えば、WiFi経由での32U4へのプログラミングが可能になります。

Arduino Yunをコンピュータに接続するには、Micro-B USBケーブルが必要になります。このUSBケーブルは電源およびデータをボードへ供給します。Yunへのプログラミングを行う場合、ArduinoIDEのTools > Board menuに進みArduino YUNを選択しなくてはなりません。YunはArduino IDE 1.5.4以降のみサポートしています。

目次

    Arduino Leonardoとの違い
    OpenWrt-Yun
    Python
    Yun上の外部ストレージ
    Web サービス
    プロセッサ(AR9331、WiFi、32U4)の再起動
    パスワードのリセット
    リセットによるシリアルポートリストの再列挙
    シリアルポートのオープン時のリセットなし
    Yunドライバインストール
        OSX
        Windows
        Linux
    オンボードWiFiの設定
    WiFiを使った32U4プログラミング
    オンボードEthernetの使用
    Bridge経由でのOpenWrt-Yunとの通信
    コンソール
    Process
    Bridgeを使った2つのプロセッサ間の情報連携
    Tembooを使ったインターネットサービスへの接続
    Spacebrew
    Linux上にへ追加ソフトウェアのインストール
    次のステップ

 

Arduino Leonardoとの違い



図→ https://www.arduino.cc/en/uploads/Guide/YunParts.png
 

Yunは 32U4 チップに加え、 Python2.7のフルインストールも含んだ OpenWrt-Yun(OpenWrtベース)と呼ばれる組込みシステム向けのLinuxディストリビュージョンが動作する Atheros AR9331 というプロセッサを搭載してます。

Yun はたくさんの Leonardo とは異なる物理的な特徴やコネクターを持っています。オンボードSDカード、Ethernetジャック、USB-A ホストコネクタを搭載しています。かわりにUNOやLeonardoには搭載されていた樽型の電源コネクタがありません。Yunはmicro-USBコネクタから給電します。

SD、Ethernet、USB-Aコネクタは物理的には 32U4 と接続されていません、AR9331側に接続されています。

Yunにおける32U4 の機能は Serial1 を使用できない以外は Leonardo と全く同じです。Serial1は、AR9331プロセッサとの通信のために予約されています。

Yunは ワイヤレスルータと接続したりアクセスポイントとして振る舞うための WiFi モジュールもオンボードで搭載しています。

32U4、WiFi、AR9331プロセッサは、各々リセットボタンを持っています。



図→ https://www.arduino.cc/en/uploads/Guide/YunResetIllustrations.png

Yun上には、電源インジケータ、WLAN接続、WAN接続、そしてUSBのそれぞれのステータスLEDを搭載しています。加えてステータスライトの一つは13ピンに接続されています。

図→ https://www.arduino.cc/en/uploads/Guide/YunStatusLEDs.png

 

OpenWrt-Yun


Yun上では、(OpenWrtベースの)OpenWrt-Yunと呼ばれるLinuxディストリビュージョンが動作します。OpenWrt-Yunはコマンドラインから設定が可能で、多くの異なったオプションが設定可能なWebページも用意されています。(LuCiと呼ばれる)インターフェイスは、WiFiインターフェイスの維持に必要な多くの設定が可能です。



Webインターフェイスへのアクセスは、後述します。

OpeWrt-Yun上に追加ソフトウェアをインストールするためには、Linuxパッケージマネージャopkgを使う必要があります。マネージャについての詳細や一般的なコマンドについてはYun パッケージマネージャページを参照してください。



OpenWrt-Yunシステムとのインターフェイスとして、ArduinoのBridgeライブラリもしくはSSH経由によるどちらかでアクセスするには、コマンドラインを使用しなくてはなりません。もしあなたがコマンドラインを知らないのであれば、若干基礎を読む必要かもしれません。


OpenWrtコミュニティやArduinoコミュニティからの継続的な改善や提案により、あなたのYun上にインストールされたOpenWrt-Yunのバージョンが古い場合があります。更新チュートリアルをチェックし、最新版を動かすようにしてください。

Python


OpenWrt-Yunには、Python2.7がインストールされており、アプリケーションやスクリプトを書くことができます。Pythonについての詳細は、Pyhton2.7ドキュメンテーションページを訪問してください。


はじめてPythonを使うのであれば、多くの完全なオンラインリソースがあります。書籍"Learn Python the Hard Way"は、スクリプトを作成し実行するために必要な知識をカバーしています。


 

Yun上の外部ストレージ



書き込み上限があるため Yunのビルトイン不揮発メモリの使用を躊躇するとおもいます。
データ、スクリプト、Webページなどを保存するためにmicroSDカードやThumb Driveのような外部メモリを使うことができます。Yunが32U4を通してこれらのドライブへアクセスし情報を保管するには、ルートボリュームのarduinoと名付けられたディレクトリが必要です。

Web サービス


OpenWrt-YunはクライアントやサーバのためREST("Representational State Transfer"の略)を使います。RESTはURLを通してArduinoハードウェアの様々なパーツを公開するソフトウェアアーキテクチャの一つです。

デフォルトでは、REST APIはパスワードプロテクトされています。パスワード無しでサービスへのアクセスする設定に変更可能です。この設定変更は、Yun設定パネルへ入ります。ページの最後に、アクセス変更のためのトグルボタンがあります。

図→ https://www.arduino.cc/en/uploads/Guide/YunRESTAccess.png

RESTの裏のコンセプトの素晴らしい情報はこちらでみつけることができます。
 

Yunにより認められているRESTエンドポイントは以下のとおりです:
    /arduino
    /data
    /mailbox


"/arduino"ディレクトリは、予め何も設定されていません。エンドポイントの後ろに何か文字列を加える事で、Webサーバから32U4上のSketchへ渡されます。Sketch内部にAPIを定義することができます。Bridgeのサンプルを確認し、ボード上のピンへのアクセスがどのようになされているのか確認してください。

"/data"は内部のキーバリューストアへのアクセスが可能です。有効な呼び出しは、以下のとおりです:

    /put/KEY/VALUE : ストレージ内部へ値を格納する
    /get/KEY : JSON内の要求されたキー値を取得する
    /get : JSON内の全ストレージリストを取得する
    /delete : 内部ストレージを削除する


"mailbox"はMailboxとよばれるキューにメッセージを追加するために使用されています。メッセージキューはLinuxシステム内部に格納され、Arduinoマイクロコンピュータにより読み取りが可能です。有効なRESTコールは、次の通り:

    "/mailbox/message"


プロセッサ(AR9331、WiFi、32U4)の再起動


OpenWrt-Yunをリブートするために、AR9331を再起動するには、ボード上のアナログ入力ピンやLEDの近くにある"YUN RST"リセットボタンを押してください。

32U4を再起動し、現在インストール済みのSkectを再実行するには、Ethernetポートのとなりにあるボタンを2回タップしてください。

WiFiのリセットボタンは、USB-Aコネクタのそばにあります。"WLAN RST"とラベルされています。ボタンを押すと、WLAN LEDがフラッシュします。

もし異なるネットワークへ移動しWebインターフェイスを通してYunへ無線でアクセスしないのであれば、WiFiリセットボタン(WLAN RST)5秒以上30秒未満押すことでAR9331プロセッサがリブートし、Yunのネットワーク設定をリセットすることができます。WiFi設定がリセットされると、Yunは自身のWiFiネットワークを Arduino Yún-XXXXXXXXXXXX という名前で開始します。WiFi以外の設定や構成はすべて保管されます。

OpenWrt-Yunディストリビュージョンをデフォルト状態にリセットするには、WiFiリセットボタン(WLAN RST)を少なくとも30秒押します。ボードはオリジナルの設定に戻ります:箱から取り出した状態もしくは過去にリフラッシュしてOpenWRTの最新版の状態にした状態へ戻ります。この操作では、全てのインストルされたファイルやネットワーク設定が削除されます。


パスワードのリセット


Webパネルパスワードはリセット、変更可能です。コンピュータからUSBケーブルでYunSerialTerminal sketchをアップロードすることでArduino Yunへ接続します。YunSerialTerminalは、Arduino IDEのSketchサンプル(Bridge)内にあります。Yunのブート完了したら、シリアルモニタを開き、ドロップダウンメニューのNew Lineを選択しEnterを押します。シリアルモニタは次のような表示となります:

図→ https://www.arduino.cc/en/uploads/Guide/yunresetpsw_fixed.png

passwdコマンドを実行することでパスワードを変更することができます。シリアルモニタにpasswdとタイプしてEnterキーを入力してください。新しいパスワードを聞かれ、再度確認のためのリタイプも要求されます。あなたが望むのであれば、弱いパスワードである旨のエラーを無視することができます。両方のパスワードが合致したら、システムパスワードは変更され、あなたは新しいパスワードでWebパネルへアクセスすることができます。



リセットによるシリアルポートリストの再列挙


Yunにはシリアル通信を行うための専用チップがありません、これはシリアルポートが仮想-OS上およびボード上両方のソフトウェアルーチンであることを示しています。Arduinoがプラグインされあなたのコンピュータがシリアルポートドライバのインスタンスを構築したちょうどその時、32U4はブートローダ実行のたびにシリアルインスタンスを構築します。ボードは、USBの接続デバイスクラス(CDC)ドライバのインスタンスです。

このことは、32U4プロセッサがリセットされるたびにUSBシリアル接続が遮断され再確立していることを意味しています。ボードはシリアルポートリストにあらわれ、そして再列挙されます。Yunに接続したどんなプログラムでも接続を失います。この動きは、USB接続の解除しないでメインプロセッサ(ATmega328P)のリセットするArduino UNO(後続のプロセッサATmega8U2もしくはATmega16U2にも受け継がれています)とは対称的です。この違いはドライバのインストール・アップグレード・通信もふくんでいます。

シリアルポートのオープン時のリセットなし

コンピュータ上のシリアルポートがオープンした時、YunはSketchを再実行しません。これは、ボードからコンピュータに既に送信されたシリアルデータ(例えばsetup()内で送信したデータの多くを含む)を見れないことを意味します。

このことはConsoleにもあてはまります。

このことは、もしあなたがSeiral/Consoleprint()println()write()setup()内で使用した場合、シリアルモニタやコンソール接続をオープンする際にそれらが表示されないことを意味しています。次のように、これらが呼び出される前に、ポートが開いているかどうかを確認することが可能です:

// シリアルモニタがオープンされるまでプログラムを停止
   while (!Serial) ;


もしくは


// コンソールがオープンされるまでプログラムを停止
   while (!Console) ;


 

Yunドライバインストール



OSX


まず最初にYunをMacにつなぐと、"Keyboard Setup Assistant"を起動します。Yunの設定は不要です;ウィンドウの右上の赤いボタンをクリックしてダイアログを閉じてください。

図→ https://www.arduino.cc/en/uploads/Guide/OSXKeyboardNotification.png

 

Windows


IDEやドライバのためのインストーラが提供されています。

Arduino 1.5.4以降のインストーラをダウンロードし、インストーラアイコンをダブルクリックしてください。


図→ https://www.arduino.cc/en/uploads/Guide/WinYun1.png

ライセンスを読み、合意する場合は、"I agree"ボタンを押してください。


図→ https://www.arduino.cc/en/uploads/Guide/WinYun2.png


デフォルトではすべての有効なコンポーネントが選択済みとなっています。これらの中にはIDEやドライバ、ショートカットがふくまれています。

図→ https://www.arduino.cc/en/uploads/Guide/WinYun3.png


IDEをインストールしたい場所を選択してください。


図→ https://www.arduino.cc/en/uploads/Guide/WinYun4.png

 ファイルが適切な場所へ展開されたらインストーラは進捗状況を表示します。
 

図→ https://www.arduino.cc/en/uploads/Guide/WinYun5.png

 ドライバのインストールを選択した場合は、確認画面がポップアップされます。
 

図→ https://www.arduino.cc/en/uploads/Guide/WinYun6.png

インストールが完了したら、"Close"ボタンを押して終了します。
注意:Yunはワイヤレスネットワーク上の自動探索のためにBonjourサービスを使います。このサービスはデフォルトのWindowsには含まれていません。もしまだBonjourをインストールしていないのであれば、ここからダウンロードすることができます。付け加えると、ポート番号5353がアンチウィルスソフトにより遮断されないようにしてください。


Linux


Ubuntu10.0.4以降ではドライバのインストールは不要です、ただしファイアウォールにより5353番ポートが遮断されないようにしてください。

オンボードWiFiの設定


Yunはアクセスポイントとして動作する機能を持っています、しかし既存のネットワークへ接続する機能も持っています。Yunをワイヤレスネットワークへ接続する手順を説明します。Yunは、WEP、WPA、WPA2をサポートするネットワークだけでなく、暗号化されていないネットワークにも接続することができます。

最初にYunに電源を接続すると、ArduinoYun-XXXXXXXXXXXX という名前のWiFiネットワークを構築します。コンピュータをこのネットワークに接続してください。

IPアドレスを獲得したら、Webブラウザを起動して、http://arduino.local もしくは http://192.168.240.1 を開いてください。数秒後、パスワードを問い合わせるWebページが表示されます。"arduino"と入力して、"Log In"ボタンを押してください。


図→ https://www.arduino.cc/en/uploads/Guide/YunWebPassword.png

ページ上に現在のネットワーク接続に関する診断情報が表示されます。最初にWiFiインターフェイス、2番めにEthernet接続が表示されています。Configurationボタンを押して、次に進みます。
 

図→ https://www.arduino.cc/en/uploads/Guide/YunWebDiagnostic.png

新しいページで、ネットワーク接続時に認識するための一意なYunの名前を設定します。

Yun NAME欄に、一意な名前を入力します。設定以降は、入力した名前が使用されます。

あなたのArduinoに対して8文字以上のパスワードを選択します。もしブランクのままにすると、arduinoのデフォルトパスワードがシステムに残ります。

タイムゾーンや国を設定することも可能です。ローカルのWiFiネットワークへの接続を支援するために、これらの設定をすることを推奨します。ローカルタイムゾーンを設定するには国と地域を選択します。

接続先WiFiネットワークの名前を入力してください。

セキュリティタイプを選択し、パスワードを入力してください。


図→ https://www.arduino.cc/en/uploads/Guide/YunWebConfig.png

Configure & Restart ボタンを押すと、Arduinoを自身リセットし、指定したネットワークへ参加します。しばらくすると、Arduinoネットワークはシャットダウンされます。


図→ https://www.arduino.cc/en/uploads/Guide/YunRebooting.png

Yunへアサインされたネットワークに参加することができます。

WiFiを使った32U4プログラミング


Yunがあなたのコンピュータと同一のネットワーク上にあるのであれば、無線で接続してプログラムすることができます。

Yunの設定完了後、設定時に指定したネットワークに接続してください。Arduino IDEを開いてください。

Tools > Portメニューをくと、Yunの名前とIPアドレスがリストされているのが見えるはずです。ボードメニューで、Arduino Yunを選択してください。

Blinkサンプル(File > Examples > 01Basic > Blink)を開き、ボードへSketchをアップロードしてください。その際管理者パスワードを要求されます。設定スクリーンで入力したパスワードを使ってください。

一度プログラムをアップロードすると、32U4プロセッサが再起動します。ピン13に接続されたLEDの点滅が確認できます。

オンボードEthernetの使用


Ethernetケーブルで有線ネットワークに接続する場合、DHCPによる自動接続を試してください。WiFi経由での動作同様に、ポート上にボードが表示されます。

コンピュータと直接Yunを接続したい場合は、コンピュータのインターフェイスに静的IPアドレスを指定するか、DHCPサーバとして動作させるかのいずれかでおこないます。

注意:Ethernetインターフェイスはeth1です。eth0ではありません。


Bridge経由でのOpenWrt-Yunとの通信


BridgeライブラリはArduinoとOpenWrt-Yunとの間の通信を可能にします。Bridgeライブラリには異なった種類の2者間通信を容易にするいくつかのユーティリティクラスがあります。Bridgeライブラリリファレンスページにより深い説明があります。

図→ https://www.arduino.cc/en/uploads/Guide/BridgeBlockDiag.png

WiFiやEthernetのインターフェイス、USBホスト、SDカードは、すべてAR9331に接続されています。Bridgeライブラリは、スクリプトを実行しWebサービスと対話するのと同様にして、これらのデバイスの操作を許可します。

コンソール


Bridgeベースのコンソールは、ワイヤレスではないシリアルモニタのような、Yunからコンピュータへ情報を送信することを可能にします。SSHによるYunとコンピュータの間をセキュアに接続します。

Yunへ次のコードをロードしてください:

#include

const int ledPin = 13; // LEDを接続しているピン番号
int incomingByte;      // 読み込んだシリアルデータ用変数

void setup() {
  // シリアル通信の初期化
  Bridge.begin();
  Console.begin();

  while (!Console){
    ; // Consoleポートが接続されるまで待機
  }
  Console.println("You're connected to the Console!!!!");
  // LED接続ピンをoutputとして初期化
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // シリアルデータを受信した場合
  if (Console.available() > 0) {
    // シリアルバッファに最新バイトデータ読み込み
    incomingByte = Console.read();
    // 大文字 H (ASCII 72)の場合、LED点灯:
    if (incomingByte == 'H') {
      digitalWrite(ledPin, HIGH);
    }
    //  L (ASCII 76) の場合、LED消灯:
    if (incomingByte == 'L') {
      digitalWrite(ledPin, LOW);
    }
  }
  delay(100);
}

Consoleを参照し、PortメニューでYunの名前およびIPアドレスを選択してください。コンピュータが同一LAN上にある場合は、Portメニュー上にYunが表示されます。もし異なるネットワークにボードを接続している場合は、Portメニュー上には表示されません。Yunのパスワードを要求されます。

ターミナルウィンドウを開き、 ssh root@yourYunsName.local 'telnet localhost 6571' とタイプしてEnterを押すことでConsoleを確認することも可能です。

注意:もしWindowsを使用しているのであれば、ターミナルエミュレータをインストールしてください。PuTTYは合理的な選択肢の一つです。しかし2つのコマンドを別々に入力する必要があります。

'H'をタイプするとピン13のLEDが点灯し、'L'をタイプすると消えます。

Process


Processコマンドは、Arduinoを通してOpenWrt-Yun上でLinuxプロセスを実行することを許可します。

次の例は、OpenWrt-Yunがcurlコマンドを使ってサーバへ接続し、ASCIIテキストをダウンロードするサンプルです。テキストはシリアル接続に印字されます。

#include

void setup() {
  // Bridge初期化
  Bridge.begin();

  // Serial初期化
  Serial.begin(9600);

  // シリアルモニタを開くまで待機
  while (!Serial);

  // 例のプロセスを実行
  runCurl();
}

void loop() {
  // 何もしない
}

void runCurl() {
  // "curl"コマンドを呼び出しArduinoアスキーアートをネットワークから取得する
  // curlは異なるインターネットプロトコルを使ってデータを通信するための
  // コマンドラインプログラムである
  Process p;        // プロセス"p"を生成
  p.begin("curl");  // "curl"コマンドを呼び出すプロセスを準備
  p.addParameter("http://arduino.cc/asciilogo.txt"); // URLパラメータを"curl"へ追加
  p.run();      // プロセスを実行し、終了まで待機

  // ArduinoロゴをSerialへプリント
  // プロセスの出力はストリームメソッドで読むことが可能
  while (p.available()>0) {
    char c = p.read();
    Serial.print(c);
  }
  // データのラストビット送信を保証
  Serial.flush();
}


Bridgeを使った2つのプロセッサ間の情報連携


このサンプルプログラムは、Bridgeライブラリを使ったRESTコールを通してボード上のデジタル/アナログピンへのアクセス方法を示している。ブラウザからRESTをスタイルの呼び出しを使う場合どのようにAPIを構築するのかを証明する。

サンプルコードを実行する場合、コンピュータをYunと同一ネットワーク上に接続してください。

ボードがプログラムされている場合、ピン上の値をリクエストすることができます、そして入出力ピンとして設定することができます。

RESTパスワードがオフの場合、次のURL構造でブラウザを使うことができます:

    http://myArduinoYun.local/arduino/digital/13 : digitalRead(13)を呼び出し;
    http://myArduinoYun.local/arduino/digital/13/1 : digitalWrite(13,1)の呼び出し;
    http://myArduinoYun.local/arduino/analog/9/123 : analogWrite(9,123)の呼び出し;
    http://myArduinoYun.local/arduino/analog/2 : analogRead(2)の呼び出し;
    http://myArduinoYun.local/arduino/mode/13/input : pinMode(13, INPUT)の呼び出し;
    http://myArduinoYun.local/arduino/mode/13/output : pinMode(13, OUTPUT)の呼び出し;


ブラウザの代わりにコマンドラインからcurlコマンドを使うことができます。

Bridge、YunServer、YunClientライブラリを含める必要があります:

#include
#include
#include

接続されたクライアントのために問い合わせるYunを有効にするサーバのインスタンス化します。


YunServer server;

setup()では、デバッグ目的のシリアル通信を開始し、Bridgeを初期化したら13番ピン上のビルトインLEDをHIGHにします。Bridge.begin()はブロッキングし、完了には約2秒かかります。一度Bridgeを開始したら、LEDを消灯します。


void setup() {
  Serial.begin(9600);
  pinMode(13,OUTPUT);
  digitalWrite(13, LOW);
  Bridge.begin();
  digitalWrite(13, HIGH);


setup()の次のパートでは、YunServerインスタンスがlocalhostからのみやってくる通信要求を受け取るようにします。OpenWrt-Yunとの通信を構築のためにポート番号5555をオープンにします。そしてserver.begin()にてサーバを開始します。

  server.listenOnLocalhost();
  server.begin();
}


loop()では、通信の管理のためにYunClientインスタンスを生成しています。もしクライアント接続があれば、カスタム関数process()(詳細は後続)を呼び出し、完了したら接続をクローズします。

大量接続要求がある場合の対策として、loop()の終わりでdelay()を呼び出しています。

void loop() {
  YunClient client = server.accept();

  if (client) {
    process(client);
    client.stop();
  }

  delay(50);
}

processという名前の関数を作成し、引数としてYunCluentを受け取ります。やってくる情報を保持するための文字列からコマンドを読みます。そして文字列からRESTコマンドを機能(digital、analog、mode)でParseし、適切な名前の関数へ引数を渡します。

void process(YunClient client) {
  String command = client.readStringUntil('/');

  if (command == "digital") {
    digitalCommand(client);
  }
  if (command == "analog") {
    analogCommand(client);
  }
  if (command == "mode") {
    modeCommand(client);
  }
}



ここではデジタルコマンドをあつかう関数を作成しています。引数としてclientを受け取っています。そしてピン番号を保有するための変数とコマンドへ渡す値のための変数を定義しています。

void digitalCommand(YunClient client) {
  int pin, value;


client.parseInt()では、clientから操作対象のピン番号をparseしています。

もしpinの後のキャラクタが"/"であるならば、URLは値として1もしくは0が続くことを意味しています。この値は、変数pinが示すピンに対し、HIGHもしくはLOWを割り当てます。もしpinの後のキャラクタが"/"ではない場合は、変数pinが示すピンの値を読みます。

  pin = client.parseInt();

  if (client.read() == '/') {
    value = client.parseInt();
    digitalWrite(pin, value);
  }
  else {
    value = digitalRead(pin);
  }


clientvalueprintし、現在のピン値をデータストアキーとして更新します。

valueF()内のclientへラップすることで、フラッシュメモリへのpirntフォームにします。これはSRAMのスペース削減に役立ちます、そしてURLのように長い文字列をあつかうのに便利です。

キーはpin値と、そしてタイプです。例えば、D2の場合デジタル2番ピンとして保存します。valueは、現在ピンにセットされている/現在のピンから読み取った値です。

  client.print(F("Pin D"));
  client.print(pin);
  client.print(F(" set to "));
  client.println(value);

  String key = "D";
  key += pin;
  Bridge.put(key, String(value));
}


ピンへのアナログ入力の場合にDのかわりにAをセットしている場合を除き、同一の方法でanalogコールを操作する関数をセットアップします:

void analogCommand(YunClient client) {
  int pin, value;

  pin = client.parseInt();

  if (client.read() == '/') {
    value = client.parseInt();
    analogWrite(pin, value);

    // Send feedback to client
    client.print(F("Pin D"));
    client.print(pin);
    client.print(F(" set to analog "));
    client.println(value);

    String key = "D";
    key += pin;
    Bridge.put(key, String(value));
  }
  else {
    value = analogRead(pin);

    client.print(F("Pin A"));
    client.print(pin);
    client.print(F(" reads analog "));
    client.println(value);

    String key = "A";
    key += pin;
    Bridge.put(key, String(value));
  }
}


ピンモードの変更を操作するために1つ以上の関数を作成します。それらの関数はYunClientを引数とし、ピン番号をローカル変数として作成します。そして、digital/analog関数で記述した方法で、pin番号を読み込みます。

void modeCommand(YunClient client) {
  int pin;
  pin = client.parseInt();



URLの妥当性を確認します。

if (client.read() != '/') {
    client.println(F("error"));
    return;
  }


もしURLとして妥当であった場合、URLを文字列として保管します。もしモードがinputもしくはoutputであった場合は、変数pinの指すピンに対しモードをセットしclientへレポートします。もし文字列がinput、outputのどちらでもない場合は、エラーを返します。

  String mode = client.readStringUntil('\r');

  if (mode == "input") {
    pinMode(pin, INPUT);
    // フィードバックをクライアントへ送信
    client.print(F("Pin D"));
    client.print(pin);
    client.print(F(" configured as INPUT!"));
    return;
  }

  if (mode == "output") {
    pinMode(pin, OUTPUT);
    // フィードバックをクライアントへ送信
    client.print(F("Pin D"));
    client.print(pin);
    client.print(F(" configured as OUTPUT!"));
    return;
  }

  client.print(F("error: invalid mode "));
  client.print(mode);
}


Bridge Example ページ上に、このサンプルコードの詳細を見つけることができます。

Tembooを使ったインターネットサービスへの接続

図→ https://www.arduino.cc/en/uploads/Guide/TembooIllustrated.png
 

Yunはたくさんのビルトインされたネットワーク機能を持っていますが、最も刺激的なもののいくつかはのオンラインプラットフォーム上で動作しています。Arduinoは、できるだけ簡単に好きなサービスと接続するためにTembooとパートナーとなりました。Tembooは、(例えばFedExやPayPal以外のTwitterやFacebook、Foursquareといった)おおくのプラットフォームからやってくる様々なものが混ざったデータへ向けて一箇所からコンタクトする100を超える標準化されたAPIへのアクセスを提供します

たくさんのサンプルコードが、Arduino IDEのFile > Examples > Bridge > Tembooフォルダにあり、それらはクラウドをYunをつかって開始するにはすばらしい場所です。Temboo getting started pageでは、TembooとArduinoの協働についてもっと学ぶことができます。

Spacebrew


Spacebrewは、"a simple way to connect interactive things to one another(モノとモノを相互接続させる一つの簡単な方法)"です。クライアント/サーバモデル依存しており、2者間通信にWebSocketを使用しています。簡単な通信を許可するpythonで書かれたYun上のカスタムWebサーバが動作しています。


Yun上で動作するSpacebrewの多くのサンプルコードが用意されています。Spacebrewの詳細は、project documentation pageを参照してくだい。

Linux上にへ追加ソフトウェアのインストール


YunのOpenWrt-Yun上には、"curl"や"python"などのいくつかのソフトウェアがプリインストールされています。ほかのソフトウェアもYun上へインストールすることも可能です。Linuxシステム上で、"package management system(パッケージ管理システム)"と呼ばれるツールを使って追加のソフトウェアをインストールできます。詳細情報は、package managerチュートリアルを参照してください。

次のステップ


これで基礎は終了です、Bridge library and examplesに対してより深く掘り起こすことができるようになっていることでしょう。追加情報のあるYunハードウェアページもチェックしておきましょう。




Arduino getting started guideの文章はCreative Commons Attribution-ShareAlike 3.0ライセンスに準拠しています。ガイド内のサンプルコードはpublic domainとしてリリースされています。

-------

なるほど、新たにわかったことは、だいたい以下のとおり。

・RESTがはなっから使えるようになってる
 LuCiやLininoで設定は必要だけど、デジタル・アナログピンの読み書きなら
 デフォルト状態でも用意されてるので、32U4側に一切Sketchを書かなくても
 RESTコールできる仕組みを用意してくれている
 しかもフラッシュへの書き込み(通電していない場合ある場合関係なく
 データの永続化)もできる。


・Arduino Yunには32U4、AR9331、WiFiの3プロセッサが搭載されている
 で、本体にはリセットスイッチが3つあるわけね..なるほどなあ..

・32U4にはSDカードやUSBポートは一切繋がっていないこと
 そうか全部 LinuxであるOpenWrt-Yun上のデバイスとして認識させてるのか..

・Arduino Yunデバイスは仮想だったこと
 たしかにArduino UNOをつかってプログラムをアップロードする時
 はデバイス自体の認識が全然切れないけど、
 Arduino Yunの時は一瞬切れる。
 しかもたまーにべつのCOM番号を割り当てることがあったが、
 こういうことだったのか..

・TembooとArduinoがパートナー
 でTembooだけサンプルコードがArduino IDE上に最初っからあったのね..

・Spacebrewもサンプルが既にIDE上にある
 予想通りArduino社は、家電とかIoTデバイスの上にAVR系マイコンを載せた
 設計をしてもらおうと計画してたのね..
 Spacebrewは日本語情報が少ないなあ..



IoTデバイスのプロトタイプボードとしてのArduinoの立ち位置確保は
だいぶ前から狙っていたわけか..

でも一つ誤解があった。
Ciaoといい、SpacebrewといいArduino社のアーキテクトも標準がどこにおちつくか
迷ってると思っていたけど、
プロトタイプボードとしてはむしろなんでもやる、

そして

単にUNOにESP8266をつむ設計にしなかったのは

Linux OSを搭載するプロセッサとのシリアル連携

で、どうせ最後は直結するのだけど
テストベッドとしては
どんなデバイスに対しても一旦AR9331をかませておきたかった。

そして、
Sketchプログラミングは常に極小になるように
関心の分離をさせていきたかったってとこか..



..頭いいなあ、Arduinoのアーキテクトは..

アーキテクチャにぶれない背骨(思想)が入ってる。



p.s. 
(..というか、与太話)


そしてArduino社は、IoTに対して
ジオンの一年戦争にかけるかのごとく気合が入ってる

だってBraccioっていう二の腕ロボットなんか..わざわざ売り出す?
UNOだって派生が多いし..LilyPadなんて水陸両用モビルスーツみたいなもんでしょ..
いろんな装備(シールド)もできるし、

コピーされて他社製AVRマイコン(アナハイムのガンダム)つくってもなにもいわんし..


IoT=一年戦争Arduino=ジオン(ジオニック社?)ザク=UNO ってかんがえると
いろいろ辻褄合ってくるんだよなあ..


あ、ゲルググはArduino UNO WiFiね。で、Leopard Etherは量産競争に負けたギャン。

Arduino Yunは..
やり過ぎ&オールレンジ対応のところが
ニュータイプ用のキワモノモビルアーマー
ぽくない?

エルメスというより、ちょっと怖いビグザムじゃないか..と




...スミマセン、仕事、戻ります..

2016年5月23日月曜日

Arduino Yunの"Guide for Windows user to upgrade the u-boot"を翻訳してみた

Arduino YunのLininoOSを最新版にするとシリアル経由によるネットワーク通信ができなくなってしまう問題が発生した。

ひょっとしてOSはあげたけどu-bootを更新していないのが問題かも..とおもい

Guide for Windows user to upgrade the u-boot
http://labs.arduino.org/Guide+for+Windows+user+to+upgrade+the+u-boot

を翻訳してみた。
以下参考にする場合は at your own risk でお願いします。

-----

Windowsユーザのためのu-bbotアップデートガイド


WindowsユーザのU-bootアップグレード


Windowsユーザであるならば、このガイドに従ってください:

- 最初に以下の手順を実施してください:
1) (micro)USBケーブルを使ってボード(microUSBポート)とPCを接続してください。
2) ボードをEthernetに接続してください

図1 → http://labs.arduino.org/dl1483?display&scale=0.1

3) Arduino IDE 1.7.8以降(もしそうでなければここからダウンロード)を起動し、メニュー File>Examples>Bridge へ進み、Sketch YunSerialTerminal をひらいてボードへアップロードしてください

図 2 → http://labs.arduino.org/dl1484?display


- 次のいずれかのリンクから最新u-bootをダウンロードしてください:
1) Arduino Yunの場合、ここをクリックしてください
2) Arduino Yun miniの場合、ここをクリックしてください

- TFTPサーバをインストールしてください:
1) Windows TFTP ユーティリティを使う場合は、ここからダウンロードできます
2) 管理者ユーザでツールをインストールしてください

図 3 → http://labs.arduino.org/dl1485?display&scale=0.7
図 4 → http://labs.arduino.org/dl1486?display&scale=0.7
図 5 → http://labs.arduino.org/dl1487?display&scale=0.7
図 6 → http://labs.arduino.org/dl1488?display&scale=0.7
 
3) TFTPユーティリティを起動し、次の図のようにセットしてください。

図7 → http://labs.arduino.org/dl1489?display&scale=0.7
図8 → http://labs.arduino.org/dl1490?display&scale=0.7

u-bootファイルのパスを選択してください:
図9 → http://labs.arduino.org/dl1495?display&scale=0.7
図10 → http://labs.arduino.org/dl1496?display&scale=0.7
 
IPアドレスをセットしてください
図11 → http://labs.arduino.org/dl1497?display&scale=0.7
 
設定完了したら、OKボタンをクリックしてください。
図12 → http://labs.arduino.org/dl1498?display&scale=0.7

4) Serverをクリックして動作を確認してください

- u-bootコンソールに入ってください
1) シリアルモニタを開いてください
2) (ボード上の)YUN RSTボタンを押し、(シリアルモニタの入力欄に)linコマンドを入力、(シリアルモニタの)送信ボタンを押してください
図13 → http://labs.arduino.org/dl1502?display&scale=0.6

3) しばらくすると以下の様なu-bootプロンプトが表示されます
ar7240>

- 入力ミスに注意しながら次のステップを実行してください:
Linino U-Bootプロンプトから、次のコマンドを実行してください:(Ethernetケーブルに接続されていることを確認してください)
setenv serverip ‹TFTPサーバのIPアドレス›; setenv ipaddr ‹Lininoボード側IPアドレス›;

以下の2行は入力例です:
ar7240>setenv serverip 192.168.60.124;
ar7240> setenv ipaddr 192.168.60.182;

図 14 → http://labs.arduino.org/dl1506?display&scale=0.6

次の例にならってTFTPサーバへpingを打って、テストしてください:
ar7240> ping 192.168.60.124

図 15 → http://labs.arduino.org/dl1505?display&scale=0.6

pingが成功したら、このガイドを継続してください。そうではない場合はネットワークやTFTPサーバ調べるかもしくはここをクリックして直接ピアツーピア接続するためのガイドに従ってください。

- Arduino Yunの場合:
tftp 0x80060000 u-boot-linino-yun.bin;

Arduino Yun Miniの場合:
tftp 0x80060000 u-boot-linino-yun-mini.bin;

以下の例は、Arduino Yunの場合です:
ar7240> tftp 0x80060000 u-boot-linino-yun.bin;

図 16 → http://labs.arduino.org/dl1507?display&scale=0.6

図16 のように正しくダウンロードできた場合のみ、フラッシュや新規u-bootコピーを削除することができます。
失敗した場合、Ethernet接続が存在するかどうか、TFTPサーバが適切な位置に存在するかどうかを確認してください。
TFTPが失敗した場合、絶対に次のコマンドをタイプしないでください!
旧u-bootの削除:
ar7240> erase 0x9f000000 +0x40000;

図17 → http://labs.arduino.org/dl1509?display&scale=0.6

次のコマンドを実行することで、新規u-bootがコピーされます:
ar7240> cp.b $fileaddr 0x9f000000 $filesize;

図18 → http://labs.arduino.org/dl1510?display&scale=0.6

おめでとうございます!新しいu-bootが準備出来ました!再起動したu-bootコマンドラインから新規カーネルイメージインストールを実行してください。

ar7240> reset

デフォルトでは、新規ブートは250kボーレート使用しています。キーコンビネーション~1 (ASCIIコード: ALT 126, 1)と ~2 (ASCIIコード: ALT 126, 2)を使って、ボーレートを115200もしくは250000baudsへ変更してください。

注意:時々最初のキャラクタが正しく認識されないことがあるので、このような場合は ~~1 もしくは ~~2 とタイプしてください。

リセットコマンドのあと、新たにu-bootプロンプトが表示されるので、u-bootコンソール内でlinコマンドをタイプしてください:

U-Boot 1.1.5-linino-g17593166-dirty (Oct  4 2015 - 02:12:32)
Linino Board (ar9331) U-boot
DRAM:  64 MB
Top of RAM usable for U-Boot at: 84000000
Reserving 218k for U-Boot at: 83fc8000
Reserving 192k for malloc() at: 83f98000
Reserving 44 Bytes for Board Info at: 83f97fd4
Reserving 36 Bytes for Global Data at: 83f97fb0
Reserving 128k for boot params() at: 83f77fb0
Stack Pointer at: 83f77f98
Now running in RAM - U-Boot at: 83fc8000
Flash Manuf Id 0xef, DeviceId0 0x40, DeviceId1 0x18
flash size 16777216, sector count = 256
Flash: 16 MB
In:    serial
Out:   serial
Err:   serial
Net:   eth0: b4:21:8a:00:00:00
eth1: b4:21:8a:00:00:01
eth0, eth1
autoboot in 4 seconds (stop with 'lin')...
linino>

次のコマンドをタイプすることで設定を確認することができます:
linino> printenv

次のように表示されなければなりません:
linino> printenv
bootargs=
bootcmd=run addboard; run addtty;run addparts; run addrootfs; bootm 0x9fEa0000
bootdelay=4
baudrate=250000
ethaddr=0xb4:0x21:0x8a:0x00:0x00:0x10
ipaddr=192.168.1.2
serverip=192.168.1.1
board=linino-yun
addboard=setenv bootargs board=${board}
console=spicons
addtty=setenv bootargs ${bootargs} console=${console}
mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env),14656k(rootfs),1280k(kernel),64k(nvram),64k(art),15936k@0x50000(firmware)
addparts=setenv bootargs ${bootargs} mtdparts=${mtdparts}
addrootfs=setenv bootargs ${bootargs} rootfstype=squashfs,jffs2 noinitrd
erase_env=erase 0x9f040000 +0x10000
dir=
lu=tftp 0x80060000 ${dir}u-boot-${board}.bin&&erase 0x9f000000 +$filesize&&cp.b $fileaddr 0x9f000000 $filesize
lf=tftp 0x80060000 ${dir}lininoIO-generic-${board}-rootfs-squashfs.bin&&erase 0x9f050000 +$filesize&&cp.b $fileaddr 0x9f050000 $filesize
lk=tftp 0x80060000 ${dir}lininoIO-generic-${board}-kernel.bin&&erase 0x9fEa0000 +$filesize&&cp.b $fileaddr 0x9fEa0000 $filesize
stdin=serial
stdout=serial
stderr=serial
ethact=eth0
Environment size: 1044/65532 bytes
linino>

もしUBoot環境設定が上のリストどおりであれば、"コンソールをttyATH0へ変更して正しくbootargsを設定する(Set properly the bootargs changing the console to ttyATH0)"と呼ばれるステップへ直接すすめることができます、さもなければ次に続くステップに従い新規デフォルト環境を適してください:
linino> erase 0x9f040000 +0x10000;
Below the output on monitor:
linino> erase 0x9f040000 +0x10000;
Erase Flash from 0x9f040000 to 0x9f04ffff in Bank # 1
First 0x4 last 0x4 sector size 0x10000
   4
Erased 1 sectors

ここで、リセットします。
linino>reset;

ボードの再起動後にデフォルト環境がしようされているコンソール上に"*** Warning - bad CRC, using default environment"といったメッセージが出ます。
U-Boot 1.1.5-linino-g17593166-dirty (Oct  4 2015 - 02:12:32)
Linino Board (ar9331) U-boot
DRAM:  64 MB
Top of RAM usable for U-Boot at: 84000000
Reserving 218k for U-Boot at: 83fc8000
Reserving 192k for malloc() at: 83f98000
Reserving 44 Bytes for Board Info at: 83f97fd4
Reserving 36 Bytes for Global Data at: 83f97fb0
Reserving 128k for boot params() at: 83f77fb0
Stack Pointer at: 83f77f98
Now running in RAM - U-Boot at: 83fc8000
Flash Manuf Id 0xef, DeviceId0 0x40, DeviceId1 0x18
flash size 16777216, sector count = 256
Flash: 16 MB
*** Warning - bad CRC, using default environment
In:    serial
Out:   serial
Err:   serial
Net:   eth0: b4:21:8a:00:00:00
eth1: b4:21:8a:00:00:01
eth0, eth1
autoboot in 4 seconds (stop with 'lin')...
linino>

linコマンドをタイプして送信ボタンを押してください。

警告メッセージを避けるためには次に続くコマンドをUBootコンソール上に与えてください。
linino> saveenv

以下のように表示されます:
linino> saveenv
Saving Environment to Flash...
Protect off 9F040000 ... 9F04FFFF
Un-Protecting sectors 4..4 in bank 1
Un-Protected 1 sectors
Erasing Flash...Erase Flash from 0x9f040000 to 0x9f04ffff in Bank # 1
First 0x4 last 0x4 sector size 0x10000
   4
Erased 1 sectors
Writing to Flash... write addr: 9f040000
done
Protecting sectors 4..4 in bank 1
Protected 1 sectors
linino>

コンソールをttyATH0に変更する適切なbootargsをセットしてください:
linino> setenv console ttyATH0,250000
linino> saveenv

以下のように表示されます:
linino> setenv console ttyATH0,250000
linino> saveenv
Saving Environment to Flash...
Protect off 9F040000 ... 9F04FFFF
Un-Protecting sectors 4..4 in bank 1
Un-Protected 1 sectors
Erasing Flash...Erase Flash from 0x9f040000 to 0x9f04ffff in Bank # 1
First 0x4 last 0x4 sector size 0x10000                                                                                                                                 4
Erased 1 sectors
Writing to Flash... write addr: 9f040000
done
Protecting sectors 4..4 in bank 1
Protected 1 sectors

最期にコマンドライン上にresetとタイプしてください:
linino> reset

これでu-bootがアップグレード完了です。

-------

TensorFlow Serving 1.0 リリースのブログ記事を翻訳してみた

今朝、Twitterをみると、こんな記事がながれてきた。 With #TensorFlow Serving 1.0 you can apt-get install tensorflow-model-server Learn more here: https://...