人に聞けない痔の悩み、これでスッキリ >>

Arduino UNOにシールドを乗っけて電圧をアナログピンで測っているのですが,
シリアルモニタに表示される値に謎のノイズ?が乗ります.
でもノイズだったら+と-どっちにも触れそうなものなのに,
たまに+側に揺れるだけというのもよくわかりません.

一応パスコンを挟んだり移動平均取ったりしても改善されなくて,
最終的にシリアル通信するときの値の表示がおかしいのか?ってなったのですが
なにか,こういう原因じゃないのか?とか改善案とか,教えて頂きたいです.

ふわっとした質問でごめんなさい.
ご回答よろしくお願いします.

A 回答 (2件)

A/D変換は電源電圧(5V or 3.3V)を基準電圧(最大値)として変換が行われます、電源電圧が低下するとA/D変換値が上昇します



USB電源は容量が少ないので、電圧が負荷により不安定になりがちです、容量のあるACアダプタを使用したほうが良いと思われます

又はA/D変換中は外部機器を止めて電源電圧変動を少なくして下さい

またCPUの動作を止めてA/D変換を行うと、CPU自体のノイズを減らすことが出来ます。
データーシート24.6雑音低減機能 参照
http://www.avr.jp/user/DS/PDF/mega88A.pdf


見当違いかも知れませんが参考にして下さい。
    • good
    • 0
この回答へのお礼

やはりUSB電源では安定しないですか・・・
前回の質問に引き続き,ご丁寧にありがとうございました.
ACアダプタの購入を検討します.

お礼日時:2014/11/24 11:30

> たまに+側に揺れるだけ


http://arduino.cc/en/Main/arduinoBoardUno
のページに書いてある通りではないのでしょうか?

ページの中ほど:
> By default they measure from ground to 5 volts
マイナスを検出するようになっていないだけ。→ +しか出ない。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます.
+側にしか揺れない,というのは,
0[V]以上の電圧を測定している時に値がたまに少し大きめに出るということでして,
小さめに出ることが無い,という意味というかなんというか・・・
説明が分かりづらく申し訳ございませんでした.
おそらく原因は別に回答を頂いたUSB電源の不安定さのため,
参照電圧が下がってしまうからということだと思われます.

お礼日時:2014/11/24 11:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QA/Dコンバーターのノイズ対策について(マイコン)

PICプログラムを楽しんでいる初心者です。

ある本で、18ビットのI2C制御A/Dコンバーターを使ったハードウェアの説明をしているのですが、
その本では、マイコンのI2Cピンを5.1kΩの抵抗でプルアップし、A/Dコンバーターとの間には
ノイズ対策のため、さらに330Ωの抵抗を直列に挿入していると書かれています。

どうして、330Ωの抵抗を直列に挿入することでノイズ対策になるのでしょうか?
また、A/Dコンバーターは入念なノイズ対策が必要なのでしょうか?

詳しい方、すみませんが教えてください。
よろしくお願いします。

Aベストアンサー

>どうして、330Ωの抵抗を直列に挿入することでノイズ対策になるのでしょうか?

抵抗によりノイズの伝達が抑制されるからです。
配線容量や寄生容量と共にCRフィルタが構成され、高周波ノイズに効きます。
もちろん正規信号にも多少なりとも影響が出るので、
この値や方法がどんな場面でも使えるわけではありません。


>また、A/Dコンバーターは入念なノイズ対策が必要なのでしょうか?

A/Dコンバータに限らずノイズが乗って邪魔なら対策が要るし、
A/Dコンバータであっても変換方式や分解能によっては対策無用な場合もあります。
要は「A/Dコンバータだから」でなく
「信号と区別できないノイズが載る可能性があって載るとまずい時」に対策します。

使途が確定してない汎用品とか勉強用装置ならこの限りではありませんが。

信号内容によってはソフトウェアが「これは正規信号でない」と区別できるなら
ハードウェアでなくソフトウェアで除去する事もあります。

分解能 18bit だと 約256k 段階の電圧を表せるので、
基準電圧が2.5Vとすると 1ステップが 約 0.01mV という数値になります。
種類によりますがノイズは 0.01mV なんて小さい数値ではないので、
無体策では小さな信号がノイズに埋もれてしまい、
信号を測定してるつもりが全部ノイズだった、なんて状況も発生します。


入念って言いますがここではプルアップ抵抗と直列抵抗だけでしょ...

>どうして、330Ωの抵抗を直列に挿入することでノイズ対策になるのでしょうか?

