ITで遊ぶ

Arduinoに複数のシリアル通信をさせる

「Arduino(アルデュイーノ)とRaspberry PI(ラズベリーパイ)はどちらもシングルボードコンピューターですよね。どこが違うんですか?」という疑問をもつ人が多いようです。

簡単にいえば、ArduinoはOSがありません。Raspberry PIはLinuxというOSが動いています。

でしょうか。

OSを動かせるということは、それなりのCPUパワーとメモリーを搭載しているということです。
OSとはなにか?といえば、それだけで一冊本がありますが、私に言わせれば「ユーザーの思い描く世界を作り出すソフトウェア」です。
たとえば、ファイルとかフォルダーとかGUIとかはCPUとメモリーだけの世界では存在しません。そこにファイルというものやフォルダーというものを作り出しているプログラムがOSです。

したがって、高度な仕事はRaspberry PIにやらせて、ArduinoはIOTデバイスとして動かすことが多いように思います。

今、私はArduinoにセンサーやモータードライバーをシリアルで繋ぎたいと思います。
一方でRaspberry Piからコマンドを出して制御しようとしています。

ふたつのシリアル通信を使う例はあまりありません。
ArduinoにもRaspberry PiにもUSBシリアルのインターフェースがありますから、これはしっかり接続して使いたいと思います。
センサーはArduinoのピンに接続してソフトウェアシリアルとして使います。
ソフトウェアシリアルは

#include <SoftwareSerial.h> 

//androidで使用するピンを指定
SoftwareSerial sensor1(2,3);

void setup(){
  //android用のシリアルのポートを設定
  sensor1.begin(9600);

といった感じです。

しかし、SoftwareSerialは評判の悪いパッケージです。

なによりも問題は、これを使うとGPIOのピン割り込みを使うことができなくなります。
ピングループをSoftwereSerialが独占してしまっています。

具体的にはGPIOに割り込みを割り当てる次のコードです。

 attachPCINT(digitalPinToPCINT(Sense_PIN), BallSense_ISR, FALLING);

ソフトウェアシリアルとGPIOの割り込みは共存できないことは、一部では知られているようです。

これは悩みました。
私なりに最も簡単だと思われる解決策が以下のものです。

ソフトウェアシリアルのライブラリーとしてNeoSWSerialを使います。
AltSoftSerialも有名なのですが、ピン8を固定で使います。CNCボードではピン8はEnableピンとして固定されており、変更はできません。

NeoSWSerialをライブラリーとしてインストールし、この部分のコメントをはずします。

次にsetup()関数にこんな記載をします。

 pinMode(Sense_PIN, INPUT_PULLUP);

  attachPCINT(digitalPinToPCINT( RX_PIN) , myISR, CHANGE); // シリアル用
  attachPCINT(digitalPinToPCINT(Sense_PIN), Sense_ISR, FALLING); // センサー用

NeoSWSerialが使うRX_ピンとGPIOをセンサーとして使うSense_ピンに割り込みルーチンを設定します。
RX_Pin割り込みルーチンのmyISRは次のとおりです。


void myISR()
{
  NeoSWSerial::rxISR( *portInputRegister( digitalPinToPort( RX_PIN ) ) );
}

とりあえずこれで。ソフトウェアシリアルとセンサーピンの割り込みはコンパイルできて、動作するようです。

関連記事

  1. シングルボードコンピュータの存在意義

  2. Web Serial API

  3. :MOVE miniバギーカー

  4. PHP, Python, Ruby, バランス

  5. カラーミーAPIを使う(発送データ作成)

  6. 静的HTMLに他HTMLを読み込む方法

  7. M5StickCを時計に

  8. DockerでLAMP(Laravelが動く)環境を作る

記事をプリント