JP7FKFの備忘録

ヒトは,忘れる生き物だから.

SW4STM32で実数型をsprintfするときのtips

SW4STM32で実数型の値を出したくて,実数型のフォーマット指定子である%fをいれてみたらエラーが. なんでやねんって話である. これが組み込みプログラミングらしいところで,おそらく実数型のsprintfはコードサイズが増えるため,デフォルトでは利用しないようになっているのではないかと予想する.

エラー文は下記の通り.

The float formatting support (-u _printf_float) is not enabled from linker flags

検索したところ,下記のサイトに以下のような記述を見つけた.
PrintfのFloat出力: Crescent

結論から言うとプロジェクト内のプロパティから、
C/C++ Build」->[Settings]->
[Tool Settings]->[MCU GCC Linker]->[Miscellaneous]
でLinker flagsの
「-specs=nosys.specs -specs=nano.specs」
から
「-u printf_float」
を追加して
「-specs=nosys.specs -specs=nano.specs -u
printf_float」
にすることです。

なるほど.ということでこの通りに設定をいじる. f:id:jp7fkf:20180109000457p:plain

するとめでたくコンパイルは通り,正しく実数型を扱うことができました.めでたし.

Reference

STM32マイコンでADCを使ってみる話

最近はPICよりかはSTM32を用いて電子な工作をしている. 基本的なペリフェラルとして,GPIO(論理出力/入力),ADC, PWM,Timer(割り込み),通信系(I2C,SPI,USART,I2S,CAN,USBなどなど)等がある.このうちでもセンシング等でよく利用されるのがADCであろう.秋月で簡単にチップが入手できるSTM32F042には,12bitというわりと分解能の高いADCが付いている.PICでは8bitや10bitが多い中,12bitもの分解能が得られるADCはありがたいものだ.

今回はこのSTM32のADCを利用する方法を簡単にまとめてみようと思う. 主に下記の記事を参考にさせていただいた.

STM32の少しややこしいところは,PICのようにチャネルを設定しADCをGOしてフラグが落ちるまで(ADC完了まで)待ち,データを取る.というシーケンスでチャネルを次々変えて変換すれば異なるチャンネルのADCができるというわけではないという点である.特に注意するべきがこの複数チャンネルのADCであり,これはDMAを使ってやるとかなり簡単に処理することができる.STM32でADCを利用するときはDMAの利用は必須と言えそうだ.

複数チャネルのADCについては,上記の記事でかなり詳細に紹介されているので,ここは自分が忘れない程度にざっくりと記載していく.参考にするのであれば上記の記事を参考にすることをお勧めする.

DMAを用いたADC

まずはSTM32CubeMXでペリフェラルの設定をする. ADCしたいピンをADCモードに設定する.GUIなので簡単である. f:id:jp7fkf:20180108234233p:plain

さらにconfigurationタブから,ADCのconfigは下記のようにしておく.

  • Continuous Conversion Mode: Enable
  • DMA Continuous Requests: Enable
  • Overrun behaviour: Overrun data overwritten

f:id:jp7fkf:20180108233837p:plain

さらにDMAのconfigをいじっておく.ADCからのDMAリクエストを追加して

  • Mode: Circular
  • Increment Address: Memory
  • Data width: half word f:id:jp7fkf:20180108233855p:plain ここまでできたらCubeMXを用いた設定は終了なので,コードを生成する.

ここからはSW4STM32でコードを書いて行く. 追加するべきは,初期化や変数宣言をするあたりに下記のコードを追加するだけである.

enum{ ADC_BUFFER_LENGTH = 1024 };
uint16_t g_ADCBuffer[ADC_BUFFER_LENGTH];

memset(g_ADCBuffer, 0, sizeof(g_ADCBuffer));
HAL_ADC_Start_DMA(&hadc, g_ADCBuffer, ADC_BUFFER_LENGTH);

これで,任意の場所でg_ADCBufferの中身をみてやれば各chのADC値が読み取れる.ch1とch2を使って射るのであればg_ADCBuffer[0]にch1が,g_ADCBuffer[1]にch2のADC値が入っている.

これ,ADCのconfigをOverrun behaviourをOverrun data overwrittenにしていればもっとバッファが少なくてもいい気がするけど,どうなんだろう.ちょっとバッファにどういう風に格納されるかまだ確認してないのでわからない.まぁメモリはたっぷりあるから1024くらいとって今は動かしている.考える時が来たら考えることにしようと思う.

