「Raspberry Pi」カテゴリーアーカイブ

みんなのラズパイコンテスト2021 優秀賞受賞!

HomeMadeGarbage Advent Calendar 2021 |5日目

今年も みんなのラズパイコンテストに応募しましたよ。

今年はラズパイを使った目新しいものは製作しなかったので応募を見送ろうかと思ったのですが、なんと今年ラズパイ財団より発売されたマイコンのRaspberry Pi Picoを使用した作品も対象となるとのことで せっかくなので投稿いたしました。

 

Raspberry Pi Pico バーサライタ

今年はRaspberry Pi Pico によるバーサライタで投稿してみました。

Raspberry Pi Pico バーサライタで PIO を考えるーRaspberry Pi Picoへの道8ー

 

新しいマイコンを入手したらバーサライタを製作するという癖があるのですが
Raspberry Pi Pico の高速処理やPIO機能などのおかげで解像度の高い表示が実現でき大変驚きました。

 

 

 

あまり目新しさもないので応募するか迷ったのですが、過去5回ずっとラズパイコンテストに応募して楽しんできたので
締め切りギリギリに思い切って投稿いたしました。

優秀賞をいただくことができ本当に応募してよかったです。
来年はもっと頑張りたいと思います。

一生ラズパイコンテストに投稿し続けることをここに誓います。

 

 

ラズパイコンテスト過去の実績

 

 

 

 

100均のソーラーパネルで Raspberry Pi Pico を駆動

ネットで面白い記事を見つけました。


センシグナル、SPRESENSE向け小型拡張ボード「TINY EXPANSION BOARD for Spresense」発売|fabcross - fabcross—IoTやロボティクス、電子工作に3Dプリンターまで、新しいものづくりがわかるメディア

Spresense用の拡張ボード発売の記事で

”一旦起動すると2V付近まで電圧が落ちても動作し続けるので、乾電池や太陽電池などのエナジーハーベスト電源でも動作可能だとしている。”

とのこと。
 

「ん? こういったマイコンにソーラー直結って用途ありうるの?」
と思ったのですが

といった返信をいただき、なるほど日中のロガー用途がありうるのかと勉強になった次第です。

 

 

自分でもやってみたくなった

特に応用は考えてないのですが、ソーラーパネルをマイコンに直結して駆動できるのか試してみたくなりました。

ダイソーでソーラーパネル調達

早速私が愛用する電子部品屋さんの100円均一ショップ ダイソーに向かいました。

100円と300円のガーデンライトを購入し分解してソーラーパネルを取り出しました。

100円ガーデンライト

 

300円ガーデンライト

 

無事にソーラーパネルの調達ができました。

今回は分解したので使用しませんが、ライトにはニッケル水素バッテリが使用されていました。
日中は充電して夜間はバッテリで点灯という動作です。

Raspberry Pi Pico 駆動

入手したソーラーパネルでRaspberry Pi Pico を駆動してみます。

Raspberry Pi Pico には昇降圧DCDC (RT6150) が搭載され入力電圧が1.8~5.5 Vと広いので採用しました。

早速、直射日光のもと300円ガーデンライトのソーラーパネルをRaspberry Pi Picoの電源入力端子 VSYSに直結してみました。

動いた!

本当に動きました!!

Raspberry Pi Pico にはLチカのサンプルコードを書き込んでいます。
安定化電源で消費電力を観たところ、1.8Vで60mAほどと約0.1W消費します。

300円ガーデンライトのソーラーパネルは無負荷時で2.5Vまで上昇しました。
これは正確な実力値ではないので、実際に直結する際には過電圧でデバイスが壊れないようにお気を付けください。

 

ちなみに100円ガーデンライトのソーラーパネルでは出力が足りず2個をパラレルにしてもRaspberry Pi Pico は起動しませんでした。

 

TINY EXPANSION BOARD for Spresense

冒頭に紹介したSpresense用拡張ボードに話を戻します。
以下は販売元のページです。

TINY EXPANSION BOARD for Spresense [R2] 技術資料

入力電源範囲が3〜20Vと広いです。
これであれば無負荷で20Vほど出力する10W級のソーラーパネルでも使用できますね。
起動後は2V近辺まで動作できるとのことで、ソーラーパネル直結駆動に最適な仕様といえます。

しかし高い。。。
明確な応用がない趣味の勉強で¥12,800は出せない。。

 

おそらく入力電源範囲の広い昇降圧DCDCがのってるはずだから、電源部だけ欲しいなww 

 

おわりに

100均のソーラパネル直結でRaspberry Pi Pico を駆動できることが分かりました。
しかし日中クリーンエネルギーでラズパイLチカして何になるのだという話です。
分解しないでガーデンライトとして使用したほうが意味があります。

いいえこの経験は今後の私の人生になにかしら良い影響があるはずです。そう思わせておいてください。

TINY EXPANSION BOARD for Spresenseのように広い入力電圧範囲が実現されればソーラパネルの選択肢もひろがり、応用もききそうです。

なんせSpresenseにはGPS搭載されていますのでリアルタイムに時刻がとれ
真のバッテリレスでのロガーが作れる可能性があります。

 

入力電圧範囲の広い良い昇降圧DCDCが入手出来たら、私もSpresenseでバッテリレスロガー作ってみたいです。

 

追記

Spresenseも動かしてみた(21/4/21)

100円ガーデンライトのソーラーを2個シリーズに接続してSpresenseに直結してみました。

なんとこちらも動きましたね!

Spresenseのメインボードの電源入力
 ・動作推奨電圧:3.6V~4.4V
 ・最大絶対定格電圧:7V
とのことです。

100円ガーデンライトのソーラーを2個シリーズに接続して日光に当てると、無負荷で5Vほど出力しました。

Spresenseは4つのLEDを点灯させるサンプルコードを書き込んでおり
3.6V入力で10mAほど 約0.04Wの消費で非常に低消費電力でした。

Spresenseが低消費電力設計がなされているため、100円ガーデンライトのソーラー2個でも駆動できたと考えられます。

これにGPS動作や外部周辺機器をつけてどれほど消費電力が増すのかが興味深い点ですね。

Raspberry Pi Pico バーサライタで PIO を考えるーRaspberry Pi Picoへの道8ー

前回は狭ピッチLEDバーを用いてバーサライタを製作しました。

Raspberry Pi Pico バーサライタ解像度向上 (C/マルチコア) ーRaspberry Pi Picoへの道7ー

 

LEDを2本 Raspberry Pi Pico の2つのSPI出力でそれぞれ制御しました。
その際にシングルコアでの制御とデュアルコア制御で性能が変わらないという不可解な結果を得ました。

ここではこの件について深堀りします。

 

 

仮説

前回は2本のSPI入力LEDバーをPIOを用いて制御しました。
その際にPIOブロックの2つのステートマシン(sm)を用いました。
具体的にはpio0のsm0で64セル、sm1で63セルのLEDを制御しました。

この時シングルコアでLEDを制御した場合とデュアルコアにしてcore0で64セル、core1で63セル駆動した場合で バーサライタの表示分解能に差は生じませんでした。
デュアルコアによる並列処理で分解能が2倍近く向上すると予想していたのですが、全く改善はなかったのです。

そこでステートマシンを分けた時点で並列処理がなされているのではないかという仮説を思い立ちました。
シングルコアでも2本のLEDをPIOで異なるステートマシンで制御していたので既に並列処理されているためデュアルコアにしても性能向上がなかったのではないかと考えたのです。

 

仮説の確認

ステートマシンが並列処理されていることを立証するため、以前製作したバーサライタで動作確認します。

このバーサライタは5mm角LEDテープ24セルを1本用いております。
この時 1周 1000分割を達成し非常に驚きました。

このバーサライタに更にLED 24セルを追加しても別のステートマシンで制御すれば分解能は変わらないはずです。

バーサライタ製作

LEDテープを追加します。
 

 