抵抗によりノイズの伝達が抑制されるからです。
配線容量や寄生容量と共にCRフィルタが構成され、高周波ノイズに効きます。
もちろん正規信号にも多少なりとも影響が出るので、
この値や方法がどんな場面でも使えるわけではありません。


>また、A/Dコンバーターは入念なノイズ対策が必要なのでしょうか?

A/Dコンバータに限らずノイズが乗って邪魔なら対策が要るし、
A/Dコンバータであっても変換方式や分解能によっては対策無...続きを読む

QPWM信号をアナログ信号に変換する方法

PWM信号をアナログ信号に変換するための回路を教えてください。ここでのPWM信号の例は、デューティ比の分解能が10bit(4096段階)で周波数は488Hz、すなわち分解能の周波数は2MHzです。この信号を例えば0~5Vのアナログ信号に変換したいのです。よろしくお願いします。

Aベストアンサー

LPFのパラメータ設定
大雑把に言えば、
・PWMされた元の信号成分を透過させて
・エイリアス成分(488Hz-元信号の周波数)を所定の量以下にまで減衰している
ようなフィルタを入れる、
ということになります。
例えば、PWMされた元の基準信号が20Hzまでの信号を持っていて、ノイズ成分を0.1%程度(電圧分解能程度)以下に押さえたいとなると、
・カットオフ周波数は、若干の余裕を見て30Hz
・エイリアスは488-20=468Hz程度で、カットオフ周波数の15倍。これを1/1000(-60dB)にまで減衰できるフィルタ
となると、4次のLPF(オペアンプ使った2次のフィルタを2段)
といった具合になるかと。

元の信号が244Hzに近い成分まで含んでいる場合にはLPFだけで処理するのは難しくなりますので、#3さんの回答に有るように、積分回路使って、階段状の波形に成型した後にLPFをかけるとか、
#5さん回答の中にあるように、一旦デジタルデータに戻して、再度DA変換しなおす といった処理をしたほうが良いかもしれません。
(積分回路使う方法だと、条件(積分の後にサンプルアンドホールドを行う期間が取れないときなど)によっては、積分回路を2系統用意して、アナログスイッチで交互に切り替えて使う といった工夫が必要になるかもしれません。)

参考書籍、URLはちょっと調べてみないと、、、。
(LPFの設計については、電子回路、オペアンプ関連の書籍に、オペアンプの仕様(カットオフ周波数とか次数)決定は信号処理関連の書籍にかかれているとは思いますが。)

LPFのパラメータ設定
大雑把に言えば、
・PWMされた元の信号成分を透過させて
・エイリアス成分(488Hz-元信号の周波数)を所定の量以下にまで減衰している
ようなフィルタを入れる、
ということになります。
例えば、PWMされた元の基準信号が20Hzまでの信号を持っていて、ノイズ成分を0.1%程度(電圧分解能程度)以下に押さえたいとなると、
・カットオフ周波数は、若干の余裕を見て30Hz
・エイリアスは488-20=468Hz程度で、カットオフ周波数の15倍。これを1/1000(-60dB)にまで減衰できるフィルタ
となると...続きを読む

Q可変抵抗器には何故足が3本あるのでしょうか?

基本的な部分で理解できません。

Aベストアンサー

http://www.ops.dti.ne.jp/~ishijima/sei/letselec/letselec7.htm

両端の抵抗値は変わりません。両端と中心の端子の間の抵抗値が変わるようです。


+----+----+
4Ω 4Ω
両端は8Ω 中心と両端は4Ω4Ω

可変抵抗をまわして左にする
++--------+
0Ω 8Ω
両端は8Ω 中心と両端は0Ω8Ω

可変抵抗をまわして右にする
+--------++
8Ω 0Ω
両端は8Ω 中心と両端は8Ω0Ω

Qプルアップ抵抗値の決め方について

ほとんどこの分野に触れたことがないので大変初歩的な質問になると思います。

図1のような回路でプルアップ抵抗の値を決めたいと思っています。
B点での電圧を4.1Vとしたい場合について考えています。その場合、AB間での電圧降下は0.9Vとなります。

抵抗値×電流=0.9Vとなるようにプルアップ抵抗の値を決めるべきだと考えていますが、この抵抗に流れる電流が分からないため、決めるのは不可能ではないでしょうか?

抵抗値を決めてからやっと、V=IRより流れる電流が決まるため、それから再度流れる電流と抵抗を調節していって電圧降下が0.9Vとなるように設定するのでしょうか。どうぞご助力お願いします。



