Propellar イントロダクション
「Propellarをいじってみたいんだけど、どう始めればいいの?」そんな疑問へのソリューションをご提供!
必要なものはこれだけです:
Propellar搭載ボードは何種類か入手可能ですが、ここではQuickStartBoard?(以下クイックスタートボードと表記)を使うことを前提として説明します。
何でかというとですね、クイックスタートボードが一番用意するものが少なく、かつお手軽にプロペラCPUを体験できるからなのです!
では、以下で解説をしていきます。
日本マイクロボット教育社さんで、クイックスタートボードを入手しましょう。
コチラで購入できます→http://www.microbot-ed.com/j_quickstart.html
安くて手早くプロペラを体験できる、オイシイボードです:-)
ちなみに、日本マイクロボット教育社さんは、PARALLAX社さんの日本での代理店です。
http://www.microbot-ed.com/
各種キット・ボードなどを購入できます。
開発環境は無償で入手できます。
2種類ありまして、一つはPARALLAX社公式開発環境、もう一つはBradさんという方が作っている開発環境です。
PARALLAX社公式Spin言語開発環境「Propeller Tool」
→http://www.parallaxsemiconductor.com/support/software
PropellarTool?以外にも、いくつかのツールがダウンロードできます。
最低限必要なのは、「Propeller Tool v.1.3」です。
クイックスタートボードにはUSBシリアル変換チップが搭載されていますが、これのドライバ(USBシリアルドライバ)は、公式開発環境のインストール中に一緒にインストールされます(インストールするかどうかは選択できます)。
PropellarTool?には、Spin言語(後で解説します)のサンプルソースもいっぱい入ってます。すごく勉強になりますので、一読の価値ありです。
「BST - The multi-platform Propeller Tool Suite」
→http://www.fnarfbargle.com/bst.html
Windows/Linux/Macで動作する開発環境です(バイナリはそれぞれ別に用意されてます)。
公式のツールとの違いは
BSTを使うときには、Windows環境ではUSBシリアルデバイスドライバのインストールが必要です。
USBシリアルドライバはPARALLAX公式ページの「Off-site software」の欄にある「Parallax USB Drivers」を見て下さい。
あと必要なのは、PCとMini-USBのケーブルです。
開発環境でプロペラのプログラムを書いてプログラムをプロペラクイックスタートボードに書き込むために、PCが必要です。
PARALLAX公式開発環境を使う場合ですと、Windowsが動作しているPCが必要です。
Brad's Spin Toolを使うなら、Windows、MacOSX、Linux(x86)の3種のOS向けに開発環境が用意されています。
Linuxをお使いの場合、ディストリビューションは何でもいいです。*1
プロペラクイックスタートボードとPCは、USB A〜Mini-USBのケーブルで接続します。
このケーブルは付属してません。なので、適当なのを用意してください。
長さとか適当でいいですが、通信できることが確認されたものを使うようにしましょう。
上記のものが用意できましたら、開発環境をインストールしましょう。
インストールは、公式開発環境とBrad's Spin Toolとでだいぶ違います。
どちらがおすすめ、とは言えません、が!Windowsを使う方はどちらもインストールするのをおすすめしたいです。
サンプルソースがすごく役に立ちますので。
LinuxかMacをお使いの方でも、アーカイブ内のサンプルをなんとかして見ていただきたいです。ゼヒ!
まずアーカイブをダウンロードします。
Setup-Propeller-Tool-v1.3.zipがダウンロードされます。
次に、これを展開します。
Setup-Propeller-Tool-v1.3.exeが出てきます。
そのSetup-Propeller-Tool-v1.3.exeを実行します。
ウィンドウに表示されている内容をお好みかつ適切に設定し、進めていきます。
特にカスタマイズすることはないと思いますので、Completeでいいと思います。
(画像をクリックすると拡大)
インストールフォルダも特に変更しなくてOKです。してもかまいません。
(画像をクリックすると拡大)
途中でUSBドライバのインストールをするかどうかのチェックボックスが出てきます。
すでにFTDI USBシリアル変換デバイスのドライバをインストールしてあるなら、このチェックボックスはオフにしてください。
インストールしてないなら、チェックボックスはオンにしておくのがいいですね。
(画像をクリックすると拡大)
Installというボタンが出てきたら、それを押すとインストールがモリモリ進んでいきます。
(画像をクリックすると拡大)
(画像をクリックすると拡大)
USBドライバのインストールのところで、チェック印をつけた場合は、USBドライバのインストールがここで入り、進行状況が表示されます。すぐ終わりますが。
(画像をクリックすると拡大)
Finishボタンが出てきたら、それを押して終了。
(画像をクリックすると拡大)
こちらは簡単です。
BradさんのWebページからアーカイブをダウンロードします。
そのアーカイブを展開します。
展開して出てくる実行ファイルがBST本体です。それを実行すると開発環境が起動します。
一つ注意しないといけないのは、実行するOSの環境によっては、USBシリアルドライバをインストールしなければならないところです。
ちなみに、OSは Mac OS X 10.6.8 snow Lepard です。 FTDI USB-シリアル変換ドライバを入れてみまたらプログラムのがロードできました。 入手元 http://www.ftdichip.com/Drivers/VCP.htm 以下、私が試した手順です。 1.MacOSX (32bit) 2.2.16 を選択。 →ダウンロードされるファイル:FTDIUSBSerialDriver_v2_2_16.dmg 2.ダウンロードされたFTDIUSBSerialDriver_v2_2_16.dmgをダブルクリック。 →イメージがマウント?されるのでFTDIUSBSerialDriver_10_4_10_5_10_6 をダブルクリック。 ※ディレクトリ内にはFTDIUSBSerialDriver_10_3というファイルも存在するがおそらくMacOSX 10.3はこちらですね。 3.インストーラの指示に従ってインストール 4.再起動の必要無し。 →bsからプログラムがロードできました。(ひゃっは〜)
さて、ここまでで開発環境が起動できて、クイックスタートボードにプログラムをロードできるようになったはずです。
では、実際にプログラムを作れてボードにプログラムをロードできるかどうか、簡単なプログラムで試してみましょう。
プロペラに標準で用意されているプログラミング言語として、「Spin」というのがあります。
コンパイラ型の言語なので、入力→コンパイル→ボードにロードして実行、という手順でプログラムを作ります。
サンプルとして、LEDがナイトライダーのアレ(ネタ古くてごめんなさい)みたいに光るプログラムを入力してみましょう。
'LED Demo ' CON _clkmode = xtal1 + pll16x _xinfreq = 5_000_000 VAR byte LED PUB LedDemo dira[16..23] := %1111_1111 repeat repeat LED from 16 to 23 outa[LED] := 1 waitcnt(clkfreq/4 + cnt) outa[LED] := 0 repeat LED from 23 to 16 outa[LED] := 1 waitcnt(clkfreq/4 + cnt) outa[LED] := 0
段下げ(インデント)は大事です。
Pythonを使ったことがある人は、Pythonと同じくインデントでブロックを表現する、と言えば分かっていただけるでしょうか。(Python使ったことない人ごめんなさい)
とにかく、スペースの1つもそっくり同じく、開発ツールのエディタに入力してください。
各開発環境の起動直後はこのようになってます:
見かけが割と違いますが、今の段階では無視してて問題ないです。
特に、左側に表示されているファイル一覧やディレクトリツリーの表示内容は、みなさんのPCの中身次第で変わりますので、画像のは一例にすぎません。
これの、右側の一番広いとこにさっきのプログラムを入力してください。
単に動作を体験するだけですし、コピペでオッケーです。
サンプルプログラムができましたので、いよいよクイックスタートボードにプログラムを突っ込んでみましょう!
使ってる開発環境が公式Propellar ToolかBSTかで、GUIが少々違います。
以下、それぞれの場合について解説をしていきます。
まず、プログラムが以下のように入力されています・・・よね?
(画像クリックで拡大)
これをコンパイルして、クイックスタートボードへ突っ込みます。
メニューバーから、[Run]-[Compile Current]-[Load RAM]、と辿って、Load RAMを実行してください。
(画像クリックで拡大)
(画像クリックで拡大)
(画像クリックで拡大)
コンパイルが行われ、チェック・ロード・ベリファイが続けて実行されます。
(画像クリックで拡大)
(画像クリックで拡大)
何事もなく「Verifying RAM」のウィンドウが消えたら、何事もなかったかのように戻ります。
(画像クリックで拡大)
そしてクイックスタートボードを見ると!
LEDが左右にピコピコ光ったり消えたりしてますよね?ね?
(画像クリックで拡大)
BSTでは、GUIが公式環境と違うので、少々戸惑うかもしれませんが、できることは同じです。少なくとも今の段階では。
さて、プログラムを入力して、このような状態になってると思います。
・・・なってますよね?
(画像クリックで拡大)
メニューバーから[Compile]-[Compile and Load Ram]、と辿ってコンパイルとロードを実行します。
(画像クリックで拡大)
(画像クリックで拡大)
すると、コンパイル進行表示がでて、そのあとRAMに書き込んだデータのベリファイ進行表示が出てきます。
(画像クリックで拡大)
(画像クリックで拡大)
そして進行表示が消えたらボードを見てみましょう。
どうでしょうか?LEDがピコピコしてますか?
(画像クリックで拡大)
さて、LEDを光らせることができました?
うまく光ったようでしたら、おめでとうございます。Spinプログラム第1弾を実行できましたね。
ではこのあとは、Spinプログラミングにちょっと踏み込んでみましょう。
さっきのLEDチカチカプログラムは、まあそんなに長いプログラムではありませんでしたし、やってることも単純でした。
簡単で短いですが、さっきのプログラムに含まれていた命令だけではたいしたプログラムは作れません。
ということで、ここでは、ちょっと踏み込んだプログラムを見てみましょう。
POVってご存知でしょうか?
POVとは、残像を利用して一列のLEDで文字が見えるようにするというものです。
・・・と、これだけではよく分からないと思いますので、http://portal.nifty.com/2009/08/18/a/ を見てください。
どんなものかすぐに分かると思います。
以下のプログラムを入力し、QuickStart?ボードにロードします。
そして手でボードを持って左右に振ると、PropellerのROMにあるフォント256文字が右から左にスクロールされるのが見えます。
CON _clkmode = xtal1 + pll16x _xinfreq = 5_000_000 {{ OBJ debug : "FullDuplexSerial" }} VAR byte LED_data[48] long Stack[10] PUB main | t, dT, char, next_char, odd, col, col_data, tmp_char, row, row_data, n waitcnt(clkfreq*3 + cnt) ' debug.start(31,30,0,57600) ' debug.tx(0) cognew(Drive_LED(@LED_data), @Stack) t := cnt dT := clkfreq/10 char := $7f94 repeat char += $80 if char > $c000 char := $8014 next_char := char repeat odd from 0 to 1 ' even/odd character ' debug.hex(char,4) ' debug.tx(13) repeat row from 0 to 10 ' row from 0 to 8 if row < 8 ' debug.str(string("column data")) ' debug.tx(13) repeat col from 0 to 7 ' column from 0 to 7 tmp_char := col * 12 + char ' address for column data col_data := long[tmp_char] ' get LONG data ' debug.hex(col_data,8) ' debug.tx(13) row_data <<= 1 row_data += getRow(col_data,odd,row) ' debug.tx(13) else row_data := $0 waitcnt(t += dT) ' debug.bin(row_data,8) ' debug.tx(13) repeat n from 0 to 46 LED_data[n] := LED_data[n+1] LED_data[47] := row_data ' debug.bin(LED_data[47],8) ' debug.tx(13) char := next_char PRI getRow(col_data,odd,row): bit | x if odd == 1 x := lookupz(row:$20, $200, $800, $8000, $80000, $800000,$2000000, $20000000) ' odd character else x := lookupz(row:$10, $100, $400, $4000, $40000, $400000,$1000000, $10000000) ' even character if x & col_data bit := 1 else bit := 0 PRI Drive_LED(addr) | index dira[16..23]~~ repeat repeat index from 0 to 47 outa[16..23] := byte[addr][index] waitcnt(clkfreq/1000 + cnt)
では解説。
コードの中で{{ }}で囲まれた複数行、' に続く文字列はコメントと見なされます。
Spin言語でも他の大抵の言語と同じく、サブルーチンが定義できます。
Spin言語では、ソースファイルを1つのオブジェクトとして、他のソースファイルのコードを取り込み、そのソースファイルに含まれるサブルーチンを呼び出すことができます。
PRI getRowでは横16bitの中の任意のbitの8bitを取り出すように変換しています。
PRI Drive_LEDはLED_dataというデータバッファをただLEDに出力しているだけです。これはcognew(Drive_LED(@LED_data), @Stack)によって別のCogで実行させています。
PRI getRow(col_data,odd,row): bit | x のcol_data,odd,rowは呼び出し側が渡す引数でbitはgetRowがCall側に返す値でxはgetRow内で使用するローカル変数です。
CONで設定する定数はこのコード内で使うグローバル変数です。
サブルーチンですが、そのファイル内でのみ呼び出せるサブルーチン、もしくはファイルの外からも呼び出せるサブルーチンとして定義できます。
サブルーチン定義のとき、名前の前にPUBをつけると、他のファイルからもそのサブルーチンを呼び出せるようになります。
PRIをつけると、他のコードがこれをオブジェクトとして使う場合にその部分を外部からは使えないようになります。
ここではコメントにしていますがOBJブロックで通信プログラムのFullDuplexSerial?(一つのCogを占有していてオブジェクトと呼ばれる)をdebug(任意の文字列)と宣言しておけばコード中debug.tx(13)のように使ってPCと通信ができ、QuickStart?とPC間でデータのやりとりが出来ます。オブジェクトが何番目のCogを使っているかを知りたい場合は大抵startメソッドでCog番号を取得出来るようになっています(そういうコードが推奨されてるらしい)。
フォントは$8000から$BFFFまでにあり、1文字横16bit縦32bitで奇数キャラクタと偶数キャラクタの2文字がが1LONG(32bit) X 32 = 32LONGに収まっています。
mainで奇数キャラクタの横1ライン(1LONG)をロードして奇数bitを取りだして縦方向も順次取り出してHubRAMのバッファLED_dataに保存していき、次に偶数キャラクタでも同様に実行します。