So-net無料ブログ作成
前の5件 | -

SPRESENSEカメラのモニターをProcessingで作ってみた! [SPRESENSE]

前回、SPRESENSEとProcessingを使ってタイムラプスカメラを作ってみました。そこに、いつもチェックしているスタックオーバーフローで次のような問いかけが!



カメラのリアルタイムのプレビューをPCの画面に表示する方法

SPRESENSEのカメラで現在映しているプレビューを、PCの画面に表示させることは可能でしょうか。接続方法は、できれば、USB(メインボード側のSerial)が良いです。




ん!?これは、できそうな気がするぞ。SPRESENSEとProcessingを使えば…。

ということでチャレンジしてみました!

接続はリクエスト通りシリアルケーブル一本で。SPRESENSE からプレビュー画像を転送し、PC上の Processing でデータを受けて画像を表示します。


Spresense_monitor_s.png


余談ですが、少し前に3Dプリンタで作ったカメラホルダをつけてみました。カメラとUSBケーブルの干渉がなくなり、少しすっきりしました。


sDSC_0711.jpg


今回作成したスケッチです。すごくシンプルなのですが、Processing のシリアルはなかなか使いこなすのが大変で苦労しました。Windows + Java のためか、リアルタイムには程遠く、安定した通信をするために、ところどころ工夫が必要でした。


SPRESENSEのスケッチ
#include <Camera.h>

#define BAUDRATE       2000000

void CamCB(CamImage img) {

  if (img.isAvailable() == false) return;
 
  while (Serial.available() <= 0); 
  // taking a picture is started by receiving 'S'
  if (Serial.read() != 'S') return;
  delay(1); // wait for stable connection
  
  digitalWrite(LED0, HIGH);
  img.convertPixFormat(CAM_IMAGE_PIX_FMT_RGB565);
  char *buf = img.getImgBuff();
  for (int i = 0; i < img.getImgSize(); ++i, ++buf) {
    Serial.write(*buf);
  }
  digitalWrite(LED0, LOW);
}

void setup() {
  
  Serial.begin(BAUDRATE);
  while (!Serial) {};

  theCamera.begin();
  theCamera.startStreaming(true, CamCB);
  theCamera.setAutoWhiteBalanceMode(CAM_WHITE_BALANCE_DAYLIGHT);
}

void loop() {
  /* do nothing here */
}



Processingのスケッチ
import processing.serial.*;
import java.io.*;
Serial myPort;

PImage img;
final static int WIDTH = 320;
final static int HEIGHT = 240;
boolean started = false;
int serialTimer = 0;
int total = 0;
int x = 0;
int y = 0;

void setup() {
  size(320, 240); 
  background(0);
  img = createImage(WIDTH, HEIGHT, RGB); 
  myPort = new Serial(this, Serial.list()[0], 2000000);  
  myPort.clear();
  println("setup finished");
  delay(2000); // wait for stable connection
}

void draw() {

  if (started == false) {
    started = true;  
    println("start");
    myPort.write('S');
    myPort.clear();
    total = 0;      
    delay(10);
    return;
  }

  // To get stable connection, please adjsut this interval
  final int interval = 1;
  if (millis() - serialTimer > interval) {
    serialTimer = millis();   
    if (myPort.available() <= 0) return;
    
    while (myPort.available() > 0) {       
      char lbyte = (char)myPort.read();
      char ubyte = (char)myPort.read();
      x = total % WIDTH;
      y = total / WIDTH;
      int value = (ubyte << 8) | (lbyte); // RGB565 format
      char r = (char)(((value & 0xf800) >> 11) << 3);
      char g = (char)(((value & 0x07E0) >> 5)  << 2);
      char b = (char)((value & 0x001f) << 3);
      color c = color(r, g, b);
      img.set(x, y, c);
      ++total;

      if (total >= WIDTH*HEIGHT) {
        println("end");
        myPort.clear();
        started = false;
        total = 0;
        image(img, 0, 0);
        break;
      }
    }
  }
}



動かしてみると、パフォーマンスは、おおよそ 0.9-0.8fps 。理論的には、 (2000000/8) bytes / 153,600 bytes / =1.6 fps 位のはずですが、Processing の応答性が思いのほか悪く、あまり良い数字は出ませんでした。

実際の動きはこちらの動画で見ることができます!





パフォーマンスはいまいちですけど、この小さなカメラで画面を見れるのはいいですね。次はプレビューではなくて、もう少し大きな画像を転送してみようかな…。
(^^)/~


<参考記事>
SPRESENSEとProcessingでタイムラプスに挑戦! 
https://makers-with-myson.blog.so-net.ne.jp/2019-08-17






nice!(32)  コメント(1) 
共通テーマ:趣味・カルチャー