というわけで,これだけでDMAを使ってADC値を得ることができる.ADCするためにCPUを使う必要もないし,いい感じである.CPUのリソースを有効に使える感じがする.これからもSTM32の勉強を進めて色々なモノづくりを進めてみようと思う.

References

ACS758を使ってカジュアルに電流計を作った話

電流を測りたくなったのでわりとカジュアルに電流計を作ってみた. 電流を測定するにあたって,使ったのはAllegroのACS758というもので,このうちの,ECB-200Bというモデルのホール効果を利用した電流センサを利用した. こいつは±200Aの電流を測定することができるというわりとスゴい代物.

こいつから10mV/Aの傾きでほぼリニアに測定値を得ることができる. こいつの出力電圧をADコンバータで受け,PICを使ってLCDに表示することにした.

ADコンバータはなるべく分解能の高いものを使いたい.ここで下記のような16bitでI2CなADCを用いてカジュアルに済ませることにした. こいつの特に便利なところは,差動入力が可能なところと,基準電圧内蔵なところである. ECB-200Bは,正負の電流が測定できるのだが,出力電圧にはバイアスがかかっており,そこから上下に電圧が動くことで正負電流を表現している. この動きの測定にADCの差動入力を大いに利用し,負側にECB-200Bの0点電位を与えることで,差動的に見て負の電圧(絶対的に/GND基準では正の電圧である)も上手にADC出力として表すことができ,余計なこと(バイアスを与えたり,ADC後に0点を考慮して値をオフセットしたり)をせずに簡単に出力値を得ることができるのだ.0点調整もボリュームをつけてやることで現場で0点調整を行うことができて,多少静磁場があるところでも0点を調整して測定ができる. MCP3425(16Bit ADC I2C 基準電圧内蔵)搭載モジュール

リファレンス電源内蔵で,I2Cで測定値を得ることができる代物である. これなら普通の8bitADCしか備えていない安物PICをMCUとして用いることができる.

さらにLCDには,これまたI2Cなキャラクタ液晶モジュールを用いる. 電流値を表示するだけなので8x2行で十分である.

I2C接続小型キャラクタLCDモジュール 8x2行

この2つのI2CなデバイスをPICのI2Cポートにバス接続させて動かすことにする.これならGPIOが少ないMCUが利用できる.

f:id:jp7fkf:20180108201338j:plain
(写真は誤って制作中に液晶を割ってしまったときのもの....このあと新しいのに変えました.こいつは割れやすいので気をつけないといけない.)

I2Cで値をとって表示するだけなのでPICのお仕事はほとんどない. なので安物の8pinPICであるPIC12F1822を用いる.

こいつのI2CバスにADCのICと液晶のI2Cラインをぶら下げる.

あとはADCの測定値を整形して出すだけ. 簡単だ.

ケースはタカチの単四x2の電池ボックスがついたものを使った.液晶用の穴と,陸軍端子,スイッチ用の穴を開ける. 陸軍端子と電流センサはできるだけ太い配線で結ぶ.銅板を曲げたりしても良いと思う.

電源電圧は5Vで動かしているので,単4x2だと足りない.なのでステップアップコンバータで簡単に5Vに昇圧する.こいつはカジュアルに昇圧したいときに本当に便利である.何も考えなくてもきちんと電圧を吐いてくれる.ただし電流は200mAまでなのでそこそこ電流を食わせるときには多少の注意は必要である.

PFMステップアップDC/DCコンバーター HT7750A(5個入)

f:id:jp7fkf:20180108201407j:plain

つーわけで,±200Aまで測れる電流計ができた. SANWAのそれなりのテスタで確度をざっくりみてみたけど,いい感じの値を出してくれている. ただし,ホール効果を用いている以上,周りに磁石等があるばあいは値が狂ってくる.強力な磁石を近づけると数十Aオーダーで誤差が出る.一定磁場の中ではキャリブレーション(0点調整)をすればよいが,磁場が変化する場合はこいつでは正確な測定ができないので注意をする必要がある.

なんにせよ,それなりの大きな電流がそれなりの精度で測定できる電流計を作ることができた.電池駆動なので持ち運びもできて小型に収められたので使い勝手が良い.めでたし.

References

MBPにSDカードを挿してストレージ問題を解消する話

わたしのMacBookProはMid2014な13inch retinaなやつ. もうしばらく使ってる.

