大人だって、本気で遊んでもいいんじゃない!?

2017年に30年ぶりに復帰したミニ四駆の話題を中心に、アクアリウムやモンハンなどけっこうガチなホビーについて学びや持論などを書いていきたいと思います。

【ミニ四駆 074】Y'sミニ四ガレージで試走してきた!

こんばんは。ジョニーです。 少し開いてしまいましたが、10/7(日)に新マシンをY'sミニ四ガレージて走らせてきたときのことを書きたいと思います。

コレが走らせてきたタイプ3シャーシのエンペラーです。コースアウトでプラボディが破損してますが気にしないでください。

マシン製作の記事はこちら。

タイヤとボディの製作

25mm径、フロントはローフリクション、リヤはスーパーハードのハーフ(段付き)タイヤ。

ボディはカットして提灯部分と、ウイング部分(飾り)に分割。提灯のFRPの上に乗せるとフロント部分が高くなってカッコ悪いなぁ。。設置方法はあらためて検討したいと思います。

いよいよ、Y'sミニ四ガレージへ

ほんとは開店から行きたかったのですが、マシン製作が夕方までかかってしまい、17時近くに家を出て向かいました。

新宿で乗り換えて、はるばる田無へ!

そしてやっとたどり着きました!!

店内には3人ほどお客さんがいて、隣は旧FMを駆るつわものの方でしたw

これならタイプ3シャーシで走っても大丈夫!という謎の安心感に包まれながらコースを堪能してきました。

走行と調整と

着いて早々に走らせてみたところ、けっこうキビキビ走る!いけるかも・・・と思いきや、あっさり芝でやられてしまいました。。

ジャンプさせすぎて芝の終わり側で着地してバウンド、制御できないままコースアウトというパターンにはまったので、ブレーキかけて飛びを抑える方針に変更を試みます。

これは功を奏して完走することはできました。この時のタイムは27秒ジャスト!

なかなかのタイムだと思っていたのですが、こちらの模擬コースは本物のコースより全長が少し短いとのこと。もう少しタイムを詰めないと勝ち上がるのは難しそうです。

調整

ジャンプ後の芝で苦戦していたところ、お店の方とチャンピオンズのサワさんがアドバイスをしてくれました!

アドバイスの要点としてはこんな感じです。

  • フロント提灯の開きが悪い
  • スラスト抜けがある
  • ビスが歪んでまっすぐ走れてない

ATバンパーと連動させるため提灯は支柱にロックナットでがっつりつけていましたが、少し遊びを持たせるためにゴム管で止めるくらいがよいかもとのことでした。

やってみるとたしかに少し可動域が広がりました。それでいて稼働時にスラストもちゃんとつくので、少し安定するようになりました。

あとは、プラボディを持ち上げるにはリフターの力が足りていないので、ポリカをもう何枚か重ねた方がよいとのことでした。

こちらはその場では試せなかったので、東京EXまでには対応したいと思います。

最後のビスの歪みは、よーく見たらたしかにけっこう歪んでました。すでに何度かコースアウトして壁に突っ込んでいたので、きっとこれが原因だと思います。

キャップスクリューを推奨されましたが、物販コーナーに在庫がなかったため、このときは新しいビスに変えるだけとなりました。東京EXまでにはキャップスクリューに換装するぞ!

まとめ

この日の走行動画です。

19時から23時まで4時間ほどがっつり取り組めたのでだいぶ勉強になりました。

とくにいろいろアドバイスいただけたこともあり、なんとかレースで戦えるくらいのマシンになってきました。アドバイスくださったサワさん、ありがとうございました。

あとは、一度きちんと全体をバラしてメンテナンスをして、東京EXに挑みたいと思います!

とはいえ、東京EXはもう明後日だ。。頑張りますw

ここまでお読みいただき、ありがとうございました。

【ミニ四駆 073】新マシン製作2 リヤアンカー編

こんばんは。ジョニーです。 なんとか新マシンが完成したので、どんなふうに仕上がったか書いていきます。

リヤのアンカー

今回も元ネタがあるのでそちらの紹介から。

このアンカーを選んだ理由は、動画を見て直感的に作りやすそうと感じたからです。

そして、実際にやってみたところ、作業開始から二時間弱でつくることができました。

まずはキャッチャーを、ボールリンクマスダンパーのFRPの形に印をつけます。貧乏性なのでこの部分で2枚取ろうとしてますw

