2016年12月27日火曜日

レッグユニット基板原価計算

基板1枚の原価計算がしたくなったので今回しました。
僕はコネクタのピン配置は1ピンから順番に正電源、グラウンド、(マスター側から見た)出力、入力の順番に統一して配置しています。これは個人的な美意識もありますし、正電源が1ピン、グラウンドが2ピンに統一されることで挿し間違えによる破壊を防止する目的もあります。
しかし近藤科学のサーボモーターとのコネクタだけこの基準になっていないことに前に気づきました。サーボモーターは伝統的に信号線、正電源、グラウンドの順になっていて、僕も前にそれにしたがって基板を作成しました。
基板を作り直したくなってきましたが、同じ基板が6枚必要なもので、基板の値段が高いなら他の修正が出てくるまで待とうと思い、今回基板の原価計算をしました。以下がレッグユニットの基板です。足1本に1枚の基板を使っていて、これが足のコンポーネントに接続されています。本体のマイコンとレッグユニットのマイコンはCANでつながっています。そうすることで本体側とは4本接続するだけでよく、取り回しがしやすくなります。

パーツ一覧
\  8、チップ抵抗(470 x5, 12k x3)
\ 45、チップコンデンサー(10p x2, 0.1u x2, 1u x1, 100u x1)
\ 15、チップダイオード(RB751S-40 x3)
\ 16、チップLED(red x4)
\ 50、水晶発振子(FA238V-12MHz)
\ 50、DIPスイッチ(DIP04YLSM)
\124、PHコネクタ(S2 x1, S3 x3, S4 x1, S6 x1, T6 x1)
\  5、チップFET(2SK1589)
\100、レギュレーター(AZ1086H-3.3, AZ1086H-5.0)
\100、CANトランシーバー(TJA1051T/3)
\ 25、リセットIC(TCM809RV)
\500、マイコン(LPC1768)
\200、基板
合計1288円

以外と安い、6枚で9千円
これなら修正してもよいかな。

2016年12月25日日曜日

ガンユニット(1)

