「WiFi」タグアーカイブ

Arduino MKR WiFi 1010 ベランダ太陽光発電 気象観測システム 1周年

2021年9月21日から本格運用を開始しましたベランダ太陽光発電 気象観測システムが遂に1周年を迎えました。

まだまだ元気に動いておりますよ。

 

構成おさらい

ベランダ太陽光発電 気象観測システムの構成は以下の通り。
マイコン Arduino MKR WiFi 1010に気圧センサ、温湿度センサとLiPoバッテリ、ソーラパネルを接続したのみです。

Arduino MKR WiFi 1010にはパワーマネージメントIC BQ24195Lが搭載されており、LiPoバッテリを接続してマイコンへの給電電圧生成やLiPoバッテリのチャージをコントロールします。

BQ24195Lの入力電源の定格が22Vと高い値であったことに着目し、ソーラパネルによる運用ができるのではと考え本運用が開始されました。

(Arduino MKR WiFi 1010のオフィシャルVin最大定格は6Vです。
実施の際は自己責任で宜しくお願い致します。)

部品

  • Arduino MKR WiFi 1010
    [amazonjs asin=”B07FYFF5YZ” locale=”JP” title=”Arduino MKR WiFi 1010 ABX00023″]
  • 温湿度センサ SHT31
    [amazonjs asin=”B097P3KNBY” locale=”JP” title=”BSTKING SHT31 SHT31-D 用温度湿度センサーブレークアウトボード天候モジュール”]
  • 大気圧センサーモジュール BMP280
    [amazonjs asin=”B074KBWYX8″ locale=”JP” title=”GAOHOU GY-BMP280-3.3高精度大気圧センサーモジュールArduino用”]
  • LiPoバッテリ 1200mAh
    [amazonjs asin=”B00IG0C9Y6″ locale=”JP” title=”3.7V充電式 063450 リチウム電池交換用1200mAh 603450 バッテリー forソニーゴールドワイヤレスヘッドセット, Sony PlatStation 4 CUH-ZCT1J PS4 コントローラー、GPS、MP4、POS機、カメラなどの”]
  • 8W ソーラパネル
    [amazonjs asin=”B004GWY0J0″ locale=”JP” title=”6V用 8W 多結晶ソーラーパネル 6V システム系 6Vバッテリー充電 6V電源 6V機器”]

1年間のデータ

気温

札幌の年間の気温差はかなり広いですね。。

湿度

気圧

バッテリ電圧

LiPoバッテリ電圧も低下し続けることはなく、ソーラパネルより充電され電圧を保てています。

2022年6月末に急激に電圧が下がっていますが、こちらは風でソーラパネルが倒れていることに4日ほど気づかず電圧が低下してしまいました。
パネル設置し直したのちに正常に充電がされています。

ソーラパネル電圧

我が家のベランダは東向きで1日の日照量がそれほど多くないですが、無事に1年間動き続けてくれました。

思い出

1年間いろんなことがございました。

トンガ火山噴火

2022年 1/15~1/17トンガ火山噴火による衝撃波を気圧計で観測しました。
これには大変驚きましたし、思わぬ形で地球が丸であることを実感しました。

雪にも負けず

札幌は雪も多いので大変です。。。
こまめに除雪しますが、白いためか意外と全く発電されなということはなく電圧はそれなりに出るので気づきにくい。

パネルが2個ありますが本システムは右で、
左はコチラ☟

USB充電ステーション ーベランダ太陽光発電所への道8ー

温湿度センサ変更

温湿度センサは何種類か変更しております。
2022年4月にも変更しました。

Arduino MKR WiFi 1010 ベランダ太陽光発電 気象観測システム 1周年

データ取得頻度変更

2022年6月にはデータ取得頻度を10分→3分に変更しました。
バッテリ電圧低下も問題なく運用できております。

台風

台風が接近するとグングン気圧が下がる様子が観測されます (2022年9月)。

おわりに

簡素な構成で開始した本ベランダ太陽光発電 気象観測システムですが、無事に1年間元気に動いてくれました。

まだまだ元気に動いてくれると思うので引き続き気象データを楽しみたいと思います。

Arduino MKR WiFi 1010 ベランダ太陽光発電 温湿度センシング検討

2021/9/22からベランダに設置している、太陽光発電 気象観測システムが止まることなく無事に北海道の厳しい冬を越すことができたことを前回報告させていただきました。

RaspberryPi サーバ & WordPress ブログ を XSERVER に サーバ移転

 

長い冬が終わり気温が上がってきまして、ずーっと保留にしてきた比較的気温が高い時に発生する温度と湿度の値の跳ね上がり現象が現れ始めました。

 

腰を据えてこの問題と向き合いましたので報告いたします。

 

温湿度センサ交換

これまで温湿度センサはDHT11からDHT22にかえて運用してきましたが、いずれも値の跳ね上がり現象が発生しています。

Arduino MKR WiFi 1010 をソーラで楽しむ 3 -温湿度センサ変更-

