先日、Raspberry Pi 4でLチカを経験してから、毎晩これに夢中です。

あれから物凄く努力して、7セグLEDを1つ繋げて現時刻の0秒から9秒を表示出来るようになりました。

↑ 1桁ですが、疑似ダイナミック表示させています。点灯は0.25ミリ秒、消灯は1.25ミリ秒を繰り返して、6桁のダイナミック表示1桁目のつもりなんですが。

 

私の開発環境は、このブログ内にある「ラズパイで初めてのLチカ」を見て下さい。

↓ 点灯消灯時間を変えてありますが、そのソースコードです。

/*
 * test7.cpp
 * clock_gettime()に変更
 */

#include <iostream>
#include <pigpio.h>
#include <time.h>

using namespace std;

int main(void)
{
    int i, j;
    
    struct timespec ts;
    struct tm lotm;
    
	       // 7seg a   b   c   d   e   f   g   dp
    int gpio_pin[8] = {21, 20, 16, 26, 19, 06, 13, 12};
	       // GPIO 21  20  16  26  19  06  13  12
	       
    int segdata[12][8] = { // 7segment 2次元配列
      // a  b  c  d  e  f  g  dp
	{0, 0, 0, 0, 0, 0, 1, 1}, // 0
	{1, 0, 0, 1, 1, 1, 1, 1}, // 1
	{0, 0, 1, 0, 0, 1, 0, 1}, // 2
	{0, 0, 0, 0, 1, 1, 0, 1}, // 3
	{1, 0, 0, 1, 1, 0, 0, 1}, // 4
	{0, 1, 0, 0, 1, 0, 0, 1}, // 5
	{0, 1, 0, 0, 0, 0, 0, 1}, // 6
	{0, 0, 0, 1, 1, 1, 1, 1}, // 7
	{0, 0, 0, 0, 0, 0, 0, 1}, // 8
	{0, 0, 0, 0, 1, 0, 0, 1}, // 9
	{1, 1, 1, 1, 1, 1, 1, 1}, // Blank
	{1, 1, 1, 1, 1, 1, 1, 0}  // dp
    };
    
    // pigpioライブラリ初期化
    if (gpioInitialise() < 0) exit(1);
    
    // GPIO使用ピンをアウトプット設定
    for (i = 0; i < 8; i++) {
	gpioSetMode(gpio_pin[i], PI_OUTPUT);
    }
    
    // 表示消灯を100回繰り返して終了
    for (i = 0; i < 100; i++) {
   
	clock_gettime(CLOCK_REALTIME, &ts); // 時刻の取得
	localtime_r(&ts.tv_sec, &lotm); // ローカル時間に変換
	// int num = lotm.tm_hour / 10; // 時、十の位取得
	// int num = lotm.tm_hour % 10; // 時、一の位取得
	// int num = lotm.tm_min / 10; // 分、十の位取得
	// int num = lotm.tm_min % 10; // 分、一の位取得
	// int num = lotm.tm_sec / 10; // 秒、十の位取得
        int num = lotm.tm_sec % 10; // 秒、一の桁取得
	cout << num << flush;
	
	for (j = 0; j < 8; j++) { // 7セグLED表示(秒一の位)
	    gpioWrite(gpio_pin[j], segdata[num][j]);
	}

	gpioDelay(4000); // 4ミリ秒
	
	for (j = 0; j < 8; j++) { // 消灯(10 -> Blank)
	    gpioWrite(gpio_pin[j], segdata[10][j]);
	}

	gpioDelay(20000); // 20ミリ秒

    }
    
    cout << endl;
    
    // pigpioライブラリ終了処理
    gpioTerminate();
    
    return 0;

}
$ sudo ./test7
6666666666677777777777777777777777777777777777777777888888888888888888888888888888888888888889999999

 

このソースコードの点灯4ミリ秒、消灯20ミリ秒、約41Hzの疑似ダイナミック表示なら、私の目に7セグLEDのちらつきは感じません。

でもVNCで遠隔操作している時は、そのサイクルを早くしても、ちらつきます。

Raspberry Pi 4を使用して、私にとって初めてのLチカを試しました。正確には、オシロの波形を見てLチカを頭の中でイメージしました。

 

用意した物(ソフトウェアはフリー)

Raspberry Pi 4
Raspbian Buster with desktop 2019-09-26
Geany(Raspbianに入っている総合開発環境)
g++(Raspbianに入っているC++コンパイラ)
pigpio(Raspbianに入っているGPIO制御ライブラリ)

 

Geanyの設定は、テンプレートから新規作成のmain.cxxを選択。その後、ビルドコマンドを設定画面(Set Build Commands)のC++コマンドのラベルとコマンドを変更しました。これはこちらのサイトを参考にさせて頂きました。

Label: GPIO-Build
Command: g++ -Wall -pthread -o "%e" "%f" -lpigpio -lrt

 

↓ コンパイルをコマンドラインでやりたい場合は

$ g++ -Wall -pthread -o test2 test2.cpp -lpigpio -lrt

 

↓ Lチカ用のソースコードはこれ。これを走らせると500μ秒点灯、500μ秒消灯を繰り返すみたい。このソースコードはどこかの英語で書かれたサイトからコピペしました。

/*
 * test2.cpp
 */

/* Libraries */
#include <iostream>
#include <pigpio.h>

/* Variables and Constants */
using namespace std;
#define LED 17
#define HIGH 0x1
#define LOW 0x0
/* Main function */

int main(void)
{
    cout << "Raspberry Pi initialized!" << endl;
    if (gpioInitialise() < 0) exit(1);

    gpioSetMode(LED, PI_OUTPUT); // 3.3V PIN

    for (;;)
    {
        gpioWrite(LED, HIGH);
        gpioDelay(500);
        gpioWrite(LED, LOW);
        gpioDelay(500);
    }

    gpioTerminate();

}

 

上記ソースコードをGeanyにコピペして、自分で設定したGPIO-Buildを選択してコンパイル完了(Compilation finished successfully) ↓

 

プログラムの実行はコマンドラインで

$ sudo ./test2

 

↓ プログラム実行中の波形。まだLEDを繋げて無いので確認して無いけど、1秒間に約900回点滅する事になるので、多分私の目ではチカチカと点滅するようには見えないかも。

 

↓ LEDを繋げてみました。赤丸のLEDなんですが、点滅では無く点灯ですね。スマホのカメラで240fps撮影して、ようやく点滅しているように見えます。