見出し画像

BLEでPCにデータ入力できるデジタル・キャリパーをつくりました


はじめに

現在私は盆栽用の自動水やり装置のロードテストを兼ねて、赤かぶのもものすけを室内栽培しています。

生長の様子を毎日撮影していますが、どんどん大きくなる葉の様子を見ていると、生長の記録を残すために大きさを測った方がよいことに気づきました。

最初は定規を当てて測っていました。

その後、秋葉原のあきばお~で買った安価なデジタル・ノギスを取り出し計測し始めました。

目盛りを読む必要がなくなり、すこぶる快適になりました。

そうすると、どんどん欲が出てきて、せっかくデジタルで数値を読んでいるのであれば、その数値をPCへ転送し、表計算やエディタに直接入力できれば、もっといんじゃないかとひらめきました。

盆栽のための装置作りからさらに脱線して、生長を計測するための装置作りに今回はチャレンジしてみました。

JIMTOF2022で得たもの

そんな折、東京ビッグサイトで久しぶりに対面開催された日本国際工作機械見本市,(JIMTOF2022)に参加する機会がありました。2年に一度開催されるこの展示会は前回がオンライン開催となりました。4年ぶりにオフライン開催となったため、各社力の入った展示がされていました。

会場内を回っていたところ、測定工具のブースでは各社、計測データの入力を様々な方法でPCに取り込む展示を行っていました。

例えば、ミツトヨのデジタル・ノギス

これに通信機器を接続して使用します。

有線/無線で計測データをPCへ送れます。両手がふさがっていることを考慮してフットスイッチも取り付けられるようです。

働き方改革、生産性向上、デジタル・トランスフォーメーションなど、我が国のものづくりの変革に貢献する、時代にマッチした可能性を感じる製品でした。

帰ってきてから、よくよく調べました。

仕事で使うための道具として使うのであればリーズナブルなものですが、趣味の世界で、しかもそれほど精度が要らないものなので、なかなか手が出せません。

ですが、計測データが簡単な操作でデータ入力できるということに大きな魅力を感じました。

仕組みについても勉強しました。
あれ?これって工作できるかも。
最初は軽い気持ちでした。

ではどうすればいいのだろう?

長さを測ってPCに記録する方法をあれこれ考えました。

現在の方法は、
 1.ノギスで測る。
 2.結果をメモする。
 3.PCに転記する。
です。

「1.ノギスで測る」は、
 定規で測る。
や、
 デバイダーで測って定規に当てる。
でもよさそう。

「2.結果をメモする。3.PCに転記する。」は
 ここは、正攻法で行けば、デジタル・ノギス+データ送信キットなのでしょうが、この方向はなさそうです。

音声認識で読み上げた数字を文字起こししてもらうとか、画像認識で測るとか。。。

ここをきちんと掘り下げれば、楽しい結果がたくさん得られそうです。

など、あれこれ考えてみました。

デジタル・ノギス+送信キットを自作すればいいのでは?

これです。今の私に響くもの。

精度はそれほど要りません。簡単に測れて、ボタンを押せば、PCに数値が入力できるもの。

できそうかな?たぶんできそう。

まずはネットで調べてみる所から

安いデジタル・ノギスを改造して、数値を取り出し、PCに転送する。

これならばできるかもと思い調べてみました。ブログで作例があり、読んでみました。電子工作をして信号を取り出す方法が説明されていました。

難しそうな内容で理解できませんでした。ただ、その中で「ロータリーエンコーダ」について触れられていて、このセンサーを使えば何とかなるかもしれないことがわかりました。

自分で使えるロータリーエンコーダーと言えば。。。

M5シリーズで見かけた覚えがあり調べてみると、ありました!

M5Stack用エンコーダユニット

これならば、M5Stackとつないでデータがとれそうです。
このユニットにはレゴテクニックパーツが取付けられる穴が開いています。ということは、レゴと組み合わせて、できそう!

昔遊んだレゴを引っ張り出してきました。

ノギスのスライド部分を作り、スライドに応じてエンコーダーユニットを回せるようにしなければなりません。

測れるサイズは、畑のもものすけの様子から見て、500mmぐらいまでできればよいですが。まあ最初から欲張らず、テスト用に形を作っていきたいと思います。

