M5Stack Core S3を動かしてみた

お久しぶりの投稿です。

ここ数ヶ月仕事でいっぱいいっぱいでなかなかブログを更新する気力もありませんでしたが、仕事が少し落ち着いてきたので久々にブログを更新してみます。

今年の連休にM5Stackのメンバーが来日してジャパンツアーとして全国各地でイベントがあり、その東京会場に参戦するべく東京に遠征してきました。

Twitterでしか見かけなかった方からお久しぶりな方までお会いすることができて最高に楽しい時間でした。

このイベントでM5StackのCEOであるJimmyのセッション中にこの日に日本で発売されたばかりのM5 Stack Core S3の紹介がありました。

来日記念でクーポンコードもあったのでこの日のホテルで即注文しました。

連休明けの迅速な出荷作業のお陰で思ってたよりも早く到着しました!

というわけで今回はこの 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ファイルをダウンロードします。

ArduinoIDEから Sketch→Include Library→Add .ZIP Libraryでダウンロードしたzipファイルを選択するとインストールが実行されます。

ボードマネジャーをインストール

Arduino IDEFile→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ネジ
  • ゴム足

ネジ以外はカインズで買い揃えました。(ネジは奇跡的に家に残ってました)

工具も買ったので少し高めですが、工具抜きであれば数百円で必要なものは揃います。

ハードウェア情報をM5版と勘違いしてネジを買い間違えました…

組み立て

買ったドリルの経が狭くてネジがうまく入らず無理やりこじ開けてなんとか対角線上にはネジを差し込むことができました。

myCobotの方のネジ穴が結構ギリギリなのでまっすぐ挿すのに一苦労です。木の机なのでおいてみると意外としっくり来ますね。

動かしてみた

台座に固定したところで試しに以前動作確認用に作った簡単なデモを動かしてみました。

supernove.hatenadiary.jp

これも動かすだけですぐ倒れてしまいますが台座のおかげで安定するようになりました!

#まとめ 今回はmyCobot用の台座を自作してみました。

ドキュメントのハードウェア情報を頼りになんとか作ることができました。

M5版とRaspberry Pi版では規格が違ってある意味勉強になりました。

なにより、純正品のアクセサリよりも格安に作れたのがデカイですね。

あんまり違和感ない感じになったので気が向いたらちゃんと程よい太さのドリルビット買ってきて穴を広げようと思います。

myCobotで書き初めやってみた

2023年最初の投稿です、あけましておめでとうございます。

去年はROSに始まり、転職をきっかけにROSであれこれ遊ぶようになりました。

今年もROSをはじめロボットやガジェットでゆるく遊んでいこうと思いますのでよろしくお願いします。

さて、新年の行事といえば書き初めがあります。

大体の方は小学校や中学でやってたんじゃないかと思います。

前回myCobotを触りましたが、何かしらネタがあったほうがいいなと思い頭の中であれこれ考えてたら、新年に向けてこの書き初めをネタにしたら季節感もあって面白いんじゃないかと思いつきました。

supernove.hatenadiary.jp

というわけで今回はmyCobotで書き初めをやってみたいと思います。

ネタの仕入

早速大晦日に筆ペンと落書き帳をダイソーで買いました。

ガチの書道セットは流石に準備が大変なのと下手するとmycobotが汚れそうな気がするのでやめておきましたw。

セッティング

買ったペンをmyCobotの先端に取り付けました。

固定はめちゃめちゃ簡単に養生テープでやりましたw。

台座はあり物の空き箱を積んで用意しました。大体13cm〜15cmぐらいの高さで紙をのせました。

ある程度の高さがあったほうがアームの可動範囲が広くなります。

そしてロボットは例のごとく(?)手で抑えますw。

モーション作り

ここからはひたすらモーションを作りました。実際に筆を置きながらアームの姿勢を決めていきました。

姿勢を決めるときにはBlockyのQuickMove(画面右上の赤丸をクリックして表示)を使って各ジョイントの角度を取得していきます。

後は取得した姿勢をブロックに入れていくという地道な作業を続けるだけです。

試しに簡単に横線を引きました。

動画のペンで書いたときには仕上がりが普通の水性ペンとあまり大差なかったので、もう片方のペンに付け替えてみたら意外とそれっぽい仕上がりになりました。

それなりの太さがあって筆の強弱がわかりやすくなりました。

今度は何かしらの文字を書くようにしてみました。

