· 

7.外部LEDプロジェクト

9.LEDプロジェクト

この章以降のプロジェクトは、第8章の新規プロジェクト作成手順に従って同様にプロジェクトを作成します。ここまでのサンプルプログラムは、Picoに外部回路を追加することなく、ビルド、実行してきました。以降新規プロジェクトでは、LED,スイッチ、センサー等を追加し、新しいプログラムを作成します。

9.1.外部LEDの点滅

9.1.1.外部LED点滅の空の新規プロジェクト作成

Picoインストール先のフォルダの"Pico Project Generator"をクリックし、起動します。

 

新規プロジェクトの構成設定画面が表示されます。Project Nameにプロジェクト名を入力します。"ExternalLedBlink"と入力します。Locationに保存先を入力します。"pico-examples”があるPicoインストール先を選択します。BoardTypeは使用ボードに合わせて”pico”、または"pico_w"を選択します。今後、本書の新規プロジェクト作成では"Console Options"を先の7章と異なり、UARTを使用せず、USBを使用することとします。UARTとPCとの接続が不要となります。ただUSBの標準出力は、Picoにロードされたプログラムが起動時に、PC側で認識されることとなり、PC側のターミナルソフトはPicoプログラムが起動後に立ち上げる必要があります。ソースリストにこの対応する関数を呼びだしています。詳細はソースリストを参照してください。あとの設定は、初期状態のままとします。この構成は、CMakeLists.txtに反映されます。また、手動で、このCMakeLists.txtは編集可能です。OKボタンを押します。

Picoインストール先のフォルダにある”Visual Studio Code for Pico”をクリックし、起動し、新規作成したExcternalLedBlinkのフォルダを「ファイル」>「ホルダのオープン」で開きます。

 

Visual Studio Codeで、上記画面のようにExternalLedBlinkフォルダ内の一覧が表示されます。CMakeLists.txtは第7章と異なり、以下stdioの定義部分が以下になっています。

pico_enable_stdio_uart(ExternalLedBlink 0)

pico_enable_stdio_usb(ExternalLedBlink 1)

stdiouart出力を0にして無効とします。stdiousb出力を1として有効にしています。

次に"GCC 10.3.1 arm-none-eabi"を選択します。選択すると、cmakeが起動され、以下、

 

Build ファイルが作成された、とのメッセージが表示され完了します。

これで、空の新規プロジェクトが作成できました。ただ、標準出力USBに1度だけ、"Hello world!"を出力だけのプログラムです。このままでは、標準出力をUARTからUSBに変更しているため動作しません。

 

9.1.2.外部LED点滅のプログラム作成

プロジェクト名:ExternalLedBlink

プロジェクト概要

ここから、空のプロジェクトを編集し、実際のプログラムを作成します。このプログラムでは、赤、黄色、青の3つのLEDを使用して、信号機のプログラムを作成します。GPIOのドライブ電流は、SDK,およびデータシートによると、設定できる値は2,4,8,12 mAで初期値は4mAです。またRP2040が同時に出力できる電流値はMax50mAです。この範囲内で使用することが必要です。LEDの順方向電圧は2.1Vです。したがって、電流制限抵抗を330Ωとすると

LED電流 = (3.3V - 2.1V)/330 = 3.6mA

となり、GPIOドライブ電流4mA以内となります。プラス側アノード、マイナス側カソード、足の長い方がアノード端子です。

 

部品リスト

3mm赤色LED 1

3mm黄緑色LED 1

3mm黄色LED 1

1/4Wカーボン抵抗 330Ω 3

 

回路図

ソースリスト

#include <stdio.h>

#include "pico/stdlib.h"

#define LED_RED_PIN 2

#define LED_YELLOW_PIN 3

#define LED_BLUE_PIN 10

int main()

