ボッチャ レーザー距離測定

前回のボッチャ得点板遠隔操作に引き続き、指示板(ラケット)を改造します。

レーザー距離センサーで、ボール間の距離を測れるようにします。

指示板で測るのが手軽

ボッチャの審判や、レクリエーションボッチャの指導者は、通常、指示板を握っています。

ボールの距離が目測で分からないとき、今握っている指示板でボール間の距離をサッと測れたら便利でしょう。

実際に、コンパスやメジャーを取りにいかず、指示板で何個分か計測する人もいます。

それでは指示板を改造します。

レーザー距離センサーと、レーザーポインター(照準)を取り付けました。

必要ピンが被ってしまったので、残念ながらジャイロセンサーを取り外しています。

照準の赤いレーザーポイントをボールに合わせると、距離を取得できます。

なんだか、ヒットマンのようになった感覚です。

 

引き続き、得点掲示板にボール間距離をリアルタイムで表示させるよう、調整中です。

ボッチャ 得点版を遠隔操作

ボッチャの審判が持つ指示板は、多くの場合、卓球のラケットを使います。

ずっと持っていると振りたくなります。

ラケットを持つと振りたくなるのは、きっと自然な感情でしょう。

無意味に振るのも何なので

振ったとき、何か起こるといいな・・・。

試しに、得点板に点数が加算されるようにしてみようと思います。

赤面を得点板に向けて振れば、赤チームに1点ずつ、青面を得点板に向けて振れば、青チームに1点ずつ入ります。

これで、1人で審判をやっても、得点表示が楽になり、円滑な試合運営ができる・・・かもしれません。

実用性があるか定かではありませんが、レクリエーションボッチャのちょっとした演出に。

ボッチャ普及員となりました

 

無事、ボッチャ普及員となりました。

試合・審判の実践を多く取り入れた講習で、なまっていた私にはハードでした。その分、得られる知識や経験は多く、とても充実した講習会です。

ボッチャ普及のため、努めていこうと思います。

超大型7セグメントディスプレイを使う

イベントの得点表示などで使うため、大きな7セグメントディスプレイを探していたら、秋月電子通商の「超大型4桁LED表示キット」に巡り合いました。

超大型4桁LEDに奮闘

「超大型4桁LED表示キット」が手元に届きました。

なかなかインパクトのある大きさです。

見た目は7セグではなく、16セグメントありますが、基盤の回路を見る限り、7セグとしてしか使えないようです。

 

まずは、はんだ付け。

はんだ付けする箇所は多いですが、部品が大きいので、神経を使わず作業できます。

そして、組み立て終わって気づきました・・・。

ブレッドボードに挿せない!?

10本2列のピンで接続となりますが、ブレッドボードの穴は縦横どちらかが必ずつながっているので、ショートしてしまいます。

ブレッドボードの中央の隙間がないタイプがあれば・・・。

探したらありました。

ブレッドボードを進化させたという「ケーキボード」がありました。
中央に隙間がなくピンを挿せ、通電しない仕様です。

これなら真ん中にグサッと挿せます。

良い安定感です。

配線は!?

超巨大4桁LEDの使い方が、初心者にはちょっと難しく、とりあえず回路図を見て試行錯誤することにしました。

秋月電子通商から購入した際、同封されていた回路図です。

あみだくじみたいで、たどっていくのが大変なので、色を付けました。

1番ピン・・・十の桁
2番ピン・・・百の桁
3番ピン・・・小数点 ※百と一の桁のみ
4番ピン・・・千の桁
5番ピン・・・一の桁
6番ピン~11番ピン・・・使わない
12番ピン・・・7セグ右下
13番ピン・・・7セグ左下
14番ピン・・・7セグ底辺
15番ピン・・・7セグ中央
16番ピン・・・7セグ左上
17番ピン・・・7セグ上辺
18番ピン・・・7セグ右上
19番ピン・・・「:」のLED+
20番ピン・・・「:」のLED-

これを元に、ケーキボード上で回路を組み立てていきます。

配線で邪魔だったので、一度、超巨大7セグは抜きました。

左側に桁数を表示するピン、右側に7セグの数字を扱うピンを集めます。
小数点と、時計表示のための「:」は、今のところ保留で、接続していません。

アノードコモンとしてプログラム

4桁7セグで、以前利用したプログラムはそのまま使えません。

カソードコモンではなく、アノードコモンのタイプなので、根本的にプラスマイナスが逆になります。