書く文字はカタカナの「イ」です。日本でブラウン管テレビを発明したときに最初に表示した文字でもあり、文字のなかで一番分かりやすい気がします。

文字はシンプルですが、筆の位置を決めても筆が浮いてしまったり予想外の方向に動いてしまったりして結構大変でした。

筆の固定位置を修正したり何度か角度を調整し直してなんとか書くことができました。

清書

これで感覚がつかめたのでいよいよ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年始まってすぐに清書してみたところ、変に偏りがなくて悪くないですね。

まとめ

今回はmyCobotで書き初めをやってみました。

晦日にふと思いついてやってみたネタでしたが、思ってたよりもうまく形になって良かったです。

それもダイソーにあるもので手軽にできたのが大きかったです。

そしてBlocklyをうまく活用すれば今回みたいな文字を書くような複雑な動きもやろうと思えばできるのは便利ですね。

本当はこういうのってちゃんと逆運動学とかで計算するんでしょうけど、大学で心が折れた人なのでそこまでやろうとは思わないです…(本格的にプログラムする上で避けては通れないでしょうけどね…)

myCobot 280 Piを買ってみた

前から気になってて買うかどうか迷ってたものがあります。それがmyCobotです。

中国深センのElephant Roboticsが製造している格安のロボットアームです。

日本でもスイッチサイエンスでいろいろ売られていて個人の趣味で使っていたり、ビジネスで活用している事例もちらほら見るようになりました。

そんなわけで僕もお試しでシュミレータで遊んでみました。

zenn.dev

遊んでいたやっぱり実機が欲しくなりました。

というわけでスイッチサイエンスの年末セールでめちゃくちゃ安くなっているうちに買ってしまいました!まだ出ていませんが、ボーナスが出ることを考えると実質ボーナスで買ったようなもんですw。

今回購入したロボットは、中にRaspberry Piが使われているモデルで、買ったときの価格はなんと107,057円でした。

もっと安いM5 Stackのモデルでもいい気がしましたが、Raspberry Piにしておけば開発環境が本体に入っていて導入が簡単な気がしたのでRaspberry Piのモデルを選びました。(最近Arduino全然触ってなくてM5 Stackも触ったことないのもありますw)

というわけで今回はこれを開封して動かしてみたいと思います。

開封の儀

期待に胸を膨らませ開封の儀です。中に使われていた緩衝材は持ち運ぶときに使えそう。

開封して真っ先に出てきた冊子はmyCobotについての紹介と簡単なデータシートが載ってました。

付属品はACアダプターとディスプレイに接続するためのHDMIとUSB TypeC、GPIOに接続する用のジャンパーケーブルでした。

意外と充実してる印象。

本体はこんな感じで折り畳まれて入ってました。

SDカードはすでに刺さってました(実質これも付属品みたいなもん?)。32GBが刺さっていて十分いろいろ遊べそうです。

初起動

ディスプレイとキーボードを接続して電源を入れましたが、なかなか画面が映らず苦戦しました…

接続するHDMIの端子を変えたら無事に画面が映りました。初期不良かと思って焦りましたw

Ubuntuは18.04が中に入っていて、ROSのmelodicがすでにインストールされてました。

軽く動かしてみる

無事に起動したところでアームを簡単に動かしてみます。

今回はRaspberry Piにプリインストールされたブロックプログラミングツールの「Blockly」を使ってアームを動かしてみます。

UIFlowのようなツールでプログラミング初心者でも手軽にロボットアームを操作できる仕組みになっています。この手軽さもRaspberry Piバージョンならではですね。

アームの姿勢は各ジョイントの角度と移動速度を指定するだけでフローに組み込めます。

↑の画像のフローは以下のJSONです。このJSONを適当なファイル名で保存してBlocklyのメニュー(右上の青いアイコン)から loadをクリックしてJSONファイルを読み込んでフローを試していただけます。

