m5stackで組込み!!

Arduinoによるm5stack開発のいろいろと...

ビープ音を出力

今回はビープ音を出力するプログラミングを作成しました。

音を鳴らすための初期化

ビープ音関係の初期化はM5.begin()では行っていないのでこちらの関数で初期化しましょう。
私は初期化を忘れてかなりの時間、ハマってました。。。

    M5.Speaker.begin();

音を鳴らすためのAPI

音を出すためのAPIはいくつかありますが、今回はM5.Speaker.tone()を使ってみたら、いきなり爆音!!!!
しかも、音量調節できないみたいです。。。
なので代わりにこちらを使います。

まずは使用するチャンネル設定の関数です。
第一引数に使用するチャンネル
第二引数にPWMの周波数
第三引数にデューティ比を表すビット数
この関数はM5.Speaker.begin()の中でコールされているので第一、第三引数はそのままで、第二引数の周波数だけ変えてあげればよいです。

    ledcSetup( TONE_PIN_CHANNEL, TONE_FREQ, 13);


次に音声音量調整の関数です。
第一引数に使用するチャンネル
第二引数にデューティ比
音量は第二引数のデューティ比を変更して調整します。

    ledcWrite( TONE_PIN_CHANNEL, 0x1FF>>(9-ucVol) );

サンプルコード

#include <M5Stack.h>

#define TONE_FREQ 900
#define TONE_STOP 0
#define TONE_PLAY 1

static unsigned char gucVol = 0;
static unsigned char gucToneSts = 0;

void setup() {
    // M5Stackの初期化
    M5.begin();
    // Speaker初期化
    M5.Speaker.begin();

    // BLACK Screen
    M5.Lcd.fillScreen(BLACK);
    // 横線
    M5.Lcd.drawFastHLine(0, 220, 320, WHITE);
    // 縦線
    M5.Lcd.drawFastVLine(106, 220, 20, WHITE);
    M5.Lcd.drawFastVLine(219, 220, 20, WHITE);
    // 矢印
    M5.Lcd.fillTriangle(  49, 232,  53, 224,  57, 232,WHITE );
//    M5.Lcd.fillTriangle( 159, 224, 167, 228, 159, 232,WHITE );
    M5.Lcd.fillTriangle( 269, 224, 273, 232, 277, 224,WHITE );

    // テキストサイズ指定
    M5.Lcd.setTextSize(1);
    // START
    M5.Lcd.setCursor(140, 224);
    M5.Lcd.print("START");
    // ボリューム値
    gucVol = 4;
    // トーン状態
    gucToneSts = TONE_STOP;
}

void loop() {
    M5.update();

    // Aボタン
    if (M5.BtnA.wasPressed()) {
        // 再生中
        if( TONE_PLAY == gucToneSts) {
            // 音量UP
            if( gucVol < 9 ){
                gucVol++;
            } else {
                gucVol = 9;
            }
            SetVolume( gucVol );
        }
    }
    // Bボタン
    if (M5.BtnB.wasPressed()) {
        // 開始
        if( TONE_STOP == gucToneSts) {
            ledcSetup( TONE_PIN_CHANNEL, TONE_FREQ, 13);
            SetVolume( gucVol );
            gucToneSts = TONE_PLAY;
            // テキストサイズ指定
            M5.Lcd.setTextSize(1);
            // START
            M5.Lcd.fillRect(107, 221, 87, 19, BLACK);
            M5.Lcd.setCursor(140, 224);
            M5.Lcd.print("STOP");
        }
        // 停止
        else {
            // ミュート
            M5.Speaker.mute();
            gucToneSts = TONE_STOP;
            // テキストサイズ指定
            M5.Lcd.setTextSize(1);
            // START
            M5.Lcd.fillRect(107, 221, 87, 19, BLACK);
            M5.Lcd.setCursor(140, 224);
            M5.Lcd.print("START");
        }
    }
    // Cボタン
    if (M5.BtnC.wasPressed()) {
        // 再生中
        if( TONE_PLAY == gucToneSts) {
            // 音量DOWN
            if( gucVol > 0 ){
                gucVol--;
            } else {
                gucVol = 0;
            }
            SetVolume( gucVol );
        }
    }

    //音量
    // テキストサイズ指定
    M5.Lcd.setTextSize(2);
    // ENTER
    M5.Lcd.setCursor(100, 100);
    M5.Lcd.printf("VOLUME: %d", gucVol);

    delay(100);

    return;
}