カバヤ食玩のLEGOテクニックシリーズで手に入れたタイヤパーツ

テストプログラムを書いてみます。

スライド部を動かすと、数値が変わるものを作りました。
ボタン1を押すとゼロリセット、ボタン2を押すとカウントを返します。

校正すれば、これだけでデジタル・ノギスとして使えるはずです。
まずはサンプルプログラムを探し、動かしてみます。

M5Stack社のWebからM5Stack用のサンプルを見つけました。

今回使いたいのは、M5StickC。少しソースを書き換え、動作を確認しました。

つまみを回せば、数字が変わります。指で回す代わりにノギスのようなスライド部にこのセンサーを取り付ければ移動距離が分かるはずです。

今回ラッキーなことに、Unit Encoder用のライブラリが用意されており、第一段階で求めていたことができることが分かりました。

次はキー入力

まともに考えていたらできなかったかもしれません。
以前どこかで見た記憶を頼りに検索してみるとこんな情報に尋ね当たりました。

ESP32 BLE Keyboard library

BLEで接続したPCのキーボード替わりにキー入力できるというものです。

これが使えれば、これまたあまり悩むことなく、目的を達成することができます。

これで行けそう

だいたいのメドが立ったところで、ハードウェアの作りこみに入ります。
しまい込んでいたLEGOを出してきて久しぶりに組んでみます。

LEGOと私

1990年後半ごろ、LEGOとPCがつながる教材「MindStorms Robot Invention System」が発売されたとき、子供の時以来にレゴの世界に足を踏み入れました。

最初は「MindStorms RCX」を使って、ロボットを作ってやろうと思っていたのですが、大人になってからレゴを組み始めると、色や形をそろえなきゃとかスタイリッシュなデザインをしなきゃとか考えることが多すぎて、全然組めなくなっていました。

今思えば、もっと頭を柔らかくして、とりあえずやってみる。で触ればよかったのにと思うのですが、そんな余裕もなく、ただただレゴが組めないことが悔しくて、数多くこなさなければ乗り越えられないと思い、おもちゃ屋でレゴを買うことが趣味になっていました。

元々、「MindStorms」のもとになっている「LEGO Technic」シリーズを集めていたのですが、そのうち「ビンテージLEGO」のジャンルに惹かれていきました。
商店街のおもちゃ屋の奥で眠っている1970、80年代の古レゴをコレクションする趣味に走っていた時もあります。
プラモデルコレクターと同じような感じだと思います。同じセットを2つ買い、1つは組み立て用、もう1つはコレクション用にしていました。

おびただしい数のレゴは子供と一緒に遊ぶことで、活用できました。
色や形にこだわらない子供の造形を見て、たくさんのことを学びました。

LEGO用ローラーギアカム1

今見てみると、2013年今から9年前にチャレンジしていました。

3DCADを駆使し、ローラーギアカムをデザインし、当時珍しかった3Dプリンタを導入されたお客様のところでサンプル出力していただきました。

ローラーギアカムは、工作機械の自動工具交換装置(ATC)の機構として使われることもある部品です。工具交換のための複雑な動き、90°回った後、-270°回り、その後180°回るなどの制御を行うとても複雑な歯車のような部品です。

この手の工作をするとき、一番大変なのは自作部品とLEGOとの接続をどうするかです。
CADで設計するのはとても簡単ですが、実際に工作すると精度が出ないため、部品が思った通りに組み上がりません。
この時は、悩んだ末にタイヤパーツを用いて、はめ込み式にしていました。

そして今回は?

とにかく家にあるパーツを使って組み始めました。
M5Stackシリーズはレゴとの親和性が高く、最初からレゴと組み合わせられるようなパーツが用意されています。

キャリパー本体にレゴを固定することはそれほど心配していなかったのですが、キャリバーの移動量をロータリーエンコーダーで読み取らせる部分がイメージできていませんでした。

今回の工作で一番重要な部分です。
最初はタイヤパーツを使ってチャレンジしました。

ロータリーエンコーダーのつまみを取り外し、回転軸にレゴパーツを取り付ける方法を模索しました。
レゴパーツは規格化され精度よく作られているため、適当に部品を組み合わせることができません。

あれこれ試した結果、すべてがゴムで作られたタイヤパーツがありました。これを、ロータリーエンコーダーの回転軸にねじ込み無理やり取り付けました。

