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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Arduino

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

2回答

3112閲覧

JPEG画像にノイズが入る原因

takuma.sakamoto

総合スコア20

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Arduino

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

1クリップ

投稿2017/08/09 03:03

編集2017/08/10 07:52

###前提・実現したいこと
Arduinoで3G回線を使いカメラで撮影した画像データ[JPG]をSDカードに保存し、一定間隔でサーバーにアップロードする監視カメラを作っています。データをバイナリから文字変換し、サーバーにpostする時にノイズが入ってしまいます。
この状態では監視カメラとして問題があるので、ノイズ発生の原因、また解決方法などご教授頂ければと思います。

###発生している問題・エラーメッセージ

イメージ説明

###全体のソースコード

#include <Adafruit_VC0706.h> #include <SoftwareSerial.h> #include <SD.h> #include <SPI.h> #include "a3gim2.h" #define chipSelect 53 //送信データ格納 #define BODY_BUFFER 965 char body[BODY_BUFFER]; // バッファ #define IMGEQ "img=" // POST send parameter const char *server = "******.bitter.jp"; // サーバ名 const char *path = "******.php"; // PHPファイル // 送信書式 const char *header = "Content-Type: application/x-www-form-urlencoded"; const int port = 80; int IS=strlen(IMGEQ); char res[100]; const int powerPin = 0; //ここ重要 3gim power pinIf not using power control, 0 is set. // CAMERA TX => 69 // CAMERA RX => 3 SoftwareSerial cameraconnection = SoftwareSerial(69,3); Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection); boolean camera_found = false; int file_count = 1; char fname[13]; void setup(){ Serial.begin(9600);//シリアル通信設定 Serial.println("//monitoring program start//"); //SD初期化 pinMode(chipSelect,OUTPUT); delay(10); //SD.begin(); if(!SD.begin(chipSelect)){ Serial.println("SD card initialization failed!"); while(1){ ; } } //カメラ初期化 if( cam.begin() ){ camera_found = true; Serial.println("Camera Found"); } else{ Serial.println("No camera found?"); return; } } //メイン処理 void loop() { //a3gs.setLED(true); //画像サイズ選択(640x480, 320x240 or 160x120) //cam.setImageSize(VC0706_640x480); // biggest cam.setImageSize(VC0706_320x240); // medium //cam.setImageSize(VC0706_160x120); // small uint8_t imgsize = cam.getImageSize(); Serial.print("Image size: "); if (imgsize == VC0706_640x480) Serial.println("640x480"); if (imgsize == VC0706_320x240) Serial.println("320x240"); if (imgsize == VC0706_160x120) Serial.println("160x120"); Serial.println("Snap in 3 secs..."); delay(3000); //撮影処理部分 if( cam.takePicture() ){ set_filename(); Serial.println("Picture taken!"); File fp = SD.open( fname, FILE_WRITE | O_TRUNC ); if( fp ){ uint16_t leng = cam.frameLength(); Serial.print("Storing "); Serial.print(leng, DEC); Serial.print(" byte image."); pinMode(8, OUTPUT); byte wCount = 0; // For counting # of writes while (leng > 0) { uint8_t *buf; uint8_t bytesToRead = min(32, leng); buf = cam.readPicture(bytesToRead); fp.write( buf, bytesToRead ); if(++wCount >= 64) { // Every 2K, give a little feedback so it doesn't appear locked up Serial.print('.'); wCount = 0; } leng -= bytesToRead; } fp.close(); } } int32_t time = millis(); //-------------- 3G接続 ------------ Serial.println("\n----------------------------------"); Serial.println("3G connect ready : Wait about 40 sec..."); while( !(a3gs.start() == 0 && a3gs.begin()==0)) { Serial.print("."); delay(1000); } Serial.println("connected!"); //------------ SDメモリー読込み3GSA書出し -------------- File fp = SD.open( fname ,FILE_READ ); int len = sizeof(res); int i=strlen(IMGEQ); sprintf(body,"%s",IMGEQ);//POST引き渡し変数名設定 uint8_t b; //delay(3000); Serial.print("\nhttpPOST.."); delay(50); while(fp.available()) {//------------読み取り可能なbyteがある場合入る -------------- b = fp.read(); body[i++] = b/16 + (b/16>9?'A'-10:'0'); // バイナリ―から文字変換(上位) body[i++] = b%16 + (b%16>9?'A'-10:'0'); // バイナリ―から文字変換(下位) delay(50); if( i>=BODY_BUFFER ) { if(a3gs.httpPOST(server,port,path,header,body,res,&len,false)!=0){ //Serial.println("httpPOST error1..."); delay(200); }else{ Serial.print("."); } i=strlen(IMGEQ); sprintf(body,"%s",IMGEQ); //POST引き渡し変数名設定 } //delay(50); } fp.close(); if(i>strlen(IMGEQ)) { body[IS +i] = 0x00 ; // 残りバッファの3GSA書出し if(a3gs.httpPOST(server,port,path,header,body,res,&len,false)!=0){ //Serial.println("httpPOST error2..."); delay(200); }else{ Serial.print("!"); } } sprintf(body,"img=%s",fname); // ファイル名の書出し(php側でファイル名変更) if(a3gs.httpPOST(server,port,path,header,body,res,&len,false)!=0){ Serial.println(" file name send error"); }else { Serial.print(" Completed send '"); Serial.println(fname); } cam.reset(); time = millis() - time; Serial.print(time); Serial.println(" ms elapsed"); Serial.println("done!"); Serial.println("3G Shutdown.."); a3gs.end(); a3gs.shutdown(); //a3gs.setLED(false); Serial.println("----------------------------------"); delay(25000); } void set_filename(){ sprintf(fname, "IMG%02d.JPG", file_count++); if( file_count > 10){ file_count = 1; // Overwrite } }