{

    int     stage;

    stdio_init_all();

    gpio_init(LED_RED_PIN);

    gpio_set_dir(LED_RED_PIN, GPIO_OUT);

    gpio_init(LED_YELLOW_PIN);

    gpio_set_dir(LED_YELLOW_PIN, GPIO_OUT);

    gpio_init(LED_BLUE_PIN);

    gpio_set_dir(LED_BLUE_PIN, GPIO_OUT);

    stage = 0;

    while(true)

    {

        switch (stage)

        {

        case 0: //Go

            gpio_put(LED_BLUE_PIN, 1);

            gpio_put(LED_YELLOW_PIN, 0);

            gpio_put(LED_RED_PIN, 0);

            puts("Go");

            sleep_ms(5000);

            break;

        case 1: //Caution

            gpio_put(LED_BLUE_PIN, 0);

            gpio_put(LED_YELLOW_PIN, 1);

            gpio_put(LED_RED_PIN, 0);

            puts("Caution");

            sleep_ms(1000);

            break;

        case 2: //Stop

            gpio_put(LED_BLUE_PIN, 0);

            gpio_put(LED_YELLOW_PIN, 0);

            gpio_put(LED_RED_PIN, 1);

            puts("Stop");

            sleep_ms(5000);

            break;

        default:

            break;

        }

        stage++;

        if(stage >= 3)

        {

            stage = 0;

        }

    }

    return 0;

}

Stage変数が、現在の信号機の状態を保持し、0:赤、1:黄色、2:青と順に、切り替わり、指定時間点灯します。各色の点灯時間は、sleep_msで変更できます。

Picoでプログラム実行後、PC側でターミナルソフトTera Termを起動し、Pico接続のCOMポートを選択し、待機します。C言語は一般的な標準出力の関数として、printf関数、およびputs関数があります。違いは、printfが書式付出力関数に対して、putsは文字列専用の関数です。文字のみを出力したい場合はputsがおすすめです。putsは文字列に改行コードが不要で、自動的に改行します。実行するとPicoを接続先のコンピュータに信号が変化するごとにメッセージが表示されます。

 

 

9.2.LED点灯に対するスッチ反応速度計測

プロジェクト名:LedReactionTime

プロジェクト概要

人は、ゲーム、自動車運転等で、画面、信号機の変化に対して反応し行動を起こしますが、この反応時間は、どの程度でしょうか、また環境、年齢での反応時間は異なるのでしょうか。この疑問に答えるため、このプロジェクトを作成します。

 

部品リスト

3mm赤色LED 1

1/4Wカーボン抵抗 330Ω 1

タクトスイッチ 2

 

配線図

このプロジェクトではLEDと2つのスイッチを使用します。このプロジェクトでは、信号の正論理、負論理を学習します。上記回路で、スイッチSW2は、正論理です。正論理とは、信号がオンのとき、GPIOピンがハイレベル、プログラムで読み取る値が1になることを意味します。逆にSW3は負論理です。信号がオンのとき、GPIOピンがローレベル、プログラムで読み取る値が0になります。このためには、SW2のスイッチの片方を3.3Vに接続し、他方をGPIOピンに接続し、プルダウンに設定します。SW3はスイッチの片方をGNDに接続し、他方をGPIOピンに接続し、プルアップに設定します。

乱数生成関数rand()を使用します。このrand()を組み込むためには、C++の標準ライブラリの組み込みが必要です。このため、以下の

#include <stdlib.h>

の記述が必要です。stdlib.hがインクルードされていない場合、ビルドの時、warningメッセージがでます。これは、#include "pico/stdlib.h"とは別であり、このpico/stdlib.hのインクルードも必要です。ランダムな時間間隔でLEDが点灯します。このあと、2つのスッチの状態を読み取り、LEDオンからの経過時間を表示します。

 

ソースリスト

#include <stdio.h>

#include <stdlib.h>

#include "pico/stdlib.h"

 

#define LED_RED_PIN 2

#define BUTTON_ACTIVE_HIGH_PIN 3

#define BUTTON_ACTIVE_LOW_PIN 10

int main()

