So-net無料ブログ作成

Arduino Nano の PWM 機能を使ってみた(FastPWM 編 その2) [Arduino]

Arduino Nano の4種類ある PWM 機能のうち FastPWM (TOP:OCRnA) について確認してみます。

(1) Fast PWM (TOP:0xFF)
(2) Fast PWM (TOP:OCRnA)
(3) Phase Correct PWM (TOP:0xFF)
(4) Phase Correct PWM (TOP:0CRnA)


ArduinoNano.jpg


今回も TIMER2 を使って確認をしてみましょう。PWM 機能については、下記サイトが参考になります。

Secrets of Arduino PWM
http://www.righto.com/2009/07/secrets-of-arduino-pwm.html


TIMER2 の PWM 出力は D11(OC2A)、D3(OC2B) になります。それぞれの出力を COM2A / COM2B ビットで設定できます。

D11(OC2A) をトグル出力に設定します。

COM2Asetting.png

タイマーが OCR2A に設定した値になると出力をトグルします。この時 WGM22 を 1 に設定します。


D3(OC2B) は通常出力に設定します。

COM2Bsetting.png


次に Fast PWM を WGM ビットで設定します。

WGMsetting.png


CS ビットで分周率を設定します。今回も 1/64 に設定してみました。

3_CSsetting.png


このモードでのD11(OC2A) の出力周波数は、次の数式で算出できます。

出力周波数 = システムクロック / (2 * 分周率 * [OCR2A + 1])

トグル出力になるので、出力周波数は設定値の半分になることに注意(ノコギリ2つ分で一周期)。


これらのビットを TCCR2ATCCR2B のレジスタに設定します。

TCCRSetting.png


OCR2B に閾値を設定することで、D3(OC2B) の出力にデューティ比を設定することができます。このモードで出力される波形のしくみを示します。

IdealOutput.png

D11(OC2A) は OCR2A でトグルしますので、常にデューティ比は50% です。


スケッチは、OCR2A = 127、OCR2B = 40 を設定してみました。

#include <avr/io.h>

void setup() {
  pinMode(11, OUTPUT); // OC2A
  pinMode( 3, OUTPUT); // OC2B
  
  TCCR2A  = bit(COM2A0); // Toggle OC2A on compare match
  TCCR2A |= bit(COM2B1); // OC2B None-inverted Mode
  TCCR2A |= bit(WGM21) | bit(WGM20);   //
  TCCR2B  = bit(WGM22);  // Fast PWM (OCR2A)
  TCCR2B |= bit(CS22); // clock/64

  OCR2A =  127;
  OCR2B =    40;
}

void loop() {
  // put your main code here, to run repeatedly:
}



実際の出力をみてみましょう。


RealOutput.png


期待どおりの出力です。D11(OC2A)の出力周波数もほぼ 976Hz ですので成功です。次は Phase Correct PWM (TOP:0xFF) について確認していきましょう。
(^_^)/~


関連記事
Arduino Nano のTimer 機能を使ってみた
http://makers-with-myson.blog.so-net.ne.jp/2016-01-29

Arduino Nano の Counter 機能を使ってみた
http://makers-with-myson.blog.so-net.ne.jp/2016-02-04

Arduino Nano の PWM 機能を使ってみた(FastPWM 編 その1)
http://makers-with-myson.blog.so-net.ne.jp/2016-02-12

Arduino Nano の PWM 機能を使ってみた(Phased Correct PWM 編 その1)
http://makers-with-myson.blog.so-net.ne.jp/2016-02-18

Arduino Nano の PWM 機能を使ってみた(Phased Correct PWM 編 その2)
http://makers-with-myson.blog.so-net.ne.jp/2016-02-20






サインスマート(SainSmart) Nano 3.0 互換ボード for Arduino

サインスマート(SainSmart) Nano 3.0 互換ボード for Arduino

  • 出版社/メーカー: サインスマート(SainSmart)
  • メディア: Personal Computers



Arduino Pro Mini 328 3.3V 8MHz

Arduino Pro Mini 328 3.3V 8MHz

  • 出版社/メーカー: スイッチサイエンス
  • メディア: エレクトロニクス



ESP-WROOM-02 Wi-Fiモジュール

ESP-WROOM-02 Wi-Fiモジュール

  • 出版社/メーカー: スイッチサイエンス
  • メディア: エレクトロニクス




