Amazonで売ってた電流センサー(SCT013-000)をM5Stackで使ってみた
今回は久々にセンサー触ってみたシリーズです。
先日ソラコムさんのIoTカンファレンス「SORACOM Discovery」に参加しました。
前回参加した時はちょっとだけセッションに登壇したのですが、今年はなんとIoTプロトタイピングの展示をしてきました!
ここではコーヒーメーカーのIoT化として、コーヒーの取り忘れ、取りに来たことを確認するシステムを開発しました。
以下がその動画です。
当日はこの機材一式をすべて会場に持ち込みデモでお見せしましたが、かなりウケが良く多くの方にみていただきました。
その中でも特に多かった声が「電流の検知ってどうやってるんですか?」「電流センサーってArduinoで使えるんですね!」
ここでは詳細には書きませんが、実は大人の事情で却下になった幻のシステム構成がありまして、その代替のシステムに電流センサーを用意しました。
展示の1週間前に緊急でピボットしたので間に合うかどうか不安になりつつ必死に電流センサーの使い方をめちゃくちゃ調べまくりましたw
型番を調べまくって出てくる情報は大体英語のブログやらどこの国かわからない言語のYouTubeの動画しか見当たらず、日本語のドキュメントはピッタリなものが見つかりませんでした。
というわけで今回はここで使っていたセンサーをArduinoで動かす方法を紹介します。
今回購入したもの
今回はAmazonで販売されてたADコンバーターもセットになっている以下の商品を購入しました。
Arduinoで動かすことを想定したドンピシャなセットで安心したのですが、運悪く僕が購入したやつはセットに入ってたジャックケーブルが断線しているっぽくそもそも通電すらしませんでした。たまたまとはいえ切羽詰まっている状態で辛い…
というわけで追加で以下のオーディオジャックのボードを用意しました。ブレッドボードに配線して使う想定であればむしろこれを使って接続するのもありです。
そして今回使用するマイコンボードはM5Stack Basicを使用しています。
ハードウェア
センサーの取り付け
今回使用するセンサーは電源コードの電線の片方にクランプで挟んで電流を取得する方式なので、避けることができるコードなどを用意して以下の図のような取り付けのできる延長コードを自作する必要があります。電源コードの自作自体は特に資格なくてもできますが、既存の電源コードを加工すると第二種電気工事士試験でいうところの欠陥扱いになる可能性があるので加工はおすすめしません。
配線
配線は以下の通りです。電流センサーの3.5mmプラグのうち、先端とプラグの根本がセンサーの出力になるので、それぞれキットに入っているADコンバーターの入力に配線し、Arduino側はI2C使ってセンサー値を取得します。
ポイントとしては電流センサー(SCT013-000)にはコイルを使用しており、ノイズが乗りやすいです。そこでそのノイズを軽減するために値が小さめの抵抗(30Ωぐらい)を挟むことでセンサー値をきれいに取得することができます。
後は、センサーのプラグをジャックに差し込めばハードウェアの用意は完了です。
ソフトウェア
必要なライブラリ
今回は以下のライブラリを使用します(カッコは検証したバージョン)
- M5Stackのモジュールの制御: M5Stack(0.4.6)
- ADコンバーターの制御:Adafruit_ADS1X15(2.5.0)
ソースコード
今回使用するプログラムはこちらのサイトで紹介されてたコードを参考にM5StackのLCDでセンサー値を表示できるように改良したコードを動かします。
#include <Wire.h> #include <M5Stack.h> #include <Adafruit_ADS1X15.h> Adafruit_ADS1115 ads; const float FACTOR = 20; //20A/1V from teh CT const float multiplier = 0.00005; void setup() { M5.begin(); Serial.begin(115200); ads.setGain(GAIN_FOUR); // +/- 1.024V 1bit = 0.5mV ads.begin(); } void printMeasure(String prefix, float value, String postfix) { Serial.print(prefix); Serial.print(value, 3); Serial.println(postfix); } void loop() { float currentRMS = getcurrent(); printMeasure("Irms: ", currentRMS, "A"); String irms_str = String(currentRMS, 3) + "A"; M5.Lcd.printf("Irms: %s\n", irms_str); delay(1000); } float getcurrent() { float voltage; float current; float sum = 0; long time_check = millis(); int counter = 0; while (millis() - time_check < 1000) { voltage = ads.readADC_Differential_0_1() * multiplier; current = voltage * FACTOR; //current /= 1000.0; sum += sq(current); counter = counter + 1; } current = sqrt(sum / counter); return (current); }
これでコンパイル、ボードに書き込みをすれば動作確認ができる状態です。
動かしてみる
書き込みが完了してセンサー値がLCDに表示されたら動作は正常に確認しています。センサーで測定している家電の電源をオン・オフしてセンサー値が変化することを確認してみましょう。
まとめ
今回はM5Stackを使ってAmazonで販売していた電流センサーを制御してみました。
Amazonでセンサーを買うとものにもよりますが大体ドキュメントは愚かデータシートすらなくて久々に動かすのに手こずりました。
海外でも奇跡的にドンピシャなサンプルを見つけられたのは不幸中の幸いでした。
何より当日の展示に間に合ってちゃんと安定稼働してくれたのも良かった…
WSLでStable Diffusionを動かしてみた
最近生成AIめちゃくちゃ注目されてますね。
普段はGithub Copilotでコードを書いてもらったりChat GPTでちょっとしたブレストに活用したりしていますが、画像生成AIも気になってはいます。
そんな中、先日OSSカンファレンスが名古屋で開催されました。
今年はセミナーもオフラインになって久々の完全オフラインが復活し久々にお会いする方たちとお話できて、最高に楽しい1日でした。
このセミナーの中でも生成AIをテーマにしたセッションがいろいろあり、その中でStable DiffusionをさくらのクラウドのGPUインスタンスで動かすセッションがありました。
以下のQiita記事がベースです。
この記事では、さくらクラウドのGPUインスタンスを使用してStable Diffusionを動かしている話なのですが、インスタンスで使用しているGPUのスペックは固定で、NVIDIA V100(VRAM 32GB)を使っています。
AI用の演算に特化したGPUをクラウドで使えるのは便利だと思いますが、ちょっとお試しするのに契約が手間だと感じました。
せっかく手元にCUDAに対応した低スペGPUを持っているわけなのでそれでやったほうが安上がりだと思いました。
つまり何が言いたいかというと、ローカルで手軽にStable Diffusionを手軽に試してみたいと思います。(前置き長い…)
スペック
普段遣いしているメインPCは、DELL Precision 3430でスペックは以下の通りです。大須の佐古前装備で購入し、メモリとGPUはその時在庫にあったもので換装しています。
今まで実家ではもっとハイスペックなPCを使ってましたが、めちゃくちゃ電気を食うのと場所を取るので、一人暮らしにあたり程よい大きさのメーカー製PCで良さげなやつを使うようになりました。
ミニタワーPCなので使えるGPUに限りがありますが、Quadroなら古のミニディスプレイが4つもあるのでデュアルディスプレイがかなり快適になります。何より今まで寝かせてたミニディスプレイアダプタがまたこうやって活用できたのもデカいです。
動作環境
今回の動作環境は以下の通りです。今回はGPUを動かしてみたかったのでWSL上でDockerを動かす想定で進めていきます。Ubuntuをインストールしても良かったですが、わざわざセットアップするのも面倒だったので、WindowsをホストOSとして動かせるようにしていきます。
- Windows11
- WSL2
- Docker Desktop 4.30.0
セットアップ
NVIDIAドライバのインストール
まずは以下のURLからGPUのドライバーをお使いのPCのOS、GPUに合わせてインストールします。
今回はWSL上で動作させるようにしますが、GPUドライバについてはホストOSであるWindows用のドライバでセットアップする必要があります。
ここからはWSL上でセットアップを進めていきます。
WSLはコマンドプロンプトかPowerShellで wsl
と入力するだけで起動できます。
WSLを起動したら以下のコマンドを実行し、GPUドライバがあたっているか確認します。
nvidia-smi
以下の実行結果が表示されれば問題ありません。もし、エラーが出る場合はPCを再起動してお試しください。
Sun Jun 2 23:44:09 2024 +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 555.42.02 Driver Version: 537.70 CUDA Version: 12.2 | |-----------------------------------------+------------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 Quadro P620 On | 00000000:01:00.0 On | N/A | | 37% 50C P8 N/A / N/A | 686MiB / 2048MiB | 20% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ +-----------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=========================================================================================| | No running processes found | +-----------------------------------------------------------------------------------------+
NVIDIA Container Runtimeのセットアップ
続いてNVIDIA Container Runtimeをセットアップします。
まずは以下のコマンドでパッケージのレポジトリを登録します。
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \ && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
続いてパッケージリストを更新して、NVIDIA Container Runtimeをインストールします。
sudo apt update sudo apt install nvidia-container-toolkit
インストールできたか確認するために、以下のコマンドで動作確認用のコンテナを動かしてみます。
docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
wsl上で確認した時と同様に nvidia-smi
の実行結果が返ってきたらDockerのGPU環境は正常セットアップできています。
Stable Diffusionを動かす
セットアップ
以下のコマンドでソースコードをクローンします。
git clone https://github.com/AbdBarho/stable-diffusion-webui-docker.git
クローンしたら以下のコマンドで必要なモデル、ファイルをダウンロードします。ダウンロードするファイルは12GBほどあるので結構時間がかかります。
cd stable-diffusion-webui-docker docker compose --profile download up --build
WebUIを起動する
実際にStable Diffusionを起動します。
起動には以下のコマンドを実行します。
docker compose --profile auto up --build
実行するとログが流れますが、以下の通りローカルのURLが表示されたら正常に起動しています。
auto-1 | Installing extension dependencies (if any) auto-1 | Loading weights [c6bbc15e32] from /stable-diffusion-webui/models/Stable-diffusion/sd-v1-5-inpainting.ckpt auto-1 | Running on local URL: http://0.0.0.0:7860
ブラウザで http://localhost:7860
を入力するとWebUIが開きます。
動かしてみる
これでStable Diffusionが立ち上がりました。
試しに犬の画像を生成してもらいます。pronptに dog
と入力して「Generate」ボタンをクリックすることでしばらく待ちます。
すると以下の通り無事に画像が生成されたことが確認できました。
画像生成中に nvidia-smi
を叩くと以下の通りGPUが機能していることが確認できます。
Mon Jun 3 00:58:00 2024 +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 555.42.02 Driver Version: 537.70 CUDA Version: 12.2 | |-----------------------------------------+------------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 Quadro P620 On | 00000000:01:00.0 On | N/A | | 46% 61C P0 N/A / N/A | 1808MiB / 2048MiB | 100% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ +-----------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=========================================================================================| | 0 N/A N/A 72 C /python3.10 N/A | +-----------------------------------------------------------------------------------------+
タスクマネージャで確認してもGPUが問題なく機能していることが確認できました。こうしてみるとやはりVRAMが2GBということもあって100%近く使っていますが、それでも問題なく画像生成できています。
余談ですが、冒頭の画像は今回構築した環境でプロンプトを hacker
、ネガティブプロンプトで worst quality,ugly,bad anatomy,jpeg artifacts
を設定して生成した画像です。
まとめ
今回はWSLを使ってWindowsでStable Diffusionを動かす方法を試しました。
昔はWSLはあまり使い勝手がいい印象がなかったのですが、ここ最近公式でもGPU対応するようになり、これでGPUを使うためだけにデュアルブートをする必要がなくなります。
そして、話題の生成AIなのでハイスペックなGPUを使わないといけないのかと思いきやVRAMの少ないロープログラボでもちゃんと動作することがわかりました。
そんなにPCでゲームをするわけでもなくて普段遣いのGPUはそこまでハイスペックである必要もないなので、これは結構助かりますね!
参考
Raspberry Pi 5に実装されたRTCを試してみた
色々予定が立て込んでてこのブログをなかなか更新できず、気づいたら2024年が5ヶ月過ぎて今年初投稿となりました…(あけましておめでとうございますw)
久々ということで今回は前からやろうとしていたネタを用意してみました。
今年の2月にRaspberry Piシリーズのニューモデル、Raspberry Pi 5が日本で発売されました。
最近のRaspberry Piは一時期起きてた半導体不足による品薄が解消されて在庫も安定してきたように思います。そんな中でニューモデルのリリースはとてもいいことです。
このRaspberry Pi 5では従来のモデルから新たに実装された機能がいくつかありますが、その中でも今回はRTCモジュールを試してみようと思います。
RTCモジュールについて
公式ドキュメント によるとRaspberry Pi 5のRTCモジュールを使うためには以下の画像の通り電源コネクタの横にあるJ5コネクターに3.3Vの電池を繋げれば良さそうです。
そして、このコネクターはJST-SH型の2ピンコネクターのようです。公式のRTC用バッテリーも販売はしてますが、1000円以上するのでちょっとお試しするには高いのと、たまに試す程度なら交換できたほうが安心するので自分で接続用のバッテリーパックを自作することにしました。
RTC用のバッテリーパックを作る
それでは実際にバッテリーパックを自作していきます。ここからは半田付けなどが必要な作業なのでなれない方は大人しく公式バッテリーを買うことをおすすめします。
今回用意した材料はこちらです。全て秋葉原で買い集めました。
- ボタン電池基板取付用ホルダー CR2032用 CH28-2032LF(TR) (表面実装用ですが、ケーブルをはんだ付けするには端子が程よい広さがあるので採用しました)
- JST-SH型の2ピンコネクター付きケーブル(千石電商で買いました)
余談ですが、はんだごては秋葉原のSigezoneにUSB給電で動くモデルと半田マットがセットで1000円切ってたので衝動買いしたものですw
ケーブルと電池ホルダーを接続するときにはRaspberry Piに接続した時に給電用のUSB端子側のケーブルが電池ホルダーの+端子になるように接続する必要があります。ケーブルの色を頼りに接続すると逆になることがあるのであらかじめはんだ付けする前に接続先のケーブルを確認してからはんだ付けすることをおすすめします。
今回購入したケーブルは黒が電源用のUSB端子側になっていたので黒を+端子に接続しました。
最終的に以下の画像のバッテリーパックを作成しました。これでCR2032のボタン電池を用意すればRaspberry Piに接続できる状態になります。
接続してみる
それでは実際に接続してみます。
作成したバッテリーパックをJ5端子に接続して電源を入れます。
通電確認
接続した電源が通っているか確認するときには以下のコマンドを実行します。
cat /sys/devices/platform/soc/soc\:rpi_rtc/rtc/rtc0/battery_voltage
実行結果で以下のように3V程度の電圧が表示されていれば今回用意したバッテリーパックは正常に動作しています。
もし、明らかに小さい値の場合はバッテリーの接続やはんだ付けに誤りが無いかを確認してください。
ウェイクアラームを設定する
バッテリーが機能していることでRTCが使える状態になっています。
今度はRTC機能で試すことができる機能として、ウェイクアラームを試してみます。この機能はRaspberry Piがシャットダウンされて待機状態になっても指定した時間に再起動することができます。
ウェイクアラームを動かすためにはEEPROMの設定を書き換える必要があります。そこで以下のコマンドを実行してEEPROMを編集する画面を開きます。
sudo -E rpi-eeprom-config --edit
編集画面を開いたら、 POWER_OFF_ON_HALT=1
に変更し追加で WAKE_ON_GPIO=0
を1行追加します。
修正を終えたら Ctrl + O
で保存し、 Ctrl + X
でエディタを終了します。
エディタを終了すると以下の通りEEPROMの書き換え処理が実行されます。表示の通り、書き換えが終わるまで電源を切らないようにしましょう。
最終的に UPDATE SUCCESSFUL
と表示されれば、設定の書き換えは完了です。
Updating bootloader EEPROM image: /lib/firmware/raspberrypi/bootloader-2712/default/pieeprom-2024-04-20.bin config_src: blconfig device config: /tmp/tmp3jjmq4nf/boot.conf ################################################################################ [all] BOOT_UART=1 POWER_OFF_ON_HALT=1 WAKE_ON_GPIO=0 BOOT_ORDER=0xf461 ################################################################################ *** To cancel this update run 'sudo rpi-eeprom-update -r' *** *** CREATED UPDATE /tmp/tmp3jjmq4nf/pieeprom.upd *** CURRENT: Sat 20 Apr 10:53:30 UTC 2024 (1713610410) UPDATE: Sat 20 Apr 10:53:30 UTC 2024 (1713610410) BOOTFS: /boot/firmware '/tmp/tmp.6LKinPaDMv' -> '/boot/firmware/pieeprom.upd' UPDATING bootloader. This could take up to a minute. Please wait *** Do not disconnect the power until the update is complete *** If a problem occurs then the Raspberry Pi Imager may be used to create a bootloader rescue SD card image which restores the default bootloader image. flashrom -p linux_spi:dev=/dev/spidev10.0,spispeed=16000 -w /boot/firmware/pieeprom.upd UPDATE SUCCESSFUL
ウェイクアラームを試す
設定ができたところで、実際にウェイクアラームを試してみます。
以下のコマンドを実行することで10分後に再起動時間を設定してRaspberry Piをスリープにします。
echo +600 | sudo tee /sys/class/rtc/rtc0/wakealarm sudo halt
10分後、再びRaspberry Piが再起動されたら、RTCを使用したウェイクアラームが正常に機能しています。
Raspberry pi 5に実装されたRTCを使ってOSを再起動する機能を試してみた
— KMiura (@k_miura_io) 2024年5月29日
公式のバッテリーがもったいないから自分でバッテリーホルダー作ったけどちゃんと動いてよかったよかった pic.twitter.com/QU2U9F4l8J
dmesg | grep rtc
でカーネル出力を確認するとシステム起動時に時刻の取得処理をRTCから行っていることを確認できます。
[ 0.365625] rpi-rtc soc:rpi_rtc: registered as rtc0 [ 0.367143] rpi-rtc soc:rpi_rtc: setting system clock to 2024-05-29T15:55:29 UTC (1716998129)
まとめ
今回はRaspberry Piの新機能であるRTCを試しました。
それまでは自前でモジュールそのものを用意する必要がありましたが、こうやって電源を用意することでRTCを試すことができるのは魅力的だと感じました。
公式ドキュメントにもありますが、ウェイクアラームを活用するとアイデア次第でタイムラプスなどの定期処理を実行する機能を省電力で実現できるので、その機能も試してみたいところです。
コネクターで供給する電源も向きに気をつけないとRTCが機能しないので自前でバッテリーパックを作る際は十分お気をつけください!(そもそも公式バッテリーを買えばいい話ですが…)
参考
Switchbot カーテンをRaspberry Piで動かしてみた
この記事はIoT LTアドベントカレンダー25日目の投稿です
今年はIoTLTで登壇したのは、記念すべき100回目の時だけでした
(久々に見てたら今年公開したスライドの中でかなりたくさんの人に見られててかなり話題性あったことを物語ってますね)
実はあれから半年たち、名古屋市内に引っ越してついにれっきとした名古屋市民になりましたw
で僕が住んでいるマンションの近所では新たなマンションが絶賛建設中です。そのマンションにはこんな広告があります
最近はIoT対応のマンションも増えているようですが、今僕が住んでいるところはIoTという概念どころかインターネットが世に出始めたぐらいの20年以上昔に建てられた物件です
そういうところだからこそ自作でホームハックしがいがあるわけです
というわけで前置きが長くなりましたが、その一環として今回はSwitchbotカーテンを設置して実際に運用してみました
今回買ったもの
今回買ったデバイスは内側に車輪が入っているレールのカーテンに対応したモデルです。中のカーテンレールのサイズに合わせて車輪の大きさが調整できるようにアタッチメントも付属しています。
自宅のカーテンレールに対しては特にアタッチメントつけなくてもすんなり設置ができました。
設置ができたらアプリで2台のデバイスをグループ化させてキャリブレーションすればアプリ上でカーテンの開け閉めができるようになります
設置もキャリブレーションもアプリで簡単にできた
— KMiura (@k_miura_io) 2023年11月14日
あとはハックもしたいねー pic.twitter.com/9X4vrgMbGc
アプリを使わなくても手で開けることもできます
Raspberry Piで動かしてみる
ここまでできたところで本題です。
今度はRaspberry Piでハックしていきます。
SwitchBotシリーズはBLEのAPIがオープンになっており、プログラムで操作することができます。
そして、そのAPIでデバイスを操作するためのコードもGithubで公開されています
公式ではPyBluezを使った switchbot_py3.py
のセットアップ方法が紹介されていますが、バグがあるようで動きません。そして、中で使われているgattlibのビルドも失敗します…
同じ現象のissueは立ってましたが、Openされたまま放置されてますね…
というわけでこのissueの回答通り switchbot_py2topy3.py
を使ってみます。
こっちはbluepyを使ったコードになっており、セットアップはさほど難しくありません。
実行環境
- Raspbian GNU/Linux 10 (buster)
- Raspberry Pi Zero 2 W
セットアップ
基本的にはbluepyと同様のセットアップ方法で問題なさそうでした。
sudo apt-get install python3-pip libglib2.0-dev sudo pip3 install bluepy
追加でSwitchbotを操作するスクリプトで必要になるライブラリもインストールします。
sudo apt-get update sudo apt-get install python3-pexpect sudo apt-get install libusb-dev libdbus-1-dev libglib2.0-dev sudo apt-get install libudev-dev libical-dev libreadline-dev
動かしてみた
以下のコマンドを実行することでデバイスをスキャンします。
sudo python3 switchbot_py2topy3.py
スキャンが終わると以下の通りデバイスのMACアドレスとそのコマンドがリストアップされます。
0 ['xx:xx:xx:xx:xx:xx', 'Curtain', 'Open'] 1 ['xx:xx:xx:xx:xx:xx', 'Curtain', 'Close'] 2 ['xx:xx:xx:xx:xx:xx', 'Curtain', 'Pause'] 3 ['xx:xx:xx:xx:xx:xx', 'Curtain', 'Pause'] 4 ['xx:xx:xx:xx:xx:xx', 'Curtain', 'Open'] 5 ['xx:xx:xx:xx:xx:xx', 'Curtain', 'Close']
あとはリストアップされたコマンドの中で実行したいコマンドを番号で指定するとカーテンを操作できるようになります
やっとRaspberry PiでSwitchBotカーテンをハック出来た
— KMiura (@k_miura_io) 2023年12月23日
SwitchBot自体久々にハックしたけどセットアップ結構詰まった… pic.twitter.com/TwA7luSGUX
ちなみに↑のポストのように2台同時に開閉するにはアプリのデバイス設定で確認できる「デバイス情報」のMACアドレスを選択すると操作できます。
これで接続、動作確認ができれば以下のコマンドでデバイスの操作ができます。
sudo python3 switchbot_py2topy3.py xx:xx:xx:xx:xx:xx Curtain [Close / Open]
あとはCronとかを使ってカーテンを自動で開閉する操作をRaspberry Piで実装できます
まとめ
今回はSwitchBotカーテンを使って自宅のカーテンを自動開閉できるようにしてみました。
実際にRaspberry PiにCronを仕込んで起床時間にカーテンを開けて帰宅前にカーテンを閉めるように操作してますが、ちょっとした操作が快適になった気がします!
久々にBLE周りのセットアップしましたが今までできたセットアップができなくなるなどのクセがあるので、他で使い回せるようにOS自体をバックアップするとか対策を取らないといけない気がしてきました。
ultraArmをmyBlocklyで動かしてみた
前回はスイッチサイエンスで発売前のultraArmをいち早く試しました。
このときはPythonを使って操作をしていましたが、せっかくならmyCobotの時みたいにビジュアルプログラミングで動かしたいわけです。
というわけで今回はmyBlocklyでultraArmを動かしてみます。
動作環境
インストール
Pymycobotをインストール
PowerShellかコマンドプロンプトを開き、以下のコマンドでPymycobotをインストールします。
pip install pymycobot --upgrade --user
シリアルドライバをインストール
ultraArmとシリアル通信をするためにこちらのドライバをインストールします。
myBlocklyをインストール
こちらからインストーラーをダウンロードしてインストールをします。
簡単に手順を書きましたが、これで必要なセットアップはできました。
プログラミング
今回は前回のように動き回るようなフローを作成しました。
動かす前には【Go zero】ブロックでキャリブレーションしないとアームの姿勢を制御できませんでした。(Pythonでは起動時に必ずキャリブレーションするっぽい?)
上のスクショのフローを読み込めるJSONは以下です。このフローを使うときは以下のJSONを適当なファイル名で保存してmyBlocklyからファイルを読み込みます。
{"mode":"single","json":{"blocks":{"languageVersion":0,"blocks":[{"type":"init_mycobot","id":"{Ba_ap)xGJRhC()o!d)k","x":10,"y":10,"fields":{"ROBOT":"ultraArm","PORT":"COM7","BAUD":"115200"},"next":{"block":{"type":"mypalletizerprolite_go_zero","id":"cXC1zxmMLBPaIMY*$Q~a","next":{"block":{"type":"mypalletizerprolite_sleep","id":"U8`Y54l=AD@BkKY$|uOZ","inputs":{"TIME":{"shadow":{"type":"math_number","id":"JNj$%~c9)Nw_]b]pI2P}","fields":{"NUM":1}}}},"next":{"block":{"type":"mira_set_angles","id":"%4YtOoy;BG%2t7)POMdo","inputs":{"J1":{"shadow":{"type":"mira_j1_slider","id":"GAGtn:0~Q^{uQCNLzgZ}","fields":{"NUM":0}}},"J2":{"shadow":{"type":"mira_j2_slider","id":"]W)rU1=36!?!A/r~mXOz","fields":{"NUM":0}}},"J3":{"shadow":{"type":"mira_j3_slider","id":"7[2$t6UY3v$n_8(QO%Uz","fields":{"NUM":0}}},"F":{"shadow":{"type":"mira_speed_slider","id":"!8d=:4E8dz1=yJVs~zge","fields":{"NUM":50}}}},"next":{"block":{"type":"mypalletizerprolite_sleep","id":"$=NudmkD?Lp@0$i%ZebS","inputs":{"TIME":{"shadow":{"type":"math_number","id":")9+?5?33rK84ObMoaG^/","fields":{"NUM":1}}}},"next":{"block":{"type":"mira_set_angles","id":"|i?VrIwe:auc*O7:Bw=m","inputs":{"J1":{"shadow":{"type":"mira_j1_slider","id":"@H@k[b]BE??Hh7?pk9*N","fields":{"NUM":-45}}},"J2":{"shadow":{"type":"mira_j2_slider","id":"[#O.,/gdprf/BluPz{mG","fields":{"NUM":-20}}},"J3":{"shadow":{"type":"mira_j3_slider","id":"+JTQa@|IaEx7LYShcHRV","fields":{"NUM":50}}},"F":{"shadow":{"type":"mira_speed_slider","id":"{^6WZl6Plqxlx,Zuo3ty","fields":{"NUM":50}}}},"next":{"block":{"type":"mypalletizerprolite_sleep","id":"Wr[j63N_vUVBf.Jyu4!o","inputs":{"TIME":{"shadow":{"type":"math_number","id":"2mM,yS,+.Rhg?3Bt!~UI","fields":{"NUM":1}}}},"next":{"block":{"type":"mira_set_angles","id":"i^og:^?;DFhe+({pwpBp","inputs":{"J1":{"shadow":{"type":"mira_j1_slider","id":":R4c5iMrq^:zqj$y+$9/","fields":{"NUM":110}}},"J2":{"shadow":{"type":"mira_j2_slider","id":"kk*wn@MZGC;lnC?!sXi6","fields":{"NUM":50}}},"J3":{"shadow":{"type":"mira_j3_slider","id":",kZ6m)1*s1^ststT#Ld,","fields":{"NUM":10}}},"F":{"shadow":{"type":"mira_speed_slider","id":"rjW|;fYW%O(X$vG9-q`c","fields":{"NUM":50}}}},"next":{"block":{"type":"mypalletizerprolite_sleep","id":"d28@{kGo/HvsdEb!teX.","inputs":{"TIME":{"shadow":{"type":"math_number","id":"Lx7CUn8+`LrH0.tXp[/k","fields":{"NUM":1}}}},"next":{"block":{"type":"mira_set_angles","id":"mr%7dWSJ=;Ab~c9]9]WJ","inputs":{"J1":{"shadow":{"type":"mira_j1_slider","id":"V3z96M!WB1YH-?(-sFb0","fields":{"NUM":0}}},"J2":{"shadow":{"type":"mira_j2_slider","id":"I1uPC;4^X_y4}=gyUh~p","fields":{"NUM":0}}},"J3":{"shadow":{"type":"mira_j3_slider","id":"~%x/.f-x7L}plJRhvc{!","fields":{"NUM":0}}},"F":{"shadow":{"type":"mira_speed_slider","id":"8l?k1BuN26@Q|v,#y8mc","fields":{"NUM":50}}}},"next":{"block":{"type":"mypalletizerprolite_release_all_servos","id":"quz(9*~=3$WgjYM-|zre"}}}}}}}}}}}}}}}}}}}}}]}}}
JSONファイルを読み込むときは、エディタ右上の青いアイコンから「Load」をクリックすることでフローを読み込めます。
読み込む前にInitブロックで使用するロボットアームの名前とポート番号をしておかないと読み込んだフローが削除されます。
フローを作成したらエディタの右上の「Run」ボタンをクリックするとなめらかな動きをします。
やっぱりmyBlocklyでも動かしてみたいよね
— KMiura (@k_miura_io) 2023年7月18日
本格的なロボットがここまで手軽に動かせるなんていい時代になったな(語彙力#mycobot #ultraArm pic.twitter.com/lAWAm2TyLU
まとめ
今回はultraArmをmyBlocklyで動かしてみました。
myCobotの時みたいに手軽にプログラムをできましたが、公式ドキュメントではサンプルが無かったので所見だと動かし方がよく分からなかったので、メモ的な感じで手順をまとめてみました。
いち早くultraArmを触っているので、myBlocklyで動かしたい人たちの参考になったら嬉しいです!
ultraArm P340をモニター提供されたので動かしてみた
今年のはじめにmyCobotを使って書き初めをして遊んだ記録をブログに投稿しました。
でこのブログをスイッチサイエンス主催のmyCobot活用事例キャンペーンに投稿したところ、なんとmyCobotを開発しているElephant RoboticsのCEOのJoeyさんが気に入ったようでなんと動画で取り上げてもらえました!
(割とノリで思いついて投稿したので真剣にコメントしてもらい申し訳ないです…)
で、この動画のタイトルの通りなんと新製品のultraArmをモニター提供してもらうことになりました!最初連絡が来たときは寝耳に水でしたw。
連絡きてから3ヶ月が経ち、ついに手元に届きました!まさか本当に届くとは…
というわけで今回はスイッチサイエンスでの発売前にいち早くこのultraArmを実際に動かしてみます。
ultraArmとは
ultra Armはアルミ合金で作られたロボットアームです。
myCobotよりも自由度は少ないですが、その分動作には正確性があるのが特徴です。
アーム使われているモーターは静音性の高いステッピング技術を取り入れたモーターを使用しているので発熱と騒音を低減しているそうです。
プロセッサーにはATMEGA2560-16AU AVRプロセッサを使われており、操作はUSBでパソコンとつないでシリアル通信でやるようです。
詳細なスペックは以下のドキュメントが参考になりそうです
開封の儀
まずは開封の儀です。
myCobotと比べると付属品はシンプルです。
開封の儀
— KMiura (@k_miura_io) 2023年7月17日
中味は至ってシンプル pic.twitter.com/Bzv52KSdsm
家にあるmyCobotと比較してみました。並べてみるとかなり違いが分かりますね。
ultraArmは土台が重めなので台座がなくてもかなり安定しそうです。
myCobotとの比較
— KMiura (@k_miura_io) 2023年7月17日
比べると結構体格差ある pic.twitter.com/ToOJHJiTiA
初着火
電源をつないだところで起動してみました。
土台のファンの音がデカイです。
初着火
— KMiura (@k_miura_io) 2023年7月17日
結構ファンの音がデカい pic.twitter.com/Z4h6TwFA48
Pythonで動かしてみる
PCと接続すればすぐできそうなので、早速Pythonで動かしてみます。
今回はUbuntuのPCに接続します。
まずは以下のコードを ultra_arm_sample.py
として保存します。
from pymycobot.ultraArm import ultraArm ua = ultraArm("/dev/ttyUSB0", 115200) ua.go_zero() #Return to zero position ua.set_angles([0, 0, 0], 50) # Move around ua.set_angles([90, 10, 30], 50) ua.sleep(3) ua.set_angles([-60, -10, 45], 50) ua.sleep(3) # Release all servos ua.set_angles([0, 0, 0], 50) ua.sleep(3) ua.release_all_servos()
接続先のシリアルポートは以下のコマンドで確認します。
ls -l /dev/ttyUSB*
必要なPythonライブラリは以下のコマンドでインストールするだけです。
pip3 install pymycobot --upgrade --user
動かしてみる
実際に動かしてみます。
以下のコマンドで起動します。
python3 ultra_arm_sample.py
起動すると以下のようにあちこちアームが動き回ります。
起動時は必ずキャリブレーションがされるのが正確さを物語ってますね。
うろちょろ動かしてみた
— KMiura (@k_miura_io) 2023年7月17日
ultraArm完全理解した pic.twitter.com/7HOLCA8bW3
まとめ
今回はモニター提供してもらったultraArm P340を動かしてみました。
文字を書くような正確な動きが要求されるようなシステムとかに使えそうだと思いました。
しかもアルミ合金で構造もmyCobotよりシンプルで丈夫そうなのでそれを活かした作品とかも作ってみたいですね。
DENSOのQRコードスキャナ(GT10Q-SR)をPythonで繋いでみた
ある日、おなじみ佐古前装備に行ったときに商品が陳列された棚を眺めてたら、QRコードの元祖DENSOのQRスキャナを見つけました。
価格は通電確認のみのジャンクで1500円でした。立派な金属スタンドも付いていて遊びがいありそうなので即買ってきました。
地元の某T様系企業の人はこれ見ると「ウッ…頭が…」となるらしい
— KMiura (@k_miura_io) 2023年5月27日
かなり闇を感じた(ちな、某ジャンク屋さんで仕入れた pic.twitter.com/j1saTdgDFq
というわけで今回は買ってからだいぶ経ちましたが、このQRコードスキャナをハックしていきます。
シリアル変換ケーブルを用意
買ってから気づいたのですが、このスキャナのインターフェースはRS232Cを使用しておりPCで接続するにはシリアルポートがあるものを用意するかUSBに変換するケーブルを用意する必要があります。
僕はUSBのシリアル変換ケーブルでUSB経由で接続しました。Windows10であれば特に追加でドライバを設定することなく接続ができました。
とりあえず動かしてみる
通電確認
まずは通電確認をしてみます。
トリガーを引くとレーザー光と一緒にQRコードをスキャンするときにわかりやすい枠線が表示されます。
起動には付属のACアダプタをコネクタに接続する必要があります。
PCに接続する
まずはメーカーから配布されているソフトで動くか試します。ソフトはWindowsのみでしか対応してないので、Windows10のPCで検証していきます。
DENSOにはスキャナをPCに接続してキーボードインターフェースとして使えるようにするソフトウェアが配布されているのでそれを使っていきます。
以下のURLから「キーボードインターフェースソフト(QR_kbif)」を選択してインストーラーをダウンロードします。
ダウンロードしたzipファイルを展開してインストーラを起動したらインストールが実行されます。
インストールされたら「QR_kbif3.0」というソフトを起動します。
起動すると以下のダイアログが表示されるので「はい」を選択して自動接続します。
自動接続でQRコードリーダーの接続ポートを探して自動で接続してくれます。
無事に接続されて以下の画面が表示されたら接続設定は完了です。
試しにスキャナのトリガーを引いて以下のようにアプリの画面に読み取った結果が表示されたらQRコードスキャナは正常に動作しています。
某ジャンクショップで見つけたQRコードリーダーをパソコンに繋いだら普通にデータ読み込んだ
— KMiura (@k_miura_io) 2023年6月3日
やはりQRの元祖の有名メーカーだけあって安定稼働するねー
これでスタバごっこできる(分かる人には分かる pic.twitter.com/eC1NPK1Au1
さらにQR_kbifの「アプリへ送信」→「データ送信モード」を「仮想キーボード」に設定すればインターフェースが立ち上がっている間は仮想キーボードとしてQRコードでスキャンした中身をメモ帳アプリなどの入力として使えます。
Pythonでつなげる
ここまではDENSOのツールを駆使してスキャナを繋いで入力ができるようになりましたが、スキャナを使うたびにインターフェースを起動するのは手間ですし、何よりWindowsにしか対応してないのが個人的にはイマイチです…
やはりこういうガジェットはRaspberry PiみたいなLinuxで接続して遊びたいわけです。
ということで今度はLinuxでも使えるPythonで接続できるようにしてみます。
QRコードスキャナ自体はシリアルデバイスとして認識されているので、Pythonで接続するためにpySerialでシリアル通信を使ってスキャンしたデータを取得できるようにすることを目標にします。
スキャナの設定変更
他のソフトでシリアル通信をするためにQRコードの設定を変更する必要があるため以下のリンクからスキャナソフト「Scanner Setting 2D」をインストールします。このソフトもWindowsのみ対応しています。
なお、インストールにはQRdirectに登録する必要があるので、以下のリンクから会員登録をします。(一応個人でも登録はできました)
QR_kbifと同様にインストーラーをダウンロードしたらインストールを実行することで使えるようになります。
起動時には以下のダイアログが表示されるのでスキャナが接続されているポート番号を指定してProduct Nameに「GT10Q/GT11Q-SR/HR」を選択したら「Online」をクリックしてソフトを立ち上げます。
以下の画面が表示されたらスキャナとの接続が完了してセットアップができる状態です。
「ヘッダー/ターミネータ」の設定でターミネータを「LF」に設定します。この設定変更だけでPythonからシリアル通信をできるようになります。
設定を反映させるには、画面上部の黄色い矢印のボタンをクリックすることで設定を反映させることができます。
スキャナに接続するPythonコード
それではPythonでスキャナに接続してみます。
今回はRaspberry Piにスキャナを接続してみます。
以下のコードを「qr_scan.py」で保存します。
import argparse import serial parser = argparse.ArgumentParser() parser.add_argument('-p', '--port', default='/dev/ttyUSB0') args = parser.parse_args() device = serial.Serial(args.port, 9600) print('Scan QR Code...') result = device.read_until() print(result.decode())
動作確認
いよいよ動作確認です。
Raspberry Piに接続したスキャナのシリアルポート番号を確認するために以下のコマンドを実行します。
ls -l /dev/ttyUSB*
以下のコマンドでpySerialをインストールします。
pip3 install pyserial
先程作成したPythonのプログラムを以下のコマンドで立ち上げます。 --port
オプションには先程確認したシリアルポートに変更します。
python3 qr_scan.py --port /dev/ttyUSB0
起動したらトリガーを引きながらQRコードを近づけて以下のようにターミナルに読み取ったデータが表示されたらスキャナは正常接続できています。
だいぶ前に買ったQRの元祖の某T様系企業のスキャナをRaspberry Piでハックしてみた
— KMiura (@k_miura_io) 2023年7月16日
やっぱりWindowsだけで動かしても何の面白みもないからねw pic.twitter.com/sWCwvqiyAl
まとめ
有名メーカーのスキャナだけに簡単にハックできないと思ってましたが、Pythonで接続できるように簡単に設定をいじることができてよかったです。
これでますます遊びがいありますね!