SPRESENSEメインボードだけでサーボモータを動かしてみた! [SPRESENSE]

SPRESENSEでサーボモータを動かそうとすると拡張ボードが必要ですが、拡張ボードをつけると大きくなってしまいます。サーボモータのシグナル信号が5Vのためです。


sDSC_0699.jpg


せっかく小さなSPRESENSEなのでメインボードだけでサーボモータを動かせないかなと思い、ダメ元でつなげて動かしてみることにしました。


sSpresense_SG90.png


実際に接続してみました。


sDSC_0706.jpg


スケッチはSPRESENSEのサンプルスケッチの”Servo”を少し改変した簡単なものです。


#include <Servo.h>

static Servo s_servo; 

void setup() {
  s_servo.attach(PIN_D16);
  s_servo.write(90);
  delay(5000);
}

void loop() {
  s_servo.write(0);
  delay(1000);
  s_servo.write(180);
  delay(1000);
}



さて、動いたでしょうか?常識的に考えれば動きませんが…
その結果は次の動画を参照ください!




(^^)/~




デジタル・マイクロサーボ SG90 (5個)

デジタル・マイクロサーボ SG90 (5個)

  • 出版社/メーカー: 梅本合同会社
  • メディア: おもちゃ&ホビー



nice!(38)  コメント(2) 
共通テーマ:趣味・カルチャー

SPRESENSEとProcessingでタイムラプスに挑戦! [SPRESENSE]

Spresense と Processing を使ってタイムラプス映像にチャレンジしてみました。次のような手順でやってみることにしました。

(1) カメラを接続した Spresense メインボードのUART2 をPCに接続
(2) Processing から撮影を開始を指示
(3) Spresense が撮影後に、UART2で画像をPCヘ送信
(4) Processing が受信し、ファイル保存ならびに画面を表示
(5) いくつか画像を取得したら ffmpeg で動画に変換

例によって動画にしていますので、お時間のある方はこちらをどうぞ。





Spresense と PC の接続にはFTDI製のUART-USB変換チップを乗せた変換ボードを使っています。PCには、Spresense用のスケッチを流し込むためと画像転送のための2つUSBケーブルを接続することになります。


Spresense_FTDI2.png


Spresenseのコードは比較的シンプルです。Processingから’S'が来ると撮影が開始するようになっています。Arduinoだとカメラを扱おうとすると大変ですが、Spresenseだと楽なもんですね。

#include 

#define BAUDRATE                (115200)
#define BAUDRATE2            (2000000)

void setup()
{
  Serial.begin(BAUDRATE);
  Serial2.begin(BAUDRATE2);
  while (!Serial) {};
  while (!Serial2) {};

  Serial.println("Prepare camera");
  theCamera.begin();

  Serial.println("Set Auto white balance parameter");
  theCamera.setAutoWhiteBalanceMode(CAM_WHITE_BALANCE_DAYLIGHT); 
  theCamera.setStillPictureImageFormat(
     CAM_IMGSIZE_QUADVGA_H,
     CAM_IMGSIZE_QUADVGA_V,
     CAM_IMAGE_PIX_FMT_JPG);
}

void loop()
{
  while (Serial2.available() <= 0);
  // taking a picture is started by receiving 'S'
  if (Serial2.read() != 'S') return;
 
  Serial.println("call takePicture()");
  CamImage img = theCamera.takePicture();

  if (!img.isAvailable()) {
    Serial.println("take image failure");
    return;
  }

  Serial.println("start transfer");
  char* buf = img.getImgBuff();
  for (int i = 0; i < img.getImgSize(); ++i, ++buf) {
    Serial2.write(*buf);
  }
  Serial.println("end transfer");
}



Processing のスケッチは若干複雑です。キーボードを押すとSpresenseが撮影を開始し、マウスを押すと画像をセーブし表示するようにしています。

import processing.serial.*;
import java.io.*;
Serial myPort;

OutputStream output;
PImage img;
String filename;
boolean started = false;
int file_number = 0;
int serialTimer = 0;
int nodata_counter = 0;

void setup() {
  size(1280, 960); background(0);
  printArray(Serial.list());
  // when debugging, you may have 2 serial ports
  myPort = new Serial(this, Serial.list()[1], 2000000);
  // myPort = new Serial(this, Serial.list()[0], 2000000);
  myPort.clear();
}

void draw() {
  try {
    if (started == false) return;
    
    // The serial of Processing communicates every 50msec
    if (millis() - serialTimer > 50) {
      serialTimer = millis();
      if (myPort.available() <= 0) {
        ++nodata_counter; 
        return;
      }
      while (myPort.available() > 0) {
        output.write(myPort.read());
      }
      nodata_counter = 0;
    }
  } catch (Exception e) {
    e.printStackTrace();
    return;
  }
}

