買い物

投稿日:

 写真の趣味はないので専門的な写真用品を買うことは滅多にない。

 だが、今日は珍しく秋葉原ヨドバシで変わった写真用品を買った。「無反射ガラス」というものだ。

 これは書画やカタログのページを撮影するような場合、綺麗に撮るため、被写体の上に乗せて平らに伸ばし、かつ反射を抑えるのに使われる。定価は2600円だが、実売は税込1540円だ。

 これを買って何をする気かというと、図書館で借りてきた本の一部をコピーするのに使うのだ。資料として後で引用などしたいことも多いが、図書館の本は返さなければならない。さりとてコピーはお金がかかる。

手で押さえる場合

 フラットベッドスキャナを使えばいいようなものだが、スキャナは綺麗にコピーできる反面、スキャンに時間がかかり、また借り物の本を無理に拡げて押し付けるので綴じが傷むことが心配だ。一方、デジカメなら、ページをパチリと撮るだけだから、格段に速い。しかし逆に、光が反射して読めない字があったり、本をいい加減に拡げるから波打って歪みが出たりする。

無反射ガラスを乗せた場合

 そこで、この無反射ガラスを本などの上に乗せて撮るわけだ。

 写真用品の「無反射ガラス」は、いわゆる「()りガラス」をもう少し上質にしたようなものだが、昔の木枠窓に(はま)っているようなものとは違い、絶妙の透明度になっている。

 写真は適当に載せて撮ったので、両端が不鮮明だが、しっかり押さえれば鮮明に写り、光の反射も少ない。このままPDFにしてOCRによる文字認識も可能である。

こりゃあ驚いた

投稿日:

 なるほど、なあ……。今度は指紋か。デジカメもおっそろしく高解像度化してるもんな。

 今まではネットに写真を出すのに、人の顔が写り込んでいたらモザイク消しにしたりするのが一つのたしなみでもあったが、今度は手の写り込みにも慎重にならなくてはいけなくなってきたわけだ……。

 スマホの内蔵カメラは言うに及ばず、先頃私が購入したコンデジ「IXY 190」などもそうだが、これくらいの普及価格のコンデジですら、カメラからサクッとクラウドに繋がり、ヒョイヒョイSNSに写真を上げることができる。勿論Exif情報にはGPSデータ付きだ。今時Facebookなどの無料SNSでも、顔はパッパッと認識され、ビシビシとタグ付けされる。Facebookでは手動で許可しなければタグ付けされないが、これが仮にクラウドの向うで全部自動顔認識されていたとしても、こちらにはそれを確かめる術はない。

 ま、だからと言って、コレは如何なものかと思うが(笑)。

ARuFa氏

 あと、この人なんかもうかれこれ10年くらい顔認識できないようになってますよ。

 そのうち、何か分光分析のようなことで画像から血液型までわかるとか、そんなことにならんだろうねえ。あるいは、極端な高解像度化により、画像からDNAまでわかる、とか。千年くらいかかるかなあ、そうなるには。……いや、意外と100年とか、50年でできるかも?

JetpackのOGPイメージがブランクなのが気に入らないので

投稿日:

 ブログからFacebookやTwitterへのクロスポストをするのに、jetpackというプラグインをありがたく使わせていただいているが、エントリに画像を特に載せなかった場合、Facebookなどへ送られるイメージがブランクになるのが気に入らない。

 FacebookやTwitterは、「OGP」と言われる仕組みを使ってアイキャッチ画像を載せる。htmlヘッダのmetaタグに「property」という属性を置いて、これに「og:image……」などと記載し、content属性に画像のURLを書いておけば、それがFacebookやTwitterなどに読み取られ、使われるのである。例えば、FacebookやTwitterにリンクを張った際に「http://k.yimg.jp/images/top/sp2/event/newyear/2016/omikuji2016_logo.png」という画像を載せたければ、ヘッダに書くタグは次のとおりである。

<meta property="og:image" content=http://k.yimg.jp/images/top/sp2/event/newyear/2016/omikuji2016_logo.png" />