以下、理解の補足です。
・理解その1
ふつう、こういう場合は抵抗値を計算するためには、電圧降下と抵抗に流れる電流が決まっていることが前提だと考えていました。V=IRを計算するためには、この変数のうち2つを知っていなければならないからです。
また、例えば5V/2Aの電源を使った場合、マイコン周りは電源ラインからの分岐が多いため、この抵抗に2A全てが流るわけではないことも理解しています。

電源ラインからは「使う電流」だけ引っ張るイメージだと理解しているのですが、その「使う電流」が分からないため抵抗値を決定できません。(ポート入力電流の最大定格はありますが…)


・理解その2
理解その1で書いたように、抵抗値を計算するためには、電圧降下と抵抗に流れる電流が必要だと理解しています。図2を例に説明します。Rの値を決めたいとします。
CD間の電圧降下が5Vであることと、回路全体を流れる電流が2Aであることから、キルヒホッフの法則より簡単にRの値とそれぞれの抵抗に流れる電流が分かります。今回の例もこれと同じように考えられないのでしょうか。

ほとんどこの分野に触れたことがないので大変初歩的な質問になると思います。

図1のような回路でプルアップ抵抗の値を決めたいと思っています。
B点での電圧を4.1Vとしたい場合について考えています。その場合、AB間での電圧降下は0.9Vとなります。

抵抗値×電流=0.9Vとなるようにプルアップ抵抗の値を決めるべきだと考えていますが、この抵抗に流れる電流が分からないため、決めるのは不可能ではないでしょうか?

抵抗値を決めてからやっと、V=IRより流れる電流が決まるため、それから再度流れる電流と抵抗を調...続きを読む

Aベストアンサー

NO1です。

スイッチがONした時に抵抗に流れる電流というのは、最大入力電流や最大入力電圧
という仕様から読めば良いのでしょうか。
→おそらくマイコンの入力端子の電流はほとんど0なので気にしなくてよいと思われます。
入力電圧は5Vかけても問題ないかは確認必要です。

マイコンの入力電圧として0Vか5Vを入れたいのであれば、抵抗値は、NO3の方が
言われているとおり、ノイズに強くしたいかどうかで決めれば良いです。
あとは、スイッチがONした時の抵抗の許容電力を気にすれば良いです。
例えば、抵抗を10KΩとした場合、抵抗に流れる電流は5V/10kΩ=0.5mAで
抵抗で消費する電力は5V×0.5mA=0.0025Wです。
1/16Wの抵抗を使っても全く余裕があり問題ありません。
しかし、100Ωとかにしてしまうと、1/2Wなどもっと許容電力の大きい抵抗を
使用しなければいけません。
まあ大抵、NO3の方が書かれている範囲の中間の、10kΩ程度付けておけば
問題にはならないのでは?

Qユニバーサル基板の切断方法

車のLEDルームランプを自作するための部品としてサンハヤトのICB-96と言う型のユニバーサル基板を購入しましたが、
どうやって切断するのか分からず基板の加工が全くできません。
材質は紙フェノールと言うものらしいんですが結構硬いです。はさみでは割れてしまい、カッターでは歯が立ちません。

どんな工具を使えば切断できますか?
自分なりに調べるとHOZANの基板カッターやサンハヤトのハンドカッターなどが出てきたんですが予算を大幅にオーバーして買えません。

http://www.sunhayato.co.jp/products/details.php?u=82&id=07002

Aベストアンサー