{"mode":"single","json":{"blocks":{"languageVersion":0,"blocks":[{"type":"init_mycobot","id":"uaX`U[m134rqSFY~Xsh}","x":10,"y":10,"fields":{"ROBOT":"MyCobot","BAUD":"1000000"},"inputs":{"PORT":{"shadow":{"type":"text","id":"J+-+mda/:}Y-+w{E:$=0","fields":{"TEXT":"/dev/ttyAMA0"}}}},"next":{"block":{"type":"send_angles_1","id":"C=VMoJpiGwzGD4MFP[IR","inputs":{"J1":{"shadow":{"type":"angle_slider","id":")oMGRn/k#V!ocD}~nd{O","fields":{"NUM":0}}},"J2":{"shadow":{"type":"angle_slider","id":"LpVGrUW*Ynse+N~^Yq3M","fields":{"NUM":0}}},"J3":{"shadow":{"type":"angle_slider","id":"3sN+mVz]tCX9Q~ifMRvh","fields":{"NUM":0}}},"J4":{"shadow":{"type":"angle_slider","id":"T#bY4NRmAha[;aP$$`nY","fields":{"NUM":0}}},"J5":{"shadow":{"type":"angle_slider","id":"D5p7BhS?ccjVijp6q{`:","fields":{"NUM":0}}},"J6":{"shadow":{"type":"angle_slider","id":"pdYOE27s]c0s|4claR~(","fields":{"NUM":0}}},"SPEED":{"shadow":{"type":"speed_slider","id":"`.Gqdg3kDY#w@Nt:#%Lx","fields":{"NUM":30}}}},"next":{"block":{"type":"time_sleep","id":"ZQ;itb$yoEWcH:$l#{-x","inputs":{"TIME":{"shadow":{"type":"speed_slider","id":"$2A%Y8L6ER,(^Uh_cKh:","fields":{"NUM":5}}}},"next":{"block":{"type":"send_angles_1","id":"JojW]r:0[}i7VeH;(48Z","inputs":{"J1":{"shadow":{"type":"angle_slider","id":"ug(]|NW$H%w-IbX5E^6B","fields":{"NUM":84}}},"J2":{"shadow":{"type":"angle_slider","id":"yb`$u_6q{xCmcerpc5k,","fields":{"NUM":-32}}},"J3":{"shadow":{"type":"angle_slider","id":"iVnqBlS37bvaJSf8mqd@","fields":{"NUM":-49}}},"J4":{"shadow":{"type":"angle_slider","id":"6*N88fhsf!Fl5sayN#h1","fields":{"NUM":46}}},"J5":{"shadow":{"type":"angle_slider","id":"At#_uYvI`[#z=Y4eR[.W","fields":{"NUM":-17}}},"J6":{"shadow":{"type":"angle_slider","id":"B=h*GS-kr1T]Vq0=#ZeL","fields":{"NUM":0}}},"SPEED":{"shadow":{"type":"speed_slider","id":"K/%yeBZz[V{be5g),3GO","fields":{"NUM":30}}}},"next":{"block":{"type":"time_sleep","id":"HJl$/:}64`M38v+sb4}h","inputs":{"TIME":{"shadow":{"type":"speed_slider","id":"L}PwKatHN=)foFUh)(#)","fields":{"NUM":5}}}},"next":{"block":{"type":"send_angles_1","id":"G7!%wy_GQtH#K]@p[(vB","inputs":{"J1":{"shadow":{"type":"angle_slider","id":"yh#[c{E7G|H.#njQ3Uzf","fields":{"NUM":-84}}},"J2":{"shadow":{"type":"angle_slider","id":"VeO#{=-K?GIOQl[*YHv(","fields":{"NUM":29}}},"J3":{"shadow":{"type":"angle_slider","id":"R~:~mLAHHuf*fUQL1g4{","fields":{"NUM":40}}},"J4":{"shadow":{"type":"angle_slider","id":"cpmN=i!E(5_7*jH|cR:4","fields":{"NUM":9}}},"J5":{"shadow":{"type":"angle_slider","id":"ew##4,aEGqnAc?-ocKD?","fields":{"NUM":37}}},"J6":{"shadow":{"type":"angle_slider","id":"@MYBM!Ys?|l_ciA]w|J8","fields":{"NUM":0}}},"SPEED":{"shadow":{"type":"speed_slider","id":"#_.(6dVi{/#B%pfdKe3O","fields":{"NUM":30}}}},"next":{"block":{"type":"time_sleep","id":"kp+=n}VCP:tGwl:5UWKJ","inputs":{"TIME":{"shadow":{"type":"speed_slider","id":"*ZB7lBh4RVzbCU0cUN5o","fields":{"NUM":5}}}},"next":{"block":{"type":"send_angles_1","id":"}q|wzzu,D.U)lY=)T9ox","inputs":{"J1":{"shadow":{"type":"angle_slider","id":"C`34CHdra_I!x]T5TKe4","fields":{"NUM":0}}},"J2":{"shadow":{"type":"angle_slider","id":"8j5ucjs1teV`_r3LGjU[","fields":{"NUM":0}}},"J3":{"shadow":{"type":"angle_slider","id":"Tfy;6/k5}*B*/A,M:9N!","fields":{"NUM":0}}},"J4":{"shadow":{"type":"angle_slider","id":"`G@{:]d]7GX*@F6v_kZ5","fields":{"NUM":0}}},"J5":{"shadow":{"type":"angle_slider","id":"K-{#{n0FPdBWc;DD4Pp*","fields":{"NUM":0}}},"J6":{"shadow":{"type":"angle_slider","id":"3QZpx%C9?u3o/=BhKZO.","fields":{"NUM":0}}},"SPEED":{"shadow":{"type":"speed_slider","id":"n?bzQP`%n$7XwbP2m42W","fields":{"NUM":30}}}},"next":{"block":{"type":"time_sleep","id":"9P56?4Bq#QqzME[(F4VA","inputs":{"TIME":{"shadow":{"type":"speed_slider","id":"qC9FQY8Jgh(p3m%vZLAC","fields":{"NUM":5}}}},"next":{"block":{"type":"release_all_servos","id":"!%!(0s%j-;y@d8.0rz0Z"}}}}}}}}}}}}}}}}}}}]}}}

