ラベル 電子工作 の投稿を表示しています。 すべての投稿を表示
ラベル 電子工作 の投稿を表示しています。 すべての投稿を表示

2014年12月12日金曜日

ストリナ10HzGPSの改造

ストリナで売っている10Hz出力なGPSモジュールですが、このモジュールで使用されているGPS受信チップには1PPS出力端子があります
この出力端子は"±11ns high accuracy time pulse"(データシートより)だそうで、正確な時間が必要になる電子工作では十分な精度のタイミングソースとして使えます
しかしこのGPSモジュールではPPS出力はLEDをドライブしているだけで、コネクタには引き出されていません(そもそもコネクタは未実装ですが)
ということでPPSを引き出しつつ、他にもちょっと説明を


まずコネクタですが、4極、5極、6極のいずれかを使用します
4極の場合は電源とデータだけなのでPPSは引き出せません
5極の場合はGND2本を使用してPPSを使わない or GND1本にしてPPSを出力
6極の場合は全てのPADを使用しつつPPSを出力
という感じです

ピンアサインは画像に書いてあるので一目瞭然だと思いますが
「TXってどっちから見た送信だよ!」
と言う人がいるようなので念の為に矢印を書いておきました
GNDの隣にあるTXピンはGPSからマイコン等へ流れる位置情報データ
VCCの隣にあるRXピンはマイコン等からGPSへ流れるコンフィグデータ
となります

PPSピンはGPSデコードチップから直接ジュンフロン線などで引き出します
パターンが狭いので隣のPADと短絡しないように注意してください


それと使用する際の注意点ですが、画像に見て右上にある円形の物体ですが、これがバックアップバッテリで、ちょっと見た感じではちゃんと固定されているような気になるのですが、実際には2箇所の薄い電極で基板に乗っているだけです
なので何かに引っ掛けると簡単に剥がれてしまいます
ということで実際に使う場合はGPSモジュールをテープでグルグル巻にして置いたほうが安心です

それと同じく脆弱な場所として、アンテナの横にあるLEDも簡単に壊れてしまいます
LEDなんていらない!という場合はとっとと壊しちゃってもいいですが、GPSのFIX確認にLEDを残しておきたい場合は接着剤などを盛って保護してやる必要があります


とりあえずハードウェア面はこれくらいでしょうか
ソフトウェア面では、GPSチップに内蔵されたEEPROMの書き換え回数が少ないので頻繁に設定を変えていると設定を焼けなくなる… くらいでしょうか


それではみなさんも快適な測位ライフを!

2014年6月25日水曜日

STM32F1で7セグLED



内部リソース

7セグの表示に使っているのはTIM2とDMAです
DMAの転送タイミングをTIM2で作成し、RAMにある配列から点灯パターンを送り出しています
こうすることによりCPUは完全にノータッチでダイナミック点灯を実現できます
そのためCPUをスリープにしても点灯を継続できます
7セグLEDを使っている場合CPUの消費電力程度削減してもあまり効果はありませんが、CPUがノータッチで良いということは他の処理に負担をかけないということでもあります

今回はタイムソースにTIM2を使いましたが、TIM2のDMAはSPI1_RX等と競合するので、STM32F103VE等であればTIM5を使うなど、工夫したほうがいいと思います

今回のサンプルはとりあえず7セグを表示するのが目的だったので、表示文字の変更以外はWFIでスリープに入れて、USART1割り込みで起床するようにしています

スリープから抜けたら、USART行受信関数を呼び、もし改行文字まで受信していればその文字列を表示関数に渡した後にスリープする という感じです
表示関数の中では文字列をwhileで処理し、その中ではswitchで表示RAMに当該文字の点灯パターンを代入する という処理をしています


7セグLEDは結構簡単に扱える表示デバイスですが、表示桁数に比例して扱いづらくなっていきます
昔1個モノの機材を作った時には8ケタの表示モジュールを作りましたが、それだけでかなり時間がかかりました(メインの基板はあまり複雑じゃないのですぐに作れた気がします)

最近は7セグLED表示モジュール等があり、SPIやUSARTで制御できるようになっていますが、欲しい色がなかったりだとか、8ケタの表示のためにUSARTモジュールが1個必要だったりとか、あまり使いやすいとは言えないような気がします


汎用ポートがゴッソリと余っている場合は7セグLEDは表示デバイスとしては有用だと思います
ただし一般的な16x2のキャラ液晶は最小構成で6本のポートがあれば使えるので、どうしても という場合でない限りはキャラ液晶のほうが使いやすいのも事実です

2014年5月25日日曜日

TFTLCD

秋月で売っている3000円TFTLCDを試してみました
ちなみに秋月には3000円TFTLCDが2種類あります
今回使ったのは単色の横400縦240のモノです
3色480x272とかSTM32F1じゃ扱えないので(少なくとも内部メモリでは)



現状
・1ピクセルのSet/Reset/Write
・8ピクセルのWrite(Mask有)
・線(1ピクセルWriteのラッパー)
・円(1ピクセルWriteのラッパー)
・文字(8ピクセルWriteのラッパー)
を実装しています

フォントはWindowsでC#を使ってバイナリに変換しています
変換時に左右に空白が数ピクセル作られるため、かなり幅の空いた文字列になってしまいます
この辺りは今後の改善点


液晶への転送の実装ですが、ちょっと効率の悪い方法を使っています
普通400x240で1ピクセル1bitの表示の場合 バッファーは12000バイトで足ります
(横400*縦240*(1ピクセルのバイト数0.125))
しかし今回は12482バイトのバッファを作りました
こうすることによりハードウェア(DMA)を使った転送が容易になります

次にハードウェアレベルですが
今回はSTM32F1のSPI2を使いました
SPIは上位ビットファーストですが、このLCDモジュールは下位ビットファーストです
幸いにしてSTM32F1のSPIは下位ビットファーストで転送を行うモードが有るため、これを利用しています
SPIは16分周で初期化しています システムは72MHzなので、SPIクロックは2.25MHzと、MAXの2MHzを超えていますが、現状では正常に動作しているようです
ちゃんとモノを作るときは32分周にして1.125MHzにするか、システムを64MHzにして2MHzにするなどの対策をするべきです

