Arduino でAVRプログラムライター

先回、ArduinoのIDEに同梱されているスケッチでAVRプログラマを作成できると知識だけで(無責任に)書いたのだが、本当にできるんだろうね、と検証してみたので結果を書いておく。

結果  できました。

前置き:
ATMELのサイトを眺めてみると、もっとも安価でかつポピュラーな純正プログラムライターはATMEL AVRISP MK2 なるものだが、価格は、とみると$34となっている。 本格的に開発に使おうとするならAVRDragonというのが良さげだが、これが$49.

MK2はArduino Unoの値段とほぼ同じ。 またAdaFruit.com でAVRプログラマシールドなるものを売っているが、シールドにZifソケットや328Pチップをつけてくれているとは言え、$17. これにArduinoを購入することになるので$50くらいの出費になる。これまたAVRDragonとほぼ同じ値段。

Arduino Proとか$10くらいの廉価品を買ってきてセットアップすれば本格的なライターより安くは組めるだろうが同じくらいの出費をするなら専用ライターを買ったほうが良いに決まっている。(Atmel Studioという統合型のIDEでデバッグなどにそのまま使える) Arduinoを使ってAVRプログラマを作成するというのはどこかに使っていないArduinoが転がっていて、かつAVRとC(++)をちょっと試してみようか、という状況ならともかく、普通はなるべく安いライターを探すことをまず考えるだろう。ま、arduinoを使えば、AVRに挫折したときに改めてArduinoとして再利用できる、という利点はある。実はAvrdudeを使えばプリンタ用のパラレルポートから直接ワイヤーを配線してAVRマイコンをプログラムすることが可能(つまりライターすらいらないの)だそうだが、最近のパソコンではパラレルポートなど実装していない。 (追記:amazon.comで$6のUSB ISPプログラマを売っているのを見つけた。現在のところこれが最安値)

本文
で、自分の場合、うっかり買ってしまったArduino Microという小さなArduino boardが手元に転がっていた。 そこで、このArduino Microに Arduino IDEのメニューのSampleの中から”Arduino ISP”というサンプルスケッチをアップロードし、このプログラムの中に書いてある通りにブレッドボードに配策し、試してみても動かない。

