2016年9月30日金曜日

チェックサムあれこれ

タイトル的にいろんなチェックサムを網羅的に解説してるような感じですが、あれ(GPS)と、これ(XBee)だけです。

XBeeはAPIモードのチェックサムを、GPSはNMEA-0183の最後についてるやつを扱います。

2016年9月28日水曜日

STM32F1のEXTI

STM32F1のEXTI、所謂「ピン変化割り込み」を使う。
ちなみにEXTIは英語版のRM0008によると"External interrupt/event controller"という章で紹介されている。EXTernal Interruptの略と思われ。


EXTIで割り込みを使う手順としては
1. RCCの供給
2. GPIOの初期化
3. GPIOをEXTIに接続
4. EXTIの初期化
5. NVICの初期化
という感じになる。

僕が試した限りでは下記のコードで動作したが、もしかしたらAFIOのRCCを供給しないと動かないかも。

またハンドラ内では1回の割り込み毎にGPIOを反転させている。今回はパルスのソースにGPSのPPSを接続し、立ち上がりエッジのみを検出するので、LEDを0.5Hzで点滅させていることになる。

EXTIの割り込みハンドラは数字が若いうちはEXTI1本毎にハンドラが1個あるが、数字が増えるとEXTI10-15をまとめて1個のハンドラで、みたいな感じになっているので、GetITStatusの確認も省きたい!という超高精度が要求される場合は若いピンを使うこと。
またひとつのラインではひとつのGPIOしか設定できない。例えばGPIOA0とGPIOB0を同時にEXTIに接続することはできない。つまりSTM32F1でピン変化割り込みを使いたい場合、最大で16chまでとなる。

EXTIは割り込み以外にもイベントを発生させることができ、CPUがスリープに入った状態から復帰するトリガに使うこともできる。

他に、GPIO以外にも電源電圧やRTC等をEXTIのソースとして使用することができる。
更に、それ以外にもソフトウェアからEXTIをキックすることもできる。


STM32F1は自分が作りたい機能にカチッとハマると楽しいんだけど、パズルが複雑でフラストレーションが溜まるよね。


2016年9月26日月曜日

TLC5940の触り



とりあえず簡単なところだけ。

*必要なピン
データを与えるSCLK,SIN,XLATが必要。SCLKとSINはSPIのTxで可能。SOUTも接続すればTLC5940のステータスを読むことができる。
クロックを与えるGSCLK,BLANKが必要。GSCLKに4096個のパルスを与えると設定したデータに応じて最初のパルス数の間電流が流れる。
GSCLKのカウンタは自動的には初期化されないらしいので、BLANKでクリアする必要がある。

*ピンの処理
基本的にピンはプルダウン等で固定しておいたほうが良い。例えばマイコンがリセット状態の時はハイインピーダンスとなるので、ちょっとしたノイズで誤動作する場合がある。
誤動作するとLEDが常に点灯になる場合がある。PWMしか使わない前提で電流を多めに流している場合(PWM10%時の電流値等の設定の場合)はLEDが損傷する可能性がある。
SCLKを固定してデータを受け取らないようにすること、GSCLKを固定してパルスが入力されなようにすること、BLANKを固定してハイインピーダンス時は電流を流さないようにすること、等。

*電流の違うLED
フルカラーLEDを駆動したい場合など、電流値が違うLEDを接続する場合は、電流が一番低いLEDに合わせる必要がある。ICは定電流駆動なので、LEDと直列に抵抗を挟んでも損失が増えるだけで電流値が変わることはない。LEDと並列に抵抗を接続して電流を分岐することも不可能ではないが、あまり良いやり方とはいえない。
Dot Correctionを使えば0-63の64段階で電流値を制限することができるので、電流値の設定を最大電流に合わせ、電流値が低いLEDはDCで制限する、ということも可能。ただ何らかの原因でDCが設定される前に電流が流れることもあるかもしれない。なのであんまりそういう方法は使わないほうが良いはず。