それとCOM信号ですが、今回はソフトウェアで送っています
そのため定期的に何らかのデータを送りつける必要があります
今回はフレームバッファを内蔵しているので、ソフトウェアループの中でCOMを反転した後、フレームを転送しています

本来であればタイマ割り込み等を使用してハードウェアで転送を… というのが一番いいのですが、そういう実装にするとSPIポートを選べなくなるので迷うところです


参考までにSPIのキャプチャを置いておきます

上の画像はSCSの立ち上がりから数バイト分を 下の画像は1フレーム分の転送を示しています
DMAを使用して転送しているため、非常に高速に転送できていることがわかります
(ソフトウェアで転送した場合このように綺麗にクロックが連続することはありません)

また1フレームの転送時間は44.381mSecとなっています
これは12482バイトを2.25MHzで転送する場合の理論値(44.38044msec)と同じです
DMAを使うことにより非常に高速に転送できていると言えます



2014年4月4日金曜日

基板

P板に注文していた基板が届きました


シルクズレもカスレもなく、さすがとしか言いようがありません
シルク切れてるのは設計の問題ですね
とりあえず試作ということで。。。

今回の基板は1枚がかなり小型で、結局最終的にはすべての部品が表面実装となりました
いちおうコネクタ部分は穴が開けてあり、いままで使っていた挿入型のコネクタも使えるようにしてありますが、基本的にはコネクタを使わず 被覆線をそのままハンダ付けするような感じにしようと思っています

ひと通りの部品は手元に有るのですが、78L05の表面実装を買い忘れていて、これはリード部品を実装して対応しようと思います
また、本来はフルカラーLEDを接続するためのコネクタも、手持ちのフルカラーLEDがないので 単色LEDを載せる感じになりそうです

まぁ試作品なので、ちゃんと動きそうならちゃんと実装します

今回は4面付で5枚注文しました なのでターゲット20枚分の基板があります
が、部品はそこまで買ってないので、何枚かはそのまま眠らせることになりそうです

ターゲットプレートがちゃんと動けば、コントローラ側の仕様を固めて、また基板発注です


シューティングタイマーの仕様もいくつか考えています

モードは
・ファーストショット/FS(ダブルタップ等で最初の1発で停止)
・ラストショット/LS(最後に撃った時点の時間を表示)
・2TEAM/TT(ターゲットにヒットする毎にLEDの色が反転)
・MORE TEAM/MT(ターゲットにヒットする毎にプリセットの色をランダムに選択)
というのを実装しようと思っています

とりあえずFSモードは必須ですし、できればTTモードも作りたいです

MTモードはどうやって遊ぶかというと
予め4チームほど作っておき、色を決めてプリセットしておきます
ブザーが鳴るとゲームスタートで、終了のブザーが鳴るまで自分以外の色のターゲットを撃ちます
ターゲットを撃ってもランダムで色が変更されるので、自分のチームの色になるまで撃ち続け、また自分の色になったら撃つのをやめる という状況認識が必要になります
終了のブザーの後、一番色が多いチームの勝ち
という感じです

距離15mに置いてハンドガン縛りや、25mに置いてボルトアクション縛り などでやると楽しいと思います

とりあえず、ターゲットプレートの試作に部品を実装して、ちゃんと使えることが確認できてから ですね


追記 2014/04/05 0:39
とりあえずオペアンプ周りの動作確認ができました
LED周りは4個中2個は動作確認が済んでいます
ということで、手直しせずにこのまま使えそうです
一旦この基板は放置で、表示側の回路を考えようと思います

2014年4月2日水曜日

球状シリコン太陽電池

近所のスーパーに行った際、工作コーナーに新しく球状シリコン太陽電池を入荷していたので思わず買ってしまいました


スペックは0.45V/1.67A(0.75W) 開放0.57V 短絡1.80A という感じです
短冊状で。いい感じの大きさの比較が思いつきませんが、KindlePWを縦半分にしたくらい という感じでしょうか

球状シリコン太陽電池についてですが
一般的な太陽電池は切手のような受光素子が大量に並んでいる感じですが、球状シリコン太陽電池は米粒のような1個1個が受光素子です
そして最大の違いが製造工程にあり、通常のシリコンを切削して作るのと違い、球状シリコン太陽電池は液状のシリコンを滴下し、涙滴状に固まった粒を加工して使用します
そのためシリコンの使用効率が高く、シリコンの使用量は一般的な太陽電池の5分の1程度にできるようです
欠点としては、面積効率が良くない 受光できても角度によって(球の周囲)は変換効率が低い などが挙げられます
しかしアルミニウムで凸レンズ状の板を作り、そこに受光素子を埋め込むことにより上記の欠点を解決しているようです
また、1個の受光素子が小型で、ある程度曲げることができるため、多少の曲面であればそのまま貼り付けることができます

で、とりあえず使う予定はないのですが 曲面に曲げることができるなら缶サットに使えるかな とか思っています
去年作った缶サットも太陽電池を載せていますが、0.3Wのパネルを4枚使用し、電気はLEDを光らせるだけにしか使っていませんでした(LEDで可視光通信も実装したのですが、動画記録が無いので確認はできていません)

缶の直径は66mmで、半径33mmのRに曲げなければいけませんが、今回買ったパネルはそこまで曲げることはできなさそうな感じです

また、全体をパネルで覆うと協賛企業のロゴが隠れてしまうため、レギュレーション違反になるという問題もあります(そもそも僕は缶サット甲子園の参加資格は無いので気にしなければ問題無いという話でもありますが)

また、3枚を120°毎に3枚貼り付けた場合は1.35V/1.67Aの電源になりますが、直列で接続すると圧倒的に効率が落ちてしまうため、1枚1枚にMPPC(もしくはMPPT)に対応したDCDCコンバータを接続する必要があります

MPPCなDCDCはLTC3105が便利ですが、このパネルとは微妙にミスマッチです
電流が3分の1で電圧が4倍くらいあればちょうどいいですが


なお、この球状シリコン太陽電池はAmazonでも購入できます
http://www.amazon.co.jp/dp/B00FIXNAX8/

2014年3月8日土曜日

エアガンのターゲットを作る

おそらく2回目

急にやる気になった理由ですがFbのHSSCで「電子ターゲット使いたいよねー 作ってよ~」と言われたので、放置していたものを進めよう ということになりました