私はカッターナイフと金属定規と紙ヤスリを使っています。
 (1) ユニバーサル基板をカッティングマット(http://minkara.carview.co.jp/userid/202348/blog/3135001/)の上に置く。
    カッティングマットはカッターナイフで机を傷つけないようにするものなので、下地に傷がついてもいいのなら不要です。
 (2) アルミやステンレスでできた定規(直線部分があるなら定規でなくてもいい)の直線部分をユニバーサル基板の穴列と平行になるように置く。
 (3) 定規が動かないようにしっかり押さえながら、ユニバーサル基板の穴列の中心に沿ってカッターナイフで何度も傷をつける(怪我をしないように充分気をつけてください)。カッターナイフの傷は基板の端から端まで入れてください。
 (4) 傷の深さがユニバーサル基板の厚さの1/3程度にまで達したら、一方を万力に挟むか、あるいはラジオペンチを使って基板を割る。
 (5) そのままでは切断面が凹凸になっていて汚いので、穴列がなくなって滑らかになるまで、切断面を紙やすりで研磨する。
     このとき、平坦な面に紙ヤスリを置き、基板を紙ヤスリ面に垂直に立てた状態で研磨するといいです。
 (6) 同じ紙やすりで研磨面端を軽く面取りした後、水道水で基板についた研磨粉を洗い流し、乾いたタオルで水をふき取る。

私はカッターナイフと金属定規と紙ヤスリを使っています。
 (1) ユニバーサル基板をカッティングマット(http://minkara.carview.co.jp/userid/202348/blog/3135001/)の上に置く。
    カッティングマットはカッターナイフで机を傷つけないようにするものなので、下地に傷がついてもいいのなら不要です。
 (2) アルミやステンレスでできた定規(直線部分があるなら定規でなくてもいい)の直線部分をユニバーサル基板の穴列と平行になるように置く。
 (3) 定規が動かないようにしっかり押...続きを読む

Q抵抗の1/2W、1/4Wの違いについて

 クルマのLED工作で抵抗を使おうと思っています。

 その時 抵抗には、〇Ω以外にも
1/2W、1/4W等の規格があるのですが、よくわかりません
調べてみたところ<電力消費>という
キーワードが分かりましたが他がサッパリ・・・・

・例えば (+)1/4W 430Ω LED (-)という場合
抵抗を 1/2W 430Ωでは、ダメなのですよね?
 1/2Wの場合 〇Ωになるのでしょうか?

・また、1/2W、1/4Wは、単純に大きさ(太さ、長さ)で
判別がつくのでしょうか?

Aベストアンサー

抵抗が焼ききれずに使用できる or 性能を保証できる電力です。

例えば1kΩの抵抗に24Vの電圧を与えると、抵抗はP=V*I=(V^2)/R=0.576Wの電力を熱として消費します。
1/2W抵抗は0.5Wまでしか持たないので1W抵抗を使用することになります。
一瞬でも定格を越えるとダメなので、通常は余裕を持って考えます。

>・例えば (+)1/4W 430Ω LED (-)という場合
>抵抗を 1/2W 430Ωでは、ダメなのですよね?

定格を満たしているため問題ありません。

>・また、1/2W、1/4Wは、単純に大きさ(太さ、長さ)で
>判別がつくのでしょうか?

大抵の場合大きさで分かります。長さも太さも違います。
同一シリーズであれば確実にワット数の大きいほうがサイズがでかいです。
(1/2W>1/4W)

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1314083328

QC# シリアル通信でデータ受信時の欠損について

Visualstudio 2013 を使用して C# で開発を行っています。

SerialPort Classを使用してデータの送受信をするプログラムを作成しているのですが、
非同期でデータを受信する際にどうしてもうまくデータを取得出来ません。

5Byteのデータは正常に取得できるのですが、
その直後にくる40Byteのデータは、真ん中あたりの10数Byteや最後の10数Byteしか取れません。


serialPort.DataReceived に登録したイベント関数の中身です。

--------------------------------------------------------------------------------------
private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
bytesRead = 0;
// Initialize a buffer to hold the received data
byte[] buffer = new byte[this.serialPort.ReadBufferSize];

try
{
bytesRead = this.serialPort.Read(buffer, 0, buffer.Length);
if (true == serialPort.IsOpen)
{
serialPort.DiscardInBuffer();//受信バッファをクリアする
}

}
catch (Exception ex)
{
DataLog.Exception(ex);
}

//派生クラス用の処理
DeviceClassEventArgs _DeviceClassEventArgs = new DeviceClassEventArgs(buffer, bytesRead);
DeviceClassEvent(this, _DeviceClassEventArgs);
}
--------------------------------------------------------------------------------------

ネットの情報を参考に、
ReceivedBytesThreshold の値を期待するデータ量に逐一変えることで
とりあえず正常に取ることが出来たのですが、これでいいのでしょうか?
期待するデータ量がわからなかった場合は使えないのかなとも思います。

データが欠損してしまう理由、
上記の対処法以外の一般的な対処法など有りましたら教えて下さい。

その他参考になるページ等ありましたら教えていただけると大変助かります。

Visualstudio 2013 を使用して C# で開発を行っています。

SerialPort Classを使用してデータの送受信をするプログラムを作成しているのですが、
非同期でデータを受信する際にどうしてもうまくデータを取得出来ません。

5Byteのデータは正常に取得できるのですが、
その直後にくる40Byteのデータは、真ん中あたりの10数Byteや最後の10数Byteしか取れません。


serialPort.DataReceived に登録したイベント関数の中身です。

-------------------------------------------------------------------------------...続きを読む

Aベストアンサー

DataReceivedイベントが発生したときでも、
シリアルポートへの受信はまだ継続している可能性があるので
不用意にバッファクリアしてはいけない。
非同期の受信処理は、何かと難しいのです。

private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  bytesRead = 0;
  // Initialize a buffer to hold the received data
  byte[] buffer = new byte[this.serialPort.ReadBufferSize];

  try
  {
    //bytesRead = this.serialPort.Read(buffer, 0, buffer.Length);
    //if (true == serialPort.IsOpen)
    //{
    // serialPort.DiscardInBuffer();//受信バッファをクリアする
    //}

    // 受信バッファにデータがなくなるまで繰り返し読込む
    while (true)
    {
      if (0 == serialPort.BytesToRead)
      {
        break;
      }
      buffer[bytesRead] = (byte)serialPort.ReadByte();
      bytesRead++;
      System.Threading.Thread.Sleep(0);

      // シリアルポートの受信バッファには、
      // ・必要なブロックの途中から受信している。
      // ・次のブロックの先頭部分も受信されている。
      // 可能性があるので、ここで必要なブロックだけRead()できたことを確認する。
      if (必要なブロックが正常に読めたか確認する関数())
      {
        break;
      }
    }
  }
  catch (Exception ex)
  {
    DataLog.Exception(ex);
  }

  //派生クラス用の処理
  DeviceClassEventArgs _DeviceClassEventArgs = new DeviceClassEventArgs(buffer, bytesRead);
  DeviceClassEvent(this, _DeviceClassEventArgs);
}

