haruka が 2022年09月23日14時42分14秒 に編集
初版
タイトルの変更
Spresenseで、Wi-SUN モジュールと、ELTRESアドオンボードを同時に使用する方法
タグの変更
spresense
Wi-SUN
ELTRES
メイン画像の変更
記事種類の変更
セットアップや使用方法
本文の変更
**はじめに** Spresense向けに提供されている、クレスコデジタルテクノロジー製 [ELTRESアドオンボード](https://www.cresco-dt.co.jp/service/iot/iot-poc/eltres/)と、ROHM製 [Wi-SUN モジュール](https://www.rohm.co.jp/support/spresense-add-on-board)は、どちらもUARTポートを使用するため、同時に利用することができません。 ![Wi-SUNモジュールを取り付けた状態](https://camo.elchika.com/408186979ca2a6333427e1a015cc4a06bd0cc987/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65366130666639362d336638302d343436322d613938382d3765363766626162333766622f34353865386235312d646331312d343464392d626339312d633065303631653830613964/) ![ELTRESアドオンボードを取り付けた状態](https://camo.elchika.com/3bc0d644b4c3e914d9676bde6bcb04545935bd64/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65366130666639362d336638302d343436322d613938382d3765363766626162333766622f61616165666165622d343836662d343637332d613135612d616366363266636430633134/) 以上のように、2つのボード/モジュールは同じポート(UART)を利用するため、そのままでは同時に利用することができません。 そのため、ELTRESとWi-SUNを同時にしたものを製作しようとしているため、まず、この2つのボード/モジュールを同時に使用する方法を検討しました。 --- **UART ポートを増やす方法** どちらの基板も、Spresense基板の、GNSS Antenna側のピンを利用します。写真で言う右側のピンは空いています。こちらにある信号で、外部デバイスとの通信に使えるものは、I2Cになります。 I2CをUARTに変換することで、2つのデバイスを同時に使うことができます。 I2CとUARTを変換するデバイスとしてよく使われるものに、SC16IS740 / 750があります。今回はこのデバイスを利用します。 今回は、このデバイスが搭載されている、[スイッチサイエンスで販売](https://www.switch-science.com/products/6027)されている基板を利用します。 ![SC16IS740 搭載の基板](https://camo.elchika.com/1b1dd06ebc335b4c597b96198f3e6e9154bbf8e4/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65366130666639362d336638302d343436322d613938382d3765363766626162333766622f64336265633362612d383139312d343934302d393637352d336661616536396136376432/) 次に、ELTRESとWi-SUN どちらをI2C経由にするか、を検討します。 どちらもモジュール/ボードにも、メーカーからライブラリが提供されています。今回作ろうとしている製作品は、ELTRES / Wi-SUN どちらの通信も利用します。ライブラリをどちらがそのままで利用できるか、という観点で比較をしました。Wi-SUNは、通信する内容を多く実装する必要があり、ELTRESはライブラリをそのままで必要な通信が実行できそうです。また、Wi-SUNの通信モジュール [BP35C0](https://www.rohm.co.jp/products/wireless-communication/specified-low-power-radio-modules/bp35c0-product) は、通信のためのコマンドが公開されています。そのため、Wi-SUN モジュールをI2C経由で操作することとしました。 --- **モジュール間の接続** スイッチサイエンスで販売されている基板は、Spresense側 (MPU側)と、Wi-SUN側 (DEVICE側) どちらも、Groveコネクタで接続することができます。 そのため、Spresense側、Wi-SUNモジュール側 どちらにも、Groveコネクタを設置し、接続に必要となる変換回路を実装しました ![Spresense側の接続](https://camo.elchika.com/db305ddd2951e0b78ce58555c6084dd49de00012/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65366130666639362d336638302d343436322d613938382d3765363766626162333766622f31373130666139632d666364622d343332612d613234632d616564383065306139306137/) SpresenseのI/O電圧は、1.8Vです。I2C - UART基板が3.3Vで動作するため、レベル変換をする必要があります。レベル変換は、秋月電子通商から販売されている、[I2Cバス用双方向電圧レベル変換モジュール ](https://akizukidenshi.com/catalog/g/gM-05452/) を利用しました。 ![Wi-SUN側の接続](https://camo.elchika.com/f806f9a5a9f471abcc330a2f97b856ddc14c5c9f/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65366130666639362d336638302d343436322d613938382d3765363766626162333766622f37313362633261342d643163352d343435322d623332302d653633386265376464376139/) Spresenseに直接接続できるモジュールのため、I/Oの電圧が1.8Vになるように回路が組まれています。そのため、こちらの基板にも、秋月電子通商から販売されている、[I2Cバス用双方向電圧レベル変換モジュール ](https://akizukidenshi.com/catalog/g/gM-05452/) を利用し、信号レベルの変換をしています。また、1.8VのLDOで、通信用電圧のリファレンスを作っています。 この2つの変換基板と、I2C-UART基板を接続します。 --- **SC16IS740の利用方法** SC16IS740は、I2Cデバイスなので、ArduinoのWireライブラリを経由して利用します。 ```arduino:SC16IS740の初期化 #define SC16IS740_ADDR (0x48) // SC16IS740 Register const uint8_t THR = (0x00 << 3); const uint8_t RHR = (0x00 << 3); const uint8_t FCR = (0x02 << 3); const uint8_t LCR = (0x03 << 3); const uint8_t MCR = (0x04 << 3); const uint8_t LSR = (0x05 << 3); const uint8_t RXLVL = (0x09 << 3); // special register set const uint8_t DLL = (0x00 << 3); const uint8_t DLH = (0x01 << 3); // enhanced register set const uint8_t EFR = (0x02 << 3); void setup_sc16is740() { // Wire.begin(); は、setup()内で事前にしておく // Initialize SC16IS740 // dividor latch enabled Wire.beginTransmission(SC16IS740_ADDR); Wire.write(LCR); Wire.write(0x83); Wire.endTransmission(); // set Baud Rate Wire.beginTransmission(SC16IS740_ADDR); Wire.write(DLL); // the least significant part Wire.write(24); Wire.endTransmission(); // set Baud Rate Wire.beginTransmission(SC16IS740_ADDR); Wire.write(DLH); // the most significant part Wire.write(0x0); Wire.endTransmission(); // divisor latch disabled Wire.beginTransmission(SC16IS740_ADDR); Wire.write(LCR); Wire.write(0x03); Wire.endTransmission(); // reset TX and RX FIFO, enable the transmit and receive FIFO Wire.beginTransmission(SC16IS740_ADDR); Wire.write(FCR); Wire.write(0x07); Wire.endTransmission(); } ``` ```arduino:UARTへの送信 void send_to_uart(uint8_t data) { Wire.beginTransmission(SC16IS740_ADDR); Wire.write(THR); Wire.write(data); Wire.endTransmission(); } ``` ```arduino:UARTからの受信 String recieve_from_uart() { uint8_t i, n, data; String retValue = ""; Wire.beginTransmission(SC16IS740_ADDR); Wire.write(LSR); Wire.endTransmission(); Wire.requestFrom(SC16IS740_ADDR, (uint8_t)1); data = Wire.read(); if (data == 0x61) { // at least one character in the RX FIFO Wire.beginTransmission(SC16IS740_ADDR); Wire.write(RXLVL); Wire.endTransmission(); Wire.requestFrom(SC16IS740_ADDR, (uint8_t)1); n = Wire.read(); //読み込むデータの数 Wire.beginTransmission(SC16IS740_ADDR); Wire.write(RHR); Wire.endTransmission(); Wire.requestFrom(SC16IS740_ADDR, (uint8_t)n); for (i = 0; i < n; i++) { retValue += Wire.read(); } } } ``` --- **まとめ** UARTデバイス2つを同時にSpresenseから通信することができました。この方法を利用して、製作品の制作を進めようと思います。