LEDの台の両サイドに割りばしを接着して幅を拡張します。

 

 

完成!
2本のLEDはそれぞれ異なるSPI端子(SPI0, SPI1)で制御します。

動作

仮説通りLED追加しても1000分割達成できました。

追加したLEDはPIOの別ステートマシンで並列処理されていると言えます。

 

おわりに

前回と今回の実験でPIOのステートマシンによる処理が並列に実行されていることがわかりました。

Raspberry Pi Pico にステートマシンは8個搭載されているのでPIO機能によってGPIOを8並列処理できることになります。

これは凄いですね。
PIOの応用によってさまざまな高速処理が実行できそうです。
夢が広がります!

それでは次の道でお会いしましょう!

 

追記

Adafruit 公式ブログ (2021/2/26)

Adafruit公式ブログにて紹介していただきました!

 


POV Display Using Raspberry Pi Pico #piday #raspberrypi @Raspberry_Pi - Adafruit Industries - Makers, hackers, artists, designers and engineers!

ラズパイ 公式マガジン (2021/3/25)

Raspberry Pi 公式マガジン The MagPi に掲載していただきました!

以下で無料でダウンロードできます。

Raspberry Pi Pico バーサライタ解像度向上 (C/マルチコア) ーRaspberry Pi Picoへの道7ー

前回はRaspberry Pi Pico を用いてバーサライタを製作しました。

Raspberry Pi Pico でバーサライタ製作 (C/C++) ーRaspberry Pi Picoへの道6ー

ここでは、表示映像の解像度向上のためにSPI複数出力とデュアルコア動作を検証しましたので報告します。

 

 

SPI複数出力

Raspberry Pi Pico にはハードウェアSPI端子が2個あります (SPI0, SPI1)。

 

この2つのSPI端子でそれぞれLEDテープを制御してみました。

 

Cコード

PIO

SPI入力LEDをPIOなる機能で点灯制御しているのですが、2本制御の際はステートマシンなるモノを分けて使用するとよいようです。

PIOブロックは2個内蔵 (pio0, pio1)され、それぞれにステートマシン4個搭載されています (sm0~3)。

 
ここではpio0のsm0でSPI0を、sm1でSPI1を制御して2本のLEDを点灯しました。
 

狭ピッチバーサライタ

以前製作した狭ピッチのLEDバーサライタをRaspberry Pi Picoで制御してみます。

APA102-2020の再考 - バーサライタへの応用 –

このLEDはリフレッシュレートが低いためRGBそれぞれをフル輝度で使用しなくてはならず8色しか出力できませんが
2mm角のLEDが狭ピッチで配置されていますので解像度向上実験にはもってこいです。

構成

2つのSPI出力でLEDを64セル, 63セルずつ制御します。

 

 

動作

先ほどと同様に2個のSPI出力で制御し、回転速度470rpmで回してみたところ、計127個のLEDを1周 240分割で表示できました。

 

ESP32のデュアルコア制御でも200分割が限界でしたので、やはりRaspberry Pi Pico の高速IOは素晴らしいです。

 

デュアルコア制御

Raspberry Pi PicoはCortex-M0+を2個搭載しています。
更なる高解像表示を目指してデュアルコア制御を試します。

Cコード

core0で回転速度計測とSPI0のLED制御し、
core1でSPI1のLED制御しています。

 

しかし、

デュアルコアでの1周の分割数の向上は確認できませんでした。。。
core1でのLED点灯制御は確実にできていると思うのですが。

core1の動かし方に何か問題があるのでしょうか?

参考

 

画像表示

浮世絵を表示してみました。
シングルでもデュアルでも1周240分割以上にすると表示がおかしくなります。

シングルコア

 

デュアルコア

 

 

おわりに

ここではRaspberry Pi Picoを用いて狭ピッチLEDバーサライタを製作しました。
高解像表示を目指しましたがデュアルコアによる向上は達成されませんでした。

しかしLED 127個で1周 240分割は過去最大の分解能ですので、ひとまず嬉しいです。

 

デュアルコアはについては引き続き勉強します。なにか間違ってるかもしれません。

それでは次の道でお会いしましょう!

 

追記

回転検出部を別コア化(2021/2/17)

以下のブログでPIOで別ステートマシンでのLED制御がすでに並列処理されているために、
デュアルコアによる表示解像度の向上がなかったことがわかりました。

Raspberry Pi Pico バーサライタで PIO を考えるーRaspberry Pi Picoへの道8ー

そこでステートマシンでの並列処理については理解できたので、LED制御と回転計測をデュアルコアで試してみました。

以下のようにcore0で回転計測、core1でPIOのステートマシン2個でLED(64セル、63セル)を制御してみます。

 

結果としましては大きな分解能向上はありませんでした。
1周 240分解能がギリギリ260分割できそうになるくらいの変化でした。

 

ステートマシンが完全に並列処理できていて、回転が470rpm、SPI信号が30MHzの場合、理論分解能値はだいたい
 30MHz ÷ (32bit × 64セル + 64bit) × 60sec ÷ 470rpm = 1813分割
ですので、SPIクロックが遅すぎることはないようです。

まだまだデータ転送方法など工夫次第で高解像度化できそうですが、とにかくPIOは素晴らしいということがわかりました。

Raspberry Pi Pico でバーサライタ製作 (C/C++) ーRaspberry Pi Picoへの道6ー

前回はフォトリフレクタによる割り込みでLED制御を試しました。

SPI入力LEDを堪能 (C/C++) ーRaspberry Pi Picoへの道5ー

今回はついにRaspberry Pi Pico でバーサライタを製作しました。

 

 

バーサライタ構成

構成はこれまで製作してきたハンディーバーサライタ PovRanianと同様です。

バーサライタ装置の製法

 

モータを安定化電源(1V)で給電して回転部を回します。回転部には24セルのLEDのほかに回転を検出するフォトリフレクタとRaspberry Pi Picoが載っており、給電にはワイヤレスチャージモジュールを使用しています。

フォトリフレクタとRaspberry Pi Pico間にはチャタ防止にフィルタとシュミットトリガを挿入しています。

部品

 

 

バーサライタ分解能

Raspberry Pi Pico によるバーサライタができましたので、1周の分割数をどれほど大きくできるか試してみます。
これによりRaspberry Pi Pico の実力を測れるのではないかと考えました。

Cコード

フォトリフレクタで1周の時間を計測し、その時間を変数Divで分割して色分け(RGBYの4色)してLEDを点灯させるプログラムをです。

 

4分割

まずは Div = 4で動作確認しました。

400分割

Div = 400 まで増加させても問題なく点灯動作を確認できました。
SPIのクロックSERIAL_FREQ は30MHzとしました。これ以上大きくするとLED表示が正常に実施されませんでした。

Raspberry Pi PicoのIO は非常に高速に動作できるのだと実感できました。

 

画像表示

このままRGBYの4色で分割数上げてもよくわからなくなってきたのでアニメ画を表示してみます。

回転速度 960rpmで1周1000分割でも余裕でアニメ表示ができました!!

回転方向の分解能が大きくてもLEDが24セルですので少し寂しいですね 🙄 

 

性能指数

これまでいろいろなマイコンでバーサライタを製作してきましたので、独自の性能指数を設けております。

性能指数 [hPOV(ヘクトポブ)] = LED数 × 回転数 × 一周の分解能 ÷ 100

現状 Raspberry Pi Picoの性能指数は
 LED 24個 × 回転速度 960rpm × 1000分解能 ÷ 100 = 230,400 hPOV
となりました。

以下が過去のその他マイコンの実績値ですので、Raspberry Pi Picoの性能がうかがい知れます。

  • Teensy 4.0:LED 64個 × 回転速度 530rpm × 200分解能 ÷ 100 = 67,840 hPOV
  • ESP32(デュアルコア):LED 58個 × 回転速度 730rpm × 220分解能 ÷ 100 = 93,148 hPOV
  • SPRESENSE(3コア):LED 57個 × 回転速度 730rpm × 400分解能 ÷ 100 = 166,440 hPOV

 

