SSブログ

息子、国立二次試験を終える [4コマ漫画]

少し前のことですが、息子が国立二次試験受験から帰ってきました。航空宇宙がしたいということで、第一志望は地方国立大学です。

せっかく受験から開放されたというのに、あまり元気がない。英語の問題が難しかったのと、緊張で全く頭が働かず解答用紙が埋まらなかったと落ち込んでいます。


二次試験.png


よくよく聞いてみると、英語以外はいつも通り解答できた模様。私から見れば、まったく問題ないレベル。しかも、いろいろ調べてみると、今年は英語が例年に比べ格段難しくなったようで、もはや英語の問題というより国語の問題に等しいとか。日本語でも難しい問題を英語で出すなよと…

第2志望の都内私立大学はもう受かっているので、父親としては第一志望に受かってほしいけど、親元を離れてしまうのは寂しいので第2志望でもいいかなと、ちょっと複雑な気分です。
(´・ω・`)





大学入試 最難関大への英作文 ハイパートレーニング

大学入試 最難関大への英作文 ハイパートレーニング

  • 作者: 大矢 復
  • 出版社/メーカー: 桐原書店
  • 発売日: 2019/11/13
  • メディア: 単行本(ソフトカバー)



FRUITION Group 2 (国立大学二次試験対策 英語長文問題)

FRUITION Group 2 (国立大学二次試験対策 英語長文問題)

  • 作者: 中央図書編集部
  • 出版社/メーカー: 中央図書
  • 発売日: 2020/02/29
  • メディア: ペーパーバック



ドクブン50―長文を読んで覚える英文法 (英語の超人になる!アルク学参シリーズ)

ドクブン50―長文を読んで覚える英文法 (英語の超人になる!アルク学参シリーズ)

  • 出版社/メーカー: アルク
  • 発売日: 2008/05/26
  • メディア: 単行本




タグ:受験 日常
nice!(26)  コメント(1) 
共通テーマ:趣味・カルチャー

「AIきりたん」こいつは凄いぞ! [DTM(音楽)]

久しぶりの音楽ネタです。Twitterを漁っていると、最近やたら「AIきりたん」というキーワードに出くわすので、まとめサイトをちょっと覗いてみました。

AIきりたんs.png
https://note.com/amasaka/n/n3b816501ead3
つよすぎるAIシンガーAIきりたんの基本的な使い方。【無料】

この【無料】という魅惑的な言葉。早速ダウンロードして試してみました。


【STEP1】AIきりたんをダウンロードし解凍する

次のサイトから「AIきりたん」を入手できます。ダウンロードにサインイン等は必要ありません。圧縮ファイルでも900MB近いサイズ。ダウンロードに少し時間がかかります。


2020-02-28 (2).png
https://n3utrino.work/


インストーラーなどはないので、そのまま解凍するだけです。「NEUTRINO」というフォルダに”きりたん”が格納されています。



【STEP2】MusicScore をインストールする

「AIきりたん」は音声合成のみなので、作曲用ソフトが必要です。「MusicScore 3」というソフトを使ってみました。こちらも無料ダウンロード!サインインが必要です。


2020-02-28.png
https://musescore.org/ja



【STEP3】MusicScoreで楽譜を作る

何から何まで無料でできてしまう世の中、こんなんで良いのですかねー。と思いながら、「かえるの歌」のスコアを入力。一つ一つの音符に歌詞を入れるのがちょっと面倒(音符クリック+Ctrl+Lで入力できます)ですが、「きりたん」に歌わせるには必須です。


2020-02-28 (3).png


【STEP4】作った楽譜を muscixml 形式で出力する

楽譜ができたら、「ファイル」→「エクスポート」で、非圧縮musicxml ファイルとして出力します。今回は、"kaeru.musicxml"として出力しました。

このファイルを、AIきりたんが格納されている「NEUTRINO」フォルダの”score”フォルダに置きます



【STEP5】「AIきりたん」の設定ファイルを編集する

次に”Run.bat”を開いて、6行目の「set BASENAME=sample1」を「set BASENAME=kaeru」に変更します。ちなみに、”set MODELDIR=KIRITAN” を YOKO にかえると熟年おばさんの声で合成できます。
^^;

@echo off
setlocal enabledelayedexpansion
cd /d %~dp0

: Project settings
set BASENAME=kaeru
set NumThreads=0

: musicXML_to_label
set SUFFIX=musicxml

: NEUTRINO
set ModelDir=KIRITAN

: WORLD
set PitchShift=1.0
set FormantShift=1.0




【STEP6】「AIきりたん」で音声合成する

それができたら、”Run.bat”をクリックして起動します。するとコマンドプロンプトが開いて何やら動き始めます。


2020-02-27 (3).png


コマンドプロンプトが閉じたら、「NEUTRINO」フォルダの”output”フォルダに”kaeru_syn.wav”というファイルが出来上がります。これが音声合成の出力結果です。


2020-02-27 (4).png


簡単ですねー。



【STEP7】「AIきりたん」の歌声を聞く

「AIきりたん」の歌声を聞いてみましょう。張りがあって元気な歌声です。





しかし、これが音声合成で作ったものだなんて、知らされないと分からないですよね。いよいよ歌手も本格的にバーチャルな時代に突入でしょうか。

ちなにみ「AIようこ」の歌声も作ってみましたので聴き比べてみてください。





私は”きりたん”の歌声のほうが好みだなぁ。(^^;





ボーカロイド技術論~歌声合成の基礎とその仕組み~

ボーカロイド技術論~歌声合成の基礎とその仕組み~

  • 出版社/メーカー: ヤマハミュージックメディア
  • 発売日: 2014/09/22
  • メディア: 単行本



初音ミク V4X

初音ミク V4X

  • 出版社/メーカー: クリプトン・フューチャー・メディア
  • 発売日: 2016/08/31
  • メディア: ソフトウェア



YAMAHA ヤマハ ボーカロイドエディター VOCALOID4 Editor

YAMAHA ヤマハ ボーカロイドエディター VOCALOID4 Editor

  • 出版社/メーカー: ヤマハ(YAMAHA)
  • 発売日: 2014/12/26
  • メディア: エレクトロニクス




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

AIを作るお仕事とは? [4コマ漫画]

三連休で、久しぶりに家でゆったり。という訳にもいかず、会社の仕事を家に持ち帰り三連休で挽回しようと仕事をしていると、娘が私の仕事に興味をもったらしく、私が仕事で何をしているのか聞いてきました。

その時は、ディープラーニングの学習用データをひたすら収集していたところだったので、"AIとか作ってんだよー"と答えたところ、娘の持っているAIの開発のイメージとは、かなりかけ離れていたようです。


AIのしごと.png


そう、AI開発の実態はひたすらデータ取り…。世の中の人はAIという言葉にかなり幻想を持っているようですが、実はものすごく地味な仕事です。組込みソフト作ってるほうがよっぽどアカデミック…。
(´・ω・`)