アノード(+側)がコモン(共通)ですから、カソード側の電圧が「LOW」になると、対応するセグメントのLEDが光かります。

LOWで光る・・・というのは、若干のプログラミングの時に違和感がありました。

(プログラムとArduinoを入れた回路図は、追って掲載します。)

7セグ表示成功

7セグの仕組みをあまり理解してなかったので、動作するまで1日かかりましたが、努力の甲斐がありました。

7セグ表示に成功です。

ここから、無線で数字を受信して表示するよう改良します。

 

ESP-WROOM-32は使えるのか?

IoTの第一歩としてWi-Fiモジュール「ESP-WROOM-02」にお世話になってきましたが、その新バージョン「ESP-WROOM-32」が発売されています。

Wi-Fiに加え、Bluetoothまで使えるとのことです。

Arduino互換機としてすぐに使える開発者ボード「ESP-DevKit-C」も販売されていたので、使い勝手を確かめてみます。

開発環境の用意は簡単(Windowsは)

開発環境は「ESPr Developer」で用意した経験があるので簡単でした。

「ESP-DevKit-C」は、まだまだ情報が少ないですが、環境設定くらいはネットで検索すると情報が見つかるので、調べながらIDEの準備を整えます。

なお、Windowsは簡単なのですが、Macは(2017年5月現在)Arduino IDEでの開発環境を用意するのは難しそうだったので、すぐに諦めました。

ブレッドボードにどう挿すの?

「ESP-DevKit-C」は幅が広く、通常のブレッドボードではどう挿して良いのか分からないです・・・。

とりあえず片側のピンだけ挿して、反対側はメスのジャンパーワイヤーを使う予定です。

あっさりとLチカ

恒例の動作確認で、LEDをチカチカさせます。

「ESP-DevKit-C」はピンの数が多く、せっかくなので23番ピンという、今まで使ったことのない数字でデジタル出力を試します。

問題なくLEDがチカチカしてくれました。

Bluetooth接続は?

省電力が魅力のBluetooth接続。

サンプルのプログラムもあるのですが、使い方が分からない・・・。

そして、情報もほとんどありません。

断念しました。

もう少し待ちで。

Wi-Fi接続は・・・あれ!?

Wi-Fi接続は「ESPr Developer」で何度もやっているので、サンプルを使って簡単にできるでしょう。

 

・・・あれ?できない。

そもそもWi-Fiをまったく検出してくれません。

Amazonでコメント欄に同様の症状と思われる

WiFiの掴みが非常に悪い

という意見が書き込まれていました。

・・・ハズレを引いてしまったのかもしれません。

悲しい。

ボッチャ ボール位置を見たい

ボッチャは観戦だけでなく練習でも「ボールの位置を見たい!」と、思うことが多々あります。

投球エリア(スローイングボックス)からは、奥行きがつかみにくく、赤・青どちらがジャックボールに近いか分からなくなります。

もちろん、プレーを止めて見に行っても良いですが、レクリエーションボッチャなら、テンポよくもっと効率的に確認できるようにしたいところです。

スパイカメラを装着

カメラの映像をスマホにリアルタイムで送ってくれるだけで、練習効率が上がりそうです。

スパイカメラという、小型のクリップで挟めるカメラを購入し、指示板に取り付けます。

簡単な設定で、カメラの映像をリアルタイムでスマホやPCに送信できます。

スマホに送られる映像です。

真上からの映像は、距離がはっきりわかります。

これなら手軽に導入できますし、練習の効率化もできそうです。

 

と、思った次の日・・・スパイカメラの充電がなぜかできず、現在問い合せ中。

やっぱりカメラ付き指示板を自作してしまおうか。

ボッチャ 指示板2号

パラリンピックのような大きなボッチャ大会では、審判の背中側の観客が判定結果を見ることができない・・・という問題解決を考えて、以前、LEDと連動するボッチャ指示板を試作しました。

現状、子供が喜ぶただの電気仕掛けのおもちゃにしかなりませんが・・・それでも懲りずに、試作品2号を作りました。

コンパクトでさらに無線になった

試作1号は、指示板(ラケット)と判定結果を知らせるLEDが有線だったので、無線化しました。

Wi-Fiで思った以上に安定した無線環境を作れず、315MHzの無線通信といものを新たに試しています。

また、指示板1号では、重力や赤外線で指示板の向きを取得し、LEDと連動させてましたが、これも挙動が安定しないので、シンプルにボタンとしました。

 

