dev + delights

子供と楽しく電子工作・プログラミング + 親の勉強

"小学1年生"の付録パズルをATOM Mate for toioで遊び倒す!

本記事は、toio Advent Calendar 2022の参加記事です。クリスマスが近づいてきました。

ATOM Mate for toio™ — スイッチサイエンスの発売で toio熱が復活したところで

タイムラインを見ると 小学一年生 2022年 12月号 [雑誌] に 面白そうな付録が1

このパネルの形状は、その昔大流行したチクタクバンバンというゲームのパネルと全く同じです。この付録のパネルにストローを巻きつけたtoioに乗せると

こんな感じで軽快に動作します。

付録の内容は、予め決められた位置にパネルを配置し、ポケモンのキャラクターを目印にパズルを解くことで、「プログラミング的な思考」を学ぶ内容でした。

この付録のパネルとATOM Mate for toio を使って発展させてみます。

まずは紙工作でデコレーション開始

ポケモンの存在感があまりにも強いので、まずは以前作成した自前のキャラクターに着せ替えます。

toio.io

こんな感じでデコレーションしてみました。

この時点でtoioを走らせ、パズルっぽい動きをさせると以下のような感じです。今回の付録は8個のパネルですが、十分パズルっぽい動作は体験できました。

次にArduino & 電子工作でデコレーション

ATOM Mate for toioの紹介記事としては、UIFlow上で、内蔵の距離検出センサ(VL53L0X)やAtom MatrixのLEDを用いたサンプルが紹介されているようです。今回は、LEDが1個しか無いAtom LiteとSSD1306を搭載したI2C接続の液晶を接続してみます。

センサ・液晶の接続

Arduinoのライブラリをそのまま使わせてもらいました。

今回利用する二つのデバイスのうち、距離センサはATOM Mateに内蔵されているのですが、両方のデバイスと通信するために、I2Cを2系統設定する必要があります。ArduinoのESPのI2Cの実装は、

github.com

WireWire1として実装されています。それらにATOMのピン番号を割り当てます2

のように、26,25と26,32 をそれぞれセットすればよいのですが、ライブラリによってはWireインスタンスのみ前提のケースがあるので、その場合はWire1を設定するように書き換えてあげると良いと思います。今回のデバイスの場合、以下のように初期化すると動作させました。

#include <M5Atom.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <VL53L0X.h>

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire1, OLED_RESET);
VL53L0X sensor;

