C++14 ラムダ関数で再帰呼び出しサンプル

引数なし


std::function<void()> func = [&](){

fun();

}

func();

引数あり


std::function<void(class&)> func = [&func](auto& obj){

func(obj);

}

class obj;

func(obj);

オブジェクトを参照渡ししつつ、再帰呼び出しするラムダ関数のサンプル。openFrameworks 0.9以上だとC++14対応なので動く。

IntensityShuttleViewer 0.2.2 公開しました #max7

IntensityShuttleViewerとは?

MacでBlackmagic Design社 IntensityShuttle for ThunderboltのPreviewを簡単にできるアプリです。今回、久しぶりにバージョンアップをしました。詳しくは、以前の記事をご覧ください。

変更点

スクリーンショット 2016-03-12 16.13.24

  • 内部処理を見直し軽量化
  • GUIの変更
  • Max6 → Max7で書き換え
  • OS 10.11.3 対応

ダウンロード

こちらからどうぞ

ofxCvHaarFinderとofBeginShape()を一緒に使ったら顔認識されなくなった #openFrameworks

cvgraphics

ofxCvHaarFinder × ofBeginShape()

Raspberry PI の openFrameworks で ofxCvHaarFinderのfindHaarObjects()とofBeginShape() / ofEndShape()を使ったコードを書いていたら、何故か顔認識動かない。ofBeginShape() ~ ofEndShape()をコメントアウトすると認識される。

とりあえず解決案 – ofPushStyle() ~ ofPopStyle();


ofPushStyle(); //追加

ofBeginShape();

ofVertexes(); //描画

ofEndShape();

ofPopStyle(); //追加

ofBeginShape() ~ ofEndShape()するときに内部で描画設定を変えられてるからかな〜と推測して、前後にofPopStyle()とofPushStyle()で囲んだら顔認識動いた。

FTDI USBシリアル変換アダプターでCerevo CDP-ESP8266へArduinoファーム書き込んだ思い出

Cerevo CDP-ESP8266

FullSizeRender 5

手持ちの半田コテが少し太かったので、半田付け難しかった。

Switch Science FTDI USBシリアル変換アダプター

FullSizeRender 4

接続はCerevo Tech Blogを参考にしました。画面上は、数年前にArduino Pro miniに書き込むように購入していたUSBシリアル変換アダプタ。3.3v出力ができたので簡単だった。左はI2C確認用にPCA9622DR搭載したLEDモジュール。ESP8266のIO5とIO4と接続している。

FullSizeRender 6

モジュールの組み合わせで色々試すのは分かってきたので、次はユニバーサル基板で回路組んでみたい。

秋月のマイコン内蔵RGBLEDモジュール(Adafruit NeoPixel互換)をArduinoで光らせてみた

NeoPixels

秋月で買ったLEDモジュール制御メモ

  • サンプルコード
    • Arduino 1.6.5
    • Manager – Arduino AVR Boards 1.6.8
    • 上記環境でコンパイルできた。それ以上のバージョンだとavr関係のエラーが出る。
  • 制御信号:D1
  • HSV to RGB 変換
    • HSV to RGB (Arduino) · GitHub
    • 内部の計算がint型でされてるので滑らかな色変化が必要なら内部変数を適当にfloatに書き換える

Burned

不注意に電源入れっぱで抜き差したら焼けて異臭がでました。皆さんもお気をつけなすってください。

ArduinoファームのESP-WROOM-02(ESP8266)開発ボードでI2C通信

IMG_9972
ESP-WROOM-02開発ボードをArduinoファームにして遊んでいるのですが、Wireライブラリ(I2C)に使うピンが分からなかったのでメモ

  • SCL – IO5
  • SDA – IO4

I2C通信テスト


I2C通信のテスト。上記のVine動画で点灯しているのは、PCA9622DR搭載したLEDモジュールArduino用のソースコードままで動きました。

追記

Arduino ESP8266のピン配列

Wire library currently supports master mode up to approximately 450KHz. Before using I2C, pins for SDA and SCL need to be set by calling Wire.begin(int sda, int scl), i.e. Wire.begin(0, 2) on ESP-01, else they default to pins 4(SDA) and 5(SCL).

I2Cのピン設定は、変えられるそうです。

openFrameworks & Raspberry PI 2 & ArchLinux (Rasbianでも使える) 設定メモ

Raspi

対応OSがいつの間にか変わった(Armv7で使いたい場合)