(ヤフーさんに迷惑がかかるので、よいこの皆さんはこういう悪ふざけをしてはいけません。)(笑)

 なので、これを適当に書いてやれば、特に画像を使用していないブログのエントリでも、適当な画像がSNSにバナーのようにポストされる。

 前に、自分のプロフィールイメージが載るようにここを書き換えてみていたのだが、毎回毎回自分のむさくるしいイメージ(コレ(笑))が載るのも鬱陶しい。さりとて、いちいちアイキャッチ画像を毎回載せるのも面倒なので、適当な画像素材を1000個くらい見えるところにアップロードし、乱数で適当なものを選ぶようにしてみた。

 プラグインファイルの編集機能を使い、「jetpack/functions.opengraph.php」というファイルを次のように書き換えるのである。

(該当箇所抜粋)

	if ( empty( $image ) ) {
		/**
		 * Filter the default Open Graph Image tag, used when no Image can be found in a post.
		 *
		 * @since 3.0.0
		 *
		 * @param string $str Default Image URL.
		 */
		//$image['src'] = apply_filters( 'jetpack_open_graph_image_default', 'https://s0.wp.com/i/blank.jpg' );
		$randimage = "https://satotoshio.net/blog/wp-content/uploads/2015/12/PHM14_" . sprintf("%04d", rand(1, 1000)) . ".jpg";
		$image['src'] = apply_filters( 'jetpack_open_graph_image_default', $randimage);
	}

 この方法を使うと、jetpackがアップデートされるたびにこの部分を書き換えなければならなくなるが、まあ、いいや、そんなに頻繁にアップデートはないし。

空の写真リベンジ

投稿日:

 先週試したAdafruit製の「小型TTLシリアルjpegカメラ」での間欠撮影先週はどうしたわけか同じ画像ばかり撮れてしまい、失敗である。

 (チナミに、このカメラのメーカーの「Adafruit」という会社、有名なマッシモ・バンジのTEDの中で紹介されていたことに気付いた。)

https://youtube.com/watch?v=UoBUXOOdLXY%3Ft%3D5m50s

 気を取り直して、スケッチを直す。撮影時のカメラのステータスを確認し、撮れていなければ何回でも撮り続ける。

「while(撮れてない)撮る;」

……というわけだ。まあ、万が一ハードウェアエラーなどがあるとループが回り続けるので良くないが、ループが回り続けようが結局のところはモノとしては電源を入れ直す他にどうしようもないので、こんなものだろう。

 それと、撮影が終わったらカメラをそのつどリセットすることにした。また、既に存在するファイル名は避けるようにした。こういう時、Arduinoには書式文字列付きの「sprintf」がないので、少し不便だなと思う。

 夜明けから日没までの一日の空の雲を撮りたいので、天気予報を見て雨が降らぬ確信を持ってから、昨夜寝る前にベランダにカメラをセットしておいた。朝早く起きるより楽だからだ。夜のうちに1000枚くらい写真が撮れてしまうが、SDカードには余裕があるので大丈夫である。

 昼間は用事があるのでカメラの面倒は見れないが、放置しておけば淡々と写真は撮れていく。

IMG_3143

 で、撮れた写真をWindows Movie Makerに流し込むと、微速撮影動画の一丁上がりだ。

 スケッチは次のとおりである。

//
//  camera2Web.ino
//    27.07.20(月) 0850~
//    佐藤俊夫
//    Adafruit製小型TTLシリアルJPEGカメラ+ETHERNET SHIELD 2で
//    間欠撮影をし、Webでダウンロードできるようにする。
//
#include <Adafruit_VC0706.h>
#include <SPI.h>
#include <SD.h>
#include <SoftwareSerial.h>
#include <Ethernet2.h>

#define CHIPSELECT 4

SoftwareSerial CAMCONNECTION(2, 3);
Adafruit_VC0706 CAM = Adafruit_VC0706(&CAMCONNECTION);
const unsigned long int INTERVAL = 30L * 1000L;
byte MAC[] = {  0x90, 0xA2, 0xDA, 0x0F, 0xF6, 0x74 };
IPAddress IP(192, 168, 1, 129);
EthernetServer SERVER(80);
EthernetClient CLIENT;