*IOレベル
TLC5940のIOレベルはCMOSとなっている。High-level input voltageは0.8Vccが必要。電源が5Vだと4Vが必要となる。つまり3.3Vレベルのマイコンと直結することはできない。
3.3Vのマイコンを直結したい場合はTLC5940も3.3Vで駆動する必要がある。
ただしTLC5940で120mAを流せるのはVcc>3.6Vの時で、Vcc=3.3Vの時は最大60mAまでとなる。それ以上の設定でも動くには動くが、損失が大きくなるため発熱が増える。

* Dot Correction
TLC5940にはDot Correctionという機能があり、1ch毎に6bitの補正値を設定できる(使ったことがないので詳細は不明)。一番最初にEEPROMから読み込むので、DCの初期化は不要。EEPROMの初期値は0x3F(0b111111)となっている。

*その他
LEDを接続したい場合、BLANKは100Hz以上にすること。50Hzでは明らかにちらつきがわかる。
サーボモータの場合は20-50Hzくらいで良いはず。

2016年9月24日土曜日

TLC5940を使いたい

TLC5940を使いたいので、一番面倒そうなパルス出力部分を作ってみることにします。
結論から言うとTIMのPWM出力をちょこちょこ動かすわけですが。

ZEROPLUSのソフトウェア

電子工作では非常に有用なツールとして、ZEROPLUSのロジアナが挙げられます。OWONの最安帯オシロと同価格帯からあり、電子工作で使用している人も多いと思います。

このソフトウェア、v3.12あたりの頃はプロトコル解析が付属しなくなったりしていた気がしますが、最近のv3.13あたりではすべてのプロトコル解析が無料で使用できるようになりました。
また、最新のv3.14ではソフトウェアの一部が日本語化されています。



正直、ずっと英語版を使用していたので日本語だと違和感がありますが、慣れてしまえば楽かな、と思います。ただ全てが翻訳されているわけではなく、プロトコルの設定などは日本語化されていません。プロトコルについてはプラグインとしての実装のようですから、アナライザ本体のグループがいくら頑張ったところで日本語化できるものでもないと思うので、これはしょうがないかなと思います。

今までもUART, SPI, I2C等の電子工作で使用される3大プロトコルは無料でも解析できていましたが、1-WireやCANのような、使う人はいるけどあんまり多くない、という機能を使用するにはシリアルキーが必要でした。最新版では1-WireやCANのみならず、SDIOやFlexRay、はてはMIL-STD-1553の解析も無料でできるようになりました。
ただし、全てが無料で使える、とはいいつつ、使用できないプロトコルも存在します。例えば僕が使っているのは16chモデルですが、Compact Flashの解析には25ch?以上が必要であり、32chモデルが必要となりますが、プロトコル選択画面に表示されています。


最新版のソフトウェアは以下のページからダウンロードできるようです。
http://www.zeroplus.com.tw/logic-analyzer_en/download.php

過去のバージョンは以下のページからダウンロードできます。このページはロジアナのモデルごとに別れているので、左のDownloadをクリックしてSelect Product TypeからProductにLogic Analyzers、SeriesにLAP-C Series、Modelに使用中のモデルを選択します。モデル名はロジアナの後ろに書いてあります。
http://www.zeroplus.com.tw/logic-analyzer_en_ori_20160331/technical_support.php

ZEROPLUSのWebページは昔の感じのページと、最近の感じのページが有り、またスイスのドメインのWebページもあったりと、ちょっと複雑な感じです。おそらく http://www.zeroplus.com.tw が本家というか、ここから落としてくれば問題ないと思いますが。


ということで、今までも有用なツールだったZEROPLUSのロジアナですが、更に有用なツールとして使えるようになってきたと思います。特に日本語化されたことによりこれから使い始めるという人に有利かもしれません。

追記:2017/11/23
 上記リンクがリンク切れになってる。
 とりあえずこっちからどうぞ。
 http://www.zeroplus.com.tw/logic-analyzer_en/technical_support_search.php
 セッションが切れると表示できないっぽいので、なにも表示されない場合は以下手順5の"Downloadのリンクをクリック"から続きを行ってください。


 リンク切れになったときのために。
