Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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の0(RX),1(TX)と結線する。信号レベルがRaspberry PIは3.3V、Arduinoは種類により5V/3.3Vなので注意(写真ではSparkfunのレベル変換モジュールを使用しました)。

IMG_9725.JPG

シリアル通信

cuというコマンドを使用します。歴史があるコマンドのようです。

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

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

シリアルポートを使うための設定変更

ふと思い出したのは、Raspberry PIはモニターを接続しなくてもシリアル接続で操作ができるということ(一昔前のルータのような感じです)。幸いadafruitの記事で、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)。

node.js + serialport

node.jsのライブラリ「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://youtu.be/k_ewB5XqGF4)

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした