Arduino Nanoで作るAMラジオ音楽送信機
部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino Nano R3 | 1 | 他のArduinoでも可 |
| 抵抗 10kΩ | 2 | |
| コンデンサ 10µF | 1 | |
| ブレッドボード | 1 |
使用アプリとオンラインサービス
- Arduino IDE
プロジェクト概要
ATmegaマイコンで面白いことができると思い、Arduino NanoでAM送信機を作ってみました(他のArduinoボードでも動作します)。
問題は、デジタルデバイスで振幅変調(AM)をどう実現するかです。AMとは、送信したい入力信号の振幅に応じて搬送波の振幅を変化させることです。数学的には、搬送波と入力信号を乗算することに相当します。しかしATmegaの出力はデジタル(High/Lowの2値)のみ。正直なところ、Arduinoから「真のAM」を得ることはできません。
それでも、通常のAMラジオ受信機で明確に聴取できる出力信号を生成することは可能です!
解決策は、アナログ入力信号をPWM信号に変換し、ATmega MCUのADCと16ビットタイマー/カウンター1を使用することです。タイマー/カウンター2で搬送波信号を生成し、31kHz〜8MHzの広い範囲で周波数を変えられます。この搬送波をピンD11からPWM信号のリズムで出力します。AMラジオがPWMに対してローパスフィルターとして働くため、元のオーディオ信号が復元されます。
これは概念実証(Proof of Concept)なのでシンプルにしました。本格的なRF送信機として使う場合は、オーディオ入力にアンチエイリアシング用ローパスフィルター、RF出力に高調波対策用ローパスフィルターを追加してください。
コード:Arduino AM Transmitter
/* This work is licensed under Creative Commons Attribution-ShareAlike 4.0 International License.
https://creativecommons.org/licenses/by-sa/4.0/ */
#define ANTENNA_PIN PB3 // Arduino Nano/Uno D11
void setup() {
Serial.begin(115200);
// 搬送波周波数生成
uint32_t fTransmit = 600; // kHz
DDRB |= (1 << ANTENNA_PIN);
TCCR2A = (0 << COM2A1) + (1 << COM2A0); // 比較一致でOC0Aトグル
TCCR2A |= (1 << WGM21) + (0 << WGM20); // CTCモード
TCCR2B = (0 << CS22) + (0 << CS21) + (1 << CS20); // プリスケーラなし
OCR2A = F_CPU / (2000 * fTransmit) - 1;
char strbuf[255];
sprintf(strbuf, "Will broadcast at %d KHz", (F_CPU / (2 * (1 + OCR2A)) / 1000));
Serial.println(strbuf);
// PWM信号生成(10ビット Fast PWM)
TCCR1A |= (1 << WGM11) + (1 << WGM10);
TCCR1B = (1 << WGM12);
TCCR1B |= (0 << CS12) + (0 << CS11) + (1 << CS10); // プリスケーラなし
TIMSK1 = (1 << OCIE1A) + (1 << TOIE1);
// ADC設定
ADMUX = (1 << REFS1) + (1 << REFS0); // 内部1.1V基準
ADCSRA = (1 << ADEN) + (1 << ADSC) + (1 << ADATE); // オートトリガー、フリーランニング
ADCSRA |= (1 << ADPS2) + (1 << ADPS1) + (0 << ADPS0); // 64分周 → 18.5kサンプルレート
DIDR0 = (1 << ADC0D);
}
ISR(TIMER1_OVF_vect) {
uint8_t adcl = ADCL;
uint8_t adch = ADCH;
OCR1A = (adch << 8) + adcl;
DDRB |= (1 << ANTENNA_PIN);
}
ISR(TIMER1_COMPA_vect) {
DDRB &= ~(1 << ANTENNA_PIN);
}
void loop() {
// メインループは空(割り込み駆動)
}
回路図

注意: このプロジェクトは実験・教育目的です。電波法等の関連法規を遵守し、他の通信に干渉しないようご注意ください。
製造プロセス
- クラシックジュークボックスの遺産と進化
- 楽譜:中世写本から現代出版まで——業界概観
- 信号機:工学、歴史、未来の革新
- 自作LUMAZOID:Arduino音楽ビジュアライザーDIYガイド
- Bluetooth操作のArduinoスパイボットを自作する
- ArduinoでRC受信機のPPM信号をデコードする──ステップバイステップガイド
- FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
- 自作Arduino TV-B-Gone:全テレビ対応の万能リモコン
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- サーミスタを使った温度測定: Arduinoステップバイステップガイド