1) トップページ(http://www.zeroplus.com.tw/zp/)の"Instruments 電子量測儀器"にマウスを重ねて、ENGLISHをクリック。
2) ProductsのマウスオーバーからLogic Analyzerをクリック。
3) てきとーな製品をクリック(LAP-CでもLAP-Fでもなんでもいい)。
4) Softwareをクリック
5) 各ソフトウェアが表示されもすべて無視して、Downloadのリンクをクリック。
6) ProductでLogic Analyzers、SeriesでLAP-C Seriesを選択し、Softwareにチェックを入れてSearchをクリック
7) ガーッと大量にソフトウェアが表示されるので、SerialがLAP-CになってるソフトのWEBをクリックしてダウンロードする

 これでZIPが落ちてくる。
 なお、5と7で、Serialに"LAP-C(32128)"のような、5桁か6桁の数字がカッコに入っているソフトはバージョンが古く、プロトコル解析が使えないので、特段の理由がない限り避けた方がいい(V3.14以降はすべてのプロトコル解析が無料で使えるようになっている)。
 インストールする際の注意点として、V3.14.0は日本語化されているが、V3.14.3をインストールすると日本語が削除されてしまう。
 ロジアナを初めて使うなら日本語のほうがわかりやすいかもしれないが、古くからあるブログ等に書いてある使い方の情報はすべて英語なので、今後も英語版を使ったほうがいいかもしれない。
 V3.14.3ではいくつかのプロトコルが追加され、今後も追加されていくものと思われる。新しいプロトコルを使いたいなら、最新版の英語表示を使うしかない。

 .0ではJapanese.dllがあり、.3を入れると削除されてしまうので、これをコピーすればいいのか、とも思ったけど、そう簡単ではないらしい。Japanese.dllを入れても日本語は選択できない。.1や.2は試してないが、更新履歴を見ても日本語を削除したとは書いてないから、次のアップデートで復活するといいなぁ。

2016年9月20日火曜日

Ankerのモバイルバッテリー

Ankerのモバイルバッテリー、比較的安価かつ高評価、また入手性も良いということで、計画的な購入では比較対象に上がる製品だと思う。もちろん実際にモバイルバッテリーとして使う分には問題ない性能だと思う。

ただこのモバイルバッテリー、消費電力が少ないと「おまえ充電終わってるよね?電気いらないよね?」ってことで給電を停止するらしい。
モバイルバッテリーとしては自分の電力を温存できるし、充電対象が過充電になることを防ぐことが期待できると、いい事ずくめな機能だと思うけど、電子工作を動かすために使おうとするとちょっと問題になる。

消費電力が少ないとき(スマフォ平常動作時程度?)では給電が止まってしまうので、電子工作のような数十mA程度ではシャットダウンされる。
マブチ130クラスを繋げば問題なく供給されるが、Lチカ程度では足りない。
電子工作をやる(予定がある)人は、Ankerのモバイルバッテリーを買う場合はそのあたりを考えておく必要があると思う。


以前使ったことがあるモノとしては、SANYOのモバイルバッテリーは問題なく使用できた。たぶん今はPanasonicが作ってると思う。

これはスライドスイッチが有り、それが電源となっている。なので勝手にモバイルバッテリーが電源を切ることがない。

他のメーカーでも同じように考えられると思うが、スライドスイッチのような、どう頑張っても内蔵されたマイコンが操作できないスイッチを電源に使っているものは勝手に切られることはないと思う。逆にモーメンタリスイッチを電源にしているモバイルバッテリーは要注意ということで。

IIRフィルタ

IIRフィルタの設計仕様で計算できる係数を使ったフィルタをC#で実装してみた。例によって正しいかどうかは不明。
このWebページではIIRとかFIRの計算が簡単にできるのでおもしろい。

private void IIR(ref double[] datas, double k, double b1, double b2, double a0, double a1, double a2)
{
    double z1 = 0, z2 = 0;

    for (int i = 0; i < datas.Length; i++)
    {
        double x = datas[i] * k;

        x += -(
            z1 * b1 +
            z2 * b2);

        datas[i] =
            a0 * x +
            a1 * z1 +
            a2 * z2;

        z2 = z1;
        z1 = x;
    }
}

タップ数を増やす場合はそれぞれのセクションの係数を与えて繰り返し呼べばいい。
とりあえずセクション数8のLPF(1000Hz,250Hz,300Hz0.5dB,35dBで設計)の結果。