void setup() {
  pinMode(10, OUTPUT);
  if(!SD.begin(CHIPSELECT)) return;
  if(!CAM.begin()) return;
  CAM.setImageSize(VC0706_320x240);
  Ethernet.begin(MAC, IP);
  SERVER.begin();
  delay(1000);
}

void loop() {
  static unsigned long int prevtime = 0;
  char c;
  String rstr = "";
  //  INTERVALおきに写真を撮る
  if(millis() >= prevtime + INTERVAL){
    prevtime = millis();
    takePicture();
  }
  //  Webサーバ
  CLIENT = SERVER.available();
  if(CLIENT) {
    while(CLIENT.connected()) {
      if(CLIENT.available()) {
        c = CLIENT.read();
        rstr += c;
        if(rstr.endsWith("\r\n")){
          break;
        }
      }
    }
    if(rstr.indexOf("IMG") >= 0){
      String filename = "DCIM/";
      char cfilename[17];
      filename.concat(rstr.substring(rstr.indexOf("IMG"), rstr.indexOf("JPG") + 3));
      filename.toCharArray(cfilename, 17);
      CLIENT.println("HTTP/1.1 200 OK");
      CLIENT.println("Content-Type: image/jpg");
      CLIENT.println("Connection: close");
      CLIENT.println();
      File img = SD.open(cfilename);
      while(img.available()){
        CLIENT.write(img.read());
      }
      img.close();
    }else{
      sendform();
    }
    rstr = "";
    delay(1);
    // close the connection:
    CLIENT.stop();
  }
  delay(20);
}

void sendform(){
  //  フォームを送る。
  CLIENT.println("HTTP/1.1 200 OK");
  CLIENT.println("Content-Type: text/html");
  CLIENT.println("Connection: close");
  CLIENT.println();
  CLIENT.println("<!DOCTYPE HTML>");
  CLIENT.println("<html><head></head><body><center>");
  File dcim = SD.open("/DCIM");
  while(true) {
    File imgfile =  dcim.openNextFile();
    if(!imgfile){
      dcim.rewindDirectory();
      break;
    }
    CLIENT.write("<a href=\"");
    CLIENT.write(imgfile.name());
    CLIENT.write("\">");    
    CLIENT.write(imgfile.name());
    CLIENT.println("</a><br>");
    imgfile.close();    
  }
  dcim.close();
  CLIENT.println("</center></body></html>");
}

void takePicture(){
  static unsigned int pnum = 0;
  char filename[] = "DCIM/img0000.jpg";
  while(!CAM.takePicture());
  do{
    filename[8]  = '0' + pnum / 1000;
    filename[9]  = '0' + (pnum / 100) % 10;
    filename[10] = '0' + (pnum /  10) % 10;
    filename[11] = '0' + pnum % 10;
    pnum ++;
  }while(SD.exists(filename));
  if(pnum > 9999) pnum = 0;
  File imgFile = SD.open(filename, FILE_WRITE);
  uint16_t jpglen = CAM.frameLength();
  pinMode(8, OUTPUT);
  while (jpglen > 0) {
    uint8_t *buffer;
    uint8_t bytesToRead = min(32, jpglen);
    buffer = CAM.readPicture(bytesToRead);
    imgFile.write(buffer, bytesToRead);
    jpglen -= bytesToRead;
  }
  while(!CAM.reset());
  imgFile.close();
}




Webでサービスできるカメラ

投稿日:

 一昨日遊んだカメラ。今日はこれにETHERNET SHIELD 2を取り付けて遊んでみる。

  •  間欠的に写真を撮り続ける。
  •  SDに保存する。
  •  ウェブアクセスがあると、一覧でサービスする。

 まあ、これくらいで。サムネイル画像などハデに出したい気もするが、Arduinoはメモリも小さく、そんなに気の利いたウェブサービスはできない。

 プロトタイピングシールドのブレッドボードに組み付ける。