Arduino Nano の PWM 機能を使ってみた(FastPWM 編 その1) [Arduino]

今回からいよいよ Arduino Nano の PWM 機能を詳しく見たいと思います。Arduino の PWM 機能については下記サイトが参考になりました。非常に分かりやすく助かりました。

Secrets of Arduino PWM
http://www.righto.com/2009/07/secrets-of-arduino-pwm.html


さて、Arduino の PWM 機能は次の4種類あります。

(1) Fast PWM (TOP:0xFF)
(2) Fast PWM (TOP:OCRnA)
(3) Phase Correct PWM (TOP:0xFF)
(4) Phase Correct PWM (TOP:0CRnA)


今回は(1) Fast PWM (TOP:0xFF) を TIMER2 を使って試してみました。


ArduinoNano.jpg


TIMER2 の PWM 出力は D11(OC2A)、D3(OC2B) になります。それぞれの出力を COM2A / COM2B ビットで設定できます。

D11(OC2A) は通常出力に設定してみました。

0_COM2Asetting.png


D3(OC2B) を反転出力に設定してみます。

1_COM2Bsetting.png


次に FastPWM を WGM ビットで設定します。

2_WGMsetting.png


CS ビットで分周率を設定します。今回は1/64 に設定してみました。

3_CSsetting.png


このモードでの出力周波数は下記の数式で算出できます。

出力周波数 = システムクロック / (分周率 * 256) = 16MHz / (64 * 256) ≒ 976Hz


これらの設定ビットを TCCR2ATCCR2B のレジスタに設定します。

4_TCCRsetting.png


OC2AOC2B それぞれにしきい値を設定することで、デューティ比を設定できます。このモードで出力される波形のしくみを示します。分かってみれば簡単ですね。

5_IdealOutput.png


スケッチは OC2A = 180、OC2B = 75 で設定してみました。

#include <avr/io.h>

void setup() {
  pinMode(11, OUTPUT); // OC2A
  pinMode( 3, OUTPUT); // OC2B
  
  TCCR2A  = bit(COM2A1);  // OC2A None-inverted Mode
  TCCR2A |= bit(COM2B1) | bit(COM2B0); // OC2B Inverted Mode
  TCCR2A |= bit(WGM21)  | bit(WGM20);  // Fast PWM (0xFF)
  TCCR2B = bit(CS22); // clock/64
  
  OCR2A = 180;
  OCR2B =  75;
}

void loop() {
  // put your main code here, to run repeatedly:
}


さて、実際の出力波形を見てみましょう!

6_RealOutput.png


期待したとおりの出力となりました!周波数も973~977Hzでジッタはあるものの狙い通りです。次は Fast PWM (TOP:OCRnA) について見てみたいと思います!
(^_^)/~


関連記事
Arduino Nano のTimer 機能を使ってみた
http://makers-with-myson.blog.so-net.ne.jp/2016-01-29

Arduino Nano の Counter 機能を使ってみた
http://makers-with-myson.blog.so-net.ne.jp/2016-02-04

Arduino Nano の PWM 機能を使ってみた(FastPWM 編 その2)
http://makers-with-myson.blog.so-net.ne.jp/2016-02-16

Arduino Nano の PWM 機能を使ってみた(Phased Correct PWM 編 その1)
http://makers-with-myson.blog.so-net.ne.jp/2016-02-18

Arduino Nano の PWM 機能を使ってみた(Phased Correct PWM 編 その2)
http://makers-with-myson.blog.so-net.ne.jp/2016-02-20






サインスマート(SainSmart) Nano 3.0 互換ボード for Arduino

サインスマート(SainSmart) Nano 3.0 互換ボード for Arduino

  • 出版社/メーカー: サインスマート(SainSmart)
  • メディア: Personal Computers






Adafruit I2C接続16チャンネル12ビットPWM/サーボ シールド

Adafruit I2C接続16チャンネル12ビットPWM/サーボ シールド

  • 出版社/メーカー: スイッチサイエンス
  • メディア: エレクトロニクス




Arduino 向け心拍センサー見ぃつけた! [Arduino]

若い頃から心拍数が少なく、年になったら正常値位になるだろうと思ったのですが、そんな気配は全くありません。最近は年齢のせいか健康診断時に「洞性徐脈」という病名までつくようになりました。