DataReceivedイベントが発生したときでも、
シリアルポートへの受信はまだ継続している可能性があるので
不用意にバッファクリアしてはいけない。
非同期の受信処理は、何かと難しいのです。

private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  bytesRead = 0;
  // Initialize a buffer to hold the received data
  byte[] buffer = new byte[this.serialPort.ReadBufferSize];

  try
  {
    //bytesRead = this.serialPort.Read(buffer, 0, buffer.Le...続きを読む

QEXCELにてローパスフィルタを作成する

実験の測定データをEXCELでデータ整理しようと考えております。データ整理のためローパスフィルタをかけたいのですが、具体的にどういった式、もしくはEXCELの機能を使用したらいいのでしょうか?デジタルフィルタが良く分からないのでよろしくお願いします。
ちなみにローパスフィルタは1000Hzをかけたいです。

Aベストアンサー

時系列データの処理ならば

OutputData(n+1) = OutputData(n) + (InputData(n+1) - OutputData(n)) * dt / T

dt:データのサンプリング間隔
T:フィルタの時定数 1/2πf
f:カットオフ周波数
n,n+1:それぞれn個目,n+1個目のデータをしめす。

でいけると思いますが、一次のパッシブなんで効果が薄いかも。(普通はベッセルかけるんでしょうけど、そこまではわからない)

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Qエクセルで、条件に一致した行を別のセルに抜き出す方法

エクセルで、指定した条件に一致するセルを含む行をすべて抜き出す方法が知りたいです。

たとえば、

<A列> <B列> <C列>
7/1 りんご 100円
7/2 ぶどう 200円
7/2 すいか 300円
7/3 みかん 100円

このような表があって、100円を含む行をそのままの形で、
別のセル(同じシート内)に抜き出したいのですが。

7/1 りんご 100円
7/3 みかん 100円

抽出するだけならオートフィルターでもできますが、
抽出結果を自動的に、別の場所に、常に表示させておきたいのです。

初歩的な質問だと思いますが、検索しても分からなかったので、よろしくお願いします。

Aベストアンサー

同じ質問が結構よく出てますが、そんなに初歩的でもありません
別シートのA1セルに「100円」と入力し、そのシートの任意のセルに以下の式を貼り付けて下さい。後は、下方向、右方向にコピー。
日付のセル書式は「日付」形式に再設定してください

=IF(COUNTIF(Sheet1!$C:$C,$A$1)>=ROW(A1),INDEX(Sheet1!A:A,LARGE(INDEX((Sheet1!$C$1:$C$500=$A$1)*ROW(Sheet1!$C$1:$C$500),),COUNTIF(Sheet1!$C:$C,$A$1)-ROW(A1)+1)),"")

データ範囲は500行までとしていますが、必要に応じて変更して下さい


人気Q&Aランキング