256(JiGoRo)-Series 日記 (4)  

SEMB1200A のページを適宜更新中です。


256(JiGoRo) シリーズも3つ目に入ったということで、ページを更新しました。
Eagle の使い方ページと、EzPCBへの発注の話し、NECエレMCU&MINI2の話しなど、新しいページを作ってまとめようと思います。

今日は、Zigbee module (ZIG-100B(BestTechnology製)) を使ったアナログ・ジョイスティック・ボードの回路図を紹介します(2009年7月26日の紹介ボード)。

NECエレ78F0513D(78K0/KC2) を使ってます。 これは、8ビットマイコンですが、10bit-ADC を 8ch もっているため、XYアナログ・ジョイスティックを4つ接続でき、また、内蔵プルアップ抵抗をもっている端子が多いため、プッシュ・ボタンをそのままとりつけて、片側をGNDに落として使えます。 XYアナログ・ジョイスティックは、Sparkfunサム・ジョイスティックその基板と接続するためのピン配列になってます。 アナログ値2chとプッシュ・スイッチ1つを接続することになります。 ストロベリー・リナックスで購入可能です。 この回路図を元につくったPCB板(未実装)が数枚ありますので、欲しい方、連絡をください。

表面(部品面)
 左側の黄色の四角枠はZIG100Bの位置を示します。
 ZIG100Bのアンテナが基板外側になるイメージです。

 QB-MINI2端子は 2x8 のピンヘッダではなく、ピン・
 フレームを取り付け、ケーブルなく QB-MINI2を取り
 付けできるようにしました。(ケーブルの場合は、左右
 の列がひっくり換える配列になりますので注意です)

基板サイズ
 横 60.96mm (2400mil)
 縦 34.29mm (1350mil)
裏面(半田面)
 こちらにある部品は、P60-P63 に接続する
 S60-S63端子のプルアップ抵抗4つと、
 アナログ・ジョイスティックの端子付近に設けた
 大きなコンデンサ2つです。

(2009年9月20日)


今日も回路設計。 V850ES/JG3-H という USB ファンクション機能を持ったMCUを使ってみようと思い、回路設計。 この基板は使い回しを考えて、PWMポートとシリアルポート、アナログポートをわけて配置することにしました。 USB Function だけはON BOARD が使いやすいと思い、なんとか載せてみようと思います。 JiGoRo3 用ではなく、KHR の背中に乗せられるように、ねじ固定穴も位置合わせすることにします。

やってみればできるものですね。 片面実装で乗りました(基板サイズが大きいから楽でした)。 今回のMCUのUSB Function は、PCと接続した場合、特定のフラッシュ・ROMはディスクメディアとして認識され、データの書き換えができるようにしたいと思います。 この基板の上に、シグナルレベル変換(単なるプルアップですけど)と、3本サーボ線取り付け用パターン、あとは、MCU用の電源生成DC-DCコンバータ。 ZIGBEEも載せられるかな? また、サーボ信号は、PWM信号用とシリアル用と2種類作ってみようと思います。 ICS3 の 1.25Mbps のシリアルも余裕でこなせて、4ch持っているので自由度は高くつくれそうです。 最新のKOのコントロールボードをみると、シリアル通信の特徴を活かして、サーボのデージーチェーンをさせるのではなく、基板上で信号線と電源線をパラレルに接続できるようにしてあるんですね。 この方が、他のサーボの電源ノイズを受けにくいという配慮でしょうか。。。基板の抵抗も結構大きいと思うので、どっちが良いのか、測定してみたいものです。

基板サイズミスにより掲載削除しました。

(2009年9月21日)


V850ES 基板を何パターンか作ってみました。 mini-SD card を基板裏面に搭載する場合、先日の基板サイズでは収まりませんでしたが、横80mm弱使えれば他の部品に干渉することなく収まりそうです。 この基板上に載せるサーボ分配ボードも考えていたのですが、PWM版とシリアル版は別基板で対応する形になりそうです。 ただ、アナログ・インターフェイスをどのようにするのが自由度が増すのかが悩みどころです。 あと、先日の回路図から、PC子機として動作できるよう、USBから電源がとれるようにしました。

基板サイズミスにより掲載を削除しました。