延べ4時間くらい、はまってしまったのだが、ネットを調べて最終的にはマイコンチップをプログラムできるようになった。 要点をかいつまんで書いておく。
1.Arduino MicroはArduino Leonardと同じく32u4というマイコンチップを使っている。 従前のArduinoが使っていたAtmega328Pというチップではない。このため、DigitalPinに対する入出力ポートの割り付けが従来とは異なっている。
2.このため、上記のスケッチで #define RESET SS となっている部分はUnoなどではPin10があてがわれるが、マイクロとLeonardではPin17に定義されている。 このPin17、RX_LEDへと接続されてしまっているので、上の表記は #define RESET 10 とPin 10に明示的に変更してやる必要がある。
3.同じようにSPI用のピン3本(MOSI,MISO,SCK) スケッチ上のコメントでは11,12,13の3つの出力に接続するような指示になっているが、Micro (Leonardも)の場合、SPIはこれらのピンにはマッピングされていない。幸いなことにMicroの場合、MOSI,MISO,SCKの3本がヘッダーピン配列に物理的に存在しているので、ここに接続してやることになる。(Leonardの場合はUnoと同じヘッダーピン配置というのが災い?してこれらのピンは存在しないので、ICP用の6本ピンヘッダーの当該PINにそれぞれ接続することになる。(ただし、ResetはPin10に接続)

回路図的にはこんな感じ。

Arduino Micro as AVRISP

Arduino Micro as AVRISP ダブルクリックで大きな図を見る

実際のブレッドボードへの配策はこんな感じ。

AVR ISP using Arduino Micro (at left)

AVR ISP using Arduino Micro (at left)左のArduinoMicroで右のATmega168をプログラムする図

手順だけ羅列すると
1.Arduino のSample sketchからArduino ISP をIDEに読み込み、#define reset SS を #define reset 10と書き換える。
2.”Arduino as ISP”スケッチをArduino Microにアップロード
3.上のようにワイヤを配策。LED3点については無くてもOK(だがあると恰好よい)
4.CファイルをAVR-GCCでコンパイルし、生成できたHEXファイルをAVRDUDEを使ってアップロード, あるいはArduino IDEでスケッチを作成、sift-Uploadでターゲットをプログラム。(この部分の説明は記事を改めていずれそのうち)

Arduino とは何か

今まで何度も取り上げていて、いまさら何かと切り出すのもなんだが、一度整理しておく。
はじめてArduinoのをみたのはおそらく2010年の年末だ、なんと近所のRadio Shackで入門本と一緒に売っていた。 (RadioShackが昔のように、電子工作の小物を置くようになったというのは非常にうれしいことである。最近はRaspberry PiとかBeaglebone Blackの入門キットも売っている。 閑話休題)
BasicStampに比べると値段が手ごろだったので購入したのだが、このときの解釈は Arduino = 開発ボード

しかし、入門本を読み、LEDの点灯を試み、サーボモーターやリレーの操作、さらには16×2ケタのLCDを表示するという一応のイニシエーションを行ったあと、改めて眺めてみれば、Arduino というのは開発ボード(だけ)ではなかった。

ボードを購入したあと、ユーザーはArduinoのサイトから開発環境をダウンロードしてプログラミングすることになる。 このときSketchという言語でプログラムを書くのだが、これはWiringという言語がもとになっている。 そしてWiringもSketchも基本的にはC言語を使ったFrameWorkだ。

IDEのGUIはJavaでできているものの、そのバックグランドで動いているものはAVRマイコン用に特化したGCC(AVR-GCC)であり、AVRDUDE(AVR Downloader/UploaDEr) という、マイコンプログラムの先人達によって鍛えられたAVRマイコン用のTool chainである。

ではArduino環境は従来のマイコン開発環境と比べると何が違うのか。
-ハードもソフトもできる限りのアブストラクト化がなされている。
という一点につきる。 AVR8はportB,C,D それぞれ8ビットが入出力になっており、本来のATMEL のC言語の操作ではこれらのポートレジスターにビット操作での書き込みをおこなっていた、つまりPortBの ビット0とか6とかを気にしてコーディングしていくのだが、 アブストラクション(抽象化)を行った結果、 ArduinoのユーザーはDigital pin 0~13, Analog input pin 0~5 という入出力ピンの操作だけを考えればよいようになっている。
スケッチもSetup()という初期化ルーチンとloop()という繰り返しルーチンを書けば、あとはTool chainがコンパイルし、プログラムをアップロードしてくれる。 このからくりはArduino のプログラムフォルダー(自分のWindows環境ではC:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino)の中のmain.cppを眺めてみるとなんとなく見えてくる。

#include <Arduino.h>

int main(void)
{
	init();

#if defined(USBCON)
	USBDevice.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        
	return 0;
}

何故にwhileを使わず、for(;;) という構文を使っているのか、という疑問はさておき、Arduino のスケッチはこの上のmain.cppに組み込まれるsetup()とloop()関数を定義しているというわけで実際にコンパイルされるのはC++のソースだった。

Arduinoでは多くの周辺デバイスとのインターフェース、通信プロトコルなどはすでにライブラリーで提供されている。 またArduino自体にマイコンチップをプログラムできるような周辺回路およびブートローダーが組み込んてあるからチップにコードを焼くための専用プログラマが必要ない。

下のコードは、入門本で一番最初に出てくるLEDを点滅させるためのスケッチコード

int led = 13;
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

ところがArduinoのIDEがインストールされたPC環境ではすでに上に述べたようにGCCとかtoolchainとかが導入済みになっているため、 以下のようなプログラムををCで書いて、コマンドラインを使ってコンパイルし、Arduinoへ書き込みをすることが可能になっている。 下のコードでやっているのは上 のスケッチと同じくPin 13を点滅させることだが、ArduinoスケッチのProgramがコンパイルしてアップロードするサイズが1000バイト以上あるのに対し、下のプログラムは200バイト以下になる。abstractionの代償はプログラムのサイズということらしい。


#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>

#define LED      PB5
#define LED_DDR  DDRB
#define LED_PORT PORTB
#define DELAYTIME 500 //delay 500ms. See _delay_ms definition

#define setBit(sfr, bit)     (_SFR_BYTE(sfr) |= (1 << bit))
#define clearBit(sfr, bit)   (_SFR_BYTE(sfr) &= ~(1 << bit))
#define toggleBit(sfr, bit)  (_SFR_BYTE(sfr) ^= (1 << bit))
long i;
int main(void)
{
    // setup()
    setBit(LED_DDR, LED);                      /* set LED pin for output */

    // loop()
    while (1) {

	    setBit(LED_PORT, LED);
	    _delay_ms(DELAYTIME);
	    clearBit(LED_PORT, LED);
		_delay_ms(DELAYTIME);
	    
    }
}

while分がArduinoスケッチのloop()に相当し、その上がsetup()に相当する。
上をblink.c というファイル名で保存し、Arduinoがつながった状態でコマンドラインから以下を実行するとLEDの点滅を始める。(もちろんserial portによってCom5部分は異なる)

>avr-gcc -Os -mmcu=atmega328p blink.c -o blink.o
>avr-objcopy -O ihex blink.o blink.hex
>avrdude -p atmega328p -c arduino -P com5 -U flash:w:blink.hex:i

コマンドライン3行をターミナルモードで打ち込むわけだが、Batch file にしてもよい。その実行はarduinoのアップロード機能を使うのに比べて恐ろしく早い、ということも実感できると思う。
Arduinoを使うのは野球のグローブをつけて裁縫をやるようなものだ、とかなんとか言った人がいる。 抽象化が過ぎてマイコンをプログラムしている気がしない、ということで、たしかに熟練者の目からみればもっともな話かもしれないが、Arduinoの一番の目的はマイコン学習を始めるための第一歩を容易にすることにある。(と思う) 豊富なサンプルコードやライブラリーを見るとその楽ちんさは尋常ではない。ハードとソフトの両方への入門が可能な環境になっている。 ずうっとArduinoとスケッチでいいじゃない、十分だよ、という気にもなってくる。 それにArduino IDEのサンプルメニューを眺めているとわかるが、Arduino自体をAVRマイコンのプログラマにしてしまうスケッチがご丁寧に同梱されている。 Arduinoにものたりなくなってきたら、(入出力が6本以下のマイコンでできることを、何が悲しゅうて28ピンのマイコンプラス不要な回路を載せたボードでやってまんねん、自分はミニマリスト的なアプローチがすきやねんとか思いはじめたら)ATtinyのチップだけ100円で購入してArduinoを使ってプログラムを焼くことも可能になっているわけだ。

PICAXE -Basicで動かすマイクロコントローラ

20年以上前になるがBasicStampというベーシックで動かせるマイクロコントローラーが世の中に出てきた。(今でも健在) それなりに興味があったわけだけれど、始めるのに100ドルくらいはかかりそうだったので、それがバリアになり、手を出さずにいた。 PICマイコンというのが世の中に出回り始め, Basic StampというのはこのPICをベースにしたBasic 内蔵のボードだったわけで、 面白そうだったけれど開発環境を作るのが面倒くさそうで手を出さずにいた。
そのうちAVRマイコンを使ったArduinoが開発され、これは30ドルのボードを買ってきて手持ちのパソコンにつなげればすぐに開発が始められるという手軽さ。 多くの電子工作入門者、あるいはメーカーと呼ばれる人々はArduinoでこの世界に足を踏み入れた、というのが現在の状況だと思う。
今回、ひょんなことからPICAXEというチップの存在を知った。PICベースでBASICを内蔵させた開発環境だという。一番小さな8ピンのPIXACE08M2というのがsparkfunで購入して一個$2.95.プログラミングに必要な3.5ミリのステレオジャックを含んだプロトキットが4ドル。 一番高いのがパソコンに接続するためのUSB/シリアルの変換ケーブルで、これが25ドルしているのだが、Sparkfunのオリジナルで15ドルのUSB Programmer が代用できる(ただし、別途ステレオプラグケーブルが必要) というわけで入門価格として
PICAXE 08M2 X 2 = $5.90
PROTOKIT X 1 = $3.95
PROGRAMMER X 1 =$14.95
ステレオプラグケーブル:手持ち品を流用
USB – MINI USB CABLE 手持ち品を流用
5v 電源 手持ち品を流用
送料 $6.00
合計$30.80 となり、 価格バリアもクリア  したので購入し、試してみた。

開発環境はPICAXE のホームサイトからダウンロードできる。 オリジナルのpicaxeは4mHZで動いていたようだが、最新のM2シリーズは32MHzと高速になっている ただし、普通に動かすとBasicは4Mhzで動作し、疑似的に4本までの並列処理が可能になる。

8ピンのチップと言っても電源とグランド以外のピンは6本とも入出力ピンに使えるし、PWM出力やアナログ入力もこなせる。なかなか使い勝手のよさそうなチップである。 ピンの出力も20mAまでOKなのでArduinoと同等だ。

LEDを点滅させるプログラムは以下のようになる。

main:
high c.1
pause 500
low c.1
pause 500
goto main

昔なつかしのBASIC言語である。 いまとなってはGoto文が新鮮に見える。 プログラム用のメモリーは2048byteあるが、Tokenizeされてチップ上にアップロードされる上のコードは14バイトにおさまる。

これで出力ピンにLEDと抵抗を直列に接続すれば、1秒ごとに点滅するLED回路となるわけだが、 32Mhzで動かした場合、どれくらいの速さで出力ピンを操作できるのか試してみた。 最初のコマンドでBasic を8倍速させている。

setfreq m32
main:
high c.1
low c.1
goto main

これでC.1のピン波形をとらえたのが以下

Manupulate picaxe pin

PICAXEピン出力

 

Hi出力の幅が36マイクロ秒に対し、Lo出力の幅は126マイクロ秒, 周波数6.156Kということになる。Hi,の出力にくらべてLowの出力が長いのは、gotoコマンドの実行に時間がかかっている、ということだろうが、 32Mhzのマシンサイクルに対して出力できたのが6Khz。 Basic Interpreterで動作させることのオーバーヘッドがいかに大きいかがわかる。 ちなみにPICAXEのサイトでは1秒間に実行できるBASIC命令文は約4000と説明されている。

実際にいたずらするには問題のない実行時間だと思う。 さらに、もっと細かいパルスを出力するためのServo や 内蔵PWM出力用のコマンド、あるいは可聴域信号を発生するためのtune コマンドなどが別に用意されているから、パワフルなマイコンであることに変わりはないが


Pause 1

できっちり1ミリ秒遅らせられるわけではない、ということがわかる。

それにしても、何度もいうけど電子工作するのに本当に便利な世の中になったもんだ。

Python3 の文字列 覚書

Python3ではstring = unicode

string をアレーとして考えてslice するときもマルチバイト文字を気にする必要がない。

>>> s = 'pythonに、どっぷりつかる'
>>> len(s)
15
>>> s[8:]
'どっぷりつかる'
>>> s[:6]
'python'
>>> s[:7]+s[8:12]
'pythonにどっぷり'
>>> 

ただ、よいことばかりではなく、fileなどからのIO処理では読み込まれるのがバイト列になるため変換をしてあげる必要がある。 Python 2.7では必要なかったのでPython2.xのプログラムを移植するときに注意が必要。encode()としてunicodeのバイト列表示、decode()でUnicodeのバイト列をUnicodeの文字列表示

>>> s.encode()
b'python\xe3\x81\xab\xe3\x80\x81\xe3\x81\xa9\xe3\x81\xa3\xe3\x81\xb7\xe3\x82\x8a\xe3\x81\xa4\xe3\x81\x8b\xe3\x82\x8b'
>>> b'python\xe3\x81\xab\xe3\x80\x81\xe3\x81\xa9\xe3\x81\xa3\xe3\x81\xb7\xe3\x82\x8a\xe3\x81\xa4\xe3\x81\x8b\xe3\x82\x8b'.decode()
'pythonに、どっぷりつかる'
>>> 

最初のバイト列がUnicode以外の文字列の場合はencodingを指定

>>> chara = b'\x63\x6c\x69\x63\x68\xe9'
>>> print(chara)
b'clich\xe9'
>>> print(chara.decode('latin-1'))
cliché

Pythonの関数定義とパラメーター

Python3 をいじっていく中で、気が付いたことをこのプログにぼちぼち書き留めておこうと思う。

Pythonの関数定義ではパラメーターも戻り値もタイプを指定しない。C++,Java,Pascalなどの知識のある学習者には異常に見えるが、Python は loosely typed language なんである。

>>> def foo(a,b,c):
	return a*100 + b*10 + c

>>> foo(3,2,1)
321

パラメーターに初期値を持たせることができる。 パラメーターを指定しない場合はその初期値が使用される。

>>> def bar(a=1, b=1, c=1):
	return a*100 + b*10 + c

>>> bar()
111
>>> bar(3)
311
>>> bar(3,4)
341
>>> bar(3,4,1)
341

さらにはパラメーターを明示すれば、カッコ内に現れる順序を気にする必要がなくなる。

>>> foo (a=5,c=2,b=1)
512
>>> bar(c=3,b=2)
123
>>> bar(c=9)
119
>>> bar(c=6,b=4,a=2)
246

beaglebone black GPIO ピンの謎

GPIOというのはGeneral Programmable IOという意味でつまりは、用途に合わせて設定できる入出力ピンということだ。 ソフトウエアで設定すれば入力ピンにも出力ピンにもなるという便利もので、40年前に電気工学を勉強した自分にとっては夢みたいなハードウエアなのだ。
BeagleboneBlackにはこのGPIOピンが69pinも用意されている。(とはいうもののHDMIとeMMC support用にリザーブされているピンもあるので全部が即使える、というわけではない. それでも30本以上はありそうだ) デジタル入出力のほかにもアナログ入力や出力に使えるピンも何本か用意されている。

ただ、出力ピンにした場合、その出力電流はソースで4ミリアンペア、シンクで6ミリアンペアとなっており、それほど大きな電流が流せるわけではない。 ちなみにArduino は 各ピン20mA、ピントータルで400mA。 Derek Molloy さんのyoutube ビデオでは、これを鑑み、LEDを点灯させるのに小さなトランジスタをかましている。(http://www.youtube.com/watch?v=wui_wU1AeQc)

これが正解だと思うのだが、 Adafruitのサイトのチュートリアルでは初心者を考えたのか、トランジスタを省略し、470オームの抵抗をLEDに直列にいれて、これを直接駆動している。 あのSimon Monk氏が書いているTutorialで、470オーム以下の抵抗値は使わないように、という指示がある。 この場合、 普通に売っているLEDのフォワード電圧が20mA通電時で1.85V~2.5Vと考えると(3.3-2.0)/470~(3.3-1.85)/470=1.7mA~3.08mA. 一応4mA以下となるので、OKということらしい。写真を見ると、これでも結構明るく点灯している。

最近みたこのサイトの場合はもっと過激で、50~100オームの抵抗を指定している。 (ちなみに作者はMaker: からRaspberry PiやBBBの入門書も出版していて、ちらっと見た限りではこの書籍の中でも100オームを指定していた。)
100オームを使った場合だと、電流量は 最悪 12mA程度になる。 50オームだとその倍で、20mAになる。さらに、100オームの場合だとフォワード電圧が飽和しないので、実際には12mA以上になるはずで、当然ICメーカーの指定仕様は超えている。 平気なのか、と思うが、実際に数分だけやってみたところ平気だった(おい) ただし、これはTIのチップの設計および現物が仕様に対してマージンを持っている、ということで、、LED1個点灯くらいならまだしも複数個点灯させるのはやはりまずいだろ。

20年前の電気屋の頭でLEDには20mAとはいかなくてもその半分くらいは流したいとおもっっているので、出力ピンにはNPNトランジスタをかませる、というのが、今の自分の結論。

3者三様、LEDの点灯回路

3者三様、LEDの点灯回路

driving-led2

Circuitlab のDCシュミレーションでの計算値。

boneScriptで遊ぶ

Beagleboneblackを電子工作用にリザーブしたので、Angrstrom Linux についてくるbonescriptで遊んでみた。(Debian wheezyのイメージになっていたeMMCにAngstromの最新イメージを改めて焼き直した。) 普通javascriptといえばWEBクライエント用のプログラム言語だし、 C++やJavaなどいじっているプロの方から見るとToy Lanuguageなどとバカにされがちだけれど、自分のような日曜プログラマにとっては非常に重宝するtool なんである。 boneScriptは、このjavascriptをサーバー側で使えるようにしたnode.jsというプログラム上で走る。 BBBのハードウエアをJavaScriptの文法で操作してしまおうという優れものだ。 node.js は一般的にはwebサイトのサーバー側を能動的に管理するような形で使われるのだと思うけれど、boneScriptと組み合わせるとPC上のプログラミング言語として機能する。

JavaScriptの特徴としてプログラムの非同期実行ということがあげられる。jQueryの使い方で一度はまったことがあって、 関数によっては前に呼び出して得たreturn情報を次のステートメントで使うためにはちょっと待てという感じでプログラムの流れをブロッキングするかコールバック処理を使う必要がある。 逆に言えばコールバックを使ってのイベント処理には力を発揮する。

その特徴を使って以下のようなbonescriptをいたずら書きしてみた。BBBに実装されている4つのLEDをてんでバラバラに明滅させる、というだけのプログラム。

//#!/usr/bin/node
//uncomment the above line and chmod +x  to make it shell executable.
//This program will randomly turn on/off four on board LEDs.
// 11/28/2013
//setup()
  var b = require('bonescript');
  var LEDs=['USR0','USR1','USR2','USR3'];
  for (var i=0; i < LEDs.length;i++) b.pinMode(LEDs[i], b.OUTPUT);

//loop();
    for (var i=0;i < LEDs.length;i++) animateLED(LEDs[i]);

//helpers
function animateLED(led){
    function toggleLED(led){ //randomly toggle LED
        b.digitalWrite(led,Math.floor(Math.random()*2)?b.HIGH:b.LOW);
    }
    function randomTimer(){ //randomly set timer between 0~199msec)
        return Math.floor(Math.random()*200);
    }

    setInterval(function(){toggleLED(led);},randomTimer());
}

Arduino の流儀に従って、setup 部分と loop部分を書いてみたが、ごらんのとおり、while/until 的なloopなどしていない。 animateLED()という関数を4回呼び出したあとは、それぞれの関数インスタンスが勝手にタイミングを作って繰り返しの明滅を行っているわけで、それぞれ非同期実行されている。

ところで、
上のスクリプトはCloucd9というIDEから直接実行させる他にも、command line でも

node randomLED.js

というように、実行可能。 いちいちnode を指定するのが面倒ならば、 プログラムの一番上の行にシュバング(#!)を追加してNodeプログラムだということを明示し、

#! /usr/bin/node

randomLED.js を実行可能としておけばプログラム名を指定するだけで実行できる。

$ chmod +x rondomLED.js
$ ./randomLED.js

もともとNode.jsがPHPと同じようにサーバー側のスクリプトを実行することを目的に書かれていることを考えると、bonseScript+Node.jsだけでハードウエアをリモートコントロールできるアプリが書けそうである。

敷居が低すぎる?

ブレッドボーディングするのに簡単な回路図を作成するアプリをさがしていたのだが、目的にぴったりのWEB Serviceを見つけた。
最初はEAGLEというeCAD ツールを使おうと思っていた。 これ自体、配線板のラウティング機能もついた本格的なもので、しかも手のひらサイズの二層までの配線板なら無料バージョンで可能という秀逸品だが、 今回発見したのは
Circuitlab.com というWEBアプリケーション。 回路図の作成がこんなに簡単でよいのか?というくらいに簡単なDrag and Dropで作図ができる。 しかも回路シュミレーション機能がついている。 ホームページに簡単な紹介ビデオがあるが、 作成した回路図をWEB上でシェアすることもできるようになっている。 1週間に20分までなら無料。 商用に使わなければ1年間の使用料が$39ドル。 エディター使い放題でSPICE解析もできるといういことで いわゆる趣味の電子工作、電子回路の自宅学習には非常に便利と思う。
3分の紹介ビデオを見れば使い方はほぼわかるので是非お試しを。 こんなに敷居が低くてよいのか、と思わず思ってしまうのである。

nginx でmodx のFriendly URL をrewrite

まだ十分理解できているわけではないので、最適解かといわれると疑問がのこるが、とりあえずは動いているということで、

server {
server_name cubie2.example.com;
access_log /srv/www/site1/logs/access.log;
error_log /srv/www/site1/logs/error.log;
root /srv/www/site1/public;
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$args @modx;
}
location @modx {
rewrite ^/(.*)$ /index.php?q=$1&$args;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
.
.
.

}

リライトには3回パスをとおしている、ということかな?

CubieBoard っていうのもある。

Raspberry Pi でポピュラーになったHobbyist development board. BeagleBone Blackについては以前にも書いたけれど、他にも色々ある。 先月CubieBoard2というのを入手した。 値段は59ドルだが、corteck A7 デュアルコア 1Ghz、1GB RAM, 4GBNand, 2USB, SATA I/F, HDMI などなど、現時点でこのプライスレンジのボードではダントツのスペック性能をほこる。 これはCubieTechという中国の会社の製品。 SOCはやはり中国のAllwinner製A20。  RaspberryPiがBoradcomm, BeagleBoneがTIとそれぞれの国のSOCを使っているわけで、日本で同じものをつくろうという有志はいないものか?そもそも日本の国産のSOCってあるのかしらん。 閑話休題

この値段で中国から購入したのだが、送ってくるのが船便みたいで、到着するのに約3週間かかった。(当方米国の中西部在住)
また、このボードが売り出されたのが今年の4月ころということもあってfirmware が固まっておらず、 内臓のMali400 Gpu などの性能を十分にひきだせるようなドライバーがまだまだ開発途中。 ユーザーベースも他のボードにくらべて小さい、ということもあり、初心者入門としてはきちんと動くようにするには少しハードルが高い。またADAFRUIT, ELEMENT 14などのリテイラーのパトロンもついていないので米国で周辺部品を入手するにも苦労しそうだ。

というわけでせっかくGPIOが96ピンもでているわけだが、結局、Debian のディストロを導入してHome Server にした(Name Server, Mail server, Web server, reverse proxy)。 導入の仕方はRaspberry Pi, BeagleBone Black でおこなったのとほとんど同じ。 同じLINUXのディストロを使う強みである。 性能的にはBBBでも十分だったが、 このCubie2、専用のケースに入れてみると、Home Server としての貫録十分であるしさすがに1Ghzのデュアルコア。きびきび動いている印象大。 これでBBBとRasPiはPhysical computing のお遊びにつかえるようにしようと我が家のホームネットワークのクリティカルタスクデューティからは外れたわけである。