5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【M5Stack MP135】LivebookでLチカ(LED点滅)してみた

Last updated at Posted at 2024-09-10

はじめに

SWEST26に参加して、いろいろ収穫があったのですが、M5Stack MP135でLinuxが動作することを知りました。
今回は手始めに、Livebookを導入し、Lチカ(LED点滅)を行ってみました。

この検証に使用したM5Stack MP135は、コアジェニックさんに御提供いただきました。ありがとうございました。

OSのインストール

私が入手したものには、付属のSDカードにbuildroot版のOSがインストールされていて、電源を入れるとOSが起動しました。タッチスクリーンに画像が表示され、タッチパネルでメニュー操作が可能でした。
しかし、aptコマンド等は利用できずアプリケーションを追加でインストールする事はできませんでした。
当然、Elixirも使えません。

ベンダーから、Debian版とbuildroot版のOSイメージが提供されています。Debian版に入れ替え、Elixirを導入することにしました。

  • m5stackのサイトのDownload imageから、M5_CoreMP135_debian12_20240628をダウンロード
  • .7zを解凍して.imgファイルにする
  • balenaEtcher image burning toolでSDカードに書き込む

操作手順は本家サイトに図入りで詳しく説明されており、非常に分かりやすいです。

GPIOについての注意

GPIOが簡単に使えるだろうと思って取り掛かったのですが、簡単にはできませんでした。
というのは、ケースの外のコネクターに割り当てられているGPIOは、シリアルポートやi2cのポートとして割りあげられていて、GPIOとしては使えなない状態になっていたからです。

無理してつかわなくてもよいかと思いますが、簡単なON/OFF制御の場合はGPIOとして使いたい。ということもあると思います。
私の試した方法を紹介します。デバイスツリーと呼ばれるカーネルの設定を変更する必要があるので、詳しい事は、デバイスツリーに関する資料を参考にしてください。
操作手順のみ紹介します。詳細は、別の記事を参照してください。

GPIOを使えるようにする

Port C/Port Aが直接CPUのGPIOピンに接続されており、GPIOとして使えます。
Port Cはシリアル通信、Port AはI2C通信の信号も兼ねており、これらの機能が有効な間はGPIOとして使用できません。
GPIOとして使用するには、これらの機能を無効にする設定が必要です。

以下の手順で、/bootパーティションにあるファイルを変更してPort CをGPIOとして使えるようにします。

custom.dtsファイルを作成する

dtc -I dtb -O dts -o stm32mp135f-coremp135.dts /boot/stm32mp135f-coremp135.dtb
cp stm32mp135f-coremp135.dts custom.dts

custom.dtsの修正

custom.dts

status =

status = "disabled";
に変更する

                serial@44003000 {
                        compatible = "st,stm32h7-uart";
                        reg = <0x44003000 0x400>;
                        interrupts-extended = <0x0c 0x1d 0x04>;
                        clocks = <0x08 0x81>;
                        resets = <0x08 0x354d>;
                        wakeup-source;
                        power-domains = <0x0d>;
                        status = "okay";<----この行を修正
                        pinctrl-names = "default\0sleep";
                        pinctrl-0 = <0x1d>;
                        pinctrl-1 = <0x1e>;
                        rx-tx-swap;
                        phandle = <0x85>;
                };

custom.dtsの適用

編集したdtsファイルから、dtbファイルを作成し、/bootにコピーする

dtc -I dts -O dtb -o custom.dtb custom.dts
cp custom.dtb /boot

/boot/extlinux/extlinux.conf

devicetree /boot/stm32mp135f-coremp135.dtb
この行を
devicetree /boot/custom.dtb
に変更する

label stm32mp135f-coremp135-buildroot
  kernel /boot/zImage
  devicetree /boot/custom.dtb <----この行を修正
  append root=/dev/mmcblk0p5 rw panic=5 quiet rootwait

M5Stackを再起動する

再起動すると、GPIOが使える状態となります。

Elixirのインストール

aptでのインストールすると、1.14.0 がインストールされました。このバージョンだとLivebookが動作しないという問題が起きました。
asdfを使ってインストールします。

erlangのインストール時に必要となる、パッケージのインストール

apt-get update
apt-get -y install build-essential autoconf m4 libncurses-dev libwxgtk3.2-dev libwxgtk-webview3.2-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils openjdk-17-jdk

asdfを使って、elixirをインストール

git clone https://github.com/asdf-vm/asdf.git ~/.asdf
echo . $HOME/.asdf/asdf.sh >> ~/.bashrc
# ログインし直す
asdf plugin add erlang https://github.com/asdf-vm/asdf-erlang.git
asdf plugin add elixir
asdf list-all erlang
asdf install erlang 27.0.1
asdf list-all elixir
asdf install elixir 1.17.2-otp-27
asdf global erlang 27.0.1
asdf global elixir 1.17.2-otp-27
echo export LANG=en_US.UTF-8 >> ~/.bashrc
echo export LC_ALL=en_US.UTF-8 >> ~/.bashrc
# ログインし直す