ハサミでカットするとこんなかんじ。

左右にビスで固定します。

穴を開けて、フルカウルカーボンに組み付けます。このとき、カーボンの9mm用の穴は干渉しないようにカットしておきます。

ローラー用のビスを隠すためのアンダースタビを作ります。マルチカーボンの端から3つ目の穴あたりでカットして、地面と設置するあたりの面取りをして滑らかにしています。

19mmローラーをセットするとこんなかんじ。

リヤスキッドローラーセットに組み付けるため、土台には位置合わせして穴を空けています。

ビスが出てる部分は最終的にはゴム管で隠します。

あとは可動部分にグリスを塗って完成!

ブレーキと制振用のアイアンテールはまだつけてません。

リヤのブレーキプレートもつけて、バンクチェッカーで確認。ちゃんとバンクスルーできそうなのでよし。

おまけ バンクチェッカー自作

よくネットで見かける、ダイソーのコレクションボックス(400円)で携帯用のバンクチェッカーをつくりました。

1個のコレクションボックスから、チェッカーを2枚作れるのでコスパはよいです!

こんなかんじで、切り口の部分はやすりがけしておきます。縦横の幅をチェックボックスに入るサイズに調整してます。

コレは携帯性に優れていて持ち運びしやすいので、使い込んでいきたいと思います。

おわりに

次はボディとタイヤを作って、y'sミニ四ガレージさんで試走してきた記事を書きたいと思います。

ここまでお読みいただきありがとうございました。

【ミニ四駆 072】新マシン製作1 フロントバンパー編

こんにちは。ジョニーです。

先日から研究のためフレキを作ってみたりしていましたが、やっぱりタイプ3シャーシでマシンを作りたくて、戻ってきてしまいました 笑

いったん完成

今回は初のフロントバンパーカットを試みました。試作なので以前に作ったシャーシでフロントの状態が良いものを選んでカットしました。

土台をつけて、アルミスペーサーで高さを調整してATバンパーを載せています。

もうちょいバンパーを後ろに下げたいので、次作るときは土台を短くする予定。

フロント提灯はATバンパーと連動させるようにつけています。バンパーの可動域(スラスト)が狭いのが少し課題です。

初めてリフター(ポリカの端材)を採用してみましたが、ちゃんと提灯が開くようです(可動域狭くてわかりづらいけど。。)

ブレーキステーとバンクスルー

バンクチェッカー(ダイソーのコレクションケース)に乗せて確認してみました。

プレーキなし、1mmまではバンクスルーできそうです。

ただ、26mmのローハイトタイヤを履かせてるだけでもこれだけシャーシの底が高い(=電池の位置が高い)。。重心を落とすためのなにかを考える必要がありそうです。

おまけ フレキ作製

フレキ作ってみたもののまだ走らせてないので、ステーとかひと通り組み付けて走らせてみたいです。

あと、ホエイルも一度作って動きを確認してみたいと思っています。

現時点で精度は悪く、スムーズに上下動しないので加工の精度改善の余地ありですね。。

このシャーシ製作の方針

ざっくりですが、方針はこんなかんじです。

  • 26mm or 25.5.mm タイヤ
  • フロントATバンパー、提灯連動
  • リヤ アンカー
  • ボディ エンペラーをカットして提灯に乗せる

タイプ3シャーシはシャフトドライブなので、プロペラシャフトでのロスはなるべく避けたいと思います。

よってシャーシ自体はなるべくねじれないように剛性をあげて、前後のバンパー(AT、アンカー)で体勢の崩れを補正して入るようになることが理想だと考えています。

リヤは井桁を組むのかスキッドローラー用パーツを使うのかで変わると思いますが、比較してやってみたいと思います。

ボディも、プラボディでいきたいので分割とか検討していますが、一度ポリカもやってなにが課題かを見極めていきたいなと思います。

こうみていくと、タイプ3シャーシで速く走るためには、たくさん課題があるなとあらためて気づきます。好きなシャーシで速く走りたいというのは完全に趣味なのですが、納得いくまでこのシャーシで勝負していきたいと思います。

タイプ3シャーシの事例はほとんどないのですが、速く走るためのさまざまな理論を自分なりに理解、解釈してこのシャーシに乗せて試していく過程はとても勉強になるし、楽しいなと思っています。