{

    stdio_init_all();

 

    gpio_init(PICO_DEFAULT_LED_PIN);

    gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);

    gpio_init(LED_RED_PIN);

    gpio_set_dir(LED_RED_PIN, GPIO_OUT);

    gpio_init(BUTTON_ACTIVE_HIGH_PIN);

    gpio_set_dir(BUTTON_ACTIVE_HIGH_PIN, GPIO_IN);

    gpio_pull_down(BUTTON_ACTIVE_HIGH_PIN);

    gpio_init(BUTTON_ACTIVE_LOW_PIN);

    gpio_set_dir(BUTTON_ACTIVE_LOW_PIN, GPIO_IN);

    gpio_pull_up(BUTTON_ACTIVE_LOW_PIN);

    gpio_put(PICO_DEFAULT_LED_PIN, 0);

    gpio_put(LED_RED_PIN, 0);

 

    while(true){

        int rval = rand()%10;

        int wait = (rval + 1)*1000; 

        int curUs, span,startUs;

 

        sleep_ms(wait);

        gpio_put(LED_RED_PIN, 1);

        startUs = time_us_32 ();

        while(true)

        {

            curUs = time_us_32 ();

            span = curUs - startUs;

            if(span > 1000*1000*10){

                break;

            }if (gpio_get(BUTTON_ACTIVE_HIGH_PIN)){

                printf("%s%7.3f%s\n", "Reaction time=", (double)span/(1000.0*1000.0), "sec");

                puts("Push on Active high button");

                break;

            }if (!gpio_get(BUTTON_ACTIVE_LOW_PIN)){

                printf("%s%7.3f%s\n", "Reaction time=", (double)span/(1000.0*1000.0), "sec");

                puts("Push on Active low button");

                break;

            }

        }

        gpio_put(LED_RED_PIN, 0);

    }

    return 0;

}

 

 

9.3.LED点灯,ブザーに対するスッチ反応速度計測

LedBuzzerReactionTime

プロジェクト概要

前章ではLED、光の目に対する反応を計測、観測しましたが、このプロジェクトでは電子ブザーを使い、音に対する反応速度を測定します。電子ブザーは、電磁ブザー(アクティブブザー)と圧電ブザー(パッシブブザー)の2つに大きく分かれます。電磁ブザーは、オンオフのみで、オンで規定のブザー音がなります。圧電ブザーは、発振回路がなく、外部から入力された波形に応じて、発音します。今回は、通常のブザー音のみが必要なため、電磁ブザーを使用します。村田製作所の電子ブザーPKB24SPCH3601を使用します。以下部品リストにある秋月電子通商で入手できます。

動作電圧範囲はDC 3.0~15Vで消費電流は3V時2.8mAとあり、GPIO初期値4mA以下で問題なく使用可能です。

部品リスト

3mm赤色LED 1

1/4Wカーボン抵抗 330Ω 1

タクトスイッチ 2

電子ブザーPKB24SPCH3601 1 秋月電子通商

 

配線図

 

ソースリスト

#include <stdio.h>

#include <stdlib.h>

#include "pico/stdlib.h"

 

//#define PICO_DEFAULT_LED_PIN 25

#define LED_PIN 2

#define BUZZER_PIN 3

#define BUTTON_PIN 10

 

int ReactionMode = 0;

 

int main()

{

    stdio_init_all();

 

    gpio_init(PICO_DEFAULT_LED_PIN);

    gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);

    gpio_init(LED_PIN);

    gpio_set_dir(LED_PIN, GPIO_OUT);

    gpio_init(BUZZER_PIN);

    gpio_set_dir(BUZZER_PIN, GPIO_OUT);

    gpio_init(BUTTON_PIN);

    gpio_set_dir(BUTTON_PIN, GPIO_IN);

    gpio_pull_down(BUTTON_PIN);

    gpio_put(PICO_DEFAULT_LED_PIN, 0);

    gpio_put(LED_PIN, 0);

    gpio_put(BUZZER_PIN, 0);

 

    while(true){

        int rval = rand()%10;

        int wait = (rval + 1)*1000; 

        int curUs, span,startUs;

 

        sleep_ms(wait);

        if(ReactionMode == 0){

            gpio_put(LED_PIN, 1);

        } else {

            gpio_put(BUZZER_PIN, 1);

        }     

        startUs = time_us_32 ();

        while(true)

        {

            curUs = time_us_32 ();

            span = curUs - startUs;

            if(span > 1000*1000*10){

                break;

            }

            if(gpio_get(BUTTON_PIN)){

                if(ReactionMode == 0){

                    printf("%s%7.3f%s\n", "Led Reaction time=", (double)span/(1000.0*1000.0), "sec");

                }else{

                    printf("%s%7.3f%s\n", "Buzzer Reaction time=", (double)span/(1000.0*1000.0), "sec");

                }

                puts("Push on button");

                break;

            }

        }

        gpio_put(LED_PIN, 0);

        gpio_put(BUZZER_PIN, 0);

        if(ReactionMode == 0){

            ReactionMode = 1;

        }else{

            ReactionMode = 0;

        }

    }

    return 0;

}

 

 

