United Statesからアクセスのようです。言語設定をEnglishに切り替えますか?
Switch to English site
Skip to main content

Forth言語ベースで組み込みコントローラーの開発プロジェクト

長年、私はコンピュータ言語Forthのファンでした。そこで私はForthを使用しMicrochip dsPIC33をベースにした組み込み制御用バージョンを作成するプロジェクトをはじめました。DSのブログ記事ではボード用にこのバージョンを作成するまでの過程が紹介されています。

部品リスト

Qty Product 品番
1 MikroElektronika Clicker 2 for dsPIC33 MCU Add On Board MIKROE-2567 144-8343
1 Development Kit USB to UART Interface for use with CP2102N USB Bridge 184-0913
1 MikroElektronika MIKROE-1154 791-6485
1 Microchip Microstick II MCU Development Kit DM330013-2 749-6445
1 FTDI Chip USB to UART Cable for Raspberry Pi - TTL-232R-Rpi 767-6200
1 Parallax Inc, BoE Prototyping Shield for Arduino - 35000 781-3027

プロジェクトについて

このプロジェクトは最新のユーザーマニュアルやソースコード(下記ダウンロード参照)などのFORTHdsPICのドキュメントのリポジトリとなります。このソースコードは完全体なものでMicrochip dsPIC33を使っている方にはアセンブラ言語のルーチンを提供できます。また私の様々なロボットプロジェクトのためにFORTHソースコードも随時追加していきます。

FORTHプログラミング言語

1970年代初頭、それまでヘビー級のメインフレームで使用されていたFORTRAN、ALGOL、COBOLなどの言語とは少し趣の異なるコンピュータ言語が登場しました。「FORTH」と呼ばれたその言語は多くの機能を備えており、当時のマイクロプロセッサ向けのリアルタイムアプリケーションを作成することができました。そのため高レベルの言語コンパイラを求めるエンジニアの間で非常に人気がでたのです。FORTH言語の特徴としては次のようなものがあります:

  • OS(オペレーティング・システム)不要 ーSBCより もっとシンプルなボードで開発できます。
  • BEGIN….UNTIL や BEGIN….WHILE…などの高レベルのコンパイル済み構造体
  • 16ビット単精度の数値と32ビットの倍精度の数値が利用可能
  • (当時では)高速なプログラム実行
  • 1行のコードを即座に実行するインタープリタと新たな「ワード」を生成するコンパイラの両方が存在
  • 最大限の効率化のためのスタック指向動作(LIFOプッシュダウンスタックなど)

プロのソフトウェアエンジニアは上記リストの最後の項目の必要性はないと考えていましたが代数的でないソースコード形式(逆ポーランド記法) などのプログラミングに慣れていない人はBASICやPascalに固執することになります、そのため指向動作が重要となるのです。Forthとその起源についての詳細はこの素晴らしいwebsiteを参照してください。また Forth Interest GroupJupiter Ace Archiveも参照してみてください。 どちらもオリジナルのマニュアルや無料の電子書籍を含む多くの有用なダウンロード可能な資料があります。

基本コマンドセットを超えて新しいコマンドや「ワード」を作成できるForthの能力は注目すべき強力な機能の一つです。Forthの任意のバージョンのコンソールコマンドプロントでVLISTと入力するとForthが「理解できる」すべての単語のリストが表示されます。下のFORTHdsPICのスクリーンダンプを見てください。簡単な人型ロボットの歩行プログラムをダウンロードしてコンパイルしました。コアとなる最初のブロックはコマンドプロントからすぐに実行したり、新しいワードの定義を作成したりすることができます。2番目のブロックはコンパイルされたプログラムの構造を提供したり直接実行することはできません。3番目の単語セットはユーザープログラムがコンパイルされたときに作成されます。

FORTH_VLIST_screen_project_a051c50293365aaa31841640e3f30d2f9c399200.png