Raspberry Pi版 openFrameworksの推奨OS(?)が、0.9.2以降はArchLinuxになっていた openFrameworks http://openframeworks.cc/ja/setup/raspberrypi/raspberry-pi-getting-started-archlinux/ ラズパイ版のoFは毎度の事ですが、すんなりインストールできない。設定で困った所をメモっておきます。

※armv7 → ArchLinux , armv6 → Rasbian という事みたいです。なのでRaspi2でもarmv6で動かすならRasbianのままでOK。

ArchLinuxをMacで用意

oFサイトの方法はLinuxで用意する方法ですね。oFを使ってる方は、MacやWin使いが多いのかなと思うのでちょっと不親切。

oF公式のGetting Startに補足

  • ファイルの解凍のステップを飛ばしてる → tar zxvf filename
  • 日本語キーボードの選択 → loadkeys jp106
  • piユーザーを作ったけどログインしなおすステップが抜けてる → Preliminary work以降は、piユーザー
  • コンパイル中に言語設定で怒られる → .bash_profileに”export LANG=C”記入

パーティションの容量を増やす

openFramworks本体をコンパイルしてると”virtual memory exhausted”なんてエラーが出て止まります。原因は、パーティションが2GBになっていたから。こちらを参考に32GBまで増やしました。

スワップファイルを作成

“virtual memory exhausted: Cannot allocate memory”

OpenCVのサンプルプロジェクトをコンパイルしてるとメモリ足りない的な事を言われるので、Wikiを参考にSwapファイルつくりました。で、コンパイルできたと思ったら実行できなかった。

.profile に追記

MAKEFLAGS=-j4 PLATFORM_VARIANT=rpi2

ラズパイカメラ

RaspiCamera

初期設定

https://wiki.archlinuxjp.org/index.php/Raspberry_Pi

ofxRPiCameraVideoGrabber

https://github.com/jvcleave/ofxRPiCameraVideoGrabber

PlayStation Eyetoy

opencvExampleで使おうとすると、カメラから映像が取得できないので vidGrabber.setDesiredFrameRate(60); を指定すると使えるようになる。

コンパイルめっちゃ遅い

コンソールに出てくる文字列すら遅すぎて謎だなと思ったら、rasps-config で出来るGPUのメモリ指定を間違えて0MBに間違えてしてた。

openFrameworks 基本描画 メモ

//背景
ofBackground(color);

//スムース
ofEnableSmoothing();
ofDisableSmoothing();

//円の解像度
ofSetCircleResolution(resolution);

//図形を色で埋める
ofFill();

//色の指定
ofSetHexColor(0xb5de10);

//Text
ofDrawBitmapString("str",x,y);

//ポリゴンモードの指定
ofSetPolyMode(OF_POLY_WINDING_ODD);

//アルファブレンド用の設定
ofEnableAlphaBlending();
ofDisableAlphaBlending();

//線幅
ofSetLineWidth(size);

//描画
ofBeginShape();
//ここに以下の頂点系の処理を書く
ofEndShape(bool bClose=false);

//頂点
ofVertex(x,y);

//Curve用の頂点(指定した頂点を通るようにカーブを作成可能)
ofCurveVertex(x,y);

//Circle
ofDrawCircle(x,y,r /*円のサイズ*/);
ofDrawEllipse(x,y,w,h);

//Hole
ofNextContour(true);

//中心位置変更
ofPushMatrix();
ofTranslate(x,y);
ofPopMatrix();

//Scale変更
ofScale(x,y);

Raspberry Pi 2 & openFrameworks でI2C接続のジャイロセンサー(InvenSense ITG-3200)を使う

Raspberry Pi2 & openFrameworksでI2C接続のジャイロセンサーを使ってみた


InvenSense ITG-3200のブレイクアウトボードをSwitchScienceで購入し、セッティングやコードは、こちらのページを参考にしました。Raspberry PiにおけるwiringPiとI2C自体のセッティングは、ググると色々あるのでopenFrameworksの部分のみ。wiringPiI2CSetupを使ったらとにかく楽でした。

openFrameworksのコード


#include "ofApp.h"
#include "wiringPiI2C.h"

using namespace std;

const auto itgAddress = 0x69;

const char WHO_AM_I = 0x00;
const char SMPLRT_DIV= 0x15;
const char DLPF_FS = 0x16;
const char GYRO_XOUT_H = 0x1D;
const char GYRO_XOUT_L = 0x1E;
const char GYRO_YOUT_H = 0x1F;
const char GYRO_YOUT_L = 0x20;
const char GYRO_ZOUT_H = 0x21;
const char GYRO_ZOUT_L = 0x22;

