2018年 1月 の投稿一覧

無線機器の技術基準適合証明と工事設計認証

無線機器を作って世に出す場合、電波法という法律を守る必要があります。

そして、それは「守ってるよ!」と自己主張すればいいというものではなく、きちんとデータを揃えて提出しないといけません。

普通はやり方がわからないので、試験機関に協力してもらってデータを揃えて提出することになります。

 

今回は無線設備の申告方法についてちょっと書きたいと思います。

それには大きく2つあります。

 

◯技術基準適合証明

実際の製品を試験機関で測定or測定データを用意して申告する方法です。

製品が100台あったら100台すべてのデータを用意して提出する必要があります。

一見面倒ですが、台数が少ない場合はこちらが簡単です。

 

◯工事設計認証

1機種に付き1台のデータを用意or試験機関で測定して申告する方法です。

100台でも1000台でも、データは1台分でいいです。

大量に作る場合はこちらほうがいいですが、その1台と同じように他の機器が製造されることを保証しないといけません。

なので、台数が少ない場合は全社の技術基準適合証明のほうが簡単です。

 

とこのように二つの方法があります。

 

以上、小田切でした。

GPIOで流せる電流っていくつ?

GPIOで流せる電流は気になりますよね。

大きければそのままLEDなどを駆動できますが、小さければトランジスタなどが必要になります。

もちろんLEDだけでなく、なにを繋げる場合でもGPIOも駆動能力はとても重要です。

 

しかし、これがなかなかデータシートで読みにくいんです。

「GPIOの電流はいくつまで流せます」と明確に書いてないことが多いです。

 

時々、絶対最大定格に「MAX~~」と書いて有る場合もありますが、絶対最大定格は「これ以上やると壊れる」と言っているだけであって、それだけ流せると保証しているわけではありません。

データシートを読んでいっても、なかなか見つかりません。

実はどこに書いてあるかというと、「DC Characteristics(DC特性)」に書いてあります。

どう書いてあるかというと、「VOH @ 4mAの電圧はxx-xxV」という書き方がしてあります。

つまり、「◯mA引ける」という書き方ではなく「4mA引いた時に何ボルトになる」という書き方をしています。

GPIOにかんして電流の記述があるのはここだけですので、これを参考にするしかありません。

2mA流したときの特性しか書いてなければ最大2mA、20mA流したときの特性が書いてあれば最大20mAということです。

もちろん、そこで書いてある電圧も重要です。

「3V、8mA以上必要な回路」に対して「8mA引いたときの電圧が2.3V~」というGPIOじゃ駆動能力足りませんからね。

 

ということで、GPIOの電流が知りたければDC特性を見てみてください。

 

以上、よろしくお願いいたします。

CPUの内蔵プルアップ・プルダウン抵抗ってなに?

CPUから出ている各ポートにたまに内蔵プルアップ抵抗やプルダウン抵抗がある場合があります。

プルアップ抵抗・プルダウン抵抗は、普通回路を引く側がCPUの外側につけるものです。

なんで、内蔵されているんでしょうか・・・?

 

実はこれは2パターンあります。

 

◯「つけるに決まっている抵抗を先につけておきます」パターン

例えば、RESETピン。

これはLOWになるとリセットされますので、通常はHIGHにしておかないといけません。

もし外側に抵抗がないとRESETピンはHかLかどちらになるか予測がつきません。

ということで、安全を見込んで中でプルアップ抵抗がついていることがあるんです。

ほかにも、JTAGなどデバッグで使用されるピンはプルアップ・プルダウンが決まっているので、最初からCPU内に内蔵されていたりします。

 

◯「プルアップ抵抗やプルダウン抵抗のコストを削減しましょう」パターン

さらに一歩進んで、プルアップ抵抗やプルアップ抵抗の両方が内蔵されていて、プログラムで有効・無効を切り替えることができるCPUがあります。

こうなると、UART_RXDのプルアップなどを(原理的には)削除できるので、外付け抵抗をかなり減らすことが出来ます。

小規模な回路だと基板が小さかったりするので、抵抗を減らせるととても部品配置がしやすくなります。

 

と、こんなふうにプルアップ・プルダウンひとつとっても、いろいろ工夫されています。

 

以上、小田切でした。

CPUの割り込みって何?

CPUの割り込み(interrupt)という言葉がよく出てきますが、割り込みってなんでしょうか。

これはプログラミングの上で必要な知識なのですが、Windowsアプリケーションのようなものを作っている人にはあまりピンとこないと思います。

ある意味組み込み独特の概念かもしれません。

 

基本的にCPUはなにか処理を一生懸命やっているわけですが、その間にも周辺機器が通信をしたりAD変換したりいろいろやっているわけです。

他にもポートを監視したりもあります。