フローを動かすと以下の動画の動きになります。

固定具がないとすぐ倒れてしまうので、よく見ると土台を手で抑えてますw

myCobotの先端部分にはM5 Atomが使われており、LEDマトリクスの色をBlocklyから変えることもできます。

そのフローも作ってみたので以下のJSONで試すことができます。

{"mode":"single","json":{"blocks":{"languageVersion":0,"blocks":[{"type":"init_mycobot","id":"uaX`U[m134rqSFY~Xsh}","x":10,"y":10,"fields":{"ROBOT":"MyCobot","BAUD":"1000000"},"inputs":{"PORT":{"shadow":{"type":"text","id":"J+-+mda/:}Y-+w{E:$=0","fields":{"TEXT":"/dev/ttyAMA0"}}}},"next":{"block":{"type":"send_angles_1","id":"C=VMoJpiGwzGD4MFP[IR","inputs":{"J1":{"shadow":{"type":"angle_slider","id":")oMGRn/k#V!ocD}~nd{O","fields":{"NUM":0}}},"J2":{"shadow":{"type":"angle_slider","id":"LpVGrUW*Ynse+N~^Yq3M","fields":{"NUM":0}}},"J3":{"shadow":{"type":"angle_slider","id":"3sN+mVz]tCX9Q~ifMRvh","fields":{"NUM":0}}},"J4":{"shadow":{"type":"angle_slider","id":"T#bY4NRmAha[;aP$$`nY","fields":{"NUM":0}}},"J5":{"shadow":{"type":"angle_slider","id":"D5p7BhS?ccjVijp6q{`:","fields":{"NUM":0}}},"J6":{"shadow":{"type":"angle_slider","id":"pdYOE27s]c0s|4claR~(","fields":{"NUM":0}}},"SPEED":{"shadow":{"type":"speed_slider","id":"`.Gqdg3kDY#w@Nt:#%Lx","fields":{"NUM":30}}}},"next":{"block":{"type":"set_color","id":"8.(fA}%?.wBe([[oTNce","inputs":{"R":{"shadow":{"type":"math_number","id":"1o9P4^rVVSLHviG?;l)o","fields":{"NUM":255}}},"G":{"shadow":{"type":"math_number","id":"xq5s$kbb5!fC4U$#=ru4","fields":{"NUM":0}}},"B":{"shadow":{"type":"math_number","id":"`K@gUA(18l.5b@ulU#Rt","fields":{"NUM":0}}}},"next":{"block":{"type":"time_sleep","id":"J$MkTj8oxb,k%JK*aD{x","inputs":{"TIME":{"shadow":{"type":"speed_slider","id":"I$#Ner:3)|WC._YLE;7s","fields":{"NUM":3}}}},"next":{"block":{"type":"set_color","id":"+_s*|V1Fo2M1sHzW9;6;","inputs":{"R":{"shadow":{"type":"math_number","id":":Qd:9J*F*2$cnZnu;lIa","fields":{"NUM":0}}},"G":{"shadow":{"type":"math_number","id":"ZZ@=a];R8d:cUT2_v@=:","fields":{"NUM":0}}},"B":{"shadow":{"type":"math_number","id":"`}Qe-WqU7?0iOFCe)Y^!","fields":{"NUM":255}}}},"next":{"block":{"type":"time_sleep","id":"yp}u8P;Ru|iU*tzvWI9;","inputs":{"TIME":{"shadow":{"type":"speed_slider","id":"OiH4y/iqXZ]*(r0M9^au","fields":{"NUM":3}}}},"next":{"block":{"type":"set_color","id":"P}kE+@}j=I8pWn+F(~+0","inputs":{"R":{"shadow":{"type":"math_number","id":"1H@ce@;R8|GwxUt@eUl?","fields":{"NUM":0}}},"G":{"shadow":{"type":"math_number","id":"{~vz[812.$)E0M6*{cU,","fields":{"NUM":255}}},"B":{"shadow":{"type":"math_number","id":"OWgbZG|SUQk+X%DObiu$","fields":{"NUM":0}}}},"next":{"block":{"type":"release_all_servos","id":"!%!(0s%j-;y@d8.0rz0Z"}}}}}}}}}}}}}}}]}}}