さて、エアガンだと「アンリミテッド」と呼ばれる競技があります
これはハンドガンや長物等、クラスによって使う銃が分かれていますが、共通しているのは5枚のターゲットを撃つ早さを競うということです
で、そのターゲットはもちろん電子ターゲットが使われていて、開始から終了までの時間を計測しています

昔は1万円くらいでターゲットが市販されていましたが、生産終了で今ではどこのショップも在庫切れになっています

で、そのターゲットを解体した人のブログを見てみたら、何の事はない圧電素子でした

ということで前回の方向性を進めるということになりました



今回は検出能力を向上させるために1.0mmのステンレスプレートに耐衝撃アロンアルフアで圧電素子を貼り付けたものを使用しました
その波形です
縦が20V/div 横が25mSec/div です
プレートから70cmの距離に銃口先端が来るような位置でBOYsSPOMODで撃ちました
Vppで40V以上です 凄い

この画像は上記と同じ条件で3発連射した時の波形です
波形から見るとおよそ10発/秒で、これくらいのサイクルであれば十分に1発ずつの検出ができそうです
ただ検出回路はこんなに分解能が高くない予定なので、30発/秒になると厳しいかも

ちなみにこのステンレスプレート、10cm上から自由落下させた0.12gBB弾でも検出します(Vpp1.5V)
凄まじい検出能力です

ということで、検出装置の目処が立ったので次は検出回路に移りたいのですが、残念ながら手持ちのオペアンプが4558DDしか無いので当分できなさそうです

5Vくらいの単一電源動作なレールツーレールのオペアンプを買ったら続きをやろうと思います
Vpp1Vから40Vまでの範囲を検出できる回路ってどんな風に組めばいいんだろうか…

気が向いたら、PSoCで遊んで見るかも

2014年1月25日土曜日

SPIとI2C

SPIとI2Cの通信速度の差について

I2Cは標準モードで100kHz 高速モードで400kHzまでクロック周波数を設定できます
しかし400kHzでは信号がかなり鈍ってしまうため、実際には200kHzが限界と考えたほうがいいです
(ちゃんと動く環境なら400kHzでも動きますが)

対してSPIは、基本的に周波数の上限はなく、それぞれ適当に決めてやる必要があります
例えば、ST社のL3GD20というジャイロセンサでは10MHzまで可能です

そしてSPIでは1バイト8クロックですが、I2CはACKがあるため1バイト9ビットです
しかもSPIはスレーブ選択信号がありますが、I2Cはそれが無いのでスレーブ選択のために追加で1バイト必要です

3軸センサのデータを読む場合、手順としてはステータスレジスタを読んでから、ステータスの内容に応じてデータを読み込みます
ステータスは1バイトでデータは6バイトです

I2Cで読む場合は
→スレーブアドレスを送信
→レジスタアドレスを送信
←レジスタデータを受信

→スレーブアドレスを送信
→レジスタアドレスを送信
←レジスタデータを受信
←レジスタデータを受信
←レジスタデータを受信
←レジスタデータを受信
←レジスタデータを受信
←レジスタデータを受信
の手順で、11バイトのやりとりが必要です
1バイトは9クロック 1クロックは5uSなので、495マイクロ秒の時間が必要です
スタートコンディションやストップコンディション等があるため、更に追加時間が必要で、がんばっても500マイクロ秒を切ることはできません


次にSPIで読む場合ですが
→レジスタアドレスを送信
←レジスタデータを受信

→レジスタアドレスを送信
←レジスタデータを受信
←レジスタデータを受信
←レジスタデータを受信
←レジスタデータを受信
←レジスタデータを受信
←レジスタデータを受信
の手順で読むことができ、9バイトになります
1バイト8クロックで、1クロックは0.1uSのため、7.2uSで終えることができます

単純に比較した場合、I2CはSPIの68倍の時間が必要になります
SPIを10MHzでウエイト無しに実行できるマイコンも少ないので、実際にはSPIはこの倍以上の時間が必要な場合もありますが、それでもI2Cに比べて十分に高速です


なお、I2Cは200kHzを超えるとかなりアナログ的になりますが、SPIも同様で、10MHzとかになるとかなり滑らかな正弦波に見えたりします
必要な速度と、回路を考えた上で選択する必要があるでしょう

2014年1月21日火曜日

オールSTなIMU

次のロガーの構成を考えつつ、手持ちのセンサで遊んでいます

とりあえずすでに実績のあるセンサは優先度を下げて、放置していたLSM303DLHCのライブラリを作成したりしました

LSM303DLHCはSTMicro製のデジタルコンパスモジュールで
加速度は2/4/8/16から 地磁気は1.3-8.1ガウスくらいの範囲で選ぶことができます
このセンサを放置していた理由として、このセンサはI2Cアクセスオンリーで、SPIアクセスができないというのが大きな理由です
データシートにはSPIの設定(3ワイヤor4ワイヤ)があるので、元々はSPIアクセスもできるように想定していたと思われますが、現在の製品ではSPIに非対応です

内部レジスタの配置にまんまと引っかかってしまい、やっと正常なデータを得られるようになりました
1つのチップ内にLSBファーストとMSBファーストが混在してるとかマジでやめてほしい。。。


で、デジタルコンパスモジュール以外にもいくつかセンサを載せてみました

3軸加速度 3軸角速度 3軸地磁気 気圧 気温 の計11種類のデータが得られます
LSM303DLHCのみI2Cアクセスで、L3GD20とLPS331APはSPIアクセスです

ちなみにこのブレッドボードに乗っているデバイス
CPUはSTMicro製
コンパスもSTMicro製
ジャイロもSTMicro製
気圧センサもSTMicro製です
マジでSTMicroオンリーで慣性計測装置を作ることができます
あとはSTMicro製GPSモジュールが出てくれば完璧ですがw さすがにそれは無いでしょう…

いくつか試してみたいセンサもありますが、その前に買うものがいろいろ溜まっていて、その予算も出てないので、基板を作るのはまだまだ先になりそうです

2014年1月6日月曜日

エアガンのターゲットを作る(下調べ1)

エアガンのターゲットを作ってみようと思ったので、ちょっといろいろ調べてみます
今回作るものはプレートに弾があたったことを検出するだけの簡単なものです
どこにあたったか等は検出しません

