Raspberry PIのGPIO上シリアルとArduinoの通信

Raspberry PI B Rev1 からUSBシリアル変換アタプタを**使わずに**Adruinoと通信したい。

```
$ uname -a
Linux raspberrypi 4.1.16+ #832 Sun Jan 24 12:54:04 GMT 2016 armv6l GNU/Linux
```

#配線

Raspberry PIのGPIO 8がTXD, GPIO10がRXDなので、arduinoの０（RX),1(TX)と結線する。信号レベルがRaspberry PIは3.3V、Arduinoは種類により5V/3.3Vなので注意（写真では[Sparkfunのレベル変換モジュール](https://learn.sparkfun.com/tutorials/using-the-logic-level-converter)を使用しました）。

![IMG_9725.JPG](https://qiita-image-store.s3.amazonaws.com/0/56044/fcf367ef-1be3-acf9-2f72-99853aab2a68.jpeg)


#シリアル通信

**cu**という[コマンド](http://frym.jp/?p=245)を使用します。歴史があるコマンドのようです。

```
sudo cu -s 9600 -l /dev/ttyAMA0
cu: open (/dev/ttyAMA0): Permission denied
cu: /dev/ttyAMA0: Line in use
```

さて困った。何かに使用されているらしい。

##シリアルポートを使うための設定変更
ふと思い出したのは、Raspberry PIはモニターを接続しなくてもシリアル接続で操作ができるということ（一昔前のルータのような感じです）。幸い[adafruitの記事](https://learn.adafruit.com/adafruit-ultimate-gps-on-the-raspberry-pi/using-uart-instead-of-usb)で、GPIOのシリアル経由でGPSモジュールに接続する、という記事があったので参考にして設定を変更します。

一見すると何をしているのかよくわからないのですが、要はコンソールとしてシリアルポートを使うことをやめるよ、という設定変更です。

###STEP1

```/boot/cmdline.txt
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
```
この中の console=ttyAMA0,115200 という部分を外します（そうするとコンソールとして使用するのはtty1＝モニタ出力だけになるはず）。

```/boot/cmdline.txt
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
```

###STEP2(Raspbian Jessie)

serial-getty@ttyAMA0.serviceというサービスをdisableにします。

```
$ sudo systemctl stop serial-getty@ttyAMA0.service
$ sudo systemctl disable serial-getty@ttyAMA0.service
```

ここまで準備したらリブートします。

#動作確認

arduino上にはサンプルのASCIITABLEを書き込んであります。

```
$ cu -s 9600 -l /dev/ttyAMA0
Connected.
", dec: 34, hex: 22, oct: 42, bin: 100010
#, dec: 35, hex: 23, oct: 43, bin: 100011
$, dec: 36, hex: 24, oct: 44, bin: 100100
%, dec: 37, hex: 25, oct: 45, bin: 100101
&, dec: 38, hex: 26, oct: 46, bin: 100110
', dec: 39, hex: 27, oct: 47, bin: 100111
(, dec: 40, hex: 28, oct: 50, bin: 101000


```

できた！

ちなみにcuを終わらせるときは「  **~.**  」を入力すること。
動画だとこんな感じです（[https://youtu.be/WyTzsJLRCdI](https://youtu.be/WyTzsJLRCdI)）。

#node.js + serialport

node.jsのライブラリ「[serialport](https://github.com/voodootikigod/node-serialport)」を使用して先ほどのarduinoからのシリアル通信を受けてみました。


```SerialPrint.js
// seriapportに関しては以下URL参照
//     https://github.com/voodootikigod/node-serialport
//


var PortName = '/dev/ttyAMA0';

var SerialPort = require("serialport");
var serialPort = new SerialPort.SerialPort(
    PortName, 
    {
	baudrate: 9600,
	dataBits: 8,
	parity: 'none',
	stopBits: 1,
	flowControl: false,
	parser: SerialPort.parsers.readline("\r\n")
    },
    false); // this is the openImmediately flag [default is true]


serialPort.open(function (error) {
    if ( error ) {
	console.log('failed to open: '+error);
    } else {
	console.log('open ' + PortName);
	serialPort.on('data', function(data) {
	    console.log(data);
	});
    }
});

```

![Screenshot from 2016-01-28 08:59:33.png](https://qiita-image-store.s3.amazonaws.com/0/56044/b14e17fc-a03c-5bb6-a6c2-cf06946e29b9.png)

動画だと[こんな感じです（https://youtu.be/k_ewB5XqGF4）](https://youtu.be/k_ewB5XqGF4)。



johnny-fiveで受けようとするといろいろとエラーが出るのでまだ取り組んでいません。