青が乱数をフィルタに通してFFTした結果。赤が設計出力画面の振幅特性。
結構似た感じの傾きになってる気がする。縦軸の扱いがよくわからないけど。

上のメソッドではデータを配列として受け取って処理しているので、リアルタイムでの処理はできない。


確かにFIRよりは急峻なフィルタになっている気がするけど、計算コストも結構高そう。加算と乗算だけでイケるFIRと比較しちゃだめなんだろうが、と思ったけど、IIRも加算と乗算だけだよね。かなり複雑な気がするけど。


サンプリングレートは低くていいので、マイコンのソフト浮動小数点でどれくらいのフィルタが作れるか、試してみないと。

2016年9月16日金曜日

かるまんふぃるた



1軸の姿勢(ピッチ)がほしいので試しに加速度とジャイロのカルマンフィルタを構成してみた。
センサ・フュージョン - 備忘録の1行フィルタを使用。

g+aがジャイロと加速度を使用、gがジャイロの積分のグラフ。センサの本当の姿勢がわからないので、どっちがただしいのかわからないけど、gだけだとオフセット誤差が積分される、と考えると確かにg+aのほうが正しい気がする。開始の姿勢と終了の姿勢が一致してるかも不明だけども。

まぁ、今回の用途ではあんまり精度は要求されないので、様子を見ながら試していく予定。


角速度→誤差が積分されるから長期的な精度はダメだよね
加速度→重力以外の加速度が加わると姿勢の計算できないよね
地磁気→外乱受けやすいよね
9軸センサって辛い

2016年9月15日木曜日

マイクロピザ



餃子の皮でピザっぽいヤツ。

1) 本体を作る
  a) 餃子の皮にケチャップを塗る
  b) とけるチーズをのせる
  c) サラミをのせる
  d) ピーマンを乗せる
2) 加熱する
  a) トースターにアルミホイルを敷く
  b) 3分±20%くらい加熱する
    時間はあくまで目安。縁が変色してきたらちょうどいい頃合いだと思う。
3) おいしくいただく
  *) 複数個をゆっくり食べる場合はホットプレートとかで保温したほうが良さそう

少量を作るだけならすごく簡単。

ウチのトースターは0.8kWか1kWかそれくらいだと思う。そんなに時間はかからないが、結構場所を取るので1回に加熱できる数には限度がある。

ケチャップの量は注意すること。ケチャップは結構主張が激しいので塗りすぎるとマズイ。皮全体に若干ケチャップのいろが付く程度に塗ればいい。
とけるチーズは融解するとかなり密度が高まる。適量だと下のケチャップが見えてきて彩がいい。
サラミやピーマンはチーズと彩がいいので載せたほうが良い。

餃子の皮だけど、あんまりパリッとはならない。縁はパリパリというか、ポロポロになるけど、具材のある部分は加熱が遅いとか、水分が逃げないとか、ケチャップの水分が入ってくるとか、そういう感じでパリッとはならない。


ところで、普段何か撮るときはいつもデジイチを使ってるけど、上の写真はiPhone4(+LRで編集)で撮影した。基本的にスマフォのカメラは使う機会が少ないけど、ぱっと見るだけなら充分だね。

2016年9月13日火曜日

はいふりの通信手段(あるいは自分の居場所を知る手段)

深夜のテンションなので軽く流してくださいな


公式設定でどうなってるのかなとぐぐってみるも、特になさそう。
掲示板のまとめとかが多数ヒットするけど「衛星無いのに通信・測位できるのおかしい リアルタイムでマップ表示できるんだし衛星有るんじゃね? でも行方不明艦探すのに苦労してるよね」というのが結構ある。

では、船でどんぱちしてたWWIIはどうしていたでしょうか。当時飛行機はブンブン飛び回ってたけど人工衛星はありません。V2が使われてるくらいです。
WWII終戦が1945年、スプートニク1号が1957年です。通信衛星が飛ぶようになったのは60年台に入ってからです。
通信衛星がなくても(ものすごい)低速であれば地球の裏とでも充分に通信が可能です。


