最終更新日 2022年3月28日
Seeed XIAO RP2040を入手しました。購入先でそこそこ価格がバラつくのですが、秋月での通販注文時に送料無料にするために追加購入した次第です。
earlephilhower氏の RaspberryPiPico/RP2040 ボードライブラリではサポート機では無いのですが、流石Seeed社です。ちゃんとArduinoIDEで開発出来るようサポートされていました。
Wiki:https://wiki.seeedstudio.com/XIAO-RP2040-with-Arduino/
ユーザフォーラムもしっかりしていると思います。https://forum.seeedstudio.com/c/products/rp2040/100
ただ、活発とはいえないかも。本体はUSBType-Cです。今後Type-Cに置き換わってゆくのでしょうね。PCと接続するのですが、そのままでは認識されません。ちゃんとWikiを読んでから実施する必要があります。
ハードウエアの接続:
- BOOTボタン(B)を押したままにして、XIAORP2040をPCに接続します。
- 「RPI-RP2」ディスクがPCに表示され、XIAO RP2040の電源LEDがオンになっている場合、接続は完了です。
![]()
ソフトウエアのセットアップ:
- オペレーティングシステムに応じて最新バージョンのArduinoIDEをダウンロードしてインストールします。
※既にインストール済みならスキップ- Arduinoアプリケーションを起動します。
- Example:brink を開いておきます。
- デバイスマネージャにてXIAORP2040をArduinoIDEに追加します。
※既にインストール済みならスキップ
[ファイル]> [設定]に移動し、 [追加のボードマネージャーのURL]に
https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json
が追加されていますか?- SeeedXIAORP2040の最新ライブラリは1.12.0のようです。
※1.9.3の方が安定しているみたいです。- [ツール] -> [ボード]に移動し、[ XIAORP2040]を見つけて選択します。
- [ツール]> [ポート]に移動し、接続されているXIAORP2040のシリアルポート名を選択します。
正しく認識されているとCOMx(SeeedXIAORP2040)と云う表示になると書かれていますが、
Windows7環境ではそもそも認識されないかもしれません。
デバイスマネージャでは黄色三角のPicoArduinoが出ていました。
自分は強引にAtmelCorpのドライバを選択して認識させました。もっとスマートな方法があるはずですが。- Example:brinkをbuildしてUploadします。このときbrinkのコードはレタッチしてシリアルプリントする様にした方が動作確認になると思います。
実行確認:
XIAO RP2040 with Arduino Wikiに幾つかのサンプルスケッチが掲載されているのですが、これがなかなか動かないです。
XIAORP2040単体での動作確認がうまくゆくのにSeeeduino XIAO Expansion board_v1.0に設置してテストしたいと思うとうまくゆかない事が多々ありました。XIAORP2040単体:
- Digital:XIAORP2040には赤/緑/青の単色LEDが搭載されており、それを確認します。
/* * 2022年3月28日 T.Wanibe * 赤LED点滅後 緑LEDが点滅、そして青LED点滅を繰り返す。 * ちゃんと動作しました。 * 最大2093056バイトのフラッシュメモリのうち、スケッチが58584バイト(2%)を使っています。 * 最大262144バイトのRAMのうち、グローバル変数が11156バイト(4%)を使っていて、ローカル変数で250988バイト使うことができます。 */ #define LED_COUNT 3 #define LED_RED 17 #define LED_GREEN 16 #define LED_BLUE 25 #define COLOR_REPEAT 2 uint8_t led[LED_COUNT] = {LED_RED, LED_GREEN, LED_BLUE}; uint8_t repeatCount = 0; uint8_t ledCount = 0; //---------------- void setup(){ for (int i = 0; i < LED_COUNT; i++){ pinMode(led[i], OUTPUT); digitalWrite(led[i], HIGH); // LEDをOFFにする(HIGHでOFF) } } //---------------- void loop(){ digitalWrite(led[ledCount], LOW); // LOWでON delay(1000); // wait for a second digitalWrite(led[ledCount], HIGH); // HIGHでOFF delay(1000); // wait for a second repeatCount++; if (repeatCount >= COLOR_REPEAT){ repeatCount = 0; ledCount++; if (ledCount >= LED_COUNT){ ledCount = 0; } } }- RGB LED:XIAORP2040にはNEOPIXELと言われるRGBLEDが搭載されています。それを確認します。
<Adafruit_NeoPixel.h>がコンパイルエラーになるかもしれません。
/* * 2022/03/11 T.Wanibe * Seeed XIAO Wikiにあるテストコードの動作確認を行う。pinアサインは変更しないといけないみたい * https://wiki.seeedstudio.com/jp/Seeeduino-XIAO/ * ArduinoIDE 1.8.19 * ボード:Seeed XIAO RP2040 * Flash Size:2MB(noFS) * CPU Speed:133MHz ※初期値は125MHz * Optimize:Smail(-Os)(standard) * RTTI:Disabled * DebugLevel:なし * USB Stack:PicoSDK * シリアルポート:COMxx * * RGBLEDのテストコードとして紹介されていたモノをレタッチしました。 * 残念ながらこのコードはビルド出来ません。Adafruit_NeoPixel.hに対応出来ていないみたいです。 * 最新のライブラリを更新したのですが。 * 最大2093056バイトのフラッシュメモリのうち、スケッチが59464バイト(2%)を使っています。 * 最大262144バイトのRAMのうち、グローバル変数が11164バイト(4%)を使っていて、ローカル変数で250980バイト使うことができます。 */ #include <Adafruit_NeoPixel.h> #define NUMPIXELS 1 int Power = 11; int PIN = 12; Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); //---------------- void setup() { pixels.begin(); pinMode(Power,OUTPUT); digitalWrite(Power, HIGH); } //---------------- void loop() { pixels.clear(); //pixels.setPixelColor(i, pixels.Color(RV, GV, BV)); //i=0から始まるエレメントのアドレスを指定します。 //RV, GV, BVは各色の輝度値0-255 pixels.setPixelColor(0, pixels.Color(255, 0, 0)); delay(400); pixels.show(); pixels.clear(); pixels.setPixelColor(0, pixels.Color(0, 255, 0)); delay(400); pixels.show(); pixels.clear(); pixels.setPixelColor(0, pixels.Color(0, 0, 255)); delay(400); pixels.show(); pixels.clear(); pixels.setPixelColor(0, pixels.Color(128, 128, 128)); delay(400); pixels.show(); pixels.clear(); pixels.setPixelColor(0, pixels.Color(12, 66, 101)); delay(400); pixels.show(); delay(500); }- BOTTON:XIAORP2040にはBOOTとRESETボタンが搭載されています。
RESETボタンがDOにアサインされているので、ボタンを押している間青色LEDを点灯させます。
/* * 2022/03/11 T.Wanibe * Seeed XIAO Wikiにあるテストコードの動作確認を行う。pinアサインは変更しないといけないみたい * https://wiki.seeedstudio.com/jp/Seeeduino-XIAO/ * ArduinoIDE 1.8.19 * ボード:Seeed XIAO RP2040 * Flash Size:2MB(noFS) * CPU Speed:133MHz ※初期値は125MHz * Optimize:Smail(-Os)(standard) * RTTI:Disabled * DebugLevel:なし * USB Stack:PicoSDK * シリアルポート:COMxx * * ピンD0をデジタルピンとして使う: * ビルドは通りました * 実際に実行すると『B』ボタンを押している間と青LEDがOFFになります * 最大2093056バイトのフラッシュメモリのうち、スケッチが58672バイト(2%)を使っています。 * 最大262144バイトのRAMのうち、グローバル変数が11152バイト(4%)を使っていて、ローカル変数で250992バイト使うことができます。 */ const int buttonPin = D0; // the number of the pushbutton pin 6->D0 const int ledPin = 25; // the number of the LED pin 13->25 int buttonState = 0; // variable for reading the pushbutton status //------------------ void setup() { // LEDピンを出力として初期化します。: pinMode(ledPin, OUTPUT); // 押しボタンピン(B)を入力として初期化します: pinMode(buttonPin, INPUT); } //------------------ void loop() { // 押しボタン値の状態を読み取ります: buttonState = digitalRead(buttonPin); // 押しボタンが押されているかどうかを確認します。 そうである場合、buttonStateはHIGHです: if (buttonState == HIGH) { // ボタンが押されたら青LEDを点灯にします: digitalWrite(ledPin, LOW); } else { // LEDを消灯にします: digitalWrite(ledPin, HIGH); } }XIAORP2040+XIAO 拡張ボード:
- I2Cモジュールを接続 まずはI2Cスキャンが動くか確認します。そして接続したI2Cデバイスの動作確認です。
I2CスキャンはWireで動くのですが、実際接続したI2CデバイスはWire1のラインを使用する必要があります。
/* * 2022/03/26 T.Wanibe * I2Cスキャン * 15:46:45.842 -> Scanning... * 15:46:45.876 -> I2C device found at address 0x3C ! SSD1315?(LCD) * 15:46:45.876 -> I2C device found at address 0x44 ! * 15:46:45.876 -> I2C device found at address 0x51 ! PCF8563(RTC) * 15:46:45.876 -> I2C device found at address 0x70 ! * 15:46:45.876 -> done * 普通に動作しました。 * 最大2093056バイトのフラッシュメモリのうち、スケッチが61832バイト(2%)を使っています。 * 最大262144バイトのRAMのうち、グローバル変数が11780バイト(4%)を使っていて、ローカル変数で250364バイト使うことができます。 */ #include <Wire.h> //------------------ void setup() { Wire.begin(); Serial.begin(115200); while (!Serial); Serial.println(F("\nI2C Scanner")); } //------------------ void loop() { int nDevices = 0; Serial.println(F("Scanning...")); for (byte address = 1; address < 127; ++address) { Wire.beginTransmission(address); byte error = Wire.endTransmission(); if (error == 0) { Serial.print(F("I2C device found at address 0x")); if (address < 16) { Serial.print(F("0")); } Serial.print(address, HEX); Serial.println(F(" !")); ++nDevices; } else if (error == 4) { Serial.print(F("Unknown error at address 0x")); if (address < 16) { Serial.print("0"); } Serial.println(address, HEX); } } if (nDevices == 0) { Serial.println(F("No I2C devices found\n")); } else { Serial.println(F("done\n")); } delay(5000); }
M5Stackモジュール:センサUNIT_ENV3を使って見ます。※正直なところセンサUNIT_ENV2の方がお勧めですが。
/* * 2022/03/25 T.Wanibe * PiPicoで動作確認したコードをXIAORP2040で実行して見ました。注意が必要なのはXIAOshieldのI2CのポートはI2C1ポートになるという事です * このスケッチはPicoをGroveShieldに装着し、I2C1にM5StackのセンサUNIT_ENV3を接続して * 温度、湿度、圧力計測するモノです。 * UNIT_ENV3にはI2C: SHT30(0x44), QMP6988(0x70)です。 * I2Cアドレスが指定出来るライブラリを使わないとうまくデータ取得出来ませんね。 * UNIT_ENV3のライブラリ SHT3X.h QMP6988.h はPiPicoでうまく使えないようです。 * Adafruit_SHT31.hはSHT30も共通で使える様です。Adafruitのライブラリはしっかりしているみたいです。 * またQMP6988のライブラリは限られるようです。 * I2C1のポートに接続しましたが、Wire.setSDA(6);Wire.setSCL(7);の設定を怠るとデータが取得出来ません。 * ポート番号はSeeedStudioが提供するShield回路図を必ず確認する必要があります。 * 最大2093056バイトのフラッシュメモリのうち、スケッチが66568バイト(3%)を使っています。 * 最大262144バイトのRAMのうち、グローバル変数が12256バイト(4%)を使っていて、ローカル変数で249888バイト使うことができます。 */ #include <Wire.h> #include "Adafruit_SHT31.h" #include "QMP6988.h" //UNIT_ENV3に含まれています。 Adafruit_SHT31 sht30(&Wire1); QMP6988 qmp6988; float tmp = 0.0; //なぜかNaNが認められない float hum = 0.0; float pressure = 0.0; float tmpOnPico = 0.0; int count = 0; //-------------- void setup() { Serial.begin(115200); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); Wire1.setSDA(6); //RP2040にはI2C0の組み合わせが6通りあるので設定しておくのが無難です。 Wire1.setSCL(7); Wire1.begin(); //ENV IIのgroveコネクタ接続pin設定 sht30.begin(0x44); // sht30 I2C address: 0x44 or 0x45 qmp6988.init(0x70,&Wire1); qmp6988.setpPowermode(QMP6988_NORMAL_MODE); qmp6988.setFilter(QMP6988_FILTERCOEFF_OFF); Serial.println(qmp6988.deviceCheck()); Serial.println(F("ENV Unit III test")); } //-------------- void loop() { delay(1000); if(count++ % 2){ digitalWrite(LED_BUILTIN, HIGH); }else{ digitalWrite(LED_BUILTIN, LOW); } tmpOnPico = analogReadTemp(); pressure = qmp6988.calcPressure()/100; //qmp6988のデータを取得します。 tmp = sht30.readTemperature(); //SHT30のデータを取得します。 hum = sht30.readHumidity(); //SHT30から得られた湿度を代入します。 Serial.printf("OnPicoTemp: %2.1f[℃]\nTemp: %2.1f[℃]\nHumi: %2.0f[%%]\nPressure:%5.0f[hPa]\n", tmpOnPico,tmp, hum, pressure); }- OLCDを使う サンプルスケッチには U8x8lib.h を使うものがありますが、
#include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h>を使う方がお勧めです。
XIAO 拡張ボードはWire1でアクセスする必要があります。また、I2Cアドレスにも注意です。I2Cスキャナで実際に確認して使う事をお勧めします。ドキュメント(ブロック図)には0x78と云う記載があります。なぜ?
/* * 2022年3月28日 T.Wanibe * XIAORP2040 + Seeeduino XIAO Expansion boardの環境でOLCDに表示させる * ビルドがなかなか通らなかった。 * Adafruit_SSD1306のライブラリは新しいモノで無いとダメな模様 * OLCDのアドレスはI2Cスキャナのコードを実行して確認する事をお勧め。 * 最大2093056バイトのフラッシュメモリのうち、スケッチが65636バイト(3%)を使っています。 * 最大262144バイトのRAMのうち、グローバル変数が9600バイト(3%)を使っていて、ローカル変数で252544バイト使うことができます。 */ #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels //#define OLED_RESET 4 #define OLED_RESET -1 #define OLED_ID 0x3c // initialize with the I2C addr 0x3D or 0x3C Adafruit_SSD1306 display(SCREEN_WIDTH,SCREEN_HEIGHT,&Wire1,OLED_RESET); //------------------------- void setup(){ Wire1.setSDA(SDA); Wire1.setSCL(SCL); Wire1.begin(); display.begin(SSD1306_SWITCHCAPVCC, OLED_ID); display.clearDisplay(); } //------------------------- void loop() { // text display tests display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println(F("Hello, world!")); display.setTextColor(BLACK, WHITE); // 'inverted' text display.println(F("Hello, world!")); display.setTextSize(2); display.setTextColor(WHITE); display.println(F("Hello, world!")); display.display(); delay(5000); display.clearDisplay(); display.display(); }
- UART接続 GPSモジュールを接続し、勝手に流れてくるGPSセンテンス文字列を表示して動作確認とします。UART0=Serial1です。
/* * 2022年3月25日 T.Wanibe * UBOXのGPSモジュールをXIAORP2040のUART1に接続し動作確認をするプログラムです。 * シリアルモニタにGPSから届くセンテンスが逐次表示されます。 * 最大2093056バイトのフラッシュメモリのうち、スケッチが60288バイト(2%)を使っています。 * 最大262144バイトのRAMのうち、グローバル変数が11368バイト(4%)を使っていて、ローカル変数で250776バイト使うことができます。 */ //----------------- void setup() { Serial.begin(115200); while (!Serial); pinMode(LED_BUILTIN,OUTPUT); Serial.println(F("\nStart XIAO_RP2040_TestUART0")); Serial1.setRX(1); Serial1.setTX(0); Serial1.begin(9600); } //----------------- void loop() { digitalWrite(LED_BUILTIN,LOW); if (Serial1.available()){ digitalWrite(LED_BUILTIN,HIGH); Serial.print((char)Serial1.read()); } }- RTCを使う RP2040には内部RTCが搭載されているのですが精度が悪いようです。±200ppm程度です。従って拡張ボードのRTCは意味があるのでしょうね。ただ、PCF8563はどうなんでしょうね。自分はDS3231が好きです。
ライブラリですが、 PCF8563.h が調子悪いのでLang-ship管理人:田中正幸氏作のライブラリを使って見ました。
コイン電池を搭載していたら、2回目以降のビルド時には、//pcf.setTime(&timeStruct); と云うようにコメントアウトしてください。
/* * 2022/03/28 T.Wanibe * XIAO RTCの動作確認 LCD表示が出来ない * 最大2093056バイトのフラッシュメモリのうち、スケッチが65076バイト(3%)を使っています。 * 最大262144バイトのRAMのうち、グローバル変数が8240バイト(3%)を使っていて、ローカル変数で253904バイト使うことができます。 */ #include "I2C_BM8563.h" #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 #define OLED_ID 0x3c // initialize with the I2C addr 0x3D or 0x3C char buf[32]; Adafruit_SSD1306 display(SCREEN_WIDTH,SCREEN_HEIGHT,&Wire1,OLED_RESET); I2C_BM8563 pcf(I2C_BM8563_DEFAULT_ADDRESS, Wire1); I2C_BM8563_DateTypeDef dateStruct; I2C_BM8563_TimeTypeDef timeStruct; //----------- void setup() { Serial.begin(115200); while(!Serial); Wire1.setSDA(SDA); //RP2040にはI2C0の組み合わせが6通りあるので設定しておくのが無難です。 Wire1.setSCL(SCL); Wire1.begin(); Serial.println(F("EndSetWire")); display.begin(SSD1306_SWITCHCAPVCC, OLED_ID); display.clearDisplay(); pcf.begin(); //initialize the clock Serial.println(F("EndINITRTC")); dateStruct.weekDay = 3; dateStruct.month = 3; dateStruct.date = 28; dateStruct.year = 2022; pcf.setDate(&dateStruct); timeStruct.hours = 18; timeStruct.minutes = 56; timeStruct.seconds = 10; pcf.setTime(&timeStruct); Serial.println(F("EndSetup")); } //----------- void loop() { // Get RTC pcf.getDate(&dateStruct); pcf.getTime(&timeStruct); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); sprintf(buf,"%04d/%02d/%02d %02d:%02d:%02d", dateStruct.year, dateStruct.month, dateStruct.date, timeStruct.hours, timeStruct.minutes, timeStruct.seconds ); display.println(buf); display.display(); Serial.println(buf); delay(1000); }- Mini SD 拡張ボードはSPI接続でSDカードスロットが接続されています。標準SPIのpinアサインなのですがCSpinが標準値では無くD2に割付いています。この点だけ意識する必要があります。
また、今回利用したライブラリでは敢えてpin定義をしない方がいいみたいです。そして、書込がprintなんです。戴けません。
myFile.println(buf);
/* * 2022年3月30日 T.Wanibe * SD card basic file example をレタッチして動作確認した * ファイルを作成してRTCから読み取った時刻を書き込む * ファイル削除をしてしまうと結果が判らなくなるので、この点はスキップ * SPIのポートを指定するとうまくゆかないのでCS=D2だけ設定する * 最大2093056バイトのフラッシュメモリのうち、スケッチが89480バイト(4%)を使っています。 * 最大262144バイトのRAMのうち、グローバル変数が8496バイト(3%)を使っていて、ローカル変数で253648バイト使うことができます。 */ #include <Arduino.h> #include <SPI.h> #include <SD.h> #include "I2C_BM8563.h" #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 #define OLED_ID 0x3c // initialize with the I2C addr 0x3D or 0x3C char buf[32]; File myFile; Adafruit_SSD1306 display(SCREEN_WIDTH,SCREEN_HEIGHT,&Wire1,OLED_RESET); I2C_BM8563 pcf(I2C_BM8563_DEFAULT_ADDRESS, Wire1); I2C_BM8563_DateTypeDef dateStruct; I2C_BM8563_TimeTypeDef timeStruct; //----------------- void setup() { // シリアル通信を開き、ポートが開くのを待ちます。 Serial.begin(115200); //while(!Serial); Wire1.setSDA(SDA); //RP2040にはI2C0の組み合わせが6通りあるので設定しておくのが無難です。 Wire1.setSCL(SCL); Wire1.begin(); Serial.println(F("EndSetWire")); display.begin(SSD1306_SWITCHCAPVCC, OLED_ID); display.clearDisplay(); pcf.begin(); //initialize the clock Serial.println(F("EndINITRTC")); Serial.print(F("Initializing SD card...")); if (!SD.begin(D2)) { Serial.println(F("initialization failed!")); return; } Serial.println(F("initialization done.")); if (SD.exists("example.txt")) { Serial.println(F("example.txt exists.")); } else { Serial.println(F("example.txt doesn't exist.")); } // 新しいファイルを開き、時刻を書込、閉じます。 Serial.println(F("Creating example.txt...")); myFile = SD.open("example.txt", FILE_WRITE); //getRTC(dateStruct,timeStruct); pcf.getDate(&dateStruct); pcf.getTime(&timeStruct); sprintf(buf,"%04d/%02d/%02d %02d:%02d:%02d", dateStruct.year, dateStruct.month, dateStruct.date, timeStruct.hours, timeStruct.minutes, timeStruct.seconds ); myFile.println(buf); myFile.close(); // ファイルが存在するかどうかを確認します。 if (SD.exists("example.txt")) { Serial.println("example.txt exists."); } else { Serial.println("example.txt doesn't exist."); } // ファイルを削除します。※消してしまうと確認出来ないのでコメントアウト Serial.println("Removing example.txt..."); //SD.remove("example.txt"); if (SD.exists("example.txt")) { Serial.println("example.txt exists."); } else { Serial.println("example.txt doesn't exist."); } Serial.println(F("EndSetup")); } //----------------- void loop() { pcf.getDate(&dateStruct); pcf.getTime(&timeStruct); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); sprintf(buf,"%04d/%02d/%02d %02d:%02d:%02d", dateStruct.year, dateStruct.month, dateStruct.date, timeStruct.hours, timeStruct.minutes, timeStruct.seconds ); display.clearDisplay(); display.println(buf); display.display(); Serial.println(buf); delay(1000); }- パッシブブザー ハッピーバースデーのメロディを再生します。ただ、拡張ボードは途中で音が出力されなくなります。Loop内は実行されているようなんですが。。。
/* * 2022年3月28日 T.Wanibe * rp2040 ToneHappyBirthday をレタッチしました。 */ #include <Arduino.h> // pin_buzzerは、サポートされているバリアント(CPlay BluefruitやCLUEなど)で定義する必要があります。 // それ以外の場合は、トーン出力に使用するピンを定義してください #define PIN_BUZZER A3 // このトーンの例で定義されているいくつかの音符の周波数: // https://www.arduino.cc/en/Tutorial/toneMelody #define NOTE_C4 262 #define NOTE_CS4 277 #define NOTE_D4 294 #define NOTE_DS4 311 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_FS4 370 #define NOTE_G4 392 #define NOTE_GS4 415 #define NOTE_A4 440 #define NOTE_AS4 466 #define NOTE_B4 494 #define NOTE_C5 523 #define NOTE_CS5 554 #define NOTE_D5 587 #define NOTE_DS5 622 #define NOTE_E5 659 #define NOTE_F5 698 #define NOTE_FS5 740 #define NOTE_G5 784 #define NOTE_GS5 831 #define NOTE_A5 880 #define NOTE_AS5 932 #define NOTE_B5 988 // 音符の長さを定義します。 全音符の時間を調整するだけで、他の音符は直接細分化されます。 #define WHOLE 2200 // 全音符(つまり、フルバー)のミリ秒単位の時間の長さ。 #define HALF WHOLE/2 #define QUARTER HALF/2 #define EIGHTH QUARTER/2 #define EIGHTH_TRIPLE QUARTER/3 #define SIXTEENTH EIGHTH/2 uint8_t const pin_buzzer = PIN_BUZZER; // 指定された周波数と指定された期間のノートを再生します。 // Holdは、この音符をもう少し長く保持するかどうかを指定するオプションのブール値です。つまり、8分音符が一緒に結ばれている場合です。 // ノートが再生されるのを待っている間、waitBreath遅延機能が使用されるため、ブレス検出とピクセルアニメーションが実行され続けます。 // スライドスイッチが-/offの位置にあるか、すべてのキャンドルが吹き消されている場合、トーンは再生されません。 void playNote(int frequency, int duration, bool hold = false, bool measure = true) { (void) measure; if (hold) { // 保持されているノートの場合は、指定された長さより少し長く再生して、次のトーンに溶け込みます // しかし、次の音を聞くにはまだ少し遅れがあります tone(pin_buzzer, frequency, duration + duration / 32); } else { // 保持されていないノートについては、指定された期間だけ再生してください。 tone(pin_buzzer, frequency, duration); } delay(duration + duration / 16); } //----------ろうそくが吹き消されたときに再生する曲。 void celebrateSong() { // Play a little charge melody, from: // https://en.wikipedia.org/wiki/Charge_(fanfare) // Note the explicit boolean parameters in particular the measure=false // at the end. This means the notes will play without any breath measurement // logic. Without this false value playNote will try to keep waiting for candles // to blow out during the celebration song! playNote(NOTE_G4, EIGHTH_TRIPLE, true, false); playNote(NOTE_C5, EIGHTH_TRIPLE, true, false); playNote(NOTE_E5, EIGHTH_TRIPLE, false, false); playNote(NOTE_G5, EIGHTH, true, false); playNote(NOTE_E5, SIXTEENTH, false); playNote(NOTE_G5, HALF, false); } //---------- void setup() { // Initialize serial output and Circuit Playground library. Serial.begin(115200); while(!Serial); pinMode(pin_buzzer, OUTPUT); digitalWrite(pin_buzzer, LOW); } //---------- void loop() { // Play happy birthday tune, from: // http://www.irish-folk-songs.com/happy-birthday-tin-whistle-sheet-music.html#.WXFJMtPytBw // Inside each playNote call it will play a note and drive the NeoPixel animation // and check for a breath against the sound sensor. Once all the candles are blown out // the playNote calls will stop playing music. playNote(NOTE_D4, EIGHTH, true,false); Serial.println(F("NOTE_D4")); playNote(NOTE_D4, EIGHTH); Serial.println(F("NOTE_D4")); playNote(NOTE_E4, QUARTER); // Bar 1 Serial.println(F("NOTE_E4")); playNote(NOTE_D4, QUARTER); Serial.println(F("NOTE_D4")); playNote(NOTE_G4, QUARTER); Serial.println(F("NOTE_G4")); playNote(NOTE_FS4, HALF); // Bar 2 Serial.println(F("NOTE_FS4")); playNote(NOTE_D4, EIGHTH, true,false); Serial.println(F("NOTE_D4")); playNote(NOTE_D4, EIGHTH); Serial.println(F("NOTE_D4")); playNote(NOTE_E4, QUARTER); // Bar 3 Serial.println(F("NOTE_E4")); playNote(NOTE_D4, QUARTER); Serial.println(F("NOTE_D4")); playNote(NOTE_A4, QUARTER); Serial.println(F("NOTE_A4")); playNote(NOTE_G4, HALF); // Bar 4 Serial.println(F("NOTE_G4")); playNote(NOTE_D4, EIGHTH, true,false); Serial.println(F("NOTE_D4")); playNote(NOTE_D4, EIGHTH); Serial.println(F("NOTE_D4")); playNote(NOTE_D5, QUARTER); // Bar 5 Serial.println(F("NOTE_D5")); playNote(NOTE_B4, QUARTER); Serial.println(F("NOTE_B4")); playNote(NOTE_G4, QUARTER); Serial.println(F("NOTE_G4")); playNote(NOTE_FS4, QUARTER); // Bar 6 Serial.println(F("NOTE_FS4")); playNote(NOTE_C5, QUARTER); Serial.println(F("NOTE_C5")); playNote(NOTE_C5, EIGHTH, true); Serial.println(F("NOTE_C5")); playNote(NOTE_C5, EIGHTH); Serial.println(F("NOTE_C5")); playNote(NOTE_B4, QUARTER); // Bar 7 Serial.println(F("NOTE_B4")); playNote(NOTE_G4, QUARTER); Serial.println(F("NOTE_G4")); playNote(NOTE_A4, QUARTER); Serial.println(F("NOTE_A4")); playNote(NOTE_G4, HALF); // Bar 8 Serial.println(F("NOTE_G4")); celebrateSong(); // ループを繰り返して再生する前に1秒間休止します delay(1000); }
免責事項
本ソフトウエアは、あなたに対して何も保証しません。本ソフトウエアの関係者(他の利用者も含む)は、あなたに対して一切責任を負いません。
あなたが、本ソフトウエアを利用(コンパイル後の再利用など全てを含む)する場合は、自己責任で行う必要があります。本ソフトウエアの著作権はToolsBoxに帰属します。
本ソフトウエアをご利用の結果生じた損害について、ToolsBoxは一切責任を負いません。
ToolsBoxはコンテンツとして提供する全ての文章、画像等について、内容の合法性・正確性・安全性等、において最善の注意をし、作成していますが、保証するものではありません。
ToolsBoxはリンクをしている外部サイトについては、何ら保証しません。
ToolsBoxは事前の予告無く、本ソフトウエアの開発・提供を中止する可能性があります。
商標・登録商標
Microsoft、Windows、WindowsNTは米国Microsoft Corporationの米国およびその他の国における登録商標です。
Windows Vista、Windows XPは、米国Microsoft Corporation.の商品名称です。
LabVIEW、National Instruments、NI、ni.comはNational Instrumentsの登録商標です。
I2Cは、NXP Semiconductors社の登録商標です。
その他の企業名ならびに製品名は、それぞれの会社の商標もしくは登録商標です。
すべての商標および登録商標は、それぞれの所有者に帰属します。