すべてのhabrazhitelにこんにちは!
確かに、子供の頃の多くはラジコンカーが好きでした。 そして、子供の頃だけでなく、30歳以上の年齢のカテゴリには、ミニチュアスケールでの運転の威勢のいい人がたくさんいると確信しています。 だから、子供の頃からそのような機械を夢見ていたが、女の子は通常、車ではなく人形で紹介され、私の夢は最近まで達成されなかった。 しかし、今では私は成長しており、単純なラジコンマシンはかなり退屈に思えました。 ある晴れた日、自分を楽しませると同時にマシンをアップグレードする方法が思い浮かびました。私はWiFi経由でスマートフォンからコントロールを整理することにしました。
特にターゲットのスマートフォンがNokia Lumia 620であったため、このアイデアに興奮しました。以前はC#でのプログラミングが好きでした。 ソフトウェア部分での作業はクラウドレスでエキサイティングなものになると約束されましたが、ハードウェア部分ではすべてが少し複雑で、ハードウェアをグーグルで調べ始めました。
私は電気技師ではないので、マシンのハードウェアの作業を整理するために、ブロンド向けのロボットの基礎に関するガイドを探すために、インターネットを長時間探し回らなければなりませんでした。 いつものように、最愛のHabrが助けてくれました。つまり、 この投稿は 、電子機器から遠く離れた人でも理解できる言語で書かれています。 そこにはすべてが非常によく描かれているので、ハードウェアについては説明しません。ここで説明する私のマシンとWiFiボットの違いについてのみ説明します。
•マシンは娯楽用であり、部屋の監視用ではないため、ウェブカメラは必要ありません(ただし、このトピックはさらに開発する必要があります...)。 同じことが自律充電システムにも当てはまります。 完全なバッテリー充電(2500 mAhの容量のSanyo Eneloop AAを使用しました)は、十分に再生するのに十分な時間です。
•全体を機械の本体に充填し、はんだ付けで特に苦しめられないようにするため(私は金髪です...)、USBインターフェースを備えたわずかに小さいArduino Nano v3.0マイクロコントローラーを使用しました。 USBインターフェイスの存在は、はんだ付けせずにMKをルーターに接続することに加えて、Arduinoのプログラミングプロセスを大幅に促進します。コンピューターに接続->スケッチをArduino IDEから直接アップロード->お楽しみください。 また、別のルーターTP-LINK WR703Nを使用しました。これはTL-MR3020よりわずかに小さいですが、それ以外はほとんど同じです。
•MKをルーターにハンダ付けせず、USB経由で接続するため、UARTは、ルーターのOR-WRTファームウェアにデフォルトで存在するser2netデーモンを使用して仮想的に転送されます。 必要なのは、ルーターのser2net.confファイルに次の行を追加することだけです(または、ポート2000に既に書き込まれている場合は置き換えます)。
原則として、正確に2000個のポートを使用する必要はありません。任意のポートを使用できます。
だから、一般化する。 私のバージョンのキッチンロボット工学のマシンのハードウェアは、このレシピに従って「準備」されています。
成分
ラジコンジープ、TP-LINK TL-MR3020またはWR703Nルーター、Arduino Nanoマイクロコントローラー、L293Dエンジンドライバー、2本の短いmicroUSBケーブル、4本のバッテリー。
料理:
1. OR-WRTファームウェアでルーターを再フラッシュし、初期設定を実行します。
2. ser2netを使用して、arduinoとの通信をセットアップします。
3.無線制御ボードを機械から引き裂くため。
4.電源をルーターに接続します。 または、これは最も簡単で最も明白な方法で行うことができます。ルーターはmicroUSBインターフェイスを介して給電されるため、1つのケーブルから適切なサイズの部品を切断し、端に小さなコネクターを取り付けます。 切断された端は、マシンのバッテリーコンパートメントからのワイヤにはんだ付けされます(ワイヤのピン配列:ピン1-V +(5V)、ピン5-V-(GND))、対応するソケットにコネクタを差し込みます。
5. 2番目のmicroUSBケーブルを使用してMKをルーターに接続し、必要な(詳細を参照)MK出力をエンジンドライバーのマイクロ回路の対応する入力にはんだ付けし、その出力を直接マシンのエンジンに接続します。
ブロック図
出来上がり、マシン自体の準備ができました! 繰り返しますが、これは手順の非常に概略的で簡単な説明であり、より詳細な手順はこのソースにあります。
そして今、仕事の中で最も面白いと創造的な(少なくとも私にとって)部分は、このすべての幸福を管理するプログラムを作成することです。 その本質は、コントロールボタンを押すと、適切な信号をルーターに送信し、ルーターに信号を送信し、エンジンドライバーを介してマシンのエンジンを制御することです。 つまり、ソフトウェア部分は、スマートフォン用のプログラムとMK用のプログラムの2つのコンポーネントで構成されています。
私は長い間、タイプライターに信号を送信する方が良い方法について考え、多くのオプションを試し、これで停止しました:特定のコントロールボタンをクリックすると、タイプライターは移動の開始(対応するエンジンの起動)に関する信号を送信され、解放されると、移動を停止します(エンジンを停止します) 。 制御信号を次のようにエンコードしました。
1-前方への移動を開始、2-左への移動を開始、3-後方への移動を開始、4-右への移動を開始。 そして、それに応じて、5-前進運動を終了し、6-左運動を終了し、7-後退運動を終了し、8-右方向を終了します。 「進む」および「戻る」ボタンは機械の行進エンジンで動作し、「左」および「右」はロータリーで動作します。
その後、安全にプログラミングを開始できます。これは、電源がオンになっている間、サイクルで着信データの存在を確認し、特定の数字が受け入れられたときに、対応するレッグのHIGHまたはLOWレベルを設定することです。 スケッチコードは基本的なものであり、スイッチ/ケースが役立ちます。
ただし、モバイルアプリケーションはさらに複雑になります。 まず、マシンに連絡する必要があります。周囲に利用可能なWiFiネットワークがいくつかある場合は、マシンに連絡します。 まず、新しいWebインターフェイスを使用して、アクセスポイントとして機能するようにルーターを構成します。
ご覧のとおり、アクセスポイントモードでルーターのIPアドレスをフラッシュした後(192.168.218.1)は変わりません。 ルータにデータを送信するのはこのアドレスです。 タイプライターSSIDとパスワードのネットワークを考えて、私たち以外のデバイスをタイプライターに接続しないようにします。 もちろん、私たちのネットワークをハッキングする可能性を排除することは不可能ですが、明らかな理由で、誰かがそのようなナンセンスに苦しむことはほとんどありません。
現在、私たちのネットワークはユニークであり、スマートフォンだけがそれに接続できます。 したがって、アプリケーションで最初に行うべきことは、タイプライターへの電話の接続を確認することです。 また、テストが成功した場合は開始でき(デフォルトでは無効になっている開始ボタンが有効になっています)、そうでない場合は、接続を確認するためにユーザーを送信する必要があります。
foreach (var network in new NetworkInterfaceList())// { if ((network.InterfaceType == NetworkInterfaceType.Wireless80211) && (network.InterfaceState == ConnectState.Connected) && (network.InterfaceName == "WiFi_Car"))// – І 80211 (WiFi), SSID SSID { CarName.Text = network.InterfaceName; // SSID StartButton.IsEnabled = true; // «» break; } else { CarName.Text = " . WiFi-."; StartButton.IsEnabled = false; } }
アプリケーションの開始ページのレイアウトは次のとおりです。
「START!」ボタンを押してタイプライターに正常に接続したら、アプリケーションのメインページに移動して、タイプライターを制御します。
そして、ここにあります-真実の瞬間:制御信号をタイプライターに送信します。 ソケットを使用してこのプロセスを整理します。 このページを開くと、ルーターとのソケット接続が確立されます。 これを行うには、いくつかのコンポーネントを作成する必要があります。
IPEndPoint routerPort = new IPEndPoint(IPAddress.Parse("192.168.218.1"), 2000); // , IP- , ser2net Socket S = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // SocketAsyncEventArgs socketEventArgs = new SocketAsyncEventArgs();// - byte[] buf = new byte[1]; // – ( 1 )
その後、接続します:
socketEventArgs.RemoteEndPoint = routerPort; // S.ConnectAsync(socketEventArgs); // socketEventArgs.SetBuffer(buf, 0, 1); //
コントロールボタンを押したり放したりする機能は、それぞれMouseEnterメソッドとMouseLeaveメソッドによって実装されます。 たとえば、反対方向にボタンを同時に押すなどの緊急事態を排除するために、対応する方向のマシンの動きを示すフラグを各ボタンに導入します。 すべての矢印ボタンを押して離す機能は同じ構造を持っています。
プレス:
private void [ ]_MouseEnter (object sender, System.Windows.Input.MouseEventArgs e) { if (![ ] && ![ ]) { buf[0] = [- ]; Socket.SendToAsync(socketEventArgs); [ ] = true; } }
リリース:
private void [ ]_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e) { if ([ ]) { buf[0] = [ ]; Socket.SendToAsync(socketEventArgs); [ ] = false; } }
ここでは、 SendToAsyncメソッドを使用してデータをリモートホストに送信し、同様のメソッドSendAsyncと混同しないように注意する必要があります。 違いは、 SendAsyncがソケットから別のソケットにデータを送信することと、 SendToAsyncが必要なリモートホストにのみ送信することです。したがって、メソッドを混同すると、データは送信されません。
また、ラップトップからのマシンの試運転中に、マーチングとターニングの両方のエンジンを同時に操作すると、時々ルーターとの接続が失われるなどの緊急事態があることに気付きました。 これは、マシンの内部の電圧が低下しているためと思われます。これは、バッテリーの充電不足でもこのようなバグが発生したためです。 結局のところ、非常に多くの消費者が不幸な4個のバッテリーを食べています。 したがって、モーターを直列に起動できるように、スプリングをステアリングホイールから取り外して元の位置に戻しました。モバイルアプリケーションでは、両方のエンジンを同時に作動させる可能性は意図的に提供されていませんでした。 これまでのところ、そしてマシンの電源システムを改善する方法があれば、その機能を拡張することを考えることが可能になります。
ソケット接続の閉鎖を実装し、ロールするときに開始ページに戻るということは、今でも小さなことです。 イグニッションキーの形のボタンでこれらの機能を実行します。
private void key_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e) { S.Close(); // NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); }
ここで、一般的には、これですべてです。安全にプレイできます! 完全に没頭するには、音楽のオン/オフボタンを追加し、適切な曲を再生することもできます。 たとえば、私は抵抗できず、私の車はリル・ジョンとイーストサイド・ボーイズの下で運転します-Get Low 。
私のインスピレーションを受けた作品の結果についての短いビデオをあなたの注意にもたらします:
PS:建設的な批判と最適化の提案があればうれしいです。 しかし、厳密には判断しないでください、これはこの規模の私の最初のプロジェクトです。
PPS:ハードウェアを手伝ってくれてありがとう。 私は電子機器とルーターをフラッシュするプロセスに漠然と精通していたので、この助けなしではできなかったでしょう。