私はメインPCをデータの倉庫にしてあり,そいつが最新になるように管理している. ラップトップにはそのメインPCからデータをコピーして持ち歩いている. コピーはバックアップを取る時にやるようにしてあり,メインPCで変更されたデータは,バックアップの時にラップトップにコピーされて更新される.それまでは前のデータがラップトップに入っていることになる.どうしても最新のデータが欲しい時はリモートデスクトップやらVPNやらでメインPCにアクセスしてデータを吸い出している.

基本的にデータを作ることよりも参照することの方が多いので,この方式を採用している. するとだんだんデータ量は増えて,ついに256GBなMBPのストレージを圧迫するようになってきた.

メインPCのデータを全てコピーしているわけではなく,持ち歩きたいデータを選別してコピーしているが,そのような状況だった.

macSSDを換装することも考えたが,このモデルはなかなか厳しいようである. 他にはUSB-HDDを持ち歩く方法であったり,小さいタイプのUSBメモリをさしっぱなしにしてストレージとして利用する方法などが考えられたが,私はSDカードのユニットが空いているのが気になって,そこを埋めようかと考えた.USBポートを使いたくないということもある.ただでさえ2ポートしかないのにUSBメモリさしっぱなしにすると1ポートしか使えなくて大変不便だ.

SDカードスロットに差し込むタイプのストレージとして販売されている,TrancendのJet Drive Liteなんてものもあるのだが,なんせこれが高価である.128GBで12000円ほど. 探してみると,SDカードスロットから頭が飛び出ないタイプのmicroSD->SD変換があるらしく,こいつにmicroSDを差し込んで使うことでそれなりに安価にできるのではないかという結論に至った.

ということでコイツらを買ってみた. iSlice Pro 13" MacBook Pro 13インチ Retinaディスプレイモデル (Late2012, Early2013, Mid2014, Early2015) 専用 microSDカードアダプター シルバー EAD-303ASV
Samsung microSDXCカード 128GB EVO Plus Class10 UHS-I U3対応 (最大読出速度100MB/s:最大書込速度90MB/s) Nintendo Switch 動作確認済 MB-MC128GA/ECO

f:id:jp7fkf:20171216154554j:plain
f:id:jp7fkf:20171216154621j:plain
f:id:jp7fkf:20171216154636j:plain

値段は...JetDriveLiteと比べて大して変わらないかも...と思う.でも少し安い.さらに,microSDの容量を変えたく鳴った時に気軽に変えることができるし,もしこのmacを使わなくなったとしてもデジタルカメラ等でmicroSDを継続して利用できるメリットもある.なかなか良いと思う.

ということで,ストレージが圧迫することもなくなり,ストレージのことを気にして使う必要も無くなってすこぶる快適.まだこのMBPに頑張ってもらおうと思う.私はこのマシンに愛着があるし使いやすくて好きであるから.

勉強って難しいよねって言う話

ただ考えたことを書き殴る.読み手のことは考えていない.

勉強は2段階か3段階必要な気がする.ひとつはきっかけを作り,知る勉強.
そしてそれを確かめる勉強.確かめて自信になったものが自分のものとなる.

勉強することって難しいなって思った.

そもそも勉強ってなにさということにもなるしなんだこの哲学的な感じは.

いわゆる普通のお勉強って,いくつかの段階に分かれてる気がする.

  1. 知らないことを知るということ.
    無知の知ってやつなんだろうか

  2. 知らないことを知ったときにそれを知ること.
    知らないことを知りたいって思う好奇心みたいなものであったり,ある程度貪欲な姿勢だったり,知らないことに心を惹かれるかとか. そういう動機から,自分で自主的に知りたいから知ろうとしているか,それを実行して実際に知ることができたかとか,理解できたかとか.

  3. 知ったことを確かめるお勉強
    知ろうとして知ったことが本当に正しいかどうか.複数の情報源で確かめたかとか,実験してみたかとか.

  4. 人にある程度の自身を持って教えることができるかどうか.
    これくらいできるようになると,自分がきちんと知って,理解できたなっていうことだと思う. 「学びというのは人に教えることで成就する」ということばをもらったことがある.
    今は,この考え方で生きている.

こういったことを経て,やっと自分で身についた/理解したなって思うことが多いかなと感じている.それだけ.

System workbench for STM32の.runインストーラからのインストール方法 on macOS