あれこれしているうちに、シルバー・ウィークも終了しました。 家族サービス中心に動いていたのですが、パソコン時間も多く作れたのかな、と満足です。 BBQ, 高尾山登り, 子供の誕生日祝い, Nゲージ電車の組み立て(子供の誕生日プレゼント), 家のリフォームの打ち合わせ、などなど。 Nゲージの電車は自分が子供のころ欲しかったのですが、高くて買えなかったです。 今回、子供へのプレゼントとして購入。 実際に遊んでみて、なかなかのリアリティがあって感動しました。

(2009年9月24日)


ROBO-ONEは、前田さんの完全優勝、おめでとうございます。

この土日は、子供の誕生日だったこともあって、那須旅行していました。 朝4時起きで行動したこともあって、渋滞にハマらず順調。 会社の保養所では、誕生日記念だという連絡の結果か、メゾネットタイプの部屋。 すごく喜んでいた。 帰りに、ツインリングもてぎに寄ったのですが、すごく空いていた。 待ち時間0分でどの乗り物も乗れて貸切状態。 ASIMOとも遊んでご機嫌で帰宅。

ここ数日のPCBレイアウトですが、寸法を間違っていて、全面修正中(笑)。 ちょっとおかしいな、と気がついたのは、KCBのピン配列をみていたとき、何でピンヘッダがあれだけ並ぶんだろう、と不思議に思って自分のレイアウトを見直したあら、10mmもずれていたことに気がつきました。 発注前に気がついて良かった(ということで、21, 24日のPCBイメージの掲載を削除しました)。

(2009年9月28日)


ロボット工作から少し離れて仕事ばかりしていました。 おかげで大方終わりました。

息子は幼稚園最後の運動会。 リレーではバトンを周回遅れ寸前の最下位でうけとり、そのままバトンタッチ。 後ろを気にして走るシーンもあったのですが、頑張って走る姿は親としてはうれしいものです。 親子競技のおんぶリレーでは、速く走りすぎてバトンを渡しそびれちゃったりしたけど、これまたご愛敬。 年少組、年中組、年長組と3年見てきたけど、大きく成長したものだと思いました。

今週はリフォーム週間。 リフォームするのは、壁と天井、床なので、窓はそのまま。 ということで、網戸の張り替えと、窓ガラスやサッシをきれいにしました。 窓はきれいに、手は真っ黒。 部屋の中にあったものを別の部屋に移すなど。 いらないものは妻が捨ててくれていたのですが、それでも結構あるものです。 今は、ロボット工作する部屋も物置状態なので、1週間は我慢の生活でしょうか。うまくいけば来週からはロボットに着手できるはず。

(2009年10月13日)


西さんのところで SEMB1200A 例外エラー発生とのこと、シマケンさんもフォローしていますが、とりあえず mipsel-semb-elf-gcc のコンパイラオプションに -O(オー)を付けて最適化実施にて問題の発生するコードを削除してみてください(何が問題あるコードかがわかってませんので、表現が適切ではないかもしれませんね)。

シマケンさんのリクエストから、SEMB1200A のブート時の UART1 の通信速度を変更することを考えてみました。 シマフジさんのファームをつぶすわけにはいかないので、独自に解析してみました。 これによりファームが壊れたなどの問題がおきても当方は一切責任を負えませんので、各自判断でお願いします(が、できるかぎりのフォローはしたいと思いますので、トラブル時は連絡ください)。
フラッシュROMのチップもわかってるので、ドキュメントをダウンロードして直接全てのコードを書いてもよかったのですが(個人的にはコーディングを終えてますが)、それがもとでせっかくの安全設計されているファームが壊れてはいけないので自粛しました。

#include <semb1200a/semb1200a.h>       

void    (*prg_start)();

#if 0   // if 1 then UART1=115,200bps
#define __UART_DLM   UX_UART_DLM_115200
#define __UART_DLL   UX_UART_DLL_115200
#elif 1 // if 1 then UART1=57,600bps
#define __UART_DLM   UX_UART_DLM_57600
#define __UART_DLL   UX_UART_DLL_57600
#elif 0 // if 1 then UART1=38,400bps
#define __UART_DLM   UX_UART_DLM_38400
#define __UART_DLL   UX_UART_DLL_38400
#else   // UART1=19,200bps
#define __UART_DLM   UX_UART_DLM_19200
#define __UART_DLL   UX_UART_DLL_19200
#endif

int     main( void )
{
    uart1_init(
        __UART_DLM,
        __UART_DLL,
        0x00,
        UX_UART_LCR_PARITY_NON | UX_UART_LCR_STOP_1 | UX_UART_LCR_LEN_8
    );
    memcpy( (void *)0xA0001000UL, (void *)0x9FC05000UL, 0x00005000UL );
    prg_start = (void (*))0x80001000;
    (*prg_start)();
    return 0;
}