9.4.LED点灯,ブザーリアクションゲームもぐらたたき

プロジェクト名:WhackAmoleGame

プロジェクトの概要

このプロジェクトでは4個のLEDをランダムに指定時間点灯させ、そのLEDに対応するスイッチが指定時間内にオンされば、叩かれたと判定します。このゲームはリセットボタンスタート後、指定時間、実行されます。

 

部品リスト

3mm赤色LED 4

1/4Wカーボン抵抗 330Ω 4

タクトスイッチ 4

電子ブザーPKB24SPCH3601 1 秋月電子通商

 

配線図

 

ソースリスト

#include <stdio.h>

#include <stdlib.h>

#include "pico/stdlib.h"

 

//#define PICO_DEFAULT_LED_PIN 25

#define BUZZER_PIN 2

#define LED1_PIN 3

#define LED2_PIN 10

#define LED3_PIN 11

#define LED4_PIN 12

#define BUTTON1_PIN 13

#define BUTTON2_PIN 14

#define BUTTON3_PIN 15

#define BUTTON4_PIN 16

 

int CurLedIndex;

int Score;

int Value;

 

int main()

{

    stdio_init_all();

 

    gpio_init(PICO_DEFAULT_LED_PIN);

    gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);

   

    gpio_init(BUZZER_PIN);

    gpio_set_dir(BUZZER_PIN, GPIO_OUT);

 

    gpio_init(LED1_PIN);

    gpio_set_dir(LED1_PIN, GPIO_OUT);

    gpio_init(LED2_PIN);

    gpio_set_dir(LED2_PIN, GPIO_OUT);

    gpio_init(LED3_PIN);

    gpio_set_dir(LED3_PIN, GPIO_OUT);

    gpio_init(LED4_PIN);

    gpio_set_dir(LED4_PIN, GPIO_OUT);

    

    gpio_init(BUTTON1_PIN);

    gpio_set_dir(BUTTON1_PIN, GPIO_IN);

    gpio_pull_down(BUTTON1_PIN);

    gpio_init(BUTTON2_PIN);

    gpio_set_dir(BUTTON2_PIN, GPIO_IN);

    gpio_pull_down(BUTTON2_PIN);

    gpio_init(BUTTON3_PIN);

    gpio_set_dir(BUTTON3_PIN, GPIO_IN);

    gpio_pull_down(BUTTON3_PIN);

    gpio_init(BUTTON4_PIN);

    gpio_set_dir(BUTTON4_PIN, GPIO_IN);

    gpio_pull_down(BUTTON4_PIN);

 

    gpio_put(PICO_DEFAULT_LED_PIN, 0);

    gpio_put(BUZZER_PIN, 0);

    gpio_put(LED1_PIN, 0);

    gpio_put(LED2_PIN, 0);

    gpio_put(LED3_PIN, 0);

    gpio_put(LED4_PIN, 0);

 

    Score = 0;

    srand(time_us_32());

 

    while(true){

        int rval = rand()%10;

        int wait = (rval + 1)*300; 

        int curUs, span,startUs;

        sleep_ms(wait);

 

        CurLedIndex = rand()%4;

        switch (CurLedIndex)

        {

            case 0:

                gpio_put(LED1_PIN, 1);

                break;

            case 1:

                gpio_put(LED2_PIN, 1);

                break;

            case 2:

                gpio_put(LED3_PIN, 1);

                break;

            case 3:

                gpio_put(LED4_PIN, 1);

                break;

            default:

                break;

        }

        startUs = time_us_32 ();

        while(true)

        {

            curUs = time_us_32 ();

            span = curUs - startUs;

            if(span >= 1000*800){

                break;

            }

            switch (CurLedIndex)

            {

                case 0:

                    Value = gpio_get(BUTTON1_PIN);

                    break;

                case 1:

                    Value = gpio_get(BUTTON2_PIN);

                    break;

                case 2:

                    Value = gpio_get(BUTTON3_PIN);

                    break;

                case 3:

                    Value = gpio_get(BUTTON4_PIN);

                    break;

                default:

                    break;

            }

            if(Value){

                gpio_put(BUZZER_PIN, 1);

                sleep_ms(50);

                gpio_put(BUZZER_PIN, 0);

                Score++;

                printf("%s%d%s%d\n", "Index =", CurLedIndex, " Score =", Score);

                break;

            }

        }

        switch (CurLedIndex)

        {

            case 0:

                gpio_put(LED1_PIN, 0);

                break;

            case 1:

                gpio_put(LED2_PIN, 0);

                break;

            case 2:

                gpio_put(LED3_PIN, 0);

                break;

            case 3:

                gpio_put(LED4_PIN, 0);

                break;

            default:

                break;

        }

    }

    return 0;

}