LEANLEFT、ROTATELEFT、LEANLEFTBACKの各ワードは左脚の特定の関節サーボモーターの単一の動きを定義しています。それらは左脚を一歩前進させるSTEPLEFTの定義で結合されています。他のワードは右脚について左脚と同じことをしています。STEPLEFTとSTEPRIGHTはロボット全体を一歩前進させるSTEPの定義で使用されます。最後にSTEPはWALKのループによって繰り返し実行されロボットを連続的に「歩く」ようにします。これらの新しいワードはロボットプログラミング言語の「コアとなる」でしょう。 ST RoboticsROBOFORTHはまさにこのような流れで作られた商用ロボットアームプログラミング言語です。

FORTHdsPIC とは?

FORTHdsPICの起源は1982年に私がバッテリーの充電状態を測定するポータブル機器を設計していた時に遡ります。このバッテリー充電状態測定のアルゴリズムは、少し複雑だったため、当時充分に普及しデジタル処理にも適していた Zilog Z80チップをベースに設計しました。当時はForthが大流行しておりコンピュータ雑誌に定期的に記事が掲載されていました。市場にはSinclair ZX Spectrumの設計者による、通常のBASICではなくForthを実行する家庭用コンピューターJupiter Aceもありました。コンピュータ雑誌でZ80ベースのコンパイラのアウトラインコードを見つけた後、私は4KBのUV EPROMに適合するLUT-Forthを作成しました。同じコードは8ビットオペレーティングシステム CP / MのKemitron コンピュータでも動作しました。コンパイルされたコードは別の4KBのEPROMに吹き込まれ、装置のプリント基板上の2番目のソケットに接続されました。その結果今で言うところの「組み込みコンピュータ」になりました。 

それからしばらく経ち、私はオリジナルのLUT-FORTH Z80コード(実際には8085コードのサブセット)を最新のプロセッサに変換してそれがどのように動作するかを見てみたいという衝動に駆られました。私はdsPIC33 を選び開発してFORTHdsPIC は誕生しました。現在のマイコンには1970~1980年代の貧弱なマイコンにはない多くの機能が搭載されているのでより良いFORTHを作るのはそれほど難しいことではありませんでした:

  • オンチップ不揮発性プログラマブルフラッシュメモリ、メモリ数も大幅増量
  • 膨大な種類のオンチップペリフェラルハードウェアインターフェース
  • ハードウェア乗除算命令を備えた強力な命令セット
  • その他、豊富な機能

 

First version:28 ピン DIL パッケージの 40MIPS dsPIC33FJ128MC802

Arduino_dsPIC_1_89d1b38946bee54b28f8865d09cf75f70cfcc513.jpg

Flash memory: 128KB   RAM: 16KB

このプロジェクトに使用した最初のホストは香港の会社で作られたArduino 形式のボードで、eBayで入手しました。このボードはボード上にUSB-UARTブリッジチップ(Silicon Labs CP2102)とUSB-Bコネクタを持っていたのでこのプロジェクトに最適でした。このデバイスは非常に一般的なものであり、インターネットアクセスとドライバが自動的にダウンロードされインストールされたPCにUSB接続をすることだけですぐに使用できました。このUSB接続はFORTHdsPICがプログラムの入力や表示に必要なターミナルやコンソールへの接続を提供してくれます。

このボードにはMicrochip PICkit 3互換ICSPヘッダも搭載されています。PICkit 3はプログラミング・デバック用のインターフェイスを提供しPC上で動作するMPLAB IDEへの接続を提供します。

ファームウェアのバージョン0.5に到達する頃にはより広く利用できる開発プラットフォームに切り替えた方が良いことに気が付きました。Microchip MicroStick IIは旧ボードのほぼすべての機能を保持しておりプログラマ・デバックツールが内蔵されているため理想的に思えました。後者はPICkit 3を必要としませんでした。DSブログで移行について説明しましたので参照してみてください。

 

Microstick_II1_447c7e1b3e723c5b4e1cec46cdf32fffc6e3a0c7.jpg