これからも、タイプ3シャーシで高速立体マシンを組み上げるべく頑張って行きたいと思います!

ここまでお読みいただきありがとうございました。

【ミニ四駆 071】ジョニー流モーター慣らし

こんばんは。ジョニーです。

今回は、ようやくやり方が確立されてきたジョニー流のモーター慣らしのやり方を説明します。

試行錯誤の経緯にご興味のある方は、以下の記事をお読みください。

コンセプト

カーボンブラシを採用しているモーターを短時間で慣らすことを目的としつつ、なるべくモーターに負担をかけないようにメンテナンスしていくことにします。

元ネタの「師匠の浅漬け慣らし」のやり方だけでも十分に回るモーターを作れるようにやると思います。ただ、僕の場合基本的なモーターのメンテナンスの知識不足でハマったところがあったので、そのあたりを含めてシェアできればと思いこの記事を書くことにしました。

あくまでもひとつのやり方ということで、実施される方は自己責任でお願いいたします。

用意するもの

  • カップ
    • お湯を入れてモーターを漬けるためのもの
  • 電源
    • 2.4V、3Vを安定供給できるもの
  • ターミナル
    • VSとからS2とかのものが使いやすい
  • オイル
    • 軸受の注油につかいます
  • パーツクリーナー
    • カーボン削りカスを洗浄するもの
  • 洗浄用のビン
    • 塗料のスペアボトルとかでよい
  • CRC 2-26
    • 浅漬け後に水気を飛ばして接点復活するもの
  • 回転数計測アプリ
    • Android
    • iOS
  • タイマーアプリ
    • 2分 3セットを測れればなんでもよいです

慣らし前の計測

3Vにセットして、回転数を計測します。 回しているときのジリジリという音や、軸を触ったときの振動を覚えておいてください。慣らし後にどんなふうになったか比較してみると明らかな違いに驚くはずです。

浅漬け慣らし 2分 x 3セット

カップにお湯を入れて準備します。

モーターの軸受にたっぷりオイルを塗って、指で軸をクルクル回してなじませる。このときのコリコリ引っかかる感じを覚えておくと、あとでスムーズに回るようになったときとの比較が体感できます。

タイマーを2分にセットします。

電圧を2.4V(正転)にセットして、浅漬け開始

モーター内部にコポコポ水が入って音が鈍くなったら引き上げて水を抜いてまた漬けます。

2分たったら電源を止めてひきあげます。

これをあと2セット(計3セット)行います。

反転で回す

モーターをティッシュにくるんで、よく振って水気を飛ばします。

電源を3V(反転)にセットして1分回します。

ここは、オリジナルにはない工程ですが、僕の中ではやった方がよかったという感じがあります。

メンテナンス

エンドベル側からCRC 2-26を注入します。

ティッシュで包んでよく振って水気を飛ばします。このとき、カーボンの削れたカスが出てティッシュが黒くなっていると思います。

軸受に少量注油して、軸をクルクル回してなじませます。最初のときと比べて抵抗感が少なくなっていたら期待できます。

慣らし後の計測!

いよいよ計測です。 3Vにセットして回転数を計測します。

結果はいかがだったでしょうか!?

まとめ

チェックポイントをおさらいしておきます。

  • 軸をつまんでクルクル回したときの抵抗感
  • 電気を流して回っているときの音

僕の場合、今のところ平均+2500回転くらいの結果が出ていますので、時間効率的には悪くないかなと思います。

もし、やってみたよとか感想とかありましたらコメントでもいただけるとうれしいです。

ここまでお読みいただきありがとうございました。

【ミニ四駆 070】モーター慣らし1 試行錯誤編

こんにちは。昨日ようやく実践に使えそうなモーターを手に入れて舞い上がっているジョニーです 笑

今回は、試行錯誤の過程を思い出しながら記事にまとめます。

そして次回は、(まだ模索中ではありますが)ジョニー流のモーター慣らしのやり方を紹介したいと思います!ご期待くださいw

出来上がったスプリントダッシュ

まずは結論からということで、今のところ一番よく仕上がったモーターについて紹介します。

  • スプリントダッシュモーター

    • 慣らし前 31,464
    • 慣らし後 35,064(+3,600)
    • 46km/h ※写真では45km/h
  • 回転数計測環境

  • 速度計測環境

    • タミヤ スピードチェッカー
    • VSシャーシ
    • 3.5:1ギヤ
    • 26mm径ローハイトタイヤ