static void SetVolume( unsigned char ucVol )
{
    ledcWrite( TONE_PIN_CHANNEL, 0x1FF>>(9-ucVol) );
    
    return;
}

これで爆音でなるビープ音から解放された。
www.youtube.com

m5stackで組込み!

今まで個々の機能を作ってきましたが、それぞれの機能を合わせて色々とできないかなーと思っていたところ、
やはり同じように考えている方がいました。

raspida.com

私もこんな感じでこれからは作っていきたいと思います。

Arduino Pro IDEとは?

Arduino IDEとは違いデバッグができるみたいですけど。。。できない。
まずは使い方がさっぱりわからない。
α版なのでバグも多いみたい。。。

ちなみにこちらからダウンロードできます。
github.com

興味がある人はダウンロードしてみてください。
また使い方が分かったらぜひ教えていただきたいです。笑

twitterに投稿 その2

ソースを綺麗にしたので公開

メインファイル

#include <M5Stack.h>
#include "WifiTwitter.h"

WifiTwitter wifitwitter("YOUR_TOKEN");

void setup() {
  String config_ini;
  String ssid;
  String password;
  /* 初期化 */
  M5.begin();
  /* SD初期化 */
  SD.begin();

  /* 文字サイズを変更 */
  M5.Lcd.setTextSize(1);
  
  /* ファイルオープン */
  File datFile = SD.open("/set/config.ini");
  if( datFile )
  {
    M5.Lcd.println("File open successful");
    /* サイズ分ループ */
    while( datFile.available() )
    {
      config_ini = config_ini + datFile.readString();
    }
    /* ファイルクローズ */   
    datFile.close();
  } 
  else
  {
    M5.Lcd.println("File open error hello.txt");
  }
  /* SSID取得 */
  config_ini = config_ini.substring(config_ini.indexOf("#SSID\r\n") + 7);
  ssid = config_ini.substring(0, config_ini.indexOf("\r\n"));
  /* パスワード取得 */
  config_ini = config_ini.substring(config_ini.indexOf("#SSID_PASS\r\n") + 12);
  password = config_ini.substring(0, config_ini.indexOf("\r\n"));

  /* connect to WiFi */
  M5.Lcd.print("Connecting to YOUR_SSID ");
  /* wifi初期化 */
  WiFi.begin(ssid.c_str(), password.c_str());
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      M5.Lcd.print(".");
  }
  M5.Lcd.println(" CONNECTED");

  /* disconnect WiFi as it's no longer needed */
//  WiFi.disconnect(true);
//  WiFi.mode(WIFI_OFF);
}

void loop() {
  M5.update();
  // Aボタン
  if (M5.BtnA.wasPressed()) {
    if (wifitwitter.post("tweet for M5stack A Btn")) {
      int status = wifitwitter.wait();
      if (status == 200) {
        Serial.println("OK.");
      } else {
        Serial.print("failed : code ");
        Serial.println(status);
      }
    } else {
      Serial.println("connection failed.");
    }
  }
  // Bボタン
  if (M5.BtnB.wasPressed()) {
    wifitwitter.post("tweet for M5stack B Btn");
  }
  // Cボタン
  if (M5.BtnC.wasPressed()) {
    wifitwitter.post("tweet for M5stack C Btn");
  }
}

twitterライブラリ

このライブラリをもとにEthernetからwifiに変更しました。
github.com