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しないと駄目

2016年8月7日日曜日

mbed rtosの注意点

rtosの副作用

mbed rtos (mbed os じゃないよ)は非常に強力なライブラリなのですが、mbedの根本的なところに作用するらしく、副作用が結構あるのでその注意点を書いておきます。(前の記事と一部かぶってますが)
  • rtosライブラリはライブラリをimportするだけで作用が始まる。
    includeしなくてもライブラリをimportするだけで下に書く副作用が起こります。これは結構はまるので注意
  • Serialとの併用は不可
    シリアル通信を行うライブラリであるSerialは内部でFIFO(stream)を使っているのですがそれがrtosと相性が悪いみたいです。変わりにRawSerialを使いましょう。いくつかの注意点がありますが、大体Serialと同じように使えます。
  • main関数が始まる前に threadをはじめてはいけない
    公式のどこにも書いていなくて僕がだいぶ悩まされた現象です。たとえば自作のC++ライブラリのクラスのコンストラクタでthreadを開始するようなコードを書き、main.cのグローバル領域でそのクラスを宣言したとします。その場合main関数が始まる(rtosを使った場合mainもthread扱いになります)前に自作クラスのthreadが始まることになります。
    この動作を行うとプログラムがフリーズします。どういう原理かは知りませんが。

SerialとRawSerialの違い

rtosとSerialの相性が悪いからRawSerialを使えと公式リファレンスに書いてありますが、RawSerialがどのようなものかのリファレンスが皆無なのでここで説明します。
  • 基本的にはSerialと同じ
    初期化はSerial name(tx, rx)でbaud()やformat()もSerialと同じように動きます。また割り込み関連も同じように動きます。
  • write()とread()は実装されていない
    上記の2つが実装されていないので、複数バイトの操作は1バイトずつの書き込み、読み込み関数であるputc()、getc()を複数回呼び出すという方法で実装します。ただし送信に関してはprintfは実装されているのでそれで代用できます。
  • バッファーは16バイト(LPC1768の場合)
    Serialではソフト的にバッファリングされているのでそこそこの大きさのバッファーが効いていますが(具体的に何バイトか知らない)RawSerialではソフトウェアバッファーは無く、ハードウェアバッファーのみです。LPC1768は送信受信共に16バイトあります。
    送信ではprintf()やputc()で16バイトよりも多く送信した場合、各API中で16バイトの送信が終了するまで待ってそれから残りのデータを送信します。つまりprintf()は16バイト以下の送信の場合は一瞬で実行が終わりますが17バイト以上の送信になる場合は16バイトの送信を待つウェイトが入るので一気に時間がかかります。
    受信は単純でバッファーに16バイトたまった後に新しくデータが来た場合は破棄されます。

Class内で自分のクラスメソッドを割り込み、スレッドに登録する方法

こんな面倒なことするかと思いますが、これができるとクラスを宣言するだけで裏でIO周りの処理を自動でやってくれるというクラスが作れるので地味に便利です。説明するよりもコードを乗せるほうが簡単なので相します。コメントで説明を書きます。
Class MyClass{
public:
    Myclass(PinName tx_pin, PinName rx_pin):com(tx_pin, rx_pin){
    }
    init(){
        com.attach(this, &MyClass::mythread, Serial::TxIrq);
        threadp = new Thread(&MyClass::mythread,this);
   
    }
    static void mythread(void const *argument){
        SRSLink*instance = (SRSLink*)argument;
        instance->com.write(0x00);
        /*処理*/
    }
    myisr(){
        /*処理*/
    }
    RawSerial com;
    Thread *threadp;
   
}

ビジーウェイトの扱い

以下のようなプログラムを実行した場合を考えます。