フローを動かすとLEDマトリックスの色が順番に変わります。

Blocklyからアームの姿勢角を確認することもできます。

画面の右上にある赤いアイコンをクリックしてポートに接続すると姿勢角を表示できるようになります。

まとめ

今回はmyCobot 280 Piを触ってみました。

Raspberry Piを使うことでLinuxを使ったロボットプログラミングを本体で直接できるのはとても魅力的で高くてもRaspberry Piバージョン買ってよかったです!

なによりROSがセットアップされているので、以前試したMoveitを使って制御ができそうです。

おまけ

完全所見で遊んでましたが、後になって調べたら公式ドキュメントがあることに気づきましたw

これでできることが更に増えそうです。

docs.elephantrobotics.com

reComputer J1010をUSBブートさせてみた

この記事はSeeed UG Advent Calendar 2022 18日の記事です。

今更ながらJetson nanoを触ってみたくなり、Jetson nano開発者キットを探そうとすると在庫が全然なくて買えないんですよね…(執筆時点では値上げして販売再開されましたね)

そんななか、今年に入ってSeeedさんからJetsonモジュールを搭載したreComputerが発売されました。

lab.seeed.co.jp

まだJetson nano開発者キットの在庫がないときに試しに一番安いJ1010を買ってみました。(Bazaarで買ったのでついでに何個か小物買いました)

販売再開されたJetson Nano開発者キットの価格よりは割高ですが、蓋付きのアルミケースがあることを考えると値段としては妥当じゃないかなと思います。

でこのreComputerがJetson Nano開発者キットと大きく違う点がデフォルトのブートデバイスがeMMCであることです。

電源入れればすぐ起動することができるのはメリットですが、16GBしかないのでガッツリ色々ソフトを入れるとストレージが圧倒的に足りません。

というわけでガッツリ遊びたければディスク拡張をしていきたいわけです。

それで調べてみたらSSDでディスクを拡張する方法がありますが、残念ながら今回買ったJ1010はSSD接続用の端子がないのでこの方法が使えません…

lab.seeed.co.jp

というわけでUSBブートさせる方法をさがしてドキュメントが見つかりましたが、説明がよくわからなくてうまくいきませんでした…

wiki.seeedstudio.com

なので今回はうまくいった拡張方法を書いておきます。

用意するもの

用意するのは16GBより大きいサイズのUSBメモリーだけです。今回は64GBのUSBを用意しました。

クリーンインストール

まずは以下の記事を参考にOSをクリーンインストールします。USBケーブルの選定で地味に苦戦しましたがM5 Stackで使うType-Cケーブルだと接続できました。

lab.seeed.co.jp

USBをフォーマットする

今度はUSBをフォーマットします。USBのボリュームを選択して Format Volume をクリックしてext4形式にフォーマットします。

ボリューム名は自分が分かればいいので何でもOKです。

フォーマット後、ディスクがマウントされてないときは画像の赤丸の箇所が再生ボタンのマークになっているのでクリックして四角なっていることを確認します。

また、あとで使用するのでデバイスのパスも確認しておきます。

USBから起動できるようにする