まだコースで走らせてはいませんが、回転数としても35,000に達していて、スピードチェッカーでも46km/h出ているので、これは戦力になるのではないかと期待しています!

慣らし方の試行錯誤

大きく以下の3つのやり方を試しました。

  • 9v で正転、反転を計1時間やる
  • 1.5v で正転、反転をじっくり3時間やる
  • 浅漬け慣らし

ちなみに、僕の中では「浅漬け慣らし」がベストだという結論になりました。

では、このあとはそれぞれの結果を書いていきたいと思います。

9v で正転、反転を計1時間やる

やってみてわかったのですが、僕はこのやり方ではブラシを削りすぎてしまうようです。。

「銅ブラシは高電圧で手早く、カーボンブラシは低電圧でじっくり」というのがセオリーであることはいろいろ調べてわかっていたのですが、高電圧でうまくいっている方の記事もあったので試してみました。

手順は以下の通りです。

  1. パーツクリーナーでモーターを洗浄
  2. 軸受に注油少量
  3. 9v 正転、反転を2分ずつくらい交互にやる

正転で熱くなったら、冷まして反転のように約1時間やって結果をみたら著しく遅くなってしまいました。。29,000->26,000

しかたないので開けて中の状態を確認したところ、片方のブラシが削れてなくなってしまっていました。これがいわゆる、「モーターの死」というやつなんだなぁと理解しました。

実は、途中30分くらいのところで、パーツクリーナーで一度洗浄して計測しています。洗浄液はめちゃくちゃ黒くなりました。

洗浄後はティッシュに包んでよく振って揮発させないと、引火などの危険があるので十分気をつけてください。

ちなみにこの時の回転数は、30,000くらいだったのでこの辺がピークだったのかもしれません。

実験台になってくれたモーターは、分解してモーターピンとして活躍してもらおうと思いますw

ちなみに、パワーダッシュモーターの絶縁ワッシャーが黒いっていうのは、このとき初めて知って驚きましたw

こんな感じでモーターを2つほど潰したところで、このやり方はやめようと思いました。

カーボンブラシの高電圧慣らしは、モーターへの負担が半端ないのと手で持ってるとかなり熱くなって辛いので、もし試される方はお気をつけください。

1.5v で正転、反転をじっくりやる

高電圧慣らしが失敗したときに、いくつかダメだったと思う要素を検討して、正攻法でやってみることにしました。

慣らし前、慣らし中のパーツクリーナーはいったんやめて、今回は素直にやっています。

  1. 正転2時間、反転2時間
  2. 正転1時間、反転1時間 を2セット

結果としては、なぜかうまくいきませんでした。。 ここの理由を突き止めるべきとも思うのですが、4個ほどパワーダッシュで試した結果、

  • 2個は+1000 2のやり方
  • 1個はプラマイゼロ
  • 1個は-1000

なぜか回転数下がってしまうものもあり、正直謎すぎて泣きそうになりました。。

一番スタンダードな方法なので、平均+1000くらいであれば納得感もあったんですが。

浅漬け慣らし

かれこれ数日間の試行錯誤を経て、以前にも一度試してみたことのある「浅漬け慣らし」にもう一度トライしてみようと思いました。

元ネタはYouTubeのこちらです。

【ミニ四駆】「師匠の簡単モーター慣らし② 実技編」 - YouTube

このやり方の1番のメリットはやっぱり、1個あたりにかける時間が15分でよいことですね!

前回やったときは、事後のメンテが悪くて翌日計測し直そうとしたらキュルキュル異音がしたりしてましたが、今回はそういうトラブルも解消することができていそうです。

基本的なやり方は踏襲しつつ、いくつかアレンジしています。合計7個試して平均+3000くらい(*1)を実現できています。

*1 スプリント4個、パワーダッシュ2個、マッハダッシュPRO1個試した結果

ただ、上記にカウントしていない開けポンから明らかにあやしかったスプリントがあるのですが、こいつは結果マイナスでした。。

これが冒頭の46km/h出したモーターです!

調子に乗って、両軸のマッハダッシュPROまで試してみました。

まとめ

浅漬け慣らしは短時間でできるモーター育成として効果ありと考えられるので、今後活用していきたいとおもいます。

ジョニー流の具体的な手順については、次回をお楽しみにw

ここまでお読みいただきありがとうございました。