livebookをインストール

次のコマンドでlivebookをインストールします。
compileにかなりの時間がかかりますが待ちます。

mix do local.rebar --force, local.hex --force
mix escript.install hex livebook

.asdfのディレクトリ内にあるlivebook serverを起動する。

root@CoreMP135:~# /root/.asdf/installs/elixir/1.17.2-otp-27/.mix/escripts/livebook server --ip 0.0.0.0
[Livebook] Application running at http://localhost:8080/?token=eoinmphcfotxz3acetthy4bpcr4sfp3g

表示されたURLのlocalhostの部分を、M5StackのIPアドレスに書き換えたURLをブラウザで開くとlivebookが利用でます。

image.png

Lチカ(LED点滅)をやってみる

配線

Port CのTXのポート(黄色のケーブル)はGPIOのPC7が割り当てられています(PinMap参照)。
黄色と赤の間にLEDと抵抗を接続します。

image.png

プログラム

PC7のピンの値を、1,0と100m秒毎に100回切り替えてみます。

Reconnect and setup
Mix.install([
  {:circuits_gpio, "~> 2.0.1"},
  {:kino, "~> 0.12.2"}
])
for _ <- 1..100 do
  Circuits.GPIO.write_one("PC7", 1)
  Process.sleep(100)
  Circuits.GPIO.write_one("PC7", 0)
  Process.sleep(100)
end  

実行結果

無題の動画 ‐ Clipchampで作成.gif

LEDの点灯を制御する事ができました。

ボタン入力も使ってみる

配線

Port CのRXのポート(白色のケーブル)はGPIOのPC6が割り当てられています。
白色と黒色にボタンの白色と黒色を接続します。
白色と赤色の間に抵抗を接続します。この抵抗をつけることで
ボタンが押されていない時は1
ボタンが押されている時は0
の値が取得できるようになります。

set_pull_mode(gpio_in,:pullup)でプルアップに指定したのですが、プルアップになりませんでした。
プルアップが有効になればこの抵抗は不要なのですが、指定してもならかなたので抵抗をつけています。

DSC_0696.JPG

プログラム

defmodule LEDbrink do
  def init_gpio() do
    {:ok, gpio_in} = Circuits.GPIO.open("PC6", :input)
    {:ok, gpio_out} = Circuits.GPIO.open("PC7", :output)
    Circuits.GPIO.set_pull_mode(gpio_in,:pullup)
    {gpio_in, gpio_out}
  end

  def loop({gpio_in, gpio_out}) do
    button = Circuits.GPIO.read(gpio_in)
    Circuits.GPIO.write(gpio_out, button)
    Process.sleep(50)
    Circuits.GPIO.write(gpio_out, 1)
    Process.sleep(50)
    loop({gpio_in, gpio_out})
  end
  def start() do
    gpio = LEDbrink.init_gpio()
    LEDbrink.loop(gpio)
  end
end

実行結果

無題の動画 ‐ Clipchampで作成 (1).gif

使用したパーツ

部品 参考価格
ブレッドボード ¥370
LED黄緑 ¥10
LED黄色 ¥20
LED赤色 ¥10
LED青色 ¥20
ケーブル M5STACK-A096 ¥759
抵抗1KΩ 100個パック ¥100
ボタン M5STACK-DUALBUTTON-UNIT ¥528

LEDは、いろいろな色があるので例として挙げてみました。一つあればよいです。
ケーブルは、M5StackのPortA/Bのコネクタとブレッドボードを接続できるケーブルを使ってみたら、配線がやりやすかったです。
image.png

使用した抵抗は2つですが、ばら売りのURLが見つからず、100個パックのURLとなっています。店舗ではばら売りしていると思います。

まとめ

  • M5Stack MP135のDebian OSでElixirを導入できた
  • GPIOを利用できることを確認した
  • デバイスツリーを変えないとGPIOが使えず、GPIO使うのは、ちょっとOSの準備敷居が高いかも
  • ラズパイと違ってケースに入っている事や、PORTの接続がコネクタなのは扱いやすい
  • Livebookのインストールと、LivebookからのGPIO制御ができた

今後、I2Cセンサーも接続して試してみたいと考えています。また、buildrootイメージが公開されているので、Nervesを動かすことができるのかも試してみたいと思います。

参考
https://qiita.com/GeekMasahiro/items/3ff5276a552c4430439c
https://qiita.com/GeekMasahiro/items/ade32cb435608218ba0b

5
3
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?