割り込みというものがないとどうなるかというと、CPUのメインルーチンの合間合間に「周辺機器の状態チェック」を入れないといけなくなります。

例えば、通信が終了したら1ms以内になにかしないといけないとしましょう。

そうすると、CPUのメインルーチンの中に1msの間隔で「通信終了チェック」という処理をしないといけなくなります。

考えてみればわかると思いますが、プログラムのあちこちに「通信処理チェック」を書くことになるので、プログラムが恐ろしく汚くなります。

その上、バグの原因にもなります。

さらにプログラムの実行速度が低下します。

周辺機器はたくさんあるので、すべての周辺機器の監視を短い間隔でやろうとするとCPUはほとんど他の作業ができなくなってしまうわけです。

 

そこであるのが「割り込み」です。

割り込みは「あるイベントが発生した時にこのサブルーチンを読んで欲しい」と登録しておく仕組みです。

これがあるとCPUはメインの処理に集中できます。

メインルーチンのあちこちに「周辺機器チェック」を書く必要もなくなります。

例えば、「UART通信が完了したらAというサブルーチンを読んで欲しい」と登録すると、

メインルーチンを処理している途中でUART通信が終了すると、メインルーチンの処理が停止して勝手にサブルーチンに移動します。

そしてサブルーチンが終わると何事もなかったかのようにメインルーチンに戻ってきます。

・CPUが余計なチェックしなくていいので処理が速い

・プログラムが汚くならない

・即座にサブルーチンが呼ばれるので、イベントに即時対応ができる

といいことずくめで、すばらしいのです。

 

このように割り込みというのは偉大な機能なんです。

 

以上、小田切でした。

CPUのスタンバイとかスリープってなんだ?(初心者向け)

CPU(MPU)には、スタンバイだとかスリープという機能があります。

言葉だけでもなんとなく、

「省電力の機能かな?」

と想像つくかもしれませんが、詳細はよくわからないという人が多いと思います。

 

まず、組み込みCPUもパワフルなCPUもそれなりに省電力の機能があります。

そして、それが特徴になっているCPUがあるくらいに、バリエーションが有ります。

「CPUを完全に止めて周辺機器だけ動かせます!」

「CPUも周辺機器も止めて、時計機能だけで動かして、一定間隔でCPUを起こすことが出来ます」

ぐらいは基本なので大抵のCPUができます。

変わったものになってくると、

「タッチセンサー機能だけを動かして、タッチセンサーを検知したらCPUを起こすことが出来ます」

「アナログ入力でCPUを起こすことが出来ます」

「電波で(ry)

みたいなものもあったりします。

 

すべてのCPUの説明なんてできないので、どのCPUでも大抵サポートしている機能について説明します。

 

・周辺機器の有効・無効

たとえば、音声の出力機能などの機能がついているとしても、それを有効・無効を切り替えられるのが普通です。

無効にすることでそのぶんの電力を節約できます。

大抵のCPU(MPU)内蔵周辺機器は無効にして電力節約できるものです。

 

・クロックの変更

水晶振動子などで生成したクロックをCPU内で倍率をかけて使用しています。

なので、倍率を変更することでCPUの速度を低速にすることが出来ます。

電力は速度(クロック数)に比例するので、これで簡単に電力落とせます。

 

・スリープ(SLEEP)

CPUのクロックを完全に止めてしまうので、CPUが完全に動作停止します。

外部からの割り込みか、内蔵周辺機器からの割り込み(時計機能など)で復帰します。

メモリは保持されます。

 

・スタンバイ(STANDBY)

CPUのクロックを完全に止めた上に、メモリ・レジスタまで全部消えます。

通電しているものの、ほとんど電源OFFと大差ない状態になります。

究極の省電力ですが、復帰後にプログラムを一から走らせないと駄目なので即座に復帰することが出来ません。

 

これぐらいを把握しておいて、あとはCPUごとのデータシートを参照するとだいたい分かるかと思います。

 

以上、小田切でした。

そもそもGPIOってなに?(初心者向け)

いままで説明で「GPIO」という言葉を普通に使っていましたが、初心者だと

「そもそもGPIOってなに?」

だと思いますので、今回簡単に説明したいと思います。

 

GPIO=General Purpose Input/Output

汎用のインプット・アウトプットです。

CPUには電源ピンやJTAG用・専用機能のための特殊ピンも多いですが、それ以外のほとんどはこのGPIO用のピンとなっています。

 

CPUのほとんどのピンがGPIOということからも、このGPIOが如何に重要なものかと分かるかと思います。

 

このGPIOは何ができるのでしょうか。

まず、入力と出力の機能があって、その機能は切り替え式です。

 

出力機能:

HIGH(ほぼ電源電圧)を出す。

LOW(ほぼ0V)を出す。

 