void keyPressed() {
  started = true;
  filename = "foge" + String.format("%03d", file_number) + ".jpg";
  output = createOutput(filename);  
  ++file_number;
  myPort.write('S');
  myPort.clear();
}

void mousePressed() {
  println("nodata_counter: " + String.format("%d", nodata_counter));
  // wait 100msec after receiving all jpg data
  if (nodata_counter < 2 || started == false) {
    return;
  }

  try {
    output.flush();
    output.close();
  } catch (Exception e) {
    e.printStackTrace();
    return;
  }  
  
  img = loadImage(filename);
  image(img, 0, 0);
  started = false;
}



複雑になってしまっている原因は、Processing のシリアルが50msec 毎に処理するようになっているためです。連続でデータを受けとらないため、バッファが空になったのを転送終了と判定できません。

画像の転送が終わったかどうかは、バッファが”しばらく”空になったかどうかで判定しています。

台風の影響で雲の流れが速かったので、雲の様子をとることにしました。二つもUSBをつなぐのは面倒なので電池駆動にしました。


DSC_0701.JPG


実際にとれた画像がこちらです。このような雲の画像を約80枚ほど撮影しました。台風通過後だったので流れる雲の良い画がとれました。


foge12.jpg


これを動画にするには、ImageMagick に含まれる ffmpeg を使います。以下のコマンドで変換できます。ImageMagick はこちらで入手できます。


$ ffmpeg -f image2 -r 5 -i foge%03d.jpg -r 30 -s 1280x960 -vf format=yuv420p -vcodec libx264 -an video.mp4



動画はこちらで確認できます。短い時間しか撮っていませんが、思ったよりも楽しいものですね。





これでPCとの連携ができたので、次は動体検出などもっと高度なことができるようになるかも知れません。
(^^)/~


<関連記事>
SPRESENSEカメラのモニターをProcessingで作ってみた!
https://makers-with-myson.blog.so-net.ne.jp/2019-09-08






FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)

FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)

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



nice!(37)  コメント(0) 
共通テーマ:趣味・カルチャー

米国へ弾丸出張してまいりました!(2) [徒然日記]

シンシナティからサンディエゴはダラス乗り換え。ダラス発のサンディエゴ便は最終便です。トランジットの時間は50分しかありません。なのに豪雨のため出発が30分遅れ!


sDSC_0614.jpg
飛行機も旧型で乗り心地は最悪でした


ダラスには25分遅れで到着。ターミナルが違うので焦りましたが、なんとか間に合いました。結局サンディエゴに着いたのは深夜の12時頃。サンディエゴは4年ぶりくらいです。


sDSC_0618.jpg
サンディエゴ空港は国際空港なので、夜遅くでもたくさんの人!


次の日は朝早くからティファナへ。取引先が用意してくれたバスで向かいました。サンディエゴとティファナのゲートです。入国審査は事前に取引先が準備してくれた書類があったのですんなりと済みました。


sDSC_0620.jpg
メキシコへの入国審査はすんなりと済みました


国境を超えると雰囲気ががらっと変わります。浮浪者が多く街並みもおせじにもきれいとは言えません。


sDSC_0627.jpg
ここでもかなり綺麗なほうです


ちょっと離れた高台にカラフルな住宅街が見えてきました。高級住宅街なのかな?


sDSC_0628.jpg
これだけでなく黄色や青の建物もたくさんありました


帰りはすごい渋滞に会いました。車が道をふさいでいて、すぐ近くにに亡くなっている人が横たわっていました。交通事故か事件のようですが、こちらは人が亡くなっていても救急車も来ずに野ざらしなんですね。怖いー!

ようやくゲートに着いたのですが、メキシコからアメリカへの再入国審査はすごい行列。ゲート通過まで1.5時間かかりました。その間、物乞いがひっきりなしに来て警戒心はマックス!


sDSC_0629.jpg
人が多いうえに暑くて、しかも物乞いが行列の合間をうろうろしていて苦痛の1時間半でした


外国人の行列は流れていましたが、メキシコ人の行列は全く動く気配はありませんでした。メキシコ人がアメリカ入るのはかなり大変そうです。

次の日はサンディエゴのオフィスで打合せです。ちょっと休憩モード。サンディエゴは思ったもったよりも肌寒かったですが、天気がよくて気持ち良いですね。これぞ西海岸。


sDSC_0634.jpg


その日の午後にはサンノゼに入るために慌ただしく空港に。サンディエゴ空港から遠くにサンディエゴのダウンタウンが見えました。


sDSC_0636.jpg


サンノゼに到着したのは夜の7時頃。サンノゼはよく知った町なのでホッとします。


sDSC_0637.jpg