レッグユニットが完成して歩行のデモを行うことができたので次はガンユニットです。今まで書いてなかったですが、アルミ板の加工はアミエ様(http://robot.umie-marine.jp/index.html)に注文しています。A5052のt1.5で部品点数が6点まででならB5に近いサイズで1枚2500円でフライス加工してくれるという格安のサイトです。
まずCADを使って部品の設計を行います。
これをアミエ様に切削の依頼をしますと。
このように切削された部品が届きます。アミエ様はなんとバリ取りまでやってくださる。結構面倒なのに。
これを組み立てると
こんな感じになります(今回切削で注文した部品以外が結構ありますが)。
機関部とバレルはマルイの電動ガンボーイズシリーズのM4A1(http://www.tokyo-marui.co.jp/products/electric/boys/43)の中身を使っています。
マルイの電動ガンに限らず大体の電動ガンは、外形パーツと機関部に分かれています。外形パーツは商品の種類によって変わりますが、内部の機関部はシリーズで共通になっています。この中身を取り出して今回は使用する予定です。


2016年10月23日日曜日

Widthが0のポリゴンを作ってはいけない(Eagle Board)

Eagleを使って基板を使っていたのですが、最後のCAM(ガーバーデータを出力)する段階で、普段は数秒もかからないのに、ものすごく時間がかかるという現象が起きました。
下の写真のようにポリゴンが……という警告が出たのですがYesを押した後、下のようなダイアログが出た後に、一向に処理が進みません。Top Silkだけの処理で2時間置いてやっと10%進んだので20時間かかるみたいです。

さすがにおかしいと思い原因を調べたらwidthが0のポリゴンがいけないみたいです。widthが0のポリゴンを作ったら、ただの小さい正方形でも追加した瞬間に時間がかかるようになりました。
widthを保険をとって2.0にしたら一瞬で終わるようになりました。0はだめみたいです。
なおいつもベタグランドをポリゴンで作っているのですが、こちらはデザインルールの影響を受けるからなのか、Isolateの設定をするからなのか問題は無いようです。

2016年9月23日金曜日

C言語(C++)の演算子の優先順位の話

トラブったのでメモ
 
C++でVector3という3次元ベクトルのクラスを作り演算子「+」をベクトルの足し算に、「*」をベクトルの内積に、「^」をベクトルの外積としてオーバーロードしました。そして以下のように実行しました。
 =======code start=======
Vector3 a, b, c;
float s;
//a, b, sへの値の代入
c=a*s+a^b;
=======code end=========
 このときもちろん c=(a*s)+(a^b) と実行することを期待していたのですが実際は c=((a*s)+a)^b と実行されました。

C言語の演算子の優先順位

演算子の優先順位はCもC++の一緒です。ここに良くまとまっているので、見やすいです。大まかに示すと
優先度高
・添え字系
・単項演算子系
・積算系
・加算系
・シフト
・条件演算子
・ビット演算子
・論理演算子
優先度低
となっています。
演算子はオーバーロードしても演算子の優先順位は変わりません。今回使った3つの演算子の優先順位は 積算(*) > 加算(+) > ビット反転(^) だったのに割り当てた機能を元に 内積(*) = 外積(^) > 加算(+) と勘違いしたことが原因でした。
これに懲りて外積は剰余(%)に割り当てることにします。

2016年9月18日日曜日

足先加重センサーについて

現在使っているロボットでは足先に加重センサーを入れています。最終的には足先の加重を見ることで平地以外の、でこぼこした道や、柔らかい地面の上も安定して歩けるようにしたいと思っています。一応見たところ誤差100gぐらいで精度良く足先の加重が読めているみたいです。

電気部

センサーの本体は秋月で売っている圧力センサーであるFSR400です。これは電気的には可変抵抗として見えて無負荷で抵抗が無限大、圧力がかかるごとに抵抗が下がっていくとデータシートに書いています。以下にデータシートから切り抜いたグラフを示しますが、抵抗は大体圧力と反比例するみたいです(グラフの軸は両対数)。
真ん中の測定回路は単純ですが出力が線形にならないのがちょっといやです。そこで以下のような回路を組みます。
良く見るとただの非反転増幅器です。ただゲインを決める抵抗のうち分母に来る側の抵抗にFSR400が、また増幅される電圧が一定になっているだけです。0.56*1+(4.7k/(FSR400の抵抗))[V]が出力されるはずです。

機械部

設計図の一部を下に示します。13番がFSR400です(丸の上側の数字が部品の番号です)。足先(17番)に加重がかかると15番の分がFSR400に接触して圧力を加えます。図では見えませんが15番と17番の間にはばねが入ってサスペンションの役割を果たします。
 評価
足先にかかった荷重とセンサーの出力値の関係を以下のグラフに示します。今回作るのは6脚歩行ロボットなので上記の足部分は6つあります。今回はそのうちの3つを計測しました。
系統1と2でずれがありましたが、系統3では15番の部品の表面が粗くスムーズに動いていない分が差になっているような気がします。おおむね精度良く値を取得できる気がします。


回路の設計では上記のグラフは線形になるはずでしたがうまくいきませんでした。一応エクセルの近似曲線を出したところ2次できれいに近似できました。2kgより上は加えたのですが値が変わらないので、これがセンサーの限界みたいです。

2016年9月15日木曜日

ドキュメントジェネレーターDoxygenの導入

Doxygenはソースコードに一定の書式でコメントを書いておくと、そこからソースコードのドキュメントを自動で生成してくれるソフトです。今回はPythonへの適用の方法を書いていきます。Linux/Debianで使用します。

1.インストール

$apt-get install doxygen doxygen-gui graphviz

2.GUIで設定

$doxywizard
でGUIでの設定画面が開きます。まずStep1というところにソースファイルのあるディレクトリを指定します。
設定すべき項目は「Wizard」の「Mode」ではOptimize for Java or C# (for Pythonという物はなく、これを選ぶのが良いらしい)

「Output」ではHTMLのみにチェックを付けて、ラジオボタンはwith navigation panelにします。

あとは「Run」のタブでRun Doxygenを選ぶだけでHTMLというディレクトリが生成されてそのならのIndex.htmlを開くと生成されたドキュメントが読めます。

メニューバーの「Setting」からUse current setting for startupを選ぶと現在の設定がデフォルトに登録されます。

3.書き方

以下のようなファイルを変換すると

## @package pyexample
#  Documentation for this module.

## Documentation for a function.
def func():
    pass

## Documentation for a class.
class PyClass:

    ## The constructor.
    def __init__(self):
        self._memVar = 0;

    ## Documentation for a method.
    #  @param self The object pointer.
    #  @return 0 fixed
    def PyMethod(self):
        return 0

    ## A class variable.
    classVar = 0;
 

下記のようになります(全部写っていないのですが雰囲気だけ)。

pythonのは#から先がコメントになります。doxygenで使うテキストはコメント部分に書きます。
ただし最初の行だけは##から始める必要があります。
例えばクラスの説明をしたい場合にはクラスの宣言の直前に書くとその部分がクラスの説明とみなされます。また@から始まる特別なコマンドがあります。DoxygenのWebサイトに一覧がありますが主なものを乗せておきます。
  • @package
    パッケージの情報を記述します。
  • @date
    日付の情報を記述します
  • @version
    バージョン情報を記述します。
  • @code~@endcode
    コードを記述します。この領域では改行の省略などがされなく、書いたものがそのまま表示されます。@codeではじめて、必ず@endcodeで閉じる必要があります。
  • @param
    関数の説明文でパラメーターの説明を記述します。@param [変数名] [説明]と書きます。
  • @return
    関数の説明文で返り値の説明を記述します。








2016年9月13日火曜日

githubの使い方

メモ代わりに書いていきます。

  • githubにアカウント開設
    学生なら初期プラン無料(=-7$)のサービスがある
    アカウント(!=メールアドレス)とパスワードはターミナルでの操作で必要になるので注意
  • リポジトリの作成
    作成したいディレクトリに移動
    $git init
  • ファイルの登録("."でディレクトリの全部のファイルを登録)
    $git add .
  • コミット
    ("."でディレクトリの全部のファイルを登録)
    $git commit .
  • コミット(addの省略)
    commitはaddしたもの(=staged)しか行われなく、commitするたびにuncommit(=stagedでない)に変わる。毎回addする必要がある。-aで追跡対象ファイルをaddしてからcommitする。
    $git commit -a
  • リポジトリの登録を登録
    これをやると下記のpull pushが楽になる
    リポジトリ $git remote add origin  https://github.com/○○○/□□□.git
  • プル
    $git pull origin master
  • プッシュ
    $git push origin master

注意点

  • リポジトリ != ディレクトリ
    リポジトリはファイルの変更を記録するファイルみたいなもの、ディレクトリにリポジトリを追加(init)してもディレクトリの中身はリポジトリに追加されません(addが必要)
  • リモートとローカルの違い
    普段変更する(= commit)するのがローカルリポジトリ。ネットワーク上に合ってたまに変更する(= push)のがリモートリポジトリ
  • リモートリポジトリに初回のpushする前にpullしないといけない
  • pushする前にcommitしないと駄目
  • pullする前にもcommitしないと駄目