以下のコマンドでセットアップに必要なスクリプト一式をクローンします。

git clone https://github.com/limengdu/rootOnUSB.git

クローンしたら起動時の早い段階でUSBが認識されるようにする設定をするスクリプトを実行します。

cd rootOnUSB
./addUSBToInitramfs.sh

以下のスクリプトを実行して起動ファイル一式をUSBにコピーします。引数に指定しているデバイスのパスはフォーマット時に確認したものに書き換えます

./copyRootToUSB.sh /dev/sda1

最後にUSBのrootfsから起動されるようにするために /boot/extlinux/extlinux.confAPPEND の行を以下に書き換えます。

この他にもデバイスのUUIDを指定する方法やディスクのボリューム名を指定する方法があります。

APPEND ${cbootargs} root=/dev/sda1 rootwait rootfstype=ext4

再起動後、以下のようにルートのパス( / )がUSBでマウントされてたらUSBブートは正常に成功しています。

以下はJetPack(Jetson向けのSDK一式)をインストールしたあとのディスク容量ですがそれでもディスク容量に問題ないことが確認できました。

これでディスク容量に悩まされることなく開発を進めることができますね!

$ df -h .
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        57G   12G   43G  21% /

参考

github.com

【検証】WiMAXのモバイルルーターでSORACOMのSIMはつかえるのか?

この記事はSORACOM Advent Calendar 2022 5日目の記事です。遅刻してゴメンナサイ

今年は転職して週4リモート生活からほぼ毎日出社な生活に変わり外出する機会が増えました。

そして行き帰りの電車やら出先でPC触る機会も増えてきました。

そうなると携帯でテザリングする機会が増えますが、それだったらWifiルーターが欲しくなるわけです。

というわけで学生以来久々にジャンクなWiMAXモバイルルーターを格安で入手しました。動作未チェックで500円でした。

取扱説明書や変換コネクタなどの付属品はだいたい入っていたので動いたら結構な当たりです(もともとついてなかったType-Cケーブルも入ってたのでだいぶお得w)。

とりあえず充電して通電確認をすると普通に起動できました。

ここまでできたらあとはこのルーターに使うSIMの選定です。プリペイドのSIMでもいいですがいつの間にか使えなくなるのは辛いですし、格安SIMを契約するにしても使用頻度にばらつきがあるので定額よりも従量課金がいいなーと思いました。

ん、従量課金のSIM…?

SORACOMがあるじゃないかーーー!!

というわけでここまで前置きが長くなりましたが今回はこのモバイルルーターでSORACOMのSIMが使えるのか検証していきます。

今回用意するSIM

WiMAXau回線を使っています。

なので今回用意するSIMはau回線を使うプランでPCに接続して使えるぐらいの程よいバンドルのplan-K2を選択しました。

引用元:https://soracom.jp/services/air/cellular/

注文後、翌日には宅配ボックスに届きました。あいかわらすのスピード出荷!

SIMの注文自体久々で新デザインのやつも初めて手にしました。

受け取ったら忘れずにSORACOMのユーザーコンソールから受け取り確認、登録をしておきましょう。これでSIMが使える状態になります。

users.soracom.io

ルーターに挿入する

このルーターにはナノサイズのSIMが入るので一番小さいサイズにカードを切り抜きます。

カードを切り抜いたらルーターの電源を落としている状態で端子部が画面側に向くように差し込みます。

カードを奥まで差し込んで電源を入れます。電源を入れて左上の通信ステータスが圏外になっていればSIMは問題なく認識しています。

この時点ではまだネットワーク設定をしてないので、外部のネットワークに接続できない状態です。

ネットワーク設定をする

今度はネットワーク設定をしていきます。

アクセスポイントの設定は以下のドキュメントを参考にセットアップしていきます。

users.soracom.io

PCかスマホのブラウザでルーターWifi接続をします。

接続したらブラウザで http://192.168.100.1 に接続します。

デフォルトではユーザー名は admin 、パスワードは手持ちのルーターのIMEIの下5桁です。(ちなみに今回のルーターは初期化されてたっぽく問題なくデフォルトのログイン情報でログインできました)

本体をロックしないとログインできないので、ロックしておきましょう。

ログイン後、設定タブをクリックして左のメニューから プロファイル設定 を開きます。