おわりに

Raspberry Pi Pico によって信じられないほど回転方向の分解能の高いバーサライタ動作を確認することができました。

今後はLEDのセル数を増やすべくSPIの複数出力やマルチコア動作を検討したいと思います。

それでは次の道でお会いしましょう!

SPI入力LEDを堪能 (C/C++) ーRaspberry Pi Picoへの道5ー

前回はフォトリフレクタによる割り込み動作を確認しました。

WindowsでのC/C++環境構築 ーRaspberry Pi Picoへの道2ー

ここではSPI入力のテープLEDの点灯を試してみました。

 

 

サンプルコード動作確認

以下のSPI入力LED APA102のサンプルコードを試してみます。
 https://github.com/raspberrypi/pico-examples/tree/master/pio/apa102

構成

Raspberry Pi Pico のハードウェアSPI(SPI0)でLEDを制御します。

 

 

動作

サンプルコードをビルドしてuf2ファイルをRaspberry Pi Pico にドラッグ&ドロップします。

LEDの制御シーケンスは.pioファイルに記述されていました。

 

独自プロジェクト作成

サンプルコードを参考に自分のワークスペースにフォルダを作成して所望の色でを光らせてみます。

フォルダ (SpiLedTest) には以下を用意します。

  • Pico SDKを参照するための設定を記述した pico_sdk_import.cmakeをコピー
  • LEDの制御シーケンスを記述した apa102.pio をコピー
  • プログラム .cファイル (SpiLedTest.c) 作成。詳細は後述
  • プログラムとビルドの設定を記述する CMakeLists.txt 作成。詳細は後述

Visual Studio Codeでフォルダを開いてビルドします。

.cファイル

4色で交互に点灯するコードです。

 

CMakeLists.txt

コピーした.pioファイルを pico_generate_pio_header で宣言しています。

動作

これで自由にLEDを制御できるようになりました!

 

割り込みと組み合わせ

前回確認したフォトリフレクタによる割り込み動作と組み合わせてみました。

 

ここではフォトリフレクタで光が遮られると割り込みでLEDの点灯カラーを変えています。

 

おわりに

ついにRaspberry Pi PicoでSPI入力のLEDを自由に制御できるようになりました!

次回はいよいよバーサライタを組み立てていこうと考えております。
Raspberry Pi Picoの性能が浮き彫りになるのではないかと非常に楽しみです♪

それでは次の道でお会いしましょう!

 

フォトリフレクタで割り込み動作 (C/C++) ーRaspberry Pi Picoへの道4ー

前回は Raspberry Pi Pico で割り込み動作を確認しました。

WindowsでのC/C++環境構築 ーRaspberry Pi Picoへの道2ー

今回は前回のタクトスイッチをフォトリフレクタに変えて割り込み動作を楽しみました。

 

 

構成

前回のタクトスイッチをフォトリフレクタに変えて、チャタリング防止のためにフィルタとシュミットトリガを挿入しています。

 

 

 

 

 

動作

コードは前回とほぼ同じで割り込みのトリガを立下りを立ち上がりにしただけです。

 

フォトリフレクタを指で遮るとシリアル出力されます。
チャタもなく正確に動作できています。

 

おわりに

フォトリフレクタでの割り込み動作が実現できました。
これでバーサライタを製作した際に回転速度をフォトリフレクタによって計測できそうです。

次回はSPI入力LEDの点灯実験を実施したいと思います。

それでは次の道でお会いしましょう!

割り込み動作を堪能 (C/C++) ーRaspberry Pi Picoへの道3ー

前回は Raspberry Pi Pico のWindowsでのC/C++環境構築 を行いました。

WindowsでのC/C++環境構築 ーRaspberry Pi Picoへの道2ー

 

当初はRaspberry Pi Picoの公式ドキュメントをしっかり読んできちんと理解しようと意気込んでいたのですが。。。

SDKの資料を読んでもよくわかりませんでした。 😥  特にCMakeLists.txtのこととか
 Pico C/C++ SDK

Raspberry Pi PicoのキモであろうPIOについても.pioファイルに謎の記述しないといけないなど使いこなせる気が全くしませんでした。

Raspberry Pi Pico をぶん投げてやろうかとも思いましたが、いつも通りサンプルコードをゴリゴリ
いじってやりたいことを達成していく いつものスタイルにもどします。

ソフトウェア難しすぎ。

 

 

割り込み動作

まずはGPIOによる割り込み動作の実現を目指します。

以下にC言語のサンプルコードがありました。
 https://github.com/raspberrypi/pico-examples/blob/master/gpio/hello_gpio_irq/hello_gpio_irq.c

サンプルコードを参考にGPIOに接続されたボタンを押すと、割り込みでシリアル出力するコードを作成しています。

構成

GPIO2ピンをプルアップしてタクトスイッチを接続しました。

 

Cコード

サンプルコードを参考にGPIO2がLOWレベルに落ちた時に割り込んでシリアル出力するコードを作成しました。

 

動作

 

本来はボタンを押したときに1回シリアル出力してほしいのですがチャタリングのように複数回出力されるときがあります。
これはRaspberry Pi Pico の動作が高速のためにボタンを押して信号が落ちきる前にしきい値付近で複数回判定してしまうために起きます。ESP32でも同様の動作となります。

 

おわりに

Raspberry Pi Picoの公式ドキュメントをしっかり読んで理解を深めるのはあきらめました。

いきなり頓挫してしまいましたが、サンプルコードを勉強してなんとか Raspberry Pi Picoをもちいてバーサライタ製作を実現したいと思っています。
噂ではSPIが非常に高速とのことなので非常に楽しみです。

今回は割り込み動作を試してみました。
次回は、Raspberry Pi Pico のGPIOが内部でプルアップ/プルダウンできるのかの調査と割り込みボタンのチャタリング対応を実施したいと思います。

それでは次の道でお会いしましょう!

追記

GPIOプルアップ (21/2/11)

 

WindowsでのC/C++環境構築 ーRaspberry Pi Picoへの道2ー

前回はこの道での意気込みと目標のみで何もできなかったので、
今回はいよいよ Raspberry Pi Picoに火を通していきたいと思います。

 

 

開発環境構築

以下の公式ドキュメントに従って開発環境を構築しました。
 

基本的にはRaspberry Pi 4などでRaspberry Pi Picoを開発するような書き方になっているのですが、
ラズパイでコーディングはしんどすぎるので ここではWindowsで
開発環境を構築します。

WindowsでのC/C++ 開発環境構築方法は スタートガイド の8.2節に記載ございます。
ほぼ書いてる内容通りに実施で構築できました。

各種ソフトインストールの際に”Pathを通す”にチェック入れるなど注意が必要です。
以下の動画と合わせて実行するとスムーズです。

サンプルコード実行

スタートガイド に従ってVisual Studio Codeでサンプルコードをビルドしてみました
(ガイドに従うとすべてのサンプルコードがビルドされ少し時間がかかるのでご注意ください)。

ビルド後にbuildフォルダに各サンプルコードのuf2ファイルが生成されます。
このuf2ファイルをRaspberry Pi Picoに書き込みます。

Raspberry Pi PicoのBOOTSELボタンを押しながらPCに繋がれたUSBケーブルを接続すると、
下のようにUSBストレージとして認識されます。

ここにuf2ファイルをドラッグ&ドロップするだけです。

サンプルコードblinkを書き込むと下の動画のように基板に実装されたLEDが点滅します。

 

書き込み時にいちいちUSBケーブルを抜いてBOOTSELボタンを押しながらつながなくてはならないので少し面倒です。

イネーブルピン(RUN)とGND間にスイッチを接続して、USBケーブル抜き差しを回避する工夫をされている方もいます。

 

プロジェクト作成