[bc url=”https://jp.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DHT11.html”]

[amazonjs asin=”B07CSNMYN7″ locale=”JP” title=”OSOYOO Arduino用 DHT22 デジタル 温度 湿度 センサー モジュール デジタル温湿度測定 アルドゥイーノやRaspberry Pi 2 3電子工作用 2個セット”]

新温湿度センサ SHT31

凝りもせず再び温湿度センサを変えてみました。

[amazonjs asin=”B097P3KNBY” locale=”JP” title=”BSTKING SHT31 SHT31-D 用温度湿度センサーブレークアウトボード天候モジュール”]

https://github.com/adafruit/Adafruit_SHT31

 

 

しかし、結果は変わらず日中に値が上昇する結果となりました。。。

ということは日中お弁当箱の中は確実にこの温度になっているということです。

 

お弁当箱 加工

お弁当箱を百葉箱のように通気性がよく直接日光が当たらないように工夫しました。
側面に穴を複数開けて、フタにプラ板で天井を設けました。

あっさり解決しました。。w

屋根が効いたようです。早く気づけよという話ですね。。。

温湿度センサのDHT11とDH22  疑ってごめんなさい 😥

 

引き続き運用続けます。

追記

2022/6/1 データ取得頻度変更

 

データ取得頻度を10分から3分に変更しました。
消費電力は増えますが問題なく太陽光発電で運用できています。

次の記事

Arduino MKR WiFi 1010 ベランダ太陽光発電 気象観測システム 1周年

Arduino MKR WiFi 1010 ベランダ太陽光発電 気象システム 無事越冬

2021/9/22からベランダに設置している、太陽光発電 気象システムが止まることなく無事に越冬できました。

Arduino MKR WiFi 1010 をソーラで楽しむ 1 -ベランダ気象データ測定-

 

 

 

気象システム

システムのおさらいです。
Arduino MKR WiFi 1010 に温湿度センサと気圧センサを接続し、LiPoバッテリを8Wソーラパネルで充電しながら運用しています。
10分おきに起床してLiPoバッテリ電圧とソーラ発電電圧と気象データ(温度、湿度、気圧)をUDP送信してスリープします。

 

  • Arduino MKR WiFi 1010
    [amazonjs asin=”B07FYFF5YZ” locale=”JP” title=”Arduino MKR WiFi 1010 ABX00023″]
     
  • 温湿度センサー DHT22
    [amazonjs asin=”B07CSNMYN7″ locale=”JP” title=”OSOYOO DHT22 デジタル 温度 湿度 センサー モジュール デジタル温湿度測定 ArduinoやRaspberry Pi 2 3電子工作用 2個セット”]
     
  • 大気圧センサーモジュール BMP280
    [amazonjs asin=”B074KBWYX8″ locale=”JP” title=”GAOHOU GY-BMP280-3.3高精度大気圧センサーモジュールArduino用”]
     
  • LiPoバッテリ 1200mAh
    [amazonjs asin=”B00IG0C9Y6″ locale=”JP” title=”AOLIKES 3.7V充電式交換用バッテリー1200mAh PL 603450 JST PH2.0コネクタ- for Bluetoothスピーカー、GPS、MP4、POS機、カメラなどの”]
     
  • 8Wソーラパネル (6V用)
    [amazonjs asin=”B004GWY0J0″ locale=”JP” title=”6V用 8W 多結晶ソーラーパネル 6V システム系 6Vバッテリー充電 6V電源 6V機器”]

パワーマネージメント

Arduino MKR WiFi 1010には入力定格22VのパワーマネージメントIC BQ24195Lが搭載されており、コントローラ用のロジック電源生成とLiPoバッテリの充電動作を実施しています。

高い入力電圧耐圧のBQ24195Lのおかげで開放電圧10.8Vの8W出力のパネルソーラパネルを直接Vinに接続することができ、LiPoバッテリを充電しながらの長期運用が実現できました。

但しArduino MKR WiFi 1010のオフィシャルVin最大定格は6Vです。
実施の際は自己責任で宜しくお願い致します。

参考

 

無事に越冬

本システムをベランダに置いて2021/9/22から運用し、
2022/3/17まで止まることなく動き続けています(176日連続動作)。
引き続き運用していく予定です。

気温

気圧

湿度

LiPoバッテリ電圧

ソーラパネル電圧

 

データをブラウザでみえる化

お母ちゃんに気象システムからのデータをブラウザから見れるようにしてもらいました。

RaspberryPi サーバ & WordPress ブログ を XSERVER に サーバ移転

これで端末からいつでも気象情報をチェックできます。

 

氷点下時のバッテリ電圧

気温が-8℃以下になるとバッテリ電圧の低下がみられました。

気温

LiPoバッテリ電圧

 

ソーラパネルからの電圧は普段通り供給されているので、低温によるバッテリ電圧の低下といえます。

ソーラパネル電圧

 

バッテリ電圧低下時でも3.8V以上を保持しており、システム動作に異常はありませんでした。
気温が-10℃以下になると危なかったかもしれませんが、今冬は無事に超えることができました。

 

トンガ火山噴火 衝撃波

2022/1/15のトンガ火山噴火の衝撃波による気圧変化を本システムでも観測しました。

 

 

逆方向と2周目の3回のピークを観測しました。
これには非常に驚きました。

 

 

温湿度センサ

観測当初から見られた温湿度センサの値の跳ね上がり現象がここ最近再びみられるようになりました。

 

同様に湿度にもピークが出るので温湿度センサDHT22の何かに起因しているものと考えています。

 

こちらはセンサ交換も視野に入れつつ、原因検証すすめます。

 

おわりに

Arduino MKR WiFi 1010 ベランダ太陽光発電 気象システムの長期運用状況について報告いたしました。

すでに冬を超えて半年近く動作しています。
特殊機材の追加なしにマイコンとソーラとバッテリとセンサのみで実施できる非常に経済的なシステムであるといえます。

今後は温湿度センサのピーク値の原因解明と現行では10分おきのデータ取得周期を消費電力と相談しながら縮めていこうと考えております。

次の記事

Arduino MKR WiFi 1010 ベランダ太陽光発電 気象システム 無事越冬

Arduino MKR WiFi 1010 をソーラで楽しむ 5 -8Wソーラ再測-

前回はバッテリ配線を修正し、ダイソーのガーデンライトソーラでの運用結果を報告いたしました。

Arduino MKR WiFi 1010 をソーラで楽しむ 1 -ベランダ気象データ測定-

 
ここでは8Wソーラで再実験いたしましたので報告いたします。

 

8Wソーラで気象データ測定システム再実験

8Wソーラは以下を使用し、Arduino MKR WiFi 1010に給電します。
いつも通りベランダで運用。

[amazonjs asin=”B004GWY0J0″ locale=”JP” title=”6V用 8W 多結晶ソーラーパネル 6V システム系 6Vバッテリー充電 6V電源 6V機器”]

[amazonjs asin=”B07FYFF5YZ” locale=”JP” title=”Arduino MKR WiFi 1010 ABX00023″]

 

センサとして温湿度センサと、気圧センサを接続します。

  • 温湿度センサー DHT22
    [amazonjs asin=”B07CSNMYN7″ locale=”JP” title=”OSOYOO DHT22 デジタル 温度 湿度 センサー モジュール デジタル温湿度測定 ArduinoやRaspberry Pi 2 3電子工作用 2個セット”]
     
  • 大気圧センサーモジュール BMP280
    [amazonjs asin=”B074KBWYX8″ locale=”JP” title=”GAOHOU GY-BMP280-3.3高精度大気圧センサーモジュールArduino用”]
     
  • LiPoバッテリ 1200mAh
    [amazonjs asin=”B00IG0C9Y6″ locale=”JP” title=”AOLIKES 3.7V充電式交換用バッテリー1200mAh PL 603450 JST PH2.0コネクタ- for Bluetoothスピーカー、GPS、MP4、POS機、カメラなどの”]

 

運用状況

2021/9/22の朝から8Wソーラでの運用を再開いたしました。

気温が高く30度以上となるときに温湿度センサの値に乱れがありますが、おおむねよく測れています。

 

ソーラ発電電圧及びLiPoバッテリの電圧の状況は以下の通り

我が家のベランダは東向きで午前中しか直射日光が得られないのですが、
バッテリも良く充電されており ずーっと4V以上のフル充電で運用できています。

 

おわりに

現在までで12日以上動いてくれています。

バッテリ電圧の低減もなく発電量も十分なようです。
クリーンエネルギーによる電気代ゼロの気象データ測定システムが実現できたかもしれません。

あとは冬。ここは北海道

地獄の寒さで本システムがどうなるか非常に楽しみです。
(ヒータの検討しといたほうがいいかなぁ??? 🙄 )

追記

2021/10/17 運用25日経過

2021/11/4 運用43日経過

 

日照が無い日は当然バッテリ電圧低下していますが、日照時にしっかり充電できています。安心ですね。

2021/11/26 運用65日経過

2021/12/18 運用87日経過

次の記事

Arduino MKR WiFi 1010 ベランダ太陽光発電 気象システム 無事越冬

Arduino MKR WiFi 1010 をソーラで楽しむ 4 -ダイソーのソーラ再測-

前回は8Wソーラで運用したArduino MKR WiFi 1010気象データ測定計の温湿度センサの変更を報告いたしました。

Arduino MKR WiFi 1010 をソーラで楽しむ 3 -温湿度センサ変更-

更においじりしましたので報告いたします。

 

 

バッテリ配線修正

前回からしばらく運用していたところ電圧が不安定に低下する現象が発生しました。

そこでバッテリの配線をArduino MKR WiFi 1010のコネクタではなくジャンパを半田付けして接続することにしました。

 

そうしたところバッテリ電圧の低下現象は改善され、
メチャクチャ元気になって常にフルチャージ状態になりました。

 

実はArduino MKR WiFi 1010のコネクタとLiPoバッテリの端子の接触の悪さは当初から気になっており
以下のようにマスキングテープで固定しながら使用していました。。

屋外なめんなって話ですよね。

 

ダイソーのソーラで再測

バッテリの接触が改善され8Wソーラで常にフルチャージ状態になったので、
以前10日で終了してしまったダイソーソーラによる運用を再検証してみることにしました。

もしかしたらバッテリ接触不良のために長期運用ができなかった可能性があります。

結果

残念ながら前回同様にバッテリ電圧はグングン低下し 12日ちょいで停止しました(9/8  21:57 ~ 9/21  14:29)。
バッテリの接触の影響はさほど大きくなかったようです。。。

そもそも発電電圧が4V程度で低いですよね。
仮にダイソーソーラ(300円)を3個シリーズにして電圧を上げても、
コストが900円となり それであれば少しお金を足して性能明確なパネル使ったほうがいいですよねぇ。

 

前回 温湿度センサを変えましたが、やはり高温時に異常値示してますね。。。
温湿度センサは違うタイミングで変更検討します。

[amazonjs asin=”B07CSNMYN7″ locale=”JP” title=”OSOYOO DHT22 デジタル 温度 湿度 センサー モジュール デジタル温湿度測定 ArduinoやRaspberry Pi 2 3電子工作用 2個セット”]

 

おわりに

ここではバッテリの接続を改善して再度ダイソーソーラでArduino MKR WiFi 1010気象データ測定計を運用してみました。

残念ながらバッテリの接触の影響はそれほど大きくなく前回と同じような結果に終わりました。
結局 ダイソーソーラの2個シリーズでは発電量が足りないのです。

また8Wソーラで運用実験します。

[amazonjs asin=”B004GWY0J0″ locale=”JP” title=”6V用 8W 多結晶ソーラーパネル 6V システム系 6Vバッテリー充電 6V電源 6V機器”]

次の記事

Arduino MKR WiFi 1010 ベランダ太陽光発電 気象システム 無事越冬

Arduino MKR WiFi 1010 をソーラで楽しむ 3 -温湿度センサ変更-

前回はArduino MKR WiFi 1010を充電・駆動するダイソーのカワイイ ソーラパネルをガチの8Wパネルに変更して運用してみました。

Arduino MKR WiFi 1010 をソーラで楽しむ 1 -ベランダ気象データ測定-

[amazonjs asin=”B07FYFF5YZ” locale=”JP” title=”Arduino MKR WiFi 1010 ABX00023″]

ここでは温湿度センサを変更してみたので報告いたします。

 

 

温湿度センサ DHT11

これまでは温湿度センサとして以下のDHT11モジュールを使用してきました。

[bc url=”https://jp.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DHT11.html”]

 

以下はDHT11モジュールでベランダの温湿度を計測した結果です。

気温が30℃以上でデータが乱れております。

 

以下は気圧を追加してプロットしたグラフです。気圧は別センサで測定しています。

 

更に以下はソーラ電圧を追加してプロットしたグラフです。

 

上の二つのグラフから温湿度センサのデータの乱れは別センサやマイコンで測定した電圧との相関がないため、
温湿度センサ固有のものであると考えられます。

 

温湿度センサ DHT22

センサを変えてデータの乱れが改善されるか確認してみました。

DHT11より温度動作範囲が広いDHT22を試してみました。

[amazonjs asin=”B07CSNMYN7″ locale=”JP” title=”OSOYOO DHT22 デジタル 温度 湿度 センサー モジュール デジタル温湿度測定 ArduinoやRaspberry Pi 2 3電子工作用 2個セット”]

 

以下が変更時のベランダの温湿度測定結果です。

変更後も高温時に若干データの乱れが見えますね。。。なんだろコレ?
温度がピークを迎えてちょっと下がった時にデータが乱れているようにみえます。

もう少し様子見ますが札幌はどんどん気温が低下しているのでデータの乱れは観れないかもしれませんね。。。

しかし動作温度範囲の広いセンサになりましたので低温時も安心ですね。
冬はむしろマイコンやバッテリの動作が心配ですが。。

Arduino IDEコード

温湿度センサは以下のライブラリを使用させてもらっていたので
 https://github.com/adafruit/DHT-sensor-library

#define DHTTYPE DHT11 から
#define DHTTYPE DHT22
に変更するだけで動作しました。

 

動作

以下は8Wソーラに変更後の動作の様子です。

 

バッテリも順調に充電され4V付近をキープしています。 

 

おわりに

ここでは温湿度センサを変更してみました。

高温時に温湿度センサのデータの乱れがありセンサを変えてみましたが、改善はありましたが根絶はできませんでした。
故に原因も謎です。

今回は上位版のセンサを試したので、全く別のセンサも検討することを頭の片隅に置きつつ運用していきたいと思います。

これからは低温との戦いとなるかと思います。

次の記事

Arduino MKR WiFi 1010 をソーラで楽しむ 4 -ダイソーのソーラ再測-

Arduino MKR WiFi 1010 をソーラで楽しむ 2 -ソーラパネル変更-

前回はArduino MKR WiFi 1010をダイソーのソーラーで駆動して
気象データ測定計としてベランダに配置して運用してみました。

Arduino MKR WiFi 1010 をソーラで楽しむ 1 -ベランダ気象データ測定-

[amazonjs asin=”B07FYFF5YZ” locale=”JP” title=”Arduino MKR WiFi 1010 ABX00023″]

ここではその後の結果と進捗を報告させていただきます。

 

 

ダイソーソーラパネルでの運用

前回の構成での最終結果です。
10分おきに起床してLiPoバッテリ電圧とソーラ発電電圧と気象データ(温度、湿度、気圧)をUDP送信してスリープします。

8/17 22:48から08/27 2:11の約10日間 頑張って動作してくれました。

我が家のベランダの方角的に長時間の日照が得られないこととダイソーのカワイイソーラパネルの発電量では必要電力をまかなえず、徐々にバッテリ電圧が低下しています。

MKRWiFi1010 はWiFi OFFでSleepしても6V入力で15mAほど消費します。
WiFi通信時の電力無視して更にLiPoバッテリ(1200mAh)がフル充電してたとしても
3.7V × 1200mAh ÷ 6V × 15mA = 49.3h
と 約2日しか持たないはずなのでダイソーソーラはよく頑張ったと言えます。

[amazonjs asin=”B00IG0C9Y6″ locale=”JP” title=”AOLIKES 3.7V充電式交換用バッテリー1200mAh PL 603450 JST PH2.0コネクタ- for Bluetoothスピーカー、GPS、MP4、POS機、カメラなどの”]

 

得られた気象データは以下

 
気温が30℃以上になると温度、湿度共に乱れる結果となっています。

[bc url=”https://jp.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DHT11.html”]

今後 もっと温度動作範囲の高い温湿度センサを検討したいと考えております。

 

ソーラパネル変更

ソーラパネルの出力を上げることにしました。

開放電圧10.8V、8W出力のガチパネルを使用します。

[amazonjs asin=”B004GWY0J0″ locale=”JP” title=”6V用 8W 多結晶ソーラーパネル 6V システム系 6Vバッテリー充電 6V電源 6V機器”]

 

ソーラパネルだけを変えて同様にベランダで運用してみました。

Arduino MKR WiFi 1010のオフィシャルVin最大定格は6Vです。
実施の際は自己責任で宜しくお願い致します。

 

運用状況

取得データを以下に載せます。

 

バッテリ電圧の低下も観られず非常に順調に運用できています。
電気代ゼロの永久なる気象データ測定システムが実現できたかもしれません。
楽しみながら経過をみたいと思います。

 

おわりに

ソーラパネルを変更しての気象データ測定システム運用を開始いたしました。
経過をたのしみにみてゆく所存です。

温湿度計が高温時に異常値を示すので、冬の氷点下がやってくる前にセンサ変更検討したいです。

次の記事

Arduino MKR WiFi 1010 をソーラで楽しむ 3 -温湿度センサ変更-

Arduino MKR WiFi 1010 をソーラで楽しむ 1 -ベランダ気象データ測定-

今夏 Arduino MKR WiFi 1010が国内でも購入できるようになりましたね。
2, 3年前にでた製品だと思うのですが技適で発売が遅れに遅れたんでしょうね。恐らく。

[amazonjs asin=”B07FYFF5YZ” locale=”JP” title=”Arduino MKR WiFi 1010 ABX00023″]

 

 

Arduino MKR WiFi 1010 を購入

Arduino MKR WiFi 1010はWiFi/Bluetooth接続可能なArduino公式のマイコンです。
いまどきはWiFi/Bluetooth内蔵マイコンは珍しくなく強く欲しいとも思わなかったのですが、構成を紐解くと非常に興味深いパワーマネージメントICが載っていることがわかり購入に至りました。

Arduino公式マイコンなんて何年ぶりに手にしたことでしょう。

技適マークは箱にシールで貼ってあるだけでした(そんなんでいいんだ。。)

PMIC : BQ24195L

Arduino MKR WiFi 1010にはパワーマネージメントIC BQ24195Lが搭載されていました。

BQ24195Lはバッテリチャージコントローラとチャージ電圧を生成するDCDCコントローラが内蔵されたシステム電源です。

BQ24195Lの入力電源 (VBUS) の定格が22Vと高く可能性を感じArduino MKR WiFi 1010購入の決め手となりました。
(しかしArduino MKR WiFi 1010の電源入力推奨定格は6Vとなっております。)

参考

 

ソーラー発電で運用

入力耐圧が高くバッテリチャージ機能のあるシステム電源が載っているということで
ソーラー発電による運用を思い立ちました。

(前述の通りArduino MKR WiFi 1010のオフィシャルVin最大定格は6Vです。
実施の際は自己責任で宜しくお願い致します。)

構成

Arduino MKR WiFi 1010 に温湿度センサ、気圧計を接続しました。

  • Grove – 温度および湿度センサー (DHT11)
    [bc url=”https://jp.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DHT11.html”]
  • 大気圧センサーモジュール BMP280
    [amazonjs asin=”B074KBWYX8″ locale=”JP” title=”GAOHOU GY-BMP280-3.3高精度大気圧センサーモジュールArduino用”]
     
  • LiPoバッテリ 1200mAh
    [amazonjs asin=”B00IG0C9Y6″ locale=”JP” title=”AOLIKES 3.7V充電式交換用バッテリー1200mAh PL 603450 JST PH2.0コネクタ- for Bluetoothスピーカー、GPS、MP4、POS機、カメラなどの”]

 

 

ソーラパネルにはダイソーの300円ガーデンライトのものを2つシリーズにして使用しました。
ソーラ発電電圧は抵抗分圧してアナログ入力ピンで計測します。

動作概要

Arduino MKR WiFi 1010で検出したデータ(バッテリ電圧、ソーラ電圧、気圧、温湿度) を10分おきにUDPで自宅サーバに送信します。
ベランダに配置して運用します。

 

UDP送信後にWiFiを切ってスリープし10分後に起床しWiFi接続→UDP送信を繰り返します。

スリープ&WiFi OFFすることでかなり消費電力を減らすことができました。

消費電力はザックリ以下のような感じです(Vin = 6V)。
・WiFi ON:50 mA
・WiFi OFF:22 mA
・WiFi ON & スリープ:30mA
・WiFi OFF & スリープ:15mA

Arduino IDE コード

#include <WiFiNINA.h>
#include <WiFiUdp.h>
#include "DHT.h"
#include "ArduinoLowPower.h"
#include <BMP280_DEV.h>  

int status = WL_IDLE_STATUS;
#include "arduino_secrets.h" 
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID;        // your network SSID (name)
char pass[] = SECRET_PASS;    // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0;            // your network key index number (needed only for WEP)

unsigned int localPort = 2390;      // local port to listen on

char  ReplyBuffer[100] = "";       // a string to send back

WiFiUDP Udp;

#define DHTPIN 8 
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

float pressure;
BMP280_DEV bmp280;    

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(115200);
  bmp280.begin(BMP280_I2C_ALT_ADDR);
  bmp280.setPresOversampling(OVERSAMPLING_X4);    // Set the pressure oversampling to X4
  
  bmp280.startForcedConversion();
  bmp280.getCurrentPressure(pressure);
 
  // check for the WiFi module:
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // don't continue
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
    Serial.println("Please upgrade the firmware");
  }

  // attempt to connect to WiFi network:
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);
    
    WiFi.lowPowerMode();  // ENABLE WiFi Low Power Mode
    
    // wait 10 seconds for connection:
    delay(5000);
  }
  Serial.println("Connected to WiFi");
  printWifiStatus();

  Serial.println("\nStarting connection to server...");

}

