Tweet

<< 2017.6 >>
[日記]
        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  

2017 年 4 月 13 日 (木)

ラダーロジックで nucleo マイコンをプログラミング

ラダーロジックで nucleo マイコンを制御してみました.

ラダーロジックとは

ラダーロジックとは,リレーの組み合わせでプログラムを記述する言語です. で,リレーというのは,スイッチを電磁石で動かす素子です. 昔はリレーで論理回路を組んだコンピュータや計算機がありましたね. 詳しくは「WikiPedia.ja:ラダー・ロジック」を参照してください.

ラダーロジックの例を以下に示します.

|    Q         R         Q    |
+---| |---+---|/|-------( )---+
|         |                   |
|    S    |                   |
+---| |---+                   |
|                             |
  • 左右の | は母線(電源ライン)
  • ---( )--- はコイル(電磁石)
  • ---| |--- は A 接点
    電磁石に電流が流れるとオンになる接点.
  • ---|/|--- は B 接点
    電磁石に電流が流れるとオフになる接点.
  • コイル・A 接点・B 接点の上の記号は変数
    同じ記号のコイルと接点でリレーを構成します.

で,上記の回路では

  • Q もしくは S が ON になると,Q の電磁石に電流が流れる
  • R が OFF になると Q に流れていた電流が切れる

ということで,論理回路の RS ラッチのような動作をします.

nucleo とは

nucleo とは,STM32 マイコンを搭載したボードマイコンです.

マイコンでの開発となると JTAG を使ってプログラムの書き込みやデバッグをするのが普通です. が,このボードには主マイコンの他にプログラム書き込み・デバッグ用のマイコンが搭載されていて,パソコンと直接 USB ケーブルでつないでプログラムの書き込みやデバッグができます.

今回はこの↑ nucleo F446RE を使いました.

このボードは,38 ピン x 2 の入出力コネクタの他に Arduino 互換のコネクタもあり,(プログラムを書けば)Arduino のシールド(ドータボード)が使えます. ただし,ロジック入出力レベルが Arduino UNO の 5V と違って nucleo は 3.3V なので,これが原因で動かないシールドもあると思います.

開発の流れ

図にすると以下のようになります.

PLC Open Editor ←→ (プロジェクト保存ファイル)
      ↓                                                   
(ST 言語プログラム)
      ↓
    matiec                                       STM32CubeMX
      ↓                                             ↓
(C 言語プログラム)    (グルーロジック)     (C 言語ソースコードツリー)
      ↓                    ↓                       ↓
       -----------------------------------------------
                            ↓
                    コンパイル・リンク
                            ↓
                  (ファームウェアバイナリ)
                            ↓
                         書き込み
  1. PLC Open Editor でラダーロジックを入力し,IEC 61131-3 ST 言語ファイルを作成します.
  2. matiec で ST 言語のファイルを C 言語に変換します.
  3. STM32CubeMX(ソースコードツリージェネレータ)で GPIO ピンを設定し,C のソースコードツリーを生成します.
  4. ラダーロジック側の C プログラムと STM32CubeMX で生成したソースコードツリーをつなぎ合わせるグルーロジックを C 言語で記述します.
  5. C ソースツリーのコンパイル・リンク
  6. ファームウェアバイナリの書き込み

初回はこのような手順になります.

入出力ピンが確定し,グルーロジックが出来上がっている状態ならば

  1. ラダーロジックの編集
  2. make 一発でファームウェアバイナリの生成
  3. 書き込み

で,ラダーロジックの修正ができます.

利用シーン

C 言語でプログラムが書けるのならば,素直に C 言語オンリーで書いた方が良いでしょう.

が,ラダーロジックの使い手は,制御対象に対して独自のノウハウを持っていることが多いようです. そのような方と共同で作業する場合は,このような開発手段も有効かと思います.

開発例

LED 点滅のラダーロジックを組んで,実際に上記の手順でファームウェアを作りました.

この記事のウケが良かったら書いてみようかと思います.

リンク

あと,この本も参考になると思います.

2017 年 3 月 15 日 (水)

ルーペあれこれ

この前までプリント基板を設計・製作する仕事をやっていた. 昔,回路設計の仕事をしていたときは 1608 のチップ抵抗ぐらいは電気スタンドの照明ぐらいでらくらくハンダ付けできたのだけど,最近はキツい.

「老眼」というやつである.

ここでムリに若者ぶってもしょうがないので,素直に文明の利器のルーペに頼ることにする. というわけで,あれこれ試してみた感想.

老眼鏡

試しに使ってみようかとダイソーへ行き,100 円老眼鏡を試着してみる.

…ダメだ,こりゃ.

私の場合,裸眼で視力 0.1 を切る強い近眼なので,眼鏡無しで老眼鏡単体だと焦点の合う距離が 10cm を切るぐらい近くなってしまう. こんな状態では作業なんかムリ.

が,眼鏡をかけてる人でも老眼鏡でイケる人もいるので,近眼の人でも使えるかどうか一度は試してみるといいかも.

眼鏡の上からかけるルーペ

通販の「ハヅキルーペ」みたいに眼鏡の上からかけられる眼鏡. amazon からこんなやつを入手.

使ってみた感想は

  • 作業する場合,全体を見渡したりするのにルーペ無しで見たくなる場合があるのだけれど,いちいち外さないとならないのが面倒
  • 作業なんかよりも,読書に向いているのかな
  • 折りたためば普通の眼鏡の大きさになるので,持ち運びには便利

