質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

4134閲覧

Wio LTE JP Version(SORACOM)でのソフトウエアシリアル

cucco

総合スコア15

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

1グッド

0クリップ

投稿2019/07/29 15:25

編集2019/07/31 12:00

Wio LTE JP Version(SORACOM)モジュールを使ってGPSデータの取得(UART)と別のマイコンとの通信(UART)をしようとしています。

ですが、このWioLTEのプロセッサーSTM32F405RGはハードウェアシリアルは多いのですが、UARTのGroveコネクタとしては一つしか出ていません。
そこでタイトルの通り、Wio LTE JP Version(SORACOM)モジュールでソフトウエアシリアルを使いたいと思っています。

STM32F4はハードウエアシリアルが多いのでソフトウエアシリアルはあまり使われないようですが、ライブラリを探したところ下記3つがありました。
それらのスケッチ例を少しWioLTE用に書き換えてコンパイルしたところ、それぞれ「No such file or directory」というようなエラーが出てしまいました。

それぞれ、ライブラリがみつからないだけだと思うのですが、必要そうなライブラリのインストールにつまづき解決に至りませんでした。
解決方法についてご助言いただければ幸いです。


●Wio LTE JP Version(SORACOM)モジュール
https://soracom.jp/products/module/wio_lte/

●Wio LTE の開発環境設定
https://seeedjp.github.io/Wiki/Wio_LTE_for_Arduino/Home-ja.html

●IDE
Arduino IDE 1.8.9

●ソフトウエアシリアルライブラリ
SoftSerialIntCC
https://github.com/wingspinner/SoftSerialIntCC
SoftSerialIntAP
https://github.com/wingspinner/SoftSerialIntAP
SoftSerialSTM32
https://github.com/wingspinner/SoftwareSerialSTM32

●エラー内容
SoftSerialIntCC の場合 >> fatal error: libmaple/libmaple.h: No such file or directory
SoftSerialIntAP の場合 >> fatal error: libmaple/libmaple.h: No such file or directory
SoftSerialSTM32 の場合 >> fatal error: avr/interrupt.h: No such file or directory
ボードSeeed Wio LTE Cat.1に対するコンパイル時にエラーが発生しました。

●解決しようと試みたこと
#SoftSerialIntCC と SoftSerialIntAP の場合
libmapleライブラリを入れれば解決するだろうと
https://github.com/rogerclarkmelbourne/Arduino_STM32
からダウンロードしたzipから「zip形式のライブラリをインクルード」しようとしたが有効なライブラリが見つかりませんと出て断念…

#SoftSerialSTM32 の場合
ボードをarduino UNOにするとエラーが出なくなるのでどこかにinterrupt.hはあると思うのですが、わからずに保留…

●「SoftSerialIntCC」の場合のコード

#include <WioLTEforArduino.h> #include <SoftSerialIntCC.h> SoftSerialIntCC mySerial(WIOLTE_D20, WIOLTE_D19, 2); void setup() { delay(200); SerialUSB.begin(9600); SerialUSB.println(""); SerialUSB.println("--- START ---------------------------------------------------"); SerialUSB.println("### I/O Initialize."); Wio.Init(); SerialUSB.println("### Power supply ON."); Wio.PowerSupplyGrove(true); delay(500); // set the data rate for the SoftwareSerial port mySerial.begin(4800); mySerial.println("Hello, world?"); SerialUSB.println("### Setup completed."); } void loop() // run over and over { if (mySerial.available()) SerialUSB.print((char)mySerial.read()); if (SerialUSB.available()) mySerial.print((char)SerialUSB.read()); }

●解決した方法(ソフトウェアシリアルでなくハードウェアシリアル)
(前準備)
GroveUARTコネクタとGroveD38コネクタをGroveケーブルでつなぐ。

C++

1#include <WioLTEforArduino.h> 2WioLTE Wio; 3 4 5HardwareSerial Serial6(WIO_D39, WIO_D38); // 下記4行と同等 6/* 7#define USART6 ((USART_TypeDef *) USART6_BASE) 8#define PIN_SERIAL6_TX D38 9#define PIN_SERIAL6_RX D39 10HardwareSerial Serial6(USART6); 11*/ 12 13 14void setup() 15{ 16 delay(200); 17 18 Serial.begin(9600); 19 Serial6.begin(9600); 20 21 SerialUSB.begin(9600); 22 SerialUSB.println(""); 23 SerialUSB.println("--- START ---------------------------------------------------"); 24 SerialUSB.println("### I/O Initialize."); 25 Wio.Init(); 26 Wio.PowerSupplyGrove(true); 27 delay(500); 28 29 SerialUSB.println("### Setup completed."); 30} 31 32 33 34void loop() 35{ 36 Serial6.println("This is Serial6!"); 37 38 while (Serial.available()>0){ 39 SerialUSB.print((char)Serial.read()); 40 } 41 42 43 SerialUSB.println(); 44 delay(1000); 45}
daichi-👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ボード持ってませんけど、STM32F405のデータシートを見るとPC6,7(GROVEのD38,D39)がUSART6のTX,RXなのでSerial6.begin(ボーレート);とかでハードウェアシリアル6が使えるようになっちゃったりしないか、と甘い期待を持ってしまいますがどうでしょう。