void loop() {
  while (status != WL_CONNECTED) {
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);   
    WiFi.lowPowerMode();
    
    delay(500);
    Serial.println(status);
  }
  
  dht.begin();
  bmp280.startForcedConversion();
  bmp280.getCurrentPressure(pressure);
  delay(100);
    
  float Vb = analogRead(ADC_BATTERY) * (4.3 / 1023.0);
  float Vs = analogRead(A1)/1023.0*(69.0+10.0)/10.0*3.3;
  float h = dht.readHumidity();
  float t = dht.readTemperature();
    
  
  
  sprintf(ReplyBuffer,"Vbat:%.1f V, Vsol:%.2f V, %.1f hPa, Temp.:%.2f deg, Humi.:%.1f",Vb, Vs, pressure, t, h);

  Udp.begin(localPort);
  Udp.beginPacket("192.168.0.255", 2390);
  Udp.write(ReplyBuffer);
  Udp.endPacket();
  delay(100);

  status = WL_IDLE_STATUS;

  WiFi.end();

  LowPower.deepSleep(60000 * 10);
  
}


void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your board's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

 

参考

 

結果

数日運用してみました。

 

 

ダイソーのカワイイソーラーでは発電量が小さいらしくLiPoバッテリを充電できるほどではないようで無日照時に徐々にバッテリ電圧下がっています。何日もつかな 🙄 ?

