引き続き、以下のような構成のラジオを作りたい。
ソフトはプログラミングがとても苦手なので、対話型AIに頼って作っていく。
前回、液晶モジュールを動かそうとしたが、まさかのLCDが応答しない現象となった。
気を取り直して、先にDSPラジオモジュールの動作確認をしようと思う。
回路図はこちら
ブレッドボードでこんな感じ。
次に動かすために、データシートを見てみる。
http://aitendo3.sakura.ne.jp/aitendo_data/product_img/radio/dsp/m_pcb/m6955/M6955_dshver20130625.pdf
まず、I2Cのアドレスが明記されていないのでわからない。
I2Cのタイミングチャートを見ると、データは0x10と読めるが、波形はどう見ても0x40なのである。
まずは、I2Cのアドレス探索ができるらしいので、こちらのAIにお願いしてみる。
お願い
-----------------------------------
arduinoで、以下のように動作するプログラムを書いて
初期設定:
・d2,d3,d4,d5,d9ポートを出力にして、lowに設定
・d7ポートを入力に設定
動作
・I2Cをマスターモードにして、I2Cに機器が繋がっているか探索(アドレス1から127)
・繋がっている機器アドレスが0x10ならd2とd9をhighに設定
・繋がっている機器アドレスが0x20ならd3とd9をhighに設定
・繋がっている機器アドレスが0x40ならd4とd9をhighに設定
・つながっている機器アドレスが、それ以外にもあれば、d5とd9をhighに設定
・何もつながっていなければ、探索から繰り返す。
それ以外は待機
---------------------------------------
以下は、要件に基づいてArduinoで動作するプログラムの例です。
#include <Wire.h>
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(9, OUTPUT);
pinMode(7, INPUT);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(9, LOW);
Wire.begin();
}
void loop() {
byte error, address;
int devices = 0;
for (address = 1; address < 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
devices++;
if (address == 0x10) {
digitalWrite(2, HIGH);
digitalWrite(9, HIGH);
} else if (address == 0x20) {
digitalWrite(3, HIGH);
digitalWrite(9, HIGH);
} else if (address == 0x40) {
digitalWrite(4, HIGH);
digitalWrite(9, HIGH);
}
}
}
if (devices > 0) {
digitalWrite(5, HIGH);
digitalWrite(9, HIGH);
} else {
digitalWrite(5, LOW);
digitalWrite(9, LOW);
}
delay(1000);
}
このプログラムでは、setup()
関数で各ポートの設定とWireライブラリの初期化を行っています。loop()
関数内では、I2Cの探索を行い、各機器のアドレスに応じてポートの状態を変更しています。探索が成功した場合は、devices
変数を使用して機器の数をカウントし、最後にポート5と9が接続された機器がある場合にHIGHに設定されます。接続された機器がない場合は、ポート5と9がLOWに設定されます。その後、delay(1000)
によって1秒間の待機が行われ、loop()
関数が再度実行されます。