IMG_3136

 まず、スケッチはこんなところだろう。

//
//  camera2Web.ino
//    27.07.20(月) 0850~
//    佐藤俊夫
//    Adafruit製小型TTLシリアルJPEGカメラ+ETHERNET SHIELD 2で
//    間欠撮影をし、Webでダウンロードできるようにする。
//
#include <Adafruit_VC0706.h>
#include <SPI.h>
#include <SD.h>
#include <SoftwareSerial.h>
#include <Ethernet2.h>

#define CHIPSELECT 4

SoftwareSerial CAMCONNECTION(2, 3);
Adafruit_VC0706 CAM = Adafruit_VC0706(&CAMCONNECTION);
const unsigned long int INTERVAL = 30L * 1000L;
byte MAC[] = {  0x90, 0xA2, 0xDA, 0x0F, 0xF6, 0x74 };
IPAddress IP(192, 168, 1, 129);
EthernetServer SERVER(80);
EthernetClient CLIENT;

void setup() {
  pinMode(10, OUTPUT);
  if(!SD.begin(CHIPSELECT)) return;
  if(!CAM.begin()) return;
  CAM.setImageSize(VC0706_320x240);
  Ethernet.begin(MAC, IP);
  SERVER.begin();
  delay(1000);
}

void loop() {
  static unsigned long int prevtime = 0;
  char c;
  String rstr = "";
  //  INTERVALおきに写真を撮る
  if(millis() >= prevtime + INTERVAL){
    prevtime = millis();
    takePicture();
  }
  //  Webサーバ
  CLIENT = SERVER.available();
  if(CLIENT) {
    while(CLIENT.connected()) {
      if(CLIENT.available()) {
        c = CLIENT.read();
        rstr += c;
        if(rstr.endsWith("\r\n")){
          break;
        }
      }
    }
    if(rstr.indexOf("IMG") >= 0){
      String filename = "DCIM/";
      char cfilename[17];
      filename.concat(rstr.substring(rstr.indexOf("IMG"), rstr.indexOf("JPG") + 3));
      filename.toCharArray(cfilename, 17);
      CLIENT.println("HTTP/1.1 200 OK");
      CLIENT.println("Content-Type: image/jpg");
      CLIENT.println("Connection: close");
      CLIENT.println();
      File img = SD.open(cfilename);
      while(img.available()){
        CLIENT.write(img.read());
      }
      img.close();
    }else{
      sendform();
    }
    rstr = "";
    delay(1);
    // close the connection:
    CLIENT.stop();
  }
  delay(20);
}

void sendform(){
  //  フォームを送る。
  CLIENT.println("HTTP/1.1 200 OK");
  CLIENT.println("Content-Type: text/html");
  CLIENT.println("Connection: close");
  CLIENT.println();
  CLIENT.println("<!DOCTYPE HTML>");
  CLIENT.println("<html><head></head><body><center>");
  File dcim = SD.open("/DCIM");
  while(true) {
    File imgfile =  dcim.openNextFile();
    if(!imgfile){
      dcim.rewindDirectory();
      break;
    }
    CLIENT.write("<a href=\"");
    CLIENT.write(imgfile.name());
    CLIENT.write("\">");    
    CLIENT.write(imgfile.name());
    CLIENT.println("</a><br>");
    imgfile.close();    
  }
  dcim.close();
  CLIENT.println("</center></body></html>");
}

