すべての礼儀正しいドライバーに感謝します
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要なツールとマシン
> |
| |||
| ||||
| ||||
| ||||
|
アプリとオンラインサービス
> |
| |||
| ||||
|
このプロジェクトについて
私が運転している限り、私は私の周りのランダムなドライバーとより意味のある方法で通信できるようになりたいと思っていました。ライトの閃光、手の波、手の波よりもはるかに多くのジェスチャー、ホーン、またはブレーキのスラムはすべて、非常に粗雑なコミュニケーションのメカニズムであるように思われました。
これのインスピレーションは、オースティンマーティンのバックウィンドウに表示されたオースティンシーンで、彼がいくつかのテキストを持っていたジェームズボンド映画でした。他の車両のドライバーに、自分が何を考えているのかを正確に伝えることができると思いました。
これがベンチデモです:
そして、準実写デモ:
<図>コンセプトスケッチは次のとおりです。
<図>MKR1000はプレリリースボードであり、正式なドキュメントがないため、このプロジェクトには追加の課題がありました。ハックスターには非常に良い出発点があります:
https://www.hackster.io/charifmahmoudi/arduino-mkr1000-getting-started-08bb4a
したがって、プロジェクトの最初のステップ:
MKR1000を話してもらう
私は幸運にもhttp://arduino.ccが主催するフォーラムに参加しました。このフォーラムには、リリースごとのボード所有者のためのプライベートフォーラムがありました。堅実な土曜日の後、私はなんとかボードをプログラムし、すべてのコンポーネントを機能させることができました。
私の現在のセットアップには、ArduinoIDEバージョン1.6.9の1時間ごとのビルドが含まれます。あなたが私のようなら、プロジェクトで「毎時」ビルドを使用すると、少なくとも「不快」になります。
IDEをインストールしたら、IDEのボードマネージャーを使用してボードのドライバーをダウンロードしました。また、IDEライブラリマネージャーを使用して、Adafruit DotStar、Adafruit DotStarMatrix、Adafruit GFX、ArduinoJson、およびWindows Virtual Shields forArduinoのライブラリをロードしました。
このボードが正式にリリースされると、プロセスははるかに簡単になります。したがって、ここでは詳しく説明しません。記事の最後に、これを行うのに役立つプロジェクトへの参照があります。
ビルドエレクトロニクスのルール1:回路から魔法の煙を出さないでください!
MKR100は3v3ベースのボードです。私が望むすべての文書を持っていなかったので、それらが5ボルト耐性であるかどうかはわかりませんでした。一部のコンポーネントは、適切なロジック1と0を確立するために5ボルトを使用できるようにしたいだけではありません。
これにより、Adafruitによる4チャネルの双方向レベルシフトの必要性が生じました。ブルートゥースカードと特にDotStarマトリックスの両方が本当に完全な5ボルトのようです。したがって、これらを接続するときは注意してください。
コンポーネントが機能することを確認してください
すべてが連携して機能することを心配する前に、すべてのコンポーネントが機能することを確認したいと思います。
<リンクを挿入> Adafruit 8x32DotStarマトリックスから始めました。私が持っていた接続は少し不安定であることがわかりました。これを問題にしないために、私は周りに置いていたいくつかのヘッダーピンを使用して、それらをはんだ付けしました。
<図>ヘッダーピンがしっかりと取り付けられています。データとクロック入力を、MKR1000のSDAとSCLとマークされたSPIピンにルーティングしました。
ヘッダーピンがしっかりと取り付けられています。データとクロック入力を、MKR1000のSDAとSCLとマークされたSPIピンにルーティングしました。
サンプルスケッチ「ファイル>例> Adafruit DotStarMatric> matrixtest」をIDEにロードしました。コードのDATAPINを11に、CLOCKPINを12に調整しました。ソリューションを構築して展開しました。マトリックスのオプションを少し使用した後、ディスプレイが機能するようになりました。
次は、Bluetoothアダプター上で仮想シールドを機能させることでした。本当に簡単でした。 githubリポジトリhttps://github.com/ms-iot/virtual-shields-arduinoに記載されている手順に従いました。私がしなければならなかった唯一の変更は、TXピンとRXピンでした。これらは私のボードにマークされているピン14と13です。
ただし、以前の化身では、新しいスケッチをアップロードするためにTX / RXピンを切断する必要がありました。これがもはや当てはまらないことを報告できてうれしいです。
コードをウォークスルー
すべてが機能しているので、少し時間を取って、このプロジェクトに固有のコードを見ていきます。
すべての機能にアクセスするには、次のものを含める必要があります。
#include #include #include #include #include #include #include #include #include #include
最初の5つのインクルードはかなり説明的であるはずです。
VirtualShield.hには、Bluetoothアダプターを介した通信の基本機能が含まれています。これは、どのセンサーにアクセスするかに関係なく必要です。
Text.hファイルは、より適切なテキスト、つまり文字列処理を取得します。
Graphics.h、Recognition.h、およびColors.hには、仮想画面にアクセスし、音声認識を有効にするために必要な機能が含まれています。この課題はまだ終わっていませんが、将来的には音声機能をコード化する予定です。
次の重要なコード行のリストで、DotStarマトリックスを初期化し、Shieldオブジェクトを初期化します。
Adafruit_DotStarMatrix matrix =Adafruit_DotStarMatrix(32、8、DATAPIN、CLOCKPIN、DS_MATRIX_TOP + DS_MATRIX_LEFT + DS_MATRIX_COLUMNS + DS_MATRIX_ZIGZAG、DOTSTAR_GBR); const uint16_tcolors [] ={matrix Color(0、255、0)、matrix.Color(0、0、255)、matrix.Color(255、0、255)、matrix.Color(255、0、106)、matrix.Color(255、255、 255)}; VirtualShieldシールド;グラフィックス画面=Graphics(shield);認識音声=認識(シールド);
最初の行は、DotStarライブラリにマトリックスのサイズとレイアウトを示しています。さまざまなオプションについては、matrixtestの例またはAdafruit_DotStarMatrix.hファイルを参照してください。
色はDotStarライブラリ用です。
最後の3行は、電話のセンサーを操作するために、シールドを起動してオブジェクトを初期化します。
次に、すべてのArduinoスケッチと同様に、setup()メソッドを処理する必要があります
void setup(){matrix.begin(); matrix.setTextWrap(false); matrix.setBrightness(40); matrix.setTextColor(colors [0]); DisplayText( "初期化中..."、4、10); //仮想シールドイベントを設定します:shield.setOnRefresh(refresh); Speech.setOnEvent(onSpeech); screen.setOnEvent(screenEvent); //シールド通信を開始します(refresh()も呼び出します)。 shield.begin(); // 115200 BluetoothボーレートDisplayText( "Initializing ... finish"、3、10);}
を想定
「マトリックス」の行はかなり自明であり、これらの行が実行されると、マトリックスにいくつかの情報メッセージを出力できるようになります。
「シールド」ラインは、コールバックメソッドを設定するようになりました。これらのメソッドは、イベントが発生したときに必要に応じて呼び出されます。
次に、スケッチ全体の中で最も複雑な方法について説明します
void loop(){// checkSensors()は戻りイベントをチェックし、それらを処理します(コールバックを呼び出します)。これはVirtualShieldの単一のloop()メソッドです。 shield.checkSensors();}
うん、あなたはそれを手に入れました。センサーの1つが起動したかどうか、および対処が必要なイベントが発生したかどうかを継続的にチェックします。
では、実際にいくつかのイベントを処理しましょう。最初はrefresh()メソッドです。さまざまなイベントが発生したときに呼び出されます。現在気になっているイベントの1つは、Bluetoothが接続されているときです。画面を再描画できるようにイベントが必要です。
void refresh(ShieldEvent * shieldEvent){//ここに更新コードを入力//これは、Bluetoothが接続するたび、shield.begin()が実行されるたび、またはアプリで「更新」ボタンが押されるたびに実行されます。 screen.clear(ARGB(123,86,204)); screen.drawAt(0,0、 ""); thanksId =screen.addButton(10、50、 "。ありがとうございます。"); welcomeId =screen.addButton(10、100、 "。ようこそ。"); turnLeftId =screen.addButton(10、150、 "。Left。"); stopId =screen.addButton(175、50、 "。停止しています。"); startId =screen.addButton(175、100、 "。開始。"); turnRightId =screen.addButton(175、150、 "。right。"); backoffId =screen.addButton(10、225、 "。BackOff。"); call911Id =screen.addButton(10、290、 "。Calling911。");}
このメソッドは、明るい紫色の背景で画面をクリアし、画面にさまざまなボタンを配置します。単語の周りの間隔に注意してください。これは、仮想シールド機能の現在の制限です。見栄えを良くするために、物事を中央に配置したかったからです。
では、これらのボタンの1つに触れるとどうなりますか?イベントが発生し、次のコードで処理されます。
void screenEvent(ShieldEvent * shieldEvent){if(screen.isPressed(thanksId)){DisplayText( "Thank You"、5、100); } if(screen.isPressed(welcomeId)){DisplayText( "どういたしまして"、2、100); } if(screen.isPressed(backoffId)){DisplayText( "プリーズバックオフ"、4、100); } if(screen.isPressed(stoppingId)){DisplayText( "... stopping ..."、0、100); } if(screen.isPressed(startingId)){DisplayText( "... starting ..."、1、100); } if(screen.isPressed(turnLeftId)){DisplayText( "Turning LEFT"、3、100); } if(screen.isPressed(turnRightId)){DisplayText( "Turning RIGHT"、3、100); } if(screen.isPressed(calling911Id)){DisplayText( "Calling 911"、0、100); }}
イベントが発生し、コードはどのボタンが押されたかをチェックし、表示するものを使用してDisplayTextメソッドを呼び出します。
そして最後に、テキストはどのようにしてマトリックスに出力されますか? DisplayTextメソッドがそれを処理します。
void DisplayText(String message、int colorIndex、int currDelay){int x =matrix.width(); int maxX =-1 *(message.length()* 5 + message.length()); matrix.setTextColor(colors [colorIndex]); while(x> maxX){matrix.fillScreen(0); matrix.setCursor(x、0); matrix.print(メッセージ); - バツ; matrix.show(); delay(currDelay); }}
このメソッドは、この文字列の実際の幅を計算します。文字列が完全にスクロールされて表示されたり見えなくなったりすることを確認できるように、知る必要があります。文字の幅は5+文字間のスペースは1です。
エンクロージャーを構築する
ビルドはかなり簡単でした。マトリックスのフットプリントよりも大きい、まともなサイズのボックスを見つけました。必要以上に大きい1/4インチのバルト海樺を手に入れ、サイズに合わせてカットしました。
<図> <図> <図>丸鋸と同じ技術を使用します。合板の上にマトリックスを置くことから始めます。配置したら、接続の水平方向と垂直方向の中心にマークを付けます(補助電源接続を含む)。今やらなければならないことは、線をつなげて、穴を開けようとしている穴の中心を見つけることだけです。
はい、私は「ドリル」ではなく「ボア」と言いました。前回プラスチックに穴を開けたとき、本当に満足のいく結果が得られませんでした。今回はフォレストナービットを使用しました 。下に写真があります。端が切断用で、中央に不要な木材をすくい取るためのスクレーパーがあることに注意してください。はるかに良い「穴」を作ります。さて、「退屈」に行きましょう。おそらく先に進んでサスペンションホールを退屈させたいでしょう。
120グリットのサンドペーパーを1枚入手し、全体を軽く研磨します。ボードの「イーズ」エッジに、作成したばかりのすべての穴が含まれていることを確認してください。ボード上に他の「もの」のおがくずがないように、ボードを必ず拭き取ってください。
今度はプラスチックの箱の作業です。
ボックスの両端に2つの穴を開けます。これらは、電源コネクタとマトリックスへの接続用です。まだマトリックス補助電源穴を開けないでください。
次に、ボックスの背面に両面テープを2枚貼り、ボックスを合板に取り付けます。これは「再配置可能な」テープなので、私はこれを永久に貼り付けたかったのです。重い本を上に置いて24時間放置しました。なぜ24時間?テープの指示はそうしないように言っています。それは私にとって十分な理由でした。
その最後の穴の時間。これで、補助電源接続穴の正確な位置がわかります。それを退屈させて、あなたの「正確な」見た目の仕事を楽しんでください。
<図> <図> <図> <図> <図> <図>スマートを箱に入れてください
ブレッドボードはボックスにちょうどいいサイズだったようですが、MKR1000からUSBコネクタを抜き差しできるようにしたかったのです。そのため、ブレッドボードを短くする必要がありました。
<図> <図> <図> <図>そのトラウマの後、ブレッドボードの裏側をはがして、貼り付けます。補助電源接続穴は避けてください。
<図> <図> <図>合板の前面にマトリックスを取り付け、接続部を穴に通します。ホットグルーでマトリックスを固定します。
力を語ろう
明るさを40%に設定していても、256ピクセルすべてを照らした場合の最大電流は約7.5アンペアです。 MKR1000が提供できる以上の方法。幸いなことに、ディスプレイは静的ではなく、完全なマトリックスの近くでは照明を当てていません。補助電源接続が役に立ちます。私は4Aまで供給しています。持続的でも静的でもないので、電源は良いはずだと思います。
また、予備のACアダプタを使用して、車両の電源を入れたときにMKR1000に電力を供給するためにエンドオフを使用しました。
<図> <図>私は、12Vの車の電力を取り、5Vをプロジェクトに供給するために、プロジェクトに電力変換器を組み込むことを考えていました。よく考えた結果、5V 4A ACアダプターを5ドルで入手し、私がすでに持っているACコンバーターを使用する方があらゆる点で優れていました。このようなものに関しては、通常、シンプルな方が優れています。
看板を吊るす
これをバックガラスに固定するために、「ボールストレッチコード」といくつかの吸盤を使用することを計画していました。この地域でやるべきことがもっとあるとだけ言っておきましょう。
<図> <図> コード
SayThanksコード
https://github.com/pulcher/mkr1000_challenge 回路図
実際のMKR1000はまだリリースされていないため、MKR1000は単なるマイクロです。 製造プロセス