前頁でのスケッチは双方向通信のベースとなるスケッチでしたが、ジオラマ鉄道、車においてはふさわしくない部分があるので削除していきます。
ペリフェラルとセントラル間の双方向通信ですが、一般的な送信方向がジオラマの場合反対になります。
列車制御する部分がセントラルで、列車、車等はペリフェラルとなります。したがって情報の方向は、セントラルからペリフェラルへとなり、セントラルは
1個、ペリフェラルは複数となります。
従ってそれぞれの宣言文を変更していきます。
【 ペリフェラル側の改造 】
1.センサを外して「数値変数」に置き換える。->列車速度指定に使用
1.ペリフェラルをマスターにする方法があるので確認
1.送信は、すべて数値で「列車速度」「列車進行方向」「LED点灯/消灯指令」の3つのパラメーター
1.指定セントラルにそれぞれの指令数値を送信(最低3台、Max5台)
1.最低送信間隔は、200ms以内
1.各セントラルから送られる電池電圧を監視
【 セントラル側の改造 】
1.電池電圧相当数値をペリフェラル(マスター)へ送信
【 改造にあたってのポイント 】
1.BLE通信を使用している時は、一般のアナログ入力が出来ない。(電池電圧監視用)
この問題の解決方法がesp-idfライブラリを使うことです。<analogRead()の代わり>
#include <driver/adc.h>
adc1_config_width(ADC_WIDTH_BIT_12);
adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_0); <未使用:1.1Vまで>
adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_11); <未使用:3.9Vまで>
value = adc1_get_raw(ADC1_CHANNEL_0); <SENSOR_VP:GPIO36>
1.タイマー割込み(速度アップ)
ticker.attach(iIntervalTime, kickRoutine); <秒単位>
ticker.attach_ms(iIntervalTime, kickRoutine); <ms単位>
1.電池電圧値は、BLE通信の「writeValue」関数で送信するので1バイトで送れる数値(0-255)に変換する必要がある。
上記アナログ入力で、Max値:4095 であるので、4095/16=255.9375 となり、int の変数に入れると「255」となる。
電池電圧のモニターなので、さほど精度は必要なく充電タイミングを管理する為なので十分かなと思います。
1.UUIDテスト(セントラルUUIDを変化させ通信確立させる)
#define CHARACTERISTIC_UUID_TX "2049779d-78a9-403a-9c59-c7df79e1dd7c" // 送信用のUUID
#define CHARACTERISTIC_UUID_RX "9348db8a-6c61-4c6e-b12d-643625993b84" // 受信用のUUID
一部の数値を変化(ペリフェラル&セントラル共)させても通信可能であった。
1.ESP32では、モーター駆動のPWM専用出力ピンは無い
ledcSetup、ledcAttachPin、ledcWriteの関数を使用します。
1:ledcSetup(チャンネル, 周波数, PWMの範囲);
ledcSetup(0, 490, 8);
2:ledcAttachPin(ピン番号, チャンネル);
ledcAttachPin(7, 0);
3:ledcWrite(チャンネル, PWM値);
ledcWrite(0, 255);
※ledcSetupでのPWMの範囲は、8(8bit)を設定した場合は0〜255、10(10bit)の場合は0〜1023になります。
1.以上の改造中のフラッシュメモリーの使用量が80%近い
したがってマスター側にこれから多数のスケッチを必要としているのでESP32-DevKitCのメモリーでは無理であることが判明したので、マスターCPUを
RasPiに切り替えたいと思います。
RasPiでのBLEとしてペリフェラル台数の限界は、7台以下という結果が出ているので、今回の目的には十分である。
たぶんメモリー的にも十分対応できるものと思われます。