ATmega128RFA1用のOTAローダーを作成します(Smart Response XEデバイスの一部として)





それはすべて、興味深いデバイスであるSmart Response XE( 簡単な説明 )の流通市場での著者による買収から始まりました。 学校を対象としています。クラスの各生徒は、電子ノートまたは90年代の翻訳者に似たデバイスを受け取り、教師が質問をし、生徒はデバイスのキーボードで、教師のPCに接続された受信機に無線チャンネル(802.15.4)で受け取った回答を入力します



これらのデバイスのサポートは数年前に廃止され、学校がそれぞれ100〜200ドルで購入したという事実は、現在10以下でeBayに現れています。 「鉄」は、ギークの実験に非常に適しています。





マイクロコントローラーの名前は、それがAVRファミリーに属していることを明確にします。つまり、デバイスをArduino互換にすることは簡単な作業ではありません...



Hackadayのニュースから、著者はすでにこれを行っており (同じリンクが接続先を示している)、Arduboyのゲームを実行する機会があることを発見しました。





しかし、著者は、デバイスで遊ぶのではなく、勉強する機会にもっと興味があります。





著者は、 ライブラリ (GPL v3)を作成することから始めました。これにより、ディスプレイの初期化、テキストおよび長方形の表示、SPIインターフェイスを使用したフラッシュメモリへのアクセスが可能になります。 それから彼は、デバイスの実用化のためのアイデアを思いつき始めました:ポケットサイズのVT-100互換端末、マルチプレイヤーゲーム。 3つのデバイスを作り直し、彼は「空中」でスケッチを取得する方法を「教える」ことにしました。 これは興味深いだけでなく、非常に便利です。毎回デバイスケースを開けるのは難しく、バッテリーカバーの下には、JTAGプログラマーをボードに接続できる穴しかありません。







これはArduinoブートローダーを埋めるのに十分ですが、スケッチではありません-シリアルポートはそこに出力されないため、ケースを開かずに行うことはできません。 また、最初のシリアルポートのTX0およびRX0ラインは、キーボードマトリックスのポーリングライン、つまり、それに沿ってディスプレイの側面でファンクションキーがポーリングされるラインと結合されます。 しかし、何をすべきか-著者はこれを構築しました:







そこで彼はJTAGラインを引き出し、今ではバッテリーコンパートメントを開く必要はありません。 また、スケッチを埋めるために、両方のシリアルポートを同じコネクタに接続し、スイッチも追加しました。これは、バッテリーを取り付けると、デバイスを別の方法で物理的にオフにできないためです。



はんだごて、事務用ナイフ、グルーガンで作業するのにかなり時間がかかりました。 一般的に、「空中に」注ぐスケッチははるかに便利です。このために何かを発明することが急務です。



Arduino IDEはavrdudeを使用してスケッチを埋めます。 STK500プロトコルを介してマイクロコントローラと対話し、双方向のファイル転送を可能にします。 可変遅延、歪み、データ損失が発生する可能性のあるチャネルとの互換性は不十分です。 シリアルチャンネルで何かが消えたり音がする場合、原因を探して夢中になります。 作者が問題がケ​​ーブルと、気まぐれなインターフェイスコンバーターCP2102にあることに気付くまで、半日苦しみました。 ATmega32u4などのインターフェイスコンバーターが組み込まれたマイクロコントローラーでさえ、時にはいたずらになることがあります。 各Arduinoユーザーは、スケッチをアップロードする際のエラーはそれほど珍しいものではないことに気づいています。 記録が正常に行われ、検証読み取り中にエラーが検出される場合があります。 これは、書き込み中にエラーが発生したことを意味するものではありません。読み取り中にエラーが発生しました。 ここで、「無線」で作業しているときに同じことが起こることを想像してください。



この問題を克服するためにさまざまな方法を試して、著者は次のことを思いつきました。 このデバイスには、SPIインターフェースを備えた128キロバイトのフラッシュメモリがあります-ワイヤを介してデータを受信します(作成者は既にコネクタを備えたデバイスを1つ持っていることに注意してください)。このメモリをバッファとして使用し、無線チャネルを介して別のデバイスにデータを送信します。 サイビコからのこんにちは。



ラジオチャンネルを操作するためのコードとフォントを記述した後、ブートローダーは4キロバイトより長くなりました。 したがって、HFUSE値を0xDAから0xD8に変更する必要がありました。 ブートローダーの最大長は8キロバイトになり、開始アドレスは0x1E000になりました。 これはMakefileに反映されますが、 ブートローダーをavrdudeで埋める際に考慮する必要があります