画面下部の 新規をクリックして以下の情報を記載します。

  • プロファイル名: 任意のもの
  • APN(接続情報): soracom.io
  • ユーザー名: sora
  • パスワード: sora
  • 認証タイプ: CHAP
  • IPタイプ: IPv4 & IPv6

入力したら 保存をクリックします。

あとはターミナルで ping pong.soracom.ioを実行して疎通確認が取れたらネットワーク設定は正常に完了しています。

おまけ

せっかくなのでスピードテストをやってみました。

IoT向けのSIMなのでそこまで早くはないですが、出先で軽く使う分には問題ないと思います。

おまけ その2

実際に地下鉄でPCにWifi繋いでこのブログの修正してますが、携帯でテザリングしてた時よりも遅延が少ないのでかなり快適に作業できています!

これでWifi問題は解決です!

まとめ

今回はWiMAXモバイルルーターでSORACOMのSIMを使ってみました。

お手頃に外でネットワーク接続できるようになったので出先の作業もやりやすくなったと思います。

WifiバイスをSORACOMに接続したいときの一つのツールとしても良さそうです!

パトライト(NHL-3FB1)をHTTP通信で操作してみた

前回は大須で買ったパトライトCLI操作できるようにしてみました

supernove.hatenadiary.jp

このパトライトではHTTP通信ができると思って買いましたが、中のファームウェアが古くてHTTP通信に対応してませんでした。

というわけで今回はファームウェアを更新してHTTP通信ができるようにしてみます。

ファームウェアをアップデートする

まずは最新のファームウェアを入手していきます。

ちなみにHTTP通信に対応したファームウェアは1.45から対応していますが、2022年11月時点では最新のファームウェアは1.46です。

なので最新のファームウェアをダウンロードすれば良さそうです。

ファームウェアをダウンロードするにはお客様登録する必要があります。無料で登録できます。

以下のリンクのフォームから名前やメールアドレスなど、必要な情報を記入して送信すると担当者からメールでファームウェアのダウンロード先とダウンロードに必要なログイン情報が送信されます。(ちなみに個人でもちゃんと受け付けてくれました)

www.patlite.jp

あとはメールに書いてあるファームウェアをダウンロードして中に入っているreadmeに沿ってファームウェアをアップデートするだけです(流石に詳細な手順を書くとメーカーの禁則事項に触れそうなのでやめておきます)

最終的にファームウェアの更新時に再起動された後に管理ツールの システム設定 を開いてファームウェアバージョンが1.46になったらファームウェアのアップデートは成功です。

さらに一番下のHTTPコマンド制御機能が有効になっていればHTTP通信で表示灯を操作する準備は完了です。

HTTP通信をしてみる

準備整ったところで、HTTP通信やってみます。

APIのリクエスト構文はすべて共通でhttp://<IP address>/api/control?<パラメータ名>=<値>になっていてメソッドは GETです。

なのでcurlコマンドだと以下のような超シンプルなコマンドを叩けば操作できます。

curl "http://<IP address>/api/control?<パラメータ名>=<値>"

パラメータ名は controlclear の2パターンで回転灯の光らせ方やブザーの鳴らし方を制御するのは controlで回転灯やブザーを完全に止めるのは clearになります。

前回のブログでやってた制御コマンドよりもライトの点灯、点滅パターンを10進数の形式で細かく制御できるのでかなり直感的です。

例えば赤をパターン3で点滅させてブザーのパターン3を鳴らしたいときには以下のコマンドを叩きます。パラメータ値の9は現状維持なので、OFFにしたいときは0に設定します。

curl "http://192.168.10.1/api/control?alert=399993"

全部消灯したいときはalertの値をすべて0にしてもいいですが、パラメータをclearにして以下のコマンドで消灯するのが簡単です。

curl "http://192.168.10.1/api/control?clear=1"

ここで紹介したコマンドをreTerminal上で叩いたら無事に動きました!

リクエストのパラメータ設定方法は結構簡単にドキュメントがわかりやすいので以下リンクの取扱説明書の 3.20 HTTPコマンド制御機能をみてもらうと分かりやすいです。

https://www.patlite.jp/download/NH-SPL-ManualT95100138_01.pdf

まとめ

今回はHTTP通信を使ってパトライトを制御できるようにしました。

やっぱりWebエンジニアの自分からするとcurlコマンドでHTTP叩いて制御できるのは気持ちいいですね。

これでいろいろ遊ぶ準備ができたのでまた何個かネタを仕込んでみますよー!