さくらの通信モジュール（LTE）-β版とNUCLEO-L476RGを繋ぐまで

ファーストサーバの奥の奥に生息し、人が居なくなればミニセグウェイで暴走しているchakkiです。
お知らせsendo君から「ネタいっぱい持ってるだろ」「何か書け」と言われ、仕事関係で書くことを考えましたが思いつかないので、仕事と全く関係ない趣味のことを書きたいと思います。

ここ数年、組込機器とインターネットが簡単に繋がる時代になりましたが、今まではWifiやBluetooth経由での接続が多く、直接3GやLTE回線でインターネットに接続するものは少なかったところ、さくらインターネットさんから通信モジュールがリリースされたので、ボケ防止も兼ねて使ってみることにしました。
まずは、組込機器と通信モジュールを繋ぐところまでを書いてみましたので、IoTに興味があり試してみたいと思っている方の参考になればと思います。

#さくらの通信モジュール（LTE）-β版とは
[さくらの通信モジュール（LTE）-β版](http://iot-store.sakura.ad.jp/items/4326125)は、さくらインターネットさんのIoT基盤（[さくらのIoT Platform](https://iot.sakura.ad.jp/)）に接続するための専用通信モジュールです。
期間限定（2017年1月10日 11:00まで）で半額だったので、使い方等見ず2個ぽちりました。(^_^;
通信モジュール単体では使えないので、「[Arduinoシールドボード-β版](http://iot-store.sakura.ad.jp/items/4350904)」か「[ブレイクアウトボード（検証ボード）-β版](http://iot-store.sakura.ad.jp/items/4350907)」のどちらかを合わせて購入する必要があります。

#NUCLEO-L476RG
[NUCLEO-L476RG](http://www.st.com/content/st_com/en/products/evaluation-tools/product-evaluation-tools/mcu-eval-tools/stm32-mcu-eval-tools/stm32-mcu-nucleo/nucleo-l476rg.html)は[STMicroelectronics](http://www.st.com/content/st_com/en.html)社製開発用ボードで、CPUにARM Cortex-M4 STM32L476RGが使われています。
このボードは、2016年11月15日～17日に横浜で開催された[ET/IoT Technology 2016](http://www.jasa.or.jp/expo/)のSTMicroelectronics社ブースで無料でいただきました。（STMicroさん、ありがとうございますm(__)m）
NUCLEOシリーズは、Arduinoシールドが使え、ブラウザ上で開発ができる[MBED](https://www.mbed.com/en/)にも対応しています。
STMicroelectronics社はドキュメントが充実している（と思っている）ので、ARM系ボードを選ぶ時はSTMicroelectronics社製チップが搭載されたものを選んでいます。

#接続
![sakura_iot接続図.jpg](https://qiita-image-store.s3.amazonaws.com/0/151672/7bdb8b46-61f2-27ec-c051-6c2f9b790375.jpeg)


まず初めに、通信モジュールをArduinoシールドボードに搭載します。
搭載方法は[Arduino シールド（β版）取扱説明書](https://iot.sakura.ad.jp/developer/pdf/sco-ard-01_manual.pdf)のP3を」参照してください。

通信モジュールをArduinoシールドボードに搭載できたら、NUCLEO-L476RGに搭載します。
Arduinoシールドボードへの電源供給は”VIN”から行いますが、NUCLEO-L476RGのVINから電源供給されないので、+5Vからジャンパー接続（赤線）します。

今回はおまけでデータ表示用にLCD（[SD1602X](http://eleshop.jp/shop/g/gB3A41K/)）を接続しました。
通信モジュールとLCDは、ケーブル接続本数の少ないI2C接続（黄線・緑線）にしました。
LCDの電源は+3Vなので、NUCLEO-L476RGの+3V3と接続（橙線）します。
また、LCDリセット用としてNUCLEO-L476RGのGPIO PA8を接続（白線）しています。
※白線に接続された抵抗は、NUCLEO-L476RGのGPIO PA8が初期化前は入力モードとなり、電圧が不安定となるため念のため付けました。（無くても問題ありません）

I2Cは同一バス上に複数デバイスを接続するため、各デバイスの出力はオープンコレクタとなっています。
オープンコレクタ出力は、信号を"H"にすることができないので、NUCLEO-L476RG側でプルアップの設定をしました。

各デバイスのスレーブアドレスは、さくらの通信モジュールが4FH、LCDディスプレイが74H（固定）となっています。

#開発環境
##EWARM
NUCLEO-L476RGはMBEDに対応しているので、まずはMBEDから簡単に接続できると思い試してみたがうまく接続できず。。。
コマンド等も良くわからず、しばらく悩んだ挙句、MBEDで開発する前に使っていた[IAR社Embedded Workbench for ARM](https://www.iar.com/jp/iar-embedded-workbench/)(EWARM）で開発することにしました。
EWARMは、無償版として「コードサイズ無制限で30日間限定」か「コードサイズ限定（32KB,Cortex-M0/M0+は16KBまで）」があり、32KBもコードを書くことは無いので、コードサイズ限定版をダウンロードし使っています。

##STM32CubeMX
[STM32CubeMX](http://www.st.com/ja/development-tools/stm32cubemx.html)は、GUIにからCPUのパラメータ設定と、ベースのコード（プロジェクト）を生成する、STMicroelectronics社純正のツールです。
「New Project」を選び、「New Project」ウィンドウから「Board Selector」タブを選択、「MCU Series」を”STM32L4”を選択し”NUCLEO-L476RG”を選択する。
![CubeMX_NewProject.jpg](https://qiita-image-store.s3.amazonaws.com/0/151672/2648851c-1d21-e13f-6fd6-852e5b71eaa0.jpeg)


「OK」ボタンを押すと左側に機能一覧と右側にCPUの端子が表示されます。
Arduinoシールドボード側I2C端子とNUCLEO-L476RGの接続は、”I2C_SCLK1がPB8” ”I2C_SDA1がPB9”としましたので、NUCLEO-L476RGのPB8,PB9をI2Cで接続する設定を行います。合わせて、左側機能一覧でI2C1を有効にする設定を行います
![CubeMX_CPU.jpg](https://qiita-image-store.s3.amazonaws.com/0/151672/62826cc6-373c-d1d2-b9b1-85c09aecd107.jpeg)

I2C端子のプルアップ設定を行うため「Configuration」タブの「Connectivity」にあるI2C1を押します。
「I2C Configuration」ウィンドウの「GPIO Settings」タブを選択し、「GPIO Pull-up/Pull-down」を”Pull-up”に設定し「OK」ボタンを押します。
![CubeMX_CPU_Config.jpg](https://qiita-image-store.s3.amazonaws.com/0/151672/17cb24e2-d999-1447-1290-1ee0d23598c5.jpeg)

![CubeMX_I2C_Config.jpg](https://qiita-image-store.s3.amazonaws.com/0/151672/50e5392b-b135-f584-6973-ecb0135ccaae.jpeg)

設定が完了したらメニューの歯車アイコン（Generate source code based on user settings）を押してベースコードを生成します。
![CubeMX_Menu.jpg](https://qiita-image-store.s3.amazonaws.com/0/151672/986fd0cd-58a9-30f5-8467-e48f48c7ecd0.jpeg)

「Project Name」「Project Location」を設定し、「Toolchain / IDE」を”EWARM”に設定します。
![CubeMX_ProjectSettings.jpg](https://qiita-image-store.s3.amazonaws.com/0/151672/d6ede362-12b1-7dc0-a32e-a5038d5ed772.jpeg)

![CubeMX_CodeGenerateComplete.jpg](https://qiita-image-store.s3.amazonaws.com/0/151672/67ee831e-d981-1496-0bcb-d389dd161a77.jpeg)

「Open Project」を選択するとEWARMが起動するので、左側「ワークスペース」の「Application」-「User」の”main.c”をダブルクリックすると、エディタ画面にコードを表示されますので、プログラミングを開始できます。
![EWARM_ProjectOpen.jpg](https://qiita-image-store.s3.amazonaws.com/0/151672/f65d469f-02bc-e3d1-e66e-b90ffdc815f3.jpeg)

コードを書くときは、”/* USER CODE BEGIN ～ */” から ”/* USER CODE END ～ */”以外に書かれたコードは、STM32CubeMXでCPUの機能やパラメータを変更し、再度ベースコードを生成する際に上書きされますので注意してください。

写真は、NUCLEO-L476RG、Arduinoシールドボード、LCDすべて接続した後のものです。
※写真右下に小さいボードが接続されていますが、これはI2C接続できるカレンダー時計モジュールで、今回の内容には登場しないデバイスです。
LCDには、上の段に「Get Connection Status」の値（Bit7=1で送受信可能状態、Bit6～0=0でエラーなし）、下の段に「Get signal quality」の値（03h=中くらい）を表示させています。
![Board_Pic.JPG](https://qiita-image-store.s3.amazonaws.com/0/151672/66751e34-549a-8b4c-852b-147184fc1d42.jpeg)