前回は こちら .
LED を光らせる,というか GPI 制御をスクリプトで行っていたのを,きちんとしたライブラリ+プログラミングで制御するようにしてみた.
しかも調子こいて同時3色.
まぁ3色といっても同じ回路を3つ作って,GND を共通化しただけだけどね.
今回はライブラリ直で GPI 制御しているから On/Off の反応がいい.
動画では WiFi SSH 越しで On/Off してるけど,それなりの速度出てる.
R, G, B キーで LED を On/Off している様子
ライブラリはど定番の wiringP を利用.
ソースコード(C に限りなく近い C++)はこんな感じ.
#include <stdio.h>
#include <iostream>
#include <string>
#include <wiringpi.h>
using namespace std;
int main(int argc, char** argv)
{
if(wiringPiSetupGpio()==-1)
{
return 1;
}
int pinR = 2;
int pinG = 3;
int pinB = 4;
bool swR = false;
bool swG = false;
bool swB = false;
// initialize to OUTPUT
pinMode(pinR, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinB, OUTPUT);
// off all
digitalWrite(pinR, 0);
digitalWrite(pinG, 0);
digitalWrite(pinB, 0);
// key wait
std::cout << "Please Input R, G, B or Q(uit)" << endl;
// Set terminal to raw mode
system("stty raw");
for( ; ; )
{ int cc = getchar();
if(cc=='q' || cc=='Q') break;
switch(cc)
{ case 'r':
case 'R':
if(swR==false)
{ digitalWrite(pinR, 1);
swR = true;
}
else
{ digitalWrite(pinR, 0);
swR = false;
}
break;
case 'g':
case 'G':
if(swG==false)
{ digitalWrite(pinG, 1);
swG = true;
}
else
{ digitalWrite(pinG, 0);
swG = false;
}
break;
case 'b':
case 'B':
if(swB==false)
{ digitalWrite(pinB, 1);
swB = true;
}
else
{ digitalWrite(pinB, 0);
swB = false;
}
break;
default:
break;
}
}
// Reset terminal to normal "cooked" mode
system("stty cooked");
// off all
digitalWrite(pinR, 0);
digitalWrite(pinG, 0);
digitalWrite(pinB, 0);
return 0;
}
コンパイルは「g++ -o RunThisProgram SourceCode.cpp -lwiringPi」でオッケー.
R, G, B の LED を GPI 番号 2, 3, 4 に割り当てた.
キーボードからの入力を Enter 要らずにした点だけちょっと面倒だったけど,他はまったくのベタコード.
関数とかクラスとか使えよ,と我ながら思うけど無視することにする.
とりあえず C++ である程度 LED を制御できるようになった.
次は OpenCV で顔認識,かな?