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ドライバのインストールがここで入り、進行状況が表示されます。すぐ終わりますが。
こちらは簡単です。
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つもそっくり同じく、開発ツールのエディタに入力してください。
2番目のサンプルとしてPOVのコードを載せます。
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)
コードの中で{{ }}で囲まれた複数行、' に続く文字列はコメントと見なされます。
ここではコメントにしていますがOBJブロックで通信プログラムのFullDuplexSerial?をdebug(任意の文字列)と宣言しておけばコード中でdebug.tx(13)のように使うことができます。
フォントは$8000から$BFFFまでにあり、1文字横16bit縦32bitで奇数キャラクタと偶数キャラクタの2文字がが1LONG(32bit) X 32 = 32LONGに収まっています。
mainで奇数キャラクタの横1ライン(1LONG)をロードして奇数bitを取りだして縦方向も順次取り出してHubRAMのバッファLED_dataに保存していき、次に偶数キャラクタでも同様に実行します。
getRowでは横16bitの中の任意のbitの8bitを取り出すように変換しています。
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で設定する定数はこのコード内で使うグローバル変数です。
又PRIは他のコードがこれをオブジェクトとして使う場合にその部分を外部からは使えないようにするものです。
(書き中)