void takePicture(){
  static unsigned int pnum = 0;
  char filename[] = "DCIM/img0000.jpg";
  CAM.takePicture();
  filename[8]  = '0' + pnum / 1000;
  filename[9]  = '0' + (pnum / 100) % 10;
  filename[10] = '0' + (pnum /  10) % 10;
  filename[11] = '0' + pnum % 10;
  pnum ++;
  if(pnum > 9999) pnum = 0;
  if(SD.exists(filename)) return;
  File imgFile = SD.open(filename, FILE_WRITE);
  uint16_t jpglen = CAM.frameLength();
  pinMode(8, OUTPUT);
  while (jpglen > 0) {
    uint8_t *buffer;
    uint8_t bytesToRead = min(32, jpglen);
    buffer = CAM.readPicture(bytesToRead);
    imgFile.write(buffer, bytesToRead);
    jpglen -= bytesToRead;
  }
  imgFile.close();
}

  で、電源をつないで放置しておくと、写真が撮れるわけだ。既存のファイル名を避けるような芸コマなことはしてないけど、これはこれでけっこう面白い。

 いつもの100円ショップのアクリル枠にねじ止めする。このカメラは上下が逆に映るので、こうすると丁度カメラが逆さまになって具合が良い。

IMG_3138

 それで、以前にWIZnetで紹介されて愉快だったアレのリベンジをやってみよう。携帯用のカメラホルダーに取り付け、ベランダに出して放置。

IMG_3139

カメラで遊んでみる

投稿日:

 秋月電子のサイトを見ていると、小さなカメラがあり、Arduinoに付きそうな感じだ。

 3850円。Arduino自体が2800円かそこらなので、それに比べるとちょっと高いが、早速行って購入。

 だが、あまり情報は多くない。まず、メーカーのサイトを見ていくと、チュートリアルがあり、「とりあえずテストするには、電源をくれてやって、一番端のピンをテレビにつなぎゃあ絵が出る」みたいなザックリ感満載の解説が。それで、テレビにつなぐためのRCAジャックなども買う。

 チュートリアルはこれを読んでおけばだいたいいいようだ。

 ほどいてみるとこんな感じで、かなり小さい。

IMG_3112

 ピンのピッチが2mmで、ブレッドボードで扱いにくい。それで、普通の2.54mmのピンヘッダを出して、その根元をこんなふうにムリヤリ(笑)2mmピッチにせばめる。

IMG_3116

 こいつをカメラの基盤にえいやっ、とねじ込み、半田付けする。

IMG_3118

 なかなか小さいので、ルーペと老眼鏡を併用しつつ、ICなんか壊しちゃってもナンだから、20Wのぬるくて細い半田鏝でさっさとつける。

IMG_3117

 我ながらなかなかスピーディな仕事だなあ(笑)。

 で、メーカーのサイトには「5V」と書いてあるが、これは互換品の別の製品のためのチュートリアルのようで、買ってきたものの基盤をよく見ると「3.3V」と印刷されている。壊してはもったいないから、3.3Vで試す。3.3Vの電源代わりにArduinoの3.3Vピンを使う。

 基盤の印刷通り、3.3V、GND、それから右端のピンをRCAジャックのセンターに、RCAジャックのアースを同じくGNDに入れて、テレビの前に持っていく。

IMG_3119

 テレビにつなぐと、おお、確かに、値段なりのフザけた画質(笑)で、自分の顔が映る。

IMG_3121

 上下が逆だが、まあ、いいや。

 で、今度はArduinoで画像を撮影してみよう。

 チュートリアルにしたがってArduino用のライブラリをダウンロードし、これをArduinoのインストールフォルダの「libraries」に配置する。

 そうしておいてArduinoのIDEを起動すると、「ファイル」→「スケッチの例」の中に「Adafruit VC0706 Serial Camera Library」が現れるから、この中から「Snapshot」を選ぶ。これは静止画をjpegで撮影するスケッチのサンプルだ。

// This is a basic snapshot sketch using the VC0706 library.
// On start, the Arduino will find the camera and SD card and
// then snap a photo, saving it to the SD card.
// Public domain.

// If using an Arduino Mega (1280, 2560 or ADK) in conjunction
// with an SD card shield designed for conventional Arduinos
// (Uno, etc.), it's necessary to edit the library file:
//   libraries/SD/utility/Sd2Card.h
// Look for this line:
//   #define MEGA_SOFT_SPI 0
// change to:
//   #define MEGA_SOFT_SPI 1
// This is NOT required if using an SD card breakout interfaced
// directly to the SPI bus of the Mega (pins 50-53), or if using
// a non-Mega, Uno-style board.

