2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

カテゴリー

ブログパーツ

無料ブログはココログ

« 2013年2月 | トップページ | 2013年4月 »

2013年3月

2013年3月29日 (金)

STM32F4のAD変換トラブル(その2)

ロボット作ろう:STM32F4編

ちょっと昔になりますが、STM32F4のAD変換のトラブルについて投稿したことがあります。AD変換の読み出し値が極端に大きくなってしまうというもので、この時は初期化のシーケンスをいじって直したようなつもりになっていました。

しかし、これはおかしな状態になる確率が下がるだけで、抜本的な解決になっていたわけではありませんでした。このへんできちんとしておかないと具合の悪いことになります。

異常時のADの読み出し値を調べたところ、正常な値の16倍になっていることがわかりました。STM32F4では12bitの変換結果を16bitデータとして読み込みます。これを右詰で出力するよう設定しているのがうまくいかずに左詰(12bitなのでちょうど16倍になる)になるときがあるようです。うまくいくときもある訳ですから、リセットに問題があるのは間違いないようです。

いろいろとサンプルコードをしらべるとADCの設定前にADC_DeInit()という関数を呼んでいるようです。これはADCの設定をリセット状態に戻す関数だそうです。ためしにコレをいれてみました。ADの設定はこんなふうになります。

//ADC3の基本設定
//
ADC_DeInit(); //いままではこれがなかった
//
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);

//ADC3の変換モード設定。入力2本をスキャン変換モードで逐次変換
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //スキャン変換モードに
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 2; //入力を2本(チャネルを増やしたらここを変える)
ADC_Init(ADC3, &ADC_InitStructure);

テストプログラムはこの投稿のものです。

現在のところこれでうまくいっています。本来ならリセットするだけで問題ないはずなんですが、いったいどうしたわけでしょう。デバイスのバグなんでしょうか?

2013年3月23日 (土)

新しいカテゴリーです

ABCは知ってても:プロローグ

新しいカテゴリーを始めます。このカテゴリーでは、「言葉」を使って人間とコミュニケーションをとるロボットについて投稿していきます。

ロボット作ろう」のカテゴリーでは、知能ロボット"Shakey"の模型を作りながら、移動ロボットの原理をおさらいしてきました。当初の目標は完全には達成できていませんが、移動ロボットの基礎である、オドメトリやマップの作成といったところはモノになったと思います。あくまでも「模型」レベルではありますが。
ROSに手を出したことでもありますし、シェーキーはこれからもぼつぼつ進めていくつもりです。

シェーキーの人工知能のプランの中に「チャットウィンドウでの対話」というのがありますが、コレから生まれたのがこのカテゴリー「ABCは知ってても」です。

シェーキーの計画では「窓側に行って猫を探せ」というような命令を文章で入力すると、人工知能がそれをロボットの行動計画に翻訳し実行するようにしたいと思っていました。相当な難題です。シェーキーの作業の進行状況では、いつまでたっても取っ掛かれなさそうにないので、独立したプロジェクト(大げさですが)にしてしまおうという訳です。

このプロジェクトでは機械と人間が言語を使ってコミュニケートする技術を扱います。これはなかなかの難題であり、コンピュータ黎明期から連綿と続く研究テーマの一つです。1959年刊行のソ連の科学啓蒙書「電子頭脳の時代」にも、翻訳機や文章の自動作成、はては電子計算機による作詩の試みまでが、かなりのページをさいて紹介されています。
Dscn2547


頂点に「チューリングテスト」を掲げるこの難しいテーマに、アマチュアレベルで挑戦しようという訳ですから、どんな展開になりますことやら。
もちろんこのカテゴリーのタイトルは、トモエのそろばんではなくてアレからいただいてます。

2013年3月22日 (金)

turtlesim_nodeをいろいろやってみる

ROSさんお手やわらかに:ROS入門編

前回のtgdemoを手直しして、サービスの呼び出し、サブスクライブ(引用)によるタートル座標の取得を追加した。

プログラムは↓
「tgdemo.py」をダウンロード

実行結果はこんな風になる。
Tgdemo

tgdemo.pyを実行すると、シミュレータをリセットし、各頂点の座標を表示しながらタートルグラフィックスを描く。ここまでくると本格的なプログラムを作れそうな気になってくる。