なんで市販品を買わないかって?
手持ちの部品で作れそうなのでやってみようかと


センサに使うのは圧電素子です
アナログ出力なので処理が面倒ですが、衝撃を検出するのには向いています

今回使用したのはストリナで売っているエナジーハーベスティング用の圧電素子です
http://strawberry-linux.com/catalog/items?code=12019
元々は振動発電をやってみたかったので購入したのですが、結局何も試さずに放置していました


とりあえず試しに大きさ10x30で厚さ1.0mmのアルミ板に貼り付けてみました
貼付け面は裏で、撃たれる方の面は何もついていない状態です

そして撃った時の出力をオシロで覗いてみました
縦軸5V 横軸5mSecです

ピークピークで20Vくらいで、非常に高速に振動しているっぽいです

撃ったのはマルイ10禁Mk23で、0.12gBB弾です
計測はしていませんがマズルエネルギーは0.1J程度だと思います
距離は2mですが
このようにヘコミができていました(裏側は膨らんでいました)
アルミ柔らかすぎです

とりあえず手っ取り早く検出したいなら適当に分圧してマイコンのADCに突っ込んで高速に監視すれば検出可能だと思います
しかし様々な距離やエネルギーになることや、風などの外乱を考えるともう一工夫必要そうです

次はステンレスの板で試してみようと思います
プレートが大きく、厚くなればその分重くなり、材質も変われば重さも変わります
プレート自体が重くなるとBB弾があたった時にプレートに加わる力が少なくなり、圧電素子に伝わるエネルギーも小さくなってしまうため、適切な厚さを調べる必要がありそうです


ちなみに30cm*10cmのプレートがどれくらいの大きさなのか
男性の平均的な身長は170cmなので、30cmの5.6倍くらいです
平均的な肩幅は45cmくらいなので、10cmの4.5倍くらいです
そのため、おおよそ平均的な男性の5分の1くらいの大きさ と考えることができます
距離2mで狙った場合は5倍の10m先の人間くらいの大きさ ということになります
30mで狙った場合は換算で150m先くらいになるので、射撃訓練にはちょうどいいかも

10x30cmの金属板は東急ハンズ等の一般向けホームセンターで容易に入手できると思うので、エアガンの射撃訓練にちょうどいいかもしれません(当たると金属音がするのでわかりやすいし)

2013年12月28日土曜日

SDR?

かなり前に買っていた、SparkfunのSDRシールドを試してみました
http://strawberry-linux.com/catalog/items?code=18193


スイッチサイエンスより数円高い程度でアンテナとコネクタが付属しています
このシールドはすでに製造終了しています

サンプルはSparkfunのページからダウンロードできます
https://www.sparkfun.com/products/retired/10342

Documentsの最後にGitHubへのリンクが有りますが、GitHubにはEAGLEファイルがあったりくらいです
Arduino Libraryリンクからライブラリを落とす必要があります

ストリナで買った時の構成は
1)Sparkfunでよくある赤っぽい袋に入ったシールド
2)ピンヘッダ4個
3)バーアンテナ
という感じでした
おそらくスイッチサイエンスで買った場合は1のみで、2と3は自分で用意する必要があったと思います

自分で実装するのはコネクタとバーアンテナ
それからついでにワイヤアンテナもつけておきます
このSDRの受信帯域が64-108MHzで、4分の1波長では70cmから120cmといったところです
ということで今回は1m程度のワイヤをつけておきました

試しに使用したサンプルはライブラリに入っているものです

Arduinoにプログラムを書き込んだら適当なシリアルターミナルで接続します
操作は
8)音量を上げる
2)音量を下げる
4)シーク(周波数下げ)
6)シーク(周波数揚げ)
M)ミュート
U)ミュート解除
S)ステータス
という感じです
ミュート操作以外はテンキーを想定しているっぽいです

setupのなかで tuneFrequencyで最初の周波数を設定できます
引数は10kHz単位です
僕はラジオふらのの77.1MHzにするため、7710を設定しました

このラジオモジュールは出力インピーダンス10kOhmと非常に高く、ハイインピーダンス受けのアンプが必要になります

で、ちゃんとスピーカーを接続して電源を入れたところ
ノイズしか聞こえない!!
うっすらとなにか聞こえてきますが、僕の部屋ノイズ多すぎ

持ち運びできるHighZi受けなアンプが手持ちに無いため、ノイズの少ない環境に移動して試すのは難しそうです
次の課題はこの辺りですね
あと自室のノイズを減らす努力も…

2013年8月30日金曜日

STM32F103でCAN通信

STM32F103VE(事実上のSTBee)を使ったCAN通信のメモ
嘘偽りなく調べ物した時のメモとしてそのままブログのエディタを使ってるので可読性とかは気にしていません


2013年8月25日日曜日

PDS5022Sを外部電源で

暇つぶしというか ネタ探しを兼ねて
PDS5022Sのバッテリー機能を試してみます

もともとこのオシロは低価格デジタルストレージオシロスコープとして発売されていました
僕は秋月で書いましたが、すでに型落ちとなっています
amazonとか他のショップでも販売していましたが今はどうなっているかわかりません

100MS/sで25MHzの2ch+1trgという構成です
デジオシなのでFFTとかも使えます
PCとUSB接続してグラフを保存とかもできます
(僕のPCは相性が悪くて使えませんが)

で、このオシロはLiPoによるバッテリー駆動が可能ですが
輸送の関係かわかりませんが国内版は電池がありません
(空輸する場合電池類は基本的に同梱不可能)
しかし違いは電池の有無だけで、機能的には同じ物のようです

ってことで動作電圧のチェック

基本的にFullで8.3V 6.5Vを下回ると警告表示
という感じのようです
また6.5V時では1.2A近く流れています

LiPoは公称電圧3.7Vなので 2セルの公称電圧は7.4V
終止電圧は3.0Vなので セルでは6V

という感じで、警告表示は比較的余裕のある表示となっています
また電池警告が表示されている状態でしばらく放置していると
"LOW BATTERY"という文字も表示されます
ただし自動的に電源がOFFになることはなく
手動で電源を切る必要があります


電池駆動する場合の条件として

  • 7.4V前後(7Vから8V)を供給できる
  • 常時1A以上流しても問題ない
  • 少なくとも2時間くらいは使えるように