void thread1(void const *args) {
    LED1!=LED1;
    Thread::wait(100);
}
main(){
    Thread thread(thread1);


    while(true){
        LED0=!LED0:
        wait(100);
    }
}
thread1は0.1秒(=100ms)ごとにLED1をトグルさせるコードに見えます。一方main関数のほうも0.1秒ごとにLED0をトグルさせるみたいですが、このコードは良いのでしょうか。mainのwait(100)がThread::wait(100)ならRTOSの入門にありそうなコードですね。
Thread::waitはそのスレッドをInActiveにして他のスレッドに制御を渡し、時間が来たらRTOSから通知を受けて処理を再開する関数です。一方waitは処理を他に渡さずにwaitをするビジーウェイトです。
上記の説明を鵜呑みにするとLED0のトグルだけが起こって、LED1のトグルは起こらないように思えますが、実際はLED0とLED1ともにトグルが起こります。これはビジーウェイトしているmain関数を一定時間おきにRTOS本体が割り込みをかけて中断させ他の処理を行っているからです。
mbed rtosで動かしたところ5ms程度おきに強制的にこの処理が行われていました。
今回はthread1は100msと長いウェイトだったので影響は無いですが、これが1msのwaitだったり、シグナル起動だったりすると実行タイミングが思ったようにいきません。rtosを使うプログラムでは、ビジーウェイトを入れないようにしましょう。

Maker Faire Tokyo 2016 に行ってきました。

久しぶりのビックサイト 最後に来たのは何年前かな。もともと行きたいとは思っていましたが、出展応募して外れたところ招待券が送られてきたので行きました。臨海地域はりんかい線かゆりかもめが必要なので微妙に交通費がかかるんだよな。
色々と面白い作品やネットで見たことがあるという作品を直に見れたので満足。良く使っている会社が大体出展していた(しかも友達が働いていた……)。
個人的に気に入った作品を紹介します。1つ目は飛ぶお金ちょっと写真がぼやけていますが、お札が羽ばたきます。シュールだね。
 もうひとつはロボットプロレス。形としてはRoboOneのロボットのようなものです。右側のロボットは良いつくりをしていて。手のつめをうまく使い相手を掬い上げることができて、その動きは豪快でした。
 そのうち自分も出展したいな。

2016年6月19日日曜日

6脚歩行ロボット改良型 3脚でのテスト

3年前に6脚歩行ロボットを作り歩行まで出来たのですが、つくりやシステムが雑だったためにそれ以上の開発は無理と考えて、作り直しをしていました。今回作業が進み3脚でのテストが成功したので記します。
脚部ユニットは 前にこのブログに載せた物です。これを3つ使って立ち、本体を平行移動させています。次は歩行だ。

動画も入れます。1つ目がx、y、z軸での平行移動。PCのスライダーで10f/sで入力して線形補完をしてで動作しています。2つ目はz軸の移動で2f/sで入力で台形加速をしています。
PCとの通信レートは低いのですが、コントローラー側で1kf/sで補完しているので結構滑らかに動きます。


2016年6月18日土曜日

pyserial on linuxでのbaurateのバグ

Linux上でpythonを使ってシリアル通信をしていたのですが、ボーレートの設定についてはまったので書いておきます。
pyserialでシリアル通信を設定するとき

self.ser = serial.Serial()
self.ser.port="/dev/ttyUSB0"
self.ser.boudrate=1000000
self.ser.open()

とかけますが、open()にバグがあり、ボーレートが9600の固定になります。

self.ser = serial.Serial("/dev/ttyUSB0", 1000000)



と書くとボーレートを変更することが出来ます。
またシリアルターミナルとしてscreenというコマンドがあるのですが、こいつは古典的な標準ボーレート(9600、115200とか)しか対応していません。コンソールは開きますがボーレートは9600になります。
これで2日間無駄にした。

2016年5月28日土曜日

自作mbed新型

汎用の自作mbedの新型が出来たので紹介します。写真左が旧型、右が新型です。旧型は幅1100milで作っていたのですが、これだとブレッドボードには刺せるのですが、ジャンパーがさせないので意味は無く、900milで作り直しました。
ほとんど青mbedと同じサイズです。
回路図はこちら

青mbedとの違いは、interfaceICが無くなって(よって6pinのシリアルで書き込み)、ボタンがリセット以外に4つ、LEDが8つ、USBとEthernetのピンが無くなって、CAN(トランシーバーは内蔵)x2、シリアルx4、SPI、IIC、アナログ入力x6、GPIOx12というIOマシマシの構成になっています。

2016年5月27日金曜日

自作mbed用USB書き込み器

自作mbedを書き込むのに秋月のUSBシリアル変換ケーブルとユニバーサル基板で作った変換基板を通して書き込んでいたのですが、良く使うので基板から起こしてみました。
上の基板がFT231Xを使ったUSBシリアル変換基板で下がADuM1401を使ったアイソレーターです。事故が起きたときにPCが壊れないように電源を分離しています。

