質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

1117閲覧

ESP8266 ArduCAMのサンプルスケッチの改変(Arduino IDE)

lime00

総合スコア25

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/04/16 00:38

Arduino IDEのサンプルスケッチ内にある、"ArduCAM_ESP8266_OV2640_Capture"というスケッチの改変を行いたいと考えております。このスケッチは、ArduCAMというシリアルカメラと、ESP8266というWiFiマイコンを用いて、Webブラウザ上にカメラで撮影した写真かストリーミング映像を表示させるものです。
今回お聞きしたいのは、ストリーミングのフレームレートを低下させる方法です。ESP8266の処理を軽減させるために、フレームレートを落としたいのですが、どうしてもやり方が分かりません。
以下に、そのサンプルスケッチを記載します(簡略化のため写真撮影の機能は削除しています)。

Arduino

1#include <ESP8266WiFi.h> 2#include <WiFiClient.h> 3#include <ESP8266WebServer.h> 4#include <ESP8266mDNS.h> 5#include <Wire.h> 6#include <ArduCAM.h> 7#include <SPI.h> 8#include "memorysaver.h" 9#if !(defined ESP8266 ) 10#error Please select the ArduCAM ESP8266 UNO board in the Tools/Board 11#endif 12 13//This demo can only work on OV2640_MINI_2MP or ARDUCAM_SHIELD_V2 platform. 14#if !(defined (OV2640_MINI_2MP)||(defined (ARDUCAM_SHIELD_V2) && defined (OV2640_CAM))) 15#error Please select the hardware platform and camera module in the ../libraries/ArduCAM/memorysaver.h file 16#endif 17// set GPIO16 as the slave select : 18const int CS = 16; 19 20//you can change the value of wifiType to select Station or AP mode. 21//Default is AP mode. 22int wifiType = 0; // 0:Station 1:AP 23 24//Station mode you should put your ssid and password 25const char *ssid = "SSID"; // Put your SSID here 26const char *password = "PASSWORD"; // Put your PASSWORD here 27 28ESP8266WebServer server(80); 29 30ArduCAM myCAM(OV2640, CS); 31 32 33void start_capture(){ 34 myCAM.clear_fifo_flag(); 35 myCAM.start_capture(); 36} 37 38void serverStream(){ 39 WiFiClient client = server.client(); 40 41 String response = "HTTP/1.1 200 OK\r\n"; 42 response += "Content-Type: multipart/x-mixed-replace; boundary=frame\r\n\r\n"; 43 server.sendContent(response); 44 45 while (1){ 46 start_capture(); 47 48 while (!myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)); 49 50 size_t len = myCAM.read_fifo_length(); 51 if (len >= 0x07ffff){ 52 Serial.println("Over size."); 53 continue; 54 }else if (len == 0 ){ 55 Serial.println("Size is 0."); 56 continue; 57 } 58 59 myCAM.CS_LOW(); 60 myCAM.set_fifo_burst(); 61 #if !(defined (ARDUCAM_SHIELD_V2) && defined (OV2640_CAM)) 62 SPI.transfer(0xFF); 63 #endif 64 if (!client.connected()) break; 65 response = "--frame\r\n"; 66 response += "Content-Type: image/jpeg\r\n\r\n"; 67 server.sendContent(response); 68 69 static const size_t bufferSize = 4096; 70 static uint8_t buffer[bufferSize] = {0xFF}; 71 72 while (len) { 73 size_t will_copy = (len < bufferSize) ? len : bufferSize; 74 SPI.transferBytes(&buffer[0], &buffer[0], will_copy); 75 if (!client.connected()) break; 76 client.write(&buffer[0], will_copy); 77 len -= will_copy; 78 } 79 myCAM.CS_HIGH(); 80 81 if (!client.connected()) break; 82 } 83} 84 85void handleNotFound(){ 86 String message = "Server is running!\n\n"; 87 message += "URI: "; 88 message += server.uri(); 89 message += "\nMethod: "; 90 message += (server.method() == HTTP_GET)?"GET":"POST"; 91 message += "\nArguments: "; 92 message += server.args(); 93 message += "\n"; 94 server.send(200, "text/plain", message); 95 96 if (server.hasArg("ql")){ 97 int ql = server.arg("ql").toInt(); 98 myCAM.OV2640_set_JPEG_size(ql);delay(1000); 99 Serial.println("QL change to: " + server.arg("ql")); 100 } 101} 102 103void setup() { 104 uint8_t vid, pid; 105 uint8_t temp; 106#if defined(__SAM3X8E__) 107 Wire1.begin(); 108#else 109 Wire.begin(); 110#endif 111 Serial.begin(115200); 112 Serial.println("ArduCAM Start!"); 113 114 // set the CS as an output: 115 pinMode(CS, OUTPUT); 116 117 // initialize SPI: 118 SPI.begin(); 119 SPI.setFrequency(4000000); //4MHz 120 121 //Check if the ArduCAM SPI bus is OK 122 myCAM.write_reg(ARDUCHIP_TEST1, 0x55); 123 temp = myCAM.read_reg(ARDUCHIP_TEST1); 124 if (temp != 0x55){ 125 Serial.println("SPI1 interface Error!"); 126 while(1); 127 } 128 129 //Check if the camera module type is OV2640 130 myCAM.wrSensorReg8_8(0xff, 0x01); 131 myCAM.rdSensorReg8_8(OV2640_CHIPID_HIGH, &vid); 132 myCAM.rdSensorReg8_8(OV2640_CHIPID_LOW, &pid); 133 if ((vid != 0x26 ) && (( pid != 0x41 ) || ( pid != 0x42 ))) 134 Serial.println("Can't find OV2640 module!"); 135 else 136 Serial.println("OV2640 detected."); 137 138 139 //Change to JPEG capture mode and initialize the OV2640 module 140 myCAM.set_format(JPEG); 141 myCAM.InitCAM(); 142 myCAM.OV2640_set_JPEG_size(OV2640_320x240); 143 myCAM.clear_fifo_flag(); 144 145 if (wifiType == 0){ 146 if(!strcmp(ssid,"SSID")){ 147 Serial.println("Please set your SSID"); 148 while(1); 149 } 150 if(!strcmp(password,"PASSWORD")){ 151 Serial.println("Please set your PASSWORD"); 152 while(1); 153 } 154 // Connect to WiFi network 155 Serial.println(); 156 Serial.println(); 157 Serial.print("Connecting to "); 158 Serial.println(ssid); 159 160 WiFi.mode(WIFI_STA); 161 WiFi.begin(ssid, password); 162 while (WiFi.status() != WL_CONNECTED) { 163 delay(500); 164 Serial.print("."); 165 } 166 Serial.println("WiFi connected"); 167 Serial.println(""); 168 Serial.println(WiFi.localIP()); 169 }else if (wifiType == 1){ 170 Serial.println(); 171 Serial.println(); 172 Serial.print("Share AP: "); 173 Serial.println(AP_ssid); 174 Serial.print("The password is: "); 175 Serial.println(AP_password); 176 177 WiFi.mode(WIFI_AP); 178 WiFi.softAP(AP_ssid, AP_password); 179 Serial.println(""); 180 Serial.println(WiFi.softAPIP()); 181 } 182 183 // Start the server 184 server.on("/stream", HTTP_GET, serverStream); 185 server.onNotFound(handleNotFound); 186 server.begin(); 187 Serial.println("Server started"); 188} 189 190void loop() { 191 server.handleClient(); 192}

