はじめに (対象読者・この記事でわかること)
この記事は、Raspberry PiとTeensy 4.0を使ったオーディオプロジェクトに取り組んでいる方、特にTeensyAudioライブラリを使用して音楽プレーヤーやシンセサイザーを開発している方向けです。電子工作やプログラミングに興味があり、オーディオ機器を自作したいと考えているメーカーさんにも最適です。
この記事を読むことで、TeensyAudio環境でのミュート機能の実装方法、Raspberry PiからTeensyを制御する方法、そして実際のプロジェクトでの応用例について理解できます。また、ハードウェア的な接続からソフトウェア的な実装まで、段階的に学ぶことができます。
前提知識
この記事を読み進める上で、以下の知識があるとスムーズです。 - Arduino IDEでの基本的なスケッチの書き方 - Raspberry Piでの基本的なコマンド操作 - 電子回路の基礎知識(抵抗、トランジスタなど)
TeensyAudioとミュート機能の重要性
TeensyAudioは、Teensy 4.0の高性能なDSP機能を活用したオーディオライブラリで、リアルタイムでの音響処理が可能です。しかし、実際のオーディオ機器として使用する際に、ミュート機能は欠かせません。急激に大きな音が出た時の保護、トランジション効果、そしてユーザビリティの向上のためにも、適切なミュート制御が求められます。
特にRaspberry Piと組み合わせたシステムでは、リモート制御や自動化されたミュート制御が可能になり、より高度なオーディオシステムの構築ができます。
具体的な実装方法と手順
それでは、実際にRaspberry PiとTeensy 4.0を使ったTeensyAudioのミュート機能を実装していきましょう。
ハードウェアの接続
まず、Raspberry PiとTeensy 4.0を接続します。今回はUART通信を使用して、Raspberry PiからTeensyへミュートコマンドを送信します。
必要な部品: - Raspberry Pi 3B以上 - Teensy 4.0 - ジャンパーワイヤー - 1kΩ抵抗(プルアップ用) - 2N2222トランジスタ(ミュート回路用)
接続図:
Raspberry Pi GPIO14 (TX) → Teensy RX1 (pin 0)
Raspberry Pi GPIO15 (RX) ← Teensy TX1 (pin 1)
Raspberry Pi 3.3V → 1kΩ抵抗 → Teensy RX1
Teensy pin 2 → 1kΩ抵抗 → 2N2222ベース
2N2222エミッタ → GND
2N2222コレクタ → オーディオ出力ライン
Teensy側のスケッチ
次に、Teensy 4.0用のスケッチを書きます。TeensyAudioライブラリを使用して、ミュート機能を実装します。
Cpp#include <Audio.h> #include <Wire.h> #include <SPI.h> #include <SD.h> #include <SerialFlash.h> // TeensyAudioオブジェクト AudioSynthWaveformSine sine1; AudioOutputI2S i2s1; AudioConnection patchCord1(sine1, 0, i2s1, 0); AudioConnection patchCord2(sine1, 0, i2s1, 1); AudioControlSGTL5000 sgtl5000; // ミュート制御用 bool isMuted = false; const int MUTE_PIN = 2; void setup() { Serial.begin(115200); pinMode(MUTE_PIN, OUTPUT); digitalWrite(MUTE_PIN, LOW); AudioMemory(10); sgtl5000.enable(); sgtl5000.volume(0.5); sine1.frequency(440); sine1.amplitude(0.5); } void loop() { // Raspberry Piからのコマンドを待機 if (Serial.available() > 0) { char command = Serial.read(); if (command == 'M') { // ミュートON setMute(true); } else if (command == 'U') { // ミュートOFF setMute(false); } else if (command == 'T') { // トグル setMute(!isMuted); } } } void setMute(bool mute) { isMuted = mute; if (isMuted) { digitalWrite(MUTE_PIN, HIGH); // トランジスタONでミュート sine1.amplitude(0); // 振幅も0に } else { digitalWrite(MUTE_PIN, LOW); // トランジスタOFF sine1.amplitude(0.5); // 振幅復帰 } // ステータスをRaspberry Piに送信 Serial.print("Mute status: "); Serial.println(isMuted ? "ON" : "OFF"); }
Raspberry Pi側のPythonスクリプト
Raspberry PiからTeensyを制御するPythonスクリプトを作成します。
Python#!/usr/bin/env python3 import serial import time import RPi.GPIO as GPIO class TeensyAudioController: def __init__(self, port='/dev/serial0', baudrate=115200): self.ser = serial.Serial(port, baudrate, timeout=1) time.sleep(2) # Teensyの起動待ち def mute(self): """ミュートON""" self.ser.write(b'M') print("Muted") def unmute(self): """ミュートOFF""" self.ser.write(b'U') print("Unmuted") def toggle_mute(self): """ミュートトグル""" self.ser.write(b'T') def close(self): self.ser.close() # 使用例 if __name__ == "__main__": controller = TeensyAudioController() try: while True: command = input("Enter command (M: mute, U: unmute, T: toggle, Q: quit): ").upper() if command == 'M': controller.mute() elif command == 'U': controller.unmute() elif command == 'T': controller.toggle_mute() elif command == 'Q': break # 応答を待つ response = controller.ser.readline() if response: print(f"Response: {response.decode().strip()}") except KeyboardInterrupt: print("\nProgram terminated by user") finally: controller.close()
ハマった点やエラー解決
実装中に遭遇した主な問題とその解決方法を紹介します。
問題1: シリアル通信が不安定 最初のうち、Raspberry PiとTeensyのシリアル通信が頻繁に切断されました。 原因:ボーレートの設定ミスと、配線のノイズでした。 解決:ボーレートを115200に統一し、TX/RXラインにプルアップ抵抗を追加しました。
問題2: ミュート時にクリックノイズが発生 ミュートON/OFF時に「ポチッ」というノイズが混入していました。 原因:トランジスタのスイッチング速度が速すぎたため。 解決:ベース抵抗を調整し、0.1μFのコンデンサを並列に追加してスイッチングを緩やかにしました。
問題3: TeensyAudioの振幅が0でも微弱な音が漏れる sine1.amplitude(0)にしても、わずかに音が出ていました。 原因:TeensyAudioライブラリの内部的なリミッタが働いていたため。 解決:sgtl5000.volume()メソッドも併用して、完全にミュートするようにしました。
解決策
最終的なsetMute関数は以下のようになりました:
Cppvoid setMute(bool mute) { isMuted = mute; if (isMuted) { // フェードアウト for (float i = sine1.getAmplitude(); i > 0; i -= 0.01) { sine1.amplitude(i); delay(10); } digitalWrite(MUTE_PIN, HIGH); sgtl5000.volume(0); } else { digitalWrite(MUTE_PIN, LOW); sgtl5000.volume(0.5); // フェードイン for (float i = 0; i <= 0.5; i += 0.01) { sine1.amplitude(i); delay(10); } } }
まとめ
本記事では、Raspberry PiとTeensy 4.0を組み合わせたTeensyAudio環境でのミュート機能の実装方法を解説しました。
- ハードウェア的なミュート回路の構築方法
- TeensyAudioライブラリを使用したソフトミュートの実装
- Raspberry Piからのリモート制御システム
- 実装時のトラブルシューティング
この記事を通して、読者の方はプロフェッショナルなオーディオ機器と同等のミュート機能を、手軽に実装できることが理解できたでしょう。今後は、Webインターフェースからの制御や、複数チャンネルでの独立したミュート制御についても記事にする予定です。
参考資料
参考にした資料、ドキュメント、ライブラリなどを記載します。
- Teensy Audio Library Documentation
- Teensy 4.0 Pinout Reference
- Raspberry Pi UART Communication Guide
- 2N2222 Transistor Datasheet
- Audio Muting Circuit Design
