「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 ) ) );
}
とりあえずこれで。ソフトウェアシリアルとセンサーピンの割り込みはコンパイルできて、動作するようです。