非常にシンプルなコードですのですが、uart1 の初期化を再度行い、フラッシュ書き換えコードらしき領域のプログラムをコピーして実行する、というものです。 使い方としては、上記コードを 0xBDC80000 からのコードとして作成し、起動をそのプログラムから実施する、というだけです。 SEMB1200A の初期化そのものは、既存ブートローダーで実施してから立ち上がりますが、UART1 だけ上記で設定した速度に変わって立ち上がります。 これによりユーザープログラムの1つが占有しちゃいますけど、それでも価値がある、というケースがあると思います。 UX_UART_DL? として定義されていませんが、115,200bps 以上の通信も可能ですので、もっとスピードアップさせたい場合は各自計算して設定してみてはいかがでしょうか(設定値も教えてよ、という方、連絡ください)。

(2009年10月14日)


ロボットビルダーとしては、ロボットの写真をたまには載せないと、ということで、JiGoRo3 をお披露目?します。

予算の関係で1体分の腕は未開発です(従来のをそのまま取り付けできます)。 左側は結構軽くできてるなぁ、という印象を受けます。

(2009年10月18日)


腰痛のため静養中。

久しぶりに GNU のホームページを覗くと、binutils, gcc がリビジョン更新されていました。 さっそく環境の入れ替えです。

(2009年10月26日)


新年、明けましておめでとうございます。 本年もよろしくお願い致します。

昨年末2カ月は、多忙な毎日を過ごしていまして、Web更新が止まってしましました。 今年はどんな年になることやら。。。

(2010年1月1日)


SEMB1200A の exception について。
HOS 上では問題なく動作するソフトも、HOSなしだとエラーになることを考えてみると、すごく単純な話し、割込み時にレジスタ退避を忘れているための例外発生ではないか?という気がしてきました。 ユーザーにレジスタ退避・復帰コードを入れてもらうスタイルか、ライブラリでフォローすべきか、というところですが、後者の方が期待値は高いのだろうな、という印象です。 どうなんでしょうね。

(2010年1月20日)


SEMB1200A の exception について(その2)。
2か月前になりますが、例外発生時のレジスタ退避と復帰をいれたところ、多くの予期していない例外発生を抑えることができそうな感触を得ました。 SEMB1200A のページに新しいライブラリを公開しましたので、お試しください(ココからも直接落とせます)。 HOS(HyperOS; RTOS) 上ではエラーは従来ライブラリでも問題ありません(というか、入れ替えても利用しませんので大丈夫なはずです)。
変更点は、例外発生時の関数の前にレジスタ退避、関数から復帰する際に、レジスタ復帰をライブラリとしてケアする方法と取りました。 そのため、従来使っていただいていた irq_init.c を入れ替えていただくだけで良く、ユーザープログラムは変更なく使えるようにしてみました。

参考までに、Cygwin 上のクロスコンパイルツールのバージョンは、binutils は 2.20, gcc は 4.4.3 です。

(2010年2月22日)


今日は、マイコンメーカの NECエレクトロニクスと、ルネサステクノロジーの統合の日。 早朝時点で既に WEB が統合されていました。 自動で切り替えてるんでしょうけど、コンテンツもそこそこ整理されているので、事前にかなり力をいれてるんだろうな、と感じました(元xxxの紹介ページですとはありますが、フォーマットが一致してるので一見しても見分けがつきづらい)。

(2010年4月1日)


PCB基板を発注する際に面付けして依頼をしたい場合に役立つツールを(ようやく)見つけました。 GerbMerge です。 詳しいインストール方法はココにあります。 (Python の Version は 2.6)

私なりの使い方をメモしておきます。
このツールは、GUI ではないので、コマンドを入力して実行する必要があります。 しかし、デフォルトではパスの通っていないところにインストールされるので、command.ccm 等のシェル上で実行するのは、結構面倒です。
そこで、バッチファイルを1つ用意し、面付けしたいガーバデータと同じディレクトリ(もしくはその1つ上)に置いておきます(随時コピーします)。

gm.bat
c:\python26\python C:\Python26\Lib\site-packages\gerbmerge\gerbmerge.py layout.cfg

layout.cfg は、ガーバデータファイルの情報や、面付け時の基板間距離などを指定します。 サンプルデータに(英語の)コメントがあります。
特に書き換えた方がよさそうな変数だけ記します。