測位に関してもGPSなど不要で、GPSの前にはロランやオメガ等の地上に有る電波局を使って測位が行われていました。
ロランは1000以上の範囲で測位が可能で、精度はかなり高精度なようです。数百mというと地上ではかなりの誤差に感じますが、1000kmで100mは有効数字5桁ですから、10cmにすれば0.01mmの誤差であり、定規を見てみるとわかると思いますが、10cm定規で0.01mmの誤差というのは非常に小さいと感じられると思います。
オメガの方はさらに広範囲をカバーでき、ロランCでは日本近海だと海岸から2000km程度まででしたが、オメガであれば8箇所の地上局で北半球の洋上をほぼカバーできるようです。ただしロランと比べ精度は悪いですが、それでも有効数字4桁以上と、おおよその位置を知るには十分です。

リアルタイムに作戦地図を更新するには誤差2kmでは困りますが、誰がどこにいるかを知るには充分でしょう。戦争が行われていない世界であればロランCやそれを発展させた技術を各国で配備しているかもしれません。


とりあえずここまでのまとめとしては、「測位も通信も衛星なんて要らないよ」という話でした。

しかしこれでは困ります。僕の妄想が根本から崩れ去ります。

ということでなんとかしてロケットを飛ばしましょう。

といっても簡単で、VLA(Vertical Launch Asroc)があるわけですから、ロケットブースターが有るということです。固体燃料が有るのだから、大きなものを作れば充分に衛星を打ち上げることも可能でしょう。ただ1つ問題が有るとすれば、ロケットの発展は国同士の競争の結果という点です。戦争がなければ現在のように宇宙が利用されることも無かったかもしれません。
ただ、それを言ってしまうと「インディペンデンス級があるのはおかしい」で終わってしまいますから、結局戦争の手段は開発され続けた…という方向に逃げようと思います。

衛星があれば疎な洋上の気象も分かりますから、安全運行に必要不可欠な気象観測も行えます。海運が重要な世界ですから、気象技術の発展とともに宇宙開発も進んだと期待しましょう。

戦争がないなら大陸間高速鉄道輸送が発展するんじゃないのというツッコミはガン無視です。いくら1度に1千トンを輸送できる鉄道といえど、1度に数十万トンを輸送できる船にはかなわないということで。


さて、次の問題に移ります。衛星があるならどうして行方不明艦が出てくるんだ、という話です。
Google Earthで適当な港を見てみると分かりますが、船を認識できる解像度まで拡大すると、表示できる範囲はせいぜい20x10kmくらいの範囲になってしまいます。太平洋の面積は165,200,000km^2とのことですから、80万画面以上の面積になります。いくら海運が重要でもFHD液晶80万枚も使って監視することは不可能でしょう。非リアルタイムにしてもせいぜい100分の1くらいにしかならないでしょう。そんなに大量のPCを用意することも、監視する人間を用意することも、とても現実的とは思えません。
画像解析で探すことも不可能ではないでしょうが、FHD画像80万枚分の画像を解析するのにどれだけのリソースが必要かわかりませんが、とてつもない事になると思います。
そもそもそれだけの画像を見れたとして、全球画像を見れば分かる通り、洋上のかなりの部分に雲があり、海面を見るのは非常に困難でしょう。

ということで、まとめとしては「衛星もそんなに万能じゃねぇよ!」という事になります。
アクション映画でよく軍や情報組織が衛星を使って人間1人をトラッキングしてますが、1機数百億の衛星を躊躇なく使うって相当に重要な目標なんでしょう。
エネミーライン2でアメリカが人工衛星を駆使して苦労している時に、他国の人間が写真を1枚持ってきて決定的な情報を与えるシーンが有りましたね。曰く「アメリカは衛星を使った。我々は人間を送った」と。エネミーライン2を見たのは相当に昔なのでうろ覚えですが。そもそもエネミーライン2かどうかも怪しいんですが。


いろいろぐだぐだ言って、結局「衛星要らねぇじゃん」という話になってしまいました。困りました。

とりあえず「戦争がないなら各国が共同でいろんなことをやりやすいよね。じゃぁ知的探究心を満たすためにいろいろやってるんじゃないかな。宇宙に手を伸ばしても良いんじゃない?」あたりでどうでしょうか。


