
無事、ボッチャ普及員となりました。
試合・審判の実践を多く取り入れた講習で、なまっていた私にはハードでした。その分、得られる知識や経験は多く、とても充実した講習会です。
ボッチャ普及のため、努めていこうと思います。

ユニバーサル社会で役立つデザインや技術の研究

無事、ボッチャ普及員となりました。
試合・審判の実践を多く取り入れた講習で、なまっていた私にはハードでした。その分、得られる知識や経験は多く、とても充実した講習会です。
ボッチャ普及のため、努めていこうと思います。

イベントの得点表示などで使うため、大きな7セグメントディスプレイを探していたら、秋月電子通商の「超大型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セグの仕組みをあまり理解してなかったので、動作するまで1日かかりましたが、努力の甲斐がありました。
7セグ表示に成功です。
ここから、無線で数字を受信して表示するよう改良します。

IoTの第一歩としてWi-Fiモジュール「ESP-WROOM-02」にお世話になってきましたが、その新バージョン「ESP-WROOM-32」が発売されています。
Wi-Fiに加え、Bluetoothまで使えるとのことです。
Arduino互換機としてすぐに使える開発者ボード「ESP-DevKit-C」も販売されていたので、使い勝手を確かめてみます。
開発環境は「ESPr Developer」で用意した経験があるので簡単でした。
「ESP-DevKit-C」は、まだまだ情報が少ないですが、環境設定くらいはネットで検索すると情報が見つかるので、調べながらIDEの準備を整えます。
なお、Windowsは簡単なのですが、Macは(2017年5月現在)Arduino IDEでの開発環境を用意するのは難しそうだったので、すぐに諦めました。
「ESP-DevKit-C」は幅が広く、通常のブレッドボードではどう挿して良いのか分からないです・・・。
とりあえず片側のピンだけ挿して、反対側はメスのジャンパーワイヤーを使う予定です。
恒例の動作確認で、LEDをチカチカさせます。

「ESP-DevKit-C」はピンの数が多く、せっかくなので23番ピンという、今まで使ったことのない数字でデジタル出力を試します。
問題なくLEDがチカチカしてくれました。
省電力が魅力のBluetooth接続。
サンプルのプログラムもあるのですが、使い方が分からない・・・。
そして、情報もほとんどありません。
断念しました。
もう少し待ちで。
Wi-Fi接続は「ESPr Developer」で何度もやっているので、サンプルを使って簡単にできるでしょう。
・・・あれ?できない。
そもそもWi-Fiをまったく検出してくれません。
Amazonでコメント欄に同様の症状と思われる
WiFiの掴みが非常に悪い
という意見が書き込まれていました。
・・・ハズレを引いてしまったのかもしれません。
悲しい。

ボッチャは観戦だけでなく練習でも「ボールの位置を見たい!」と、思うことが多々あります。
投球エリア(スローイングボックス)からは、奥行きがつかみにくく、赤・青どちらがジャックボールに近いか分からなくなります。
もちろん、プレーを止めて見に行っても良いですが、レクリエーションボッチャなら、テンポよくもっと効率的に確認できるようにしたいところです。
カメラの映像をスマホにリアルタイムで送ってくれるだけで、練習効率が上がりそうです。

スパイカメラという、小型のクリップで挟めるカメラを購入し、指示板に取り付けます。
簡単な設定で、カメラの映像をリアルタイムでスマホやPCに送信できます。

スマホに送られる映像です。
真上からの映像は、距離がはっきりわかります。
これなら手軽に導入できますし、練習の効率化もできそうです。
と、思った次の日・・・スパイカメラの充電がなぜかできず、現在問い合せ中。
やっぱりカメラ付き指示板を自作してしまおうか。

パラリンピックのような大きなボッチャ大会では、審判の背中側の観客が判定結果を見ることができない・・・という問題解決を考えて、以前、LEDと連動するボッチャ指示板を試作しました。
現状、子供が喜ぶただの電気仕掛けのおもちゃにしかなりませんが・・・それでも懲りずに、試作品2号を作りました。
試作1号は、指示板(ラケット)と判定結果を知らせるLEDが有線だったので、無線化しました。

Wi-Fiで思った以上に安定した無線環境を作れず、315MHzの無線通信といものを新たに試しています。
また、指示板1号では、重力や赤外線で指示板の向きを取得し、LEDと連動させてましたが、これも挙動が安定しないので、シンプルにボタンとしました。
裏側には電池取り付け。

ボタン電池2つで動きます。
指示板の柄の部分を空洞にすれば、電子部品が全て収まるサイズになってきました。
みっともない見た目も、改善されるでしょう。
指示板は卓球のラケットを利用しているので、セットで付いているピンポン球が余ります。
せっかく余っているので、穴を開けてLEDにかぶせてみました。

良い感じの照明となりました。
子供に審判をやってもらいます。
青が近いので赤チームの投げる番です。

指示板の赤と、LEDの赤い光で、判定結果を知らせます。
(本当は審判の後ろ側の死角でLEDが光る想定)
続いて、青チームに投げろと指示したいとき・・・

指示板の青と、LEDの青い光で伝えます。
電子工作の勉強にしかなっていない気がするので、少しは実用的なものを作りたたいです。
指示板改良の方向性を見直し、レクリエーションボッチャ用に使えるものを作ろうと思います。
週1で実際にレクリエーションボッチャをやっているので、「あったらいいな」というものを提案、開発していきます。

