RN4020 を MLDP モードで使う

 

MicrochipのRN4020をMLDPモードで使用する方法の紹介です。

 

MLDPモードとはMicrochipがBLEでSPPと同様の機能を実現するために、独自に開発されたモードのことです。

このモードを使用するとRN4020同士でBLEを使用したシリアル通信を行うことがでるので、BLE経由でモノ操作するリモコン機能などが実装できると思います。

 

 

■システム構成

BLE、Bluetoothに共通して言えることですが、通信を行う際、データを送る側である”マスター(親機)”とデータを受ける側である”スレーブ(子機)”に各モジュールの役割を決める必要があります。

・スレーブ(子機)

RN4020では子機は[SR,32000000]コマンドで設定することができます。

・マスター(親機)

RN4020では親機の設定は [SR,92000000]コマンドで設定することができます。

親機設定後は[F]コマンドでBLE子機を探索し、接続したい子機が見つかったら、[E,0,子機ID]で接続することができます。

接続すると”Connected”という返答がきて、マスターとスレーブ共に10pin(PIO1)がHIGHにアサインされます。(通常、インジケータのLEDを接続する端子にしておくと良い)

接続後は、親機に送信したシリアル通信の内容がそのまま子機へフォワードされるようになります。

 

 

■回路図

・マスターは簡単に下記のような回路にしました。

USBシリアル変換とPCをUSBで接続し、シリアルコンソール(TeraTermやCoolTermなど)を使用してコマンドを適宜送信します。

 

 

・スレーブは下記のような回路図にしました。

秋月で発売されているArduino互換機を使ってシリアルで受信した内容によって、フルカラーLEDの色を変えたり止めたりする&&スイッチが押されたら押されたとシリアル送信するような仕組みにしました。

 

 

Arduino互換機の中に書いたコードは下記です。


#define LED 2
#define RedLED 3
#define GreenLED 5
#define BlueLED 6
#define Button 16

char recvChar;
char flag = 0;

void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
delay(100);
pinMode(LED,OUTPUT);

pinMode(RedLED,OUTPUT);//PWM Red
pinMode(GreenLED,OUTPUT);//PWM Green
pinMode(BlueLED,OUTPUT);//PWM Blue

pinMode(18,OUTPUT);
pinMode(Button,INPUT);

digitalWrite(18,HIGH);
}

void loop() {
// put your main code here, to run repeatedly:
while(Serial.available()){
recvChar = Serial.read();
switch(recvChar){
case '1':
Serial.println("1 OK");
flag = 1;
break;
case '2':
Serial.println("2 OK");
flag = 0;
rgbStop();
break;
default:
break;
}
}
if(digitalRead(Button) == 1){
Serial.println("Button Pusshed!");
delay(200);
}
rgbStart();
}

int RGB = 1;
void rgbStart(){
while(flag){
if(RGB <= 120){
analogWrite(RedLED,255 - (RGB*2));
analogWrite(GreenLED,0);
analogWrite(BlueLED,RGB*2);
}else if(120 < RGB && RGB <= 240){
analogWrite(RedLED,0);
analogWrite(GreenLED,((RGB-120)*2));
analogWrite(BlueLED,(255 - ((RGB-120)*2)));
}else if(240 < RGB && RGB <= 360){
analogWrite(RedLED,((RGB-240)*2));
analogWrite(GreenLED,(255 - ((RGB-240)*2)));
analogWrite(BlueLED,0);
}
else{
RGB = 1;
break;
}
delay(5);
RGB++;
}
}
void rgbStop(){
RGB = 1;
analogWrite(RedLED,0);
analogWrite(GreenLED,0);
analogWrite(BlueLED,0);
}

 

実験のため実際にブレットボードで組んでいる様子が下記になります。

■親機

 

■子機

コメントを残す

メールアドレスが公開されることはありません。