USBシリアル変換

アイソレーター

5ピン、6ピンにRTS、DTRをつなげているために書き込み時に自動でブートモードに入ります。

レッグコントローラーが完成

今回作っている6足歩行ロボットですが、この足には結構色々な機能が付いています。挙げると
  • サーボモーター(KRS4031)x3のコントロール
  • ファンのコントロール
  • 足先の荷重センサの読み取り
  • フルカラーLEDの点灯
  • 本体とのCAN通信
6足あるので、全体としてはこれの6倍の量のタスクがあるのですが、これを1つのマイコンでやろうとするとおそらく性能をオーバーします。そこで各足にマイコンボードを付けてそれでその足の分の処理をしています。
前にあげた足の動作テストの動画では足の内側に緑色の基板が着いていたはずですが、それの実装が完了して動作テストが終わったのでここに載せておきます。
上の2ピンコネクタがファン、6ピンコネクタが足先のセンサ・LED、3ピンのコネクタはサーボモーターで4ピンが本体とのCAN通信です。何も刺さっていないコネクタは書き込み用です。

2016年5月26日木曜日

pyserialのRTS、DTR

pythonから自作mbedにデータを送ろうとしたのですが、プログラムのダウンロード用のケーブルと共用しているためにえらい目にあいました。
ダウンロード用のケーブルは6ピンで
1:電源(12Vか5V)
2:GND
3:TxD
4:RxD
5:RTS(ISPモードセレクト:P2_10に接続)
6:DTR(Resetに接続)
となっているためにRTS、DTRが暴れると、通信時にリセットがかかりどうしようもありません。

pyserialのマニュアルだと初期設定では両方とも無効になっているので(rtscts==False、dsrdtr==False)問題ないと思ったのですが、どうもうまく行きません。結論から言うとこの
  • 2つのパラメーターは少なくともrtsctsは初期設定でTrueになっています。
  • open()時に無効に設定していても内部処理の都合なのか一旦有効になってからすぐに無効になります。
  • ser.rts=FalseでrtsはHiに、ser.rts=TrueでrtsはLoになります(負論理)。
 マニュアルが間違えているみたいです。

サンプルコード

ser = serial.Serial()
ser.port="/dev/ttyUSB0"
ser.boudrate=9600
ser.open()

ser.rtscts=False
ser.dsrdtr=False
ser.rts=False
ser.dtr=False

#ser.write("data")      # 出力

2016年5月10日火曜日

USBシリアル変換と絶縁ユニット

FTDI231Xを使ったUSBシリアル変換基板を作りました。これでLPCマイコンの書き込みがコンパクトになりました。5V、GND、TXD、RXD、RTS、DTRを引き出しているので自動ブートが可能です。lpc21ispで書き込む場合、自動でブートモードに入るので書き込みボタンを押すだけで書き込めます。
ケーブルの途中にある謎の基板はADuM1403を使った絶縁回路です。フォトカプラでは10kHzがせいぜいですが、これなら1MHz程度の信号でもやすやすと伝達できます。この絶縁回路越しでも書き込みは可能です。
本来PCの電源は絶縁されていますが、なんとなく怖いのでつけました。

2016年5月6日金曜日

ユニットレッグ動作テスト

3年前ぐらいに6足歩行ロボットを製作して実際に歩かせるところまでは出来たのですが、だいぶ雑に作ったために改良などもこれ以上は出来なくそのままお蔵入りの状態でした。

そこで今回は改良を施して汎用性の高い6足歩行ロボットを完成させていくつもりです。

電気系での問題点
  • 接触不良が多くまともに動かない
    →今回は使う基板は全てプリント基板に起こして使用
  • マイコンの開発に時間がかかる
    →mbedとmbed rtosを使い開発速度の向上
  • 通信がバイナリ形式でややこしく拡張性が低い
    →シリアル通信ではSRScodeとして通信形式を決め通信の共通化を進める。またバス接続はCANを共通で使う。
機械系での問題点
  • フレームの製作に時間がかかる
    →外注することで高速化
  • 途中での設計変更が多いためにフレームの作り直しが多い
    →重量増加・内部スペースの減少と引き換えだが、ユニットごとに分けれるようにして接続部の寸法を決定。ユニットごとに開発を進める。
