R3N-series 製作日記 


RoboOne 第5回大会は辞退することにしました。

いろいろと頑張ってみたのですが仕事などで時間がとれず、また、自分の中で納得がいかないロボットなので、見直しをかけたいというところです。
ちょっと振り返ってみて、PCが壊れたり、マザーボードを交換したりして不調になっていた CPLD ライターを作り変えてみたので、図面をアップロードしておきます。
2003年12月13日のまとめでも記載したが、元の回路は「趣味の電子工作」です。

変更点は、パラレルポートからの入力がマザーボードの種類によっては 3.3V 信号の場合があるので、2.2kΩの抵抗でプルアップし、5VのCMOS-IC でも安定して動作するようにするのが目的です。 この情報は、PIC ライタ(パラレルポート編)から入手しました。 ここの web では、1kΩでのプルアップが紹介されてましたが、手持ちが2.2kΩだったので、それにしてみました。 要するに、CMOSが ON/OFF するときに必要な電流が流せれば良いわけですから、このオーダーでの抵抗であれば、何でも良いと思います。

(2004年1月25日)


久々に進展があったので、更新します。 Serial-EEPROM の ATMEL AT24C1024 の読み書きが無事にできましたので、まとめページとして記載しました。 ATMEL社の英文マニュアルを参考に作ったので、ある意味動作は忠実になっていると思います。 ソースを添付してますので、ご覧ください。

実装はEEPROMの交換が容易になるように、プルアップ抵抗2本とEEPROMを1つのカートリッジにしてみた。

(2004年2月8日)


 アルミ加工がしたいなぁ、けど、ほんとうに必要か?などと考えながら、このところ過ごしていました。

 A5052情報など頂いているうちに、足がホームセンターに向かってました。
そこで、お手ごろなのを発見。 ほとんど迷わず買ってしまいました。 相変わらずの速攻買い。
 (追記) なやつさんからのコメント:バンドソーの方が電動糸鋸盤よりも切断能力が良いとのこと。
 ・・・ 知らなかった。。。 けど、気に入っている。 素人なりに楽しもう!

  • プロクソンコッピングソウテーブル(No.28082) をCAINZ HOMEにて購入。
    • バンドソーに比べて安い(販売価格で1/3程度、定価で半額でした)
      まずは、電動糸鋸タイプで切るべし。
    • 省スペース。 HOZAN K100よりは奥行きが大きいかな?
      ロボットや、単5電池5本パックのサイズと比較してわかるとおり。
    • エアポンプ、刃の速度可変(500〜1700回/分)。 上下ストローク 12mm
    • もちろん、アルミ加工もできる(替え刃は10本入りで実売価格 680円)
  • いざ、ハンズで購入したアルミ板(厚1.5mm)をカットしてみる。
    すばらしい! 金物ハサミやノコギリとは全然違う切れ味! 自由自在の角度!!
    バーニング宮田さんが絶叫コメントされていたのが良くわかる。
    私も叫びたい! 「アルミ加工は楽しいぜ!

 さてさて、これだけツールと電子回路系が揃ったのに、まだ表に出れないのは、自分としても許せない。 またまた、奮起してきたのでした。。。

 あ、その前にアルミ A5052 発注だ! いろんな方から良い情報を頂いた。 なやつさんから、サイズ等リクエストを聞いてくれる五十嵐商工さんを紹介していただいた。 まずは、どんな価格なのか、ちょっと質問を加えて送信してみることからスタートです。

(2004年2月11日)


 ぐ〜たらパパの日記での更新が続く中、ようやく1つ形ができたのが、またまた Serial-EEPROM 関連のこと。

 今回は、PCのプリンタポートを利用して、PC にて Serial-EEPROM (AT24C1024, M24LC256) を読み書きしようというものです。
こうすることによって、モーションデータを PC で作って書き込みを行うとか、PC にデータを保存しておくとか、いろいろとメリットがでてくる(はず)。

 下図左は、Serial-EEPROM を取り付けていない状態。 同じく下図右は、ロボットの制御基板よりアダプター付EEPROM を装着したところ。


  • CPLD writer とほぼ同じパーツで出来上がるお手軽さ、というので作ったのですが、意外と、ソフトウェアの方にて填まってしまった。
    ポイントは下記2点ほど。
    • SCL L→H のタイミングと、SDA の値変更や読み取りといった微妙な順番をソフト的に指定が必要。
    • SH2/7047F の直接読み書き同様、ウェイトが必要。
       ・・・ プリンタポートは、せいぜい 1MHz くらいのスピードという思い込みが危険。
           意外と速い。
  • 74HC125とEEPROM間に100Ω抵抗と100pFコンデンサを入れているが、これは不要かもしれない。
     ・・・ これも CPLD ライタからそのまま持ってきたので、はっきり言えないです(ここが素人)。
  • なぜだか、上図の ERR(PowerSense)端子部分の回路にすると、74HC125, EEPROM を動作させれる電圧&パワーが得られている。
     ・・・ が、PC をまた壊したくないので、使うときは、外部電源使用&電源 ON を忘れずに行ってます。
  • 回路図では、74HC125 のパスコン、電源安定用コンデンサ、電源端子、スイッチ、電源ランプは省略してます。

 ソフトの公開は後日(希望があれば)行うとして、基本的に同じ回路で M24LC256 の読み書きもできる(はず)。 仕様書どおりであれば、AT24C1024 が1ページ 256バイトなのに対して、M24LC256 は 32バイト。 これだけを注意すれば、何の良いかな? あ、あとは、タイミングですね。 AT24C1024 は 1MHz でできるけど、M24LC256 は 400kHz 。 ちょっとウェイト時間を入れれば大丈夫でしょう。

 ソフトウェアの大枠は、SH2/7047F の場合とほぼ同じです。 しかし、WindowsNT/2000/XP でプリンタポートなどのI/Oポート直接制御は直接できないようになっているので、専用ドライバなどが必要になります。 今回は、フリーソフトウェアで公開されている VIOSCM を使わせて頂く事にしました。 これを読み書きルーチンの最初に指定すれば、何の問題もなく、I./O ポート制御が可能となります。 WindowsAPI を利用してもできるそうなのですが、知識がないので、こちらにしました。 ちなみに、Windows 98, Me などで使用しても問題ないそうです。 すばらしいですね。

 バーニング宮田さんや SISO さんが熱中していらっしゃる(って、私もですが(笑))、H8/3664F だと I2C EEPROM がハード上相性がよさそうなので、M24LC256 の読み書きもできるようにしておくことは、今後の展開に役立つかも!?(って、私は何を作ろうとしているのだろうか。。。 まぁ、趣味だから笑って流しましょう。)

(2004年2月15日)


 五十嵐商工さんに注文していたアルミ板が届きました。 振込みから1日で発送で、なかなか小口客までフォローしていただけて、うれしいです。 結局1枚あたりの値段は、とっても安く済みました。 これで、電子工作とおなじような感覚で、いろいろと遊べそうです。 無くなったら、また注文したいと思います。

  • 基本 1枚板からの切り出しなので、一番コストを抑えた注文にしました。
  • 基本1枚板サイズ 1m x 2m。 今回は、250mm x 400mm で 20枚注文。
  • 送料は宅急便で届いた際に支払う形だけど、問題なし。

 ぐ〜たらパパ日記にも書いていたことですが、新しいKO サーボ、ほしいですね。 モーションデータを作るうえで、現状の角度を読み込める機能があるのがモーションデータ作成初心者としては、うれしい機能に見えます。 ん? これ、自分のサーボに工夫すれば入れられるんじゃないか? てなわけで、アルミ加工と、またまた電子工作への道が1つ増えたのでした。。。

(2004年2月18日)


 今日は、旅行翌日の休暇日ということで、ちょっと一休み。 web 更新をしたり、ソフトをダウンロードしたり、買い物したり。。。

 バーニング宮田さんのアルミ加工ページや、ONOの電脳壁新聞さんを参考に、アイテム?を買い揃えてみました。

 まず、A4サイズのシール。 インクジェットプリンタ対応の「フリーラベル」というもの。 今回買ってきたのは、ELECOM製のEDT-HFR1(定価680円)で14枚入り。 近くのパソコンショップで安売りしていたのと、ポイントが溜まっていたのを思い出して、迷わず購入しました。

 あとは、お絵かきソフトをどれにしようかな? といろいろとフリーソフトをダウンロードして試してみました。 まずは、1週間ほどアレコレつかってみて、自分に合うものを選ぶことにしようと思いました。 ここ(フリーソフトをGET!)にて、CAD ソフト一覧を得ました。 まとまってるページがあると、便利ですね。 今回のソフトは、これです。

フリーソフトウェアではありませんが、これもエントリーしておきます。

PowerPoint が一番使い慣れているのですが、マウスカーソルの座標を常時表示してくれていないので、ちょっと不便かな?(って私が機能を知らないだけかも。。。そうだとしたら、誰か教えてください!!) とりあえず、グリッド 1.0mm まで設定できるので、A3で書かせて1/2縮小印刷でズレが出ていないことを確認、というところでしょうか。

 ところで、バーニング宮田さんが、またまたすごいです。 高速歩行を実現されました。 改善前後では(特に安定性という観点で教えていただきました)、

いろいろと教えていただいたので、歩行モーション作成で注意してみようっと。

