無事、ボッチャ普及員となりました。
試合・審判の実践を多く取り入れた講習で、なまっていた私にはハードでした。その分、得られる知識や経験は多く、とても充実した講習会です。
ボッチャ普及のため、努めていこうと思います。
ユニバーサル社会で役立つデザインや技術の研究
無事、ボッチャ普及員となりました。
試合・審判の実践を多く取り入れた講習で、なまっていた私にはハードでした。その分、得られる知識や経験は多く、とても充実した講習会です。
ボッチャ普及のため、努めていこうと思います。
イベントの得点表示などで使うため、大きな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を操作してみようと思います。