カバヤ食玩のLEGOテクニックシリーズで手に入れたタイヤパーツ

これをキャリパーの軸に押し当てて回すことができれば、できると思いました。

そんなに甘くはなかった。。。

いつものことですが、そんなに甘くはなく装置に取り付けてもタイヤが滑ってうまく回ってくれません。
機構上、片持ちというのもよくありません。

繰り返し位置精度が重要

リニアガイドの性能を決める繰り返し位置精度。おもちゃのデジタル・キャリパーとは言え、繰り返し精度はできるだけ高めたいところです。

簡単に考えると、ラックとピニオンを使えば解決しそうなのですが、私の手持ちのレゴパーツを見ても、ラック部品は4ポッチの長さしかありません。
今回の目的、葉の長さを測るためには20cm以上の長さを測れるものが必要です。

自動車の前輪部分のハンドル機構のためのパーツが使えそうですが、ラックの両端にパーツ取り付け用の穴があるため、並べると、ラックの山がない部分ができてしまいます。

これを回避するために、レールを2ポッチにして、ハンドルラックを並べた隙間を通常のラック部品で埋める方法にしました。

試作中のピニオン。一回り大きなギアを使っていたのでかみ合わせがきつすぎました。

これで、4ポッチラック部品4個とハンドルラック3個を組み合わせ25cm以上測れるようになりました。
最初、単純に考えていた構造がしっかりし始めました。

ピニオンから得られる回転をロータリー・エンコーダーで読み取られれば、できそう。
という所までたどり着きました。

ロータリー・エンコーダーのつなぎこみ

レゴの中で解決できることは済みましたが、最後に、ロータリー・エンコーダーとレゴのピニオンをつなぎこむ所で考え込んでしまいました。

こんな時、3Dプリンタがあれば、ほしい部品が作れるのに。と思いましたがよく観察すると、問題はそれだけではないようです。

軸中心がずれています

早めに気づけて良かったです。固い部品でそのまま接合すると動作不良を起こす可能性があります。
少し考えて、これを解決するための良い方法を思いつきました。

100均で買ったエアチューブを使います

レゴラーの悪い癖といいますか、レゴで組み始めるとレゴ部品以外のものはできるだけ排除したいと思い、純正パーツで組み上げることにこだわりすぎる傾向があります。
今回はそもそもがM5Stack製品との組み合わせなので、純血ではないのですが、別のものを使うことにとても違和感を感じてしまいます。

ただ今回は、この方法しか思う浮かびませんでした。ピニオンとつながった出力軸と少し離した所(約5mm)に少し芯のずれたロータリー・エンコーダーを取り付けます。
そこに2cmの長さにカットしたエアチューブをはめ込みます。

これで多少の芯ずれを吸収して、回転を伝えることができます。
ユニバーサル・ジョイントをレゴのチューブを使って作る方法を見ていたので、今回この方法を思いつくとこができました。芯も径も異なるものに回転を伝える良い方法だと思います。

実は、設計が煮詰まった時用に、レゴのCADの準備をしていました。
昔からレゴ用のCADは出回っていたので、探せばすぐに見つかると思っていました。

練習で子供のころ好きだったミニカーを組んでみました。

そして、今回組んだデジタル・キャリパーのレゴ部分を作りました。

ノギスの設計は左きき用です。 レゴなら自由に設計できます。

今回作った装置のソースコードをご紹介します

下記のとおりです。

// DigitalCaliperM5StickC  bbd
// データ転送機能付きデジタル・ノギス

// ボードマネージャ
// https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
// [M5Stack Aruduino]-[M5Stick-C]

// ライブラリ
// M5StickC
// M5GFX
// M5Unit-Encoder

// ESP32-BLE-Keyboard
// https://github.com/T-vK/ESP32-BLE-Keyboard
// https://github.com/T-vK/ESP32-BLE-Keyboard/releases/tag/0.3.0