どなたか詳しい方、助力をお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

回答ではなくて申し訳ありません。
自身のやりたいことに類似する記事を探していてたどり着きましたので、
質問させていただけないかと思いコメントさせていただきました。

投稿者様の狙い(Webブラウザ上にカメラで撮影した写真かストリーミング映像を表示させる)は
同じWifiルータに接続した機器同士でのことでしょうか?
それともインターネットを介した方法でしょうか?

私もEPS32などのWifiモジュールとOV2640を使ってWebブラウザにストリーミング画像を表示させたいと思っています。
現在自身のWifiルータを使って、ESP32-CAMから出力した画像を同じWifiルータでつながれたタブレットの
ブラウザで表示することができています。
ただ、実用性を考えたときに同じ建屋内でカメラ画像を見ることよりも
例えば外出先から携帯の画面や別のWifiからインターネットを介して、
ストリーミング画像をブラウザで表示させることで実用範囲が広がると思っています。

投稿2020/05/02 01:42

編集2020/05/02 01:45
HiroPokeHero

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

OV2640のデータシートを見る限り、フレームレートの変更は次の3種類あるらしいです。

  1. Clock perscaler
  2. Line adjustment
  3. Vertical sync adjustment

ソフトウェアで制御する場合は2か3だと思います。
ただ、私にはデータシートの制御用レジスタの説明が理解できなかったので、実機を持っている人がレジスタの設定を変更し、調整していくしかないと思います。

データシートは"ov2640 datasheet"で検索できると思います。

投稿2019/04/19 02:45

ta.fu

総合スコア1667

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lime00

2019/04/19 05:51

ご回答ありがとうございました。 検討させていただきます。
guest

0

試してませんけど、void serverStream()関数の中でwhile(1)でぐるぐる回ってる様子ですから、例えばそのwhile(1){の直後でdelay(100);とか適当に待たせてみたらどうでしょう。

投稿2019/04/16 14:34

thkana

総合スコア7639

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lime00

2019/04/19 05:51

ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問