サンノゼで一泊したあと、翌日はサンマテオで打合せ。今回は渋滞回避のために、サンノゼからサンマテオまでサンマテオ橋を使って向かいました。有料道路で$6かかります。


sDSC_0644.jpg


サンマテオで打合せをしたのちに、SFOまで送ってもらいその日の夕方に日本に向かいました。日本に到着したのは夜の7時。蒸し暑さと安ど感で疲れがどっと出てきました。


sDSC_0649.jpg


ほぼ毎日飛行機に乗る弾丸出張。現地社員は ”またお客さん回りをするから” とやる気満々。アメリカのビジネスは飛行機で巡るのが当たり前なんだと改めて感じました。これからも続きそうです。
(´Д`)/





B02 地球の歩き方 アメリカ西海岸 ロスアンゼルス サンディエゴ サンフランシスコ ラスベガス 2020~2021

B02 地球の歩き方 アメリカ西海岸 ロスアンゼルス サンディエゴ サンフランシスコ ラスベガス 2020~2021

  • 作者:
  • 出版社/メーカー: ダイヤモンド・ビッグ社
  • 発売日: 2019/09/12
  • メディア: 単行本(ソフトカバー)







タグ:出張
nice!(37)  コメント(0) 
共通テーマ:趣味・カルチャー

米国へ弾丸出張してまいりました!(1) [徒然日記]

先週一杯、米国ならびに少しメキシコへ弾丸出張し、無事に帰ってきました!( ー`дー´)
ほぼ毎日飛行機で移動するという、とっても厳しい日程でした。

最初の訪問都市はテキサスのマンスフィールドというところです。テキサスのダラスフォートワース空港から高速で約30~40分で到着しました。ホテルについた頃にはもう夕方。夕日が綺麗でした。


sDSC_0594.jpg
テキサスはずっと平原で山が見えません。家も平屋建てが多く平地がずっと広がっています。


夕御飯を食べるところを探しに街中を練り歩いていたら、ヴィンテージな救急車を発見しました。


sDSC_0596.jpg
さすがに現役では走っていないと思いますが、古きよきアメリカを思い起こさせますね


マンスフィールドは思ったよりも田舎で、夜出歩いてもいても危険はまったく感じませんでした。ホテルやお店の人も親切で、古き良きアメリカがまだ残っている感じです。

取引先の人に話を聞くと、テキサスは好景気のようです。高速道路が拡張されたり、街がすごいきれいに整備されています。バブルで住みにくくなっているサンフランシスコに嫌気をさしたスタートアップがテキサスに続々と拠点を移しているそうです。住宅価格もあがっているとか。

sDSC_0600.jpg
高速道路は拡張され、街並みはきれいです

sDSC_0601.jpg
高速道路からダラスの街並みが見えました

それでも圧倒的に物価は安いですね。例えばサンフランシスコではビジネス向けホテルが最近は一泊$300(!)以上なのですが、テキサスのマンスフィールドではたったの$100でした。実に1/3です。


次の訪問都市はオハイオのシンシナティです。シンシナティ空港ではマンモスなど多くの化石が展示されていました。日本の福井のように化石で有名な街なんでしょうか。勉強不足でわかりません。


sDSC_0602.jpg
マンモスの化石 迫力あります

sDSC_0603.jpg
バイソンの祖先にあたる大きな角を持つバイソン


冬はかなり雪深くなるそうで、そのせいか風景はまるで北海道。都市部にいかなかったこともあり、あまり特徴のある風景はありませんでした。観光地としてはあまり魅力はなさそうです。

sDSC_0606.jpg
ケンタッキー州の近くにあったKFC、まるで風景は日本


シンシナティはこの時期、天気が変わるのがあっという間で、晴れていたのに10分後には前が見えないほどの豪雨に見舞われました。豪雨でしばしば飛行機が遅れてしまうので要注意です。

sDSC_0613.jpg
前が見えないくらいの豪雨のあとの空港。多くのフライトが2時間ほど遅れてました。


次の訪問都市はサンディエゴ経由でメキシコ・ティファナ。長くなるので続きは次回!
(^^)/~





なぜ、トヨタはテキサスに拠点を移したのか?

なぜ、トヨタはテキサスに拠点を移したのか?

  • 作者: 倉石灯
  • 出版社/メーカー: 日本実業出版社
  • 発売日: 2018/12/18
  • メディア: 単行本(ソフトカバー)



資産家たちはなぜ今、テキサスを買い始めたのか?

資産家たちはなぜ今、テキサスを買い始めたのか?

  • 作者: 倉石 灯/角内 創
  • 出版社/メーカー: ぱる出版
  • 発売日: 2017/04/03
  • メディア: 単行本(ソフトカバー)



タグ:出張
nice!(36)  コメント(3) 
共通テーマ:趣味・カルチャー
前の5件 | -