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で接続できるように簡単に設定をいじることができてよかったです。
これでますます遊びがいありますね!
M5Stack Core S3を動かしてみた
お久しぶりの投稿です。
ここ数ヶ月仕事でいっぱいいっぱいでなかなかブログを更新する気力もありませんでしたが、仕事が少し落ち着いてきたので久々にブログを更新してみます。
今年の連休にM5Stackのメンバーが来日してジャパンツアーとして全国各地でイベントがあり、その東京会場に参戦するべく東京に遠征してきました。
会場着きますた
— KMiura (@k_miura_io) 2023年5月4日
ノベルティあるのいいね!#M5Stack pic.twitter.com/dttVxGemsq
Twitterでしか見かけなかった方からお久しぶりな方までお会いすることができて最高に楽しい時間でした。
このイベントでM5StackのCEOであるJimmyのセッション中にこの日に日本で発売されたばかりのM5 Stack Core S3の紹介がありました。
新製品にはカメラとマイクが付いている
— KMiura (@k_miura_io) 2023年5月4日
もうこれだけで配信システム作れるのでは⁇#M5JPTour2023 pic.twitter.com/0VmYwqGZy4
来日記念でクーポンコードもあったのでこの日のホテルで即注文しました。
今日が発売日でJapan Tourもあったしせっかくなのでクーポンで買っちった(実はCore系は一つも持ってないw) https://t.co/VmtjRD9ORi
— KMiura (@k_miura_io) 2023年5月4日
連休明けの迅速な出荷作業のお陰で思ってたよりも早く到着しました!
イベントのクーポンと充実したインターフェイスに釣られて買っちった
— KMiura (@k_miura_io) 2023年5月9日
実はCore系触るの初めてだったりする#M5Stack pic.twitter.com/bCfAc4iolT
というわけで今回はこの Core S3をArduinoで動かしてみます。
動作環境
ライブラリのインストール
まずは今回使用するライブラリをインストールします。
M5StackのライブラリはまだCore S3用のライブラリが登録されてないので、Githubのレポジトリからzipでライブラリのソースをダウンロードしてインストールします。
ダウンロードするソースは以下のレポジトリです。
https://github.com/m5stack/M5CoreS3
https://github.com/Tinyu-Zhao/BMI270_Sensor.git
レポジトリにアクセスしたら、右上の Code
ボタンをクリックしてプルダウンの中から Download ZIP
をクリックしてZIPファイルをダウンロードします。
ArduinoのIDEから Sketch→Include Library→Add .ZIP Library
でダウンロードしたzipファイルを選択するとインストールが実行されます。
ボードマネジャーをインストール
Arduino IDEの File→Preferences
を開き、以下のボードマネジャーのURLをそれぞれ設定します。
https://espressif.github.io/arduino-esp32/package_esp32_index.json https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
サンプルコードを動かす
それではサンプルコードを動かしてみます。
今回は先程ダウンロードしたM5CoreS3のサンプルに提供しているディスプレイにHello Worldが表示するプログラムを動かします。
File→Examples→Basics→HelloWorld
を選択するとサンプルコードが表示されます。
ビルドをしていきます。画面上部のポート選択画面のダイアログから Select other board and port
を選択します。
ここからビルドするボードとCore S3を接続しているポートを選択します。Core S3は執筆時点(2023年5月)ではボードマネジャー登録されておらず、同じESP32 S3を使っているATOM S3を選択すると書き込みができます。
コンパイル書き込みをして、ディスプレイに「Hello World」が表示されたらプログラムは正常に動作しています。
今回はM5Stack Core S3をArduinoで動かしてみました。
Core S3はインターフェースが豊富で非常に遊び甲斐がありますが、発売されたばかりでライブラリはサンプルも少ないのでまだまだやれることは少ないかなと感じました。
今までCoreを触ったこともないですが、これからゆるく触っていけたらと思います。
myCobot 280 Piの台座を作ってみた
myCobotの本体を買ったのはいいのですが必要に応じて周辺機器やアクセサリーをいろいろ買い揃えたいところです。
取り急ぎmyCobotを動かしているとすぐ倒れてしまうのでそれを防ぐために台座を用意するところから検討を始めました。
で調べてみると、やはり純正品特有のプレミア価格がついててとても自分で買おうと思わないんですよね…
myCobot 280用Gベース(クランプ)www.switch-science.com
myCobot 280用フラットベースwww.switch-science.com
それにクランプは写真でみる限り明らかに普段使っている机のサイズに合わなくて固定できませんし、吸盤にいたっては表面の粗い木製の机なので吸盤は外れやすいです。
それであれば自分で作ってしまったほうが早いし安上がりですよね。
というわけで今回はmyCobot用台座を安く作るようにしてみました。
ハードウェア情報の確認
まずはハードウェア情報を確認してみます。
M5 Stack版では上からネジをさして台座を固定できるようになっています。
一方、こちらがRaspberry Pi版のハードウェア情報。穴の配置は全く一緒ですが、ネジの経が違うのと下から固定する想定です。
買い出し
ハードウェア情報を元に台座には以下の材料を用意しました。
- 板材
- M4ネジ
- ゴム足
ネジ以外はカインズで買い揃えました。(ネジは奇跡的に家に残ってました)
工具も買ったので少し高めですが、工具抜きであれば数百円で必要なものは揃います。
そしてmyCobot用のパーツ買った pic.twitter.com/o2wcWhAfln
— KMiura (@k_miura_io) 2023年1月2日
ハードウェア情報をM5版と勘違いしてネジを買い間違えました…
組み立て
買ったドリルの経が狭くてネジがうまく入らず無理やりこじ開けてなんとか対角線上にはネジを差し込むことができました。
myCobotの方のネジ穴が結構ギリギリなのでまっすぐ挿すのに一苦労です。木の机なのでおいてみると意外としっくり来ますね。
myCobotの台座が出来た
— KMiura (@k_miura_io) 2023年1月3日
穴の位置、大きさを無理矢理合わせるのが大変だったw pic.twitter.com/AbHpOKXpPR
動かしてみた
台座に固定したところで試しに以前動作確認用に作った簡単なデモを動かしてみました。
これも動かすだけですぐ倒れてしまいますが台座のおかげで安定するようになりました!
うん、手押さえ無くても安定するようになった pic.twitter.com/H70U0dOA73
— KMiura (@k_miura_io) 2023年1月3日
#まとめ 今回はmyCobot用の台座を自作してみました。
ドキュメントのハードウェア情報を頼りになんとか作ることができました。
M5版とRaspberry Pi版では規格が違ってある意味勉強になりました。
なにより、純正品のアクセサリよりも格安に作れたのがデカイですね。
あんまり違和感ない感じになったので気が向いたらちゃんと程よい太さのドリルビット買ってきて穴を広げようと思います。
myCobotで書き初めやってみた
2023年最初の投稿です、あけましておめでとうございます。
去年はROSに始まり、転職をきっかけにROSであれこれ遊ぶようになりました。
今年もROSをはじめロボットやガジェットでゆるく遊んでいこうと思いますのでよろしくお願いします。
さて、新年の行事といえば書き初めがあります。
大体の方は小学校や中学でやってたんじゃないかと思います。
前回myCobotを触りましたが、何かしらネタがあったほうがいいなと思い頭の中であれこれ考えてたら、新年に向けてこの書き初めをネタにしたら季節感もあって面白いんじゃないかと思いつきました。
というわけで今回はmyCobotで書き初めをやってみたいと思います。
ネタの仕入れ
ガチの書道セットは流石に準備が大変なのと下手するとmycobotが汚れそうな気がするのでやめておきましたw。
断捨離の帰りにネタの仕込み
— KMiura (@k_miura_io) 2022年12月31日
完全に小学生の買い物で草#大晦日ハッカソン pic.twitter.com/jzxGU7i2qO
セッティング
買ったペンをmyCobotの先端に取り付けました。
固定はめちゃめちゃ簡単に養生テープでやりましたw。
台座はあり物の空き箱を積んで用意しました。大体13cm〜15cmぐらいの高さで紙をのせました。
ある程度の高さがあったほうがアームの可動範囲が広くなります。
そしてロボットは例のごとく(?)手で抑えますw。
モーション作り
ここからはひたすらモーションを作りました。実際に筆を置きながらアームの姿勢を決めていきました。
姿勢を決めるときにはBlockyのQuickMove(画面右上の赤丸をクリックして表示)を使って各ジョイントの角度を取得していきます。
後は取得した姿勢をブロックに入れていくという地道な作業を続けるだけです。
試しに簡単に横線を引きました。
myCobotと組み合わせてこういうことをしたかったわけですw#大晦日ハッカソン pic.twitter.com/lXuqiQ6yx3
— KMiura (@k_miura_io) 2022年12月31日
動画のペンで書いたときには仕上がりが普通の水性ペンとあまり大差なかったので、もう片方のペンに付け替えてみたら意外とそれっぽい仕上がりになりました。
それなりの太さがあって筆の強弱がわかりやすくなりました。
あんまり筆で書いてる感じしなかったので別のペンで試したら味のある字になった!#大晦日ハッカソン pic.twitter.com/0wRni3LvQW
— KMiura (@k_miura_io) 2022年12月31日
今度は何かしらの文字を書くようにしてみました。
書く文字はカタカナの「イ」です。日本でブラウン管テレビを発明したときに最初に表示した文字でもあり、文字のなかで一番分かりやすい気がします。
文字はシンプルですが、筆の位置を決めても筆が浮いてしまったり予想外の方向に動いてしまったりして結構大変でした。
筆の固定位置を修正したり何度か角度を調整し直してなんとか書くことができました。
今度はちょっとした文字を書けた
— KMiura (@k_miura_io) 2022年12月31日
ペンの位置やパラメータ調整が大変だった#mycobot #大晦日ハッカソン pic.twitter.com/KawKcooDZt
清書
これで感覚がつかめたのでいよいよ1枚の紙に2文字を書き上げることをやってみます。
紙に対してなるべくバランスよく書く必要があるため、更にパラメータ調整をしていきました。
ただ、さっき1文字ずつ書いたのでそこまで苦戦することはなかったです。
完成したフローはこんな感じです。一つ一つ決め打ちでパラメータを設定してたら気が遠くなりましたw。
JSONはこんな感じです。適当なファイル名で保存して読み込めば動かせますが、今回のセッティングに合わせて組んでいるので、真似する場合は台座とペンの位置を調整する必要があります。
{"mode":"single","json":{"blocks":{"languageVersion":0,"blocks":[{"type":"init_mycobot","id":"?STrv$]%4$FRRP1d+Q:I","x":10,"y":10,"fields":{"ROBOT":"MyCobot","BAUD":"1000000"},"inputs":{"PORT":{"shadow":{"type":"text","id":"i,Y2Um!wgNS3xqgDLQU;","fields":{"TEXT":"/dev/ttyAMA0"}}}},"next":{"block":{"type":"send_angles_1","id":"ZEp.nJfOVX7mhOL8~`:^","inputs":{"J1":{"shadow":{"type":"angle_slider","id":"B9!:{74A.vfo5o*9Z{s|","fields":{"NUM":0}}},"J2":{"shadow":{"type":"angle_slider","id":"tyv%mySXpKr@%RcG@dz|","fields":{"NUM":0}}},"J3":{"shadow":{"type":"angle_slider","id":"tVWfwZN@hXic92xbk`v@","fields":{"NUM":0}}},"J4":{"shadow":{"type":"angle_slider","id":"U_)c_4#xU4$(e}aKLXT4","fields":{"NUM":0}}},"J5":{"shadow":{"type":"angle_slider","id":"#T,{k|0(oe**I6O=os*~","fields":{"NUM":0}}},"J6":{"shadow":{"type":"angle_slider","id":"g-{5Ai9E+pA1@Co%.9{h","fields":{"NUM":0}}},"SPEED":{"shadow":{"type":"speed_slider","id":"@Lps,h+DEjB*:IOg:-V@","fields":{"NUM":30}}}},"next":{"block":{"type":"time_sleep","id":",(qI6{sBFlw:)]Da1P:P","inputs":{"TIME":{"shadow":{"type":"speed_slider","id":"$Hh{:.DBUk(!wjgr#gn%","fields":{"NUM":5}}}},"next":{"block":{"type":"send_angles_1","id":"ux.6OX8C5.7?y~Q2A6_r","inputs":{"J1":{"shadow":{"type":"angle_slider","id":"mB}n=C3W4H347)+*~UE#","fields":{"NUM":10}}},"J2":{"shadow":{"type":"angle_slider","id":"I2bO/ygx_o~iP6$Jl@Lv","fields":{"NUM":-36.12}}},"J3":{"shadow":{"type":"angle_slider","id":"Z~2twp?]T5(InW@A51+l","fields":{"NUM":-79.01}}},"J4":{"shadow":{"type":"angle_slider","id":"Ibp9.Ib0}r(3fkkE(Vp(","fields":{"NUM":40.16}}},"J5":{"shadow":{"type":"angle_slider","id":"wy(V^emL.*92kyf.V.xy","fields":{"NUM":2.1}}},"J6":{"shadow":{"type":"angle_slider","id":"fJ$hQ)r]x_syvYjP7aj[","fields":{"NUM":0.17}}},"SPEED":{"shadow":{"type":"speed_slider","id":"?u$DX(t1M!~}[gHSho^]","fields":{"NUM":30}}}},"next":{"block":{"type":"time_sleep","id":"4jGU34@[wZp54N9hR+-E","inputs":{"TIME":{"shadow":{"type":"speed_slider","id":"=0Gu9xMds:)r;MO*`;B6","fields":{"NUM":5}}}},"next":{"block":{"type":"send_angles_1","id":"l#Q)2@lFw;/W}Gv|QGOz","inputs":{"J1":{"shadow":{"type":"angle_slider","id":"Od1-7t[Ow7pc]J.SLWdL","fields":{"NUM":-10}}},"J2":{"shadow":{"type":"angle_slider","id":"IoUlr+h|n!:jKSaW`vyG","fields":{"NUM":-36.12}}},"J3":{"shadow":{"type":"angle_slider","id":"sgrswkZ9.+B*b21t)~,k","fields":{"NUM":-79.01}}},"J4":{"shadow":{"type":"angle_slider","id":"KD;@#uu*[%iQ{7XzbMpj","fields":{"NUM":40.16}}},"J5":{"shadow":{"type":"angle_slider","id":"*P3c,y|2`xrmhUy$`gx-","fields":{"NUM":2.1}}},"J6":{"shadow":{"type":"angle_slider","id":"agH6gJ.wC!JMgy^;+)23","fields":{"NUM":0.17}}},"SPEED":{"shadow":{"type":"speed_slider","id":"Y1ScycZLNK/DlNfzGJ5A","fields":{"NUM":30}}}},"next":{"block":{"type":"time_sleep","id":"z7BbuahzPoD+%XNjM6wA","inputs":{"TIME":{"shadow":{"type":"speed_slider","id":"U:JbaYic^6^h6H9O|~;s","fields":{"NUM":5}}}},"next":{"block":{"type":"send_angles_1","id":"f.FSF]%YE]P_oQpge+Q?","inputs":{"J1":{"shadow":{"type":"angle_slider","id":"+qzPY5qeD^PnT*_~f$(c","fields":{"NUM":0}}},"J2":{"shadow":{"type":"angle_slider","id":"B`Fr8!?W#jUY!yb?0Xu8","fields":{"NUM":0}}},"J3":{"shadow":{"type":"angle_slider","id":"Wmm*nx(70tXoG7|I9lQK","fields":{"NUM":0}}},"J4":{"shadow":{"type":"angle_slider","id":"{.pzH;k+,Cqo(){Ia`9r","fields":{"NUM":0}}},"J5":{"shadow":{"type":"angle_slider","id":"7,%[K%`M8333VKe9[N53","fields":{"NUM":0}}},"J6":{"shadow":{"type":"angle_slider","id":"3VcI)pFQXAw-kpnm75%;","fields":{"NUM":0}}},"SPEED":{"shadow":{"type":"speed_slider","id":"JLO{dx:A?a0PIWuT7TR$","fields":{"NUM":30}}}},"next":{"block":{"type":"time_sleep","id":"QJ|Rv}O-Dj`7CM:KXO?Y","inputs":{"TIME":{"shadow":{"type":"speed_slider","id":"{ga/W6K/M8!xh:A{5bi]","fields":{"NUM":5}}}},"next":{"block":{"type":"send_angles_1","id":"8._;%=EQj2%p%DtZO$z*","inputs":{"J1":{"shadow":{"type":"angle_slider","id":"`Pu^4G.h0?wN-dG;VE=c","fields":{"NUM":-5.44}}},"J2":{"shadow":{"type":"angle_slider","id":"z}-vB+9}v[B_A[CAWlHd","fields":{"NUM":-16.43}}},"J3":{"shadow":{"type":"angle_slider","id":"ynWNc;0tv=3{:8nl[Gtl","fields":{"NUM":-114.87}}},"J4":{"shadow":{"type":"angle_slider","id":"U?MeXUj88@z3.P4q:8RK","fields":{"NUM":61.17}}},"J5":{"shadow":{"type":"angle_slider","id":"9C?:F)XlG0opZ9}%SDb`","fields":{"NUM":0.17}}},"J6":{"shadow":{"type":"angle_slider","id":"9TEJ[tn65-.Yev6QE7hg","fields":{"NUM":0.17}}},"SPEED":{"shadow":{"type":"speed_slider","id":"15YJ.j^[S$;d](p#S=93","fields":{"NUM":30}}}},"next":{"block":{"type":"time_sleep","id":",i;Eq;/$6QSi`v=yz9O3","inputs":{"TIME":{"shadow":{"type":"speed_slider","id":"Ojj}K^z7F^(gS|EQ9kx/","fields":{"NUM":5}}}},"next":{"block":{"type":"send_angles_1","id":"+#.%s2_G%SKp9aw+,TE!","inputs":{"J1":{"shadow":{"type":"angle_slider","id":"|af[tb8[~u~0P^21:_jF","fields":{"NUM":20.83}}},"J2":{"shadow":{"type":"angle_slider","id":"bBG_Ph[Bw]7lci40DLth","fields":{"NUM":41.04}}},"J3":{"shadow":{"type":"angle_slider","id":"B%5HTzFGSqq_^#uqpJ8Z","fields":{"NUM":-149.32}}},"J4":{"shadow":{"type":"angle_slider","id":"g;S87:O:R~(Xa~tS[m~3","fields":{"NUM":28.38}}},"J5":{"shadow":{"type":"angle_slider","id":"xHxkX^t51B=B_h?G%roA","fields":{"NUM":-3.51}}},"J6":{"shadow":{"type":"angle_slider","id":"UsG**$Y(WI(FK@t9Ls%5","fields":{"NUM":0.17}}},"SPEED":{"shadow":{"type":"speed_slider","id":"m!1nnl:Q{b+vk(UGM99R","fields":{"NUM":30}}}},"next":{"block":{"type":"time_sleep","id":"SD8S^1E.,Zx]]}I@|q4$","inputs":{"TIME":{"shadow":{"type":"speed_slider","id":"XTQ6MEl.;`y*r06MJA%!","fields":{"NUM":5}}}},"next":{"block":{"type":"send_angles_1","id":"^9`8k*-xqO1xzp%3M1{%","inputs":{"J1":{"shadow":{"type":"angle_slider","id":"sdaX3~Zp_2Z{Wm)^dtDs","fields":{"NUM":0}}},"J2":{"shadow":{"type":"angle_slider","id":"fA9t~=,7A7;|~^tq7A+9","fields":{"NUM":0}}},"J3":{"shadow":{"type":"angle_slider","id":"8lz5LF[?+]:](#-g[=Y-","fields":{"NUM":20}}},"J4":{"shadow":{"type":"angle_slider","id":"!il1xj+zX(V^pOyq]$w6","fields":{"NUM":55.98}}},"J5":{"shadow":{"type":"angle_slider","id":"u=Dixq84{2qGqNjA@K6f","fields":{"NUM":-0.08}}},"J6":{"shadow":{"type":"angle_slider","id":"kHfuNFO2]hKLL-)z%8V9","fields":{"NUM":0.17}}},"SPEED":{"shadow":{"type":"speed_slider","id":"G_0d-jC%VW:[mj_4uo/{","fields":{"NUM":30}}}},"next":{"block":{"type":"time_sleep","id":"suFoicXLuLv8Fk@[q,[X","inputs":{"TIME":{"shadow":{"type":"speed_slider","id":"3L%EVZ$QOY96:@85?!n)","fields":{"NUM":5}}}},"next":{"block":{"type":"send_angles_1","id":"Ho#Xoq$iDoh(U-XPut=5","inputs":{"J1":{"shadow":{"type":"angle_slider","id":"~QJsfQZK-R18~JQ9b]sf","fields":{"NUM":8.61}}},"J2":{"shadow":{"type":"angle_slider","id":"MR~r-Aie,qOn%xbxu:U0","fields":{"NUM":11.25}}},"J3":{"shadow":{"type":"angle_slider","id":"[!|dQ|tvDkRh!wkSX%XL","fields":{"NUM":-130.78}}},"J4":{"shadow":{"type":"angle_slider","id":"ZMDS+N;7z!w7^e;6hVR.","fields":{"NUM":37.26}}},"J5":{"shadow":{"type":"angle_slider","id":"S1JvG/zk23X|~3Sbr8^I","fields":{"NUM":-8.17}}},"J6":{"shadow":{"type":"angle_slider","id":"@gGe;CgWTOAKJ#oWZGCE","fields":{"NUM":0.17}}},"SPEED":{"shadow":{"type":"speed_slider","id":"Cx}yYFI4%jU*6=;Z9FOO","fields":{"NUM":30}}}},"next":{"block":{"type":"time_sleep","id":"~k+p5pl,07rijX{PjE:|","inputs":{"TIME":{"shadow":{"type":"speed_slider","id":"nJ^UKSU;nS!j?yV?%eY!","fields":{"NUM":5}}}},"next":{"block":{"type":"send_angles_1","id":"~R@}!z%3M#{iAUVxizHP","inputs":{"J1":{"shadow":{"type":"angle_slider","id":"gC[PSV,JEl4NgIdoRcbN","fields":{"NUM":8.61}}},"J2":{"shadow":{"type":"angle_slider","id":"hrRO*UFRD(J-u_`aPakw","fields":{"NUM":39.81}}},"J3":{"shadow":{"type":"angle_slider","id":"L.=cp*G+zpCOl@8CflBL","fields":{"NUM":-139.39}}},"J4":{"shadow":{"type":"angle_slider","id":"U@v*X0+,{%T+6pXhbnJk","fields":{"NUM":10.98}}},"J5":{"shadow":{"type":"angle_slider","id":"w_=,C_xuT0W59K@9`PE0","fields":{"NUM":-8.17}}},"J6":{"shadow":{"type":"angle_slider","id":"YCg_$L/bB,gY80*#1!cM","fields":{"NUM":0.17}}},"SPEED":{"shadow":{"type":"speed_slider","id":"WTv,t6Qr.0#9$;+CD]b7","fields":{"NUM":30}}}},"next":{"block":{"type":"time_sleep","id":";:!z7hh0i^kq7Uk@~b5s","inputs":{"TIME":{"shadow":{"type":"speed_slider","id":"mEP^#ajz9:tPa8/S]+8?","fields":{"NUM":5}}}},"next":{"block":{"type":"send_angles_1","id":"Pt/G=TQ$~uJ5J66JNDux","inputs":{"J1":{"shadow":{"type":"angle_slider","id":"/F)r1.-huFi`)u_gf]PI","fields":{"NUM":0}}},"J2":{"shadow":{"type":"angle_slider","id":"}dWQVl8r0ru6y-e4=xv(","fields":{"NUM":0}}},"J3":{"shadow":{"type":"angle_slider","id":"WW(A:YNR-kYcqMlBBpp2","fields":{"NUM":0}}},"J4":{"shadow":{"type":"angle_slider","id":";m-w[}X6=T)q@d9ycGD1","fields":{"NUM":0}}},"J5":{"shadow":{"type":"angle_slider","id":",dWehXs0`w+fWT6+LlCC","fields":{"NUM":0}}},"J6":{"shadow":{"type":"angle_slider","id":"vU=dx{p0e.S1_^Sx*M6Y","fields":{"NUM":0}}},"SPEED":{"shadow":{"type":"speed_slider","id":"Akzjggf3R?j-HW|%[4_A","fields":{"NUM":30}}}},"next":{"block":{"type":"time_sleep","id":"Zpv|y4VEZ|.1iiGIm9wA","inputs":{"TIME":{"shadow":{"type":"speed_slider","id":"{7#2(`gaJ-6tAztH}MZo","fields":{"NUM":5}}}},"next":{"block":{"type":"release_all_servos","id":"!mefP$*|VW%%uU3]SLrP"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}]}}}
そして、2023年始まってすぐに清書してみたところ、変に偏りがなくて悪くないですね。
今回の成果物として年が明けたので書き初めしてみた
— KMiura (@k_miura_io) 2022年12月31日
地味だけどこれが限界ですw#mycobot #大晦日ハッカソン pic.twitter.com/h0XDEtXNMj
まとめ
今回はmyCobotで書き初めをやってみました。
大晦日にふと思いついてやってみたネタでしたが、思ってたよりもうまく形になって良かったです。
それもダイソーにあるもので手軽にできたのが大きかったです。
そしてBlocklyをうまく活用すれば今回みたいな文字を書くような複雑な動きもやろうと思えばできるのは便利ですね。
本当はこういうのってちゃんと逆運動学とかで計算するんでしょうけど、大学で心が折れた人なのでそこまでやろうとは思わないです…(本格的にプログラムする上で避けては通れないでしょうけどね…)