###原因と思われる部分

body[i++] = b/16 + (b/16>9?'A'-10:'0'); // バイナリ―から文字変換(上位) body[i++] = b%16 + (b%16>9?'A'-10:'0'); // バイナリ―から文字変換(下位) delay(50); if( i>=BODY_BUFFER ) { if(a3gs.httpPOST(server,port,path,header,body,res,&len,false)!=0){ //Serial.println("httpPOST error1...");SDとの通信が上手くできていない? delay(200); }else{ Serial.print("."); }

###補足情報

イメージ説明
構成:
Arduino mega2560
3gim・3gシールド
SDカードスロット
simカード soracom air
SDカード
TTLシリアルカメラ

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

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

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

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

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

guest

回答2

0

ボーレートの設定はいくつにしていますか?
115200にすると処理速度も向上して良いかもしれませんね。
アップロードしたバイナリデータとSDに保存されたバイナリデータとを見比べて、どこがおかしいかもチェックするといいかもしれません。

送信時にbase64変換していると思いますが、送信前とサーバーにアップしたバイナリデータが一致しているかも確認してみましょう。

最後に、httpPOSTで送信するより、TCPサーバーを設定してTCP送信した方が早く送信できます。
60kbのデータがhttpPOSTだと5分以上かかっていたのが、TCP送信だと数十秒になりました。

投稿2017/08/15 00:37

gaomar

総合スコア14

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

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

takuma.sakamoto

2017/08/17 07:43

ご回答ありがとうございます。ご連絡が遅くなり、申し訳ございません。 現在ボーレートは9600に設定しています。 ボーレートの変更を行い動作の確認を行いたいと思います。
guest

0

問題の切り分けと特定を行いましょう。
ノイズの発生個所は?
カメラでの撮影?
SDへの格納?
postする際?

これが特定できないと解決できません。
順番に確認(チェック)が必要です。

投稿2017/08/10 09:45

MasahikoHirata

総合スコア3747

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

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

MasahikoHirata

2017/08/10 09:49

これと似た現象を過去に見ました。それは”USB”のケーブルの長さ。 今回はTTLカメラですがケーブルの総長とこれに保障回路はどのようになっていますか?
takuma.sakamoto

2017/08/11 07:35

ご回答ありがとうございます。ご連絡が遅くなり申し訳ございません。 ・ノイズの発生個所: 共通して画像の右端から真横にノイズが入ります。 ・カメラでの撮影ーー>SDへの格納 SD内に格納されたデータを確認しましたがノイズは入っていませんでした。 ・サーバーへのpost postされた画像をサーバーで確認するとノイズが入ってしまいます。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ・TTLカメラケーブル長 97cm程になります。 ・保障回路について 保障回路とは電圧のブレをなくすような回路上の部品のことでしょうか? 例えば「http://iot.keicode.com/arduino/arduino-camera-sd-card.php」こちらのサイトを参考にさせていただき配線したのですが、サイト内に記述があるコンデンサのことでしょうか?でしたら手元に コンデンサがなかったので、回路にいれていません。 長くなってしまいましたが、以上よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問