void setup() {
  M5.begin(true, true, true); 
  Wire1.begin(26,32);
  Wire.begin(21,25);

液晶をGROVE端子で接続

液晶に元々ついていたピンヘッダを外し、GROVE端子で直接接続します。 以下のような接続にしてみました。SCLとSDAの位置がGROVE端子の並びだと液晶のピンの位置と反対なのでケーブルをクロスする必要がありました。

パネル上でいざ走行

手を検出すると、走行停止・再開を繰り返し、画面上のキャラクターが目をつぶるようなスケッチを書いてみました。

最終的な動作はこちらです。子供の反応も上々でした。

ATOM Mate for toio の感想

ATOM Mate for toioを組み合わせることで、ただ走行するだけでなく手やパズルなどの障害物とのインタラクションが増えることで色々な発想が生まれてきそうです。引き続き他のデバイスとの組み合わせなどを模索してみたいと思います3

www.youtube.com


  1. この記事が公開される頃にはバックナンバーになっているかもしれません。
  2. https://docs.m5stack.com/en/core/atom_lite
  3. toioのキューブの中にあるハードウェアに物理的に直接アクセスできるピンとか、ATOM Liteをキューブに内蔵できるなど、より融合してくれると嬉しい気もします。

改造Scratch環境でプログラミング - ロボット作成も

今年の年始に購入した以下の書籍、手付かずで放置していました。 Scratch1 相当の環境をクローンして、独自拡張のブロックを作成し、Visual Programming でデバイスを動作させよう、という特集のようです。

基板のプレゼントもあり、GETしていたままだったので今年のうちにと、重い腰を上げて組み立ててみました。先に組み上がった様子を載せると

こんな感じです。記事に沿って作業した様子を書いてみます。

まずはVisual ProgramingでLチカを体験

スイッチサイエンスのESP32の開発ボードを使いました。USB-Cで繋がるのでお手軽です。

作者の方が用意した、TuKuRutch 3.07から、

  1. シリアルモニタのファームウェア書き込みブロック
  2. GPIOによるLチカのコードのブロック

を並べてそれぞれタップします

本題の前に部品調達

本編では、設定ファイルからWindows上でコードを生成して独自ブロックを作成するのですが、Macしかないので 諦めてロボットの組み立てから行います。サポートページから部品表2と回路図を入手します。

秋月電子から

電池ボックス, アルミ電解コンデンサ100uF x 2, 積層セラミックコンデンサー 0.1μF, ダイオード, 面実装のLED x 43, ピンヘッダ, ピンヘッダ(L字). LED, 4.7Ωと1kの抵抗, ブザー, スライドスイッチ, ピンソケット, L字ピンソケット, モータードライバーモジュール, カメラモジュール

持っているESPの開発基板とはピンの配置が違うことに気がつきました。嵌るのも面倒なのでこちらを購入。

スイッチサイエンスから

GROVE - ユニバーサル4ピンコネクタ, ロボットキット

表面実装の部品のハンダ付け

1608のサイズの0.1uFのコンデンサとLEDの表面実装の部品のハンダ付けを行います。

前回の記事でも紹介した表面実装部品のはんだづけ(SMDクランプをつかってみる) | ぼくのマイコン開発のメモで紹介されていた

を試してみました。使い方のマニュアルです。

基板に前述のパーツをつけて動作させると以下のように動作しました。表面実装部品もなんとか付けられました。LEDをチェーンしてつなぐのですが、向きに注意すれば配線が基板に隠れているので簡単です。

OV2640使用200万画素カメラB0011の動作確認

LEDとモーターは難なく動作したのですがカメラが動作しません。基板側に問題があるのか、 パーツが何か傷んでいるのか。。ひとまずパーツ単体で動作確認をしてみることに。以下の記事を参考にさせて頂きました。

Arduinoの環境で

github.com

をベースに少々書き換えます。選択できたスケッチだと記述が入っていないのかったのですが、config.fb_location = CAMERA_FB_IN_DRAMがないと カメラの初期化が通りませんでした 4

シリアルのコンソールで表示されているIPをブラウザで開くと

という訳でパーツ自体は問題なさそうです。気を取り直して再度組み直すと動作しました。謎。

丸ラベルシールをライントレース

サンプルアプリを使いました。画面上で色をピックアップするとその色の領域を追いかける仕組みです。 丸ラベルシールが検出されない場合に、後進して再度シールを発見するような処理を追加してみました。

デモ

実行時のブラウザ画面は以下のようになります。リアルタイムにロボットカー上のカメラの映像がストリーミングされます。

子供と床に敷いた透明のマットにシールを貼りながら何とか止まらずに旋回してくれるようになりました。

子供の様子と感想

「車を作る」というのは想像以上に刺激的なようです。また無線で動かせるとアプリケーションの幅が広がるので、作者の方のUSBで接続して、WIFIに着替えて使う設計が大変素晴らしいです。

Scratchのような環境でお手軽にプログラミングが体験できるようになると次のステップとしては、本格的に非Visual Programming に移行するか、 色々なアイデアや体験をしながら楽しむかですね。子供とやりたくて以下の本を購入したのですが、学校のタブレットにプレインストールされているキャッチーな環境の方がウケがよいので、Scratch入門は未だ先になりそうです。


  1. Scratchは スライドパズル | あそぶ | toio Do | toio(トイオ) を作るときに勉強済み。

  2. 少し手に入らない部品やオプション(?)のものもあり、揃えるのに少し苦労します。

  3. NXPのI2CのLEDドライバの入手が難しいかもしれません。

  4. 他にもUSBケーブルが原因と思われるI2Cの失敗等にもハマりました https://github.com/m5stack/M5Stack/issues/109

MCU単体をLチカ。Kinetisで始めるマイコン入門

組み込みの開発に興味を持って、いくつかマイコンの開発ボードに触れてみました。良いことですが、USBで接続すると直ぐにプログラムが実行できてしまうので中の仕組みがよく理解できません。

こちらの記事を参考に部品やツール等を揃えて、初心者の登竜門であるLチカにMCU単体で挑戦してみました。完成は以下の感じです。

謝辞

@EmbeddedTpdさんの素晴らしい記事をとにかく参考にさせて頂きました。ありがとうございます。

リファレンスとする開発ボードとマイコン単体

日本語ではSTM32の記事を多く見かけますが、今回Freescale社(NXP)から販売されていた FRDM-K22Fを使います。 単体のマイコンは、近しいシリーズのMK22FN256VLL12を購入してみました。どちらもNXPが提供する統合開発環境である

で環境構築やFlash書き込みなどがスムーズに行えます。

準備:J-Linkのデバッガ+SWD接続+給電

ARM社のCortexに標準で搭載されているデバッグ用のインターフェイスとして、JTAGの信号線を減らしたSWD(Serial Wire Debug)があります。コネクタ経由でプログラムのターゲットへの書き込みやリセット等の制御を行うことができます。 開発ボードでは、USB越しに使えるようにOpenSDA経由でのアクセスになっていますが、マイコン単体の場合は、別途デバッガを接続する必要があります。

以下を用意しました。

J-Linkのデバッガは、探してもEDUモデルが手に入らず、止むなくBaseを使いました 1。元の記事では、別の電源から給電していたようですが、J-Linkからも5Vの給電が可能です2。 対象のマイコンは、3.3Vなので変換しながら、コネクタを変換できる以下の商品を試してみました。

給電しながらまずは開発ボードで動作しそうか検証してみたところ無事動作しました3

準備:マイコンのハンダ付け

初心者には鬼門です。0.5mmピッチのQFPで、150円(!)で手に入るこちらのDIP化基板

に頑張ってハンダ付けをします。フラックスを塗りたくり、多めにハンダを乗せてハンダ吸い取りで綺麗に拭き取るようなイメージでなんとか完了4

準備:テストプログラム作成

IDEからWizardにしたがって作成すると雛形ができます。

Lチカを周期的に実行するタイマーのコールバックの中でGPIOのハイとローを切り替えるイメージでサクッと実装しました。 以下の記事を参考にしました。

ログを出したい場合、プロジェクトのprintfの設定にも注意が必要でした。

いざ実行 !

無事動きました。Lチカなので地味です。

ここまで動かすのにとにかく手間と時間がかかりますが、少しマイコンが身近になりました。

CortexについてもSoCなんかを次は試しつつ、引き続き勉強してみたいと思います。

追記: ICテストソケットを試す

ハンダ付けに自信が無かったので用意した

GP-QFP100-0.5 MCU ICテストソケットプログラミングアダプター IC51-1004-809 QFP100 TQFP100 LQFP100 Pitch 0.5 Yamaichi @XYG

でも試してみました。

ICのピンが少し曲がっていたせいでショートしていたのか始めは動作せず嵌りました。目視の確認もいずれにせよ重要です。


  1. EDUモデルが欲しかったのですが手に入らず。取り扱いもほぼ無いようです。「J-Link EDU」ならび「J-Link EDU Mini」取扱中止のお知らせ

  2. J-Link/J-Trace本体から基板に電源を共有する設定手順

  3. OpenSDAのSWDをジャンパー(J10, J13)の変更によって切る必要があります。

  4. 虫眼鏡でみる限り大丈夫でしたが、後ほどソケットも試してみました。

LEGO書籍からのテクニックパーツ入門 - toioを動力にした例の分析

工作の本を子供とやっていると切ったり貼ったりで作業時間が大幅にかかり、短時間で切り上げるのが難しいケースがあります。 特に「ビー玉コースター」みたいなものはその典型で、作品の大きさを抑えながら面白く作るのは想像以上に難しかったりします。

以前LEGOの書籍 カラコロピタン! レゴブロックで作るからくり装置 ([バラエティ]) もやってみましたが、圧倒的にLEGOパーツが足りなかったり、紙製のパーツが多く余り発展させられませんでした。

そんな中、昨年 toioの大喜利のコンテストで紹介されていた(Yuarin LEGO&Minecraftさん)の 「toio de ボール転がし」 は一際目を引き、いつの日か真似をして作ってみたいと思っていました。

テクニックパーツの存在

ガラコロピタンの続編的な扱いの メカメカツクール レゴブロックで作る実験マシーン ([バラエティ]) を書店で偶然眺めて、ギアが先程のYuarinさんの作品のものと同じだと気付き、LEGOに「テクニックパーツ」というジャンルがあることを知りました。

直近では子供には、 LEGO BOOST をやらせてみたいので、その導入にもちょうどよいなと思いすぐに購入。

この書籍の対象年齢は8歳ですが、それ以下の年齢でもレゴの組み立て手順書に慣れていれば、子供一人で十分組み立て可能なようです。

謝辞

今回の記事作成をオリジナルの作成者である(Yuarin LEGO&Minecraftさん)にご快諾していただけました。ありがとうございます。

真似して作ってみる

基本構造

公開されている動画をもとに基本的な構造を想像して作ってみます。toioを天地逆さにしてその動力をホイール経由でギアの回転に変えます。ホイールは、

を使いました。十字軸と穴あきブロックも作りたいサイズに合わせて用意しました。

ギアは残念ながらメカメカツクール レゴブロックで作る実験マシーン ([バラエティ]) の付属のギアだけでは足りず、買い足しが必要でした。

を使いました。

ここまでで、toioのモーターの軸の回転を2個のギアからなる大きい回転に変換することができます。

階段の作成・調整

ここは想像では全く歯が立たず、Yuarinさんの動画を何度も参考にしながら調整を繰り返しました。

回転させている穴あきブロックの上に階段を作り、その両側を挟むように階段を作ります。回転させながらボールを置くと上に上がっていくような位置を探ります。

安定させるポイントは、

  • 全体的に手前から見て奥方向に少し傾いたほうが良い (下に薄いブロックをふませる)。両側から挟んだ階段は平らなので奥側にボールが寄った方が安定します。
  • 上のポイントと似ていますが、両側の階段に微妙に段差をつけて奥に行くようにする

正直Yuarinさんの動画無しでは完成できませんでした。今回はプログラミングは一切無し。シンプルリモコンを用いました。動作している様子はこちらです。

次にやること

導入として準備したメカメカツクールで「動く仕組みに」興味を持ってくれたようなので、早速 LEGO BOOST を始めてみました。 付属のサンプルを作ったら、別途アイデアブックを漁ったりしてみたいと思います。

飽きたら親がtoio.Doに繋げて遊ぶこともできそうです。LEGOとtoioの組わせも未だまだ興味が尽きません。

ダンゴムシの迷路(交替性転向反応)をtoioとmicro:bitで再現

何気なく手に取った国土社の 自由研究 1・2年生 を見て「ダンゴムシの迷路がやってみたい」というリクエストを子供から受けるも、家に虫を持ち込むのがイヤなので手持ちの toio で再現をすることに。

ダンゴムシには衝突したときに右左右左... と交互に進む習性(交替性転向反応)があり、単純化すれば簡単なプログラムで実装できそうです。

youtu.be

ダンゴムシ製作

当初はtoio.Doでも使える衝突検出を利用する予定でしたが、壁に勢いよく「激突」したような衝突でないと検出されませんでした。1 今回は以下の記事を参考に micro:bit に初挑戦しました。フォトリフレクターのセンサを接続し、壁への接近を検出することにしました。

マイクロスイッチ2も試しましたが、紙で作ったコースだと脆いため衝突以前に旋回した方が良さそうでした。

micro:bitの電源とセンサーの取り付け

電池ケースからmicro:bitへ給電するのがお手軽ですが、結局センサーの取り付け部分も必要なので、思い切ってtoioの工作用の蓋(?)にピッタリとはまるように パネルを切り貼りしてみました。

基板が剥き出しだとダンゴムシ感がでないので、子供に折り紙でカバーを作ってもらいました。

f:id:devdelights:20220410000109p:plain

実験用コースの製作

toio™開発用プレイマット [TMD01SS] - スイッチサイエンス の余りがあったので活用しました。1枚だと少し小さいので裏面4枚で作ります。この枚数で大体 トイオ・コレクション の付属のマットと同じ大きさです。

toio.Doの環境で、裏面を使った場合は、折り返しに注意する必要があります。回避のため1番2番と半分に切り取った5番6番をつなぎ合わせます。こうするとマットの座標がScratchの座標系にスケール変換のみで利用できます。

f:id:devdelights:20220410001435p:plain

書籍では、工作用紙にコースを描き木工用ボンドで壁を接着させるという方法でしたが、今回は調整しやすいようにマスキングテープとスイッチサイエンスの箱でコースを作りました。こちらの箱は薄くて頑丈で工作にピッタリです。

f:id:devdelights:20220410001912j:plain

プログラミング

toio.Doの環境で実装していきます。全体でもこんな感じのボリュームで実装できました。

f:id:devdelights:20220410004242p:plain

ズレたときに復帰できるように強制的に+/-90度の位置に戻る補正の制御も入れてみました。

キューブの制御

toio.Doで開発用マットを利用した場合の角度は以下のようになっています。

f:id:devdelights:20220410093023p:plain

コースをジグザグに進むだけで、左右同じ方向に2回(つまり180度以上回らない)ので単純に衝突を検知したら+/-90度するだけのシンプルなプログラムになります。

toioは複数の命令が到達すると、最新のリクエストと合わせて再計算して目標値を決めているように感じました。 なので、プログラム上は細かく目標値を与えるのと、旋回と並進が混ざらないように別々に実行させるようなイメージでブロックを並べました。

f:id:devdelights:20220410004305p:plain

センサーが検出してから旋回する時間もかかるのでちょっとゆっくり目に走行です。

f:id:devdelights:20220410012954g:plain

経路表示

オリジナルの書籍ではダンゴムシを目視で観察し、ペンで経路を記録するようにしていたのですが、ここではScratchの機能を使って描画します。

以下の記事がわかりやすいです。

toio™️「ビジュアルプログラミング」のあそびかた サンプル編:お絵描き(初級編) | toio blog | toio(トイオ)

f:id:devdelights:20220410004257p:plain

開発用マットを使うと現在位置がリアルタイムにわかるので、それらの値を座標変換してペンを下ろすとダンゴムシの動きが描画できます。ついでに キューブの目標向きにスプライトを回転させれば完成です。

f:id:devdelights:20220410013925g:plain

考察・発展のアイデア

  • micro:bitサーボモーターを2個を搭載すると車体のサイズが大きくなりそうです。必然的にコースのサイズも大きくなるので今回の組み合わせはお手軽です。
  • toio.Do環境は、toioキューブの2台接続には対応済みなのですが、micro:bitとの接続は1台限定のように見えます。複数台で動かせられれば、違うシナリオにも応用できるかもしれません。
  • micro:bitのLEDのウケが非常に良かったです。ダンゴムシそっちのけで、Scratchを自分で操作して好きな形に光らせたりして遊んでいました。
  • たまに壁に体がひっかかり進めなくなったダンゴムシをゲラゲラ笑っていたので、助けをLEDや音で呼んで、一度手を使って補助してあげて一緒にゴールを目指すようなゲーム的な要素を入れても面白いかもしれません。

参考文献