はいふりはかなり好きな作品なので、他のエピソードとかも読みたいです。
はるかぜ乗員がそっくりアーレイ・バーク級に乗りつつ、艦長の幼なじみが海賊をやっていることが判明し、撃ちたくない!でも撃たなきゃ!みたいになって、でも宇宙人が攻めてきて有耶無耶になって最後は共闘する!とかどうでしょうか。ダメか。

2016年9月12日月曜日

STM32F1のI2Cの初期化でハマった

STM32F1のI2Cは昔慣性ロガーを作った時にかなり苦労して嫌な思い出がある(その時は結局ソフトウェアI2Cで逃げた気がする)。

今回、I2Cで叩けるモータードライバを使ってみたくなり、ついでにペリフェラルのI2Cもやり直そうと考えた。

現状としてはwhileでイベントをポーリングして動かすというダメダメな感じだが、なんとかデバイスに値を送信することはできた。

で、タイトルの通り、初期化でかなりハマってしまった。


I2C_Initの後でレジスタをダンプして調べたところ、BUSYフラグが立っていることがわかった。BUSYはハードウェアで書き込まれ、ソフトウェアから書き込むことはできない。バス上で通信が行われている場合はビジーが1となりる。条件はSDA or SCLがLowの時にSetされ、STOPコンディションを検出してResetとなる。
しかしI2C_Init直後ではマイコンからI2Cを叩いているわけでもないし、バスにはプルアップ抵抗が付いているだけで他のデバイスも未接続なため、STMから動かさないかぎりはバスが動くことはない。

更に詳しく調べると、GPIOをAF_ODで初期化した時点でピンがLowとなり、I2C_InitのあたりでHighに戻ることがわかった。

解決策としてはI2C_Initを行った後にGPIO_Initを行う、という感じらしい。


いまいち動きが理解できないが、GPIO_InitとI2C_Initのタイミングを入れ替えれば動いたり動かなかったりするので、先にペリフェラル、後にGPIOの初期化を行えば正常に動作するようだ。

他のペリフェラル、USARTやSPIであればペリフェラル自体を有効にしなければ動作しないため初期化の順番の問題が表面化してこなかったが、I2Cはペリフェラルを有効にしなくても、クロックを供給した時点?でBUSYのサンプリングが始まるため、順番が厳密になっているのかも。


他にもいろいろ問題がありそう。昔使った時と同様、苦労することになりそうだ。

***
追記:2020/10/02
 だいぶ前のエントリだけど、気がついたので更新。
 これに関する話が、stmcu.jpの資料にある。
 概ね前述した内容はそう間違っていないが、本家の適切な初期化シーケンスが提案されているので、それに従うことをすすめる(資料の内容は会員登録した人向けなので、各自確認のこと)。

2016年9月11日日曜日

スペースプローブコンテストの資料

今年から開催される「スペースプローブコンテスト」の技術発表会の資料が出てた。

スペースプローブコンテスト技術発表会2016

あんまり技術的な話は書いてないと思いますが、ちらっと読んでみると良いと思います。
僕が軽く探した程度では、高校や大学を含め、あまり缶サットの資料というのは出回っていないような気がします。なのでこういう技術交流会の議事録みたいなのが出てくると面白いですね。


スペースプローブコンテストについての詳しい話は以下のリンクを参照してもらうとして。
スペースプローブコンテスト。略するとなんだ?スペプロコン? - 植松努のブログ(まんまだね)




今年は重量1kg程度の大きさですが、次回以降はもっと小型の枠も作るそうです。
参加資格については「親子での参加も可能です。仲間同士で集っての参加も可能です。大学生も、高専も、中学校も小学校も、法人も、個人も、オッケーです。」と書いてあるので、「やりたいならだれでもいいよ」ってことだと思います。

今年は発表から開催までが恐ろしく短いですが、次回大会まではおそらく半年とか1年くらいは有ると思うので、興味のある人は考えてみてはいかがでしょうか。もちろん、今すぐやりたい!という人はまだ間に合うので今年から参加しても良いんですが。