UTF-8を指定してコメントを日本語で入れているが、これはどうしたものか。ROSだから英語のほうがいいんだろうか? ちょっと悩ましい。昔、メインフレームのアセンブラでマイコンのクロス開発をしていたときには、ワープロ以前なものでアルファベットしか使えなかった。そんなわけで妙な英語でコメントを入れていたが、そうした方がいいのかな。でも英語だと「万一この変数が0だったら困るので+1しておく」なんてニュアンスのあるコメントが僕の英語のセンスだと書きにくい。もっとも「リーダブルコード」によると、そもそもそんなコメントがダメだけど…

次はroombaを動かしてみるつもり。


2013年3月 8日 (金)

【昔語り3】信越電機商会の頃

アキバ昔語り

今回の昔語りはこのユニバーサル基板から始まります。

Dscn2541

この基板は70年代半ばに発売されました。ベーク製で18Pのカードエッジつき、片面フラックス仕上げのデジタルIC用です。他社の同様の基板が千円以上していたのに対し、300円程度だったと記憶しています。内容から見てアマチュア向けの商品という感じですね。

これを販売していたのがアキバの「信越電機商会」というジャンク屋です。基板のパターン面に"SHINETHU DENKISYOKAI"と誇らしげに店名が入っているのがお分かりになるかと思います。いわゆるショップオリジナル商品のはしりといえるでしょう。
この店は70年代のCQ誌やトラ技に広告を出していたので覚えのある方も多いでしょう。その中から時代を感じさせるモノを紹介します。まずはこれです。

Scr

今なら「万博使用」という一言で即買いですね。この広告は1972年5月のCQ誌に掲載されていました。これにはもう一つ面白いものが載っています。

Monled_2

マッチ棒のような形の発光ダイオードです。当時、発光ダイオードは主にセグメント数字表示器(当時はモザイク表示器と呼んでいました)として電卓などに用いられ、トラ技のようなプロ向けの専門誌ではすでにポピュラーな部品でしたが、CQなどのホビー誌ではほとんど見かけないモノでした。

当時中学生だった僕は、原理も使い道もわかりませんでしたが、「光るダイオード」という新しさにつられて一つだけ買ってきました。初めて手に取った発光ダイオードは、広告のイラストで想像していた以上にちっぽけで、こんなに小さいランプ何に使うんだと思ったものです。
電池をつないでみると、乳白色の頭がポッと赤く光りました。ややオレンジがかった赤い光は、色付き電球でもネオン管でもない、初めて目にする赤色でした。「原子の灯」ならぬ「電子の灯」にとても感動したのでしょう、いまでもそのときの赤い光をありありと思い出すことが出来ます。

信越電機商会が他のジャンク屋と違っていたのは、商品の独自性と「データ付き」販売です。当時のジャンク屋の定番と言えば、ラジオやアンプの基板や一般的なラジオ部品の放出品でしたが、この店は最先端のアウトレット部品をデータ付きで販売していました。広告にデータを載せただけでなく、メーカーのデータシートからの抜粋をトーシャファクスで印刷したと思われる、ペラ一枚の「データ」を店頭で付けてくれるのです。当時のアマチュアにはメーカーのデータシートは入手困難、専門誌の記事が唯一の情報源でしたので、これはとてもアリガタイことでした。

この後、信越電機商会はさらにユニークな商品を投入してくるのですが、それはまた別の機会に。

今回の元ネタ、1972年5月の広告のダウンロードはこちらから。
「shin197205.jpg」をダウンロード

2013年3月 3日 (日)

PIC24FでI2C接続サーボドライバを試してみる

花岡ちゃんのウィークエンド

今回はI2C接続のサーボドライバーを試して見ます。モノはこれでPCA9685というLED用PWMドライバのブレイクアウトボードです。これも簡単にいくはずがハテナということがあったので投稿しておきます。

このデバイスは16chのPWMジェネレータ内蔵、それぞれ分解能は12bitです。これを周波数61Hz、ステップ4usでサーボ信号を作るように設定するだけです。前出の基板はサーボやI2C接続用のピンヘッダとサーボ電源のターミナルをハンダ付けするだけで完成します。もともとPCA9685は外付け部品がほとんど必要ありません。以前このような機能をもったI2Cのインターフェイスを試作しましたが、それよりも多チャンネルで手軽です。

