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

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

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

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

Q&A

解決済

1回答

6844閲覧

arduinoでのSPI通信とソフトウェアシリアル通信の併用について。

cucco

総合スコア15

Arduino

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

0グッド

1クリップ

投稿2018/10/15 20:28

arduino unoを使って、IM315無線モジュール(ソフトウェアシリアル)と電子ボリュームLM1972を接続したワイヤレスでスピーカーボリュームを変えるものを作成しています。

ソフトウェアシリアルとSPIをそれぞれ単独で試してみると問題なく動くのですが、同時に使おうとすると全く反応しなくなります。
どうにか併用したいのですが、SoftwareSerial.begin()やSPI.begin()をコメントアウトすると使えるようになるので競合しているのだと思われます。
情報をあさってみると海外サイトでSoftwareSerialでなくaltSoftSerialを使うと問題ないとの情報見かけたので置き換えてみたのですが、こちらも単独では動作して併用はできませんでした。

SoftwareSerial.endしてSPI.beginといった具合にendとbeginで切り替えていけば利用できるかなと思ったのですがそれでもできませんでした。

解決策はありますでしょうか?
お知恵をお借りできれば幸いです。
よろしくお願い致します。

●スケッチ

void setup() {
/* IM315無線モジュール 設定 */
altSerial.begin(19200);
Serial.println("IM315: OK!");
delay(1000);

/* 電子ボリュームLM1972M 設定 */
digitalWrite(SS_LM1972M, HIGH);
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV16);
SPI.setDataMode(SPI_MODE0);
// SPI.begin();
// Serial.println("LM1972M: OK!");
delay(1000);
}

void Speaker(){
altSerial.end();
Serial.println("IM315: OFF!");

SPI.begin(); Serial.println("LM1972M: OK!"); uint8_t att = volumeToAttenuation(Speaker_Volume); setAttenuation(att); tone(SPEAKER_PIN, NoteOctave, SIGNAL_LENGTH); delay(100); SPI.endTransaction(); SPI.end(); Serial.println("LM1972M: OFF!"); delay(500); altSerial.begin(19200); Serial.println("IM315: OK!");

}

void loop() {
RecvDataCheck();         //無線信号受信でRun_Mode=1;
if(Run_Mode == 1){ Speaker(); }
delay(100);
}

ハードウェアシリアル結果*
IM315: OFF!
LM1972M: OK!
LM1972M: OFF!
IM315: OK!


4行目の「IM315: OK!」以降、無線を受け付けてくれなくなります…

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

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

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

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

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

guest

回答1

0

ベストアンサー

SoftwareSerialはプログラム上のウェイトループでシリアルのタイミングを取っているため、他の処理や割り込みを併用する場合は考慮が必要となります
このコードの場合はボーレートが19200と高いため、余計に影響を受け易いです。

これをどうにかする、のなら、
・HardwearSerialを使う
・シリアルで送受信信する場合はSPI、他の処理を止める、
・シリアルのボーレートを4800ボーぐらいに遅くする
・SPIもソフトウエア上で実装する
などの必要があります

投稿2018/10/15 23:07

y_waiwai

総合スコア87719

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

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

cucco

2018/10/28 17:03

返信遅くなり申し訳ありません。 ご回答ありがとうございます。 やはりSoftwareSerialだと競合するのですね… HardwearSerialを使えればよいのですが複数Serialがあるとarduino unoに一つしかないので使えないです。 >>・SPIもソフトウエア上で実装する この方法をしらなかったので調べてみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問