入力機能:

入ってきている電圧がHIGH/LOWのどちらかを判別する。

 

これだけです。

「これだけでなにができるんだ??」

と思うかもしれませんが、実はこれでなんでもできるんです。

 

出力にしてそのさきにLEDをつなげれば、LEDを点灯・消灯できます。

出力にしてそのさきにトランジスタなどをつなげれば、大電力が必要なモーターもコントロールできます。

もっといえば、高度な機能がないIC類、例えばモータードライバだとか電源ICなんていうのは、そのICのピンをHIGHにするかLOWにするかだけで動作ON・OFFが切り替わりますので、このGPIOだけで制御できてしまうわけです。

そういったICは状態出力もHIGH・LOWだけなので、それを入力モードにしたGPIOで受ければCPUで状態を判定できるわけです。

デジタル出力のセンサーとかも入力モードのGPIOで受ければいいわけです。

 

基本的にはデジタル回路はHIGH・LOWだけなので、実はこのGPIOだけで(原理的には)すべての事ができるんです。

ただし、GPIOでも(原理的にはできるけど)実際にやろうとすると難しいこともあります。

例えば、通信です。

UARTやSPIやI2Cなどの通信プロトコルは、CPUにその周辺機器が乗っていれば「◯◯のデータを送ってね」というだけで、周辺機器が勝手にデータを送ってくれて、送信が終わったら「送信終わったよ」と周辺機器が教えてきてくれます。

しかし、これをGPIOでやると、プログラムで全部操作しないといけないので、

「クロックのポートをHIGH出力にして、データ送信のポートをnbit目の状態にして、そして?us待ってからまたくクロックのポートをLOW出力にして・・・」

ということを全部やらないといけません。

これをやると、無理矢理なので遅い・CPUが他のことが出来ないという問題があるので、普通はこんなことはやりません。

(世の中にはGPIOで通信機能を実現しているものもないことはないです。特殊例ですが)

 

とまぁ、原理的にはデジタル系のことはなんでもできますが、唯一通信機能は苦手ということです。

逆に言うと、それ以外はほとんどなんでもできるので、これがないとなにもできません。

 

以上、小田切でした。

不揮発性メモリ、EEPROMとFLASHの使い分けは?

不揮発性メモリとして、EEPROMとFLASHメモリがあります。

最近ではソケットを設けてSDカードを使用したり、SDカードと電気的に互換があるeMMCというものを使う場合もあります。

まぁ、SDもeMMCもFLASHメモリなので、最終的には「EEPROMかFLASHメモリか」という問題に行き着きます。

電源を切っても保存しておきたいデータ、どっちに保存します?

 

答えは、データサイズと書き換え頻度によります。

 

まずEEPROM。

これは数kB~数十kB程度のラインナップが多いです。

EEPROMで数十Mなんて一般的ではありません。

容量は小さいのですが、1バイト単位または64バイト単位などで読み書きできます。

つかり、小回りがきくのです。

ちょっとしたデータ「MACアドレス」「設定値」みたいなものをEEPROMに入れる場合があります。

安くて、容量が小さくて、数バイト単位で書き換えができて便利だからです。

 

次、FLASHメモリ。

これはSDカードなどでわかるように、128GBみたいなどでかいサイズまであります。

容量は圧倒的ですが、小回りがききません。

基本的に読み書きは512バイト単位が一般的です。

1バイト書き換えるだけでも、

「512バイトをRAMに転送」→「CPUでRAM上のデータ編集」→「RAMからFLASHに512バイト転送」

という手順が必要になります。

しかも、実際にはFLASHメモリの中のブロック単位が512kBという場合もあるので、

外から書き込むのは512バイトでも、中ではメガ単位の読み書きが発生していることが有ります。

ということで、「書き込むとまれにすごく待たされる」ことがあったりします。

さらに、SDやeMMCではなくNANDFLASHをそのまま使うと、エラー訂正などをCPU側で処理する必要が出てきます。

ということで、大きなデータを保持するときにはFLASHを使用します。

 

こんな雰囲気でございます。

 

以上、小田切でした。

CPUのPORってなんのこと?

CPUにはいろんな用語が頻出します。

その中でもパット見わかりにくい単語「POR」。

これなんでしょう。

 

これは

Power  On Reset

の略語です。

 

読んで字のごとく、「電源ONリセット」です。

 

これの説明の前に、リセットの説明をしないといけません。

CPUをリセットするとすべてのレジスタに初期値が代入され、いつでも同じ状態になります。

つまり、いつどんな時でもリセットすれば「初期状態」になるわけです。

この機構があるからプログラムが正常に動作するのです。

毎回状態が変わっていたらプログラムの動作状況が変わってしまいます。

そのため、CPUの動作を開始する前には必ずリセットを掛けないといけません。

 