スポーツやる人には多く問題ないということですが、なら病名なんてつけるなよ!と思ってしまいます。

ということで、心拍測定機能付きのスマートバンドは前から気になっていました。どうせなら Arduino で活用出来るものを探していたのですが、バンド型の多くはアプリと一体となっておりデータが拾えそうにありません。

でもついに見つけちゃいました!


pulsesensor.png
http://pulsesensor.com/pages/code-and-guide


まさにこんなのが欲しかったのですよー。

技術解説も充実しており、アプリケーションを作るのに迷うことはなさそうです。OV7670もまだ動かせてないけど、、、ちょっと高いけど、、、ポチっとしてしまおうかな~。
σ(o ̄▽ ̄o)





心拍センサ

心拍センサ

  • 出版社/メーカー: スイッチサイエンス
  • メディア: エレクトロニクス










BLE搭載 Arduino を探してみた [Arduino]

巷では ESP8266 (WiFi+Arduino)が爆発的に売れてますが、私は Arduino なら BLE のほうが相性が良いと思うのです。でもあまり見当たらないな…ということで、ちょっと調べてみました。

実はすでに製品化されているものがあるのですね。まずは日本の技適取得済のモジュール。

RedBearLab BLE Nanoキット
ArduinoBLE.png
https://www.switch-science.com/catalog/2401/

スイッチサイエンスさんから発売されています。でも5千円弱って高いなー。


こちらは同じくRedBearLabの製品です。Arduinoの公式ストアで販売していました。

Blend Micro
ArduinoBLE2.png
https://store.arduino.cc/product/AH00007

少し大きめのモジュール。Nanoキットよりも安いですが、技適はおそらく取得していないので使用の際はご注意を。(Nanoキットも同じサイトで販売されています)


もっと安いキットが欲しい方はこちら。Blueduinoという中国製と思われるモジュール。

Blueduino Rev2.0
Bluduino.png
BlueDuino Rev2 Arduino Compatible Plus BLE CC2540 April Brother

こちらは間違いなく技適は取得されていないと思われます。使用の際は自己責任で・・・。


キックスターターにもあるのを見つけてしまいました。

BLEduino
BLEDuino.png
BLEduino: Bluetooth 4.0 (BLE) made easy (Arduino Compatible)