勿論、便利なArduino ヘッダーソケットを失いますが標準的なプロトタイピング用ブレッドボードブロックに差し込むヘッダーピンを得ることができます。USBコネクタはMPLAB IDEを実行しているPCへの接続を提供し反対側の端にあるはんだパッドはコンソールに使用されるチップのUART1へのアクセスを提供します。最近ではシリアルCOMポートを持つPCは非常に少ないのでコンソールを提供するためにはターミナルエミュレータソフトウェアと一緒にUART-USBブリッジケーブル(767-6200)が必要です。私は自由に使えるTeraTermを使っていました(今でも使っています)。

サイズが重要

28ピンで使用できる機能数は驚愕しますがFORTHdsPICがSPDIPパッケージでは間に合わなくなってきていることに気づきました。少なくとも開発ツールとして。特定のアプリケーションでは8ピンチップと外部周辺機器を駆動するための2線式I2Cバスを使用することになります。詳しくは私のI2Cシリアル通信に関するブログ投稿を参照してください。 28ピンのdsPIC33 デバイスには外部接続よりもはるかに多くのリフェラル機能モジュールが含まれており、ピンの割り当てはユーザがプログラム可能です。しかしすべての機能を同時に利用できるようにしたかったのでより多くのピンを持つチップに変更する必要がありました。

Second version:100 ピン TQFP パッケージ70MIPS dsPIC33EP512MU810

Flash memory: 512KB   RAM: 52KB

Clicker2_a2893286f53aa1b9c31cd0bb9f61b43993d83227.png

FORTHdsPIC.0.9 の現在のバージョン(最終版とは言い難いのですが)の新しいホームは MikroElektronika社の開発ボード Clicker 2です。0.9 は古い 40MIPS の FJ に代わって 70MIPS の dsPIC33EP を搭載した MikroElektronika Clicker 2 開発ボードです。

前者の製品と同様にこれはシングルボードコンピュータ(SBC)ではなく,Linux や Windows などのOSをサポートしていません。実際,dsPIC の他に主要なチップは,オプションのリチウムポリマー充電池を含む様々な電源を調整するパワーマネージメントデバイス(PMIC)だけです。

MicroStick からClicker 2へのコードの移植には、いくつかの厄介な問題がありフラストレーションがたまることもありましたが、最終的には現在のような形にたどり着くことができました。最近の2つのDSブログ投稿がこちらこちらになり、そのジャーニー(経緯)を綴っています。

mikroBUSインターフェースとClickボード 

マイクロコントローラ開発ボードはアプリケーション固有のセンサ/アクチュエータ回路の取り付けと通信が迅速かつ容易でなければ設計者にとっては何の役にも立ちません。つまりは拡張ボードごとに少なくとも1組のパラレルソケットヘッダを用意し、一致する周辺モジュールを実装できるようにしておくべきだということです。このツインヘッダーのアプローチは機械的に安定した配置を可能にしておりその搭載方法はArduino、Beaglebone、MikroElektronikaプロセッサボードではそれぞれシールド、ケープ、クリックと呼ばれる拡張モジュールを搭載しています。

Clicker 2ボードは拡張コネクタに「ベルトとブレース」アプローチを採用しています。2つのClickモジュール用のソケットと同様にボードの両側に沿って26ウェイGPIOヘッダーが用意されています(上図参照)。Clickモジュールの16ピンヘッダの機能はmikroBUS で標準定義されています。そのうちの半分は通信専用です:UART、I2C、SPIバス。それに伴い+3.3V、+5V、2つのGNDが存在し、残りの4つは特定の機能が与えられていますがGPIOピンに紐付けられているため任意の目的に割り当てることができます。

Clicker 2ボード上のmikroBUSソケットで利用可能なForthの機能

mikroBUS 1: UARTチャンネル1(コンソール)、ADCチャンネル1、PWMチャンネル1

mikroBUS 2: UARTチャンネル2、SPIチャンネル2、ADCチャンネル2、PWMチャンネル2

Clicker 2ボード上の 26 ウェイヘッダーで利用可能なForthの機能