このプロジェクトでは乱数の生成前に 乱数のseed、種を設定する srand()関数を使用します。この関数を使用しない場合、生成乱数に変化がなく、ランダムなゲームになりません。Srand関数は以下のように、seedに時間usを与えて、初期化します。

srand(time_us_32());

ターミナルソフトTera TermがPC側で起動されていれば、叩かれる毎に、標準出力に現在のスコアが表示されます。

if(span >= 1000*800){

にあるように、800msec以内に対応するスイッチがオンされれば、叩かれたと判定し、ブザーが鳴りスコアがアップします。簡単にたたくことができる場合、この値を小さくし、また叩くことができない場合、値を大きくします。

 

9.5.LEDによるモールス信号

プロジェクト名:MorseCodeGenerator

プロジェクト概要

LEDの点滅、またはブザーオンオフによるモールス信号の送信を行います。メッセージは接続されたPCからの標準入力から受け取ります。本プロジェクトでは、標準入出力から送信するメッセージをプログラム起動時に受け取ります。またPCとのUSB経由接続は、Pico側プログラム起動されないと有効にならないため、Pico側では、プログラムの先頭でPCでのTera Term起動を待ちます。

 

部品リスト

3mm赤色LED 1

1/4Wカーボン抵抗 330Ω 1

電子ブザーPKB24SPCH3601 1 秋月電子通商

配線図

 

ソースリスト

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "pico/stdlib.h"

 

//#define PICO_DEFAULT_LED_PIN 25

#define LED_PIN 2

#define BUZZER_PIN 3

#define BUTTON_PIN 10

 

const uint DOT_PERIOD_MS = 200;

const char *MorseCodeList[] = {

        //A-J 

        ".-","-...","-.-.","-..",".","..-.","--.","....","..",".---",

        //K-T

        "-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-",

        //U-Z    

        "..-","...-",".--","-..-","-.--","--.."

};

 

int OutDevice = 0;//0:Led 1:Buzzer

 

void OutputMorse(const char *str) {

    int         index;

    char        morseCode[256];

    char        *morseCodePtr;

    

    for (; *str; ++str) {

        gpio_put(PICO_DEFAULT_LED_PIN, 1);

        if (*str == ' ') {

            sleep_ms(DOT_PERIOD_MS * 4);

        } else {

            if (*str >= 'A' && *str <= 'Z') {

                index = *str - 'A';

            } else if (*str >= 'a' && *str <= 'z') {

                index = *str - 'a';

            } else {

                printf("Invalid char error > %c\n", *str);

                index = -1;

            }

            if(index >= 0){

                strcpy(morseCode, MorseCodeList[index]);            

                morseCodePtr = &morseCode[0];

                printf("%c\n", *str);

                for (; *morseCodePtr; ++morseCodePtr){

                    printf("%c", *morseCodePtr);

                    if(OutDevice == 0) { 

                        gpio_put(LED_PIN, 1);

                    } else {

                        gpio_put(BUZZER_PIN, 1);

                    }

                    if (*morseCodePtr == '.'){

                        sleep_ms(DOT_PERIOD_MS);

                    }else{

                        sleep_ms(DOT_PERIOD_MS * 3);

                    }

                    if(OutDevice == 0) { 

                        gpio_put(LED_PIN, 0);

                    } else {

                        gpio_put(BUZZER_PIN, 0);

                    }

                    sleep_ms(DOT_PERIOD_MS*1);

                }

                sleep_ms(DOT_PERIOD_MS * 2);

                printf("\n");

            }

        }

        gpio_put(PICO_DEFAULT_LED_PIN, 0);

        sleep_ms(500);

    }

}

int main()

{

    int     i, ch;

    char   *sendMessage[256]; 

 

    stdio_init_all();

 

    gpio_init(PICO_DEFAULT_LED_PIN);

    gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);

    gpio_init(LED_PIN);

    gpio_set_dir(LED_PIN, GPIO_OUT);

    gpio_init(BUZZER_PIN);

    gpio_set_dir(BUZZER_PIN, GPIO_OUT);

    gpio_init(BUTTON_PIN);

    gpio_set_dir(BUTTON_PIN, GPIO_IN);

    gpio_pull_down(BUTTON_PIN);

    

    gpio_put(PICO_DEFAULT_LED_PIN, 0);

    gpio_put(LED_PIN, 0);

    gpio_put(BUZZER_PIN, 0);

 

    while(true)

    {

        if(stdio_usb_connected())

        {

            break;

        }    

        gpio_put(PICO_DEFAULT_LED_PIN, 1);

        sleep_ms(200);

        gpio_put(PICO_DEFAULT_LED_PIN, 0);

        sleep_ms(200);

    }

 

    printf("\nSelect out device 0:Led 1:Buzzer >\n");

    ch = getchar_timeout_us(1000*1000*60);

    if(ch == PICO_ERROR_TIMEOUT){

        printf("Time out, exit\n");

        return(0);

    }

    

    if(ch == '0'){

        OutDevice = 0;

        printf("Selected Device >Led\n");

    } else {

        OutDevice = 1;

        printf("Selected Device >Buzzer\n");

    }

 

    char    mess[257];

    int     count = 0;

    printf("\nInput message >\n");

    for(i = 0; i < 256; i++){

        sleep_ms(500);

        ch = getchar_timeout_us(1000*1000*60);

        if(ch == PICO_ERROR_TIMEOUT){

            printf("Time out, exit\n");

            return(0);

        }

        //putchar(ch);

        if(ch == 13){

            mess[count] = 0;

            break;

        } else {

            mess[count] = ch;

            count++;

        }

    }

    printf("Message = %s\n", mess);

    OutputMorse(mess);

    gpio_put(PICO_DEFAULT_LED_PIN, 1);

    while(true)

    {

    }

    return 0;

}