をクリアするためには
まっとうな方法で行けば2セルの3AhLiPoを中に仕込む感じになります

ただ、個人的にはこの方法ではなく
Ni-MH等を使いたいと思っており
例えばニッケル水素電池8セル(9.6V)を降圧して7.5Vくらいにしてから端子に入れる
充電は専用回路を用意する
という感じにしたいなと思ってます

一応裏蓋の中には単三型eneloop8本を入れる余裕はありますが
電子回路を入れる余裕が全くありません
逆にeneloop6本程度であれば電子回路を入れる余裕が生まれます
Ni-MH6セルでも動作は可能のはずですが、おそらくバッテリー警告がうるさいはずなので
実際に使う場合は昇圧が必要でしょう

オシロ本体に充電回路が内蔵されてるのになんでわざわざ外付けするのかとか
中でDCDC通してるのになんで外でDCDC通すのかとか
いろいろ突っ込みたいところはありますが
まずは構成を考えるということで


「こんなかんじにしたい」というのは有るんですが
実際にサイズ的な話になると不可能だったり
既成品の改造は結構面倒ですorz

2013年7月13日土曜日

AD9834の制御

AD9834の制御について


AD9834というDDSモジュールを試しています
何かに使う予定があるわけではないですが

とりあえず上記関数ひとつで制御出来ます
定数0x2028というのは
ストリナのサンプルでは0x2020ですし データシートには0x2000が書いてあります
この辺りはフラグになっているのでデータシートで確認する必要があります

この関数はストリナのモジュールに合わせて書いてあるので
発振器が67108864Hz以外の場合は定数を変更する必要があります
またこの関数に与える引数はHzではなく 0.25Hz単位となります

SPIでも制御できると思いますが
それほど面倒ではないのと 送信だけなのでソフトウェアで書いてあります
もっと高速に転送したければ直接レジスタを叩くように書き換えてください


とりあえず備忘録ってことで

2013年6月26日水曜日

グラフィックLCD

グラフィックLCDを使ってみました

今回使った液晶は秋月で売っている128x64のタイプです
http://akizukidenshi.com/catalog/g/gP-03413/
TG12864E-01XWBV というやつです

この液晶は電源やバックライトを含めて20本の配線でドライブできます
キャラ液晶と違い常に8bitで通信し
Ena信号だけでなくCS(Chip Select)端子が2本存在します


128x64ピクセルなので、8x8pxの美咲フォント等を使用した場合16文字x8行書くことができます
もちろんグラフィック液晶なので自由な液晶や図形を書くことができます

上の画像のサンプルでは直線を2本 正方形と真円を1個ずつ それから文字列を書いています

この液晶は1ピクセルの大きさが横1対縦1.2程度なので正方形を書いても実際には正方形にはなりません

今回はSTBeeMiniに接続し、美咲フォントと自作のUTF8toShift_JISテーブルを使用しています
とりあえず動作確認が目的なので変換テーブルは第1水準漢字しか実装していませんが、それでも全体で92kにもなり、STBeeMiniのROMギリギリです(DFUの転送には1回30秒もかかってしまいます)

参考までに今回作った基板の実体配線図を添付しておきます
図右上に10kΩのボリュームが有り、コントラストを調整しています
VDD(5V)とVEE(-10V)の間に接続しています
もしもこの図を参考に作ろうという人がいるなら、ボリュームのVDDとVEEを逆にすると幸せになれるはずです

RSをPB0に接続したほうが簡単に作れますが 今回は諸事情でPB2から配線しました

この液晶は常に8+4+2を専有しているくせに、アクセス速度はやたら遅いので
あまり実用的な使い方はできなさそうです

2013年6月22日土曜日

Blackberry Trackball

ブラックベリーのトラックボール ブレークアウトボードを買ってみました

ちょっと興味があって確保しただけで何かに使う予定はないですが
とりあえずmbedで動作確認をしたので報告

かなり暗い画像ですが、これ以上明るくするとトラックボールのバックライトの色合いがわからなくなってしまいます

このトラックボールはホールセンサを使用して回転を検出するタイプで
チャタリング処理が必要ありません(クリックボタンはタクトスイッチなのでチャタリング処理必須)
しかも回転方向毎で計4出力があるので
変化したピンの方向にインクリメントするだけなのでかなり楽です
今回はTickerを使いましたが、ピン変化割り込み等の方が楽だと思います
変化割り込みの場合は検出は立上がりと立下りの両エッジを検出するほうが無難です

そしてこのトラックボールにはLEDが内蔵されており、
単純な3色フルカラーではなく、Whiteを含んだ計4色となります
上の画像の状態はRGBWそれぞれ100%です
かなり赤っぽい感じになります
クールホワイトを表示したい場合はRGBWでFF,FF,00,FFくらいがちょうどいいくらいです
白だけを点灯させた場合は微妙に黄色っぽい白となります(電球色ではないです)
内蔵LEDはカソードコモンになっているので点灯させる電圧には注意が必要です
一応180Ωの抵抗がそれぞれのLEDに接続されているのでマイコンに直結できますが
3.3V駆動ではかなり暗いです
完全な暗闇で自分の居場所を誇示するには十分ですが
動作状態を示す用途に使用する場合は明るい環境での視認性が悪くなると思います
わざわざ5Vを引っ張ってトランジスタ等でドライブというのも面倒なので
このトラックボールのバックライトを使う場合は5V動作のマイコンを使うといいかもしれません
Arduinoとか そっちの方を


内部処理的には面倒なことはしていないのでソースコードは載せませんが
トラックボールの検出とLEDのPWMをひとつのタイマ割り込みでやろうとすると面倒になります
トラックボール自体の割り込みは数十mSec程度で十分ですが、LEDはPWM分解能に合わせて十分に速い速度で制御する必要があるからです

それとSparkfunの例によって取り付け穴は横方向にハーフピッチずれています
なのでコネクタとネジ穴の両持ちをする場合はハーフピッチのユニ基盤か、自分で基板を作る必要があります
ブレークアウトボードのブレークアウトボードとかいうワケわからないことになりそう。。