エンジニアなら知っておきたいAIのキホン 機械学習・統計学・アルゴリズムをやさしく解説

エンジニアなら知っておきたいAIのキホン 機械学習・統計学・アルゴリズムをやさしく解説

  • 作者: 梅田 弘之
  • 出版社/メーカー: インプレス
  • 発売日: 2019/01/21
  • メディア: Kindle版



AIに負けない子どもを育てる

AIに負けない子どもを育てる

  • 作者: 紀子, 新井
  • 出版社/メーカー: 東洋経済新報社
  • 発売日: 2019/09/06
  • メディア: 単行本(ソフトカバー)



AIにできること、できないこと、ビジネス社会を生きていくための4つの力

AIにできること、できないこと、ビジネス社会を生きていくための4つの力

  • 出版社/メーカー: 日本評論社
  • 発売日: 2019/02/19
  • メディア: 単行本




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

SPRESENSE メインボードとカメラの消費電力を測定してみた [SPRESENSE]

AIカメラを作ってみましたが、メインボードとカメラの消費電力が気になったので、早速測定をしてみました。今回もリポバッテリを直接つないで測定しています。


sDSC01754.jpg


スケッチは次の4パターンで測定してみました。スケッチはこの記事の末尾に掲載していますので、参考にしてください。


  • カメラのストリーミング(320 x 240)だけを行うスケッチ

  • カメラで定期的に静止画(1280x960)を撮るだけのスイッチ(SDカードには記録しない)

  • カメラのストリーミング(320 x 240)をしながら定期的に静止画(1280x960)を撮るスケッチ

  • カメラをDeepSleepしながら定期的に静止画(1280x960)を撮るスケッチ



  • 気になる測定結果は次のようになりました。写真のように測定装置は市販のテスターを使っていますので精度はよくありません。だいたいの傾向を掴む程度にご利用ください。

    条件消費電流
    @156MHz / Streaming (320x240)70mA
    @32MHz / Streaming (320x240)65mA
    @156MHz /takePicture (1280x960)6mA (Sleep時)
    @156MHz /takePicture (1280x960)90mA (撮影時ピーク電流)
    @32MHz /takePicture (1280x960)3.6mA (Sleep時)
    @32MHz /takePicture (1280x960)85mA (撮影時ピーク電流)
    @156MHz / Streaming (320x240)+ takePicture (1280x960) 70mA (Streaming時)
    @156MHz / Streaming (320x240)+ takePicture (1280x960) 90mA (撮影時ピーク電流)
    @32MHz / Streaming (320x240)+ takePicture (1280x960) 65mA (Streaming時)
    @32MHz / Streaming (320x240)+ takePicture (1280x960) 85mA (撮影時ピーク電流)
    @156MHz /takePicture (1280x960)380uA (DeepSleep時)
    @156MHz /takePicture (1280x960)90mA (撮影時ピーク電流)
    @32MHz /takePicture (1280x960)380uA (DeepSleep時)
    @32MHz /takePicture (1280x960)85mA (撮影時ピーク電流)



    撮影時電流はピーク時の値です。撮影時間は1.5秒弱でした。撮影時に消費される電流の総和は単純増加減少していると考えると1回の撮影に消費される電流は Ah 換算で、(( 1.5 sec x 90mA ) ÷ 2 ) / (60 sec * 60 min) = 18 uAh といったところです。ピーク電流さえ供給できれば長時間もちそうですね。

    いろいろ部品をとれば、もっと電力を減らすことはできそうですが、これでもかなりの省電力カメラと言えるでしょう。(ラズパイと比べたら特に)

    次はタイムラプスカメラを作ってみて、どれだけもつか試してみようかな。
    ( ・∇・)


    #include < Camera.h >
    
    #define DEEP_SLEEP
    //#define LOWPOWER_32MHz
    //#define STREAMING
    #define TAKE_PICTURE
    
    #define SLEEP_TIME 5
    
    #if defined(DEEP_SLEEP) || defined(LOWPOWER_32MHz)
    #include < LowPower.h >
    #endif // DEEP_SLEEP || LOWPOWER_32MHz
    
    
    #ifdef STREAMING
    void CamCB(CamImage img) {
      if (img.isAvailable()) {
        Serial.println(".");
      }
    }
    #endif
    
    unsigned long ptime = 0;
    
    void setup() {
      Serial.begin(115200);
      Serial.println("bootup");
    
    #if defined(DEEP_SLEEP) || defined(LOWPOWER_32MHz)
      LowPower.begin();
      Serial.println("Low Power begin");
    #ifdef LOWPOWER_32MHz
      LowPower.clockMode(CLOCK_MODE_32MHz);
      Serial.println("Clock mode : 32MHz");
    #endif
    #endif // DEEP_SLEEP || LOWPOWER_32MHz
    
    #if defined(DEEP_SLEEP) || defined(STREAMING)
      ptime = millis();
      theCamera.begin();
      Serial.println("Camera begin @setup");
    #ifdef STREAMING
      theCamera.startStreaming(true, CamCB);
      Serial.println("Start Streaming");
    #endif // STREAMING
    #endif // DEEP_SLEEP || STREAMING
    }
    
    
    void loop() {
    
    #ifdef TAKE_PICTURE
    #if !defined(DEEP_SLEEP) && !defined(STREAMING)
      ptime = millis();
      theCamera.begin();
      Serial.println("Camera begin @loop");
    #endif // !DEEP_SLEEP || !STREAMING
      theCamera.setStillPictureImageFormat(1280 ,960 ,CAM_IMAGE_PIX_FMT_JPG);
      CamImage img = theCamera.takePicture();
      if (img.isAvailable()) {
        Serial.println("take picture");
      }
    #ifndef STREAMING
      theCamera.end();
      ptime = millis() - ptime;
      Serial.println("Camera end (processing time: " + String(ptime) + " msec");
    #endif // !STREAMING
    #ifdef DEEP_SLEEP
      Serial.println("Go to deep sleep in " + String(SLEEP_TIME) + " sec");
      LowPower.deepSleep(SLEEP_TIME);
    #else
      Serial.println("Go to sleep in " + String(SLEEP_TIME) + " sec");
      sleep(SLEEP_TIME);
    #endif // DEEP_SLEEP
    #endif // TAKE_PICTURE
    }
    





    SONY SPRESENSE メインボード CXD5602PWBMAIN1

    SONY SPRESENSE メインボード CXD5602PWBMAIN1

    • 出版社/メーカー: スプレッセンス(Spresense)
    • メディア: Tools & Hardware



    SONY SPRESENSE カメラモジュール CXD5602PWBCAM1

    SONY SPRESENSE カメラモジュール CXD5602PWBCAM1

    • 出版社/メーカー: スプレッセンス(Spresense)
    • メディア: Tools & Hardware







    nice!(26)  コメント(0) 

    SPRESENSE で小型AIカメラを作ってみた! [SPRESENSE]

    SPRESENSEにOLEDがついたので、今度はカメラをつけてAIカメラにしてみようと思います。久しぶりにNeural Network Console を使います。


    sDSC01751.jpg


    1. 画像を準備
    まず、画像を用意します。ネットから適当に集めてきた”鳥”、”馬”、”うさぎ”、”人”、”壁”の画像を使いました。


    2020-02-18.png


    2. 画像を加工
    これらを、ImageMagick を使って、28x28pixel 8bit (256階調)のグレースケールの画像に変換し、ニューラルネットワークのデータセットとして登録します。(詳細は、また別の機会に)


    2020-02-18 (2).png


    3. ニューラルネットワークをデザイン
    Neural Network Console を開いてニューラルネットワークをデザインします。今回は LeNet ベースで作ってみました。(Spresenseに入るように少し改造しています)


    2020-02-18 (3).png


    4. ニューラルネットワークを学習・評価
    登録したデータセットを使って、デザインしたニューロンを学習・評価します。


    2020-02-18 (4).png


    5. ニューロンモデルの出力
    SPRESENSEで解釈できるニューロンモデル(model.nnb)を出力します。


    2020-02-18 (5).png


    6. Arduino スケッチの作成・焼き込み
    ArduinoのAIスケッチを作成します。AIカメラを小さくしかったので、ニューロンモデルはSPRESENSEメインボードのフラッシュの中に格納してみました。

    #include <Camera.h>
    #include <Flash.h>
    #include <DNNRT.h>
    #include <File.h>
    
    #include "Adafruit_GFX.h"
    #include <Adafruit_SSD1306.h>
    
    #define SCREEN_WIDTH 128 // OLED display width, in pixels
    #define SCREEN_HEIGHT 32 // OLED display height, in pixels
    #define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
    
    #define BAUDRATE    115200
    
    #define OFFSET_X        48
    #define OFFSET_Y         8
    #define BOX_WIDTH      224
    #define BOX_HEIGHT     224
    #define DNN_IMG_WIDTH   28
    #define DNN_IMG_HEIGHT  28
    
    
    DNNRT dnnrt;
    DNNVariable input(DNN_IMG_WIDTH*DNN_IMG_HEIGHT);
    
    String gStrResult = "";
    
    
    void CamCB(CamImage img) { 
      if (!img.isAvailable()) return;
      img.convertPixFormat(CAM_IMAGE_PIX_FMT_RGB565);  
      Serial.println("start clip and resize");
      gStrResult = "";
      int x;
      int index = 0;
      static uint8_t label[5] = {0, 1, 2, 3, 4};
    
      CamImage small;
      CamErr camErr = img.clipAndResizeImageByHW(small
                  ,OFFSET_X ,OFFSET_Y 
                  ,OFFSET_X+BOX_WIDTH-1 ,OFFSET_Y+BOX_HEIGHT-1 
                  ,DNN_IMG_WIDTH ,DNN_IMG_HEIGHT);
      if (!small.isAvailable()) {
        Serial.println("Error Occured at making a target image");
        if (camErr) Serial.println("CamErr: " + String(camErr));
        return;
      }
      uint16_t* buf = (uint16_t*)small.getImgBuff();
      float* input_buffer = input.data();
      for (int i = 0; i < DNN_IMG_WIDTH * DNN_IMG_HEIGHT; ++i, ++buf) {
        input_buffer[i] = (float)(((*buf & 0x07E0) >> 5) << 2) ; // extract green
      }
        
      Serial.println("DNN forward");
      dnnrt.inputVariable(input, 0);
      dnnrt.forward();
      DNNVariable output = dnnrt.outputVariable(0);
      float max_value = 0.0;
      for (int i = 0; output.size() > i; ++i) {
        if (output[i] > max_value) {
          max_value = output[i];
          index = i;
        }
      }
      
      Serial.print("Result : ");
      Serial.println(label[index] + "  (" + String(output[index]) + ")");
      if (label[index] != 10) { 
        gStrResult += String(label[index]);
      } else {
        gStrResult += String(" ");
      }
      
      display.clearDisplay();
      display.setTextSize(3);      // Normal 1:1 pixel scale
      display.setCursor(0, 0);     // Start at top-left corner
      display.cp437(true);         // Use full 256 char 'Code Page 437' font
    
      switch (index) {
      case 0: display.println("BIRD"); break;
      case 1: display.println("HORSE"); break;
      case 2: display.println("HUMAN"); break;
      case 3: display.println("-----"); break;
      case 4: display.println("RABBIT"); break;
      }
      display.display(); 
      Serial.println("Recognition Result: " + gStrResult);
    }
    
    void setup() {
      Serial.begin(BAUDRATE);
    
      if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
        Serial.println(F("SSD1306 allocation failed"));
        for(;;); // Don't proceed, loop forever
      }
    
      display.display();
      delay(2000); // Pause for 2 seconds
    
      // Clear the buffer
      display.clearDisplay();
    
      // Draw a single pixel in white
      display.drawPixel(10, 10, SSD1306_WHITE);  
      display.display();
      delay(2000);
    
      display.setTextSize(1);      // Normal 1:1 pixel scale
      display.setTextColor(SSD1306_WHITE); // Draw white text
      display.setCursor(0, 0);     // Start at top-left corner
      display.cp437(true);         // Use full 256 char 'Code Page 437' font
    
      for(int16_t i=0; i<256; i++) {
        if(i == '\n') display.write(' ');
        else          display.write(i);
      }
    
      display.display();
      
      Serial.println("Loading network model");
      File nnbfile = Flash.open("model.nnb", FILE_READ);
      if (!nnbfile) {
        Serial.println("nnb not found");
        while(1);
      }
      Serial.println("Initialize DNNRT");
      int ret = dnnrt.begin(nnbfile);
      if (ret < 0) {
        Serial.println("DNNRT initialize error.");
        while(1);
      } 
    
      theCamera.begin();
      theCamera.startStreaming(true, CamCB);
    }
    
    void loop() {
      /* do nothing here */  
    }
    




    動作の様子は動画でどうぞ!!( ^ω^ )/~







    関連記事
    SPRESENSEでSony Neural Network Console を使ってみた! 
    https://makers-with-myson.blog.ss-blog.jp/2019-07-14





    ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング

    ソニー開発のNeural Network Console入門【増補改訂・クラウド対応版】--数式なし、コーディングなしのディープラーニング

    • 出版社/メーカー: リックテレコム
    • 発売日: 2018/11/14
    • メディア: 単行本(ソフトカバー)



    SONY SPRESENSE メインボード CXD5602PWBMAIN1

    SONY SPRESENSE メインボード CXD5602PWBMAIN1

    • 出版社/メーカー: スプレッセンス(Spresense)
    • メディア: Tools & Hardware



    SONY SPRESENSE カメラモジュール CXD5602PWBCAM1

    SONY SPRESENSE カメラモジュール CXD5602PWBCAM1

    • 出版社/メーカー: スプレッセンス(Spresense)
    • メディア: Tools & Hardware




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

    深宇宙から16日周期で届く謎の信号はホワイトホールからか!? [トンデモ学説]

    久しぶりの天文ネタです。トロント大学のチームが5億光年離れた銀河から地球に向けて16日周期で発する謎の信号を受信したというニュースがありました。

    その発生源は「SDSS_J015800.28+654253.0」という名もない銀河の赤丸の部分です。

    SDSS_J015800.28+654253.0.jpg

    深宇宙から16日周期で届く謎の信号の正体とは? - GIGAZINE
    https://gigazine.net/news/20200210-16-day-cycles-fast-radio-burst/


    論文を斜め読みをしてみると、データを見つけることができました。こんなグラフを見ると発見した人たちの興奮が伝わってきますね。

    2020-02-16.png


    ビームの周波数は 1.7GHz中心で600Mhzくらいの帯域幅のようです。どこの携帯キャリアの割当電波かな?という感じの信号ですね…。


    FRB_peak.png


    ただ、この現象、銀河の広範囲に影響を及ぼしているようです。銀河をよく見ると銀河の腕にも影響を与えているのが見ることができます。


    FRB.png


    正体はブラックホールをもつ連星か、極端な強い磁場を持つ中性子星「マグネター」ではないか?という仮設が出ていますが、マグネターは天の川銀河の周辺でも発見されており、ここまで広範囲に影響を及ぼす天体現象とは思えません。(磁場の影響範囲は狭いですし)


    あり得るとすると銀河中心クラスのブラックホールですが、こんな銀河の辺境で巨大なブラックホールが発生するとは思えません。


    ここからは勝手な想像ですが、銀河中心ブラックホール並の高エネルギーを発生させる現象で、他に考えられるのはホワイトホールくらいではないかと…。

    どこかの巨大ブラックホール(ひょっとしたらこの銀河の)の出口となる回転しているホワイトホールと考えると、周期的に電波を地球に向けて放出し、かつ銀河の形にも影響を与えるほどの高エネルギー現象となるのは納得できます。

    いずれにしても正体が明らかになるのが楽しみです!
    ( ^ω^ )








    ホワイト・ホール―宇宙の噴出口 (ブルーバックス)

    ホワイト・ホール―宇宙の噴出口 (ブルーバックス)

    • 出版社/メーカー: 講談社
    • 発売日: 2020/02/16
    • メディア: 新書



    「ブラックホール=ホワイトホール」仮説

    「ブラックホール=ホワイトホール」仮説

    • 作者: 魚住 克也
    • 出版社/メーカー: Office Bluebell
    • 発売日: 2019/08/19
    • メディア: Kindle版




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

    SPRESENSE で小型OLEDディスプレイを使ってみた! [SPRESENSE]

    SPRESENSEにカメラと小さなディスプレイをつけて、カメラを対象に向けたら写ったものが何か表示する、というよくあるAIカメラのデモを作ってみたいなと思い試しに小型OLEDディスプレイをつけてみました。


    DSC_0917.JPG


    なんと、あっけなく1.8V IO で動いてしまいました。レベルシフター不要なのは助かるー♪

    使用したライブラリは Adafruit のものです。2つ必要です。一つはSPRESENSE用のGFXライブラリ。次の github から入手できます。


    https://github.com/kzhioki/Adafruit-GFX-Library
    Adafruit-GFX-Library-for-Spresense.png


    もうひとつは、Adafruit の OLED用ライブラリです。


    https://github.com/adafruit/Adafruit_SSD1306
    2020-02-13 (1).png


    この2つのライブラリをZIPでダウンロードして、Arduino IDE を使ってインストール。「スケッチ例」 から「ssd1306 _128x32_i2c」を選択してコンパイルしてみます。

    最初は、いつものお約束ですが、コンパイルエラーに出くわします。エラーメッセージを見ると次のような内容が出力されています。


    C:\Documents\Arduino\libraries\Adafruit_SSD1306-master\Adafruit_SSD1306.cpp: In member function 'boolean Adafruit_SSD1306::begin(uint8_t, uint8_t, boolean, boolean)':
    
    C:\Documents\Arduino\libraries\Adafruit_SSD1306-master\Adafruit_SSD1306.cpp:485:69: error: 'digitalPinToPort' was not declared in this scope
    
         dcPort    = (PortReg *)portOutputRegister(digitalPinToPort(dcPin))
    



    Adafruit_SSD1306.cpp を開いて、485行目を見てみます。


    484 #ifdef HAVE_PORTREG
    485     dcPort    = (PortReg *)portOutputRegister(digitalPinToPort(dcPin));
    486     dcPinMask = digitalPinToBitMask(dcPin);
    487     csPort    = (PortReg *)portOutputRegister(digitalPinToPort(csPin));
    488     csPinMask = digitalPinToBitMask(csPin);
    489 #endif
    



    どうも、HAVE_PORTREG が定義されているとマズイみたいです。

    Adafruit_SSD1306.h 内に HAVE_PORTREG で定義されているところがないか探してみました。案の定あったので、試しに SPRESENSE の場合は定義を無効にするように追記してみました。(57~59行目)


    43 #if defined(__AVR__)
    44   typedef volatile uint8_t  PortReg;
    45   typedef uint8_t           PortMask;
    46   #define HAVE_PORTREG
    47 #elif defined(__SAM3X8E__)
    48   typedef volatile RwReg    PortReg;
    49   typedef uint32_t          PortMask;
    50   #define HAVE_PORTREG
    51 #elif (defined(__arm__) || defined(ARDUINO_FEATHER52)) && !defined(ARDUINO_ARCH_MBED)
    52   typedef volatile uint32_t PortReg;
    53   typedef uint32_t          PortMask;
    54   #define HAVE_PORTREG
    55 #endif
    56 
    57 #if defined(ARDUINO_ARCH_SPRESENSE) // added by taro
    58   #undef HAVE_PORTREG
    59 #endif // added by taro
    



    これで無事にコンパイルが通り動作するようになりました。いやはや、なんともあっけない。Arduino は本当によくできたプラットフォームです。

    このOLEDディスプレイは、SPRESENSEメインボードとちょうどよい大きさで、アドオンに載せるとコンパクトに可愛くまとまりそうなので、少しがんばってアドオンボードにしてみました。


    なかなかいい感じです。これで小型のAIカメラができるかなー。
    ( ^ω^ )





    SONY SPRESENSE メインボード CXD5602PWBMAIN1

    SONY SPRESENSE メインボード CXD5602PWBMAIN1

    • 出版社/メーカー: スプレッセンス(Spresense)
    • メディア: Tools & Hardware






    SONY SPRESENSE カメラモジュール CXD5602PWBCAM1

    SONY SPRESENSE カメラモジュール CXD5602PWBCAM1

    • 出版社/メーカー: スプレッセンス(Spresense)
    • メディア: Tools & Hardware




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

    SPRESENSEでLowPowerカメラ? [SPRESENSE]

    SPRESENSEのカメラ機能と、LowPowerライブラリでLowPowerカメラを作ってみました。クロックも32MHzに落としています。


    spresense_and_camera.jpg


    一分毎に写真を取って、次の撮影までDeepSleepに落ちて電力を落とします。ファイル名が重なってはいけないので、番号をEEPROMに記録するようになっています。

    #include <Camera.h>
    #include <SDHCI.h>
    #include <LowPower.h>
    #include <EEPROM.h>
    
    #define LOWPOWER_32MHz
    
    SDClass theSD;
    File myFile;
    int addr = 0;
    byte val = 0;
    
    void setup() {
      LowPower.begin();
    #ifdef LOWPOWER_32MHz
      LowPower.clockMode(CLOCK_MODE_32MHz);
    #endif
    
      Serial.begin(115200);
      Serial.println("bootup");
      theCamera.begin();
      bootcause_e bc = LowPower.bootCause();
      if ((bc == POR_SUPPLY) || (bc == POR_NORMAL)) {
        Serial.println("Power on reset");
        val = 0;   
      } else {
        val = EEPROM.read(addr);
        Serial.println("Read sequence number: " + String(val));
      }
    
    }
    
    void loop() {
    
      theCamera.setStillPictureImageFormat(320 ,240 ,CAM_IMAGE_PIX_FMT_JPG);
      CamImage img = theCamera.takePicture();
      if (img.isAvailable()) {
        char filename[16] = {0};
        sprintf(filename, "PICT%03d.JPG", val); 
        File myFile = theSD.open(filename, FILE_WRITE);
        myFile.write(img.getImgBuff(), img.getImgSize());
        myFile.close();
        ++val;
        Serial.println("taken picture to " + String(filename));
        EEPROM.write(addr, val);   
      }
      theCamera.end();
      LowPower.deepSleep(60);
    }
    


    電力はまだ測定していないのですが、拡張ボード使っているのでそこまで落ちていないだろうなぁ。そのうち、カメラをつけた場合の電力も測定もしてみたいと思います。(環境作るのメンドクサイ…)
    (´・A・`)


    関連記事
    SPRESENSE で DeepSleep から GPS をホットスタート!
    https://makers-with-myson.blog.ss-blog.jp/2020-01-26

    SPRESENSE の Low Power ライブラリをバッテリー給電で試してみた!
    https://makers-with-myson.blog.ss-blog.jp/2019-12-08

    SPRESENSE の Low Power ライブラリをUSB給電で試してみた!
    https://makers-with-myson.blog.ss-blog.jp/2019-12-01







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

    設計と営業に挟まれて… [4コマ漫画]

    普段、ほとんど職場におらず、お客さんまわりとかセミナーとか、外をほっつき歩いていることがほとんどです。とは言うものの、一応プロジェクトリーダーという職責を負っている立場なので、色々な部署の方たちとの間を取り持つこともあります。

    外ばかり行ってるので職場で起きていることに、たまに疎くなることもあります。この仕事はあまり設計と営業が喧嘩することはないのですが、珍しく揉めごとがあった模様。


    設計と営業.png


    まぁ、今回の場合は、私も知らない内容だったので、きちんと現場に説明していなかった上の責任もありますが、営業も設計チームに一言いってくれればよかったのになぁと思います。

    ビジネスは営業と設計の両輪がきちんと噛み合ってうまく進むものなので、情報をきちんと共有するのは大事だなとあらためて思いました。
    (´・ω・`)






    「営業」を設計する技術

    「営業」を設計する技術

    • 作者: 藤冨 雅則
    • 出版社/メーカー: かんき出版
    • 発売日: 2014/02/05
    • メディア: 単行本(ソフトカバー)



    なぜ人と組織は変われないのか――ハーバード流 自己変革の理論と実践

    なぜ人と組織は変われないのか――ハーバード流 自己変革の理論と実践

    • 出版社/メーカー: 英治出版
    • 発売日: 2013/10/24
    • メディア: 単行本



    最新版 飛び込みなしで「新規顧客」がドンドン押し寄せる「展示会営業」術

    最新版 飛び込みなしで「新規顧客」がドンドン押し寄せる「展示会営業」術

    • 作者: 清永健一
    • 出版社/メーカー: ごま書房新社
    • 発売日: 2019/03/28
    • メディア: 単行本




    タグ:日常 仕事
    nice!(26)  コメント(0) 

    社内格差を感じるとき… [4コマ漫画]

    先日、久しぶりに社内の研究所の人たちと会合がありました。そろそろ、この先の計画が固まってきたこともあり、今後の計画についてそれぞれ情報交換をすることになりました。

    私が所属しているのは事業部なので利益出してなんぼの部署。一方研究所はすばらしい技術や社会貢献をしてなんぼの部署。性質が全く異なる部署なので、計画もまったく異なります。でも、この時ばかりは社内格差というものを感じてしまう時です。


    社内格差1.png


    ビジネスをしているとお客さんと直接触れ合えますし、自分の作ったものが世の中に評価されると嬉しい。逆に直接お客さんと触れ合うことで苦労も多いです。

    自分がどのような形で社会と触れ合っていきたいか?それによってビジネスがいいか研究がよいか、、ですね。研究者だと自分の専門性をより高めることができますが、社会との関係は希薄になりますよね。

    私は、先が見通せなくても、リアルな現実と触れ合っていきたいのでビジネスのほうが向いているんだろうなぁ。でも研究所いいなぁ。
    (´・ω・`)





    「事業を創る人」の大研究

    「事業を創る人」の大研究

    • 出版社/メーカー: クロスメディア・パブリッシング(インプレス)
    • 発売日: 2018/01/29
    • メディア: Kindle版



    事業を創るとはどういうことか――「温度ある経済の環」を生み出すビジネスプロデューサーの仕事

    事業を創るとはどういうことか――「温度ある経済の環」を生み出すビジネスプロデューサーの仕事

    • 作者: 三木 言葉
    • 出版社/メーカー: 英治出版
    • 発売日: 2019/09/19
    • メディア: 単行本(ソフトカバー)



    研究の育て方: ゴールとプロセスの「見える化」

    研究の育て方: ゴールとプロセスの「見える化」

    • 作者: 近藤 克則
    • 出版社/メーカー: 医学書院
    • 発売日: 2018/10/22
    • メディア: 単行本




    タグ:仕事 日常
    nice!(28)  コメント(1) 
    共通テーマ:趣味・カルチャー

    この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。