stdio_usb_connected()の関数を呼び出し、戻り値がTrueであればループを抜けます。PC側Tera Termが起動しUSB標準入出力が有効になるまでの間、オンボードLEDは点滅し待機します。Tera Termとの接続がOKとなると、まず、モールス信号の出力デバイスを選択します。

    printf("\nSelect out device 0:Led 1:Buzzer >\n");

0がLEDで1がブザーです。Tera Term画面からキーボードで入力します。次に送信メッセージを入力します。以下入力メッセージのプロンプトが表示されますので英文字で入力し、リターンキーを押します。

    printf("\nInput message >\n");

標準入力の関数は、タイムアウトが可能なgetchar_timeout_us()が便利です。Usec単位でタイムアウトを指定します。メッセージが入力されると、デバイスに応じて、LEDまたはブザーにモールス信号が出力されます。

 

 

9.6.LEDサイコロ

プロジェクト名:LedDice

プロジェクトの概要

電子サイコロです。スイッチを押すごとに、LEDに1-6のサイコロの目が表示されます。

 

部品リスト

3mm赤色LED 7

1/4Wカーボン抵抗 330Ω 7

タクトスイッチ 1

 

配線図

 

ソースリスト

#include <stdio.h>

#include <stdlib.h>

#include "pico/stdlib.h"

 

//#define PICO_DEFAULT_LED_PIN 25

#define LED1_PIN 2

#define LED2_PIN 3

#define LED3_PIN 10

#define LED4_PIN 11

#define LED5_PIN 12

#define LED6_PIN 13

#define LED7_PIN 14

 

void OnoffAllLed(bool on) {

    int value;    

    if(on){

        value = 1;

    } else {

        value = 0;

    }

    gpio_put(LED1_PIN, value);

    gpio_put(LED2_PIN, value);

    gpio_put(LED3_PIN, value);

    gpio_put(LED4_PIN, value);

    gpio_put(LED5_PIN, value);

    gpio_put(LED6_PIN, value);

    gpio_put(LED7_PIN, value);

}

 