ここまではサンプルコードをダウンロードしてビルドしただけですが、独自コードの作製に向けて
プロジェクトの作り方を学びます。

スタートガイド の7章にプロジェクト生成方法の記載がございます。

フォルダを作成(フォルダ名”test”としました)して、そこにプログラムとビルドの設定を記述した CMakeLists.txtと
Pico SDKを参照するための設定を記述した pico_sdk_import.cmakeをコピーします。

プログラム(test.c)とCMakeLists.txtはスタートガイド (p. 27)に記載のものをコピーして使用しました。
test.cはLEDを点滅しながら文字列”Hello World\n”を出力するコードです。
CMakeLists.txtでシリアル出力先の有効無効など記述していました。正直CMakeLists.txtについてはまだよく理解できていません。

Visual Studio Codeで作製したtestフォルダを開いてビルドしました。
test/buildフォルダにuf2ファイルが生成されるのでRaspberry Pi Picoに書き込みます。

Visual Studio Codeでシリアルモニタできるのか私にはわかりませんでしたので
親しみ深いTera Termで文字列出力を確認しました。

 

おわりに

ついにWindowsでRaspberry Pi PicoのCプログラムを作れそうなところまで来ました!

PICの時にも感じましたが開発環境構築って本当に大変ですね。。
書いてある通りにやってるつもりでも間違うこと多々あるし。。

次回からは以下の公式ドキュメントを紐解いてRaspberry Pi Pico の理解を深めたいと思います。
 Pico C/C++ SDK

それでは次の道でお会いしましょう!!

Raspberry Pi Picoへの道 爆誕 ーRaspberry Pi Picoへの道1ー

Raspberry Pi財団からとんでもない製品が発売されましたね。

独自開発したデュアルコア(ARM Cortex M0+) RP2040マイコンを搭載したRaspberry Pi Pico とのことです。

ラズパイなのにシングルボードコンピュータじゃなくマイコンだということで大変驚きました。

 

 

Raspberry Pi Pico

Raspberry Pi Picoの仕様は以下の通り
 https://datasheets.raspberrypi.org/pico/pico-datasheet.pdf

詳細は各所で取り上げられておりますので、私が気がなった点のみ挙げます。

昇降圧DCDC

昇降圧DCDC (RT6150) が搭載され、内部電源3.3Vが生成されています。

Vsysピンに1.8~5.5V印可でボードが起動するとのことです。
乾電池2本で楽しめるかもしれませんね。

PIO

プログラマブルI/O(PIO)が8ピンあるとのこと。
PIOとは何でしょうか?現状私にはわかりません。大変気になります。

開発環境

公式の開発環境としてCとMicroPythonが用意されているようです。

Adafruit社もRP2040チップ搭載の独自ボードを発売予定なので、今後CircuitPythonにも対応すると思います。

 

ArduinoもRP2040搭載ボード開発中とのことですのでArduino IDEに対応もするでしょうね。
なんだかすごい時代ですね!

 

道 爆誕

早速スイッチサイエンスで購入いたしました。

 
リールカットされた状態で届き、高級感すら漂います。

 
いつもなら新しいマイコンを入手した際には バーサライタ を製作するのがだいたいの習わしなのですが、 Raspberry Pi Pico については開発環境の構築から実施しなくてはなりません。

これまではArduino IDEでサンプルコードをいじくりながらブラックボックスであるマイコンを何とか動かしてきましたが
折角ですのでマイコンが何たるかを知るべくきっちり勉強しようと思い ここに道を開通します!

以下資料に沿ってC/C++開発環境で Raspberry Pi Pico を学ぶ予定です。

 

道の目標

この道の目標として、Raspberry Pi Picoを通してマイコンの何たるかを知るのはもちろんとして
具体的にはバーサライタ製作実現に向けて以下を挙げます。

  • センサで割り込んで回転速度を計測
  • 2つのハードウェアSPIでLEDを制御
  • デュアルタスクでLEDを制御して高解像表示を実現

まだRaspberry Pi Picoを開封すらしていないのでどうなるかわかりませんが、
良い機会ですので一生懸命勉強したいと思います。

この道を通してRaspberry Pi Picoの理解だけではなく慣れ親しんだArduino や ESP32の理解が深まれば、今後の人生に良いと考えております。

それでは次の道でお会いしましょう!

Raspberry Pi で 金魚水槽管理システム を構築

HomeMadeGarbage Advent Calendar 2020 |4日目
Raspberry Pi Advent Calendar 2020 |4日目

これまでESP32等で構成していた我が家の金魚水槽システムですが、
この度メンテナンスのし易さや拡張性の高さから制御をRaspberry Pi で実施することにいたしました。

☟従来型の構成は以下の通りです。
家のローカルネットワーク内で水槽の監視・管理を実施しておりました

金魚水槽のフィルターをブクブクから外掛けフィルターへグレードアップ

 

外出時にも対応したいと考え、外部監視・制御にはセキュリティの観点からATOM CamやAlexaアプリの既存のサービスの使用を採用いたしました。

 

 

システム概要

本システムの機能は以下の通りです。

  • 水槽LED照明のON/OFF
  • 自動エサあげ機構
  • 水槽の水温、pHの監視

いずれも自宅内でWebページからの制御・監視が可能で
さらにAlexaアプリと連動させてスマートスピーカ Amazon Echo dot での音声による制御も可能です。
水温、pHについては以前製作した我が家のコンシェルジュのおしゃべりティラノくんに発話で報告させることができます。

外出先からのエサあげ等の制御にはAlexaアプリを用いてスマホで実施し、
遠隔監視にはネットワークカメラ ATOM Cam を使用いたします。

 

構成

以下が本システムの構成図です。
Raspberry Pi Zero W のGPIO端子に照明用のテープLED、温度センサ、エサあげ用ソレノイドを接続し、
pHセンサをマイコンを介してUSB Host端子に接続しています。

部品

  • Raspberry Pi Zero W

     
  • フルカラーLED Neopixel (WS2812B ) 48セル

     
  • 防水温度センサ DS18B20

     
  • pHセンサ PH-4502C

     
  • Arduino Pro Micro 互換ボード

     
  • ソレノイド

    ソレノイドSSBC-0830 - www.takaha.co.jp

     
  • N-MOSFET IRF520PBF

    Internal Error - www.digikey.jp

     
  • ダイオード 1N5819

     
  • MOSFET駆動用レベルシフタ

 

各部品の動作確認

本システムはNode-REDで構築しております。
ここでは各接続部品のNode-REDによる動作確認を行います。

Neopixel制御

NeoPixel用のNode-REDノードは存在し以下を参考に導入致しました。
 https://www.npmjs.com/package/node-red-node-pi-neopixel

NeoPixelの信号線をラズパイの12ピン(GPIO 18)し、
以下のようにrpi-neopixelsノードにカラーコードを送るとLEDが点灯いたします。

自動エサあげ機構

エサあげの機構には タカハ製の5Vプッシュソレノイド SSBC-0830/SSBC-0830-01(7.5Ω) を使用いたしました。

筐体は3Dプリンタで製作いたしました。

 

構成は以下の通り

Node-REDでラズパイのGPIOピンを制御して
ソレノイドに5V印可してエサが押し出される仕組みにしました。

水温計

水温系として1 wire温度センサ DS18B20を使用いたしました。

DS18B20のNode-REDノードも存在し、以下を参考に導入致しました。
 https://www.denshi.club/pc/raspi/iot6.html

DS18B20の出力をラズパイの7ピン(GPIO 4)に接続します。

pH計

pH計にはアナログ出力の PH-4502C を使用しました。

センサの校正方法など詳細は以下を参照ください。

pHセンサを味見 ーエッジAI活用への道 7ー

 

ラズパイにはアナログ値の入力ピンがないためArduino互換マイコンのアナログピンにpHセンサ出力を接続し、シリアルでpH値を出力します。

