SEMB1200A (1200MIPS CPUボード)
(2006年 1月 1日〜 (C) 岡田 紀雄)
とあるきっかけで出会った SEMB1200A ボードを試験的に使わせていただきました。
全ての案件に関して著作権を主張します。
記載しているソフトウェア、ハードウェア(回路)にて何がしかのトラブルが発生しても、当方(岡田)は責任を負いかねますので、各自の責任の下、行っていただきますよう、よろしくお願い致します。 不安な点等ありましたら、メール等頂けると、当方がわかる範囲内でお答えできるかもしれませんので、よろしくお願い致します(忙しく返信が遅れる場合がありますが、ご了承願います)。
本 Webページ をきっかけに多くの方に使って頂き、あっと驚く世界を体験していただけると幸いです。
ニュース
MIT(マサチューセッツ工科大学)さんのワークショップにて SEMB1200A が採用され、近藤科学さんのKHR2HVの背中に乗っかりました。
開発に際しては、当ページが採用されたということで、少しずつですが書いておいて良かった、と思いました。
概要
 |
CPU ボード
- サイズ 50mm x 70mm (x11mm部品凸部含む)
- 基板4隅穴 2.1mmφ
(横 66.04mm x 縦 45.72mm ピッチ)
(横 2.6inch x 縦 1.8inch ピッチ)
(→ 2.54mmスルーホール基板で 26 x 18)
- 電源は 5.0〜9.5V でバッテリー直結時は
適宜DC-DCコンバータを介すこと
|
性能概略(詳細は、販売元Webをご覧下さい)
・ 1200MIPS (浮動小数点演算ユニット(FPU) 内蔵)
・ 高速内蔵 512Kバイト RAM
・ 大容量フラッシュROM 4Mバイト搭載
・ 高性能サーボコントローラ搭載(PWM 32ch, 拡張UART 8ch(拡張UARTはPWM24-31ch
と排他的に使用))
△ ダブルバッファリングされた独立32chPWM回路によりジッターなしを実現できます。
・ UART2ch (RS232C, RS485 レベル変換あり), CSI(SPI) 1ch
・ 汎用 8ch I/O
製造元
シマフジ電機(株)
パーツを購入しよう
このボードの小型化に貢献しているのがコネクタ。
コネクタはJST (日本圧着端子製造(株))の ショッピングサイトで通販購入が可能でした。
- 基板対電線圧着コネクタ・SHシリーズ・連鎖状コンタクト
- 基板対電線圧着コネクタ・SHシリーズ・ハウジング
- SHR-03V-S-B
- SHR-05V-S-B
- SHR-06V-S-B
- SHR-10V-S-B
また、圧着端子付きケーブルは、RSコンポーネンツ(株)で購入可能でした。 該当商品を列挙します。
- 1.ケーブル/コネクタ - コネクタ(プリント基板/カード)
- 基板/中継用コネクタ(JST)
- SHシリーズ(1.0mmピッチ)
- 基板用コネクタ SH ワイヤ アッセンブリ
- SH3-SS5-28150
- SH3-SH3-28150
- SH3-SS5-28300
- SH3-SH3-28300
開発環境を構築してみよう
開発環境は、フレキシブルに対応するために、Cygwin上や Linux上で行うのが一般的ですが、MinGW Developer Studio でも環境構築することができました。
以下では、Cygwin 上の場合と MinGW Developer Studio 上の2種類について紹介します。
統合開発環境(っぽい)ものが欲しかった、という方は、Cygwin編を飛ばして、MinGW
Developer Studio 編から行ってください。
MinGW Developer Studio は Parinya Software から提供いただいているフリーソフトウェアで、MinGW
をベースに作られた Windows, Linux, FreeBSD 上で動作する統合開発環境です。
開発環境を構築してみよう 〜 Cygwin編
mips 用のクロスコンパイル環境は、以下の通りで作成してみました。
- Cygwin 1.5.18-1 環境は、一旦、HDD にダウンロードしてからのインストールする方が良いです。
- binutils, gcc, newlib (gdb) の順番で環境整備。 パッチレスでできる環境として紹介します。
- binutils-2.16.1.tar.gz
- gcc-core-3.4.6.tar.gz (gcc-3.4.6.tar.gz でもOK).
- newlib-1.9.0 ( 上記との組み合わせの場合、1.10.0 以降はパッチが必要のようです)
また、最近、下記の環境でも作れることがわかりました。 順次、本ページも移行していきます。
- binutils-2.17.tar.gz
- gcc-core-4.1.2.tar.gz ... 以下の流れに加えて、configure のオプションとして
--disable-libssp を追加のこと。
- newlib-1.15.0
binutiles-2.x.x.tar.bz2, gcc-core-x.x.x.tar.bz2, newlib-x.x.x.tar.bz2は、/usr/local/spoolにあるとします。
binutiles ( version 2.17.0 の場合の例 ; 特にバージョン依存性無し )
% cd
/usr/local/src
% tar xvfj ../spool/binutiles-2.17.0.tar.bz2
% mkdir binutiles_mipsel_semb
% cd binutiles_mipsel_semb
% ../binutiles-2.17.0/configure --target=mipsel-semb-elf --prefix=/usr/local
% make
% make install
gcc ( version 4.1.2 の例 ; 3.x.x の場合、configure 時の --disable-libssp
は削除 )
% cd
/usr/local/src
% tar xvfj ../spool/gcc-core-4.1.2.tar.bz2
% mkdir gcc_mipsel_semb
% cd gcc_mipsel_semb
% ../gcc-4.1.2/configure --target=mipsel-semb-elf --prefix=/usr/local --disable-libssp
\
--with-newlib --enable-languages=c --disable-threads --disable-shared --without-include-headers
% make
% make install
newlib ( version 1.15.0 ; 特にバージョン依存性無しですが、gcc との組み合わせが重要。
)
% cd
/usr/local/src
% tar xvfj ../spool/newlib-1.15.0.tar.bz2
% mkdir newlib_mipsel_semb
% cd newlib_mipsel_semb
% ../newlib-1.15.0/configure --target=mipsel-semb-elf --prefix=/usr/local
% make
% make install
Cygwin http://cygwin.com/
GNU http://www.gnu.org/
GCC http://gcc.gnu.org/
newlib http://sources.redhat.com/newlib/
|
- 出来上がった環境を make install すると・・・
- --prefix で指定したディレクトリの下に mipsel-semb-elf というディレクトリが作成され、そこに、bin,
include, lib が完成。
- 環境ルート : /usr/local/misel-semb-elf/
- bin : /usr/local/mipsel-semb-elf/bin/
- lib : /usr/local/mipsel-semb-elf/lib/
- include : /usr/local/mipsel-semb-elf/include/
注) 以下、本CPUボード用の拡張ファイルは、上記 include/下の include/semb1200a/
に配置するものとします(以下の libsemb パッケージで make install するとコピーされます)
- クロスコンパイルするコマンドには、頭に mipsel-semb-elf-が付加されます。
- gcc : mipsel-semb-elf-gcc
- as : mipsel-semb-elf-as
- ld : mipsel-semb-elf-ld
これらは path の通っている(はず)の /usr/local/bin に置かれる。
プログラムを書いてコンパイルしてみよう! 〜 Cygwin編
※ flashrom に書かれた flashwriter のバージョンに依存する部分がありますので、ご注意下さい。
※ libsemb.a を作ることが前提になります。 crt0.o(crt0.c) もそのライブラリに入ってますので、ここでは紹介を省略します。
- ld のデフォルトを定義しておく(.out(.bin) を簡単に作るため) (注 : gcc-4.x.x
は下記ファイルが同じところにありません(現在調査中))
- gcc-4.x.x の場合、specs をダウンロードし、/usr/local/lib/gcc/mipsel-semb-elf/4.1.2/specs としてコピーしてご利用ください。(gcc バージョンにあわせて、4.1.2 のところを書き換えてください)。
- /usr/local/lib/gcc/mipsel-semb-elf/3.4.6/specs の *lib:, *startfile: を書き換えておくことで、Makefile
での設定が簡単になります。 下記は specs の該当行のみを抜粋しています。 (注意) %O%の%%間はアルファベット大文字のオー。 crt0
の 0 は数字のゼロ。 区別してください。
| specs 変更点 |
補足 |
*lib:
-lsemb -lc -lnullmon -lgcc
*startfile:
crt0%O%s crti%O%s crtbegin%O%s |
link するときにデフォルトで渡す引数指定
-lsemb は以下のライブラリを作ることが前提です。
実行ファイルの初期設定ファイルの指定
crt0%O%s が足りないので追加(次のcrt0.o 生成&コピーも必須) |
- ソースコード以外に必要なもの(雛形を掲載しておきます)
- Makefile ←ココクリックでダウンロード可(最新版を掲載してます。 下記と若干違うかもしれません)
| Makefile |
ユーザー変更箇所・補足 |
1: AS = mipsel-semb-elf-as
2: CC = mipsel-semb-elf-gcc
3: OBJCOPY = mipsel-semb-elf-objcopy
4:
5: CFLAGS = -march=mips4 -EL -g
6: ASFLAGS = -march=mips4 -EL -g
7:
8: ROMADRS = 0x9FC80000
9: MAPFILE = foo.map
10: LDSCRIPT= /usr/local/mipsel-semb-elf/lib/semb1200a-rom.ld
11: LDMAP = -Wl,-Map,$(MAPFILE)
12: LDSTART = -Wl,--section-start,.text=$(ROMADRS)
13: LDFLAGS = $(CFLAGS) -T$(LDSCRIPT) $(LDMAP) $(LDSTART)
14:
15: TARGET1 = foo.out
16: TARGET2 = foo.bin
17: OBJS = foo.o bar1.o bar2.o
18:
19: all: $(TARGET2)
20:
21: $(TARGET2): $(OBJS) $(LDSCRIPT)
22: $(CC) -o $(TARGET1) $(LDFLAGS) $(OBJS)
23: $(OBJCOPY) -O binary $(TARGET1) $(TARGET2)
24:
25: clean:
26: rm -f $(TARGET1) $(OBJS) $(MAPFILE)
|
5: CFLAGS = Cコンパイラのコンパイルオプション
6: ASFLAGS = アセンブラのコンパイルオプション
8: .bin モジュールのROMアドレス
9: マップファイル(出力ファイル)
15: .out ファイル名(出力ファイル)
16: .bin ファイル名(出力ファイル)
17: オブジェクトファイル名 (.c->.oとするだけ)
|
- semb1200a-rom.ld は libsemb パッケージに組み入れました。 make install 時にコピーされます。
- UX1200E のキャッシュと SEMB1200A のメモリマップ (最新情報は、SEMB1200A
取説を参照下さい)
アクセスする際のアドレスにより、L1 cache が動作する。 システム起動時は L1 cache が非動作のため non-cache のみ。
| |
FLASH-ROM領域 |
non-cache |
L1-cache |
| system |
basicsystem |
0xBFC0_0000 - 0xBFC0_FFFF |
- |
| reserved |
|
0xBFC1_0000 - 0xBFC1_FFFF |
- |
| reserved |
|
0xBFC2_0000 - 0xBFCF_FFFF |
0x9FC2_0000 - 0x9FCF_FFFF |
| user |
DIP3/4=OFF/ON |
0xBFC8_0000 - 0xBFCF_FFFF |
0x9FC8_0000 - 0x9FCF_FFFF |
| user |
DIP3/4=ON/OFF |
0xBFD0_0000 - 0xBFD7_FFFF |
0x9FD0_0000 - 0x9FD7_FFFF |
| user |
DIP3/4=ON/ON |
0xBFD8_0000 - 0xBFDF_FFFF |
0x9FD8_0000 - 0x9FDF_FFFF |
| user |
USER DATA |
0xBFE0_0000 - 0xBFFF_FFFF |
0x9FE0_0000 - 0x9FFF_FFFF |
| |
高速RAM領域 |
|
|
| system |
vector |
0xA000_0000 - 0xA000_0FFF |
0x8000_0000 - 0x8000_0FFF |
| user |
USER AREA |
0xA000_1000 - |
0x8000_1000 - |
| stack |
(stack_init in .ld) |
- 0xA007_FFF0 |
- 0x8007FFF0 |
開発環境を構築してみよう 〜 MinGW Developer Studio 編
統合環境上のみでは .out(ELF)ファイルまでは作成可能ですが、.bin が作れませんので、mipsel-objcopy
という変換ソフトを用意しました!
以下の手順で、ファイルをダウンロードして、インストール実施してください。 また、mipsel-semb-elf
の環境には、下記の「ライブラリを作ろう」のライブラリも構築済みですので、直ぐに使えます。 ドキュメントは共通です。
- MinGW Developer Studio をダウンロードしインストール。
- ココから MinGWStudioFullSetup-2.05.exe をダウンロードしてください。 確認済みバージョンは
2.05 ですが、他のものの場合、以下の mipsel-semb-elf 関連が動かない可能性があります。 (FullSet
でなくても動作可能です。)
- インストール先は、デフォルトのままでOKです。 c:/MinGWStudio のはずです。
- mipsel-semb-elf 環境をダウンロードしインストール。
- ココからダウンロードしてください(注:約 40Mバイトあります)
(改版履歴)
・ 2007年4月 7日 バグ修正&mipsel-objcopy導入
・ 2007年5月 9日 semb1200a-rom.ld の安定性向上。
- LHA (LHUT) 等を使って、c:/MinGWStudio ( MinGW Developer Studio と同じディレクトリ)にファイル展開(解凍)してください。
- このファイル群は、私が MinGW + MSYS を使って mipsel-semb-elf として作りました。 また、SEMB1200A
用のライブラリも入れてあります。
- mipsel-semb-elf のクロスコンパイラは、以下のバージョンで構成されています。
- binutils-2.17.0
- gcc-4.1.2
- newlib-1.9.0 ( newlib-1.15.0 は make が通らず; MSYS 環境ではツールが足りないみたい
)
- gdb-6.4
- make する際に、いくつか手を加えました(メモとして残しておきます)
- binutils は問題なし
- gcc は一部 include のパス指定が通らず、../../gcc/ を追記した。
- newlib は問題なし
- gdb は -Werror があると通らない箇所があったため指定を外す。 SIGTRAP 指定がないので、5に固定で通す。
- 現状、デバッグ環境が動作できていません。。。(改善予定なし;気が向いたらやります) 単独での gdb 動作は確認してます。
- MinGW Developer Studio を起動した後、環境の切り替えを実行してください(スクリーンショットを参照)。
- Edit -> Option -> Compiler にて、c:/MinGWStudio/MinGWmipsel と指定し、mipsel-semb-elf
環境に変更。
- Edit -> Option -> Format にて、Category-Source Windows の Colors-Comment*
にて FONT を日本語対応にしておくと、ソース中のコメントに日本語文字が使えます。
- Edit -> Option -> Directroies にて、 Include Files と Lib Files に対して
MinGWmipsel/mipsel-semb-elf/include, lib をそれぞれ指定しておく。
- MinGW Developer Studio は Windows プログラムを作ることを念頭においているので、プロジェクトは、Windows
プログラム種類を選択することから始まります。
そこを少し細工を加えることにします。
- C:/MinGWStudio/Template ディレクトリにある console.tpl を SEMB1200A 用に書き換えをする。
- 書き換える内容は、以下の SCREEN SHOT の内容とします。
- 書き換えた console.tpl をココからダウンロードし、置き換えをして下さい(元ファイルは、適当な名前で保存しておけば、オリジナルに戻しやすいです)。
- SEMB1200A のソフト開発の際には、New Project における選択で、Windows Console
プログラム生成のアイコンを選べば各種設定がされていることになります。
- Project Setting 例を以下に挙げておきます。 上記 console.tpl で指定の際は、特に不要ですが、内容の確認を行ってください。
- 以下は Debug 用と Release 用でそれぞれ指定が必要で、共通箇所を記します(他は任意)
- Project -> Settings - Compile にて、Extra compiling options を -EL -march=vr5500 と指定する。
- Project -> Settings - Link にて、以下を指定する。
- Libraries : semb;m;c;nullmon;gcc .. libsemb.a 等を使うという宣言。 semb
〜 gcc は、つなぎ文字として半角のセミコロン(;)を入れてください。
- Ignore defaults startup file と Ignore all default libraries にチェックを入れてください(これで
Windows アプリ用のライブラリが切り離されます)。
- Extra linking options に -EL -march=vr5500 -T/MinGWStudio/MinGWmipsel/mipsel-semb-elf/lib/semb1200a-rom.ld
-Wl,--section-start,.text=0x9FD00000 を。
その際、最後の 0x9FD00000 を 0x9FC80000, 0x9FD80000 として SEMB1200A 上の
FLASH-ROM のスタートベースアドレスを変更してください。
- ELF(.out) を .bin ファイルに変換するソフトを MinGWmipsel\bin\mipsel-objcopy.exe
として用意しました。
- mipsel-objcopy.exe の使い方は以下の「いずれか」で行えます。 たぶん、1つ目のやり方が一番簡単だと思います。
- mipsel-objcopy.exe のアイコンに変換したいファイルのアイコンを重ねると、,outと同じフォルダに.binファイルが生成されます。
- Windows 上でプログラムを実行し(ショートカット等デスクトップに用意してクリックするのが楽でしょう)、開いた
Window に変換したいファイル (.out) をドラッグすると、.bin ファイルが、,out
と同じフォルダに生成されます。
- command.com 上で、mipsel-objcopy [input-file-name] [output-file-name] で生成できます。 output-file-name
を省略した場合、input-file-name の最後の3文字がbinに変換されて生成されます(拡張子判断してません)。
ライブラリを作ろう!
- マニュアル(ココからダウンロードしてください)
- UX1200E搭載 UART, CSI
- SEMB1200A拡張 UART3, PWM
- 実際のライブラリ(gcc-3.4.6 用は ココから、gcc-4.1.2 用はココから、それぞれダウンロードしてください)
- gcc-3.4.6 用のものは、従来の mipse-robin 環境にしているので、robin を semb
に適宜書き換えてご利用ください(リクエスト次第で書き換えたものを用意します)。
- lib/ 内のソースをコンパイル。 make で行えます。
- make install を行う。 それにより、libsemb.a, crt0.o, semb1200a-rom.ld,
include/semb1200a がインストールされます。
- specs を設定し、標準で libsemb.a が読まれるようにする。 (specs の登録は、-lsemb
-lc -lnullmon -lgcc と crt0.o の登録です。 上記参照下さい。 gcc version
4.x からは一から作る必要があるようです。 別途配布方法を検討します。 急ぎ欲しい方は、メール下さい。)
- UART1 を FIFO 有効化しておこう。
- uart1_init() を使えば、デフォルトでは FIFO が OFF になっているものが FIFO
が有効になります。
- パソコンとの通信等でエラー訂正なしで行った場合、取りこぼしがあるので注意です(
MSComm で文字列転送でも )。
いろいろと周辺を揃えていこう!
- 近藤科学(株)製 KRS (RedVersion) シリーズ PWM 入出力
- 概要
SEMB1200A 搭載の PWM は、ハード的に入出力を行うため、多重割り込みによるカウンタ等読み取り値のズレが発生しません。 - 接続例
本体内部にプルアップ抵抗が装着されているため、外部にプルアップ抵抗を準備する必要はありません。
SEMB1200A と信号線を直結するだけでOKです。
- ソフトウェア
上記ライブラリを使用することにより、プログラミングが容易にできます。
以下は、PWM 入出力の場合(これだけです)。
1: #include <semb1200a/ux1200e.h>
2: #include <semb1200a/semb1200a.h>
3: #include <semb1200a/ux_signal.h>
4:
5: void main( void )
6: {
7: int unit, port;
8: unsigned short up, down, width;
9:
10: init_pwm_irq();
11: init_pwm_unit_all();
12: pwm_count_enable_all();
13:
14: pwm_set( unit, port, up, down );
15: width = pwm_get( unit, port );
16: }
|
- タイマー等は推奨値なら int_pwm_unit_all() で設定完了
- PWM 出力設定は関数1つ。
pwm_set( unit, port, up, down );
- unit : PWM 接続コネクタ (0-3)
- port : 上記 unit のポート(0-7)
- up : PWM アップトリガ数
- down : PWM ダウントリガ数
- キャプチャ設定は関数1つ。
width = pwm_get( unit, port );
- width : 入力された PWM(H幅) のカウント数
- unit : PWM 接続コネクタ (0-3)
- port : 上記 unit のポート(0-7)
※ 詳細はマニュアルを見てね(整備中ですが。。。) |
- 1線で双方向送受信シリアル通信サーボ(プロトコルそのものはメーカーサイトを参照) (KRS-4014HV(*)
など)
- 概要
標準 2線式 UART の対応方法と、SEMB1200Aで拡張された1線で双方向送受信を行う
UART ( ICS2(*) 等 ) での接続例等を紹介します。
(*) 近藤科学(株)の登録商標です。
- 注意事項!
本使用に際しては、以下のことに留意願います。
- 本ライブラリは、メーカーである近藤科学(株)が保証しているものではございません。
- 本ライブラリにおける如何なる問題も各自が責任をもって取り扱うものとします。
- 本ライブラリの内容をメーカーである近藤科学(株)に問い合わせは行わないで下さい。
- 接続例
ID 設定を 0〜31 にて行い、デージーチェーン接続することで、1port の
UARTで複数個のサーボ制御が可能になります。
ただし、通信時間が接続サーボ数により変わるため、1個あたり角度指定送受信サイクルが
1.1msec 程度なので、1port あたり20個以下が良いでしょう。(20個以上の場合、
PWM 制御周期よりも効率が低下するという観点のみです)。
- ソフトウェア(近藤科学(株)Webサイトにドキュメント公開されましたので
SEMB1200A 用サンプルも公開します)
ソースはココから入手してください。 また、UART 設定は、SEMB1200A の拡張 UART3 のデフォルトにて対応してます。
- プレステコントローラ接続
- 概要
実は、SPI(CSI) 機器なので、とっても簡単に接続ができてしまいます。
以前、別ページでSH2等への接続ということで載せてますが、ケーブルとプルアップ用の抵抗1個で接続できます。
- 参考ブロック図と実際の写真
- ソフトウェア(ココにおいておきます。CS1をSELに接続している場合のコードになります。)
ライブラリとして揃えている CSI 関連の関数を使って簡単に操作できます(ホントこれだけです)。
プレステコントローラのプロトコルさえ理解すれば、ロボットの操作系としてスムーズに移行できます。