【ミニ四駆 069】JC2018 東京大会3レポート

こんばんは。ジョニーです。

去る9/9にミニ四駆ジャパンカップ2018 東京大会3にいってきました。

だいぶ気持ち的に落ちててブログ書き途中で止まってました。。

前日作業

あいかわらずマシン製作が遅く、今回も土曜の夜は大変な思いをしました 笑

ベースとなるシャーシは前回のものを使いまわし、タイヤも使い回し(本当は ローフリクションに変えたかった)です。

今回のポイントは、以下の2点です。

  1. フロント提灯でキャッチャーを使用
  2. フロント、リヤ共に簡易ピボットを採用

フロント提灯は、キャッチャーにしてあらかじめ角度をつけておきました。

ピボットは、FRPサブプレートセットを使用した簡易版です。というかこれ以上のギミックを仕込めなかった。。

作業を進めながらモーターも慣らしてたんですが、こちらはまったく振るわずパワーダッシュモーターで30000回転が限界でした。

まだモーターづくりは勉強中なので、良い鍛え方を探したいと思います。

電池もパンパンにいれて、数値的には1.53Vくらいでした。

当日のレース結果

実はせっかくパンパンにした電池を忘れて、当日買った富士通のアルカリで勝負!!

残念ながら3週目のデジタルカーブで曲がりきれずコースアウトしました。

まとめ

今回は、一夜漬けだったのでいろいろダメでしたが、東京EXにもし出られたら、ラストチャンス頑張ってみたいと思います!

ここまで読んでいただきありがとうございました。

【Xamarin 002】QRコードライブラリ Zxing.Net.Mobile.Forms を Prism っぽく使ってみた

こんばんは。このところXamarin.Formsのアプリ開発にはまっているジョニーです。

さて、アプリでQRコードを扱いたいと思って調べていて Zxing(Zebra Crossing:ゼブラ・クロッシングの略)をというライブラリが Xamarin.Forms に対応しているというのを見つけました。これを、Prism で扱えるようにしようとしてハマったものの、なんとか解決できたので誰かの参考になるかもしれないと思い記事を書いていおくことにします。実は数ヶ月後の自分のためかもしれない・・・

f:id:johnny06r:20180829004503p:plain

まずはサンプルの写経から

エクセルソフトの田淵さんという有名な方が記事を書かれていたので早速参考にさせていただきました。 qiita.com

素の Xamarin.Forms で扱う分には、上記の記事の通りやったらすぐに動くものができました。

やったこととしてはこのくらい。サンプルを動かすまでの所要時間は15分くらいでした。

  • Nugetパッケージ「Zxing.Net.Mobile.Forms」の追加
  • MainPage.xaml にボタンとイベント処理を追加
  • MainPage.xaml.cs にイベントハンドラとして QRコードを読み取る処理を記述
  • iOSプロジェクトの AppDelegate.cs に初期化コードを追加
  • iOSプロジェクトの Info.plistにカメラを使うときの説明「NSCameraUsageDescription」を追加

Prism 対応の前に

ここでいう Prism 対応というのが何を指しているかをまず説明します。

まずは、もとのコード(前述のサンプル)です。

using ZXing.Net.Mobile.Forms;

async void ScanButtonClicked(object sender, EventArgs s)
{
    // スキャナページの設定
    var scanPage = new ZXingScannerPage()
    {
        DefaultOverlayTopText = "バーコードを読み取ります",
        DefaultOverlayBottomText = "",
    };
    // スキャナページを表示
    await Navigation.PushAsync(scanPage);

    // データが取れると発火
    scanPage.OnScanResult += (result) =>
    {
        // スキャン停止
        scanPage.IsScanning = false;

        // PopAsyncで元のページに戻り、結果をダイアログで表示
        Device.BeginInvokeOnMainThread(async () =>
        {
            await Navigation.PopAsync();
            await DisplayAlert("スキャン完了", result.Text, "OK");
        });
    };
}

MainPage.xaml.cs に追加する ScanButtonClicked イベントハンドラの中で ZXingScannerPage というQRコードスキャナーのページを生成して、 OnScanResult というイベントのハンドラでスキャン完了時の処理を記述しています。そして、Device.BeginInvokeOnMainThread() 、await Navigation.PopAsync() 、DisplayAlert() というメソッドで画面遷移やアラートを表示しています。

Prism 対応