変数 設定例 コメント
1 MergeOut = gerber 面付け後のファイル名
1 OutlineLayerFile = %(mergeout)s.oln 拡張子 .oln で outline データを保存
1 ScoringFile = %(mergeout)s.sco 拡張子 .sco で面付けデータの境界線(cutout, v-cut)データを保存
1 PanelWidth = 10 面付け後のX(横)上限値(インチ単位で指定)
1 PanelHeight = 10 面付け後のY(縦)上限値(インチ単位で指定)
1 LeftMargin = 0.0 面付け後の左辺の余白サイズ(インチ単位指定)
1 RightMargin = 0.0 面付け後の右辺の余白サイズ(インチ単位指定)
1 TopMargin = 0.0 面付け後の上辺の余白サイズ(インチ単位指定)
1 BottomMargin = 0.0 面付け後の下辺の余白サイズ(インチ単位指定)
1 XSpacing = 0.125 面付けデータ間のX(横)距離値(インチ単位指定)
1 YSpacing = 0.125 面付けデータ間のY(縦)距離値(インチ単位指定)
2 [foo] foo は任意 面付けデータの名前
2 Prefix = %(projdir)s/foo 面付けデータの保管場所と拡張子抜きの名前を指定
2 *TopLayer = %(prefix)s.cmp 面付けデータの表面(部品面)の信号線データ
2 *BottomLayer = %(prefix)s.sol 面付けデータの裏面(半田面)の信号線データ
2 *TopSilkscreen = %(prefix)s.plc 面付けデータの表面(部品面)のシルクスクリーンデータ
2 *BottomSilkscreen = %(prefix)s.pls 面付けデータの裏面(半田面)のシルクスクリーンデータ
2 *TopSoldermask = %(prefix)s.stc 面付けデータの表面(部品面)の半田マスクデータ
2 *BottomSoldermask = %(prefix)s.sts 面付けデータの表面(部品面)の半田マスクデータ
2 Drills = %(prefix)s.drd 面付けデータのドリルデータ
2 BoardOutline = %(prefix)s.out 面付けデータの外枠データ
2 ToolList = %(prefix)s.dri ドリルリストデータ

上記リストで頭に 1, 2 を付けました。 1は、layout.cfg で1度だけ指定します。 2 は、面付けしたいデータ分だけ指定します([foo] から ToolList までをコピー&ペーストすれば良いです)。

実際に、EzPCB に発注する場合は、面付けデータと、そのリストを送付すれば良いです。 以下、その雛型?ファイルです。

PCB request list
=================

1. gerber data files
~~~~~~~~~~~~~~~~~~~~~~
    file name           purpose
    ---------------------------------------------------------------
    data/gerber.cmp     top pattern
    data/gerber.plc     top silk data
    data/gerber.stc     top resist data
    data/gerber.sol     bottom pattern
    data/gerber.pls     bottom silk data
    data/gerber.sts     bottom resist data
    data/gerber.sco     cutout line data
    data/gerber.xln     dril data
    data/gerber.drl     dril list
    data/gerber.oln     outline
    data/gerber.fab     outline and hole position image
    readme.txt          this file

2. free service of cutout
~~~~~~~~~~~~~~~~~~~~~~~~~~
  I request simple-cutout as free-service with a file as 'gerber.sco'.
    The width of 5 cutout-line is designed with 125mil.

3. the other requests
~~~~~~~~~~~~~~~~~~~~~~
  PCB Materials        FR-4
  Color                Green
  Layers               2
  Length               3.525inch
  Width                7.500inch
  Quantity             10pcs
  Board Thickness      1.0mm
  Copper Thickness     35um (1 OZ)
  Finish               HASL
  Shipping Method      DHL (← EMS の場合はEMSと明記)
  Payment Method       Paypal

EzPCB の場合、基板厚さの選択が多数あります。 特に試作で基板厚さにコダワリがなく、発注枚数はたくさん欲しい場合は、薄いサイズにすると、輸送費が$10ほど下がることがあります。 発注前に簡易見積もりページで調べておくとよいでしょう。

(2010年5月8日)


★お知らせ★
 利用していたプロバイダの都合上、URLが変わります。 2010年11月から完全移行となりますので、「お気に入り」登録等の入れ替えをお願い致します。 新:http://hw001.spaaqs.ne.jp/n-okada/index.html 