外出先で作業する場合は,このタイプがあるといいのかな.

ヘッドルーペ

鉢巻にルーペが付いているタイプ. 以前,マルツで数百円で安売りしていたもの.

IMG_20170315_052804.jpg

感想

  • 鉢巻とルーペはハトメで固定されているのだが,ルーペを動かすとハトメに髪が絡まって痛いので,ハトメの内側にテープを貼ったら快適.
  • ルーペ部を上下できるので,拡大したいところにレンズを合わせられて使いやすい.
  • 上に跳ね上げれば眼鏡を通さずに全体を見渡すこともできる.
  • 鉢巻の部分がプラスチックでできているので,折りたたみはできず,持ち運びには難がある.

外に持ち運ばないような場合は,このタイプが一番使いやすいかな. もっとしっかりしたやつを買おうかなぁ.

電気スタンド一体型

電気スタンドとルーペが合体したタイプ. 私はこの型の蛍光灯タイプを購入(今は LED に切り替わっているらしい).

感想

  • 基板に黙々と部品を付けるときには使える
  • 基板を改造するのにあっちこっちひっくり返して作業するときは,ルーペが邪魔になる
  • 大きめのものを扱う場合,ルーペが届かないところが出てくる.

作業によっては使い勝手がいいかもしれません.

2017 年 1 月 27 日 (金)

緊急地震速報検出プログラムの解説

仕事のほうも少し落ち着いたので,この前公開した緊急地震速報検出プログラムの解説.

相互相関

検出の原理は相互相関です. Wikipedia の説明を読んでも「なんのこっちゃ」みたいなところも多いので,大雑把に説明すると

  • 「見つけたい信号」と「見つけたい信号が埋もれている信号」をサンプル値ごとに掛け算し,合計する
  • 「見つけたい信号が埋もれている信号」のなかに「見つけたい信号」があるときは,掛け算の合計の結果が大きくなる

という感じかな.

プログラムの公開が難しかった言い訳

緊急警報放送のチャイム音を検出する場合,上記の「見つけたい信号」にチャイム音がそのまま入ることになります. が,このチャイム音の再配布には NHK の許可が必要なので「めんどくさいなぁ」と思っていたわけです.

1ビット量子化

で,上記の相互相関の計算を1サンプルごとに行うわけなのだけど,この計算を速くするためにサンプル信号の量子化ビット数を1ビットとしています. このアイディアは,日本キャステム社の緊急告知受信モジュールから拝借しました. このモジュールの解説記事にそのようなことが書いてあったのだけど,URL どこだったかな.

積和演算

積和演算とは乗算した結果を足し合わせる計算で,相互相関で書いた「掛け算の合計」のことです.

相互相関に限らず様々な信号処理では多く出てくるので,専用命令がある CPU も多いですね. x86 の MMX や SSE,ARM なら DSP 命令セットなどにあります.

乗算

で,1ビット量子化した信号の場合

XOR 演算で掛け算が実現できる

ことになります.

1ビット量子化した信号の掛け算と XOR 演算を比べると

項1項2乗算XOR
1110
1-1-11
-11-11
-1-110

…使えそうですね. (XOR 演算の場合は -1 を 0 と読み替えて計算します)

足し算

で,足し算のほうは

XOR 演算結果のビット列で立っているビットを数える

ことで実現しています.

ビットを数える・探すアルゴリズム」のバージョン5にある,謎の演算をすることによって,32ビットのビット列の中で立っているビットの数を数えることができます.

(ただ,素直にテーブルルックアップを使ったほうが計算は速いようです)

まとめ

緊急警報放送検出プログラムでは

  • 相互相関の原理で警報音を検出
  • 処理速度を上げる小細工としては,以下のテクニックを使用
    • 1ビット量子化
    • XOR 演算
    • ビット数を数える演算(実はあまり意味がなかった)

相互相関とディジタルフィルタ

相互相関について,少し突っ込んだ話を.

緊急地震速報音の検出に使った相互相関ですが,処理を図にするとこのようになります.

  →+→+→+→+→+→+→+→+→+→ 相関値
 ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│ち│ゃ│ら│〜│ん│ち│ゃ│ら│〜│ん│ 見つけたい信号
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
 │ │ │ │ │ │ │ │ │ │
 × × × × × × × × × ×
 │ │ │ │ │ │ │ │ │ │
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ 見つけたい信号が埋もれている信号
│●│□│▲│○│■│△│●│□│▲│○│←●□▲○■△…
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
 ↓
 捨てる

なんとこれはトランスバーサルフィルターという,ディジタルフィルタと同じ処理になっています.

そこで,相互相関処理をトランスバーサルフィルタとして見てみると

「ちゃら〜んちゃら〜ん」をフーリエ変換したのと同じ周波数特性を持つフィルタ

と見ることができます.

実際,相関値を音声として再生してみると

  • 普段は入力音声が小さくなってもぞもぞとした音が出力
  • チャイムが鳴り始めると徐々に大きな音が出力される

というように聴こえます.

こういう,紙の上の理屈を音声として体験するというのも面白いものです.

お試しあれ.


RSS

http://jr0bak.homelinux.net/~imai/pukiwiki/pukiwiki.php?cmd=rss&ver=1.0 で RSS を取得できますが,Wiki 全体の RSS になってしまいます. 細かいことは気にしないでね.

リンク

この日記へのリンクはご自由にどうぞ.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-05-05 (火) 06:10:37 (2971d)