LHヘッダー: I2Cチャンネル2、サーボチャンネル1~4、タコチャンネル1~2、SPIチャンネル3 CS1~2

RH ヘッダー:SPI チャネル 3、ADC チャネル 3 & 4

mikroBUS シールドClick_Remote_1_316574f3847aa9ed510874a69cd392513d165342.png

現状では、Clicker 2ボードは2つのクリック周辺デバイスモジュールしかサポートしていません。中規模の開発プロジェクトでもそれ以上のモジュールが必要になる可能性があります。そこで26ウェイコネクタの出番です。基板の両側にスタッキングヘッダをはんだ付けしました。これははんだピンが延長されたソケットヘッダで、Clicker 2が上にある拡張ボードと下にある別の拡張ボードを接続できるようにしています。 ワイヤレスモバイルロボットプロジェクトのハンドコントローラー には、4つのクリックモジュールが必要でした:2つのジョイスティック、ワイヤレスモジュール、プログラム開発用のUART-USBブリッジです。mikroBUSシールド (791-6485) は適切なアプローチを提供してくれました。クリックヘッダと便利な「プロトタイピング」エリアの2つのセットがあります。

 

クリックボードとmikroBUSコネクタをベースにしたMikroElektronika社のモジュールシステムはよく考え抜かれており、壊れやすいワイヤーリンクを必要とせずに堅牢なプロトタイプを構築することができます。そのよい例としてはロボット・ワイヤレス・リモートコントロール・ユニットです。唯一の注意事項はワイヤレスモジュールとそのアンテナに指を触れないようにすることです。

Clicker2_plus_blog_3_c19ad45475e0e2a36fca0f01243cb52459557904.png

mikroBUSシールドはさらに2つのクリックソケットを提供し、Clicker 2ボード上のものとは異なるUART、SPI、I2C 通信のチャンネルにアクセスすることができます。

mikroBUS シールドソケットで利用可能な Forthの機能

mikroBUS 1:SPI チャネル 3 (CS1)、I2Cチャネル 2、ADC チャネル 4、サーボチャネル 1

mikroBUS 2:SPI チャネル 3 (CS2)、I2Cチャネル 2、ADC チャネル 3、サーボチャネル 2

mikroBUS シールド 26 ウェイヘッダーで利用可能なForthの機能

Clicker 2ボードの場合

オフボード接続P1000361_smaller_93968b062d7d7e3bdb106895de4f617e6d2b7006.png

すべてのプロジェクトがクリックモジュールだけで構築できるわけではないので私はClicker 2の26ウェイソケットヘッダを使用して、他のボードとの単線接続を行っています。リモートコントロールユニットからのワイヤレスリンクのもう一方の端にある移動ロボットは、2つの超音波レンジファインダーのためにちょうどそのような接続を必要とします。SRF08デバイスは「インテリジェント」でI2Cバスを介してコマンドを受信し、距離データを送信します。I2C はデータ用(SDA)とデータクロック用(SCL)の 2 本のワイヤだけで100 個以上のアドレス接続可能なデバイスを扱うことができかつ複雑なプロトコルを持つ、本物の「2 線式」通信システムです。sPIC には 2 つの独立した I2C チャンネルがあります:チャンネル 1 はClicker 2 ボードの両方の mikroBUS コネクタに接続され、チャンネル 2 は mikroBUS シールドボード(装着されている場合)のソケットに接続されます。現在はClicker 2のソケットはUARTまたはSPI通信のみ必要なのでチャンネル2用のドライバだけを書きましたが、チャンネル2はオフボードのペリフェラル用に26ウェイヘッダーで利用できます。wireless robot に関する私のブログ記事には、I2Cバスに関するより多くの実用的な情報が含まれています。設計中に発生した”嫌な”問題を回避する方法も記載されています。ぜひ参照してみてください。

To be continued....

Engineer, PhD, lecturer, freelance technical writer, blogger & tweeter interested in robots, AI, planetary explorers and all things electronic. STEM ambassador. Designed, built and programmed my first microcomputer in 1976. Still learning, still building, still coding today.