(2004年2月22日)


 題して、「無駄な対抗を考えてみました」です。 笑って読み流してくださいね。 本音は最後です。

 近藤科学(株)さんから新しいサーボが発売されたのは、みなさんご存知の通りです。 レッドバージョン。 いろいろと面白い仕様があるようです。 ツクモROBOT王国で紹介されている4つ:

 まず、保持特性を変えることについては、もともと、アナログサーボ特性を再現させるイメージなので、可能でしょう。 具体的には、PWM周期を変えることで特性は変わります。 しかし、残念なことに、現状、1つのCPUからは、全て同じ PWM 周期となってしまうので、個々に設定することができません。 ということで、バーニング宮田さんのところにある FPGA による PWM 信号作成を流用させていただいて、CPLD 内で PWM 周期を自由に作成し、個々のサーボ毎に角度をしていするようにすれば、可能かもしれません。
 スピードについては、CPU で送る角度変化量をゆっくりさせればできるでしょう。
 ポジションキャプチャ機能。 これは、どう考えても従来のサーボそのままではできそうにありませんね。 ただ、せっかくポテンショメータがついているので、線を1本増やせば、もしかしたら可能なのかも知れませんね。 レッドバージョンでは、信号線からデータを逆に PWM 波形で送り出していると思われますが、変に信号がぶつかったりして、従来の制御系だと壊れたしりしないような工夫がされているはず。 とすると、信号線でPWM信号よりも高速にコマンドコードみたいなものを送ると信号の向きが切り替わるような仕組みになっているのだろうか。。。 謎。
 後者は、線を1本追加でやってみようかな? 前者は、VHDLを再度勉強しなおして挑戦?? 

 結論: 私も近藤科学(株)さんの KRS-2346ICS -RED Version が欲しい!!

(2004年2月23日)


 1週間かけて 2D-CAD をいろいろと触ってみようと思ったのですが、結局時間が取れず、今日の午前中に自分の直感に合うものを探してみました。 どれも機能豊富で迷ってしまいましたが、DJ !! standard が一番しっくり来るな、と思ったので、それにして絵柄を仕上げてみました。 私の使っているRCサーボは KO PS-2174FET改ですので、近藤科学(株)さんのWebにそのサーボの図面が出てますのでそれを参照させていただきました。 これがあったので、とっても楽にスタートが切れました。 感謝、感謝です!

  • イメージがちゃんと実物に合うか?
    ということで、普通紙に印刷して、
    スケールを含め問題ない構造を作る。
  • 実際にはアルミ板に厚みがあるので、
    多少ずれるので注意。

 まずは、直交軸作りから着手。 いきなり難しいものを選んでしまったと、加工中に気が付きましたが、これが欲しかったから、アルミ加工に手を出したも同じでしたので、突っ走ってみます。
適度なデザインが出来上がったところで、シール紙に印刷し、アルミ板に張ってみました。

  • アルミ板は、
     A5052P 250mm x 400mm x 1.2mm
    を使用。(2004/2/18日記参照)
  • シールは、フリーラベル
    (2004/2/22日記参照)

 シール張ったサイズくらいに大まかに切断した後に、3mmφのネジ穴(タップを切るために指定サイズの2.5mmφ穴であける)をあけました。 その後、林メカトロ工作支援室を参考に、折り曲げを実施してみることにしました。 折り曲げ線上には、2mmφのドリルを使って5〜10mm間隔で穴を途中止めで肉抜きをするというものです。 1箇所試しに折り曲げてみたのですが、この途中止めにもコツがあるようで、もう少し練習をしたいと思います。 コツがわかったら公開しますね。

 今回使ったフリーラベルですが、みなさんにもお勧めです。 加工した後、シールを剥がすとき、スッキリときれいさっぱり剥がれます。 これはビックリしました。 バーニング宮田さんのアルミ加工テクニックでは、ライターオイルを使うというのが紹介されてましたので、ある程度は覚悟していたのですが、一切使わずに済みました。 私の裏技は消しゴムだったのですが。。。(実はそれを紹介したかった。。。) そして、エイヤァって曲げを行った後。。。

  • 2個の RCサーボを取り付けて見ましたの図。
  • 一回でうまくいくとは思っていなかったので、
    今回は、全く肉抜きしてませんでした。
    (図面上では、上図左の予定)
  • 1.2mm厚のアルミ板。
    森永さんからタップを切るのが難しいよ、との
    アドバイスがありましたが、挑戦してみました。
    しっかりと止まっているみたいです。
     モーションを激しくすると駄目なのかな?
     抜き差しが多いと駄目になるかな??
    と不安が残ります。。。

 とりあえず、今日は、CAD 選定、見よう見まねで2軸直交ブラケットの製作までできました。
 この調子でドンドン作ってみよう!(とりあえず、太もも部分、足首部分の合計4つ分は欲しいですね)

(2004年2月28日)


 今日は、4年に一度の2月29日。 RoboOneSpecial 日。

 近々、ロボット関連のリンク集を作ろうと思います。 これまで、半ば無断リンクを続けてきましたが、ここぞでちゃんと連絡をしてリンクを張らせていただこうかと。。。
 こまったのが、バーナー。 私は絵心がないので、自信がないです。。。
 そこで、がんばって作ってみたのが、このバーナー。 みなさん、どんどんリンク張ってくださいね〜。

 せっかく早起きしたのですが、気分的に家でゴロゴロしたくなったので、結局 RoboOneSpecial 観戦は行きませんでした。 昨日の続きをしてみました。

  • T型のが2軸直交ブラケット用。
    昨日のとはちょっと変えてみました。
  • H型のが膝部分。
    これで膝の駆動範囲が大きくなるはず。
  • 1直線のものが、足付け根部。
とりあえずここまで作ったのですが、
曲げは来週末かな?

 既存のイトーレイネツ製のものを流用できるところはそのまま使うとして、足自由度を大きくするというのと、太もも部分の2軸直交のため両足で6個切り出しをしました。 電動糸鋸の仕様書に15分以上連続して動かさないこと、とあったので、休み休みかな?と、思ったのですが、一気に切れちゃいました。 勘をつかめば楽チンですね。 予備の刃を買ったのですが、出番はないかも。。。小学生の頃だったか、技術の時間に電動糸鋸を使った記憶があるのですが、よく刃が切れちゃったんですけどね。

 曲げは来週にしようと思います。 というのも、卓上のドリルを手に入れたい、というのがあるのです。 肉抜き、曲げ加工部の肉抜き、ネジ穴あけなどたくさんあるのですが、これまで、ネジ回し用(下写真左)のもので穴あけしていたのですが、結構大変なんですよね。 ただ、今探してる卓上ドリルですが、安価なものは 6mmφが最大なんです。 RCサーボホーンや、ベアリングの関係で、7mmφと8mmφの穴あけもしたいな、と考えていたりします。 それで、購入を見送ってます。 ねじ回し用のものに 7mm, 8mmφのドリルと、それをくっつけるアタッチメント(下写真右)はもっているのですが、卓上のものもこんな感じで取り付けできれば、即買いなんですけどね。。。

(2004年2月29日)


 昨日のことになりますが、会社帰りに ROBOT王国HOZANミニデスクドリル K-21 を購入しました。 他に近くのS店やH店でも同じものを扱っていたのですが、2,000円も差があったんです。 ROBOT王国さん、さすがです!(サーボや電子機器は定価なんですけどね。。。ボソ) ただし、Web では扱っているのですが、店内においてなくて、結局持ち帰りできませんでした。 来週に自宅へ宅急便搬送です。 楽しみです。 (帰りは電車がラッシュアワーということで結構つらかったです。 持ち帰りしなくてよかったのかも。。。)

  • いろいろとリンさんにご紹介いただいた「ホールソー
  • 7mmφと8mmφを1個ずつ買ってきました。
  • 秋葉原で買うよりも家近くの電気工具屋さんの方が
    安かったという事実を今日知りましたが。。。
    (しかも7割程度の値段!)

 久しぶりに、回路系について考えてみました。 題して、ジッターフリー。

 PWM周期の呪縛から逃げられないので、CPLD にてPWM波形を作り出そうと思い、アレコレやってみた。 下記がその VHDL ソース。 間違っているかもしれませんが、素人なのでドンドン指摘していただけると幸いです。 これを回路に焼いてみようと思って、いざ、Xilinx の Project Navigator で Impliment Design (Fitting) をしてみたが、総マクロ数が圧倒的に足りずでした。 確かに、バーニング宮田さんにも ALTRA FLEX10K10 を選んだ理由と、出力数を制限した理由を聞いたことがあったなぁ、と、ここで気が付きました。 う〜ん。 せっかく、完全ジッターフリーを狙ったんだけど、その初期段階(デバッグすらしていない)に脱落とは。。。 所詮、CPLD なんだな、という感じ。 ちなみに、今回必要とするマクロ数は 407。 例えば、CPLD の XC9572 だと 72マクロだから全く駄目。 ということで、アルゴリズムすら検証終わってませんが、PWM発生VHDLソースです(ボツです)。