このような方針の上、足ユニットが完成して動作確認が出来たので掲載します。
サーボモーターはKRS4031を使っています。これはシリアル通信で目標角度を送るとそこに移動するというものなのですが、このまま使うと「ロボット的な」カクカクした動作になります。今回はマイコンから動きが滑らかな2次関数の形になるようにしています。いわゆる台形加速ってやつです。

2016年5月4日水曜日

ドットマトリクス&オルゴールのテスト

DCardの表示部と音源部のテストが出来たので公開します。
表示部は横30x縦7のLEDのドットマトリクス。210個のLEDを手半田するのはつかれた。実装を注文したい。
Hello World!という文字が流れます。
続いて音源部、アンプはTPA2001D1、でスピーカーは表面実装でUM1515
まあオルゴールぐらいかなという感じの音、そんなにはよくないけど仕方ない。
 このスピーカーが曲者でデータシートでは700Hz~しか鳴らなく、また共振周波数は20kHzと特性のグラフにはあるが、実際に使うと700Hz付近でも共鳴を起こす。しかも状況によっては1.1kHzぐらいでも起こす。もともとスピーカーではなくブザー用なのかで仕方が無いのかな。

2016年4月30日土曜日

SOPのピン列の幅のバリエーション

半導体のパッケージというのは難しいものです。DIPは問題はないのですが、各社が独自の寸法で出していたり、同じ形なのに会社によって名前が違ったりします。ピンピッチが1.27mm(50mil)で両側にリードピンが出ているSOPパッケージ(SOICとも呼ぶ)ですが、これのピン列とピン列の幅が会社によってバリエーションがあります。EAGLEのライブラリを作るときに出来るだけパッケージは統一したかったのでこの機会に調べることにしました。
上の図のように各会社のSOPのAとBの2つの寸法を表にしました。

今まで通常の幅とワイド幅があると思っていたのですが、3種類の幅があるのですね。結局ライブラリとしては
  • 狭い(6.2mm):8、14、16pin
  • 通常(7.8mm):14、16、18、20、24pin
  • 広い(10.4mm):16、18、20、24、28pin
を用意すれば良いようです。

2016年4月23日土曜日

DCard基板動作確認1

DCardの試作基板が届きました。
マイコン、周辺部品、スピーカー、LEDx210コとかつけないといけないのですが、とりあえずマイコンとLEDを一部付けて動作確認をして見ました。

恒例のLチカ
実は基板の一部がUSBコネクタ(っぽいもの)になっています。それのテスト
ちなみに今回の基板の厚さは標準の1.6mmですが、USBにしっかり刺さるためには2.0mm必要です。次回製作分より2.0mm基板にする予定です。

2016年4月14日木曜日

mbed rtosについて

自作mbed+rtosの組み合わせが半端なく便利
いくつか注意点があるので防備録に
・Serialは基本的に使えないものと考える
Serialを使ってそれまで動いていたプログラムも、mbed rtosのライブラリをインポートしただけで(includeを書いていなくても)動かなくなる。RawSerialに書き換える必要がある。
・Mail=Queue+MamolyPoolで基本的にMailを使う
rtosの説明を見るとQueueがいわゆるFIFOの役割をしてくれるように見えますが、こいつはデータのアドレスしか保管してくれず、本体はMemoryPoolでallocする必要があります。
基本的にMailを使いましょう。
Mailのキューにはアドレスが入る関係上、キューの個数x約7Byteのメモリーを使います。あまり大きなキューは使わないようにしましょう。
・waitという名前じゃなくても待つ関数がある。
例えばMailのget関数はMailのキューにデータが来るまで待ちます。waitっぽい名前じゃなくても待機動作をするやつがあるのでリファレンスで確認しましょう。
getは何も無ければスルーする関数かと思った。
・classメンバを割り込みで登録するとき
name.attach(this, &class::func);
・グローバル領域でthreadを作ってはいけない。
新規threadの作成は必ずmain関数(rtos的に言えばmain thread)内で作っていかなければならない。
グローバル領域で作製するとプログラムをクラッシュさせる。

2016年4月10日日曜日

USBコネクタの形状