こうして見るといろいろとありますね。でも、WiFi搭載Arduino互換機ESP8266に比べるとまだまだ高い。何よりも技適を取得しているものがほとんどないので、もう少し待ったほうがよさそうです。
(´・ω・`)





RedBearLab BLE Nanoキット

RedBearLab BLE Nanoキット

  • 出版社/メーカー: スイッチサイエンス
  • メディア: エレクトロニクス



BLEモジュール BLESerial

BLEモジュール BLESerial

  • 出版社/メーカー: 浅草ギ研
  • メディア:



Arduino BLEシールド Bluetooth 4.0 CC2540搭載

Arduino BLEシールド Bluetooth 4.0 CC2540搭載

  • 出版社/メーカー: asshop
  • メディア: エレクトロニクス




タグ:Arduino ESP8266 BLE

Arduino Nano の Counter 機能を使ってみた [Arduino]

前回 Arduino Nano のTimer機能を確認しました。今回はCounter 機能です。Counter機能とは外部信号のON/OFF回数をカウントする機能です。今回はボタンを押した回数でLEDをON/OFFする機能にチャレンジしたいと思います。


ArduinoNano CounterTest.JPG


Arduino Nano が信号をカウントできるピンは限られています。COUNTER0 (8bit) は D4。COUNTER1 (16bit) は D5 になります。COUNTER2 (8bit) はどうやら使用には適さないようです。詳細は下記サイトを参考にしてください。


COUNTERS ON THE ATmega168/328
https://sites.google.com/site/qeewiki/books/avr-guide/counter-atmega328


カウンタの設定はタイマーと同様に CSビット と WGMビットでコントロールします。今回も16bit のCOUNTER1 を例に内容を見てみたいと思います。

CSビットは、信号の立下りでカウントするか、立ち上がりでカウントするかを設定します。今回は立ち上がりでカウントしてみます。


CounterCSSetting.png


WGMビットは、上限の有り無しを設定します。無しの場合は0xFFFFが上限値になります。今回はCTCモードで上限値を設定するようにしたいと思います。


CounterWGMSetting.png


CSビット、WGMビットは TCCR のレジスタで設定します。


CounterTCCRregisters.png


回路は押しボタンを使って組んでみました。極めてシンプルなものです。


ArduinoNanoCounter.png


タイマーと同じように割り込みを使ったスケッチにしてみました。ボタンを5回押すとLEDをON/OFFするようになっています。チャタリングをチェックするために定期的にカウント値(TCNT1)をシリアル出力するようにしました。


#include <avr/io.h>
#include <avr/interrupt.h>

void setup() {
  Serial.begin(115200);
  pinMode(5, INPUT_PULLUP);
  pinMode(13, OUTPUT);
  
  noInterrupts();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  
  OCR1A  = 4;
  TCCR1B = bit(WGM12) | bit(CS12) | bit(CS11) | bit(CS10);
  TIMSK1 = bit(OCIE1A);
  interrupts();
}

ISR (TIMER1_COMPA_vect) {
  Serial.println("INT!");
  digitalWrite(13, !digitalRead(13));
}

void loop() {
  delay(100);
  Serial.print(TCNT1);
}



実際の動作をみてみましょう。





ちょっと不正確ですね。シリアルでカウント値を確認すると飛び飛びの値になっていました。どうやらチャタリングのせいのようです。スケッチが間違っているわけではなさそうです。


button_chattering.png


今回はカウンタについてチェックしてみました。これは色々と応用できそうです。次はいよいよ PWM について確認したいと思います。
(^_^)/~


関連記事
Arduino Nano のTimer 機能を使ってみた
http://makers-with-myson.blog.so-net.ne.jp/2016-01-29

Arduino Nano の PWM 機能を使ってみた(FastPWM 編 その1)
http://makers-with-myson.blog.so-net.ne.jp/2016-02-12

Arduino Nano の PWM 機能を使ってみた(FastPWM 編 その2)
http://makers-with-myson.blog.so-net.ne.jp/2016-02-16

Arduino Nano の PWM 機能を使ってみた(Phased Correct PWM 編 その1)
http://makers-with-myson.blog.so-net.ne.jp/2016-02-18

Arduino Nano の PWM 機能を使ってみた(Phased Correct PWM 編 その2)
http://makers-with-myson.blog.so-net.ne.jp/2016-02-20






サインスマート(SainSmart) Nano 3.0 互換ボード for Arduino

サインスマート(SainSmart) Nano 3.0 互換ボード for Arduino

  • 出版社/メーカー: サインスマート(SainSmart)
  • メディア: Personal Computers



SODIAL(R)V3.0 AVR 328 P-20AUモジュール基板ブラックブルーとUSBケーブル

SODIAL(R)V3.0 AVR 328 P-20AUモジュール基板ブラックブルーとUSBケーブル

  • 出版社/メーカー: SODIAL(R)
  • メディア: エレクトロニクス



Arduinoをはじめようキット

Arduinoをはじめようキット

  • 出版社/メーカー: スイッチサイエンス
  • メディア: おもちゃ&ホビー




Arduino Nano のTimer 機能を使ってみた [Arduino]

Arduino の PWM を調べたところ AVR のTimer 機能を理解しないと使いこなせないことが分かりました。OV7670 を動かすところから少し寄り道となってしまいますが、今回は Timer 機能を調べたいと思います。


ArduinoNano.JPG


Timer 機能の理解には下記サイトが大変参考になりました。このサイトはAVR の他の機能も易しく解説してくれているので重宝しそうです。


Timers on the ATmega168/328
https://sites.google.com/site/qeewiki/books/avr-guide/timers-on-the-atmega328


Arduino はタイマーを3つ持っています。TIMER0 と TIMER2 は 8BITタイマー。TIMER1 が16BITタイマーです。今回はTIMER1 に絞って調べてみたいと思います。

Timer の基本動作は簡単です。 内部カウンタ TCTn が設定値 OCRn に一致すると TOVn の TIFR レジスタをセットするという単純なものです。この時、割り込みも使えます。

OCRn の計算値を下記に示します。


OCRn = システムクロック / 分周率 × タイマー時間


例えば0.5秒のタイマーを TIMER1 に設定するための OCR1 値は下記になります。分周率は256 とします。


OCR1 = 16,000,000 / 256 * 0.5 = 31250


分周率はCSビットで設定します。


CSbits.png


タイマーには "ノーマルモード" と "CTCモード" がありますが、平たく言うと "ノーマルモード" は使いものになりません。通常は "CTCモード" を使います。詳細は上記サイトを参照してください。

モード設定は WGMビットで設定します。


WGMbits.png


CSビット、WGMビットは TCCR(Timer/Counter Control Register) にセットします。TIMER1 のTCCR のレジスタ構成を示します。


TCCR.png


設定の仕方は分かったので、Arduino のスケッチで試してみたいと思います。今回は割り込みを使いました。割り込みは TIMSK1 というレジスタで設定できます。詳しくは上記サイトを参照してください。


#include <avr/io.h>
#include <avr/interrupt.h>

void setup() {
  pinMode(13, OUTPUT); 
  noInterrupts();
  // レジスタをクリア
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  
  OCR1A = 31250;
  TCCR1B = bit(WGM12) | bit(CS12); // CTCモードで分周率256
  TIMSK1 = bit(OCIE1A); // 割り込みをタイマー1に設定
  interrupts();
}

ISR (TIMER1_COMPA_vect) {
  digitalWrite(13, !digitalRead(13));
}

void loop() {
}



さて、実際の動きをみてみましょう!





0.5秒ごとに点滅を繰り返しています。うまく動きました。今回は Arduino のタイマーの基本機能を理解できました。次はカウンターの使い方を見てみたいと思います。
(^_^)/~


関連記事
Arduino Nano の Counter 機能を使ってみた
http://makers-with-myson.blog.so-net.ne.jp/2016-02-04

Arduino Nano の PWM 機能を使ってみた(FastPWM 編 その1)
http://makers-with-myson.blog.so-net.ne.jp/2016-02-12

Arduino Nano の PWM 機能を使ってみた(FastPWM 編 その2)
http://makers-with-myson.blog.so-net.ne.jp/2016-02-16

Arduino Nano の PWM 機能を使ってみた(Phased Correct PWM 編 その1)
http://makers-with-myson.blog.so-net.ne.jp/2016-02-18

Arduino Nano の PWM 機能を使ってみた(Phased Correct PWM 編 その2)
http://makers-with-myson.blog.so-net.ne.jp/2016-02-20






サインスマート(SainSmart) Nano 3.0 互換ボード for Arduino

サインスマート(SainSmart) Nano 3.0 互換ボード for Arduino

  • 出版社/メーカー: サインスマート(SainSmart)
  • メディア: Personal Computers






Arduinoをはじめようキット

Arduinoをはじめようキット

  • 出版社/メーカー: スイッチサイエンス
  • メディア: おもちゃ&ホビー




Arduino Nano で OV7670(FIFO無)駆動用クロックを PWM で生成してみた [Arduino]

前回 Fast PWM で OV7670駆動用の 8MHz のクロックを生成できることが分かりました。


OV7670.png


Arduino の Timer レジスタの使い方をまだきちんと理解できていませんが、"論より証拠"ってことで実際にスケッチを書いて試してみることにしました。


#include <avr/io.h>
#include <util/delay.h>

void setup() {
  pinMode(5, OUTPUT);

  // set up 8Mhz on D5  
  TCCR0A = bit(COM0A1) | bit(COM0B1) | bit(WGM01) | bit(WGM00);
  TCCR0B = bit(WGM02) | bit(CS00);
  OCR0A = 1;
  OCR0B = 0;
}

void loop() {  
}



Arduino Nano に焼きこんで DDS-120 で出力波形を測定してみます。


ArduinoNano FastPWM8Mhz.JPG


実際に測定した波形のキャプチャがこちら。


ArduinoFastPWM.png


DDS-120 ではサンプリングレートが高々50MHz なので、きれいな波形になっていませんが、矩形の間隔は大体 0.125usec。8MHz 出ているようです。

今回は、PWM の使い方をきちんと理解せずに試してみましたが、うまくいったようです。でも、せっかくの機会ですので、もう少し調べて PWM を使いこなせるようになりたいと思います。
(^_^)/~






Arduino Nano v3.0 compatible (ATMEGA328P) ピンヘッダ実装済み

Arduino Nano v3.0 compatible (ATMEGA328P) ピンヘッダ実装済み

  • 出版社/メーカー: 梅本有限責任事業組合
  • メディア: エレクトロニクス



サインスマート 手持型 USBオシロスコープ DDS-140 バンド幅40MHz 200M/S + 信号発生器 + ロジックアナライザ

サインスマート 手持型 USBオシロスコープ DDS-140 バンド幅40MHz 200M/S + 信号発生器 + ロジックアナライザ

  • 出版社/メーカー: サインスマート(SainSmart)
  • メディア: エレクトロニクス



OV7670 Camera Module 〈 Arduino関連 〉

OV7670 Camera Module 〈 Arduino関連 〉

  • 出版社/メーカー: elecfreaks
  • メディア:




OV7670 (FIFO無) を動かすには? [Arduino]

年越しテーマとなってしまった OV7670(FIFO無)。重い腰をあげ、Arduinoで動かすべく調査を再開しました。


OV7670.png


OV7670を駆動するには、前回の調査の結果 8MHz以上の入力クロック(XCLK)が必要だということが分かりました。


OV7670(FIFO無)のフレームレートを変更するにはどうすればいいの?
http://makers-with-myson.blog.so-net.ne.jp/2015-12-23


問題はMHzオーダーのクロックを Arduino から安定的に供給する手段です。Arduino の内部クロックを直接外に出せるピンはないかなと探したのですが、どうやらなさそう。

いろいろ調べたところ、皆さん PWM を使っている様です。PWM は AnalogWrite で使うのが一般的ですが周波数が低すぎ(490Hz)。MHzオーダーのクロックを得るには Fast PWM モードを使うのがよさそうです。


Fast PWM on ATmega328, up to 8MHz
http://withinspecifications.30ohm.com/2014/02/20/Fast-PWM-on-AtMega328/


う~ん、なんか難しい・・・。(´・ω・`)