#include <Adafruit_VC0706.h>
#include <SPI.h>
#include <SD.h>

// comment out this line if using Arduino V23 or earlier
#include <SoftwareSerial.h>         

// uncomment this line if using Arduino V23 or earlier
// #include <NewSoftSerial.h>       

// SD card chip select line varies among boards/shields:
// Adafruit SD shields and modules: pin 10
// Arduino Ethernet shield: pin 4
// Sparkfun SD shield: pin 8
// Arduino Mega w/hardware SPI: pin 53
// Teensy 2.0: pin 0
// Teensy++ 2.0: pin 20
#define chipSelect 10

// Pins for camera connection are configurable.
// With the Arduino Uno, etc., most pins can be used, except for
// those already in use for the SD card (10 through 13 plus
// chipSelect, if other than pin 10).
// With the Arduino Mega, the choices are a bit more involved:
// 1) You can still use SoftwareSerial and connect the camera to
//    a variety of pins...BUT the selection is limited.  The TX
//    pin from the camera (RX on the Arduino, and the first
//    argument to SoftwareSerial()) MUST be one of: 62, 63, 64,
//    65, 66, 67, 68, or 69.  If MEGA_SOFT_SPI is set (and using
//    a conventional Arduino SD shield), pins 50, 51, 52 and 53
//    are also available.  The RX pin from the camera (TX on
//    Arduino, second argument to SoftwareSerial()) can be any
//    pin, again excepting those used by the SD card.
// 2) You can use any of the additional three hardware UARTs on
//    the Mega board (labeled as RX1/TX1, RX2/TX2, RX3,TX3),
//    but must specifically use the two pins defined by that
//    UART; they are not configurable.  In this case, pass the
//    desired Serial object (rather than a SoftwareSerial
//    object) to the VC0706 constructor.

// Using SoftwareSerial (Arduino 1.0+) or NewSoftSerial (Arduino 0023 & prior):
#if ARDUINO >= 100
// On Uno: camera TX connected to pin 2, camera RX to pin 3:
SoftwareSerial cameraconnection = SoftwareSerial(2, 3);
// On Mega: camera TX connected to pin 69 (A15), camera RX to pin 3:
//SoftwareSerial cameraconnection = SoftwareSerial(69, 3);
#else
NewSoftSerial cameraconnection = NewSoftSerial(2, 3);
#endif

Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);

// Using hardware serial on Mega: camera TX conn. to RX1,
// camera RX to TX1, no SoftwareSerial object is required:
//Adafruit_VC0706 cam = Adafruit_VC0706(&Serial1);

