niszetの日記

10年目エンジニアが最近勉強したことを忘れないようにメモをする

(R/Py3/RP3) Rからpythonを呼び出してラズベリーパイ3とRainbowHATでLチカする

できた。

超遠回りですが、一応「RでLチカ」、略して「Rチカ」が出来ましたので、ご連絡。

一応ご注意を。

今回のコードを実行しても特に危険はないと思いますが、ハードウェアを操作する場合は色々と気を付ける必要があります(電圧レベルとか電流値とか、いろいろ)
なので、色々調べて理解してトライしてください。
調べたことはほぼ書いたりリンク貼ったりしているので、大体解決できるはず…(抜けているものもあると思いますが…)
まぁ、ネットにある情報を使って何かするのは基本的に自己責任なんだけど。

構成など

環境:

Raspberry Pi 3 Model B
OS : 2017-07-05-raspbian-jessie

R : sessioninfo

> sessionInfo()
R version 3.4.1 (2017-06-30)
Platform: armv7l-unknown-linux-gnueabihf (32-bit)
Running under: Raspbian GNU/Linux 8 (jessie)

Matrix products: default
BLAS: /usr/local/lib/R/lib/libRblas.so
LAPACK: /usr/local/lib/R/lib/libRlapack.so

locale:
 [1] LC_CTYPE=en_GB.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_GB.UTF-8        LC_COLLATE=en_GB.UTF-8    
 [5] LC_MONETARY=en_GB.UTF-8    LC_MESSAGES=en_GB.UTF-8   
 [7] LC_PAPER=en_GB.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] PythonInR_0.1-3

loaded via a namespace (and not attached):
[1] compiler_3.4.1 R6_2.2.2       tools_3.4.1    pack_0.1-1   

Python : Python 2.7.9

RainbowHAT

実行

先にpython側でLチカを確認します。Rが悪いのかpyが悪いのかわからなくなるので。
今回は手元にRainbowHATがあって、ラズパイに刺さったままだったのでそれを使っていますが、ブレッドボードにLEDをつなげて~でももちろん出来ると思います(いずれやりますか…)

コードはこんな感じ。7つのLEDが0.1秒ごとに赤く光ります。結構綺麗。

import rainbowhat as rh
import time

ct = 0
while ct < 100:
    for pixel in range(7):
        rh.rainbow.clear()
        rh.rainbow.set_pixel(pixel, 255, 0, 0)
        rh.rainbow.show()
        time.sleep(0.1)
        ct = ct + 1

rh.rainbow.clear()
rh.rainbow.show()

最後にclearしないとLEDが消えないのでループ後に入れています。
Python単体だと、while True: でループしてEscで抜けても良いのですが(そのときLEDは消えた)、Rだとどうなるかわからないので適当な時間ループさせて抜けさせています。(whileじゃなくてfor使えよ)

RainbowHATについては以前の記事を参照してください。これを試すためにわざわざ買う必要はないですが、色々試すには便利といえば便利で面白い

さて、R側ですがpythonを呼ぶだけです。下記の通り。

# install.packages("PythonInR") # 入っていなければ
library(PythonInR)
PythonInR::pyExecfile("r_py_rainbow.py")

これだけ。pythonの方で完結しているので、Rからは呼び出すだけです。
結果はpythonと同じくLEDが綺麗に光るのでした。やったぜ

pyExecfileは指定したpythonスクリプトを実行するので、ファイル名やパスは適当に設定してください。
ラズパイ上でライブラリをインストールする(w/o RStudio)がちょっとなれなかったけどとくに難しさはなかったです。

参考リンク集

RからPythonを呼ぶ

探していて一番最初に見つけました。 RからPythonを使う諸々(のリンク集)kitayamalab.wordpress.com

PythonInRの実際のつかいかたはこちらを参考にしました。

qiita.com

ただ、上にあるようにpythonスクリプト自体を呼べるし、内部でimportしていればそれらの設定も不要、pythonで実行を確認してからRで動かすと思うので、実際に使うときはファイルをそのまま読む方法になるのかな、と。
こちらはR内で完結させている紹介記事だからですね。

このライブラリ、関数が結構多いので使いこなすには時間がかかるかも

RainbowHATの紹介

learn.pimoroni.com

雑多なこと

これと関係なく、SSHで接続できないことに気づいたのですが、デフォルトでSSHはinactiveになっているようです。

qiita.com

確かに、リンク先のこちらにも書かれていてその後特に変更なさそうです。というか、時期によって結構色々違うかも?ネットで情報探す場合はご注意。結局オリジナルを見る以外にないという話か。

http://downloads.raspberrypi.org/raspbian/release_notes.txt

今回、この記事の対応方法ではなく、単純にsshdを起動させました。

www.obenri.com

のとおり、

/etc/init.d/sshd status

で寝てることを確認したのち、

/etc/init.d/sshd start 

したらSSH接続できました。

課題

RainbowHATのライブラリを入れるときにミスったようでpython2系でしか動いていない(本当は3でも動くはず)ので、それは改善したい。 RのビルドはPC側でやってから転送したい、などなど。もうちょっと賢い方法が全体的にあるはずです。マサカリ待ってます。

結論

Rでもラズパイを使ってLチカできる!(実質python頼み)

でした。

次は

このあたりですね。

一方で、からあげさんの

karaage.hatenadiary.jp

の記事のとおり、GPIOライブラリではなくWiringPiライブラリを使っていく必要があるのかも。

まぁ、それも追々です。

というわけで、RからPythonで書かれたLチカコードを呼び出してラズパイ上でRainbow HATのLEDをチカチカさせる試み、一応の成功です。

Enjoy!!