細かい使い方は追々調べるとして、てっとり早いサンプルがないかなと探したら、グーグル先生から上記サイトの内容を補足してくれるスレッドを教えてもらいました。ありがたや~。


http://arduino.stackexchange.com/questions/9408/generating-a-pwm-frequency-greater-than-125-khz-using-arduino-uno
// A sketch that creates an 8 MHz, 50% duty cycle PWM and a 250 kHz,
// 6-bit resolution PWM with varying duty cycle (changes every 5 µs
// or about every period.

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
  pinMode(3, OUTPUT); // Output pin for OCR2B
  pinMode(5, OUTPUT); // Output pin for OCR0B

  // Set up the 250 kHz output
  TCCR2A = bit(COM2A1) | bit(COM2B1) | bit(WGM21) | bit(WGM20);
  TCCR2B = bit(WGM22) | bit(CS20);
  OCR2A = 63;
  OCR2B = 31;

  // Set up the 8 MHz output
  TCCR0A = bit(COM0A1) | bit(COM0B1) | bit(WGM01) | bit(WGM00);
  TCCR0B = bit(WGM02) | bit(CS00);
  OCR0A = 1;
  OCR0B = 0;
}


このコードの 8MHz output の設定を使えばよさそうですね。しかしPWMを使いこなすのはめんどくさそう。まだまだ調査は続きます。
\(`・ω・´)






OV7670 Camera Module 〈 Arduino関連 〉

OV7670 Camera Module 〈 Arduino関連 〉

  • 出版社/メーカー: elecfreaks
  • メディア:



サインスマート(SainSmart) Nano 3.0 互換ボード for Arduino

サインスマート(SainSmart) Nano 3.0 互換ボード for Arduino

  • 出版社/メーカー: サインスマート(SainSmart)
  • メディア: Personal Computers



Beginning Arduino ov7670 Camera Development (English Edition)

Beginning Arduino ov7670 Camera Development (English Edition)

  • 出版社/メーカー:
  • 発売日: 2015/07/03
  • メディア: Kindle版




OV7670 (FIFO無) の出力解像度を変えるには。 [Arduino]

前回はOV7670(FIFO無)フレームレートの変更について調べてみましたが、今回は出力解像度の変更について調べてみます。


OV7670.png


フレームレートと解像度の設定については下記サイトを参考にしています。OV7670について、すごくわかりやすく解説されている良サイトです。


Hacking the OV7670 camera module (SCCB cheat sheet inside)
http://embeddedprogrammer.blogspot.nl/2012/07/hacking-ov7670-camera-module-sccb-cheat.html


OV7670はフレームレートと解像度は独立で設定できるようです。変更できる解像度は5種類。


・VGA(640x480)
・QVGA(320x240)
・CIF(352x240)
・QCIF(176x144)
・マニュアルスケーリング


下記のレジスタで設定できます。何も設定されていない状態では VGA になります。


ov7670_resolution_change.png


カラーバーも出力できるのは嬉しいですね。QCIFに設定するのは下記のようにします。

COM3 Bit[3] を 1 に設定します
COM7 Bit[3] を 1 に設定します

簡単ですね。その他レジスタ設定の詳細については、下記の文献が参考になります。

OV7670 Implementation guide
OV7670 Software Application Note


OV7670の制御方法の肝はなんとなく掴めました。いよいよ実装して試してみるかなぁ。(その前に年賀状を書かないと・・汗)
(||´д`)=3





OV7670 Camera Module 〈 Arduino関連 〉

OV7670 Camera Module 〈 Arduino関連 〉

  • 出版社/メーカー: elecfreaks
  • メディア:






Beginning Arduino ov7670 Camera Development (English Edition)

Beginning Arduino ov7670 Camera Development (English Edition)

  • 出版社/メーカー:
  • 発売日: 2015/07/03
  • メディア: Kindle版




OV7670(FIFO無)のフレームレートを変更するにはどうすればいいの? [Arduino]

衝動買いをしてしまった OV7670(FIFO無)。


OV7670.png


FIFOメモリが無いので、カメラが垂れ流す映像データの隙間で処理をしないといけません。しかし、貧弱なArduinoのマイコンでは高速で処理するには難しく、カメラが吐き出すデータの間隔を広げて処理時間を稼ぐしかありません。

そのために出来ることは2つ。


1) フレームレート(fps)を遅くすること
2) 画像の解像度を低くすること


今回はフレームレート(fps)を遅くするにはどうすればよいか調べてみました。

フレームレート(frame per second)は1秒間にくる画像の数のことです。例えばテレビは1秒間に30枚の画像を処理するので30fpsになります。今回はカメラが送る画像を、例えば1秒間に10枚など、少なくすればデータの間隔が広がり処理時間を稼げることになります。