コネクタは電源含め11本出ているので、コネクタをつけるのは現実的ではないかもしれません
ピンヘッダを使うか、さもなくばフラットケーブルを直接ハンダ付けというのがいいでしょう
ケースを使わずに直接基板に固定する場合はソケット等を使わずにピンヘッダの両端にハンダ付けするというのもひとつの方法です
ただしネジ側を固定しないとクリックはできません

今回は2個買いましたが、双方の基盤でクリックの感触が異なります
カチッと押した感じがするものと、押したかどうかわからないものです
クリックは微妙に検出しづらい時があるので、あまり多用しないほうがいいかもしれません

値の変化等に使う場合はまっすぐ上に動作させてる気でも実際には横方向にも入力されていたりするので スイッチ入力の代わりにカーソルを移動したり値を変化させたりという用途には向かないですが
GUI上でマウスポインタを移動するような、ある程度遊び幅のある用途に使うことが望ましいでしょう

2013年6月20日木曜日

.NetMicroFramework

諸事情でNetduinoを買いました。正確に書くとNetduino Plus 2となります。
STM32F405RGを使用し、Microsoftの.NetMicroFrameworkが入っているため、Visual C#で開発することができます。
端的に説明すると、Arduinoのような使いやすさで、mbedのような高性能を、Windowsと同じようにコーディングできる。という感じでしょうか。
NetduinoはArduino形状なのでmbedほど使いやすいわけではないですが、EthernetやmicroSDソケットが搭載されていたり、比較的使いやすい形となっています。
VisualC#が標準の開発環境となるため、mbed等のように見づらく操作しづらく使いにくいIDEではなく、非常に高性能な予測入力が使用でき、インデントなども自動で行われ、カスタマイズも容易です。
もちろんソースコード内に日本語を記述でき、printDebugでも日本語や漢字を使用することができます。VisualC#でソースコードレベルでデバッグが可能なのでバグの発見や駆除も容易でしょう。

タイマ割り込みを使用したLチカ
Lチカ程度なら簡単に記述でき、タイマ割り込みを使用するのも宣言を含めて1行でできます。C#なので多重定義も使用でき、簡単に使用したい場合やより高度な設定をしたい場合でも同じ方法で初期化できます。

欠点を挙げるとすれば、Arduinoやmbedほど日本で普及しているわけではなく、情報量がさほど多くないことや、コードを書き込む際の安定性の問題があります(mbedのようにファイルをコピペする形式ではなく、VisualC#から転送する 昔使っていた時に頻繁にエラーが出ていた 最近どうなったかは知らない)。


Timerを使用することによりタイマ割り込みを使うことができますが、.NetMFWのタイマ割り込みはハードウェア処理ではなく、ソフトウェア処理のため、CPUリソースの許す限りいくつでも可能という利点があります。これはコードの動作を短い時間に区切って割り当て、常に時間を監視して、ちょうどいいタイミングが来たら関数を呼び出す、という動作をしているためです。そのため時間の正確性については微妙なところがあります。ただミリ秒やマイクロ秒といったものすごく短時間の精度が要求される場合は普通のマイコンに直接コードを書き込んだほうが安心できるでしょう。

Netduinoの入手ルートは現時点ではスイッチサイエンスが簡単です。
少し遊ぶ程度ならNetduino2でもいいですが、SDカードへのアクセスやEthernetを使おうと思うならNetduinoPlus2が最良の選択だと思われます。
他にも.NetMFWが動くボードはありますが、僕は使ったことがないので評価出来ません。

2013年6月19日水曜日

圧力センサ

気圧センサの次に書くエントリとしてなんとも微妙な感じですが
今回は圧力センサの話です

・気圧センサと圧力センサの違い
基本的に気圧センサというのは読んで字の如く気体の圧力を測定するものですが
狭義では大気圧を測定するためのセンサという認識です(あくまでも僕の考え方)
大気圧というのは数十kPaから130kPa程度の範囲です
対して圧力センサというのはあらゆる圧力を測定できるセンサという認識です
もちろん気圧センサも圧力センサの一部です
基本的に今まで圧力は気圧だけを測定していましたが
次は地球の内部に向かっていく方向も測定したくなり
圧力センサを買う流れとなりました

例えば水は10m毎に1気圧増加するので、現在の水圧を測定すれば現在の深度もわかるというわけです

そこで今回は0MPaから1MPaまで測定できるセンサをRSで買いました
1MPaというのは高圧ガスの問題で校正が面倒というのと
深度100mがおよそ1MPaになるので さすがにそれだけ測れれば十分だろうという考えです

今回買った圧力センサは電流出力で
計測部にかかる圧力に比例して電流が増加していきます
なお計測部の動作電流としてオフセット4mAが設定されています
直接電流を読んでもいいですが、基本的にマイコンのADCは電圧検出のため
一旦抵抗器を介して電圧に変換しています
抵抗器はメーカーPDFの使用可能範囲から、簡単に計算できる100Ωを選択し、センサと一緒にRSで買いました(0.05%品で2800円でした ぼくが普段使っている抵抗の2800倍 もしくは14000倍です コレだからn倍って表現は好きじゃないんだよ。。)

なお、センサの特性上電源電圧が8-30V必要で
抵抗を100Ωとした場合の電圧範囲は10-26Vです
一般的なマイコンの電源範囲ではないので、専用の電源が必要になります
PINフォトの放射線検出から30Vを受け取って7812を介すとか
さもなくば5Vから昇圧DCDCで15Vを作るとかしなければいけません


今回はセンサの動作確認が目的だったのでAC100Vからスイッチング電源で15Vを作成し、値はテスターで読みました

近所の知り合い宅のコンプレッサーを借りて試験しました
0MPa-1MPaだとコンプレッサーの圧力範囲なので楽

センサは開口部がG1/4になっているので市販のG1/4ハイプラグカプラメネジを使えば簡単にコンプレッサーと接続出来ます

0.5MPa単位で測定しプロットしたグラフがこちら
※1) 0.5MPaは測定していないため0V
※2) 動作電流4mAのオフセットとして4Vがあります

良い感じに0から8MPaまで直線になっています
もう少し詳しく計測すればマイコンでADCした結果から圧力を計算することも可能でしょう

とりあえず第一目標「高圧を測れて液体にも耐えられるセンサを探す」はクリアしました


