【MSX0】BUZZER.PAS【Turbo Pascal】

# はじめに
Seeed 社の [『Grove Beginner Kit for Arduino』](https://www.seeedstudio.com/Grove-Beginner-Kit-for-Arduino-p-4549.html) のセンサーのうち、MSX0 の IoT BASIC のサンプルがないものを『Turbo Pascal』で動作させてみます。

 - [【MSX0】IoT BASIC サンプルの移植【Turbo Pascal】(Qiita)](https://qiita.com/ht_deko/items/2362488c5c99aec4afbf)

# BUZZER
パッシブブザー [D5] を鳴らします。パッシブブザーはアクティブブザーとは異なり、電圧を掛ければ鳴るものではなく、矩形波を出力しないと鳴りません。要はスピーカーです。

**See also:**

 - [Chapter 7: Buzzer - Arduino UNO チュートリアル: サインスマートのプロジェクト練習教本 (ht-deko.com)](https://ht-deko.com/arduino/uno_tutorial2.html#02_02_07)

## MSX0 Stack での挙動

まず事前にモジュールをつないでおきます。MSX0 側は **Port B** (黒) に接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/6c3830e9-c777-ee16-3131-bd690fd15bf5.png)

| センサー | 接続方法 | Grove ポート |
|:---|:---|:---|
| [D5] BUZZER | Digital | Port B (黒色) |

上段左から 2 つ目のモジュールがパッシブブザーです。シルク印刷は裏にあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/705b9430-24b5-2e8f-febd-bb6cab8a88d2.png)

## GROVE ケーブルの修正 (クロスケーブルの作成)

MSX0 でパッシブブザーを鳴らすためには、GROVE ケーブルの黄色と白の線を入れ替える必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/b08b1803-8d99-bcc5-4b8a-5bda0f810040.png)

マイナスの精密ドライバー (100 均で買えます) でコネクタのツメを持ち上げながら線を引っ張ると、ピンを抜く事ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/29524062-0c63-71ef-20f0-d46776cc72d3.png)

Grove ケーブルの片方のコネクタの黄色と白の線を入れ替えてください。奥までカチっと差し込んで、線を軽く引っ張って抜けなければ OK です。ツメを持ち上げすぎるとコネクタが破損しますので注意してください。

| ピン | ケーブル | モジュール | Port B |
|:---:|:---:|:---:|:---:|
| 1 | 黄 | SIG | I |
| 2 | 白 | NC | O |
| 3 | 赤 | VCC | V |
| 4 | 黒 | GND | G |

モジュールのパッシブブザーは Pin1 (外側: 黄色) に接続されていますが、MSX0 Stack Port B の出力ピンは Pin2 (内側: 白色) となっているため、線を入れ替える必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/d90b0973-5ab3-6f83-076b-768594a89039.png)

付属の Grove ケーブルを 1, 2 本、クロス接続にしておくとよいでしょう。コネクタを任意の色のマーカーペンで着色しておくと誤接続防止になります。

**See also:**

 - [『MSX0 Stack』の操作方法 - ハードウェア](https://qiita.com/ht_deko/items/cdb1594e9879a5e9e660#grove-%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF)

## MSX-BASIC のコード

MSX-BASIC でブザーを鳴らすコードについては HRA! さんの資料 (6.3. ブザー) を参考にしてください。

 - [MSX0入門 (Github: @hra1129)](https://github.com/msx-sample-code-space/for_msx0/blob/main/information/development/HRA!/MSX0%E5%85%A5%E9%96%80.pdf)


## Turbo Pascal のコード

別途、`SYSUTILS.LIB`、`IOT.LIB` が必要です。

 - [【MSX0】IOT.LIB (Qiita)](https://qiita.com/ht_deko/items/a5c0bf6e7969093beb3c)

```pascal:BUZZER.PAS
program BUZZER;
type
  LibStr = string[80];
{$I SYSUTILS.LIB}
{$I IOT.LIB}
begin
  while not KeyPressed do
  begin
    IoTPutInt('device/analog/out', 4000);
    Delay(1789);
    IoTPutInt('device/analog/out', 0);
    Delay(894);
  end;
end.
```

実行して<font color="Crimson">耳を澄ますと微かにブザーが繰り返し 2 秒間鳴っている</font>のを確認できます。

:::note info
任意のキーで中断できます。
:::

### 解説
本来、パッシブブザーはもっと大きな音で鳴るのですが、MSX0 では PWM がサポートされていないので、この程度の音を出すのが精一杯です。PWM がサポートされていないのに何故音が鳴るのかと言うと、MSX0 の `device/analog/out` が本物の (?) アナログ出力ではなく PWM だからです (恐らく ESP32 の ledc が使われている)。

矛盾しているようですが、要は PWM を細かくコントロールしてパッシブブザーを鳴らせるような機能が (現状の) MSX0 には実装されていないという事です。

**See also:**

 - [パルス幅変調 (Wikipedia)](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%AB%E3%82%B9%E5%B9%85%E5%A4%89%E8%AA%BF)

# おわりに
まぁ、音を鳴らすだけなら MSX 側の音を鳴らせばいいんですけどね。

**See also:**
 - [analogWrite() - Arduino Reference](https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/)
 - [tone() - Arduino Reference](https://www.arduino.cc/reference/tr/language/functions/advanced-io/tone/)
 - [ ledcWriteNote() / ledcWriteTone() (ht-deko.com)](https://ht-deko.com/arduino/esp-wroom-32.html#16)