試してみるとundefined reference to 'Serial6'でリンクエラーですね。
とりあえず実体を作ったりその他...
ボードライブラリの中も覗きながら、とりあえずコンパイルだけは通してみましたがどうでしょう。

C++

1#define USART6 ((USART_TypeDef *) USART6_BASE) 2#define PIN_SERIAL6_TX D38 3#define PIN_SERIAL6_RX D39 4HardwareSerial Serial6(USART6); 5 6void setup() { 7 Serial.begin(9600); 8 Serial6.begin(9600); 9} 10 11int i; 12void loop() { 13 Serial.print("This is Serial "); 14 Serial.println(i); 15 Serial6.print("This is Serial6 "); 16 Serial6.println(i); 17 delay(500); 18}

あとでF401で試せるかな。

投稿2019/07/30 12:49

編集2019/07/31 04:43
thkana

総合スコア7639

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cucco

2019/07/31 00:24

ありがとうございます! ハードウェアシリアルが使えのであれば一番良いと思いますので非常にありがたいです! しかしながら、とりあえずSerial6.begin(9600);を試してみるとコンパイルエラーで通りませんでした… データシート見ているとPG9,PG14にも同じUSART6_RX,TXが来ているようなので何か前処理をしてあげないといけないのかもしれません。 y_waiwaiさんも仰る通りソフトウエアシリアルを追求するよりはこちらを使えるようにしたほうが良い気がしますので、自分でも調べてみたいと思います。
cucco

2019/07/31 11:58

サンプルプログラムありがとうございます!! 結果からいうと解決いたしました! GroveUART(Serial)とGroveD38コネクタ(Serial6)をケーブルでつなぎ、Serial6で送信したものをSerialで受け取り、USB(SerialUSB)経由で確認しました。 シリアルモニタを見ながら「やたーこれはすぞいぞーthkanaさんのおかげでWioLTEがさらに便利なるぜーWio業界の大発見やー!」とテンションがあがり、ふと『WioLTE D38 USART6』で調べたところ、なんと先月同じことをされている記事を見つけました… https://qiita.com/matsujirushi/items/4c19cd5b73705ebe2b18 実をいうと当初別のWioシリーズのボードを使っていて、そのMCUから他のポートにはUARTが来ていないことを確認していたため、今回のWioLTE JPのボードもそうだと思い込んでいました。 そのため、ソフトウエアシリアルで何とかしようと思い込み、ハードウェアシリアル利用の情報検索が不十分でした。 今回の問題解決に直結したのでベストアンサーにさせていただきます。 ありがとうございました。
thkana

2019/07/31 12:41 編集

> 先月同じことをされている記事を見つけました… まぁ、時々あることです... とにかく解決したのでよし、ということで。
guest

0

他機種のソースを持ってきてもまともに動くもんじゃないので、方針を変え、
シリアルポートの多いCPUをべつに用意し、それを介して通信、処理するようにしたほうがいいです

ソフトウエアシリアルは、送信だけならともかく受信も含めると非常に難しくなります

投稿2019/07/29 15:41

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cucco

2019/07/30 00:53

ご返信ありがとうございます。 たしかにソフトウエアシリアルは扱いが難しいと思いますし、ハードウエアシリアルが利用できるようにできればベストだと思います。 しかし、こちらの都合で申し訳ありませんが今回はWio LTEを使うという縛りがありまして、ソフトウエアシリアルを使いたいというのが今回の質問の趣旨になります。 解決策をご教授いただければ幸いです。
y_waiwai

2019/07/30 01:09

そいつ用で実装されたソースが見つからないと、自分でコードを書いてソフトウエアシリアルを実装することになりますが、大丈夫でしょうか。 送信に関しては、ボーレートと同じ周波数のタイマ割り込みを実装し、順番にシリアル信号を出力するだけで済みますが、受信に関しては、まず、受信側ポートのスタートビットのエッジによる割り込みでタイマ割り込みを開始させ、割り込みによりサンプリングしていくってことになります。 まず、シリアル信号というのはどういうものであるかを理解するところから始めましょう
cucco

2019/07/31 00:33

y_waiwaiさんには以前にもソフトウェアシリアルについてコメントしていただいてました。 いつもありがとうございます。 ライブラリを使わずにSerial、SPI、I2Cなどやってみたいなーとは思いつつも、趣味に費やせる時間があまりなくどうしても優先順位が下がってしまいまして…^^; 仰る通り、ライブラリを理解するためにも基本は大事ですよね。 今回、thkanaさんがD38 Groveコネクタがハードウエアシリアルとして使える可能性を指摘してくださり、そちらを追求していってみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問