前にSW4STM32の.runでのインストールでつまずいて結局jarで入れたとか書いたけど,ちゃんとinstruction読んだらrunですんなりできたので報告.

Installing on MAC OSX

Warning: To run System Workbench for STM32 on MAC OSX systems, XCode is required. To download it, please refer to the Apple developper website (registration as Apple Developer is required).
The downloaded installer is an executable binary file. Your web browser might have removed the execution right of the file. Please set the execution right to the installer file (chmod 755 install_sw4stm32.run then ./install_sw4stm32.run) Launch it with /bin/bash (/bin/bash install_sw4stm32.run)

ということで

$ chmod 755 [.runファイル]
$ /bin/bash [.runファイル]

あとはウィンドウが出てくるので,適切にNEXTとかAGREEとかやってFINISH.

できちんとできてしまうのでした.取説読め案件である.

テクトロニクスのオシロスコープTDS3012Bを修理する話

テクトロニクスのオシロスコープヤフオクで入手した.
DPOなTDS3012Bである.
帯域100MHzの2ch入力品.

一応起動することは確認されて販売されていたが,到着して開封して操作して見ると,HORIZONTAL(時間軸)のつまみがおかしい.何やらどちらに回しても10sec/div等になってしまって思うように操作ができない.うまいこと操作すると(タイミングとか運による),時間軸が拡大されることもあるが,これではストレスが溜まってしまってダメである. なんとか自分で治すことができないかとチャレンジしてみた.

まずは筐体を分解する. コンセントを抜いて,まずは取っ手を外していく.マイナスドライバーで横のカバーを開けるとこんな感じ. f:id:jp7fkf:20171214140128j:plain

中央のトルクスネジを外して,左下の周り止めピンをラジオペンチ等で抜く. すると白い部品が外れてその奥の黒いパーツが回るようになる.これを抜ける位置まで回して引き抜くと取っ手が外れる.これを左右両方やる.この黒いパーツがカバーの固定も兼ねているので,これを引き抜くと外側のカバーも外せるようになる.

背面パラレルポートの下のトルクスネジを外し,コミュニケーションモジュールも取り外す. そうすると背面のカバーがすっぽりとはずれる. f:id:jp7fkf:20171214140157j:plain

勘で分解していく.まずはFDユニットを取り外す. 電源モジュールまわりのトルクスネジを外し,モジュールと接続されているコネクタを全て抜いて取り外す.フレキもあるので慎重に. するとメイン基板が見えてくる. f:id:jp7fkf:20171214140223j:plain

正面付近にあるIF基板にアクセスするためにさらに分解を進める.

液晶との接続ケーブルを慎重に外してIFパネルとのケーブルも外す. 左下の入力モジュールの部分にもトルクスネジが隠れているので忘れずに外す. f:id:jp7fkf:20171214140757j:plain

メイン基板の裏はこんなかんじ.すごい. f:id:jp7fkf:20171214140336j:plain

メイン基板が外れたところ. f:id:jp7fkf:20171214140358j:plain さらに液晶モジュールを外す. シールドと一緒になっているので注意. ここはタッピングで止まっているらしい.

そうするとIFボードが見える. f:id:jp7fkf:20171214140422j:plain このIFボードに異常があるはずだ. 正面から見て右側のコントロールパネル部と左側のボタンユニット. f:id:jp7fkf:20171214140442j:plain
f:id:jp7fkf:20171214140453j:plain
f:id:jp7fkf:20171214140526j:plain

ロータリーエンコーダのはんだ当て直し,チップまでの配線の確認とチップへのはんだ当て直し等行ったが改善せず.信号ラインに問題があるのかと紫のケーブルをチェックしたが問題なし.途中のトランジスタが死んでいるのかと検討をつけたがどうも正常のようだった.最終的にはロータリーエンコーダのチャタリングと推測した.しかしながらこのロータリーエンコーダはそう簡単に手に入るものではないように思えた.よって今回はロータリーエンコーダの信号線とGNDの間にチップセラミックコンデンサを追加しバイパスコンデンサとして動作させ,チャタリングを抑えるような対策を行った. f:id:jp7fkf:20171214140621j:plain この対策の結果,ロータリーエンコーダは正常動作するようになり,HORIOZONTAL軸が思い通りに動かせるようになった.

各種ボタン部分の洗浄等も行い,綺麗に元どおりにした. これできちんと動作するオシロスコープになった.めでたし. f:id:jp7fkf:20171214140640j:plain