/*
*******************************************************************************
* Copyright (c) 2021 by M5Stack
*                  Equipped with M5Core sample source code
*                          配套  M5Core 示例源代码
* Visit for more information: https://docs.m5stack.com/en/unit/encoder
* 获取更多资料请访问: https://docs.m5stack.com/zh_CN/unit/encoder
*
* Describe: Encoder.  旋转编码器
* Date: 2022/7/11
*******************************************************************************
  Display of rotary encoder values and key status on the screen
  在屏幕上显示旋转编码器的值和按键状态
*/
//#include <M5Stack.h>
#include <M5StickC.h>
#include <M5GFX.h>
#include "Unit_Encoder.h"
#include <BleKeyboard.h>

const float f1mm = -114.0 / 50.0; // 1mm当たりの量

M5GFX display;
M5Canvas canvas(&display);
Unit_Encoder sensor;
BleKeyboard bleKeyboard;

void setup() {
  M5.begin(true, true, true);
  sensor.begin();
  display.begin();
  display.setRotation(1);
  canvas.setTextSize(3);
  canvas.createSprite(160, 80);

  Serial.begin(115200);
  Serial.println("Starting BLE work!");
  bleKeyboard.begin();
}

signed short int last_value = 0;

void loop() {
  signed short int encoder_value = sensor.getEncoderValue();
  bool btn_stauts                = sensor.getButtonStatus();
  static signed short int zero_value = encoder_value;

  M5.update();
  if (last_value != encoder_value) {
    if (last_value > encoder_value) {
      sensor.setLEDColor(1, 0x000011);
    } else {
      sensor.setLEDColor(2, 0x111100);
    }
    last_value = encoder_value;
  } else {
    sensor.setLEDColor(0, 0x001100);
  }
  if (!btn_stauts) {
    sensor.setLEDColor(0, 0xC800FF);
  }
  canvas.fillSprite(BLACK);
  canvas.drawString(String((encoder_value - zero_value) / f1mm) + "mm", 10, 10);

  canvas.pushSprite(0, 0);

  if (M5.BtnA.wasPressed()) {
    String s = String((encoder_value - zero_value) / f1mm);
    Serial.println("M5.BtnA.wasPressed()");
    Serial.printf(s.c_str());
    Serial.println("");
    bleKeyboard.print(s);
    bleKeyboard.write(KEY_RETURN);
  }
  if (M5.BtnB.wasPressed()) {
    zero_value = encoder_value;
  }
 
  delay(20);
}

ロータリーエンコーダーの1カウントと実際の長さを換算するための値が必要です。
50mmを測った時のカウント数-114を定数にしておきました。

const float f1mm = -114.0 / 50.0; // 1mm当たりの量

電源をOnにすると、PCから認識できる状態になります。Bluetoothで新しい機器の追加を行います。

PCからはキーボードとして認識されますので、スプレッドシート、テキストエディタなど、なんでも入力可能です。

M5ボタン(BtnA)を押したら、長さを計算して文字列にし、BLE通信を行います。

  if (M5.BtnA.wasPressed()) {
    String s = String((encoder_value - zero_value) / f1mm);
    Serial.println("M5.BtnA.wasPressed()");
    Serial.printf(s.c_str());
    Serial.println("");
    bleKeyboard.print(s);
    bleKeyboard.write(KEY_RETURN);
  }

基準を変えたいときは、BtnBを押すと、計測値が0にリセットされます。

  if (M5.BtnB.wasPressed()) {
    zero_value = encoder_value;
  }

ほぼほぼ2つのサンプルを合体させただけのとてもシンプルなつくりですが、参考になれば幸いです。

さいごに

この手の締めくくりとして、こんなに時間をかけて苦労するくらいなら、まじめにノギスを当てて測ればよいのに。というご指摘を頂きそうです。

実際に、これを思いついてから形にするまで約1カ月かかっており、その間にもものすけは大きく生長してしまいました。

ただ「学びのための気づき」を見つける良いきっかけとなり、とても満足しています。
今回のひらめきは、ピニオン・ラックを2列にして手持ち部品で形にできたこと、ロータリー・エンコーダーへうまく回転を伝えられたことです。

今回はとてもうまくいきました。来年のM5Stackコンテストやメイカーズフェアにも出せそうな内容のものだと思います。

最後までお読みいただき誠にありがとうございました。

#BLE #測定の自動化 #ノギス #デジタル・キャリパー #ミツトヨ #LEGO #ラック・ピニオン #ロータリー・エンコーダー #つくってみた・やってみた #電子工作 #M5StickC

この記事が気に入ったらサポートをしてみませんか?