PythonよりカッコいいElixirでラズパイ

本記事は「[Raspberry Pi Advent Calendar 2020](https://qiita.com/advent-calendar/2020/raspberry-pi)」の22日目です。

昨日は@shion21さんの[iPhoneからラズパイにミラーリング！RPiPlayの使い方](https://qiita.com/shion21/items/8019c3fbd7ac80974977)でした。

![nerves_hello_lcd_20201213_185620](https://qiita-user-contents.imgix.net/https%3A%2F%2Fuser-images.githubusercontent.com%2F7563926%2F102699565-b5646700-4213-11eb-9ca1-a11bd10c619d.gif?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&w=1400&fit=max&s=3b1df9544696c3a6b5018eddf4894c7f)

## はじめに

２ヶ月前にラズパイを始めたとき、僕はプログラミング言語としては、[Elixir](https://ja.wikipedia.org/wiki/Elixir_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))を選びました。単にElixirの機能と文法が好きで、それをIoTにも使用したかったからです。一般的にはCやPythonが使用されることが多いようです。その点でElixirでラズパイをするのには不安な要素がありましたが、それが取り越し苦労だったという話です。

## Elixir（えりくさ）言語とNerves（なあぶす）フレームワーク

[Elixir](https://ja.wikipedia.org/wiki/Elixir_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))は耐障害性、高い並列性能で長年実績のある[Erlang](https://ja.wikipedia.org/wiki/Erlang)の上に実装されたプログラミング言語で、最近では[WhatsApp](https://ja.wikipedia.org/wiki/WhatsApp)などの世界中のメッセージアプリ、チャットアプリ等でも使用されており、その性能に改めて注目が集まっていると聞きます。そのElixirをラズパイで使えるようにしてくれる[Nerves（なあぶす）](https://www.nerves-project.org/)というIoTフレームワークがあると聞き、勉強を始めたわけです。僕にとってPythonよりElixirのほうがモダンでカッコよく、Elixirを使わない理由はありません。

Nervesについて詳しくは@takasehidekiさんの[「Slideshare：ElixirでIoT！？ナウでヤングでcoolなNervesフレームワーク」](https://www2.slideshare.net/takasehideki/elixiriotcoolnerves-236780506)がわかりやすいです。また、「[NervesJP](https://nerves-jp.connpass.com/)」というコミュニティがあり勉強会等が実施されています。僕はNerves JPでNervesについて学んでます。

## 一瞬不安になったこと

世の中にあるほとんどのラズパイ情報がCかPythonを使用する前提で書かれているため、新しいことを学ぶ際には戸惑いました。例えば、先日LCDディスプレイに「Hello」と表示される練習をしようとしましたが、Elixirの資料がなかなか見つかりませんでした。ほとんどがCかPythonの既存ライブラリを使用してLCDを操作するというものでした。

## 大事なことは通信プロトコルと製品のデータシート

しばらく辛抱強く調査と勉強をしていると、あることに気づきました。上述のCかPythonライブラリの中身は[LCDのデータシート](https://cdn-shop.adafruit.com/datasheets/HD44780.pdf)に書かれたとおりの手順をコードにしただけで大した内容ではないと。言語がなにであろうと関係ないのですね。本当に重要なのは、パラレル通信ｖｓシリアル通信、[I2C](https://ja.wikipedia.org/wiki/I2C)、[SPI](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%83%BB%E3%83%9A%E3%83%AA%E3%83%95%E3%82%A7%E3%83%A9%E3%83%AB%E3%83%BB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9)等の通信プロトコルの基礎を学ぶことと製品のデータシートを自分の目でよく読み、分かる範囲で理解する努力をすることという結論になりました。

IoTでは最終的にハードウェアとやり取りをすることが多いと思います。その部分に関してはI2C、SPI等のシリアル通信さえできればプログラミング言語は関係がないのですね。素人の僕でも概要は理解できたので、しっかり読めば誰でもある程度の操作は（ライブラリに頼らなくても）自分でできると思います。

データシートを読まずに誰かの作ったライブラリをさがすことしか考えていなかったのが間違いでした。使える既存のライブラリがあるに越したことはないですが、いずれにしても通信プロトコルとデータシートについては理解が必要だと思います。

## さいごに

いい経験になりました。別にPythonでなくても、もっとカッコいい言語で自由にラズパイを楽しめるのですね。データシートさえ読めば、特にライブラリがなくてもできる場合があることがわかり、スッキリしました。結果として[自作のライブラリ](https://github.com/mnishiguchi/lcd_display)もできました。

[僕がElixirでLCDを操作した成果](https://qiita.com/mnishiguchi/items/f93aafcdcf284db28475)は一般公開しているので、みなさんにもどんどんElixirとNervesを楽しんでもらえればと思います。

明日は@sho7650さんです。

- [#NervesJP Advent Calendar 2020](https://qiita.com/advent-calendar/2020/nervesjp)
- [Elixir その1 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir)
- [Elixir その2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir2)
- [【毎日自動更新】QiitaのElixir LGTMランキング！](https://qiita.com/torifukukaiou/items/1edb3e961acf002478fd) by @torifukukaiou

[![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F240349%2F5ef22bb9-f357-778c-1bff-b018cce54948.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&w=1400&fit=max&s=c746dae99633be5b9eadf524d7a7b191)](https://nerves-jp.connpass.com/)