たまに下の写真のように基板自体がUSBコネクタとして挿入できるボードがあります(写真はCQ出版社のページから)。それを自分も作りたくUSBコネクタの寸法について調べていたのですがなかなか見つかりません。

「USBコネクタ 外形」とかで検索しても出てこなかったのですが単純にUSBの規格書(http://www.usb.org/developers/docs/usb_20.zip)に載っていて、それで解決しました。
概要を言うとコネクタの幅は12mm、奥行きは約12mm
内側の2つの端子の間隔は2mmで、外側の2つは7mm
板の厚さは2.0mm
2.0mmの厚さの基板は発注すると高いが仕方が無い。
詳しくはusb_20.pdfの99ページで

DCardプロジェクト 基板を発注

良いねたが思いついたので Make faire Tokyoに出展することを目標に製作しようと思っています。
基板のデータをEAGLEで作成したのでFusionPCBに注文しました。

内容についてはこれからブログに書いていこうと思います。

2016年4月1日金曜日

自作mbedと使えるLPCマイコン

mbedクローン

最近自分で作った基板でmbedを動かしているのですがそれについていくつか書きます。

最小構成は以下の図のようになります(画像のみで表示すすると詳細まで見えます)。
必要なのは
  • 電源
    回路図では12Vからレギュレーターで取っていますが、3.3Vなら何でもかまいません。ただLPC1768はちょっと繊細なようでパスコンは必須です。
    3.3V側には1uFを入れています。
  • クロック(12MHz)
    mbedのシステム的に12MHzでないと不都合がありそう。他のクロックでも動作や書き込みは可能ですが、多分waitあたりがずれるかと。
  • リセットIC
    やはり繊細なようでプルアップのみでは動かなかった気がする。私は秋月で売っているTCM809Rを使っています。
  • 書き込み用コネクタ
    TX0(P0_2)、RX0(P0_3)がつながっている必要があります。リセット解除時にISPピン(P2_10)がHiがオープンなら通常動作、Loなら書き込みブートローダーが起動します。これらのピンも引き出しておくと便利です。引き出しているなら基板上にこれ2つを操作するスイッチをつける必要はありません。
またmbed上では例えばシリアルポートを設定するときにSerial name(p9, p10);のようにmbedで引き出されているピンしか定義できないように見えますが、拡張したときも考えているのかSerial name(P0_2, P0_3);のようにダイレクトにピンを指定しても使えます。mbedで引き出されていないピンでも使用することが出来ます(参考:https://developer.mbed.org/users/screamer/code/mbed/file/667d61c9177b/PinNames.h)。
ちなみにNCで無接続にできます。

使えるICについて

今回 mbedLPC1768(青mbed) のクローンを作製していますが、LPC1768以外にも使えるICはあります。
1768の代わりに使えるLPC176xファミリを以下に示します。
  • LPC1769 機能は1768と同じだが最高クロック速度が120MHzに高速化(他は100MHz) 
  • LPC1768 標準のもの
  • LPC1767 USBとCANが削られたもの
  • LPC1766 フラッシュメモリが512→256kBに削られたもの
  • LPC1765 フラッシュメモリが512→256kBに削られ、Ethernetが削られたもの
  • LPC1763 フラッシュメモリが512→256kBに削られ、Ethernet、USB、CANが削られたもの
使えないものは
  • LPC1764 SRAMが64→32kBに削られたいるために起動しない。
LPC1764だとプログラムの書き込みは正常に出来るのだが、プログラムが起動しない。
国内だとLPC1768で最安で1000円台です。
Aliexpressという中国の通信販売サイトを使えば1つ600円ほどで買うことが出来ます。
LPC1758という80pin版があるみたいです。データシートを見たところ引き出しているピンが間引かれているだけで中身のチップは同じもののよう。これでも動作するかも。今後動作確認をする予定。

書き込み

書き込みはhttps://developer.mbed.org/users/okini3939/notebook/flash-program/を参考にしました。
ただ手元の環境でやって見たところ自動でRTS、DTRピンを使って自動でブートにかける機能は正常に動きませんでした。別途リセットスイッチが必要みたいです。
後日自作のUSBシリアル変換基板で書き込んだら自動リセット、自動ブートがかかりました。接続を間違えていたのかな?