ルネサスエレクトロニクスのRXシリーズ用のbinutilsコンパイル時に、binutils-2.21/gas/config/rx-tc.c を修正する必要あり。 185行目から334行目までのrx_include()関数内で eof というローカル変数が定義されていますが、MinGW+msys 環境ではコンパイル時にエラーとなります。 eof -> eof2 等適当な名前に置換するとエラー回避できます。 Cygwin環境や Linux 環境では同種のエラーは出ませんが(gcc のバージョンに依存してるのでしょうか)、修正しておくことが適切かと思います。

クロスコンパイル環境構築テクニック

Linux, Cygwin, Msys で development tools の環境が異なるので、手間取りましたが、ルネサスエレクトロニクス製のRX, V850 用のクロスコンパイル環境を作るテクニックがわかってきましたので、メモを残しておきます。

binutils-2.21:
 RX用には、binutils-2.21/gas/config/tc-rx.c の rx_include()関数内のローカル変数 eof を eof2 等にリネーム必要。
 % cd /usr/local/src
 % tar xvfj ../spool/binutils-2.21.tar.bz2
 % mkdir xxx-renesas-elf ... xxx = rx or v850e
 % mkdir xxx-renesas-elf/binutils-2.21 ... xxx = rx or v850e
 % cd xxx-renesas-elf/binutils-2.21 ... xxx = rx or v850e
 % ../../binutils-2.21/configure --target=xxx-renesas-elf --prefix=/usr/local ... xxx = rx or v850e
 % make
 % make install
★c と c++ の環境を作る場合、まず、c環境を作り、その後、c++ を作る必要あり(特に初めて環境構築する場合)。 gcc-4.5 にはgmp, mpfr, mpc, libelf をそれぞれの開発環境にインストール必要(Cygwin, Linux の現時点の最新パッケージであれば不要)。
gmp-4.3.2:
 % cd /usr/src
 % tar xvfj ../spool/gmp-4.3.2.tar.bz2
 % cd gmp-4.3.2
 % configure --prefix=/usr
 % make
 % make install
mpfr-2.4.2:
 % cd /usr/src
 % tar xvfj ../spool/mpfr-2.4.2.tar.bz2
 % cd mpfr-2.4.2
 % configure --prefix=/usr --with-gmp=/usr
 % make
 % make install
mpc-0.9:
 % cd /usr/src
 % tar xvfz ../spool/mpc-0.9.tar.gz
 % cd mpc-0.9
 % configure --prefix=/usr --with-gmp=/usr --with-mpfr=/usr
 % make
 % make install
libelf-0.8.13:
 % cd /usr/src
 % tar xvfz ../spool/libelf-0.8.13.tar.gz
 % cd libelf-0.8.13
 % configure --prefix=/usr
 % make
 % make install
gcc-4.5.3: Cのみ最初に作る
 % cd /usr/local/src
 % tar xvfj ../spool/gcc-core-4.5.3.tar.bz2
 % mkdir xxx-renesas-elf/gcc-4.5.3 ... xxx = rx or v850e
 % cd xxx-renesas-elf/gcc-4.5.3 ... xxx = rx or v850e
 % configure --target=xxx-renesas-elf --prefix=/usr/local --enable-languages=c --with-newlib --with-gmp=/usr --with-mpfr=/usr --with-mpc=/usr --with-libelf=/usr --disable-shared --disable-threads --disable-libssp ... xxx = rx or v850e
 % make
 % make install
newlib-1.19.0:
 % cd /usr/local/src
 % tar xvfz ../spool/newlib-1.19.0.tar.gz
 % mkdir xxx-renesas-elf/newlib-1.19.0 ... xxx = rx or v850e
 % cd xxx-renesas-elf/newlib-1.19.0 ... xxx = rx or v850e
 % configure --target=xxx-renesas-elf --prefix=/usr/local ... xxx = rx or v850e
 % make
 % make install
gcc-4.5.3: C++を作る
 % cd /usr/local/src
 % tar xvfj ../spool/gcc-g++-4.5.3.tar.bz2
 % cd xxx-renesas-elf/gcc-4.5.3 ... xxx = rx or v850e
 % configure --target=xxx-renesas-elf --prefix=/usr/local --enable-languages=c,c++ --with-newlib --with-gmp=/usr --with-mpfr=/usr --with-mpc=/usr --with-libelf=/usr --disable-shared --disable-threads --disable-libssp --without-ppl --without-cloog ... xxx = rx or v850e
 % make
 % make install

(2011年6月19日)


 ロボット製作のページへ

 トップページへ