7bitのI2Cアドレスの下位6ビットは、基板の半田ジャンパでセットできます。最上位ビットは1固定なので、設定できるアドレスは0x40(ヘッダバイトでは1000000X)から0x7F(同じく1111111X)までです。電光掲示板のドライバなどに多数使われることを想定して、かなり広い設定範囲を持っています。さらに、拡張アドレスを持っているようで、大規模なシステムにも対応しているようです。
ただし、0x03(設定範囲外ですがマニュアルはこうなってます)はソフトリセットに、0x70はAll Call(ブロードキャスト)アドレスに予約済みなので使用できません。この実験では全てのジャンパをオープンのままにしました。I2Cアドレスは0x40になります。

この基板を、以前から実験に使っているPIC24FのブレットボードのSDA,SCL,GND,VCCに接続します。
Dscn2538

ソフトは以前の投稿と同じようにシリアルでコマンドをやり取りするようにしました。回路も同様です。EEPROMは使っていないので実装の必要はありません。このプロジェクトには今までのデバイスのドライバ+PCA9685のドライバが入ってます。また、UART1のハンドラを修正してバックスペースでコマンドの修正が出来るようになっています。
「pic24f_test_5.zip」をダウンロード

ターミナルを接続して起動、プロンプトが表示されたら下記のコマンドを打ち込みます。
move サーボID(0~15) パルス幅(us)
例えば、"move 0 1200"とするとサーボ0の制御パルスの幅を1200usにします。

サーボをつなぐ前にオシロで波形を確認します。ここで問題発生です。データシートの計算式で設定した周波数やパルス幅がその通りになりません。一割くらいずれています。

調べたところこのような事情でした。内蔵クロック発振器の周波数がデバイスごとにかなりばらつくようです。最近のマイコンの内蔵クロックの誤差はせいぜい数パーセントですが、このデバイスではずっと大きいようです。もともとLEDの輝度調整用ですから、PWMのデューティさえ正確なら、周波数はそれほど重要ではありません。データシートには内蔵クロックの確度の記載すらありません。
リンク先の三番目の投稿のように、初期化時にPWMの周波数を測定し自動で合わせ込むことも出来そうですが、計測用に入力ポートが一つ必要ですし、本質的な対処法ではないのでスッキリしません。このデバイスはクロックの外部入力も出来るので、一番いいのは水晶モジュールを外付けすることですが、この基板にはその機能がありません。外部クロック入力はGNDに接続され、切り離しジャンパも引き出し用の半田パッドもありません。パターンをカットして0.65ピッチの足に引き出し線をハンダ付けするのはちょっとした神業です。外部クロックを使うならDigKeyでデバイスだけ買って自作したほうがいいでしょう。

そういうわけで、オシロで測定しながらプリスケーラのパラメータを調整、61Hzに合わせました。ソフトを起動するとパルス幅を1500usに初期化するので、オシロの無い方は、サーボをつないでニュートラルになるようmain.c、486行の"108"を調整すればよいでしょう。
測定しながらドライヤーで加熱してみましたが、温度に対しては安定でした。つまり、一度合わせ込めば実用上は問題なさそうです。

この設定では4us刻みでパルス幅を設定(moveコマンドで指定したパルス幅はこの単位に丸められる)できます。ヒューマノイドロボットのように微妙な制御が必要なものには少々苦しいかもしれませんが、カムやクランク代わりにサーボを使う分には十分です。

サーボ用の電源ターミナルにはエネループ4本を入れた電池ボックスを接続しました。サーボが暴走したときの為に、スイッチ付きの電池ボックスのほうがいいでしょう。

Dscn2537


2013年3月 2日 (土)

turtlesim_nodeを自作ノードで動かしてみる

ROSさんお手やわらかに:ROS入門編

発行(パブリッシュ)のコードの書き方が解ったので、とにかく何か書いてみる。サンプルコードをもとにタートルシミュレータを動かし「タートルグラフィック」を描くノードtgdemo.pyを書いた。

Tgdemo_code

一定角度旋回→一定距離前進を繰り返し、亀の軌跡で幾何学図形を描く。結果はこんな感じ。

Tgdemoresult

実行方法は
1・ターミナルを開いてroscoreを実行
2・新たなターミナルを開いてrosrun turlesim turtlesim_nodeを実行
3・新たなターミナルを開いてrosrun beginnerutorials tgdemo.pyを実行
ターミナルを開くごとにsource myros(ROSの環境設定)をおこなう。

« 2013年2月 | トップページ | 2013年4月 »