なおこのセンサは専用のケーブルなどと組み合わせた場合に最高の性能を発揮出来ます
上の写真のような使い方はしないほうがいいです

2013年6月11日火曜日

気圧センサ

気圧センサといえば、比較的入手性がよくて簡単に扱えるものとしてMPL115A1およびA2があります。
これはSPI(A1)、もしくはI2C(A2)でアクセスできる気圧センサで、秋月を始めストリナやスイッチサイエンスでも販売されていて非常に入手しやすいと言えます。(個人的にはストリナのモジュールが一番扱いやすいと思います 欠点を上げればMPL115A2しか無いところ)

しかしMPL115の欠点として、測定範囲が500hPaから1150hPaと狭いこと
また、精度が10hPaと低いことが挙げられます

範囲としてはおよそ-1054mから6374mの範囲です
誤差は1013.25hPaから10hPa低くなる(1003.25hPa)と83.72mも変わります
いくら高速で読み出せるとはいえさすがにこの誤差は無視出来ません

高度もモデルロケット程度であれば範囲内ですが(というか誤差の範囲に入る可能性が高いですが)
ある程度高高度に上がる場合はこれでも足りないという可能性が出てきます
(ガッツリ航空法などの制限に入るのでこの高度まで飛ばすことはまれでしょうが ちなみに標高6400m以上の山は70箇所近くもあります)


そこで最近使い始めたのがSTMicroのLPS331APという気圧センサです
蛇足ですがSTMicroのMEMSセンサは累計20億個以上を出荷しているそうです

LPS331APの特徴として
1) 測定範囲が260hPaから1260hPaと広い
2) 精度が0.2hPaと高い
3) 24bitで直接気圧を取り出せるため計算が楽(ビットシフトだけで計算できる)
などが挙げられます
ほかの特徴として、ひとつのセンサでSPIとI2Cを選択できる/センサ内でサンプルの平均化ができる などがあります

欠点として最高で25Hzのため、MPL115よりもデータを得られる頻度が低いという点です
(25Hzを遅いと感じるか早いと感じるかは使う人や用途によるでしょう 僕は遅く感じます)

また、入手性は最高というわけではなく
現時点ではストリナかスイッチサイエンスから入手出来ます
スイッチサイエンスの方はどういう使い方を想定しているのか、ピンが片方に出ているため実装が面倒そうです。コネクタを使って配線を引き出すなら使いやすいかもしれませんが

測定できる範囲は高度で-1800mから12091mまで
精度は標準で0.83m MAXで1.66m程度です

更新レートはワンショットから1/7/12.5/25Hzを設定できます

割り込みなどもあり、一箇所に置いて天気予報に使うなども可能です


IFとしては一般的なI2C/SPIで接続可能ですが
センサ自体は微妙に謎な挙動を示し、書き込み可能なレジスタはほぼ全て、操作しないレジスタでも初期値を書き込まないと正常に動作しないようです
データシートを隅々まで読んだわけではないので、見落としがあるのかもしれませんが
書き込み可能なレジスタは飛び飛びで存在するので初期化がやや面倒です


気圧値を読み出すにはPRESS_OUT_XLからuint32_tとして3バイト読み出し(最上位バイトは0)
12bit右シフトすればhPaになります
ただこれでは1hPa単位となってしまうため精度が必要な場合はこの計算は使えません
リソースに余裕があるCPUであれば浮動小数点で扱ってもいいですが
32bit整数でも一旦100倍してから4096で割る等すればPa単位となりかなり高精度になります

温度を読み出すにはTEMP_OUT_Lからint16_tとして2バイトを読み出し
(読み出された値/480)+42.5
でdegCとなります
温度はやや複雑ですが、十分に整数だけで計算できるのと
少し高級なマイコンであれば掛け算や割り算もハードウェアでできるので大変ではないはずです


最後に、MPL115を擁護しておくと
このセンサは300hPa程度まで引いても壊れたりしませんでした
LPS331APはどこまで耐えれるか試していません(一応高圧には耐えられるようですが)
ただしMPL115もある程度の圧力まで下がると意味のない値になりますし
センサが破壊されていないとは限りません

2013年6月9日日曜日

ロケット搭載品を作る

今までの数少ない経験から ロケットに自分の作った電子回路を載せる時の注意点とか書く予定です

電源について

基本的に数百メートル程度のモデルロケットなら乾電池等で問題ないはずです
Ni-CdやLi-Po等も使えるはず
扱いやすさで言えば006Pとかも使えます

しかし高高度まで飛ぶ信頼性の求められる用途や特殊な環境での打ち上げの場合は乾電池やNi系/Li系二次電池は避けたほうがいいようです
この場合リチウム電池(1次電池)を選択するべきです
2CR5などのリチウム電池は-40℃から+70℃の範囲で使用することができます
特殊な場所を除いて、寒冷地などでも使用出来ます

リチウム一次電池と他の電池の違いは電解液にあります
一般的に販売されている電池は電解液に水を使っています
そのため内部が0℃以下になると電解液としての能力を失います
しかしリチウム電池の場合は融点が-40℃の溶媒を使用しているためこの温度まで使えます

リチウム電池の容量などはPanasonicの法人向けページに記載されています
http://industrial.panasonic.com/www-ctlg/ctlgj/qAAA4000_JP.html

2CR5は電池から電極が出ているためハンダ付けが容易です
ただし長さが45mmあるので小型化が必要な用途には使えません
CR-P2は2CR5より直径が少しちいさく、高さが9mmほど短くなります
ただし少し幅が広くなっています
CR-P2は電池に直接ハンダ付けする必要が有るため
容量の大きなハンダゴテで手早くする必要があります
基本的に2CR5を使用し、どうしても狭い場所に入れる必要が有る場合はCR-P2を使うなどの使い分けがいいでしょう

また電池を使用する場合 基本的に電池ボックスは使うべきではありません
一般的な電池ボックスは簡単な衝撃で電池が外れてしまいます

操作系

基本的にロケットなど高G環境にさらされる場合スイッチを使用するべきではありません
そもそも一旦飛んでしまえば手の届かない場所に行くのに
人間が操作するための部品は必要ありません
スイッチを載せる場合は少なくとも誤動作した場合にでも問題ないソフトウェアを構築してください

ただしリセットスイッチ テメーはダメだ