で、そのリセットをかけるためにはリセットピンを制御しないといけません。

通常、リセットピンはLにすることでリセットがかかりますので「電源を入れた後にリセットピンをLにして、しばらくしてからHにする」という動作が必要になります。

つまり、CPUとは別にリセットピンを制御するための機構が必要になります。

これはコンデンサや抵抗・ロジックICなどを組み合わせて作ることも出来ますし、専用のICを使うことも出来ます。

 

……でも、面倒だし、余計な部品が必要でコストも掛かるのでいやなんです。

ということで、最近のCPU(MPU)には、たいていPower On Resetという、電源がONになったら自分でリセットしてくれる便利な機能が入っています。

これですと、上記の回路が不要になるので楽なんです。

ただし、「POR」がないCPU(MPU)も世の中にはあります。

 

ということで、データシートを見るときにはPORをチェックしましょう。

ないと……ちょっと面倒ですよ。

 

以上、小田切でした。

長距離通信でよく使用される伝送方式

長距離通信(数メートル以上)になると、基板内で使用している通信方式(SPIなど)は完全に使用できなくなります。

というのも配線が長くなると配線に寄生容量が付いてしまって、大きな寄生容量を考慮していないこういった方式はアウトなわけです。

さらにノイズとかも問題になります。

(十分に配慮すれば使えるかもしれませんが、普通にやると問題出ます)

 

ということで、長距離通信では違う方式が使用されます。

基本的に工業チックなところで使用されるものを3つ紹介します。

 

◯RS-232C

昔はPCにもついていたアレです。

じつは今でもよく使います。

シングルエンド方式です。

 

◯RS-422

RS-232Cと違って、差動信号を使用します。

これにより、同相ノイズにより強くなります。

ただし、RXDに2本、TXDに2本使うので4本以上の信号が必要です。

 

◯RS-485

これも差動信号で伝送しますが、信号線が送受信共通になっていますので、

DATA+とDATAーの二本だけで双方向通信できます。

長距離配線すると配線も大変なので、RS-422よりRS-485のほうが好まれます。

送信も受信も同じ線を使うので、原理的にRS-422より速度が半分になりますが、それが問題なることはほとんどありません。

 

とまぁ、この3つ辺りを紹介しておきます。

ぶっちゃけると、このキーワードと「雰囲気」だけ知っておけば大丈夫です。

「へぇ、そんなものがあるんだ」と。

あとは実際に使う時に調べると、メーカなどで詳細説明資料を配っているのでそれを読めばOKです。

 

以上、手抜きな小田切でした。

基板内で主に使用される通信方式

ICや機器同士の通信にはさまざまな通信が使用されますが、とりあえず今回は基板内の通信に使用されるものを紹介したいと思います。

要は長距離通信を想定していない通信方式たちです。

 

ちなみに、これも初心者にはわかりにくいんですがどれも厳密に仕様があってそれを守っているようなものではありません。

「I2C」と言っても、実際に使われているのは「I2Cっぽいもの」です。

(CPUによっては「実質I2C」なのに「I2C」とすら呼ばれていない場合もあります)

元々どこかのメーカが開発した方式を真似して他社も使うようになった方式ばかりなので、いろいろ権利関係が微妙なんです。

まぁ、「っぽいもの」でも実際動くので問題ないんですが。

 

◯I2C

DATA線である「SDA」、CLOCK線である「SCK」の2線で通信できる便利なやつ。

マスターとスレーブがSDA信号を互いに使うことで、これだけで双方向通信できます。

さらに、マルチスレーブ接続もできる。(スレーブはアドレスで指定して通信するので、別のCEピンが不要)

いい事だらけに見えますが、通信速度が遅いです。

最大400kbpsです。

 

◯SPI

CLOCK「SCK」、MASTER→SLAVE「MOSI」、SLAVE→MASTER「MISO」と、スレーブのイネーブルを制御する「CE」の4線で通信する方式。

I2Cと違ってとても速い。

ICによりますが、10Mbps以上で通信することもできます。

 

◯UART

「TXD」「RXD」の2線を使う通信方式。

クロックがないので、お互いに通信速度を設定してから通信する必要がある。

これはクロック同期がないのであまり速く出来ません。

普通は速めでも115kbpsぐらいです。(特殊な場合にそれ以上速いこともありますが)

 

◯SD I/F

SDカードで使用されている通信方式。

DATA0-3,CLOCK,CMDの6線を使います。

データ転送が4bit幅なので速いです。

ICの対応規格によりますが、50Mbpsとか出ます。

主に通信IC(WiFiとか)とCPUの通信で使用されます。

 

とまぁ、ざっくりこんなものが頻出します。

それぞれの規格の詳細はいつかそのうち・・・。

 

以上、小田切でした。