せっかく Prism を使うので、Prism らしく書けるようにしたいと思います。さて、どんな風に書くと Prism らしくなるのか、僕なりの解釈を説明したいと思います。

  • 画面遷移の処理は、ページのコードビハインド(.xaml.cs)ではなく、ViewModel に書く
  • Device 、Navigation は使わず、 IDeviceService 、INavigationService 、IPageDialogService を使う
  • イベントは、EventToCommandBehavior を介して、ViewModel に定義した Command で処理する

このように書けるようにするために、必要になったことを説明していきます。

修正した内容

今回は、Prism のブランクプロジェクトに以下のファイルを追加しました。

  • ScannerPage.xaml
  • ScannerPage.xaml.cs
  • ScannerPageViewModel.cs
  • ScanFinishedEventArgs.cs

MainPage.xaml にはボタンを設置して、 ScannerPage へ遷移するだけとなっています。

MainPage.xaml

<Button Text="Scan"
    Command="{Binding NavigateCommand}"
    CommandParameter="ScannerPage"/>

MainPageViewModel.cs

public Command<string> NavigateCommand
    => new Command<string>(name => {
        _navigationService.NavigateAsync(name);
});

App.xaml.cs

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterForNavigation<NavigationPage>();
    containerRegistry.RegisterForNavigation<MainPage>();
    containerRegistry.RegisterForNavigation<ScannerPage>();
}

これから説明する ScannerPage もコンテナレジストリに登録して利用します。

ScannerPage.xaml

<?xml version="1.0" encoding="UTF-8"?>
<zxing:ZXingScannerPage xmlns="http://xamarin.com/schemas/2014/forms"
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            xmlns:zxing="clr-namespace:ZXing.Net.Mobile.Forms;assembly=ZXing.Net.Mobile.Forms"
            xmlns:behaviors="clr-namespace:Prism.Behaviors;assembly=Prism.Forms"
            x:Class="PrismQRCodeSample.Views.ScannerPage">

    <zxing:ZXingScannerPage.Behaviors>
        <behaviors:EventToCommandBehavior
            EventName="ScanFinished"
            Command="{Binding ScanResultCommand}"
            EventArgsParameterPath="Result"/>
        </zxing:ZXingScannerPage.Behaviors>
</zxing:ZXingScannerPage>

ZXingScannerPage を XAML で定義するために、xmlns:で、zxing 名前空間を宣言します。これで、 zxing:ZXingScannerPage タグを使えるようになりました。余談ですが、名前空間の宣言が子要素だけでなく自身にも有効であることを知って驚きました。

次に、 Behaviors で EventToCommandBehavior を登録します。

ただ、ZXingScannerPage は、EventToCommandBehaviorに適合したイベントハンドラをもっていません。そこで、このビヘイビアの例によく使われている ListView のソースを参考に、イベントハンドラを作ってみようと思います。

ListView.cs https://github.com/xamarin/Xamarin.Forms/blob/master/Xamarin.Forms.Core/ListView.cs

ZXingScannerPage.cs github.com

ハンドラの部分を抜粋すると、このような違いがあります。

ListView.csの宣言

public event EventHandler<SelectedItemChangedEventArgs> ItemSelected;

ItemSelected は System.EventHandler デリゲート型であり、EventArgs サブクラスの SelectedItemChangedEventArgs を取ることがわかります。

SelectedItemChangedEventArgs.cs

using System;

namespace Xamarin.Forms
{
    public class SelectedItemChangedEventArgs : EventArgs
    {
        public SelectedItemChangedEventArgs(object selectedItem)
        {
            SelectedItem = selectedItem;
        }

        public object SelectedItem { get; private set; }
    }
}

ListView.cs でハンドラが呼び出される部分では、以下のように使用されています。

static void OnSelectedItemChanged(BindableObject bindable, object oldValue, object newValue)
    => ((ListView)bindable).ItemSelected?.Invoke(bindable, new SelectedItemChangedEventArgs(newValue));

一方で、ZXingScannerPageはかなり違います。

ZXingScannerPage.cs

        public delegate void ScanResultDelegate (ZXing.Result result);
        public event ScanResultDelegate OnScanResult;

呼び出しじはこんな感じ。

zxing.OnScanResult += (result) => {
    this.OnScanResult?.Invoke( result );
};

そこで、 コードビハインドで元のイベントをラップして、EventHandler型のイベントを定義してみることにします。

