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

 

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

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

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

超大型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+言語を使った方が良さそうな・・・。

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

Arduinoをブラウザから動かす

前回、Node.jsでLチカを実現しました。

Node.js→Arduinoがうまくいけば、ブラウザ(HTML)→Node.jsは、何とかなるような気がします。

Node.js+Express+socket.io

Node.jsを使うとき、無理せずフレームワークのExpressをセットで使います。

そして、サーバーとクライアントの双方向リアルタイム通信を実現したいときは、socket.ioモジュールを使わせて頂きます。

いきなりArduinoでNode.jsを導入より、定番のリアルタイムチャット開発を通じてNode.jsを学んだ方が、理解しやすかもしれません。

ディレクトリ構成

前回からの続きで、Cドライブ直下の「node-arduino」というディレクトリ内で開発を進めます。

「htdocs」というディレクトリを新たに作り、index.htmlを作ります。

ブラウザ側のスイッチを作る

index.htmlは、ブラウザでLEDの点灯を制御する画面です。

ブラウザに表示されるスイッチを押すと、ArduinoにつながれたLEDが光ります。

<!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";
 
 $ledBtn.on("click", function(){
  if(ledSwitch === false){
   ledSwitch = true;
   $(this).addClass(SWITCH_CLASS);
  }else{
   ledSwitch = false;
   $(this).removeClass(SWITCH_CLASS);
  }
  socket.emit('led', ledSwitch);
 });
</script>
</body>
</html>

LEDが点灯中は、ブラウザ上のスイッチも緑色になります。

サーバー側のスクリプトを書く

サーバ―側のapp.jsでは、サーバーの起動および、ブラウザからの命令を受け取り、Arduinoに命令を出すためのコードを書きます。

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,
 
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();
 led = new five.Led(13),
 io.on('connection', function(socket) {
  socket.on('led', function(data) {
   if (data === true) {
    led.on();   
   } else {
    led.off();
   }
  });
 });
});

前回の再掲載となりますが、回路は13番にLEDがつながっている単純な構成です。

LEDをブラウザから点灯!

準備が整いました。

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

ブラウザのアドレスバーに「http://localhost:3000/」と打ち、index.htmlを表示させます。

LED点灯ボタンが出てきます。

ボタンをクリック!

ブラウザのボタンも緑、LEDも緑に点灯しました。

すばらしい連動性です。

GIFアニメも掲載します。

これくらいのことだと、socket.ioが必要なかった気がしますが・・・次回はもっと双方向な構築で、socket.ioも活躍します。

ArduinoをJavaScriptで動かす

これまでIoT実現のため、組み込み系プログラムを試行錯誤し、なんとかWebまでつなげてきましたが・・・無理のある構築になっている気がします。

勉強のため、今度は逆にWeb系の技術を起点に開発を進めてみようと思います。

JavaScriptで開発するための環境準備

Web系の技術、主にJavaScriptを使って、Arduinoをブラウザから制御できるようにします。

開発環境の準備は、ICS MEDIAさんの「JavaScriptでArduinoをコントロール ― 第1回 Lチカ(LEDチカチカ)させてみよう!」を、参考とさせて頂きました。

やることは・・・

  • StandardFirmataをArduinoに書き込む
  • Node.jsをPCにインストール(私はインストール済みでした)
  • johnny-fiveをPCにインストール

私の場合、Windows環境で、Cドライブ直下に「node-arduino」というフォルダを作り、「app.js」という名前のJavaScriptを用意しています。

Arduinoを制御するJavaScript

実際にLEDをチカチカさせるJavaScriptを作ります。

先ほどの「app.js」に下記コードを書きます。

var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {
 var led = new five.Led(13);
 led.blink(1000); //1秒ごとに点滅
});

johnny-fiveのサイトに掲載されているサンプルコードを使ってみます。
(試しに点滅は1秒ごに変えています)

Lチカ回路を作り Node.js実行

あとは、最小構成のLチカ回路を作ります。

Windowsの場合、コマンドプロントを立ち上げます。

cd C:\node-arduino

と、コマンドを打ち込み、先ほど用意したディレクトリに移動します。

最後に「app.js」をNode.jsで動かします。

node app.js

これでLEDがチカチカします。

ブラウザ側の制御は楽になりそう

Node.jsを使えれば、ブラウザでの非同期処理は、ハードルが一気に下がります。

次回はブラウザからLEDを操作してみようと思います。