えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

LEDをRESTfull APIでチカチカさせる「RESTuino」をラズピコに移植

昨年の「技育展」で発表があったその作品は、使い込んでいる人ほど有用性を疑ってしまうものであった。

しかし、私は(なぜか)このシステムに対して有用性を確信し、9月ごろから密かに開発協力をしていた。

それは、マイコンをRESTfull API化してスマホから操作するプロジェクト「RESTuino」である。


それから、半年。

ChatGPTというこれまでのGPTを突き放す性能と話題を呼んだLLMが世界を変えた時、再びこのシステムがもう一段化けるのではないかと期待している。


前置き(?)はさておき、今回はこれをラズピコに移植して使ってみました。

RESTuinoとは?

ここからの説明は、以下の記事を「超」軽く触れるだけなので、詳しく知りたい方は以下のURLから見てください。

zenn.dev

RESTuinoとは、端的に言えば「ESP32をRESTfull API化させる」ファームウェアです。


RESTuinoのメリットは以下の通りです。

  • http通信なので、ソフトウェア触ったことがあれば大体触れる
  • 思想的にGPIOの再配置が可能
  • 開発用コンピュータがいらない


RESTuinoは、下のgifの通り、CURLさえあれば何でもできちゃうので本当に簡単です。

(takeyamayuki/RESTuino より)


まさに、電子工作は「くっつけて遊ぶ」レベルに落とすことができるようになったわけです。


発表では、以下のような電気をon/offするサンプルを紹介して優秀賞を受賞していました。

homebridgeで電気をon/off


RESTuinoの思想

RESTuinoは、Arduinoやmbed・MicroPythonなどのハードウェア抽象化レイヤのさらに上のレイヤとして統一されたAPIを提供することを目標としています。

当然ながら、リアルタイム性は最悪ですし、ifすら遂行できないので、そのほかのコンピュータを挟む必要があります。

ただ、ご家庭用AIoTに必要な機能はその程度でいいでしょう。このAPIは何より「簡単」目標にしているので。


コンピュータとマイコンを電気的に切れるのもいいですね。

たとえ、末端の部品と一緒にマイコンが逝ってしまってもコンピュータには何の被害もありません。


有用な場面?

このシステムが最も有用になる場面があるとするなら、M5StackやToioなどのもともとハードウェアが固まっている開発機でしょう。

画面や車輪がRESTfull-APIで操作できるようになれば、ゼロ知識で即日開発可能です。

素晴らしいですね!


素晴らしいのでラズピコに移植しておきました🍓

マイコンのご家庭化」を実現できるこんな素晴らしいプロジェクトを私がほっとくわけにいかないので、私もいつの間にか参加していました。

しかし、もともとESP32向けだったこともあり、プログラムは少しかなり改造することに…


とてもマージできる状況にはなりそうにないので私のフォークを置いておきます🍴

github.com


欠点に対する解決策など

RESTuinoの欠点

先述に示しませんでしたが、私が見る限りでもRESTuinoはかなりの欠点を持っており、商用にはかなりのハードルがあります。

そこで、ラズピコ移植を通してより使いやすさに磨きをかけようとしています。

  • セキュリティ(記事でも言及あり):平文なのもだいぶやばい
  • 不正な操作を防げない
    • 例: 不可能なポートを確保する可能性(ADCが不可能なポートにAnalogReadをセットするなど)
  • 回線状況によっては遅い

セキュリティは、第三者コンピュータかWi-Fiルータの裏側のパスワードみたいな感じで管理するくらいしか方法が思いつかずなかなか案がないので、その下の解決を試みました。


実装

移植が行いやすいライブラリを作成したいと考え、サーバ部とGPIO部を分けてライブラリの流用を効かせやすくしようとしています。

正直なところ、綺麗に書けていないので今になってよく分からない実装が出てきています…😭


不可能な操作を防ぐ

ADCがないのにAnalogReadをさせることを防ぐために、GpioDefaultListというGPIOのテーブルを作成しました。

RESTuino/gpiotype.hpp at features/eth_pico_tmp · Ar-Ray-code/RESTuino · GitHub

図で表すと分かり易いと思います。

ピン番号、ピンの性質、ピンの状況をtupleにしてGPIOの数だけvectorにするというかなりメモリを食いそうなコーディングを行っています。(実際結構食ってそう)

これを行うことで、ピンの性質的に無理な操作を防ぐことができ、「操作していたらいきなり動かなくなってしまった」ということは防げます。

ちなみに、これの副産物で、lsコマンドを実装することができました。

文字列以外に動的なものがない気もするので、開発が落ち着いたらよりスマートな実装をしたいですね。


Ethernet&ラズピコ

WI-Fiだと私の環境ではなぜか遅くなってしまい、十分な性能を発揮することができなかったので、購入していたEthernet付きラズピコでWi-Fi以外のアプローチも考えることにしました。


ここでは、W5100Sが搭載されたラズピコを使うことにしました。

W5100S-EVB-Picowww.switch-science.com

チップがArduino Ethernetシールドに載っているものと互換性があったので使いやすかったです。


通信に使うハードが違うので、Server-utilsではハードウェアが関係しないRESTfull-APIの操作を実装し、ボードごとの実装で送受信を行う感じにしています。

また、サンプルではrestuino.localで通るようになっていますが、HostnameをWS5100側のライブラリで解決できなさそうだったので、今回は諦めました…


ちゃんと動いてくれました!感激!!


🧠🧠 次回予告 🧠🧠

とうとうAIがGPIOをハックします🤖

ワクワクしますね😁