ラズパイのUSB Hostコネクタにマイコンを接続してシリアルでpH値を受信します。

シリアル通信Node-REDノードは以下を使用しました。
 https://flows.nodered.org/node/node-red-node-serialport

 

マイコンArduinoコード

シリアルで文字”1″が入力されるとpHをシリアル出力します。

 

Node-red自動起動設定

以下のコマンドの実行でラズパイ起動で自動的にNode-REDも起動します。

 

水槽システム Node-REDフロー

水槽LED制御

水槽の照明としてLEDテープを48セル設置し、WebページやAlexaによる音声でON/OFF 制御します。

 

① LED ON functionノード

次段に全白のLEDカラーコード(#FFFFFF)を送信します。

 

② LED OFF functionノード

次段にLED消灯カラーコード(#000000)を送信します。

 

③rpi-neopixelsノード

前段からの色信号(ON:#FFFFFF / OFF:#000000)を受けてLEDを制御します。
輝度は30%としています。

エサあげソレノイド制御

WebページやAlexaによる音声でラズパイのGPIO23をON/OFFしソレノイドを 制御します。

 

① ソレノイド ON functionノード

次段に数値1を送ります。

 

② LED OFF functionノード

ON function後200msecの遅延後に次段に数値0を送ります。

 

③ rpi-gpio outノード

前段からの信号を受けてソレノイドを制御します。200msecの間だけ数値1がきてGPIO23がONになりソレノイドに電流が供給されエサが押し出されます。

ラズパイのGPIO制御ノードでGPIO23を制御します。

 

水温・pH測定

Alexaによる音声で起動しおしゃべりティラノくんに発話で水温とpHを報告させます。

 

① rpi-ds18b20ノード

rpi-ds18b20ノード で水温を取得します。

 

② functionノード

前段からの水温を小数点第1位で丸めて変数waterに格納し、
次段に”1″の文字を送信。

 

serial requestノード

前段の文字”1″を受けてpHセンサ値を次段に返します。

 

④ functionノード

前段からのpH値を変数phに格納

 

⑤ templateノード

水温とpHの測定値を受けて、発話内容を生成します。

 

⑥ google-ttsノード

Google Text to Speech APIを呼び出すgoogle-ttsノードを使用しました。
 https://flows.nodered.org/node/node-red-contrib-google-tts

前段からの発話内容を入力して発話のmp3 URLを返します。
言語は日本語(ja-JP)を指定しています。

 

⑦ udp outノード

前段で生成されたmp3 URLをUDPで おしゃべりティラノくんに送信して発話させます。

Webページ生成

“ラズパイのNode-REDのURL/aquarium”にアクセスでWebページを生成します。

ブラウザ表示前に水温とpHを計ってtemplateノードに渡しています。
templateノードにWeb表示用コードを記述しています。

以下がWebページ画面です。

“ごはんをあげる”ボタンで/feedにGETリクエストを投げてソレノイド制御します。
LEDのON/OFFスイッチで/on または /offのGETリクエストを投げてLEDを制御します。

水温とpHの数値を表示します。

Alexa連動

Node-RED Alexa Home Skill Bridge というNode-REDノードを用いてAlexaと連動させ、システムの音声による制御を可能にしました。

Node-RED Alexa Home Skill Bridgeの設定等の詳細は以下を参照ください。
Node-RED Alexa Home Skill Bridge へのユーザ登録や、
スマホのAlexaアプリでNode-REDスキルを有効にしてAlexaサービスとNode-RED Alexa Home Skill Bridgeを紐づける必要があります。

ラズパイで気圧測定

 

デバイス登録

水質の発話報告を起動する”Aquarium”とエサやりソレノイドを起動する”Feed”と
LEDを起動する”水槽”を登録しました。

“水槽”はON/OFF動作させるのでActionにONとOFFを選択しました。

 

Node-RED

Node-REDに登録したデバイスのノードを配置します。

 

定型アクションを編集

以上で登録したデバイスをスマートスピーカAmazon Echoから起動させることが可能になりました。

デバイス”水槽”はLEDのON/OFFを制御するので「水槽つけて」、「水槽消して」で問題ないですが、
“Aquarium”と”Feed”はON/OFFの発話だと不自然なので
Alexaスマホアプリで定型アクションを登録しました。

「アレクサ、ご飯あげて」でデバイス”Feed”を起動してソレノイドを制御します。

 

「アレクサ、水質教えて」でデバイス”Aquarium”を起動してティラノくんに水温とpHを報告してもらいます。

 

動作

水槽設置前の動作テスト

 

ユニットはタッパに入れて水槽裏に設置いたしました。

Webページによる動作

音声による動作

遠隔動作

旅行先でもご飯の供給ができました!

 

追記

みんなラズパイコンテスト

本システムで今年もみんなのラズパイコンテストに応募いたしました。
受賞はできましたが3年連続となるスタートダッシュ賞をいただくことができました♪

マリオカート ライブ を自作

先日、任天堂が『マリオカート ライブ ホームサーキット』なるSwitchソフトの発売 (2020/10/16)を発表しました。
ラジコンカーにカメラが搭載され、自宅がサーキット場になるという画期的なシステムで大変驚きました。

すごく話題になり、まだ発売前ですし9月24日現在 予約も難しい状況。。。

しかたないので作りました。

 

 

ニセ マリオカート ライブ

まずは完成品の動作をご覧ください。

ゲームコントローラで操作できリアルタイムに機体のカメラからの映像を観ることができます!

システム概要

システムは以前、WebRTC Native Client Momo を用いて作ったショベルカーとほぼ同様です。

WebRTC Native Client Momo で FPVラジコンを堪能

Momoによる配信映像を観ながらゲームパッドでモータを制御します。
ゲームパッドの入力はOSC(OpenSound Control)通信でPCからラズパイに送信し、ラズパイカメラによる映像はMomoでPCブラウザに転送されます。

 

機体

機体は以前購入した有線のマリカーラジコンを改造して製作しました。

 
前輪はサーボで傾きを変えて右折左折を実現します。
後輪は元々搭載されていたDCモータを使用して前進後進を実現します。

 

構成

  • Raspberry Pi Zero WH

     
  • ラズパイカメラ

     
  • デュアルモータードライバDRV8835

  • モバイルバッテリ

 

 

制御系

以前の遠隔ショベルカーの時と同様に、TouchDesignerを使用してPCに接続したゲームパッドのボタンを検出してOSC送信でしました。

OSC信号をラズパイのnode-redアプリでうけて、モータとサーボを制御します。

 

Raspberry Pi Zero W について

Raspberry Pi Zero Wはスイッチサイエンスで購入可能ですが、1ユーザ1個までの数量制限があります。

仕方ないので今回はピンヘッダを実装済みのRaspberry Pi Zero WHを購入しました。
しかしコレピンの向きが嫌なんですよね。。。

ラズパイZeroの公式ケースに合わないんだもん。。。

 

しょうがなくピンを外して、実装しなおしました。

追記:本家プロトタイプ

なんと本家のマリオカート ライブのプロトタイプもラズパイZeroを使用しているようでした。

 

USB WiFi接続されてるからラズパイ Zeroでしょうね。Wじゃなく。

 

弊ニセ マリオカート ライブもなかなかいい線いっていたってことですねww

ラズパイでタイムラプス ー 石巻貝の軌跡 ー

我が家の水槽ににて、金魚ちゃんとヤマトヌマエビと共存してらっしゃる石巻貝の
位置が水槽を見るたびに変わるのでタイムラプスで撮影してみました。

金魚水槽にヤマトヌマエビ&石巻貝 水質検査も実施

 

 

システム概要

タイムラプス撮影するシステムは非常に単純でラズパイ3にUSBカメラを繋いだだけです。

 

USBカメラ

カメラには以下を使用しました。

防犯カメラ用の屋外カメラですのでなかなか便利なカメラです。
CdSセルが内蔵されており暗闇時には自動でナイトモードとなり赤外線LEDを点灯し白黒で撮影します。

 

ラズパイ設定

ビューワ guvcview

カメラを接続して配置や画角の設定の調整のためのビューワにはguvcviewをインストールして使用いたしました。

webカメラ撮影(guvcview)

 

静止画撮影 fswebcam

静止画撮影にはfswebcamをインストールして使用いたしました。
コマンドで画角やファイル名などを指定して撮影します。
 

参考

システム構築 Node-RED

タイムラプスのシステム構築にはNode-REDを用いました。
詳細は次節で記載いたします。


 

Node-RED

1分おきにfswebcamで静止画撮影を実施します。

①撮影トリガ インジェクトノード

カメラ撮影のためのトリガです。1分おきに定期的に動くようにしています。また撮影したjpegファイル名を1づつ増やすためにPayloadに”1″を指定しています。

②jpegファイル名生成 ファンクションノード

グローバル変数sumに前段ペイロードの”1″を足して4桁の連番jpegファイル名を生成しています。

fswebcamカメラ撮影ノード

execノードでfswebcamコマンドを実行して静止画撮影します。
前段の連番ファイル名を受けて1280×720サイズで撮影して保存します。

④ファイル名 連番リセット

前段のインジェクトノードをクリックするとこのファンクションが起動して、グローバル変数sumをリセットします。

 

タイムラプス

一晩撮影して静止画を繋いで(Photoshop使用)、タイムラプス動画を作りました。

1800倍速

300倍速

 

石巻貝が縦横無尽にうごき回っていますwww
なにしてるんだろう? 🙄 www なんかうける

おわりに

ゆくゆくは太陽光発電で長期の撮影も実施したいと思っています。
今回は1分おきの撮影でしたが、スパンが長くなると省電力のためにカメラの電源を落としたりラズパイをスリープしたくなりますよね。

ラズパイのUSB給電は以下のコマンドで実行できます。
USB給電OFF: sudo sh -c “echo -n “1-1″ > /sys/bus/usb/drivers/usb/unbind”
USB給電ON : sudo sh -c “echo -n “1-1″ > /sys/bus/usb/drivers/usb/bind”

ラズパイのスリープについてもおいおい勉強したいと考えております。

ラズパイノートPCをファイルサーバに②

格安WindowsノートPC にRaspbian OS を入れたPCをファイルサーバにする事にしました。

Raspbian に samba をインストールし、ノートを閉じてもスリープしない設定まで行いました。(前回の記事↓)

ラズパイノートPCをファイルサーバに① …眠っているPC活用

無線LANが自動的にスリープしてしまう問題を解決出来なかったので、USB LAN変換アダプターを使用する事にしました。 

USB変換アダプタでLAN接続

お父ちゃんが USB変換アダプタとHDDを購入してくれたので、こちらを接続しました。

USBアダプタはドライバなど必要無く、USBとLANケーブルを接続するだけですぐネットに繋がりました。

IP固定

OSのバージョンを調べる

raspbian(Raspberry Pi)のバージョン確認方法 | Check!Site

まずはラズビアンのバージョンなんだったかな…と調べ

Debian 9.12 のIP固定方法

# Example static IP configuration: の所のコメントアウト「#」を削除してIP設定(デフォルトで10だったからそのまま使用。なのでコメントアウトを外しただけ)

保存してリブート後、設定したIPアドレスになっていることを確認

HDDも追加

HDD はこちらを参考に設定し…

Raspberry Pi3で外付けHDDをマウントする – 新しいノートブック

色々出てくる…
1TBのHDDなのでこれだろうな、と。

パーティションの設定は行わず、WIndowsからもアクセスしたいため、フォーマットもNTFS になっているので変更せずそのまま進める事に。

マウント

マウントポイントの作成

UUID を調べて

fstab の最下行に追加

再起動

ファイルマネージャーで確認すると無事マウントされており、ファイルの作成も問題無くできました。

接続

Macから接続

前回の記事では Finder > 移動 > サーバへ接続(⌘K)から接続したのですが、

今回はなぜかネットワークに表示されていました。一度接続したからかもしれません。(でもIPアドレス変わっているのに、、とちょっと謎。)

WIndowsから接続

SoftEther.co.jp – 別のマシンの共有フォルダに簡単にアクセスする方法 – SoftEther VPN System(古い Web サイト)

引用 =======

「スタート」メニューの「ファイル名を指定して実行」などを開き、以下のように入力します。

===========

ユーザ名とパスワードを入力して接続

 

接続速度はまぁまぁです。基本的に保管場所にするのでちょっと遅くても問題ありません。

 

置き場を整えていなくてとりあえず長男くんの玩具の上・・・

ラズパイノートPCをファイルサーバに① …眠っているPC活用

家にあるラズパイノートPC(数年前3万円位で購入したWindowsノートPCが重くなったのでrasbian OSを入れたもの‥バックアップ用として使用していた)を、ファイルサーバにしました。

まず最初にアップデート

暫くしていなかった・・

samba

sambaのインストール

ここで何やらエラーが出たので・・

もう一度 sudo apt-get update を実行してからインストールしたら無事完了しました。

sambaの設定

設定ファイル

最下行に追加

ユーザー追加

パスワードを2回聞かれるので設定する

samba 再起動

Macから接続

Finder > 移動 > サーバへ接続(⌘K)

IPアドレスを入力して「接続」

接続中・・

結構時間がかかる様子・・?
暫く待った後マウントするボリュームの選択画面が表示された

OKを押すと

Finderで開いたー🙌

ノートPCをスリープさせないようにする

①ノートを閉じてもスリープさせない設定

閉じてもスリープさせない設定

設定ファイルを開き

の下に

を追加。

再起動

・・閉じても接続が途切れなくなった🙌

②問題点:一定時間後無線LANがスリープする

Wi-Fiがスリープになる問題・・

以前(Raspbianの前に一度Ubuntuを入れた)、内臓の無線Wifiが使えなくてrtl8192cuを取り除いてしまったせいか…

Ubuntu 16.04 : 無線LAN(RTL8188CUS)接続するとフリーズ > rtl8192cuを外す

調べたらよく見つかる方法の、 

が存在しておらず

を追加しても効かないので調べています・・

対策できたら追記します・・

③USB変換アダプタを使用することにしました。

ラズパイノートPCをファイルサーバに②

参考にさせていただきました

WebRTC Native Client Momo で FPVラジコンを堪能

またしてもTwitterですごいものを見つけました!

なんじゃこりゃー!全然遅延がないじゃないですか。。。
WebRTC Native Client Momoというものらしいです。

以前、ラズパイZeroでMJPEG-Streamerを用いたFPV(First Person View)ラジコンを作ってみたのですが
映像転送の遅延でリアルタイムには程遠いものでした。。

Raspberry Pi Zero W でFPVラジコンカー自作

ここではWebRTC Native Client Momoを用いて再びFPVラジコンを作製してみましたので報告いたします。
 

 

MJPEG-Streamer vs Momo 

まずはMomoの低遅延具合を全身で体感するべくMJPEG-Streamerと比較してみました。

MJPEG-Streamer

設定・使用方法はブログ参照ください。

Momo

ラズパイでの設定・使用方法は以下を参照ください。
 ・Raspberry Pi (Raspbian) で Momo を使ってみる

めちゃくちゃはやい!
やばい!

FPVラジコンの作製

Momoのリアルタイム性を体感できたので早速 FPVラジコンのリベンジです!

長男くんのショベルカーラジコンを改造しましたw

システム概要

Momoによる配信映像を観ながらゲームパッドでショベルカーをコントロールします。
ゲームパッドの入力はOSC(OpenSound Control)通信でPCからラズパイに送信し、ラズパイカメラによる映像はMomoでPCブラウザに転送されます。

ショベルカー構成

ショベルカーラジコンには左右のタイヤ用とアーム用の3つのDCモータが内蔵されていました。コントローラの配線を切ってモータドライバDRV8835を介してラズパイに接続しました。

部品

  • Raspberry Pi Zero WH

     
  • ラズパイカメラ

     
  • デュアルモータードライバDRV8835

  • モバイルバッテリ
     
  • 広角レンズ

 

視野角向上のために、広角レンズを装着しています。

動作

早速動作をみてください。

すごい!ラズパイZeroでFPVラジコンができてしまいました!
ちょっとタイヤが5V(モバイルバッテリの電圧)入力だと動画のように早すぎるので、
以後はPWM入力して速度低減しました。

 

PC側

ブラウザ(chrome)

ゲームパッドF310をつないでブラウザでMomoからの映像を確認します。
http://[ラズパイのIP]:8080/html/test.html で監視できます。

TouchDesigner

ゲームパッドの検出、OSC送信のためにTouchDesignerを使用しました。

ジョイスティックの十字キーとLRトリガを検出してラズパイにOSC送信します。
ポートは10000としました。

 

参考

Raspberry Pi Zero W側

Momo

ラズパイカメラの映像をMomoのテストモードで送信します。

参考

Node-RED

PCからのOSC信号をUDPノード(ポート10000)でうけて、OSC信号受信のために以下のノードを追加し挿入しました。
 node-red-contrib-osc

十字キーでタイヤのモータを制御して前後進、左右旋回します。
モータにはPWM入力(デューティ30%)してスピードを抑えています。

ゲームパッドのLRトリガでショベルカーのアームを上下します。

 

おわりに

WebRTC Native Client Momoを用いてFPVラジコンが実現できました!

いつかはもっと遠隔で屋外で試してみたいですね。

Node-REDでデータベース(MySQL)へ保存 ーエッジAI活用への道 9ー

前回Node-REDでUDPを受信出来たので今回はそれをデータベースに保存しました。

pHセンサを味見 ーエッジAI活用への道 7ー

データベース作成

ラズパイ2に入れているphpMyAdminで
「kingyo」データベースと「suiso」テーブルを作成しました。

node-red-node-mysql 追加

インストール

node-red-node-mysql (node) – Node-RED

Node-REDの再起動

再起動すると「ストレージ」の所に「mysql」が追加されました。

ノード作成

udp in:UDP受信

function:グローバル変数に保存

inject:1時間毎

function:MySQL文

mysql:DB接続

 

debug:デバッグ

 

確認

1時間毎にデータが保存されていることが確認出来ました!

次回は、データを取り出してページに表示する所までやりたいと思います。🐠

ハエトリソウ捕食監視システム

Raspberry Pi Advent Calendar 2019 | 5日目

長男くんがハエトリソウがハエを食べるところが見てみたいというので、ラズパイカメラで監視して捕食の瞬間を動画におさめるシステムを製作しました。

また こういったIoTシステムで一番問題となる電源の確保をソーラ発電によるエコエネルギーで実施したく同時にシステムに導入しました。

 

 
 

システム概要

システムはベランダに配置してラズパイカメラでハエトリソウを撮影しハエトリソウに虫を捕食するなどの動きがあるとその前後の動画を生成し、IFTTTを用いてケータイ端末に通知します。

電源はソーラパネルを使用して完全に自立したシステムとなります。

構成

ソーラパネルと鉛蓄電池をチャージコントローラに接続します。コントローラが出力する12Vをコンバータで5Vに変換してUSBコネクタで出力します。
負荷としてラズパイZero&ラズパイカメラをつなげます。

部品

 

太陽光発電システム

Indoor Corgi Elec.社製のESP32を搭載した太陽光発電充電コントローラE32-SolarChargerを使用します。マイクロSDカードスロットもありデータログを記録できます。

以下のサイトで製品概要やサンプルコードが提供されています。

Arduino IDEでカスタマイズも比較的簡単にできます。ESP32搭載ですのでWiFiで動作状況や設定変更が可能です。

E32-SolarCharger 概要

  • バッテリの電圧と充電電流を監視してPWM制御します。
  • 液晶ディスプレイにバッテリ電圧・電流、ソーラパネル発電電圧、動作モードを表示
  • 測定値のログをSDカードに保存。
  • 負荷とバッテリ間のスイッチでバッテリ電圧が低下した際に負荷の切断が可能。
  • ソーラパネル発電電圧を観測して8Vを下回ると(夜間)コントローラをディープスリープさせて負荷のスイッチもオフして消費電力を抑える。
  • ESP32のWiFi機能でブラウザで各種数値表示や動作モード変更が可能

ブラウザ表示 (設定)

ここではターゲットとするバッテリ充電電圧を13.8V、充電電流を1Aとしました。スリープモードは有効にしています。

充電動作

我が家のベランダは西向きで晴天時でも午前中の数時間しか満足に日照がなかったので、夜間はチャージコントローラをスリープし、さらに鉛蓄電池と負荷の間のスイッチをOFFして消費電力を低減します。夜は撮影しても見えませんので。

昼と夜間はソーラパネルによる発電電圧によって判断します (8V以下でスリープ、10V以上で解除)。

撮影システム

ラズパイZero Wにラズパイカメラを搭載しハエトリソウを撮影します。

撮影システムはNode-REDで構築しました。電源起動で自動に動作します。

Node-RED自動起動設定

以下のコマンドの実行でNode-REDがサービス化されラズパイ起動で自動的に起動します。
夜間からのスリープ明けの起床時にも自動でNode-RED起動します。

撮影Node-Redフロー

ラズパイカメラでハエトリソウを撮影し、捕食などの動きを検出して動画を生成しスマホに通知を送信します。これをNode-REDで構築しました。

①初期起動 injectノード

injectノードのペイロードを”Started!”とすることでNode-REDが起動した際にトリガ起動します。

参考

 

②監視プログラム起動 execノード

シェルコマンドで監視プログラムを起動します。

 
シェルでハエトリソウ監視Pythonプログラムを起動します。

 

以下がハエトリソウ監視Pythonプログラムです。

 

通常動画撮影

OpenCVでカメラ撮影実施します (L 7~11)。
動画はmp4形式で取り扱います (L 14)。
撮影は1フレームごとにjpgで常に直近の300枚を保存するようにします (L 52~71)。

800フレーム分の撮影実施ごとにログとして画像を保存ファイルに残します (L 92~96)。

動体検知

フレーム間差分法でハエトリソウの動きを検出します (L 23~39、L 73~84)。
フレーム間の差分が閾値(ここでは6000)を3回超えるとハエトリソウが動いたと判断 (L86~90、L100)。

ハエトリソウの動き検知で直近の300枚のjpg画像を動画video1.mp4にします (L 101~105)。

その後1200フレーム分の動画を撮ってvideo2.mp4にします (L 42~49、L 108)。

後処理

動画撮影後、動体検知前の直近の300枚のjpg画像を削除し文字列”MOVE!!”を次のノードに渡します (L 112~120)。
 

参考

 

③動画ファイル名生成 functionノード

ハエトリソウ動作検出後に動画保存のためのファイル名を生成します。日付と時刻で”YYYY-MMDD-hhmm”の文字列を次のノードに渡します。

 

④動画合成 execノード

シェルコマンドで動画合成プログラムを起動します。

 

シェルでハエトリソウ動作の検出前の300フレーム分の動画 video1.mp4 と検出後の1200フレーム分の動画 video2.mp4 をffmpegで合成します。合成後のファイル名は③で生成した日時の文字列を使用します。

 

list.txtは以下の通りです。

参考

 

⑤IFTTT http requestノード

あらかじめIFTTTで設定しておいたWebhooksトリガのURLをPOSTします。

 

IFTTTの設定

IFTTTとはif this then thatの略で各種Webサービス同士を連携して自分好みのWebサービス(アプレット)を生成することができます。ここではthis(トリガ)にwebにリクエストを受信できるWebhooksを使用しthat(アクション)にスマホに通知を送るNotificationsを使用しました。

Webhooksのイベント名は”Flytrap”としました。以下URLをリクエストすると”ハエトリソウに動きあり!”とスマホに通知が来ます。
 https://maker.ifttt.com/trigger/Flytrap/with/key/”Webhook-key”  

“Webhook-key”にはWebhookサービス登録時に得られる認証キーを入力します。

 

以上で動画が保存されるとIFTTTを介してスマホに通知が行きます。

 

⑥delayノード

IFTTT通知後、5秒待って監視プログラム②を再開します。

 

動作

2019/7/14から10/27まで運用しましたが、残念ながらハエトリソウの捕食動画は撮影できませんでした。悲しみ 🙁 

フレーム間差分法で動作検出を実施しているため、急に太陽に雲がかかるなどで影が生成されても動作検出してしまう点が改善すべき点です。

雲の多い日はガンガン通知来ますが捕食はゼロでした。。。
来季は学習による画像認識などの検討も実施しリベンジしたいと考えております。

 

運用時は7分おきに静止画ログも残しておりましたので成長をタイムラプス動画にするなどで楽しむことはできました。

 

追記

2019/12/10 みんなのラズパイコンテスト

今年もこのネタでみんなのラズパイコンテストに参加いたしました!

今年は優良賞とスタートダッシュ賞のダブル受賞でした!わーい 😛 !

気圧センサの Alexa 連動とグラフプロット

我が家のおしゃべりコンシェルジュのティラノくんに気圧センサBMP280を導入したことを前回報告させていただきました。

AquesTalk と Node-RED と ラズパイで おしゃべりティラノくん作製

日々のお知らせにその時の気圧を付与して発話するようにしたのですが、リアルタイムの気圧が知りたいとのことで Alexa と連動もさせてみました。

また1時間ごとに気圧を測って記録しグラフで確認できるようにもしました。
 

 

Alexa連動

Node-RED Alexa Home Skill Bridge というNode-REDモジュール用いて、仮想のAlexaデバイスを作成して発話応答をNode-REDへ返してティラノくんに気圧を発話させました。

構成

 

主要部品

  • Amazon Echo Dot

     
  • Raspberry Pi Zero W

     
  • 気圧センサ BMP280

Node-RED Alexa Home Skill Bridgeの設定

Node-RED Alexa Home Skill Bridge用のアカウントを作成して気圧センサを起動するための仮想のAlexaデバイスを作成します。
 

アカウント登録

以下にアクセスして、Resisterをクリックします。
 https://alexa-node-red.bm.hardill.me.uk/

ユーザ名とメアド、パスワードを登録します。

 

デバイス登録

登録後、Devicesタグを選択してAdd Deviceをクリックします。

 
気圧センサを起動するためのAlexa用デバイス”Barometric pressure”を作成しました。

Name: デバイス名 ” Barometric pressure” 入力
Description: デバイスの簡単な説明記載
Actions: デバイスの動作種類を選択。ここではOnを選択。
     Onで気圧センサ値読み取りのトリガとします。

 

 

Alexaスキル  Node-RED有効化

スマホのAlexaアプリでNode-REDスキルを有効にしてAlexaサービスとNode-RED Alexa Home Skill Bridgeを紐づけます。

 
スキルを有効にするとNode-RED Alexa Home Skill Bridgeのアカウント入力画面に切り替わるので、登録したユーザ名とパスワードを入力します。

 
問題なければデバイス検出画面に移行します。

 
端末の検出をクリックで作成したデバイスが見つかります。

 

定型アクションを編集

作成したデバイスの起動するための発話をカスタマイズするために、 Alexaスマホアプリで定型アクションを編集します。

Node-RED設定

node-red-contrib-alexa-home-skillをインストールします。

設定でパレットのインストールでnode-red-contrib-alexa-home-skillを検索して”install”クリックでノードが追加されます。

作成した仮想Alexaデバイス”Barometric pressure”を配置します。

ノードを配置してまずはNode-RED Alexa Home Skill Bridgeで登録したユーザ名とパスワードを入力します。

 
デバイスを選択します。

 

Alexa-homeノードを気圧センサの値を取得して発話させるノードの手前に挿入します。


 

動作

Alexaで設定した定型アクション文の発話で現在の気圧を発話してくれるようになりました。

参考

 

気圧のグラフプロット

Node-RED上で気圧センサの値を取得・記録しプロットします。

プロットには node-red-contrib-googlechart というノードを利用しました。

Node-REDフロー

1時間ごとにセンサで気圧を測定してJSON形式で記録し、Googleチャートでグラフプロットします。

  1. inject node
    一時間ごとに起動し時間を次のノードに渡します。

     
  2. exec node
    pythonコードを起動して気圧センサの値を取得して、時刻と気圧を次のノードに渡します。

    bme280_sample.py内のcompensate_P(adc_P)の最後の測定値出力を以下のように修正しbme280_data.pyとしました。

    sys.stdout.write(datetime.now().strftime("%Y/%m/%d-%H:%M:%S") + "\t%0.1f" % (pressure/100)) 
     

  3. exec node
    pythonコードを起動して前段ノードからの時刻と気圧をtxtファイルに保存します。
     

     

  4. chart request node
    node-red-contrib-googlechart のchart request nodeでJSON形式のデータをプロットしてグラフを生成します。
    Charttype: グラフの形式を指定。ここでは線グラフのLineChartを指定
    Path: グラフを表示するURLを指定します。ここでは”/kiatu05″として
          node-REDのIPアドレス/kiatu05にアクセスでグラフが表示されます。
    Attributes: +addでJSONデータの要素を追加します。
      
  5. file in node
    ③で生成した時刻と気圧のtxtファイルを読み込みます。

     
  6. function node
    前段からのtxtファイルを配列形式に整形します。
     
  7. json node
    前段から受け取った配列をオブジェクトに変換します。
     
  8. chart response node
    JSONデータを受け取りプロットします。設定することは何もありません。
     

グラフ

これでスマホやPCで気圧のグラフの表示が可能となりました!

参考

 

ラズパイで気圧測定

最近、台風の通過の様子などを気圧のプロットで報告する人々が多くいて興味深く見ていたのですが、この度 自分でもやってみようと気圧センサを購入いたしました。

安い!早速 我が家のコンシェルジュのおしゃべりティラノくん(Raspberry Pi Zero)に組み込んでみました。定期的に気圧の報告をするようにしました。

AquesTalk と Node-RED と ラズパイで おしゃべりティラノくん作製

構成

ほぼ これまでのティラノくんと同じ構成で気圧センサを追加しただけです。

変更点

  • 気圧センサ追加に伴いサーボの制御線をGPIO3からGPIO19にしました。
  • 気圧センサBMP280を追加。I2Cで制御します。
     
     
     
     VCC – 3.3V
     GND – GND
     SCL – GPIO3
     SDA – GPIO2
     CSB – 接続なし
     SDO – GND

参考

Raspberry Pi Zero設定

ティラノくんはRaspberry Pi ZeroにWiFiドングルを使用してネットワークに接続しています。


GW-USNano2 - PLANEX

I2C有効化

ここでは気圧センサBMP280とラズパイはI2Cで通信します。
Raspberry Piの設定でI2Cを有効にします。

pythonコード

以下のBMP280用のpythonコードを参考にプログラミングしました。
 https://github.com/SWITCHSCIENCE/BME280/blob/master/Python27/bme280_sample.py

smbus2ライブラリも必要となりますのでインストールします。

  • bme280_sample.pyのインストール
    wget https://raw.githubusercontent.com/SWITCHSCIENCE/BME280/master/Python27/bme280_sample.py
  • smbus2ライブラリのインストール
    sudo pip install smbus2==0.1.3 

 

bme280_sample.pyの修正

ティラノくんに発話させるためにセンサから気圧を受け取って発話内容を生