裏側には電池取り付け。

ボタン電池2つで動きます。

指示板の柄の部分を空洞にすれば、電子部品が全て収まるサイズになってきました。

みっともない見た目も、改善されるでしょう。

ピンポン玉が余ったからかぶせた

指示板は卓球のラケットを利用しているので、セットで付いているピンポン球が余ります。

せっかく余っているので、穴を開けてLEDにかぶせてみました。

良い感じの照明となりました。

判定しよう

子供に審判をやってもらいます。

青が近いので赤チームの投げる番です。

指示板の赤と、LEDの赤い光で、判定結果を知らせます。
(本当は審判の後ろ側の死角でLEDが光る想定)

 

続いて、青チームに投げろと指示したいとき・・・

指示板の青と、LEDの青い光で伝えます。

レクリエーションボッチャ用に改良

電子工作の勉強にしかなっていない気がするので、少しは実用的なものを作りたたいです。

指示板改良の方向性を見直し、レクリエーションボッチャ用に使えるものを作ろうと思います。

週1で実際にレクリエーションボッチャをやっているので、「あったらいいな」というものを提案、開発していきます。

超小型Arduino互換機

IoTの勉強をしていると、小型化とボタン電池駆動を夢見るようになります。

調査してみると、Arduinoとして使えるマイコンとしては、「8pino」が最少かと思われます。

これをボタン電池で動かしてみます。

おしゃれでコンパクトな「8pino」

おしゃれなパッケージの「8pino」が届きました。

日本人が開発したとのことで、モチベーションが上がります。

正確にはArduino互換機ではなく、Adafruit社のTrinket互換機らしいです。なんのことやら・・・?

難易度が高いかもしれないので、念のためAdafruit社のTrinketも購入しました。
(問題発生時、8pino特有の問題か、Trinketの仕様の問題か、問題を切り分けられるため。)

ボタン電池でLチカに挑戦

「8pino」は、プログラムを書き込むとき、USBをタイミング良く挿すという技が必要です。

USBを差してから10秒間だけ書き込みモードに切り替わるので、コンパイルが終わりそうなころにグサッと挿します。

あとは、特に問題も起きず、意外にもあっさりLチカまで到達しました。

ボタン電池は「3.3V出力コイル一体型昇圧DCコンバータ」というもの(写真中央の緑の基盤)を使い、3.3Vの安定した電源供給を行っています。

 

それにしても、「8pino」は本当に小さい。

ボタン電池CR2032が大きすぎて気になってしまいます。

激安のArduino nano互換機が壊れる

激安のArduino nano互換機が壊れました。

USBポートの接続が不安定になり、電気供給ができない上、プログラムを書き込めないという、致命的な状況です。

電圧変換としては使えるかな?

電気供給については、VINに直接電源をつないでしまえば解決します。

9V電池があったので、VINに赤色コード(+)、GNDに黒色コード(-)をつなぎます。

Arduino nano互換機は、起動しました。

 

さて、プログラムを書き込めないので、もはや5Vと3.3Vのピンくらいしか使い道がありません。

電圧変換用途?

振ると光るおもちゃを作る

捨ててもいいような気がしますが、せっかくなので振動センサーモジュールを使って、おもちゃをつくります。

振ると光るだけなら、マイコンのプログラム書き込みはいらないです。

子供に回路を組み立ててもらいます。

振動センサーが反応したときだけ、LEDに電気が流れて光ります。

ブレッドボードにマスキングテープで、電池ケースをしっかりと固定します。

振ると・・・

LEDが黄色く光ります。

ただそれだけ。

 

壊れたArduino Nano互換機の、最後の使い道を考えましたが・・・意外と子供たちには喜ばれました。

Arduinoをタクトスイッチとブラウザで動かす

前回までNode.jsを使い、ブラウザからLEDを光らせる実験をしていました。

今度はArduinoにつないだタクトスイッチからもLEDを光らせ、さらにブラウザ側のボタンも連動してON、OFFが切り替わるようにします。

全体構成のイメージ

Node.jsで管理されている真理値(true、false)が中心的な役割となります。

真理値がtrueのとき

  • LEDが点灯する
  • ブラウザのボタンが押し込まれ、緑色になる
  • ブラウザのボタン または タクトスイッチが押されたら、真理値をfalseにする

真理値がfalseのとき

  • LEDが消灯する
  • ブラウザのボタンが押し込まれず、灰色になる
  • ブラウザのボタン または タクトスイッチが押されたら、真理値をtrueにする