IoTの勉強をしていると、小型化とボタン電池駆動を夢見るようになります。
調査してみると、Arduinoとして使えるマイコンとしては、「8pino」が最少かと思われます。
これをボタン電池で動かしてみます。

おしゃれなパッケージの「8pino」が届きました。
日本人が開発したとのことで、モチベーションが上がります。
正確にはArduino互換機ではなく、Adafruit社のTrinket互換機らしいです。なんのことやら・・・?
難易度が高いかもしれないので、念のためAdafruit社のTrinketも購入しました。
(問題発生時、8pino特有の問題か、Trinketの仕様の問題か、問題を切り分けられるため。)

「8pino」は、プログラムを書き込むとき、USBをタイミング良く挿すという技が必要です。
USBを差してから10秒間だけ書き込みモードに切り替わるので、コンパイルが終わりそうなころにグサッと挿します。
あとは、特に問題も起きず、意外にもあっさりLチカまで到達しました。
ボタン電池は「3.3V出力コイル一体型昇圧DCコンバータ」というもの(写真中央の緑の基盤)を使い、3.3Vの安定した電源供給を行っています。
それにしても、「8pino」は本当に小さい。
ボタン電池CR2032が大きすぎて気になってしまいます。

激安のArduino nano互換機が壊れました。
USBポートの接続が不安定になり、電気供給ができない上、プログラムを書き込めないという、致命的な状況です。
電気供給については、VINに直接電源をつないでしまえば解決します。
9V電池があったので、VINに赤色コード(+)、GNDに黒色コード(-)をつなぎます。
Arduino nano互換機は、起動しました。
さて、プログラムを書き込めないので、もはや5Vと3.3Vのピンくらいしか使い道がありません。
電圧変換用途?
捨ててもいいような気がしますが、せっかくなので振動センサーモジュールを使って、おもちゃをつくります。
振ると光るだけなら、マイコンのプログラム書き込みはいらないです。

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

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

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

振ると・・・

LEDが黄色く光ります。
ただそれだけ。
壊れたArduino Nano互換機の、最後の使い道を考えましたが・・・意外と子供たちには喜ばれました。

前回までNode.jsを使い、ブラウザからLEDを光らせる実験をしていました。
今度はArduinoにつないだタクトスイッチからもLEDを光らせ、さらにブラウザ側のボタンも連動してON、OFFが切り替わるようにします。
Node.jsで管理されている真理値(true、false)が中心的な役割となります。

まずは、Arduinoの回路を組み立てます。
LED、抵抗器、タクトスイッチの単純な回路です。

タクトスイッチを押すと、2番PINのデジタル入力が「HIGH」になります。
続いてブラウザ側を実装します。
前回作った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実行用の「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を開きます。
地味に大変だったような気がしますが、その分、ブラウザとArduinoの双方向なやり取りがIoTを感じさせ、心を満たしてくれます。

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

スマホからLEDを消灯させたりできます。
JavaScriptでサーバーもマイコンも制御できる世の中となりました。
ただし、Johnny-Fiveについては、マニアックな制御や、ライブラリを使おうとしたとき、壁にぶつかる気もします。
組み込み系のプログラムは、C+言語を使った方が良さそうな・・・。
引き続き、最適な構成を模索していきます。

前回、Node.jsでLチカを実現しました。
Node.js→Arduinoがうまくいけば、ブラウザ(HTML)→Node.jsは、何とかなるような気がします。
Node.jsを使うとき、無理せずフレームワークのExpressをセットで使います。
そして、サーバーとクライアントの双方向リアルタイム通信を実現したいときは、socket.ioモジュールを使わせて頂きます。
いきなりArduinoでNode.jsを導入より、定番のリアルタイムチャット開発を通じてNode.jsを学んだ方が、理解しやすかもしれません。
前回からの続きで、Cドライブ直下の「node-arduino」というディレクトリ内で開発を進めます。
|
1 2 3 4 5 6 7 |
c: └ node-arduino └ <strong>htdocs</strong> │ └ <strong>index.html</strong> ├ node_modules ├ app.js └ package.json |
「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がつながっている単純な構成です。

準備が整いました。
コマンドプロントの「node app.js」で、サーバーを起動します。
ブラウザのアドレスバーに「http://localhost:3000/」と打ち、index.htmlを表示させます。

LED点灯ボタンが出てきます。
ボタンをクリック!

ブラウザのボタンも緑、LEDも緑に点灯しました。
すばらしい連動性です。
GIFアニメも掲載します。

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

これまでIoT実現のため、組み込み系プログラムを試行錯誤し、なんとかWebまでつなげてきましたが・・・無理のある構築になっている気がします。
勉強のため、今度は逆にWeb系の技術を起点に開発を進めてみようと思います。
Web系の技術、主にJavaScriptを使って、Arduinoをブラウザから制御できるようにします。
開発環境の準備は、ICS MEDIAさんの「JavaScriptでArduinoをコントロール ― 第1回 Lチカ(LEDチカチカ)させてみよう!」を、参考とさせて頂きました。
やることは・・・
私の場合、Windows環境で、Cドライブ直下に「node-arduino」というフォルダを作り、「app.js」という名前の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チカ回路を作ります。

Windowsの場合、コマンドプロントを立ち上げます。
cd C:\node-arduino
と、コマンドを打ち込み、先ほど用意したディレクトリに移動します。
最後に「app.js」をNode.jsで動かします。
node app.js
これでLEDがチカチカします。
Node.jsを使えれば、ブラウザでの非同期処理は、ハードルが一気に下がります。
次回はブラウザからLEDを操作してみようと思います。