ScannerPage.xaml.cs

    public partial class ScannerPage : ZXingScannerPage
    {

        public ScannerPage()
        {
            InitializeComponent();

            DefaultOverlayTopText = "バーコードを読み取ります";
            DefaultOverlayBottomText = "";

            this.OnScanResult += (result) =>
            {
                this.ScanFinished?.Invoke(this, new ScanFinishedEventArgs(result));
                this.IsScanning = false;
            };
        }
        public event EventHandler<ScanFinishedEventArgs> ScanFinished;
    }

OnScanResult のハンドラで、新しく作った ScanFinished イベントを invoke しています。このとき使用する ScanFinishedEventArgs も作りました。

ScanFinishedEventArgs.cs

    public class ScanFinishedEventArgs : EventArgs
    {
        public ScanFinishedEventArgs(ZXing.Result result)
        {
            Result = result;
        }

        public ZXing.Result Result { get; private set; }
    }

ScannerPage.xaml

<behaviors:EventToCommandBehavior
    EventName="ScanFinished"
    Command="{Binding ScanResultCommand}"
    EventArgsParameterPath="Result"/>
</zxing:ZXingScannerPage.Behaviors>

EventArgsParameterPath には、EventHandler で指定した型のオブジェクト(今回は ScanFinishedEventArgs)のプロパティ名(今回は Result)を指定します。これで読み取り完了のイベントが、Commandに変換され、Resultを引数にとって呼び出せるようになりました。

では、最後に ScannerPageViewModel に定義した ScanResultCommand イベントハンドラを見てみましょう。

ScannerPageViewModel.cs

public Command<ZXing.Result> ScanResultCommand => new Command<ZXing.Result>(result => {
    _deviceService.BeginInvokeOnMainThread(() =>
    {
        _navigationService.GoBackAsync();
        _pageDialogService.DisplayAlertAsync("スキャン完了", result.Text, "OK");
    });
});

ViewModelにはコンストラクタで IDeviceService、INavigationService、IPageDialogService がインジェクションされているので、このように書き換えることができました。やった〜!

というわけで、まずはここまでおつかれさまでした!!

ちなみにこちらが、読み込みテストに利用したQRコードですw

f:id:johnny06r:20180829010359p:plain

iOS の実機デバッグでハマったこと

これは、Zxing ではなく、Prism の話ですが、 iPhoneを繋いでアプリを配置しようとした時にエラーが出てハマったのでこれも書いておきます。

f:id:johnny06r:20180829005238p:plain

「iTunes Package Archive(IPA)をビルドする」というオプションをオンにしないと、iPhone 実機を選んでビルドするとエラーが出ます。シミュレータでやってるときはでなかったので少し焦りました・・・

f:id:johnny06r:20180829011518p:plain エラーはこんな感じ、なにやらビルド途中でパスが入っているはずの変数が空で怒られているようです。

f:id:johnny06r:20180829011532p:plain エラーの箇所に飛んでみると、IpaPackagePath という変数がからであることが問題のようです。Prism でない素の Xamarin.Forms ではこの問題はおきないことを確認しつつ、IPAを作るオプションを探したところ上記の「iTunes Package Archive(IPA)をビルドする」にたどり着きました。

このトラブルだけで、解決に1時間近くかかってしまった・・・まぁ、これも勉強ですね。

まとめ

Zxing を Prism っぽく使うためには、イベントハンドラを適合してあげる必要がある!

今回の事例を通して、イベント、ビヘイビア、XAMLとコードビハインドなど様々な点で Xamarin.Forms および Prism の理解を深めることができました。やっぱり、やりたいことがあって悪戦苦闘しながらできるようになっていく過程で学びや成長があるんだなと思いました。

取り掛かってから、動くようになるまでなんだかんだで4時間くらいかかってしまいました。

Xamarin.Forms については、詳しい方々が非常に有益な情報を書いてくださっているので、僕は自分が必要なものをいい感じで使おうとしてハマったこととか出てきたらそれを書いてみようかなと思います。

この記事が、Xamarin.Forms や Prism を使っている誰かの参考になれば幸いです。 最後までお読みいただき、ありがとうございました。

参考URL

Xamarin.Forms のAPIドキュメント docs.microsoft.com

Xamarin.Forms の GitHub リポジトリ(ソースコード) github.com

Prism の GitHub リポジトリ(ソースコード) github.com