我が家はベランダが東向きなので晴天時でも日照短いのがすこし悩みどころでもあります。

ベランダの気象データが取得でき大変興味深いです。
しかし温湿度センサが30℃超えると誤動作しているようです。。。
まぁ北海道は年の半分冬だしいいか。。。

 

おわりに

現在Arduino MKR WiFi 1010をソーラー駆動での気象データ測定計として運用中です。

Arduino MKR WiFi 1010というよりもうほとんどパワーマネージメントIC BQ24195Lの評価ボードとして楽しんでいる感もありますが、無線機能がやはり非常に便利です。

現状ですと徐々にバッテリ電圧が低下しているのでいつか落ちてしまうと思います。
次回はソーラパネルの検討を実施したいです。
また温湿度計もなにかいいものがあれば変更するかもしれません。

 

追記

2021/8/22

徐々にバッテリ電圧が低下しております。。

次の記事

Arduino MKR WiFi 1010 をソーラで楽しむ 3 -温湿度センサ変更-

ハムスター用 回し車カウンター製作

HomeMadeGarbageに新たなメンバーが増えました!

ゴールデンハムスターの「もち」ちゃんです(*´ω`*)

 

かわいい!!!!

 

家族みんな夢中になっています♪

 

 

ハムスターのもちちゃん

ペットショップで店員さんに色々教えてもらいながらケージやエサなどをそろえて
メンバーとしてお迎えさせていただきました。

まだ来たばかりなのでまずは環境に慣れてもらっている状態です。
昼間はほとんど寝ており、たまに起きてエサと水を飲むくらい
夜は活発になりずーっと回し車をクルクル回しています。

ハムスターは夜行性で一晩に数十キロも移動するとのことです。

 

回し車カウンター

夜にどれほど回し車を廻しているのか気になったので
“回し車カウンター”を製作してみました。

 

 
ESP32に磁気センサを付けて回し車につけた磁石を検出して回転をカウントする仕組みにしました。

 

  • 磁気センサ A1324LUA-T
    [bc url=”https://akizukidenshi.com/catalog/g/gI-07014/”]
  • ESP32
    [amazonjs asin=”B086WWNP9Y” locale=”JP” title=”VKLSVAN ESP32 ESP-32S NodeMCUマイクロUSBデュアルコア開発ボードモジュール 2.4GHz ワイヤレスWiFi + Bluetoothデュアルモード ESP-WROOM-32モジュール内臓 マイクロコントローラ”]
 

動作

回し車につけた磁石を磁気センサーで検出して回転をカウントして、
定期的にESP32でUDPで回転数をサーバに送っています。

 

測定データ

5分おきに回転数を取得しました。
 

 
21:00~5:00に爆走していることがわかりますww

一晩で14630回転もしておりました!
回し車の直径は約13cmですので、6.0kmも走っておりました。

 

おわりに

今回はもちちゃんをメンバーに迎えて、回し車の回転数から夜の活動を観てみました。

おいおいロードセルなどで床上の移動量なども観れればいいなと考えております。

MakePython ESP32 Color LCD で 動画をWiFi受信 ー ScreenShotReceiver ー

前回は Makerfabs 様よりいただいたMakePython ESP32 Color LCD
ディスプレイにLovyanGFXライブラリをもちいてアニメーションを表示してみました。

Makerfabs製品を提供いただきました

せっかくESP32が搭載されておりますので、今回はWiFiでの動画の受信を試してみました。

 

 

ScreenShotReceiver

ここではらびあんさんのScreenShotReceiverを使用してWiFiでの動画受信を試しました。

凄いですよね。これ。。。

ScreenShotReceiverとは

“PCの画面をJPEGにしてTCPで送信し、M5Stack/ESP32で受信して表示”するアプリケーションです。

以下でWindows用送信アプリと受信Arduinoサンプルコードがダウンロードできます。
 https://github.com/lovyan03/ESP32_ScreenShotReceiver

受信Arduinoサンプルコード (ScreenShotReceiver)

以下のESP32向けのArduinoコードをダウンロードしてMakePython ESP32 Color LCDに書き込みます。
 https://github.com/lovyan03/ESP32_ScreenShotReceiver/tree/master/ScreenShotReceiver

 
以下のライブラリも必要となりますので導入しておきます。

 
MakePython ESP32 Color LCDに搭載されたカラーLCD ST7789 (240 × 240)向けに設定します。
SPI設定にはTFT_eSPIが利用されていますので、TFT_eSPIライブラリのUser_Setup.h ファイルを編集します。

//                            USER DEFINED SETTINGS
//   Set driver type, fonts to be loaded, pins used and SPI control method etc
//
//   See the User_Setup_Select.h file if you wish to be able to define multiple
//   setups and then easily select which setup file is used by the compiler.
//
//   If this file is edited correctly then all the library example sketches should
//   run without the need to make any more changes for a particular hardware setup!
//   Note that some sketches are designed for a particular TFT pixel width/height


// ##################################################################################
//
// Section 1. Call up the right driver file and any options for it
//
// ##################################################################################

// Define STM32 to invoke optimised processor support (only for STM32)
//#define STM32

// Defining the STM32 board allows the library to optimise the performance
// for UNO compatible "MCUfriend" style shields
//#define NUCLEO_64_TFT
//#define NUCLEO_144_TFT

// STM32 8 bit parallel only:
// If STN32 Port A or B pins 0-7 are used for 8 bit parallel data bus bits 0-7
// then this will improve rendering performance by a factor of ~8x
//#define STM_PORTA_DATA_BUS
//#define STM_PORTA_DATA_BUS

// Tell the library to use 8 bit parallel mode (otherwise SPI is assumed)
//#define TFT_PARALLEL_8_BIT

// Display type -  only define if RPi display
//#define RPI_DISPLAY_TYPE // 20MHz maximum SPI

// Only define one driver, the other ones must be commented out
//#define ILI9341_DRIVER
//#define ST7735_DRIVER      // Define additional parameters below for this display
//#define ILI9163_DRIVER     // Define additional parameters below for this display
//#define S6D02A1_DRIVER
//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI
//#define HX8357D_DRIVER
//#define ILI9481_DRIVER
//#define ILI9486_DRIVER
//#define ILI9488_DRIVER     // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high)
#define ST7789_DRIVER      // Full configuration option, define additional parameters below for this display
//#define ST7789_2_DRIVER    // Minimal configuration option, define additional parameters below for this display
//#define R61581_DRIVER
//#define RM68140_DRIVER
//#define ST7796_DRIVER

// Some displays support SPI reads via the MISO pin, other displays have a single
// bi-directional SDA pin and the library will try to read this via the MOSI line.
// To use the SDA line for reading data from the TFT uncomment the following line:

// #define TFT_SDA_READ      // This option is for ESP32 ONLY, tested with ST7789 display only

// For ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display
// Try ONE option at a time to find the correct colour order for your display

//  #define TFT_RGB_ORDER TFT_RGB  // Colour order Red-Green-Blue
//  #define TFT_RGB_ORDER TFT_BGR  // Colour order Blue-Green-Red

// For M5Stack ESP32 module with integrated ILI9341 display ONLY, remove // in line below

// #define M5STACK

// For ST7789, ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation
// #define TFT_WIDTH  80
// #define TFT_WIDTH  128
 #define TFT_WIDTH  240 // ST7789 240 x 240 and 240 x 320
// #define TFT_HEIGHT 160
// #define TFT_HEIGHT 128
 #define TFT_HEIGHT 240 // ST7789 240 x 240
// #define TFT_HEIGHT 320 // ST7789 240 x 320

// For ST7735 ONLY, define the type of display, originally this was based on the
// colour of the tab on the screen protector film but this is not always true, so try
// out the different options below if the screen does not display graphics correctly,
// e.g. colours wrong, mirror images, or tray pixels at the edges.
// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this
// this User_Setup file, then rebuild and upload the sketch to the board again:

// #define ST7735_INITB
// #define ST7735_GREENTAB
// #define ST7735_GREENTAB2
// #define ST7735_GREENTAB3
// #define ST7735_GREENTAB128    // For 128 x 128 display
// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset)
// #define ST7735_REDTAB
// #define ST7735_BLACKTAB
// #define ST7735_REDTAB160x80   // For 160 x 80 display with 24 pixel offset

// If colours are inverted (white shows as black) then uncomment one of the next
// 2 lines try both options, one of the options should correct the inversion.

// #define TFT_INVERSION_ON
// #define TFT_INVERSION_OFF


// ##################################################################################
//
// Section 2. Define the pins that are used to interface with the display here
//
// ##################################################################################

// If a backlight control signal is available then define the TFT_BL pin in Section 2
// below. The backlight will be turned ON when tft.begin() is called, but the library
// needs to know if the LEDs are ON with the pin HIGH or LOW. If the LEDs are to be
// driven with a PWM signal or turned OFF/ON then this must be handled by the user
// sketch. e.g. with digitalWrite(TFT_BL, LOW);

// #define TFT_BL   32            // LED back-light control pin
// #define TFT_BACKLIGHT_ON HIGH  // Level to turn ON back-light (HIGH or LOW)



// We must use hardware SPI, a minimum of 3 GPIO pins is needed.
// Typical setup for ESP8266 NodeMCU ESP-12 is :
//
// Display SDO/MISO  to NodeMCU pin D6 (or leave disconnected if not reading TFT)
// Display LED       to NodeMCU pin VIN (or 5V, see below)
// Display SCK       to NodeMCU pin D5
// Display SDI/MOSI  to NodeMCU pin D7
// Display DC (RS/AO)to NodeMCU pin D3
// Display RESET     to NodeMCU pin D4 (or RST, see below)
// Display CS        to NodeMCU pin D8 (or GND, see below)
// Display GND       to NodeMCU pin GND (0V)
// Display VCC       to NodeMCU 5V or 3.3V
//
// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin
//
// The DC (Data Command) pin may be labeled AO or RS (Register Select)
//
// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more
// SPI devices (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin
// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.
//
// The NodeMCU D0 pin can be used for RST
//
//
// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin
// If 5V is not available at a pin you can use 3.3V but backlight brightness
// will be lower.


// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP8266 SETUP ######

// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
//#define TFT_CS   PIN_D8  // Chip select control pin D8
//#define TFT_DC   PIN_D3  // Data Command control pin
//#define TFT_RST  PIN_D4  // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST  -1    // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V

//#define TFT_BL PIN_D1  // LED back-light (only for ST7789 with backlight control pin)

//#define TOUCH_CS PIN_D2     // Chip select pin (T_CS) of touch screen

//#define TFT_WR PIN_D2       // Write strobe for modified Raspberry Pi TFT only


// ######  FOR ESP8266 OVERLAP MODE EDIT THE PIN NUMBERS IN THE FOLLOWING LINES  ######

// Overlap mode shares the ESP8266 FLASH SPI bus with the TFT so has a performance impact
// but saves pins for other functions. It is best not to connect MISO as some displays
// do not tristate that line wjen chip select is high!
// On NodeMCU 1.0 SD0=MISO, SD1=MOSI, CLK=SCLK to connect to TFT in overlap mode
// On NodeMCU V3  S0 =MISO, S1 =MOSI, S2 =SCLK
// In ESP8266 overlap mode the following must be defined

//#define TFT_SPI_OVERLAP

// In ESP8266 overlap mode the TFT chip select MUST connect to pin D3
//#define TFT_CS   PIN_D3
//#define TFT_DC   PIN_D5  // Data Command control pin
//#define TFT_RST  PIN_D4  // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST  -1  // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V


// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP   ######

// For ESP32 Dev board (only tested with ILI9341 display)
// The hardware SPI can be mapped to any pins

#define TFT_MISO 12
#define TFT_MOSI 13
#define TFT_SCLK 14
#define TFT_CS   15  // Chip select control pin
#define TFT_DC   22  // Data Command control pin
#define TFT_RST  21  // Reset pin (could connect to RST pin)
#define TFT_BL   5
//#define TFT_RST  -1  // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST

//#define TOUCH_CS 21     // Chip select pin (T_CS) of touch screen

//#define TFT_WR 22    // Write strobe for modified Raspberry Pi TFT only

// For the M5Stack module use these #define lines
//#define TFT_MISO 19
//#define TFT_MOSI 23
//#define TFT_SCLK 18
//#define TFT_CS   14  // Chip select control pin
//#define TFT_DC   27  // Data Command control pin
//#define TFT_RST  33  // Reset pin (could connect to Arduino RESET pin)
//#define TFT_BL   32  // LED back-light (required for M5Stack)

// ######       EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP        ######

// The library supports 8 bit parallel TFTs with the ESP32, the pin
// selection below is compatible with ESP32 boards in UNO format.
// Wemos D32 boards need to be modified, see diagram in Tools folder.
// Only ILI9481 and ILI9341 based displays have been tested!

// Parallel bus is only supported for the STM32 and ESP32
// Example below is for ESP32 Parallel interface with UNO displays

// Tell the library to use 8 bit parallel mode (otherwise SPI is assumed)
//#define TFT_PARALLEL_8_BIT

// The ESP32 and TFT the pins used for testing are:
//#define TFT_CS   33  // Chip select control pin (library pulls permanently low
//#define TFT_DC   15  // Data Command control pin - must use a pin in the range 0-31
//#define TFT_RST  32  // Reset pin, toggles on startup

//#define TFT_WR    4  // Write strobe control pin - must use a pin in the range 0-31
//#define TFT_RD    2  // Read strobe control pin

//#define TFT_D0   12  // Must use pins in the range 0-31 for the data bus
//#define TFT_D1   13  // so a single register write sets/clears all bits.
//#define TFT_D2   26  // Pins can be randomly assigned, this does not affect
//#define TFT_D3   25  // TFT screen update performance.
//#define TFT_D4   17
//#define TFT_D5   16
//#define TFT_D6   27
//#define TFT_D7   14


// ##################################################################################
//
// Section 3. Define the fonts that are to be used here
//
// ##################################################################################

// Comment out the #defines below with // to stop that font being loaded
// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not
// normally necessary. If all fonts are loaded the extra FLASH space required is
// about 17Kbytes. To save FLASH space only enable the fonts you need!

#define LOAD_GLCD   // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2  // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4  // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6  // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7  // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8  // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF  // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts

// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded
// this will save ~20kbytes of FLASH
#define SMOOTH_FONT


// ##################################################################################
//
// Section 4. Other options
//
// ##################################################################################

// Define the SPI clock frequency, this affects the graphics rendering speed. Too
// fast and the TFT driver will not keep up and display corruption appears.
// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)
// With an ILI9163 display 27 MHz works OK.

// #define SPI_FREQUENCY   1000000
// #define SPI_FREQUENCY   5000000
// #define SPI_FREQUENCY  10000000
// #define SPI_FREQUENCY  20000000
   #define SPI_FREQUENCY  27000000 // Actually sets it to 26.67MHz = 80/3
// #define SPI_FREQUENCY  40000000
// #define SPI_FREQUENCY  80000000

// Optional reduced SPI frequency for reading TFT
#define SPI_READ_FREQUENCY  20000000

// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here:
#define SPI_TOUCH_FREQUENCY  2500000

// The ESP32 has 2 free SPI ports i.e. VSPI and HSPI, the VSPI is the default.
// If the VSPI port is in use and pins are not accessible (e.g. TTGO T-Beam)
// then uncomment the following line:
//#define USE_HSPI_PORT

// Comment out the following #define if "SPI Transactions" do not need to be
// supported. When commented out the code size will be smaller and sketches will
// run slightly faster, so leave it commented out unless you need it!

// Transaction support is needed to work with SD library but not needed with TFT_SdFat
// Transaction support is required if other SPI devices are connected.

// Transactions are automatically enabled by the library for an ESP32 (to use HAL mutex)
// so changing it here has no effect

// #define SUPPORT_TRANSACTIONS

 

起動

書き込みが完了し起動すると”WiFi接続を試行し、接続できない場合はSmartConfigが起動します。”

 

 

SmartConfig

SmartConfigとはESP32をWiFiのアクセスポイントとして、スマホからWiFi設定を実行する機能です。
Android用スマホアプリは以下でインストールできます。

[bc url=”https://play.google.com/store/apps/details?id=com.khoazero123.iot_esptouch_demo&hl=ja”]

 
SmartConfigアプリでWiFi設定しESP32をWiFi接続します。

 

接続が完了するとディスプレイにIPアドレスが表示されます。

 

参考

Windows用 送信アプリ (ScreenShotSender)

送信アプリ ScreenShotSender.exe を起動します。
設定ウィンドウと送信範囲指定ウィンドウが立ち上がります。

 

 
“画像の幅・高さ・画質の各パラメータとJPEG化する範囲が設定できます
受信側のIPアドレスを入力して接続すると、Windowsの画面の一部がLCDに表示されます。”

 

動作

 

画質クオリティ60%でFSP 28ほどで送信できています。
凄い!これは非常に便利。

あとMakePython ESP32 Color LCD に搭載されているカラーLCD ST7789の画像がきれい!視野角も広いし。

 

速度改善

らびあんさんより速度改善方法を教えていただきました。

   

~\Arduino15\packages\esp32\hardware\esp32\1.0.4\tools\sdk\lib\libdriver.a
内のの5A 62 02 を B4 C4 04にバイナリエディタで変更でSPI 80MHzが可能になるとのことでした。

 
上記修正を施して、User_Setup.h ファイルで
 #define SPI_FREQUENCY 27000000 → #define SPI_FREQUENCY 80000000
に変更して動作させてみました。

FPS 40以上で送受信できるようになりました!!

おわりに

らびあんさんの ScreenShotReceiver を使用させていただき、
MakePython ESP32 Color LCD で 動画をWiFi受信を楽しむことができました。

凄くサクサク受信・表示できて驚きました!
これはまたまたいろいろ応用ができそうで楽しみです 😛 

追記

ESP32_ScreenShotReceiver 更新 (2020/6/30)

ScreenShotReceiver に更新があり、LCD SPI設定がTFT_eSPI依存であったのを
らびやんさんのグラフィックライブラリ LovyanGFXで設定できるようになりました。

詳細は以下の記事を参照ください。

MakePython ESP32 Color LCD で ESP32 ScreenShotReceiver を楽しむ

Blynk 新ウィジェット Image Gallery

いつのまにやらBlynkに新たなウィジェットが追加されておりました!
Image Galleryといって、なにやら画像をコントロールできるとのことで早速試してみました。

構成

マイコンにはESP32を使用して、可変抵抗値をWiFiでBlynkに送って画像を動かしてみます。

部品

  • BLE、WiFi内蔵マイコンボード ESP32-DevKitC
    [amazonjs asin=”B06XWP81GP” locale=”JP” title=”waves ESP32 DevKitC V4 ESP-WROOM-32 ESP-32 WiFi BLE 技適取得済 国内発送”]
     
  • つまみの大きい半固定抵抗 10KΩ
    [bc url=”https://www.switch-science.com/catalog/1039/”]

Blynk設定

スマホとESP32ボードはスマホアプリのBlynkを用いてWiFi通信させます。Blynkアプリのバージョンは2.27.1。

新規プロジェクトを作成します。HARDWRE MODELはESP32 Dev Boardを選択。CONNECTION TYPEはWiFiを選択。AUTH TOKENはArduinoコード生成時に使用します(メールで送信されます)。
 

今回の目玉であるImage Galleryウィジェットを配置します。
 
 

Image GalleryウィジェットでINPUTでヴァーチャルピンV0を選択します。
“+ Add Image URL”で以下の5つの絵のURLを指定します。画像は弊ブログサーバにアップしました。
 

ヴァーチャルピンV0に1〜5が入力されると画像[1]〜[5]が選択されて表示されます。

Arduino IDEコード

以下のBlynkのArduino用ライブラリを使用してプログラムしました。バージョンは0.5.4。
 https://github.com/blynkkk/blynk-library

ESP32のArduino環境セットアップなどについては以下参照ください。

LEDテープ比較 Neopixel vs Dotstar -球体POV製作への道 その7-

 
[スケッチの例] -> [Blynk] -> [Boards_WiFi]-> [ESP32_WiFi]を参考にコード生成しました。

#define BLYNK_PRINT Serial

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "BlynkアプリのYourAuthTokenを入力";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "WiFiのSSID";
char pass[] = "パスワード";

BlynkTimer timer;
int val;

void setup() {
  // Debug console
  Serial.begin(9600);

  Blynk.begin(auth, ssid, pass);
  timer.setInterval(100L, sendUptime);
}

void sendUptime() {
  val = map(analogRead(34), 0, 4096, 1, 6);
  Serial.println(val);
  Blynk.virtualWrite(V0, val);
}

void loop() {
  Blynk.run();
  timer.run();
}

100msec毎に可変抵抗値を読んで、値を1〜5に正規化してヴァーチャルピンV0に書き込みます。

動作

可変抵抗を動かすと画像が切り替わっています!

Image Gallery ウィジェットかなり面白い応用ができそうですね。センサ値でオリジナルのメータ動かすとか。いろいろ試してみたいですな。

Blynk で ESP32 と ESP8266 同時制御 -球体POV製作への道 その9-

またもや前回から大幅に時間があいてしまった。。。
そういう訳で球体POV(Persistence of Vision) 製作の時間です。
残像で映像を生成する装置です。
回転部と固定部を無線で情報やり取りしてみたいという発想です。はい。

前回は改めて制御マイコンから見直してWiFiBLEを搭載したESP32の検討をしてみました。
ESP32WiFiでスマホと通信、BLEで他のBLE搭載マイコンと通信するPOV装置をと思ったのですが、ESP32Arduino IDE向けBLEライブラリが今のところイケてないので。。。

方針変更!

ESP32ESP8266WiFi介してスマホアプリBlynkで直接制御してマイコン間の直接通信はしない方向に転換しました。
BLEを使用しないのにESP32を採用した理由はESP8266はアナログ入力ピンが1個しかなく、しかも1V以上印加できないため。。。。

Blynkで複数のマイコンを制御する際は以下の記事で紹介したBridge機能を使用します。

Blynkを用いたデバイス間通信 – Bridge Widget –

ここでは基本構成・動作の確認を実施しました!

構成

Blynkアプリで以下を実施

    • ESP32ボードに接続されたLEDの色を制御
    • ESP8266に接続されたデジタルポテンショメータを制御しモータ回転スピードを変える
    • モータに羽をつけてESP32ボードに接続されたフォトリフレクタで回転数計算してBlynk側に送信
フォトリフレクタでモータの羽の通過をセンシング

部品

  • BLE、WiFiマイコンESP32開発ボード ESP32-DevKitC
    ESP32の設定など詳細は以下の記事を参照ください
     https://homemadegarbage.com/pov-sphere08

    [amazonjs asin=”B08FMFSSSM” locale=”JP” title=”waves 5個 ESP32 DevKitC V4 ESP-WROOM-32 ESP-32 WiFi BLE 技適取得済”]
     
  • LEDテープ Dotstar
    高速リフレッシュレート(PWMの周期)19.2kHzでPOV向き!詳細は以下!
     https://homemadegarbage.com/pov-sphere07
    [amazonjs asin=”B01N0B0ROZ” locale=”JP” title=”ADAFRUIT DotStarデジタルLEDストリップ 青/緑/赤 0.5m ID:2329″]
     
  • フォトリフレクタ QTR-1A
    モータに羽をつけてフォトリフレクタで回転数を測定。
    Arduino用ライブラリは以下。
     https://github.com/pololu/qtr-sensors-arduino
    [bc url=”https://www.switch-science.com/catalog/1588/”]
     
  • WiFiマイコンESP8266開発ボード ESPr Developer
    ESPr DeveloperをArduino IDEで開発する方法は以下のとおり
     http://trac.switch-science.com/wiki/esp_dev_arduino_ide
    [amazonjs asin=”B01MRAEHTT” locale=”JP” title=”ESPr Developer(USBシリアル変換なし)”]
     
  • デジタルポテンショメータ MCP4131
    SPI信号で抵抗値(0~10kohm)を制御出来る。Arduinoコードは以下を参考にしました。
     http://www.learningaboutelectronics.com/Articles/MCP4131-digital-potentiometer-circuit.php
    [bc url=”https://www.switch-science.com/catalog/1056/”]
     
  • PWMコントローラ
    モータへ供給する電圧を制御する付属の可変抵抗をデジタルポテンショメータに差し替え
    [amazonjs asin=”B074PL42FY” locale=”JP” title=”Hommy 12V 24V 30V 120W PWM調整可能なボルトDCモーター速度コントローラCCM2″]

Blynk設定

Bridge機能を使用するためBlynkアプリを2つ作成しAUTH TOKENを2個取得します。ESP32用のアプリはウェジットを配置し、ESP8266用のアプリはAUTH TOKEN取得のみで特に何もしません。

以下はESP32用のアプリの設定です。

新規プロジェクトを作成します。HARDWRE MODELはESP32 Dev Boardを選択。CONNECTION TYPEはWiFiを選択。AUTH TOKENはArduinoコード生成時に使用します(メールで送信されます)。

モータスピード設定用のSliderウェジット、モータ回転数表示用のLabeled Valueウェジット、LEDカラー制御用のzeRGBaウィジェットを配置

モータスピード設定用のSliderウェジットです。最小値0、最大値3としました。
SEND ON RELEASEはOFFにして随時データ送信できるようにします。
ここではヴァーチャルピンV1に出力するようにしました。この値をBridge機能でESP8266側に送ります。

モータ回転数表示用のLabeled Valueウェジットです。ヴァーチャルピンV3で値を受けて単位[rpm]をつけて表示します。

zeRGBaウィジットでLEDの色を設定できるようにします。
OUTPUTはMERGEを選択。それぞれ最小値0、最大値255とします。
SEND ON RELEASEはOFFにして随時データ送信できるようにします。
ここではヴァーチャルピンV2に出力するようにしました。

Arduino IDEコード

BlynkのArduino用 最新ライブラリは以下にあります。
 https://github.com/blynkkk/blynk-library

ESP32用コード

[スケッチの例] -> [Blynk] -> [Boards_WiFi] -> [ESP32_WiFi]を参考にコード生成しました。

#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

#include <SPI.h>
#include <QTRSensors.h>
#include <Adafruit_DotStar.h>

WidgetBridge bridge1(V0); //Initiating Bridge Widget on V0 of ESP32用アプリ

//ESP32用Blynkアプリで取得したAuth Tokenを入力
char auth[] = "ESP32用 AuthToken";

//WiFiのSSID、パスワード指定
char ssid[] = "WiFiのSSID";
char pass[] = "パスワード";

int Value = 0;

//LED設定
#define Brightness 30 //LED輝度
#define NUMPIXELS 11 // Number of LEDs in strip
#define DATAPIN    12
#define CLOCKPIN   14

Adafruit_DotStar strip = Adafruit_DotStar(NUMPIXELS, DATAPIN, CLOCKPIN, DOTSTAR_BGR);

int ledR = 0;
int ledG = 0;
int ledB = 0;


//フォトリフレクタ QTR-1A設定
#define NUM_SENSORS             1  // number of sensors used
#define NUM_SAMPLES_PER_SENSOR  1  // average samples per sensor reading
#define EMITTER_PIN             QTR_NO_EMITTER_PIN  // 単体ではエミッタピン無し
QTRSensorsAnalog qtra((unsigned char[]) {34}, NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN);

unsigned int sensorValues[NUM_SENSORS];
unsigned long Time, mSpeed;
int QTRstate = 0;
int rpm = 0;

void setup() {
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);

  strip.begin(); // Initialize pins for output
  strip.setBrightness(Brightness);
  strip.show();
}

BLYNK_CONNECTED() {
  //ESP8266用Blynkアプリで取得したAuth Tokenを入力
  bridge1.setAuthToken("ESP8266用 AuthToken"); 
}

//Motor Speed Slider値 Get
BLYNK_WRITE(V1) {
  Value = param.asInt(); //Motor Speed Slider値
  Serial.print("V1 Slider value is: ");
  Serial.println(Value);
  
  // ESP8266側にSliderの値を送信
  bridge1.virtualWrite(V5, Value); 
}

//ZERGBAウィジット ヴァーチャルピンV2
BLYNK_WRITE(V2) {
  ledR = param[0].asInt();
  ledG = param[1].asInt();
  ledB = param[2].asInt();
  Serial.print("ledR: ");
  Serial.print(ledR);
  Serial.print(" ledG: ");
  Serial.print(ledG);
  Serial.print(" ledB: ");
  Serial.println(ledB);

  //LED点灯
  for(int i=0;i<NUMPIXELS;i++){
    strip.setPixelColor(i, strip.Color(ledR, ledG, ledB));
  }
  strip.show();
}

void loop() {
  Blynk.run();

  //フォトリフレクタ値取得
  qtra.read(sensorValues);
  Serial.print("qtra: ");
  Serial.println(sensorValues[0]);
  
  if(sensorValues[0] < 2500 && QTRstate == 0){
    QTRstate = 1;
    mSpeed = micros()-Time;
    Time = micros();
    rpm = 60.0/mSpeed * 1e6;
    //計算した回転数をLabeled Valueウェジットに表示
    Blynk.virtualWrite(V3, rpm);
  }

  if(sensorValues[0] > 3900 && QTRstate == 1){
    QTRstate = 0;
  }
}

ESP8266用コード

[スケッチの例] -> [Blynk] -> [Boards_WiFi] -> [ESP8266_Standslone]を参考にコード生成しました。

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SPI.h>

//ESP8266用Blynkアプリで取得したAuth Tokenを入力
char auth[] = "ESP8266用 AuthToken";

//WiFiのSSID、パスワード指定
char ssid[] = "WiFiのSSID";
char pass[] = "パスワード";

int Value = 0;
int CS = 15; // SCK = 14, MOSI = 13, (MISO =12)

//Motor Speed Slider値 Get
BLYNK_WRITE(V5) {
  //Motor Speed Slider値 from ESP32用Blynkアプリ
  Value = param.asInt(); 
  Serial.print("V5 Bridge value is: ");
  Serial.println(Value);

  //デジタルポテンショメータSPI書き込み
  digitalWrite(CS, LOW);
  SPI.transfer(0); //MCP4131アドレス
  SPI.transfer(Value);
  digitalWrite(CS, HIGH);
}

void setup() {
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
  
  pinMode (CS, OUTPUT);
  SPI.begin();
}

void loop() {
  Blynk.run();
}

動作

 

#blynk で #esp8266 と #esp32 制御

Home Made Garbageさん(@homemadegarbage)がシェアした投稿 –

これでなんとか基本構成が実現できました。あとは球体POVをどう構築するか。。。。
乞うご期待。。。。

震えて待て!

010010100000010100101111010111101010001
卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍卍

次の記事

球体POVつくってみた -球体POV製作への道 その10-

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

前回Raspberry Pi Zero Wでサーボモータを制御してみてラズパイでなにかしらを制御するのはシンドいなぁという感想を得たのですが。。。デジタル信号制御なら問題ないだろということで、I2C入力のモータドライバでラジコン作りました。

Raspberry Pi Zero W と Blynk で サーボモータ制御

ここではスマホアプリ Blynk とラズパイでI2C入力のモータドライバを介してモータをコントロールします。

構成

部品

  • Raspberry Pi Zero W

    スイッチサイエンス Raspberry Pi Zero W ケースキット
    価格:2808円(税込、送料別) (2018/11/14時点)

    楽天で購入
  • モバイルバッテリー
    ON/OFFボタンがついていて負荷がなくてもスリープしないので便利です。
    [amazonjs asin=”B018KD0D82″ locale=”JP” title=”cheero Canvas 3200mAh IoT機器対応 モバイルバッテリー ホワイト CHE-061″]
     
  • I2Cモータードライバ・モジュール DRV8830
    [bc url=”https://strawberry-linux.com/catalog/items?code=12030″]

  • 円形ロボットシャーシキット
    [amazonjs asin=”B07DNTV1G2″ locale=”JP” title=”円形ロボットシャーシキット(二層・タイヤ付き)”]
    [amazonjs asin=”B01H6WZDO2″ locale=”JP” title=”ホビー用ギアドモーター(2個入)”]

I2Cモータードライバ・モジュール DRV8830

I2C入力によって、モータ供給電圧(スピード)と供給電圧方向(回転方向)を制御します。円形ロボットシャーシキットの左右のモータを制御するため2個のモジュールを使用しました。

I2Cアドレス設定

2個のモジュールを制御する必要がありますので、それぞれ異なるI2Cアドレスを設定します。

本モジュールは基板上のジャンパA1, A0のステートによって以下の表のようにアドレスを指定することができます。

表のアドレスxは読み込み時には1、書き込み時は0をしてします。ここでは書き込みのみ使用します。左モータ用モジュールのジャンパを両方GND (アドレス:0x60)、右モータ用モジュールのジャンパを両方Open (アドレス:0x64)としました。

書き込みI2Cデータ

アドレス0x00に8bitの情報を書き込むことでモータを制御します。
各ビットの設定は以下の通り

 

blynk設定

ここではblynk の2個のジョイスティックのx軸を使用して左右のモータを制御します。

新規プロジェクトを作成します。ハードウェアはラズパイ zeroがまだないのでとりあえずRaspberry Pi 3Bを選択。Conection TypeにはWiFiを指定します。
AUTH TOKENはコードコンパイル時に使用しますのでメール送信してメモしておきます。

ウィジェットとしてジョイスティックを2個配置します。

2個のジョイスティックの設定はそれぞれのx軸をヴァーチャルピンV0, V1に出力させ、値は-63~63としました。

プログラム

サーボ制御同様にC++を採用しました。

Blynkライブラリインストール

ラズパイにBlynkライブラリをインストールします。
詳細は https://github.com/blynkkk/blynk-library/tree/master/linux 通りでターミナルを起動して

$ git clone https://github.com/blynkkk/blynk-library.git

でOK

ラズパイI2C有効化

Raspberry Piの設定を開きインターフェースのタグでI2Cの有効を選択しRebootします。

C++プログラミング

Blynkライブラリがインストールされるとホームにblynk-library/linuxフォルダが生成されます。linuxフォルダをコピーするなどして、その中のmain.cppを以下のように書き換えます。

#define BLYNK_PRINT stdout

#ifdef RASPBERRY
#include <BlynkApiWiringPi.h>
#else
#include <BlynkApiLinux.h>
#endif
#include <BlynkSocket.h>
#include <BlynkOptionsParser.h>

#include <wiringPiI2C.h>

static BlynkTransportSocket _blynkTransport;
BlynkSocket Blynk(_blynkTransport);
#include <BlynkWidgets.h>

int motorL = 0x60;
int motorR = 0x64;

int rot = 0;

//モータドライバ I2C制御 motor driver I2C
//参考:http://makers-with-myson.blog.so-net.ne.jp/2014-05-15
void writeMotorResister(int motor,int rot, int vset){
    int vdata = vset << 2 | rot;
    int fd = wiringPiI2CSetup(motor);
    int result = wiringPiI2CWriteReg8(fd, 0x00, vdata);
}

//ジョイスティックL x軸(V0)値受信
BLYNK_WRITE(V0) {
    int x = param[0].asInt();
    printf("L value: %d\n", x);
    
    //I2C書き込み
    if(x > 0){
        writeMotorResister(motorL, 1, abs(x)); //前進
    } else if(x < 0){
        writeMotorResister(motorL, 2, abs(x)); //後進
    } else{
        writeMotorResister(motorL, 0, 0); //スタンバイ
     }
} 

//ジョイスティックR x軸(V1)値受信
BLYNK_WRITE(V1) {
    int x = param[0].asInt();
    printf("R value: %d\n", x);
    
    //I2C書き込み
    if(x > 0){
        writeMotorResister(motorR, 1, abs(x)); //前進
    } else if(x < 0){
        writeMotorResister(motorR, 2, abs(x)); //後進
    } else{
        writeMotorResister(motorR, 0, 0); //スタンバイ
     }
}

void setup(){

}

void loop(){
    Blynk.run();
}

int main(int argc, char* argv[]){
    const char *auth, *serv;
    uint16_t port;
    parse_options(argc, argv, auth, serv, port);
    
    Blynk.begin(auth, serv, port);
    
    setup();
    
    while(true) {
        loop();
    }
    
    return 0;
}

BlynkのV0, V1で値を受けてモータの回転方向とスピードを制御しています。

wiringPiのI2Cライブラリを使用しています。

コンパイル

main.cppのあるフォルダに移動して以下を実行。

$ make clean all target=raspberry 

Blynk実行

つづいて以下を実行

$ sudo ./blynk –token=Blynkアプリで取得したAuthToken 

上図のようにReadyで準備OK!
 

動作

 

#ラズパイ 単体でラジコン #blynk

Home Made Garbageさん(@homemadegarbage)がシェアした投稿 –

いい感じ!デジタル通信による制御であればラズパイでも問題なく色々できそうです♪

ESP32 と Blynk と 円形ロボットシャーシキット と

かわいい円形ロボットシャーシキットをAdafruitで購入したので、ESP32載っけて Blynk でWiFiラジコンつくりました♪

構成

部品

  • BLE、WiFi内蔵マイコンボード ESP32-DevKitC
    [amazonjs asin=”B06XWP81GP” locale=”JP” title=”waves ESP32-DevKitC ESP-WROOM-32 ESP32 DevKitC V2 WiFi BLE 技適取得済 国内発送”]
  • モータドライバDRV8835
    [amazonjs asin=”B00R7EKBQA” locale=”JP” title=”デュアルモータードライバDRV8835″]
  • リチウムイオンポリマー電池400mAh
    [amazonjs asin=”B073FBMVQ9″ locale=”JP” title=”リチウムイオンポリマー電池400mAh”]

  • モバイルバッテリー
    [amazonjs asin=”B018KD0D82″ locale=”JP” title=”cheero Canvas 3200mAh IoT機器対応 モバイルバッテリー ホワイト CHE-061″]
     
  • 円形ロボットシャーシキット
    [bc url=”https://www.adafruit.com/product/3216″]

円形ロボットシャーシキット

Adafruitで輸入購入しました。本体価格 $19.95、送料は一番グレードの低いトラッキングのないコースで$25.40の合計 $45.35でした。17/6/26購入で17/7/7着でした。

 

ミニローバーキット #adafruit

Home Made Garbageさん(@homemadegarbage)がシェアした投稿 –

組み立ても簡単でした!

国内購入ですとモータ別売りだけど、スイッチサイエンスでも購入できます。

[amazonjs asin=”B07DCRFHVJ” locale=”JP” title=”円形ロボットシャーシキット(三層・タイヤ付き)”]

blynk設定

ここではスマホアプリのblynkでBLE32とWiFi通信でし車を動かします。

新規プロジェクトを作成します。ハードウェアはESP32 Dev Boardを選択。Conection TypeにはWiFiを指定します。
AUTH TOKENはArduinoコード生成時に使用しますのでメール送信しメモします。

ウィジェットとしてジョイスティックを配置します。

ジョイスティックの設定はヴァーチャルピンV0に2軸の数値を出力します。x, yの値はそれぞれ最小-255 最大255としました。モータを制御して車を動かします。

Arduinoプログラム

ESP32をArduinor IDEでプログラミングを行います。Arduino IDEでの開発用ソースがインストール方法と共に以下にアップされています。参照ください。
 https://github.com/espressif/arduino-esp32

BlynkのArduino用 最新ライブラリは以下にあります。
 https://github.com/blynkkk/blynk-library

[スケッチの例] -> [Blynk] -> [Boards_WiFi]-> [ESP32_WiFi] を参考にコード生成しました。

#define BLYNK_PRINT Serial

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "Blynkアプリで取得したAUTH TOKEN";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "WiFiのSSID";
char pass[] = "パスワード";

//channel name
const int  forwardL = 0;
const int  rearL = 1;
const int  forwardR = 2;
const int  rearR = 3;

long Speed;
long SpeedL, SpeedR;

//ヴァーチャルピンV0(ジョイスティック)の値取得
BLYNK_WRITE(V0) {
  long x = param[0].asInt();
  long y = param[1].asInt();

  Serial.print("x: ");
  Serial.print(x);
  Serial.print("  y: ");
  Serial.print(y);

  Speed = sqrt(x*x+y*y);
  if(Speed > 255){
    Speed = 255;
  }
  Serial.print("  Speed: ");
  Serial.println(Speed);

  if(y >= 0){ //前進
    if(x >= 0){
      SpeedL = 0;
      SpeedR = abs(x);
    }else{
      SpeedL = abs(x);
      SpeedR = 0;
    }
    ledcWrite(forwardL, Speed - SpeedL); //channel, duty
    ledcWrite(rearL, 0);
    ledcWrite(forwardR, Speed - SpeedR);
    ledcWrite(rearR, 0);
  }else{  //後進
    if(x >= 0){
      SpeedL = 0;
      SpeedR = abs(x);
    }else{
      SpeedL = abs(x);
      SpeedR = 0;
    }
    ledcWrite(forwardL, 0);
    ledcWrite(rearL, Speed - SpeedL);
    ledcWrite(forwardR, 0);
    ledcWrite(rearR, Speed - SpeedR);
  }
}

void setup()
{
  // Debug console
  Serial.begin(9600);

  //channel 0-15 resolution 1-16bits freq limits depend on resolution
  ledcSetup(forwardL, 5000, 8); //channel, freq, resolution_bits
  ledcSetup(rearL, 5000, 8);
  ledcSetup(forwardR, 5000, 8);
  ledcSetup(rearR, 5000, 8);
  
  ledcAttachPin(32, forwardL); //pin, channel
  ledcAttachPin(33, rearL);
  ledcAttachPin(26, forwardR);
  ledcAttachPin(25, rearR);

  Blynk.begin(auth, ssid, pass);
}

void loop()
{
  Blynk.run();
}

ESP32はanalogWriteが使用できない!

モータドライバの各入力にアナログ電圧(PWM出力)を印加することでモータのスピードを制御するのですが、なんとESP32はanalogWriteが使えなかった。。。

かわりにledcWriteというのが使えるようです。
[スケッチの例] -> [ESP32] -> [examples]-> [AnalogOut] -> [LEDCSoftwareFade]
によると、

  • ledcSetup(channel, freq, resolution_bits)
    channel ;0~15の16個の出力を指定できる
    freq:PWMの周波数
    resolution_bits:出力電圧(デューティー比)の分解能(1~16bit) 8bitなら分解能256
  • ledcAttachPin(pin, channel)
    pin:マイコンピンの指定
    channel:ledcSetupで設定したチャンネル指定
  • ledcWrite(fchannel, duty)
    channel:ledcSetupで設定したチャンネル指定
    duty:ledcSetupで設定した分解能でデューティー比を指定

でアナログ電圧(PWM)出力できます。周波数が指定できるのは非常に便利ですねぇ(^o^)

動作

 

#esp32 と #blynk でらじこ

Home Made Garbageさん(@homemadegarbage)がシェアした投稿 –

 

#blynk で #ラジコン

Home Made Garbageさん(@homemadegarbage)がシェアした投稿 –

この車かわいい 😮 。BB-8つくれそう。。。

Raspberry Pi Zero W と Blynk で サーボモータ制御

Raspberry Pi Zero Wを手に入れたので、これまでなんとなく避けていたラズパイでの電子工作にトライしてみました。

ここではスマホアプリ Blynk とラズパイで2軸のカメラマウンタ(サーボモータ2個)をコントロールします。

構成

部品

blynk設定

ここではblynk のジョイスティックで2個のサーボモータを制御できるようにします。

新規プロジェクトを作成します。ハードウェアはラズパイ zeroがまだないのでとりあえずRaspberry Pi 3Bを選択。Conection TypeにはWiFiを指定します。
AUTH TOKENはコードコンパイル時に使用しますのでメール送信してメモしておきます。

ウィジェットとしてジョイスティックを配置します。

ジョイスティックの設定はヴァーチャルピンV0, V1にそれぞれの軸の数値を出力します。x, yの値はそれぞれ25~0としました。

プログラム

ラズパイのプログラムはpythonやnode.jsなど色々あって軽く迷走した結果、C++を採用しました。Arduinoで親しみも深い言語ですので。。。

Blynkライブラリインストール

ラズパイにBlynkライブラリをインストールします。
詳細は https://github.com/blynkkk/blynk-library/tree/master/linux 通りでターミナルを起動して

$ git clone https://github.com/blynkkk/blynk-library.git

でOK

C++プログラミング

Blynkライブラリがインストールされるとホームにblynk-library/linuxフォルダが生成されます。linuxフォルダをコピーするなどして、その中のmain.cppを以下のように書き換えます。

#define BLYNK_PRINT stdout

#ifdef RASPBERRY
#include <BlynkApiWiringPi.h>
#else
#include <BlynkApiLinux.h>
#endif
#include <BlynkSocket.h>
#include <BlynkOptionsParser.h>

#include <wiringPi.h>
#include <softPwm.h>

static BlynkTransportSocket _blynkTransport;
BlynkSocket Blynk(_blynkTransport);
#include <BlynkWidgets.h>


BLYNK_WRITE(V0) {
  softPwmWrite (12, param.asInt()) ;
  delay (10) ;
}

BLYNK_WRITE(V1) {
  softPwmWrite (18, param.asInt()) ;
  delay (10) ;
}

void setup(){
  softPwmCreate (12, 0, 1000); //(pin, iniValue, Range)
  softPwmCreate (18, 0, 1000); //(pin, iniValue, Range)
}

void loop(){
  Blynk.run();
}

int main(int argc, char* argv[]){
  const char *auth, *serv;
  uint16_t port;
  parse_options(argc, argv, auth, serv, port);
    
  Blynk.begin(auth, serv, port);
    
  setup();
  while(true) {
    loop();
  }
    
  return 0;
}

BlynkのV0, V1で値を受けてサーボの角度として制御しています。

wiringPiのSoftware PWMライブラリを使用してどのGPIOでもPWM出力できると思っていたのですが、ハードウェアPWMに対応したGPIO12, GPIO18でしか動作しませんでした。。。なぜだろう。。。(´;ω;`)ウッ…

コンパイル

main.cppのあるフォルダに移動して以下を実行。

$ make clean all target=raspberry 

Blynk実行

つづいて以下を実行

$ sudo ./blynk –token=Blynkアプリで取得したAuthToken 

上図のようにReadyで準備OK!

動作

Blynkアプリを実行すると以下のようにラズパイ単体でサーボを制御できます。

 

Raspberry Pi Zero W と #blynk で サーボモータ制御

Home Made Garbageさん(@homemadegarbage)がシェアした投稿 –

でも。。。何かしら動かすならマイコンはさんだほうがいいかなぁ(´・ω・`)
不具合起きた際の復帰も遅いし。。。