1:      library IEEE;
2:      use IEEE.STD_LOGIC_1164.ALL;
3:      use IEEE.STD_LOGIC_ARITH.ALL;
4:      use IEEE.STD_LOGIC_UNSIGNED.ALL;
5:      
6:      entity PWM is
7:              Port(
8:                      adrs  : in std_logic_vector(  4 downto 0 );             -- 4word(5bit)
9:                      data  : in std_logic_vector(  7 downto 0 );             -- 8bit
10:                     n_wrl : in std_logic;                                   -- not write flag
11:                     clk   : in std_logic;                                   -- clock
12:                     clr     : in std_logic;                                 -- clear
13:                     PWM   : out std_logic_vector( 13 downto 0 )             -- 14bit PWM out
14:             );
15:     end PWM;
16:     
17:     architecture Behavioral of PWM is
18:             signal buf00 : std_logic_vector( 11 downto 0 );
19:             -- 省略 buf01〜buf0C --
20:             signal buf0D : std_logic_vector( 11 downto 0 );
21:     
22:             signal buf10 : std_logic_vector( 11 downto 0 );
23:             -- 省略 buf11〜buf1C --
24:             signal buf1D : std_logic_vector( 11 downto 0 );
25:     
26:             signal counter : std_logic_vector( 11 downto 0 );
27:             signal max     : std_logic_vector( 11 downto 0 );
28:             signal flag    : std_logic_vector( 13 downto 0 );
29:             signal data_sync : std_logic_vector( 7 downto 0 );
30:     begin
31:             data_sync <= data;
32:             PWM <= flag;
33:             process( clk, clr ) begin
34:                     if ( clr = '1' ) then
35:                             counter <= "000000000000";
36:                     elsif ( clk'event and clk = '1' ) then
37:                             counter <= counter + '1';
38:                             if ( n_wrl = '0' ) then
39:                                     case adrs is
40:                                             when "00000" => buf10( 11 downto 8 ) <= data_sync( 3 downto 0 );
41:                                             when "00001" => buf10(  7 downto 0 ) <= data_sync;
42:                                             -- 省略 buf11〜buf1C --
43:                                             when "11010" => buf1D( 11 downto 8 ) <= data_sync( 3 downto 0 );
44:                                             when "11011" => buf1D(  7 downto 0 ) <= data_sync;
45:                                             when "11110" => max( 11 downto 8 ) <= data_sync( 3 downto 0 );
46:                                             when "11111" => max(  7 downto 0 ) <= data_sync;
47:                                             when others  => max <= "100000000000";
48:                                     end case;
49:                             end if;
50:     
51:                             if ( counter = max ) then
52:                                     counter <= "000000000000";
53:                                     buf00 <= buf10;
54:                                     -- 省略 buf0n <= buf1n --
55:                                     buf0D <= buf1D;
56:                                     flag <= "11111111111111";
57:                             end if;
58:     
59:                             if ( buf00 = counter ) then
60:                                     flag(0) <= '0';
61:                             end if;
62:                             -- 省略 buf01〜buf0C --
63:                             if ( buf0D = counter ) then
64:                                     flag(13) <= '0';
65:                             end if;
66:                     end if;
67:             end process;
68:     end Behavioral; 

 そこで、PWM周期が小さいアナログRCサーボでも耐えうるジッターフリーPWM出力をするために、次なるアイテムを考えたのでした。
 まだ、考案中ということで、できるかどうか、なんてわかりませんが、やってみようと思います(ただし、ボツだと web からも消えていくかも。。。)。

こうすることで、割り込みは純粋にRCサーボに出力するPWMのみとなり、ジッターフリーにできるのではないか? と思ってます。 何かジッターフリーの考え方で抜けがありましたら、教えて頂きたいです。

 みなさん、ご存知だったのでしょうか? RoboOne の web の左(右じゃないですね)に Calendar というのがあって、次回 RoboOne第6回の日程が記載されています。 RoboOne J が 8/6, 予選 8/7, 決勝 8/8 だそうです。 気合をいれましょう。 あと、ちょうど5ヶ月! ん? もう1ヶ月も経ったんですね。。。 1/6を無駄に過ごしていないか、チェック!

(2004年3月6日)


 ちょっと気分が回路に向いたので、昨日考えたプランから一歩進んで、CPLD でRC受信機などの PWM 出力をパラレル変換する VHDL を考えてみました。 まだ動作確認前ですが、多分、大丈夫でしょう。 ちょこっと使用するCPU側で考慮が必要ですが、CPUで割り込み毎に数を数えてPWM時間を測定するというよりは、シンプルでCPU負荷はないと思います。 まだまだ、素人ソースなので、間違いなどあるかと思いますので、ご注意ください。

1:      library IEEE;
2:      use IEEE.STD_LOGIC_1164.ALL;
3:      use IEEE.STD_LOGIC_ARITH.ALL;
4:      use IEEE.STD_LOGIC_UNSIGNED.ALL;
5:      entity RECEIVER is
6:              Port(
7:                      DATA  : out std_logic_vector( 11 downto 0 );            -- 12bit
8:                      RE    : out std_logic;                                  -- Read Enable
9:                      ADRS  : in  std_logic_vector(  3 downto 0 );            -- 4bit (15ch + ("0000"=wait) )
10:                     PWM   : in  std_logic_vector( 14 downto 0 );            -- 15bit PWM in
11:                     CLK   : in  std_logic                                   -- clock ( Max 25MHz )
12:             );
13:     end RECEIVER;
14:     architecture Behavioral of RECEIVER is
15:             signal counter  : std_logic_vector( 15 downto 0 );
16:             signal buf      : std_logic_vector( 15 downto 0 );
17:             signal data_reg : std_logic_vector( 15 downto 0 );
18:             signal status   : std_logic;
19:             signal re_reg   : std_logic;
20:     begin
21:             DATA <= data_reg( 15 downto 4 );
22:             RE <= re_reg;
23:             with ADRS select
24:                 status <=   PWM( 0) when "0001",
25:                             PWM( 1) when "0010",
26:                             PWM( 2) when "0011",
27:                             PWM( 3) when "0100",
28:                             PWM( 4) when "0101",
29:                             PWM( 5) when "0110",
30:                             PWM( 6) when "0111",
31:                             PWM( 7) when "1000",
32:                             PWM( 8) when "1001",
33:                             PWM( 9) when "1010",
34:                             PWM(10) when "1011",
35:                             PWM(11) when "1100",
36:                             PWM(12) when "1101",
37:                             PWM(13) when "1110",
38:                             PWM(14) when "1111",
39:                             'X' when others;
40:             process( CLK, buf ) begin
41:                     if ( CLK'event and CLK = '1' ) then
42:                             if( status = '1' ) then
43:                                     counter <= counter + '1';
44:                                     buf <= counter;
45:                                     re_reg <= '0';
46:                             else
47:                                     counter <= "0000000000000000";
48:                                     buf <= "XXXXXXXXXXXXXXXX";
49:                                     re_reg <= '1';
50:                             end if;
51:                     end if;
52:                     if( status'event and status = '0' ) then
53:                             data_reg <= buf;
54:                     end if;
55:             end process;
56:     end Behavioral;

 簡単に解説、ではなく、私が作りたいと思ったことを説明書きしておきます。 何かお気づきになられた方、いらっしゃいましたら、メール等でご指摘いただければ幸いです。

 参考までに、fitting したときの resource summary を紹介しておきます。 信号ピン数は1ピンだけ使っていないだけです。 あと、RCサーボの制御で AND 回路ばかり使った場合は全く使っていなかったレジスタやも有効に利用できているみたいです。

1:	cpldfit:  version G.26                              Xilinx Inc.
2:	                                  Fitter Report
3:	Design Name: receiver                            Date:  3- 7-2004,  3:17PM
4:	Device Used: XC9572-15-PC44
5:	Fitting Status: Successful
6:	****************************  Resource Summary  ****************************
7:	Macrocells     Product Terms    Registers      Pins           Function Block 
8:	Used           Used             Used           Used           Inputs Used    
9:	42 /72  ( 58%) 277 /360  ( 77%) 41 /72  ( 57%) 33 /34  ( 97%) 118/144 ( 82%)
10:	PIN RESOURCES:
11:	Signal Type    Required     Mapped  |  Pin Type            Used   Remaining 
12:	------------------------------------|---------------------------------------
13:	Input         :   19          19    |  I/O              :    27        1
14:	Output        :   13          13    |  GCK/IO           :     3        0
15:	Bidirectional :    0           0    |  GTS/IO           :     2        0
16:	GCK           :    1           1    |  GSR/IO           :     1        0
17:	GTS           :    0           0    |
18:	GSR           :    0           0    |
19:	                 ----        ----
20:	        Total     33          33
21:	MACROCELL RESOURCES:
22:	Total Macrocells Available                    72
23:	Registered Macrocells                         41
24:	Non-registered Macrocell driving I/O           0
25:	GLOBAL RESOURCES:
26:	Signal 'CLK' mapped onto global clock net GCK1.
27:	Global output enable net(s) unused.
28:	Global set/reset net(s) unused.
29:	POWER DATA:
30:	There are 42 macrocells in high performance mode (MCHP).
31:	There are 0 macrocells in low power mode (MCLP).
32:	There are a total of 42 macrocells used (MC).
33:	End of Resource Summary

 なんとなく fitting できているので、良いのかな? と思ってますが、近いうちに、CPLD に書き込んでテストしてみます。

 品薄のため、加速度センサが某店頭から見受けられなくなって困っている方もいらっしゃるかもしれませんので、千石電商さんで手に入る スター精密(株)APA300 を使う方法について簡単に紹介しておきます。 ちょこちょこっと OPAMP と抵抗、コンデンサを組み合わせ、CPU の ADC ポートに接続すれば、3軸加速度センサとして使えますので、トライしてみてはいかがでしょうか。 以下に回路図を示しておきます。 必要に応じて、ADC 入力ポート部分にプルダウン抵抗を入れて GND 接続をしてください。


 一般的な回路として、APA300 の出力を増幅する回路を作ってみました。
  • OPAMP として一般的な非反転増幅で、100倍程度の増幅とする。
  • COMMON に対しては、Vdd(+5V) の中間値 (+2.5V) とする。
  • R1 500kΩと R2 5kΩの2個の半固定抵抗にて、gain (1+R1/R2) 調整を行う。
    (とりあえず、中間値くらいにして調整するのが良いでしょうね)
 X軸のみの回路を示しているが、Y, Z も同じ回路構成で OK。
 ただし、X, Y, Z の仕様の差があるので注意(以下参照)。
  • X,Y : 4.6[mV/G], Z : 3.9[mV/G] ( 1[G] = 9.8[m/sec2] )

 う〜ん。 今日も盛りだくさん。 リチウムポリマーバッテリーの 7.4V 2,200mAh. 版フタバ産業(株)さんから販売されはじめました。 7,800円ということです。 写真を良く見てみると、重ねているだけに見えますが、それにしても7.4V 1,000mA/h が 4,800円だから、安く抑えてくれてますね。 11.1V 仕様のものも発売されてます。 けど、どうすれば、いいんだ? 肝心のチャージャーが無いぞ!?

(2004年3月7日)


 買ってしまった。。。 リチウムポリマーバッテリー(Li-POと書くらしい) 7.4V 2,200mAh 仕様品
 使い方はこれから考えるとします。 ぉぃぉぃ。 小さい、軽い、は前評判通りですね。 これで、新しいロボットの形がさらに見えてきました。
 フタバ産業(株)1F売り場店長の宇佐美さんにいろいろと Li-PO について教えていただきました。 お忙しいところいろいろとすみませんでした。

  • 2,200mAh は 1,000mAh 仕様のものを2つくっつけたわけではなく、中身をちょこっと変えている(だから単純足し算にはなっていない)。
  • Li-PO 1セルあたり、2.8V 以下になると充電できないので、注意。 7.4V なので 2 セル型となり、5.6V 以下が危険ということになる。
    • 充電器の仕様書には、2.5V以下が再充電不可領域とあります。 いずれにしても、要注意ですね。
  • バランシングセンサーは、2セルでバランスよく放電、充電されているとは限らないので、それをみるもの。
    • これは使える! これを聞くまでは、上記 APA300 のCOMMONを作るのと同じOPAMPを使おうと思っていたのですが、ここの電位、つまり片方の電位をADCで読めば止めるタイミングがわかりますね。 さっそく仕様をかためてみるとするか。。。
  • 2,200mAh 仕様のものは、最大 17.6A の放電電流が可能。 (すごいですね)
  • 充電直後は、8.4V 程度まで上がっているので、RCサーボ直結はしない方がよい。
    • ん! 知らなかった。。。 A-Do さんはどうやってるんだろう。。。 ロボマガ31号を読み返してみてもノウハウは見当たらない。。。

といったところでしょうか。
 Li-PO 専用充電器も買ってきました。 11.1V 仕様のものはなさそうですが、7.4V 仕様のものであれば、単純に充電時間が長くなるだけで問題はないとのことです。 さらに、充電時間は2時間程度ですが、3時間程度まで行った方が、さらにフル充電されるので良いそうです。 専用充電器であれば、安心して+1時間くらいすることがお勧めとのこと。

(余談) ところで、何で今日、この買い物ができたか? ですが、成人病検診の会社制度で普通の健康診断から、X線、超音波、バリウム飲んで胃の中の様子をみたり、と、いろいろと検査をうけてました。 それが、意外と早く終わってくれたので、(渋谷で検診ということもあって)秋葉原までちょこっと行ってきた、というわけです。

 またまたロボットのアルミ加工から外れてしまっていますけど、ここでちょっと記録残し。 (株)夢現工房さんのところで販売されてます、TA-28Mってかっこいいですよね。 Hitec用ということなので、購入はできませんが、私自信が作ろうとしているロボットと同じベクトルをビンビン感じてます(レベルが段違いなので、恐縮です)。 1台、研究用に欲しいなぁ。。。 アルミ加工やつなぎ目、どうやってるんだろうってそっちに興味がいっちゃいますけど。

(2004年3月8日)


 バーニング宮田さんのところの掲示板でちょこっと質問がありました、バランシングセンサーについてです。
 下記に簡単に図をかいておきます。 ロボマガで連載されている JinSatoさんから「今後の使い方に期待してます」のコメントを頂きました。 うれしいですね〜。

  • 両端がバッテリーの+と−になります。
  • 2,200mAh の場合、同じバッテリーが4つで構成されてます。
  • 左図での上下2組のバッテリーの中間電位がB.S.(BalancingSencer)として単純に結線されてます。
  • この B.S. 端子を CPU のアナログ入力端子に結線し、電位を読み取れば、バッテリー監視が可能。
    ただ、瞬間的に電位が下がることがあると思いますので、注意が必要かもしれません。。。
    特にPWMの周期を大きく変えるとき、サーボに流れる電流が大きいはずですので、そのときの測定は無効にしたいですね。

 Kokam 製の Li-PO バッテリーが ROBOT王国さんから発売になりましたね。 個人的にとってもタイムリーな話題でびっくりです。
 かなり高価ですが、3,000mAh というのも発売されてます。

(余談)トップページからのこの最新日記ページへ一気に飛べるリンクを張りました。

(2004年3月9日)


 アルミ加工は楽しいです。 今日は、先日届いた卓上ドリルを使って、穴あけから再開。

  • HOZAN の K-21です。
  • 切りくずをお弁当などで使うアルミ皿で受けた。
    けっこう、下に落ちるものはきちんと回収できてよい。
  • ミニホールソーとの相性もバッチリ。

ミニホールソーも使って加工してみました。

ブラケットの重さを軽くするために、穴をあけるのにもホールソーを使ってみましたが、思わぬところに落とし穴がありました。
ホールソーで穴あけするときは、加工時のガイドラインとして表面に貼り付けたシールは、剥がしたほうが良いでしょう。 上右写真のように、ホールソー内にシールが詰まってしまいます。 だんだんと加工力が落ちていきます。 気が付いた時には、こんな感じにびっちり詰まってました。
いろいろとやった結果。。。

  • できました! 念願の2軸直交ブラケット。
  • 今回は、ちゃんと肉抜き穴もいれてのものです。
  • やっぱり、アルミ加工は楽しいですね!!

(2004年3月13日)


ちょっと余談。

ふと思ったのですが、KO KRS-2346ICS Red Version が発売になりましたが、どれくらい売れてるんでしょう。
数ヶ月前に従来バージョンのものを買って、今回の Red Version も買った方もいらっしゃるでしょう。
Red Version を使うということで、従来バージョンのを安く譲っても良いよ、という方がいらっしゃっいましたら、
是非、相談させていただきたいですね。 ご連絡お待ちしております!

 ノウハウをまとめることなく、また、調子に乗って、アルミ曲げを肉抜き法で行っていたところ、曲げの順番を間違えてしまいました。 みなさんもこんな失敗ありませんか?
肉抜き法と一緒に、このあたり、ちゃんと自分なりにまとめておかないといけないなぁ、と今日は実感しました。

 気になっていた、1.2mm厚のアルミに、2mmφ, 3mmφのタップも落ち着いて行えば、問題なしですが、先の曲げと同じで調子に乗らないようにしないと。。。

(2004年3月14日)


 仕事がとても忙しく、ロボット製作に着手できず。
 ここはあせらず、じっくりと取り組みたい。。。 が、休みになると眠い。。。

 とりあえず、覚え書き。

(2004年3月20日)


 三月兎さんから、RoboOne の DVD が届きました。 ありがとうございます!
 やはり、すごいですね。 web 公開されている映像以上に興奮しました。 私も改めて参加したい!という気持ちがこみ上げてきて、先日来のテンション低下から復活できそうです。

 ところで、RoboOne6 からランブルの関係だったか、操作系の制約が入ったような気がしてます。 詳しい規定事項が知りたいですねぇ。。。 投資が必要なんだろうなぁ。
 数日前のRC受信機のPWM時間読み取りですが、全く違う方法で何とか完成しましたが、これが無駄になったりして。。。と不安になってきてます。

 ともあれ、気合いが復活してきたところで、8月の大会まで4ヶ月ちょっとですから、がんばりましょう!!
 RoboOne J も考えましたが、やはり1本に絞って行きたいと思います。

(2004年3月21日)


 JinSato さんのところで、軽量直交ブラケット製作について、興味深いことが書かれてました。

とすると、軸ズレ(サーボホーン側の軸と裏軸とのズレ)さえなければ、ベアリングフリーで作ってしまうのも、悪くないのかな。 でも、どうやって軸ズレを0にできるのだろう。。。 近藤科学(株)さんのRCサーボの場合、RCサーボ中心から9.6mmという半端なところに中心があるので、0.1mmほどズレてしまう。 技術力がないので、私はベアリングで受けるタイプにしよう。 ただし、プルプル現象は抑えたいので、以前、SISO さんに教えていただいたスラストベアリングを作って回転がスムーズになるようにしてみよう。

 ここまで書いて最近の日記を振り返ると、web で教えていただいた知識をまとめている記載が多いことに気が付きました。
 先日、直交軸のところの詳細を教えて欲しい、というメールを頂いたので、簡単に図面を記載しておきますね。
 ただし、加工精度などもあるので、何度か各自でトライして微調整をしてみてください。

サーボホーン取り付け部
  • 一般的なところで、幅 20mm のアルミ板に取り付ける場合
  • KO RCサーボは 8mmφのサーボホーン穴で取り付け可能
  • 中心を揃えて 10mm□の4隅にネジ止め用の穴を開ける
    • 1.5mmφのドリルで穴あけをする
    • 2.0mmネジ用のタップをあける
裏軸取り付け部
  • 上図と同じく幅 20mm のアルミ板に取り付ける場合
  • ベアリング取り付け穴を開ける
    • 両シールド形フランジ付きミニチュアボールベアリングの外寸法に合わせる
    • オリジナルマインドなどで入手可能

 夢現工房(株)さんのところで話題になっている Hitec製 の X-Servo (HSR-5995MG)ですけど、さらなるパワーアップがあるんですね。
 すごいです。 定格トルクが 24kgcm(@6.0V), 30kgcm(@7.4V)。 起動トルク(36kgcm(@7.4V))と、定格トルクと2種類の規格があるみたいですが、どう読むんだろう。。。 起動っていうくらいだから、PWMを変化させたときに出るトルクってことかな?

(ちょっと余談)
 ブラケットの図面描きをここのところ続けているので、これといって日記ネタがないのに、たくさんの方に見ていただき、ありがとうございます。 これからもがんばりますので、よろしくお願いしますね。

(2004年3月28日)


 このところ日記が更新されていないことに改めて気がつきました。
 JinSatoさんの web や、バーニング宮田さんの web に刺激を受けながらも、ひたすらアルミ加工に没頭。
 そんなところで、3mmのタップを切らなきゃいけないところに 3mm の穴を開けてしまった。。。(下穴としては2.5mmφが適当)
 まぁ、こんな感じで少しずつでも完成に近づけば良しとしたいですね。

 ところで、私と同じCPUボード( Best Tech. 製 BTC070 (CPU:SH2/7047F) )を使われている方は多いと思います。
 データの展開などで外付け SRAM を使いたいけど、TIOC が10本しか使えない、と嘆いていらっしゃる方、こんな形であと2本追加してみてはいかがでしょうか?
 (改造に際して、トラブルを起こしても、当方は責任取れませんので、各自で確認しながら行ってください)

 SH2/7047F の 下記4ピンを足カットする。

 そして、基板側の足残りと、LSI側の足残りをタスキがけして結線をしなおす。

すると、CS0, WRL は PA10, PA12 にて制御する形が取れます。 また、PE0, PE10 は、TIOC0A, TIOC3C として使えるので、PWMが12本となります。 あとは、ソフトウェアの設定だけが必要です。 GNU diff 2.72 にて shrom2.c の差分ファイルを作ってみましたので、参考にしてください。 なお、このソースは、内部フラッシュROM + SRAM で動作させる場合のものです。

1:	--- org/shrom2.c	Tue Aug  5 01:27:27 2003
2:	+++ shrom2.c	Sun Apr 11 22:48:37 2004
3:	@@ -61,12 +61,16 @@
4:	   PFC.PECRH.BIT.PE18MD = 3 ;  // PE18 = A12
5:	   PFC.PECRH.BIT.PE17MD = 3 ;  // PE17 = A11
6:	   PFC.PECRH.BIT.PE16MD = 3 ;  // PE16 = A10
7:	-  PFC.PECRL1.BIT.PE10MD = 3 ;  // PE10 = /WRL
8:	+//PFC.PECRL1.BIT.PE10MD = 3 ;  // PE10 = /WRL
9:	+  PFC.PACRL3.BIT.PA10MD = 0;  // PA10 = /WRL
10:	+  PFC.PACRL1.BIT.PA10MD = 1;  // PA10 = /WRL
11:	   PFC.PECRL2.BIT.PE7MD = 3 ;  // PE7 = A9
12:	   PFC.PECRL2.BIT.PE6MD = 3 ;  // PE6 = A8
13:	   PFC.PECRL2.BIT.PE5MD = 3 ;  // PE5 = A7
14:	   PFC.PECRL2.BIT.PE4MD = 3 ;  // PE4 = A6
15:	-  PFC.PECRL2.BIT.PE0MD = 3 ;  // PE0 = /CS
16:	+//PFC.PECRL2.BIT.PE0MD = 3 ;  // PE0 = /CS
17:	+  PFC.PACRL3.BIT.PA12MD = 0;  // PA12 = /CS
18:	+  PFC.PACRL1.BIT.PA12MD = 1;  // PA12 = /CS
19:	 }
20:	 
21:	 __asm__ (

(2004年4月11日)


そろそろ出ているかな?と思って2つのサイトをチェック。 いずれも出てました。
  • SH2/7145F 搭載のベステクさんの新製品CPUボード
    写真のピン数からすると5cm□くらいの大きさでしょうか。
    SRAM, FLUSH を持たせていて、切り離しできない、とあります。 どうなんでしょう。。。
  • KO RedVersion の新製品
    KO 新RedVersion も、予想通りICS のものが RedVersion かぁ。。。

(2004年4月15日)


 久しぶりにロボットの画像を。 まだまだ未完成で修正してたりしますが、ほんとノンビリ楽しくアルミ切り出しして、ミニ万力で曲げ入れてます。

  • DJ にもかなり慣れてきました。
    使い勝手も良いです。
  • まだちょっと慣れていないから、
    ページを超えての部品のコピーが
    できません。 誰か教えて!
  • とりあえず、1枚のアルミ板にびっしり
    パターンを描いてみました。
  • 足部分のブラケット。
  • 結構、シンプルにできてます。
    特徴は・・・
    • 軸裏の受けは、RCサーボの裏ブタと
      一緒にアルミ板をネジ止め固定。
    • 各軸の角度は最大限動くように。
    くらいでしょうか。 まだまだですね。

 RoboOne第6回のルールが改定されましたね。 とりあえず、ラジコンプロポは4chでPCM推奨。 よしよし。 これで今のラジコンプロポが使えることが確認できました。
 デモンストレーションは2分間でROMに持たせて動かすとか、起き上がりは必要だとか、今の私のロボットには足りないものばかりですが、必要かな?と思ってたものばかりなので、特に驚きはないです。 心配していたラジコンプロポも「PCM必須」ではなくて(推奨で)よかった。。。

(2004年4月18日)


 先週に引き続き、アルミ加工をして、(接続が甘かった部分を修正して)片足分の仮組みをしてみました。 先週のコメントの通り、既製ブラケットよりも各軸の角度が最大限動くようにしているので、(モーションアイデア次第ですが)楽しみではあります。 外的要因がなければ良いのかも知れませんが、やはりアルミ板だけだと軟目に見えてしまいますね。 とりあえず、歩行まで行ってみて補強など(アルミ板厚変更含めて)考えることにしましょうかね。

 もうちょっとがんばって両足仮組みしてみました(20時50分補足)
 右写真手前が伸ばした足(横から)、奥側が屈伸状態の足。

 制御用ボードについて考えてみました。 ジッターフリー回路部分は、バーニング宮田さんの Little Burning Core (LBC) を参照させていただきました。 ようやく、SH2/7047F の使い道が決まりました。 SRAMはおまけ、されど使いたい。 そこで、強引ではあるのですが、CS0, WRL 端子は今月11日日記の通りパターンカット&結線しなおしをします。 同様に、SRAMのアドレスビット(A6-A9)をパターンカットし、SRAM足の方でGNDへ直結。 一部のSRAMエリアしか使えませんが、EEPROM に保存しているモーションデータを格納するくらいのデータ格納エリアとしてだけ使えるかな?と考えてたります。 このあたりは、アルミ工作が終わってからじっくりと取り組みたいと思います。


 R3N制御系について
  • RCプロポからの信号はカウンタをもったCPLDにて
    全チャンネルをパラレル信号に置き換えて読み取る
  • 将来(ってイツだ?)に備えてRCサーボ直結のPWMを10本用意
  • 5本のPWMを2分配して10個のRCサーボを駆動。
    2分配させるCPLDにはクロックを入れ LBC 回路を参考にして
    ジッターフリーを実現する。
    (クロック信号は残り1本のPWMとする)
  • 加速度センサは3軸タイプのものに変更。
    OP-AMP により 0〜5[V] の信号に変換する。

(2004年4月25日)


 ベストテクノロジーさんから新しいサーボが発売されましたね。 結構小さく強力なもの。 ちょっとお高いですけどね。

 昨日書き上げた回路図ですが、何も CPLD を2つ使わなくたってよかったですね。
 Xilinx XC95108 や Altera MAX などで1つで済ませるのも手でしょう。 規模が大きくなったことで、できないかな?って思っていたこともできそう。 とりあえず、VHDL を書き書きしてみましょうかね。

(2004年4月26日)



 やるぞ!

 ようやく、本格的なGWに入れました。
 このGWの目標は以下の通り。 宣言し、実行する! ぐ〜たらパパらしからぬ行動。
  • 制御系を新規に設計し、回路検証を行う。
  • 従来の胴体に新しい足を取り付けてみる。
 さて、どこまでできるか?

(2004年4月30日)

 ゴールデンウィークも最終日。 さて、目標に対してどこまで進んだか?ですが、残念ながら、回路検証まではできませんでした。 新しい足を従来の胴体にくっつけてみる、というところはできましたので、画像公開です(ついでにトップ画像も変えてみました)。

 ご覧の通り未結線状態です。 まず、左写真(斜め上からの構図)は、屈伸状態です。 人間の「太もも」にあたるところと、「かかと」にあたるところがちょうど屈伸状態で乗せられる位置関係にあるので、サーボに電源が導入されていなくても安定して座っていられます。 右写真は、全体を伸ばした状態です。 R2Nの時の胴体なのでプラスチックの板でできてますが、ここは、クビレのある胴体に変身予定です。 Li-PO電池のみ搭載かな? と考えてます。 背中に制御用のボードを乗せてますが、影に隠れて見えてませんね。 頭のところにあるのは、RCプロポ受信機です。

 ちょっと思ったのですが、両足の間隔ってどうやって決めるんでしょう? 何か最適解があって決めてることなのでしょうか? 現在70mmほどです。 見た目には、もうちょっと内側に寄せても良いかな?という気もしますが。。。

 回路動作未確認ですが、全体図を紹介します。

4/25日記から大きく2点変更。 更に細かく追加した点が3点。 大きな変更点は、CPUの変更。 R1N の時に購入した CPUボードを使うことにしました。 7045F は 7047F と違い信号線がたくさんあるので、TIOCも標準で16本使用できるし、SRAMのアドレスバスとデータバスを除いても、汎用I/Oピンが24本あります。 その反面、CPUボードそのものが大きくなり、敬遠してきてました。 が、結局ロボットの背中に制御ボードを搭載する、と決めた時点でボードサイズは気にしないで良さそう、と判断しました。 あと、CPLD を マクロ数 108のXC95108に変更(もしかすると、ALTERA MAX にするかも)することで、より大規模な回路設計ができるようになりました。 とはいえ、RCプロポと今回搭載予定を決めた ジャイロ(2組) のカウンタとして使うくらいですが。。。(これでギリギリ108マクロで作れちゃってます)。 CPLD に入れる基本クロックは金石(kinseki)のEX03 12.8MHz を 1/128 して100kHz を入れることにして、8ビットで 2.5msec. をカウントすることにしました。 7047F で作った EEPROM 通信系も搭載し、PCで作ったモーションデータを簡単に実装できるようにしています。 さらに、Li-POバッテリーのバランシングセンサー(図中のB.S.端子)の電位をCPU のA/D端子に繋げて、バッテリー監視も行うこととします。 ジャイロを購入していないので、ここの検証は、いつできるか?わかりませんが、RCプロポとそんなに大差ないので、大丈夫でしょう。

 あと、制御系の概略を覚書として書き上げておきます。 うまく行くかは、やってみてからということで。 KO RED Version の製品紹介ドキュメントと JinSATO さんの日記を参考に考えてみました。

CPLD 接続
下記以外 TIOC0A-0D, 3A
RC サーボ直結
右足首用 TIOC1A, 1B
△ 制御PWM出力→100msec.PWM→インプットキャプチャ→制御PWM出力・・・
左足首用 TIOC2A, 2B
△ 制御PWM出力→100msec.PWM→インプットキャプチャ→制御PWM出力・・・
両腕用 TIOC3C, 3D, 4A-4D 制御PWM出力
△ モーション作成時のみ 50msec.PWM →インプットキャプチャ)
全16TIOC端子に対して割り込み周期 3.0msec.で動作する。
  下記フローのカッコ付き数字の順に実行動作させる。
(注:3.0msec.設定理由:後述のキャラクタリスティングチェンジ時間+最大インプットキャプチャ時間+α)
足首RCサーボ(KO RED Version想定)接続と動作概要
  1. 姿勢制御動作
    @ 制御PWM出力 (0.7〜2.3msec.)
    • 通常コンペアマッチ 1→0 出力モード設定(割り込み発生不要)
    • コンペアマッチTGRセット
    • TIOC 端子 1 出力
    • カウンタスタート
  2. 足首サーボトルクを下げ、指定角度からのズレを測定。
    @ 0.1msec. PWM出力 (キャラクタリスティングチェンジ・セッティング1)
    • 通常コンペアマッチ 1→0 出力モード&割り込み発生設定
    • コンペアマッチTGRセット (0.1msec.相当)
    • TIOC 端子 1 出力
    • カウンタスタート
    ATIOC端子をインプットキャプチャモード指定し RCサーボからの信号を受信
    • インプットキャプチャ (1→0の時にTGR保管する様)指定
    • カウンタクリア
    • カウンタスタート
  3. ズレ値から姿勢制御動作値の変更を実施
    @ インプットキャプチャした TGR からRCサーボ出力までの待機時間(0.1msec.)を引く
    A 1.-@との差から次に指定する制御PWM値を算出する。
    B 1.-@と同じ動作を行う
    → 2. へ戻る

ちょっと余談。
CPU を SH2/7045F に変更したところで、JinSATO さんの web にて秋月電子通商さんから ARM7 ボードが発売になることを知りました。
ATMEL AT91R40807(ARM7TDMI 33MHz), 128kbyteSRAM, AT29LV1024 1Mbit FLUSH ROM 着脱可 を搭載 基板サイズ 66mm x51mm

(2004年5月5日)


ちょっと余談。
千石電商さんで、サンハヤトブランドで H8/3694F 搭載ボードが \2,000 円で発売されましたね。
トランジスタ技術4月号を購入し損ねた方には良いかもしれませんね。

(2004年5月9日)


 このところ、回路図はかいても実際の写真がなかったので、とりあえず、ジャイロ周りの製作写真を取ったので、載せておきます。

 最近、いろんな方々が使われているジャイロ GWS PG-03 を私も2つ入手し、使ってみることにしました。 使い方は、第3回 RoboOne Conference の坂本さんの資料とか、ココがよろしいかと思います。 実際の信号についての詳細は、吉野さんの web がとってもわかりやすいです。
 今回入手した PG-03 はマイナーチェンジしたみたいで、幾つかの web での基板写真とは違うものでした。 パッケージから外して今回のように2軸ジャイロを作ろうとした場合には、ありがたいピン配列になってました。 右上写真のように、基板右下に「矩形波」「+」「−」の3つの記号が描かれてますように、6ピンのうち、右からGND,Vdd,信号ピンとなってます。 さらに、6ピンのうち左上のピンがリファレンス信号ピンになり、この信号に対して左下の信号出力ピンが作られます。
 今回は、直交2軸の角速度を検知する様にしてみました。 電源(Vdd,GND),リファレンスPWM信号,出力信号2ピンの合計5ピン分の端子を1まとめにしてみました。 この信号取り扱いは、先日の日記の通り、CPLD で処理するようにしてあります。 8bit の DATA bus で -127〜+127 の信号としてジャイロの値を取り出すことができます。 ただし、+/-127 フルの値ではありませんが。。。 XC9572-15pc44 で実装可能です。

1:      library IEEE;
2:      use IEEE.STD_LOGIC_1164.ALL;
3:      use IEEE.STD_LOGIC_ARITH.ALL;
4:      use IEEE.STD_LOGIC_UNSIGNED.ALL;
5:      entity RECEIVER is
6:          Port(
7:              DATA    : out integer range -127 to 127;    -- 8bit
8:              ADRS    : in  std_logic;                    -- 1bit (2ch)
9:              GYRO0   : in  std_logic;
10:             GYRO1   : in  std_logic;
11:             CLK     : in  std_logic;                    -- clock ( 100kHz -> 2.5msec.=250counts )
12:             REFPWM  : out std_logic                     -- 1.5msec. reference PWM to GYRO
13:         );
14:     end RECEIVER;
15:     architecture Behavioral of RECEIVER is
16:         signal  R_data_gyro0            : integer range -127 to 127;
17:         signal  R_data_gyro1            : integer range -127 to 127;
18:         signal  R_counter_gyro0         : integer range 0 to 255;
19:         signal  R_counter_gyro1         : integer range 0 to 255;
20:         signal  prev_status_gyro0       : std_logic;
21:         signal  prev_status_gyro1       : std_logic;
22:         signal  counter                 : integer range 0 to 255;
23:     begin
24:         DATA <= R_data_gyro1 when ADRS = '1' else
25:                 R_data_gyro0;
26:         process( CLK ) begin
27:             if ( CLK'event and CLK = '1' ) then
28:                 counter <= counter + 1;
29:                 if( counter < 150 ) then                -- 150counts = 1.5msec. = ref.PWM
30:                     REFPWM <= '1';
31:                 else
32:                     REFPWM <= '0';
33:                 end if;
34:                 if( GYRO0 = '1' ) then
35:                     R_counter_gyro0 <= R_counter_gyro0 + 1;
36:                 else
37:                     if( prev_status_gyro0 = '1' ) then
38:                         R_data_gyro0 <= R_counter_gyro0 - 150;  -- centering
39:                     else
40:                         R_counter_gyro0 <= 0;
41:                     end if;
42:                 end if;
43:                 if( GYRO1 = '1' ) then
44:                     R_counter_gyro1 <= R_counter_gyro1 + 1;
45:                 else
46:                     if( prev_status_gyro1 = '1' ) then
47:                         R_data_gyro1 <= R_counter_gyro1 - 150;  -- centering
48:                     else
49:                         R_counter_gyro1 <= 0;
50:                     end if;
51:                 end if;
52:                 prev_status_gyro0 <= GYRO0;
53:                 prev_status_gyro1 <= GYRO1;
54:             end if;
55:         end process;
56:     end Behavioral; 

 ちょこっとロボット本体の話し。 両足の間隔ですが、denno_ono さんの web ONOの電脳壁新聞で一般的なお話しを頂いた。 「足間隔はできるだけ狭く。」 なるほど。 ちょっと勝手にベンチマーク。 両足ピッチは、A-Do 3,4号機は、それぞれ 65mm, 63mm、バーニングスターは、約60mm(写真から読み取り)、2325-RX は約52,3mm(サーボ間に電池が入っている写真があるので電池長+20mm)。 高速歩行を実現されているロボットたちは60mmを切ってきているみたいですね。 重心が左右に揺れるのが小さいほうが高速歩行時の切り替えしが楽なんでしょうね(どこか(ご無沙汰している)冬のスポーツに似ているような)。 あんまり狭くしてしまうと、足が絡まったり、ふんずけてしまったり、足の動ける範囲が狭くなったりするので、最小を狙うのはちょっと避けたいですね。
 ということで、今日の結論。 50〜60mmで胴体設計をすることに決定!

(2004年5月15日)


 ようやく胴体部分のアルミ加工ができました。
 CPUボードが出来上がったら、身体測定をしたいと思います。

 肩の部分のサーボ下に、Li-PO バッテリー。 その下にある両足サーボの間にジャイロを搭載。 一応、そのジャイロ下にも少し空間があるので、制御系用サブバッテリーを搭載しても良いかな?と思ってます。 頭は、適当においてみたので、最終的にはどんなものになるか。。。 今は、手持ちのUSBカメラを分解して乗っけてみました。

 R2Nの制御ボードを使っての通電試験とかは、特に問題なしですが、まだまだ自信を持って公開できる動画なんてありませんので、静止画だけとさせていただきます。

(ちょっと余談)
遅ればせながら、denno_onoさんの ONOの電脳壁新聞、2周年、100,000ヒットおめでとうございます。
いつも(不)定期日記、拝見させていただいてます。
また、うちの web も取り上げていただいているおかげで、訪問者が増えていて、うれしいやら、はずかしいやら。。。
今後とも、よろしくお願いします。 > denno_onoさん、そして、みなさん

(2004年5月22日)


 秋月電子通商にて 3軸加速度センサ(アンプ付き)が発売されていたので、ちょっと試してみました。 以前から使っている スター精密(株)製 APA300 のアンプ付き ACA302 の後継機? ACB302 です。 スペックとしては、0.1V/G の分解能ですので、5V-range の 10bit ADC ですと、約 20/G です。 これでは少ない、という場合、結局、OP-AMP による増幅が必要になります。 まずは、OP-AMP なしで単純に ADC に接続してテストしていたときに、失敗したことがあったので、書き残しておきます。

 右側写真のように、秋月電子通商さんでサービスでいただいた 1.27mmピッチ・スルーホール付き基板に実装し、2.54mmピッチのピンコネクタ(これは自前)をつけてみました。 右側写真のように、ピンコネクタの足が、隣のスルーホールに当たってしまい、ピン同士がショートしてしまう問題がありました。 対策としては、少し浮かせてピンコネクタを取り付けるか、スルーホールを強引に(ドリルなどで)取り除いてしまうかです。 とりあえずテストがしたかったので、今回は浮かせて接続して動作を確認しました。

 結果ですが、出力をそのまま CPU の ADC に繋げると、ノイズが乗ってしまうのかバラバラと値がふらつきました。 そこで、Renesas 3664Fハードウェアマニュアルのp.270 16.6 使用上の注意事項に記載されてます、0.1μF のコンデンサ(ローパスフィルタ)をGND間に取り付けることで、1bit のバラツキはあるものの安定しました。 まずまずです。 あと、オフセットのズレがありますが、これも 3664F マニュアルの同ページにありますが、低インピーダンスのバッファを入れるなど工夫が必要なのかもしれません。 意外と難しいですね。

(ちょっと余談)
Best Techさんの web で、Freedom3 のリーク情報が公開されてました。
ちょっと体を突っつくと、いろんなモーションをするというもの。とか、全部で3種類。
結構使えるかも。。。このモーション。

(2004年5月29日)


(ちょっと余談)
かなりハードな一週間で疲れがでました。 1日ゆっくり休暇をとり復活。

第6回 RoboOne の申し込みがそろそろ開始(6/10-7/15)。
それに伴って、ルールなどが正式に開示されました。
自律によるデモンストレーション2分と、起き上がり必須というのが入ってるので、
ロボット完成を急いでモーション作成などに気合いを入れたいですね。

一番気になるのは、仕事が忙しくて、
出場できない、ということかな?
まぁ、今から考えても仕方ないので、
マイペースでがんばろう。

(2004年6月5日)


 RoboOne6 の募集が開始されました。 ProjectAutoWalker の Dr.GIYさんをはじめ、みなさんエントリー番号1を取ろうとがんばっていらっしゃったみたいですね。 私は、もう少し完成度を上げてから申し込みしようと思います。

 今日は、R3N制御ボードの仮組みをしてみました。 4/25, 5/5の回路図を元に新しく考えたものでつくってます。 サイズは 60x75x25mm3 です。  7047F のボードの SCI3 からの通信コネクタがなんだか出っ張ってしまって、高さが抑えられません。 2mmピッチということで、下向きに付け直すことをしても下の基板ピッチに合わないし ...

(2004年6月12日)


 久しぶりに連続して日記をつけることになりました。 まとまった休暇もとりづらいので、とても貴重な2日でした。
 昨日に続いて、制御ボードの半田付けをしてました。 一応、すべて完了しました。 動作チェックはこれからです。

 制御ボードのコンセプト
  • 12個のサーボを CPU の TIOC に直結
  • RC-propo., Gyro の PWM は CPLD でカウント
    (RED Version の接続の場合は、
     pull-up 抵抗として 4.7kΩ抵抗を取り付ける。)
  • 加速度センサは 3軸 ACB302 で OP-AMP無し
    (5/29日記から再度作り直しました)
  • Eagle などでプリント基板作りたいな。。。
    (相変わらず、空中配線込みの結線。 けど、
     これが楽しいひと時だったりするんです。)

 ちょっと不安なのが、7047F の Flush 書き込みによる動作です。
 今までは、外部のSRAMで動かしていたので、EEPROM との通信がタイミング取りできなくならないかな? と思ってます。 どこかの web の BBS で読んだのですが、内部だけで動かした場合、結構スピードが出る、言い換えれば、ループ回数でタイミングを取っているようなプログラムの場合、スピード調整が再度必要になる、ということ。

 ともあれ、デバッグ前ですが、制御ボードが完成したので、ロボットに取り付けて動かしてみよう!

(2004年6月13日)


  • 胴体内に制御ボードを搭載することにした。
  • 身長 37cm (アンテナなし)
  • 身長 43cm (頭部アンテナ 5cm 込み)
  • 肩幅 20cm
  • 足長 25cm
  • 胴体内部の制御ボードを拡大。。。
     と思ったのですが、見えないですね。
  • 下から Li-PO 2,200mA/h (約 2cm厚)
  • 中央に先週出来上がった制御ボード
  • 続いて体重測定
  • 約 1,970g (腕の部分のブラケットが未完成状態)
  • 最終的には、2,300gくらい?
    • 腕ブラケット
    • 手 (?)
    • 頭部
    • コード類(束ねるとか)

いきなり、現状の身体測定から。 そろそろ RoboOne6 に申し込み書類を送ろうかと思ってやってみました。

RoboOne のトップページ、変わりましたね。 かっこよく変わってて、びっくり。
前回は、すぐにエントリーされた方々の紹介が web 上に紹介されていたのですが、なかなか登録されないなぁ、って思ってました。 きっと、この変更をがんばっていらっしゃったのでしょうね。 今日現在で7名の方が登録されてました。 身長、体重を見比べてみると、私のは平均的なところよりちょっと小柄って感じですね。

(ちょっと余談)
今日は、父の日。 生まれて初めて父として祝ってもらえた。
明日から、出張(1週間強)が断続的に続く。

なかなかロボットを前にして調整ができないだろうなぁ。。。
ともあれ、やれるだけやってみるだけ。

(2004年6月20日)


久々に更新です。 RoboOne第6回大会への申し込みも無事終わり、あとはリングに立つのみ! と言いたいところですが、まだまだ完成前です。 前回同様、時間との戦いになりそうです。 そんなところで戦っている場合ではないのですが。。。 1ヶ月ほど前からの進捗です。

腕部分の加工がまだ終わっていない、というか、時間切れで適当な形になりそう(誰か腕の加工手伝ってくださ〜い)。 まとまった時間がほしい。。。

動作チェック

出張中、プログラムだけ作っていたのですが、ハードを実際に動かすことをしていなかったので、ちょっと不安でしたが、まずまずでした。

(ちょっと余談)
 RoboOne 第6回大会も最初はエントリーが少なかったですが、最終的には 121台。
みなさんの意気込みがすごいですね。
前回とかのDVDを見たりしてテンションを上げないといけないなぁと感じました。

(ということで、これからまた出張ですので、更新は大会1週間前くらいからになりそうです。 たくさんの方に見ていただき、うれしく思います。 これからもよろしくお願いします。)

(2004年7月19日)


RoboOne出場に向けて、趣味の1週間がスタート!
大会出場される方々の web をみると、気合いが入っていたり、棄権表明があったり。。。
でも、これは趣味。
まず、自分は何がしたいのか、何ができるのか、出場ができなくても、何をしてると楽しいのか? まだまだやることはある、というのだけ気がつきました。

今日は、少しだけ時間が取れたので、IRQ割り込みについて勉強してみました。 が! 7047Fが壊れてしまったのか、IRQ3 だけが割り込みが掛からない。。。 最終的には IRQ3 は使わない仕様に変更しなければ。。。 以下が、テストに使用したコードの抜粋です(IRQ0だけ)。

1:      #include "7047f.h";
2:
3:      unsigned short  cnt_irq0;
4:
5:      void init( void )
6:      {
7:              PFC.PBCR2.BIT.PB2MD     = 1;            // IRQ0入力(INTC)
8:
9:              CMT0.CMCSR.BIT.CMIE     = 0;            // Enable CMI
10:             CMT0.CMCSR.BIT.CKS      = 1;            // 0:PΦ/8, 1:PΦ/32, 2:PΦ/128, 3:PΦ/512
11:             CMT0.CMCSR.BIT.CMF      = 0;            // フラグクリア
12:             CMT0.CMCNT              = 0;            // コンペアマッチカウンタクリア
13:             CMT0.CMCOR              = 0xFFFF;       // フルカウント
14:
15:             INTC.ICR1.BIT.IRQ0S     = 1;            // IRQ0 入力のエッヂで割り込み要求を検出
16:             INTC.ICR2.BIT.IRQ0ES    = 2;            // IRQ0 立ち上がり/立下り両エッヂで割り込み要求
17:             CMT.CMSTR.BIT.STR0      = 1;            // CMT0 タイマスタート
18:             INTC.IPRA.BIT._IRQ0     = 1;            // IRQ0 割り込み許可 SetSRReg() 直前指定
19:             SetSRReg( 0 );                          // マスククリア
20:     }
21:
22:     #pragma interrupt int_irq0
23:     void            int_irq0( void )
24:     {
25:             static unsigned short   current_cnt0;
26:
27:             current_cnt0 = CMT0.CMCNT;
28:             if( start_cnt0 == 0 && PB.DR.BIT.B2 == 1 ) {    // 立上りエッヂ検出
29:                     start_cnt0 = current_cnt0;
30:             }
31:             else {                                          // 立下りエッヂ検出
32:                     cnt_irq0 = current_cnt0 - start_cnt0;
33:                     start_cnt0 = 0;
34:             }
35:     }     

宮田さんの LBC でソース公開されている 3664F 用のものを SISO さんのコメントを参考に 7047F に書き換えてみました。 7047F の場合、IRQの立上り/立下りの両エッヂでIRQ割り込みが可能なため、LBCのソースとはそこがちょこっと違います。

7行目が IRQ0 の入力端子の設定。 今回は PB2 ポートを IRQ0 の入力端子としました(実際には、PB2-5 を IRQ0-3として使ってます)。
9行目から13行目がコンペアマッチカウンタの設定。 CKS の値は3指定でも十分の解像力が得られますが、他の割り込みなどにも使う場合は、適当に変更してください。 私の制御系の場合、上記設定の 1 にして、最下位ビットがバラバラと揺らぐ程度の精度で読み取れてるみたいです(TIOCなどの割り込み実施して)。
15行目から19行目は、割り込みの決まり文句。
22行目から35行目までは、割り込みが掛かった場合の処理です。 28−30行目が立上りエッヂ、31−34行目が立下りエッヂの処理となります。

(2004年7月31日)


(ちょっと余談)
なかなか進まない毎日の中、KOの軸付きボトムケースを手に入れた。
大会直前に購入して設計しなおしというのは厳しいですが、
なかなか良いアイテムに気持ちが揺らいでしまってます。
ただ、実際に軸裏として使おうとしたときに、
どのように軸受けすればよいのだろう? というところで、止まってしまいました。
ということで、今回は見送り決定。

さて、週末の大会に向けてですが、これまた厳しいというのが現実味を帯びてきました。
大会直前にして棄権。。。前回と同じことになりはしないだろうか。。。
やはり趣味とはいえ、計画性がないものは、
ダラダラと時間だけが過ぎてしまうものですね。
大会出場される方は、そのあたりの精神力もすばらしいです。

RoboOne 第6回大会も、棄権としました。
まだまだ、力不足というところですね。
ここ数日にて、(今頃)気が付いた注意事項をリストアップしておきます。

 SH2/7047F のTIOCによるPWMは、MTUの通常モードと、1つのMTUオーバーフロー発生時の割り込みにより行ってます。 MTUのPWMモードですと、TGRレジスタを1つ余分に使ってしまう(出力端子も1つ余分に使ってしまう)ことと、出力を2分配するときなど、結局、PWMモードをつかっても、毎周期 TGR を設定しなおすことなど、メリットがないためです。 その際、下記の2点を注意しておかないと、出力 High/Low の時間がずれて、ジッターの元になります。 アナログサーボでは気が付かないレベルですが、デジタルサーボを使う場合は、負荷0の状態でもジリジリと鳴り、けっこう気になりました。

  1. 7047F の MTU の設定にて SYNC はジッター発生のもととなりうる
     ・・・ SYNC できるのは 0,1,2 の組み合わせと 3,4 の組み合わせだけ。 そのため、0と3の間ではズレが生じる。
     →  SYNC させないで、いずれか1つのMTUで割り込み発生させて TCNT start 指示の方が安定していた。
  2. TSTR High 指定直前に TIOR 設定が望ましい(TIOCを通常モード&コンペアマッチで1→0とする動作設定の場合)。
     ・・・ 下記表(7047Fマニュアル 図10.85 p10-111) 中の (4) TIOR 設定時に TIOC*A が変化していることに注目。
     →  (6) TSTR (TCNT のカウントアップスタート)直前であることが望ましい。
    注) コンペアマッチで0→1とする動作設定の場合、MTUのオーバーフローでの割り込み発生直後にTIOR設定を行うこと(同上理由)。

KO の ICS 対応デジタルサーボなら、下図のように DeadBandWidth 設定でも負荷0でのジリジリ音が鳴る現象は低減できます。 同じ PWM を送信しているつもりでも、多少ずれた PWM が出てしまうような場合には、有効です。

DeadBandWidth を大きめにとるとジッターが気にならなくなる

 1つわからないのが、TIOC の値は、TIOR の設定以外で直接 0, 1 に変更することはできないものでしょうか。。。 特に、16ビット全てを1回の動作でできれば、と思うのですが。。。 今、やってる方法は、 全 TIOC 値を 1から0に変更することを想定して、

1:	MTU0.TIOR.WORD		= 0x2222;		// 全TIOC0 初期出力=0, コンペアマッチ=1
2:	MTU1.TIOR.BYTE		= 0x22; 		// 全TIOC1 初期出力=0, コンペアマッチ=1
3:	MTU2.TIOR.BYTE		= 0x22; 		// 全TIOC2 初期出力=0, コンペアマッチ=1
4:	MTU3.TIOR.WORD		= 0x2222;		// 全TIOC3 初期出力=0, コンペアマッチ=1
5:	MTU4.TIOR.WORD		= 0x2222;		// 全TIOC4 初期出力=0, コンペアマッチ=1 

という方法です。 これですと、5回にわけての動作となり、1と5の動作間で時間差が生まれてしまいます。 一定の時間のズレになりますので、設定値を変えれば吸収できるのですが、この設定開始からカウントアップスタートまでの間で割り込みが入ってしまうと、ジッターの原因になってしまいます。 う〜ん。。。

そういえば、R3N の最終制御系について紹介していなかったので、概略図をアップしておきます。


(特徴)
  • 1個のCPLDにて下記3項目を実現
    • Gyro の基本PWMを生成 (100kHz CLK から 1.5msec. CLK へ)
    • RCプロポからの信号を1つのPWMへまとめる(あわせてチャネル出力)
    • RC サーボの8個制御用に
  • 他は前回と同じ。
    • 残りのRCサーボ12個は直接 CPU から制御。
    • g加速度センサは、直接 ADC へ入力(ノイズ低減のため、0.1pF を入れる)
    • EEPROM の読み書き
    • Li-POのB.S.を ADC に接続し、Li-PO下限電圧監視。

(2004年8月7日)


 R4N-series 製作日記へ

 ロボット製作のページへ

 トップページへ