const char DLPF_CFG_0 = 1<<0;
const char DLPF_CFG_1 = 1<<1;
const char DLPF_CFG_2 = 1<<2;
const char DLPF_FS_SEL_0 = 1<<3;
const char DLPF_FS_SEL_1 = 1<<4;

auto fd = -1;

//--------------------------------------------------------------
void ofApp::setup(){

        //I2C Setting
        fd = wiringPiI2CSetup(itgAddress);
        cout << "fd:" << fd  << "\n";
        cout << "WHO_AM_I:" << wiringPiI2CReadReg16(fd,WHO_AM_I) << "\n";       
        cout << "Write DLPF_FS:" << wiringPiI2CWriteReg8(fd,DLPF_FS,(DLPF_FS_SEL_0|DLPF_FS_SEL_1|DLPF_CFG_0)) << "\n";
        cout << "Write SMPLRT_DIV:" << wiringPiI2CWriteReg8(fd,SMPLRT_DIV,9) << "\n";

        ofSetFullscreen(true);  
}

//--------------------------------------------------------------
void ofApp::update(){

}

//--------------------------------------------------------------
void ofApp::draw(){

        ofPushMatrix();

        ofTranslate(0,ofGetHeight()/2);

        ofBackground(0);

        function getValue = [](char H,char L){

                int data = 0;
                data = static_cast(wiringPiI2CReadReg8(fd,H)) << 8;
                data += static_cast(wiringPiI2CReadReg8(fd,L));

                return data;
        };

        ofSetColor(255);

        const auto MAX_DATA = 10000;

        auto x = getValue(GYRO_XOUT_H,GYRO_XOUT_L);
        ofRect(0,0,ofGetWidth()/3.,ofMap(x,-MAX_DATA,MAX_DATA,ofGetHeight()/2.,-ofGetHeight()/2.));

        ofTranslate(ofGetWidth()/3,0);
        auto y = getValue(GYRO_YOUT_H,GYRO_YOUT_L);
        ofRect(0,0,ofGetWidth()/3,ofMap(y,-MAX_DATA,MAX_DATA,ofGetHeight()/2,-ofGetHeight()/2));

        ofTranslate(ofGetWidth()/3,0);
        auto z = getValue(GYRO_ZOUT_H,GYRO_ZOUT_L);
        ofRect(0,0,ofGetWidth()/3,ofMap(z,-MAX_DATA,MAX_DATA,ofGetHeight()/2,-ofGetHeight()/2));

        ofPopMatrix();
}

Raspberry Pi用のopenFrameworksがNightly Buildでしか動かせなかった。けれど、openFrameworks0.9.0からC++11になってたのでfunctionやラムダ式を使ってみました。

Raspberry Pi2 & openFrameworks TIPS

ofxRPiCameraVideoGrabber

Sampleをmakeすると

could not convert ‘ofGLProgrammableRenderer::TYPE’ from ‘const string {aka const std::basic_string<char>}’ to ‘std::shared_ptr<ofBaseRenderer>’ ofSetCurrentRenderer(ofGLProgrammableRenderer::TYPE);

とでる。

こちらを参考にmain.cppを以下に変更

int main{

ofGLESWindowSettings settings;

settings.width = 1280;

settings.height = 720;

settings.setGLESVersion(2);

ofCreateWindow(settings);

ofRunApp( new testApp());

}

でmake成功した

makeオプション指定を楽にする

makeする時にいちいち、オプション指定するのが面倒くさいので

cd
ls -a

で表示される

.profile

nano .profile

してnanoでオープンして

export MAKEFLAGS=-j4 PLATFORM_VARIANT=rpi2

と書き込むと

openFrameworksのExampleフォルダ等で

make

するだけで、コンパイルが走る!

GPIOの番号を表示

gpio readall

openFrameworksからgpioを使う場合は、wiringPiを使うようです。GPIOの番号は、Raspberry PiとwiringPiで割当が違うようで番号を調べてる中で、上記のコマンドを見つけました。

接続されているI2Cデバイスを探す

i2cdetect -y 1

addonの追加

addonフォルダにて

git clone 使いたいofxAddonのリポジトリURL

プロジェクトフォルダのaddons.makeにAddon名を記入

ofxAddon

debug

Program received signal SIGILL, Illegal instruction と出て起動時に止まってしまう問題。gdbで以下のコマンドを打つと取り敢えず回避できる。

handle SIGILL nostop
handle SIGINT nonstop