ということでOV7670の制御方法を調べてみたのですが、レジスタの使い方がイマイチ分かりません。Google 先生に訪ねてみると、参考になるサイトを教えてくれました!


Hacking the OV7670 camera module (SCCB cheat sheet inside)
http://embeddedprogrammer.blogspot.nl/2012/07/hacking-ov7670-camera-module-sccb-cheat.html


フレームレート(fps)を調整するにはPCLKの数値を変更すればよさそうです。上記サイトによるとPCLKが24MHzの場合は30fpsになり12MHzの場合は15fpsとなるようです。(因果関係はよく分かってません・・・タイミングチャートを紐解けば理解できると思いますが)

PCLKは下記のレジスタで制御できるようです。(Internal Clock の説明がデータシートに何もないので確証はありません)


OV7670_PCLK_DBLV.png


これらから OV7670 の入力クロックが 8MHz の時に、24MHz を得るには下記のようにレジスタを設定すればよいことになります。(上記サイトにも記述がありますが、入力クロック 8MHz は規格外です)


・CLKRC Bit[6] を "0" に設定
・CLKRC Bit[0-5] を "1" にして分周を ”2” に設定
・DBLV Bit[7-6] を "b10" にしてPLLを入力クロックの6倍に設定
・8MHz x 6 / (Bit[0-5] + 1) =48MHz / (b000001 + 1) = 24MHz


実際にできるかどうか分かりませんが、Bit[0-5] を "b001011 [d11]" に設定すれば PCLK を 4MHz まで落とせて 5fps まで落とせるかも知れません。

次は解像度を変更する方法について確認したいと思います。
(^_^)/~






OV7670 Camera Module 〈 Arduino関連 〉

OV7670 Camera Module 〈 Arduino関連 〉

  • 出版社/メーカー: elecfreaks
  • メディア:






Beginning Arduino ov7670 Camera Development (English Edition)

Beginning Arduino ov7670 Camera Development (English Edition)

  • 出版社/メーカー:
  • 発売日: 2015/07/03
  • メディア: Kindle版