リセットスイッチは確実に分離しておいてください
また電源スイッチも避けるべきです
電源スイッチはリセットスイッチと同様のリスクがあります
むしろ中途半端に電圧が低下する分リセットスイッチよりも質が悪いです
絶対に電源スイッチが必要なら耐振動性のあるスイッチを使用してください

テレメトリ

飛距離数百m程度のモデルロケットであればXBeeで十分です
XBeeモジュールは一応300hPa程度まで引いても動くのを確認しました
(1個しか試していないですが)

それ以上の数km以上になると簡単に扱えるモジュールはありません
アマチュア無線等資格が必要になります

平面に移動するだけなら3G回線等が使えますが
ロケットは垂直に移動してしまうため使えません

電装系

基本的に基盤対電線の接続でピンヘッダを使うべきではありません
ピンヘッダ/ピンソケットの組み合わせは基盤対基盤に使う程度に留めておくべきです
(十分にピン数の多い/16p以上であれば対電線にも使えますが その場合はフラットケーブルを使用し圧着ピンソケットを使ってください)
基盤対電線でピン数が2本や4本程度の場合は簡単に抜けないようなコネクタを使います
JST-EHやJST-XAがいいでしょう
前者は小さなコネクタですし 後者は大きくなりますがロック機構がついています

宇宙用になると金メッキでネジ止めできるコネクタ等になりますが
弾道飛行程度であれば必要ないと思います

防水

海上で回収するようなロケットではデータを保護するために防水ケースに入れる必要があります
しかし防水は並大抵のことではなく
大丈夫だと思っても浸水していたりします
ケースはタカチ等の防水に特化したケースを使用し、加工は最小限にとどめてください
家庭用のタッパー程度では簡単にフタが外れるので避けるべきです

基盤

可能であれば基盤は外注したほうが信頼性が高く
自由度もはるかに高くなりますが
実装までやってもらうと物凄い値段になります
(1枚数万円になることも 使い捨てで使える値段ではない。。。)
ユニバーサル基板で作る場合はなるべくスズメッキ線で配線し
ジャンパワイヤは最小限に留めてください
ジャンパワイヤは曲げる力に対して多少有利だと思われますが
どの配線がどこに行くのかが掴みづらくなります
ジャンパワイヤを使う場合は種類によって色を変える等の配慮が必要です
2.54mmピッチで配線されるスズメッキ線は実装密度の点では不利ですが
簡単に目視で配線が確認できるという利点があります

部品を実装する際に
背の高い部品はなるべく寝せて基板に固定するようにしてください

キャパシタ

電解コンデンサ等は中に液体が入っているため、真空中に長時間晒されると容量抜けを起こす場合があります
電解コンデンサは基本的に使用せず、セラミックコンデンサなどを使ってください
最近のセラミックコンデンサは100uFとかも普通に売ってるので
小さめの電解コンデンサ程度の容量はあります


2013年6月8日土曜日

手っ取り早く鉛蓄電池を充電する方法

最近、遠出する際の電子機器の電源として鉛蓄電池を導入しました
前はeneloopを使ってたんだけど 鉛蓄電池のほうが楽そうなので

で、問題になったのが6V用の充電器
市販のキットとかもあるんだけど 面倒で

鉛蓄電池は(も)定電流充電で一定電圧で終了させる
という方法なので
ちょっと高性能な安定化電源で充電出来ます

最低限必要な機能がCCおよびCV
CCはControl Current
CVはControl Voltage
要は電流制限機能と電圧設定機能が必要です

僕はAD-8724Dを持っているので これを使っています

6Vの鉛蓄電池を充電する場合は
CV:1セルあたり2.25Vから2.3V もしくは2.4Vから2.5V
CC:最大0.45C
くらいが良いようです
CVに関しては 電圧が低いほど寿命が長く 電圧が高いほど容量が大きくなるようです(予想)
ただし充電電圧が高すぎると電池を痛めたり、最悪の場合は発火などもありえるので、必ず電池のスペックを超えないようにしてください
CCは1Cが電池の容量で、たとえば6Aの電池であれば0.45Cで2.7Aです
(充電電流は電池のデータシートに書いてあります もしくは電池のパッケージに書いてあります)
時間に余裕があるならCCは0.1C程度がいいかもしれません
(数Ah程度の電池であれば数百mAで充電)

接続する手順としては
1)電源装置の電圧表示で大体の電圧を設定する
2)テスターを接続し電圧を微調整する
3)電源装置のCCが最低になっていることを確認し電池に接続する(極性に注意)
4)電源装置の電流表示を見ながら調整
5)時間を測りつつ様子を見る
という感じです

手順2でテスターを使っているのは 電源装置によっては表示誤差が無視できないためです
精密な電圧表示が出来れば問題ないですが、モノによっては意外と誤差が大きいため
相手は数十Wのエネルギーの塊なので、少しでも不安要素があるなら解消しておくべきです
電流は若干安全を見た範囲で設定しておけば大丈夫です
基本的に充電終了は電圧を見て確認するので
電流値は電池を傷めない程度に設定しておけば良いはずです


鉛蓄電池を使用する場合の注意として
通常の(通気口の空いた)電池は充電/放電時に水素ガスが発生します
あまり負荷をかけない範囲での使用では問題ないですが
十分に通気性のある環境で使用してください

また、カーバッテリーは電極の付着物が車の振動で剥がれることを想定しているものがあります
このタイプを安置した状態で使用すると急激に容量が低下してしまいます
移動せずに使う場合はちゃんとそれ用の電池を使ってください
(USP用等が使えるはず)

鉛蓄電池の終止電圧は1セルあたり1.85V程度です
3セルであれば5.55V程度
スペックシートでは1.8Vで計算しているため、若干容量は減りますが
余裕を見て というか 寿命とかの関係で
若干高めです

鉛電池に限らないですが
電池の寿命は累計の放電電流でおよそ決まります
また、深い放電を繰り返した場合も寿命が短くなります
なるべく浅く、少ない電流で運用することが長寿命化の秘訣のようです


ここまで色々書きましたが、僕はあまり鉛蓄電池の運用経験が無いので
ネットから拾ってきた情報とかです

安全に運用するためには温度管理や電流管理、電圧管理が必要です
充電中の電池からは目を離さないようにしてください