void SetDiceValue(int value) {

    gpio_put(LED1_PIN, 0);

    gpio_put(LED2_PIN, 0);

    gpio_put(LED3_PIN, 0);

    gpio_put(LED4_PIN, 0);

    gpio_put(LED5_PIN, 0);

    gpio_put(LED6_PIN, 0);

    gpio_put(LED7_PIN, 0);

    switch(value)

    {

    case 0:

        gpio_put(LED4_PIN, 1);

        break;

    case 1:

        gpio_put(LED2_PIN, 1);

        gpio_put(LED6_PIN, 1);

        break;

    case 2:

        gpio_put(LED2_PIN, 1);

        gpio_put(LED4_PIN, 1);

        gpio_put(LED6_PIN, 1);

        break;

    case 3:

        gpio_put(LED1_PIN, 1);

        gpio_put(LED3_PIN, 1);

        gpio_put(LED5_PIN, 1);

        gpio_put(LED7_PIN, 1);

        break;

    case 4:

        gpio_put(LED1_PIN, 1);

        gpio_put(LED3_PIN, 1);

        gpio_put(LED4_PIN, 1);

        gpio_put(LED5_PIN, 1);

        gpio_put(LED7_PIN, 1);

        break;

    case 5:

        gpio_put(LED1_PIN, 1);

        gpio_put(LED2_PIN, 1);

        gpio_put(LED3_PIN, 1);

        gpio_put(LED5_PIN, 1);

        gpio_put(LED6_PIN, 1);

        gpio_put(LED7_PIN, 1);

        break;

    default:

        break;

    }

}

 

int main()

{

    int     i;

    stdio_init_all();

    gpio_init(PICO_DEFAULT_LED_PIN);

    gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);

 

    gpio_init(LED1_PIN);

    gpio_set_dir(LED1_PIN, GPIO_OUT);

    gpio_init(LED2_PIN);

    gpio_set_dir(LED2_PIN, GPIO_OUT);

    gpio_init(LED3_PIN);

    gpio_set_dir(LED3_PIN, GPIO_OUT);

    gpio_init(LED4_PIN);

    gpio_set_dir(LED4_PIN, GPIO_OUT);

    gpio_init(LED5_PIN);

    gpio_set_dir(LED5_PIN, GPIO_OUT);

    gpio_init(LED6_PIN);

    gpio_set_dir(LED6_PIN, GPIO_OUT);

    gpio_init(LED7_PIN);

    gpio_set_dir(LED7_PIN, GPIO_OUT);

    

    OnoffAllLed(true);

    sleep_ms(1000);

    OnoffAllLed(false);

 

    for( i = 0; i < 7; i++){

        switch(i)

        {

        case 0:

            gpio_put(LED1_PIN, 1);

            break;

        case 1:

            gpio_put(LED2_PIN, 1);

            break;

        case 2:

            gpio_put(LED3_PIN, 1);

            break;

        case 3:

            gpio_put(LED4_PIN, 1);

            break;

        case 4:

            gpio_put(LED5_PIN, 1);

            break;

        case 5:

            gpio_put(LED6_PIN, 1);

            break;

        case 6:

            gpio_put(LED7_PIN, 1);

            break;

        default:

            break;

        }

        sleep_ms(500);

        OnoffAllLed(false);

 

    }

    for(i = 0; i < 6; i++)

    {

        SetDiceValue(i);

        sleep_ms(500);

    }

    OnoffAllLed(false);

 

    srand(time_us_32());

    int diceValue = rand()%6;

    printf("DiceValue = %d\n", diceValue + 1);

 

    while(true)

    { 

        SetDiceValue(diceValue);

        sleep_ms(500);

        OnoffAllLed(false);

        sleep_ms(500);

    }

    

    return(0);

}

プログラムが実行されると、3種類のLEDランプテストが実行されます。まず全点灯、次に7個LEDを1つずつ点灯、最後に6種類のサイコロパターンの点灯です。完了すると、Srand関数で、seedを初期化し、0-5のサイコロの乱数を生成します。この後、サイコロのパターンをLEDに点滅表示します。リセットすることで、ランプテストから繰り返します。