2016年9月10日土曜日

STM32F1のブートローダのUSART

FreeRTOSとかJPEGカメラとかモータードライバとかやりたいんだけど、何を血迷ったかBootloaderのSerialインターフェースを叩いてる。

STBee使ってるなら大抵はDFUを使ってるだろうし、STM32F4ならマイコン自体にUSB DFUが標準搭載だし、JTAGを使ってる人ならJTAGで書くだろうけど、STM32にはチップ自体にFlashを書き換えるプログラムが搭載されている。

このプログラムを呼び出すにはBoot0を1に、Boot1を0にした状態でマイコンをリセットすれば起動し、その後に外から何らかの操作を行えばそれに合わせて更に分岐していく。
例えばリセット後にUSART1に0x7Fを叩けばUSART経由でROMを呼んだり書いたりいろいろできる。

一番最初のプログラムについてはAN2606 "STM32(TM) microcontroller system memory boot mode"という資料が参考になる。
USARTのブートローダについてはAN3155 "USART protocol used in the STM32 bootloader”という資料が参考になる。


さて、USARTを叩いた時にハマった点について。
ちゃんとANに書いてあるから「PDFをよく読め」で一応答えになるけど、もうちょっと詳しく。

2016年9月3日土曜日

STM32F1で多チャンネルのPWMを生成する

STM32F1でPWMを出そうとすれば、大抵の場合はTIMのOCを使用すると思います。これはかなり高精度で、CPUやバスを使用せずに、簡単にPWMを生成できます。ただし弱点はTIM1個あたり4本しか出せない点で、10本欲しいという時はTIMが3個必要になります。TIMは様々な用途に使用しますから、PWMだけにTIMを大量に割り当てるわけにも行きません。
というわけでなにか違う方法が必要となります。

今回はGPIOを使用してPWMを出力してみました。
と言ってもCPUで一々1bitずつ操作していてはタイミングも保証できませんし、CPUリソースの1割を使用してしまうので割に合いません。なので今回はDMAを使用します。

GPIOで任意のデータを吐き出す場合、ODRに書き出すことも可能ですが、パルス幅を変更するたびに大量のビット操作が必要となるため、かなりCPUリソースを使用することが予想されます。ということでSTMのGPIOに搭載されているBSRRというレジスタを使用します。
このBSRRはport Bit Set/Reset Registerの略で、32bitレジスタ1本の下位16bitが1になっているビットはSetされ、上位16bitが1になっているビットはResetされるというレジスタです。StdPeriphLibraryのGPIOビット操作関数はBSRRに引数を投げているだけです。
BSRRを使用してパルス幅を変更したい場合、変更する動作は数回のビット操作で済むので、非常に高速に行えるようになります。

今回はGPIOEの16bitをPWM出力ポートとし、DMA1-1を使用してBSRRに転送、DMAのトリガはTIM4を1MHzで回す、という感じにしました。
DMA1-1を使う理由は、それ以外のDMAを使用した場合、調停負けを起こした場合にパルス幅の正確性を維持できないという理由になります。DMAの調停は4段階の優先度(VeryHigh, High, Medium, Low)で決定され、同時に同じ優先度の転送が発生した場合はチャンネル数の小さい方が優先されます。


今回の方法の利点は上記の通り簡単にパルス幅を設定できたり、比較的高精度にパルスを出力できる点です。
ただ欠点もいくつかあり、バスを高頻度で使用する、大量のメモリが必要、といった点になります。特に後者は深刻で、最大2msecのパルスを出力する場合、およそ8.5kbyteのメモリが必要となります。STBeeは64kのRAMがあるので多少はマシですが、STBeeMiniの場合は20kしかRAMがありませんから、STBeeMiniで複雑な処理を行いながら大量のサーボを制御したいという場合は注意が必要です。


他の方法としては、TLC5940を始めとした、外付けのチップを使用する事も可能です。例えばTLC5940は1個あたり16chを制御でき、カスケード接続すれば64位は簡単に制御できるはずです。これくらいあれば8足歩行ロボットでも作らないかぎりは安心でしょう。ただTLC5940であればSPIやPWM出力、GPIO等が必要になり、プログラムも複雑になりますし、外付け部品が必要になるので難易度は若干上昇します。


