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 秋月電子通商
配線図
ソースリスト
#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に点滅表示します。リセットすることで、ランプテストから繰り返します。
この内容、”Raspberry Pi Pico Windows C言語プログラミング入門”は 以下のサイトでPDFでご購入できます。
www.elabnet.jp ショップ
https://www.elabnet.jp/shopdata/#cc-m-product-14710382635
この記事が気に入ったらサポートをしてみませんか?