void setup() {

  // When using hardware SPI, the SS pin MUST be set to an
  // output (even if not connected or used).  If left as a
  // floating input w/SPI on, this can cause lockuppage.
#if !defined(SOFTWARE_SPI)
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  if(chipSelect != 53) pinMode(53, OUTPUT); // SS on Mega
#else
  if(chipSelect != 10) pinMode(10, OUTPUT); // SS on Uno, etc.
#endif
#endif

  Serial.begin(9600);
  Serial.println("VC0706 Camera snapshot test");
  
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }  
  
  // Try to locate the camera
  if (cam.begin()) {
    Serial.println("Camera Found:");
  } else {
    Serial.println("No camera found?");
    return;
  }
  // Print out the camera version information (optional)
  char *reply = cam.getVersion();
  if (reply == 0) {
    Serial.print("Failed to get version");
  } else {
    Serial.println("-----------------");
    Serial.print(reply);
    Serial.println("-----------------");
  }

  // Set the picture size - you can choose one of 640x480, 320x240 or 160x120 
  // Remember that bigger pictures take longer to transmit!
  
  cam.setImageSize(VC0706_640x480);        // biggest
  //cam.setImageSize(VC0706_320x240);        // medium
  //cam.setImageSize(VC0706_160x120);          // small

  // You can read the size back from the camera (optional, but maybe useful?)
  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()) 
    Serial.println("Failed to snap!");
  else 
    Serial.println("Picture taken!");
  
  // Create an image with the name IMAGExx.JPG
  char filename[13];
  strcpy(filename, "IMAGE00.JPG");
  for (int i = 0; i < 100; i++) {
    filename[5] = '0' + i/10;
    filename[6] = '0' + i%10;
    // create if does not exist, do not open existing, write, sync after write
    if (! SD.exists(filename)) {
      break;
    }
  }
  
  // Open the file for writing
  File imgFile = SD.open(filename, FILE_WRITE);

  // Get the size of the image (frame) taken  
  uint16_t jpglen = cam.frameLength();
  Serial.print("Storing ");
  Serial.print(jpglen, DEC);
  Serial.print(" byte image.");

  int32_t time = millis();
  pinMode(8, OUTPUT);
  // Read all the data up to # bytes!
  byte wCount = 0; // For counting # of writes
  while (jpglen > 0) {
    // read 32 bytes at a time;
    uint8_t *buffer;
    uint8_t bytesToRead = min(32, jpglen); // change 32 to 64 for a speedup but may not work with all setups!
    buffer = cam.readPicture(bytesToRead);
    imgFile.write(buffer, bytesToRead);
    if(++wCount >= 64) { // Every 2K, give a little feedback so it doesn't appear locked up
      Serial.print('.');
      wCount = 0;
    }
    //Serial.print("Read ");  Serial.print(bytesToRead, DEC); Serial.println(" bytes");
    jpglen -= bytesToRead;
  }
  imgFile.close();

  time = millis() - time;
  Serial.println("done!");
  Serial.print(time); Serial.println(" ms elapsed");
}

void loop() {
}

 で、これはSDカードに書き込むようになっている。

 私の手持ちの、ArduinoにSDカードをつなぐ手段は、先日から愛用中の「ETHERNET SHIELD 2」に搭載されているSDカードスロットだけだから、とりあえずこれを使う。

 手持ちのSDカードをETHERNET SHIELD 2に挿し、Adafruitのサイトのチュートリアルを参考に回路をブレッドボードに組む。

IMG_3122

 注意する点は2つだ。

  1.  サンプルスケッチをよく読むと、普通のSDカードは10番ピンを使うが、ETHERNET SHIELD 2を使う場合は4番ピンにつながる。なので、サンプルスケッチの中の「#define chipSelect 10」というところを「#define chipSelect 4」に書き換えなければならない。
  2.  メーカーサイトのチュートリアルでは、カメラに添付の10kΩの抵抗をTXの次に直列に二つ入れて、1本目と2本目の間からTXをとり、それをアースしているが、どうもこれだとうまく行かなかった。多分、このチュートリアルは給電が5Vだからだと思う。そこで、アースはそのままに、1本目の手前でTXをとるとうまくいった。
    IMG_3127

 そうやってArduinoをスタートさせると、写真が1枚だけ撮れる。

 下は、そうやって撮った私の顔である。

IMAGE02

 ……むっちゃむさくるしいなあw。

バイエル#106 その0.01

投稿日:

 バイエル106番、楽譜を読み出してからもうひと月以上は経つが、まだ弾けていない。

 仕事が忙しくなってしまったのだ。

 だが、練習はやめてなどいない。にじり這うようにして前進しつつある。・・・とはいうものの、録音して公開するに足る成果などはまだまだ。

 今日は土日働いた分の代休で、久しぶりにのんびりとピアノを練習した。そうしていると、今までなんとなく読み飛ばして弾いていたところが1箇所、間違っていることがわかった。20小節目の重音の弾き方である。

Beyer106_onephrase

 「54532・ファミファレシ」の、「シ」の弾き方だ。これを間違えて、1指(親指)はシを押さえて、2指(人差し指)では「ド」を弾いてしまっていた。「ド」でひと月近く練習してしまったのだ。これはいかん、とやり直したが、ハテ弾き方がわからない。親指を離すのか、どうするのか・・・?

 ・・・こんな時は2ちゃんねるだ!!というわけで、また鍵盤楽器板@2ちゃんねるで聞いてみた。「152」というのが私である。


