見出し画像

7.新規プロジェクトの開発(光、音モールス信号発生)-Raspberry Pi Pico Windows C言語プログラミング入門

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

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

部品リスト
3mm赤色LED 1
1/4Wカーボン抵抗 330Ω 1
電子ブザーPKB24SPCH3601 1 秋月電子通商

配線図


図9-12

ソースリスト

 #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のサイコロの目が表示されます。

図9-13

部品リスト
3mm赤色LED 7
1/4Wカーボン抵抗 330Ω 7
タクトスイッチ 1

配線図


図9-14

ソースリスト

 #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に点滅表示します。リセットすることで、ランプテストから繰り返します。

この内容、”Raspberry Pi Pico Windows C言語プログラミング入門”は 以下のサイトでPDFでご購入できます。
www.elabnet.jp ショップ
https://www.elabnet.jp/shopdata/#cc-m-product-14710382635

この記事が気に入ったらサポートをしてみませんか?