とりあえず今回作ったプログラムの一部を以下に貼っておきます。これはFreeRTOSの上で動くモノですが、DMAの操作(Disable, SetCounter, Enable)をタイマ割り込みで行ったりするようにすれば非OS環境でも動作するはずです。


GPIOEをロジアナで覗くと以下のようになります(ジャンパワイヤが足りないので5ch分だけ)。


わかりやすいように100、200、300、400、1500usecとなっていますが、サーボモータを接続する場合は1500±500usecを使用します。


キースイッチ

IDECのキースイッチを買ってみた。

Φ25 TWSシリーズ ASS□K形/鍵操作形 セレクタスイッチ IDEC(和泉電気) (C59949461) - IHC.MonotaRO インターネットホームセンター




IDECのスイッチは押しボタンと緊急遮断スイッチを使ったことがある。5年位前だと思うけど。

キースイッチが欲しかったので買ってみた。
一般的に使われるキースイッチはオルタネイト型が一般的で、車のキーと同じく、位置を保持するというモノ。逆にモーメンタリ型はキーを操作している時だけ通電し、これは車のセルスタータに割り当てられる場合が多い。
今回はモーメンタリ型が欲しかったので、「90° 2ノッチ 右抜け 左リターン 1a1b」というタイプを買った。イマイチわかりづらいが、手で操作するときは左(CCW)に回し、スプリングで右(CW)にリターンし、右(CW)側でのみ抜くことができ、接点はa(NO)とb(NC)が1個ずつ、というモノ。
端子部は3.5mmのプラスネジになっており、3.7mmのY端子や丸端子が適合する。

銅線用 裸圧着端子 (Y形)先開形 ニチフ (C45320414) - IHC.MonotaRO インターネットホームセンター



本題のスイッチだが、操作時のクリック感のようなものは全く無い。
またキー自体はセキュリティ性は無く、すべてのスイッチで同じ鍵が使用されているらしい。なのでこの鍵はマイナスドライバーで簡単に回るようなものではないが、スペアキーも販売されているし、同じキースイッチを買えば同じ鍵が入手できるから、防犯等の用途で使用することはできないと思う。あくまで「ちょっと興味本位の通行人が操作する」位を防ぐ程度だと思う。

個人がこのスイッチを使うのは、例えば自分のPCを起動させるには鍵が必要!みたいなロールプレイ時のみだと思う。もちろんパソコンのカバーを開けて配線を短絡させれば起動させることができるし、上記の通りセキュリティとしては使えないから、操作できる人間を限定するようなことはできない。


ということで、ロールプレイに使うなら高信頼性だし入手性も比較的いいし、使えるんじゃない? という話でした。モデルロケットの点火器とかに使うと面白いと思う。

2016年9月2日金曜日

JA3950(セスナ206)、JA005H(AS365)、JA9639(AS355)、JA6912(ベル430)、JA119L(ベル412)、シリアル不明(OH-6)、シリアル不明(UH-1)

前回(JA04HP(AW139)、JA119L(ベル412)、UH-1、JA7907(R44)、JA001H(SA365))の続き。前回は午前中の2時間に飛んでたヘリのみだったが、その日の午後から今日にかけて。


8月31日 15時50分頃 JA3950(セスナ206)


8月31日 16時0分頃 JA005H(AS365) STV報道ヘリ


8月31日 16時50分頃 JA005H(AS365) STV報道ヘリ


8月31日 17時0分頃 JA9639(AS355)


9月1日 12時50分頃 JA6912(ベル430) HBC報道ヘリ


9月1日 12時50分頃 JA119L(ベル412)


9月1日 14時50分頃 JA6912(ベル430)


9月2日 10時40分頃 シリアル不明(OH-6)


9月2日 16時0分頃 シリアル不明(UH-1) ポッド付


OH-1やUH-1はかなり高頻度で飛んでいる。NHKのニュースでOH-1が捜索しているところや、UH-1のホイストで救助しているシーンが写っていたので、それらに関連するものだと思う。


映像伝送装置付のUH-1のプラモデルが有るらしい。