152 名前:ギコ踏んじゃった :2008/09/17(水) 16:54:18 ID:+FPw6Hxd
 御免ください。私は独習でバイエル弾いてるオッサンです。
 すんません、周囲にピアノの先生がいないので、どなたか、どうか教えてください。
 下の写真はバイエル106番の一節です。
  ↓
https://satotoshio.net/oldblog/my_housing/images/Beyer106_OnePhrase.jpg

 ・・・で、写真中央の右手、「ファミファレシ54532」のところの弾き方がどうもよくわかりません。
 右1指は「シ」で持続するんですよね?で、他の指で「5453ファミファレ」、ってところまではわかるんですけど、最後のシは、これはどうやるんでしょうか?
 ○ 1指をすばやく離して2指でシ(←・・・って、その場合、シのタイの意義は・・・?)
 ○ 1指は離さないまま2指を重ねてシを打鍵(←・・・音が出ない気がする)

・・・ウ~ン、一体、これはどう弾いたらよろしいのでしょうか?

153 名前:ギコ踏んじゃった :2008/09/17(水) 17:13:17 ID:gJIhN2uO
>>152
> 1指をすばやく離して2指でシ

技術としてはこれでかまいません。
シのタイは、3拍目シが旋律線でありながら左手の伴奏としての役目もしている
ことを表すための記号というふうに考えてください。
シを連打することになるため唐突な響きにならないようにすれば概ねOKです。

154 名前:152 :2008/09/17(水) 17:19:19 ID:+FPw6Hxd
>>153

 迅速にして明確なるご教示、ありがとうございます。よくわかりました。
 バイエル最終曲、気合い入れてイキますッ!


 ・・・というわけで、とてもよくわかった次第。

2ちゃんねる「鍵盤楽器板」にて

投稿日:
Img_13451  バイエル78番をごくゆっくりと練習しつつある。書いてある指づかいの意味がわからないところがある(写真中の赤い矢印)。
 知り合いにピアノの先生がいる。だが、プロの先生にタダでものを聞くのは失礼なような気がして、かえって聞きづらい。で、2ちゃんねるで聞いてみた。(以下『339』というのは私)

http://bubble6.2ch.net/test/read.cgi/piano/1185979774/580-584n


◆スレ立てるまでもない質問スレッド◆

580 :339:2007/10/25(木) 21:15:51 ID:5yd577TP
 すんません、またしてもごめんください。私はバイエル弾いてるオッサンです。どうか教えてください。
 バイエル78番なのですが、
  ↓
https://satotoshio.net/oldblog/my_housing/images/IMG_1345.JPG
・・・写真の、赤い矢印を施した「レ・シ」の、「21・12(それぞれタテに並べて)」という指使いの意味がじぇんじぇんわかりません。
 「21・12」て、どうせよと言っているのでしょうか?

581 :ギコ踏んじゃった:2007/10/25(木) 21:38:07 ID:5cd6Icue

5421と5412の二通りの指使いがあって、手がある程度大きいなら5421で、
手が小さくて滑らかに弾けないなら1の親指にかぶせて2を弾くんだと思う。

583 :ギコ踏んじゃった:2007/10/25(木) 21:51:36 ID:gWdobNHr

>>580
右手3小節目でレに1を使ってるから、
そのままの手の形で5412と弾くと手の形が変わらないから簡単。
でも2の指を廻さなきゃならないから音の粒はそろえにくい。
5421なら手を広げなきゃいけないけど、なめらかに弾ける。

どっちでも良いよ って事。

584 :339:2007/10/25(木) 21:55:02 ID:5yd577TP

>>581>>583

 なーるっほっど・・・どっちでもいいんだ・・・!。

 ありがとうございます。

 私はオッサンで手がデカいのと、5小節目の6度の重音につなげやすいのとで、「5421」で練習することにしますた。


・・・と、いうようなワケで、けっこう速く答えてもらえて、ありがたい。