2019/08/04

Raspberry Pi + LED

ラズパイでいろいろ,今回は LED を光らせる奴 again.
前回は こちら


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 で顔認識,かな?