Propeller イントロダクション 「Propellerをいじってみたいんだけど、どう始めればいいの?」そんな疑問へのソリューションをご提供! 必要なものはこれだけです:
Propeller搭載ボードは何種類か入手可能ですが、ここではQuickStartBoard?(以下クイックスタートボードと表記)を使うことを前提として説明します。 では、以下で解説をしていきます。 1.プロペラを体験するためのハードウェアを入手しましょう †日本マイクロボット教育社さんで、クイックスタートボードを入手しましょう。 ちなみに、日本マイクロボット教育社さんは、PARALLAX社さんの日本での代理店です。 2.開発環境を手に入れましょう †開発環境は無償で入手できます。 PARALLAX社公式ツール群 †PARALLAX社公式Spin言語開発環境「Propeller Tool」 クイックスタートボードにはUSBシリアル変換チップが搭載されていますが、これのドライバ(USBシリアルドライバ)は、公式開発環境のインストール中に一緒にインストールされます(インストールするかどうかは選択できます)。 PropellerTool?には、Spin言語(後で解説します)のサンプルソースもいっぱい入ってます。すごく勉強になりますので、一読の価値ありです。 Bradさん謹製ナイスツール群「Brad's Spin Tool」 †「BST - The multi-platform Propeller Tool Suite」
BSTを使うときには、Windows環境ではUSBシリアルデバイスドライバのインストールが必要です。 3.その他必要なものを用意しましょう †あと必要なのは、PCとMini-USBのケーブルです。 PC †開発環境でプロペラのプログラムを書いてプログラムをプロペラクイックスタートボードに書き込むために、PCが必要です。 Mini-USBケーブル †プロペラクイックスタートボードとPCは、USB A〜Mini-USBのケーブルで接続します。 4.開発環境を準備しましょう †上記のものが用意できましたら、開発環境をインストールしましょう。 どちらがおすすめ、とは言えません、が!Windowsを使う方はどちらもインストールするのをおすすめしたいです。 公式開発環境 Propeller Tool †まずアーカイブをダウンロードします。 Setup-Propeller-Tool-v1.3.zipがダウンロードされます。 次に、これを展開します。 そのSetup-Propeller-Tool-v1.3.exeを実行します。 特にカスタマイズすることはないと思いますので、Completeでいいと思います。 インストールフォルダも特に変更しなくてOKです。してもかまいません。 途中でUSBドライバのインストールをするかどうかのチェックボックスが出てきます。 Installというボタンが出てきたら、それを押すとインストールがモリモリ進んでいきます。 USBドライバのインストールのところで、チェック印をつけた場合は、USBドライバのインストールがここで入り、進行状況が表示されます。すぐ終わりますが。 Finishボタンが出てきたら、それを押して終了。 Brad's Spin Tool †こちらは簡単です。 一つ注意しないといけないのは、実行するOSの環境によっては、USBシリアルドライバをインストールしなければならないところです。 Windows版のインストール †
Linux版のインストール †
MacOSX版のインストール*2 †
5.簡単なプログラムを作成してみましょう †さて、ここまでで開発環境が起動できて、クイックスタートボードにプログラムをロードできるようになったはずです。 プロペラ用プログラミング言語「Spin」 †プロペラに標準で用意されているプログラミング言語として、「Spin」というのがあります。 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 段下げ(インデント)は大事です。 各開発環境の起動直後はこのようになってます: 見かけが割と違いますが、今の段階では無視してて問題ないです。 これの、右側の一番広いとこにさっきのプログラムを入力してください。 クイックスタートボードにロードして実行してみましょう †サンプルプログラムができましたので、いよいよクイックスタートボードにプログラムを突っ込んでみましょう! 使ってる開発環境が公式Propellar ToolかBSTかで、GUIが少々違います。 公式開発環境 Propellar Toolの場合 †まず、プログラムが以下のように入力されています・・・よね? これをコンパイルして、クイックスタートボードへ突っ込みます。 コンパイルが行われ、チェック・ロード・ベリファイが続けて実行されます。 何事もなく「Verifying RAM」のウィンドウが消えたら、何事もなかったかのように戻ります。 そしてクイックスタートボードを見ると! Brad's Spin Tool(BST)の場合 †BSTでは、GUIが公式環境と違うので、少々戸惑うかもしれませんが、できることは同じです。少なくとも今の段階では。 さて、プログラムを入力して、このような状態になってると思います。 メニューバーから[Compile]-[Compile and Load Ram]、と辿ってコンパイルとロードを実行します。 すると、コンパイル進行表示がでて、そのあとRAMに書き込んだデータのベリファイ進行表示が出てきます。 そして進行表示が消えたらボードを見てみましょう。 うまくできましたでしょうか? †さて、LEDを光らせることができました? ではこのあとは、Spinプログラミングにちょっと踏み込んでみましょう。 6. Spin言語入門 †さっきのLEDチカチカプログラムは、まあそんなに長いプログラムではありませんでしたし、やってることも単純でした。 ということで、ここでは、ちょっと踏み込んだプログラムを見てみましょう。 POVを作ろう †POVってご存知でしょうか? POVのコード †以下のプログラムを入力し、QuickStart?ボードにロードします。 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言語でも他の大抵の言語と同じく、サブルーチンが定義できます。 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内で使用するローカル変数です。 サブルーチンのスコープ指定 †サブルーチンですが、そのファイル内でのみ呼び出せるサブルーチン、もしくはファイルの外からも呼び出せるサブルーチンとして定義できます。 サブルーチン定義のとき、名前の前に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に収まっています。 |