ATmega128RFA1の802.15.4標準トランシーバーは、もともとかなり複雑なZigBeeプロトコルで動作するように設計されていたため、著者は代わりに単純にパケットを送信することに決めました。 これはATmega128RFA1のハードウェアに実装されているため、少しのコードが必要です。 また、簡単にするために、著者は固定チャネルを使用することに決め、手動でも選択できないようにしました。 802.15.4規格は、11〜26の番号を持つ16のチャネルをサポートします。これらはかなり詰まっており、一部はWiFiチャネルと重なります(赤はZigBeeチャネル、青、緑、黄色-WiFi)







チャネル15と26はWiFiからの干渉の影響を最も受けにくいことがわかりました。 免責事項:翻訳者は、ZigBeeがそれほど単純化されているかどうかを知りません。 たぶんもう少しプログラミングとその完全な実装の価値があるのでしょうか?



最初のデバイスでは、STK500プロトコルを使用してデータを送信するステートマシンを実装する必要があります。 ほとんどの場合、送受信されるメッセージは自給自足ですが、一部は以前にチャネルを通過したメッセージに結び付けられています。 ここで対話の説明をします



このダイアログの重要なコンポーネントは、宛先デバイスのフラッシュメモリへの書き込みを目的としたパケットの転送です。 AVRファミリのシンプルなマイクロコントローラーのページサイズは128バイトですが、ATmega128RFA1のサイズは256です。しかし、SPIプロトコルを介して接続するフラッシュメモリは同じサイズです。 最初のデバイスのプログラムは、スケッチを注ぐときに、すぐに2番目のデバイスに転送せず、このメモリに書き込みます。 Arduino IDEが記録の正確性をチェックするとき、彼らはそこに書かれたものを送ります。 次に、受信したデータを無線で2番目のデバイスに転送する必要があります。 同時に、受信から送信、またはその逆の切り替えが頻繁に発生します。 STK500プロトコルは遅延には関係ありませんが、データの損失は許容しません(奇妙なことですが、データ伝送の遅延も影響すると言われています)。 そして、無線伝送の損失は避けられません。 ATmega128RFA1には、正しい送信に疑問を抱く繰り返し要求のハードウェア実装が組み込まれていますが、著者は同じことを自分でプログラムで実装することにしました。 彼は、ある方向に他の方向よりもはるかに多くのデータが流れるプロトコルを開発しました。



それは不完全ですが、すべてが機能します。 256バイトのページは4つのセグメントに分割され、各セグメントはパケットとして無線で送信されます。 パケットは、最大125バイトのデータに加えて、1バイト-長さと2バイト-CRCを保持します。 そのため、64バイト長のフラグメントとページ番号およびセグメント番号(0〜3)がそこに配置されます。 受信デバイスには、受信されたセグメントの数を追跡できる変数が用意されています。4つすべてが受信されると、ページ全体が受信されたことの確認が送信デバイスに送信されます。 確認なし(CRCが一致しませんでした)-ページ全体を再度送信します。 同時に速度は、ケーブル経由で送信する場合よりもさらに大きくなります。 参照:





しかし、実際には、ケーブルデバイスをデバイスに接続してスケッチやその上に記入する便利な方法を提供する必要があります。 たとえば、写真のようにCP2102のこのようなインターフェイスコンバーターの内側に置き、Micro USBケーブルを接続および切断するときの力に耐えられるようにボードに貼り付けます。







また、3.3ボルトのスタビライザー(および6ボルトの電源を備えたデバイスでの使用方法-同じスタビライザーのみがあり、2つのダイオードを追加してデバイスの給電元を自動的に選択できる場合)もあります。 インターフェイスコンバーターボードから3つのLEDをすべて削除する必要があります。そうしないと、作業中にバッテリーを追加でロードし、キーボードポーリングを妨害し、SPIインターフェースでフラッシュメモリを操作します。



目標の追求は、その達成よりもさらに興味深いことが判明しました(そして、バスについての冗談は必要ありません)。 著者は、AVR用ブートローダー、SPI付きフラッシュメモリ、STK500プロトコル、802.15.4標準について多くのことを学びました。



上記のライブラリに加えて、他のすべてのコードはこちらにあり、GPL v3の下にもあります。 著者のツイッターはこちらです。



All Articles