タクトスイッチでデジタル入力回路

まずは、Arduinoの回路を組み立てます。

LED、抵抗器、タクトスイッチの単純な回路です。

タクトスイッチを押すと、2番PINのデジタル入力が「HIGH」になります。

ブラウザ側のWeb系プログラム

続いてブラウザ側を実装します。
前回作ったHTMLのJavaScriptの修正です。

コードを書いている間に、ブラウザ側と連動するプログラムと、マイコン側が影響するプログラムが分からなくなったので、browser();と、microcomputer();で、バッサリ2つに分けてしまいました。

設計思想としてどうかは分かりません・・・。

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Arduinoをブラウザ操作</title>
<script src="/socket.io/socket.io.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<style>
 body {
  padding-top: 500px;
  background: #000;
  text-align: center;
 }
 button {
  padding: 20px 40px;
  border-bottom: #999 solid 20px;
  border-radius: 15px;
  background: #EEE;
  font-size: 100px;
 }
 button.on {
  margin-top: 15px;
  border-bottom: #095E13 solid 5px;
  background: #3C9053;
  color: #FFF;
 }
</style>
</head>
<body>
<button id="ledBtn">LED点灯</button>
<script type="text/javascript">
 var socket = io(),
 $ledBtn = $("#ledBtn"),
 ledSwitch = false,
 SWITCH_CLASS = "on",
 
 browser = function(){
 $ledBtn.on("click", function(){
  if(ledSwitch === false){
   ledSwitch = true;
   $(this).addClass(SWITCH_CLASS);
  }else{
   ledSwitch = false;
   $(this).removeClass(SWITCH_CLASS);
  }
   socket.emit('led', ledSwitch);
  });
 },
 
 microcomputer = function(){
  socket.on("buttonSwitch", function(buttonSwitch){
   if(buttonSwitch === true){
    ledSwitch = true;
    $ledBtn.addClass(SWITCH_CLASS);
   }else{
    ledSwitch = false;
    $ledBtn.removeClass(SWITCH_CLASS);
   }
  });
 };
 
 browser();
 microcomputer();
 
</script>
</body>
</html>

心臓部Node.jsのプログラム

最後に心臓部であるNode.js実行用の「app.js」を書き換えます。

var express = require('express'),
 app = express(),
 http = require('http').Server(app),
 port = 3000,
 io = require('socket.io')(http),
 five = require("johnny-five"),
 board = new five.Board(),
 LED_PIN = 13,
 BUTTON_PIN = 2,
 buttonSwitch = false;
 
server = function(){
 app.use(express.static('htdocs'));
 http.listen(port,function(){
 console.log("Expressサーバーがポート%dで起動しました。モード:%s",port,app.settings.env);
 });
};

board.on("ready", function() {
 server();
 
 var led = new five.Led(LED_PIN);
 io.on('connection', function(socket){
  socket.on('led', function(data){
   if (data === true){
    led.on();
    buttonSwitch = true;
   }else{
    led.off();
    buttonSwitch = false;
   }
  });
 });
 
 var button = new five.Button({pin: BUTTON_PIN,isPullup: true});
 board.repl.inject({
  button: button
 });
 button.on("down", function() {
  if (buttonSwitch === true){
   led.off();
   buttonSwitch = false;
  }else{
   led.on();
   buttonSwitch = true;
  }
  io.sockets.emit('buttonSwitch', buttonSwitch);
 });
 
});

「buttonSwitch」の真理値が、LEDとブラウザボタンのON/OFFを制御しています。

これで完成。

コマンドプロントの「node app.js」で、サーバーを起動します。

ブラウザのアドレスバーに「http://localhost:3000/」、スマホでも試したい場合は「http://<ローカルIPアドレス>:3000/」と入れ、HTMLを開きます。

IoTを感じる

地味に大変だったような気がしますが、その分、ブラウザとArduinoの双方向なやり取りがIoTを感じさせ、心を満たしてくれます。

タクトスイッチでLEDを点灯させ・・・

スマホからLEDを消灯させたりできます。

 

JavaScriptでサーバーもマイコンも制御できる世の中となりました。

ただし、Johnny-Fiveについては、マニアックな制御や、ライブラリを使おうとしたとき、壁にぶつかる気もします。

組み込み系のプログラムは、C+言語を使った方が良さそうな・・・。

引き続き、最適な構成を模索していきます。