Arduinoに入力メソッドを追加する

画像 さまざまなマイクロコントローラー用のさまざまなマスターキットが多数あります。 しかし、Arduinoは、エントリーしきい値がほぼゼロのマスターキットモデルを思い付きました。 3行のコードを入力するだけで十分で、既にLEDを点滅させるか、エンジンを制御します。 しかし、プロトタイプボードがあらゆる種類のセンサー、ディスプレイ、ボタンとともに成長するにつれて、より高度な入力方法(キーボード)が不足していることを理解し始めます。 高価ではなく、モバイルオプションはカットの下で説明されています。


パート1-理論的


キーボードをArduinoに接続するには、多くの方法があります。

ボタンの数が少ないか、サイズが大きいためにこれらすべての方法を拒否しましたが、私はもう10年前からアントレストールにいて、携帯電話用のミニチュアキーボードを持っていたことを思い出しました-エリクソンチャットボード:
画像
具体的には、このモデルCHA-01は5ボルト用に設計されており、電話...モデムのようです!
CHA-10モデルもあります。これは、新しい(5〜7歳の電話について言えば)電話で使用され、3.3ボルトで動作します。 両方のモデルは、EBayで購入するのが難しくありません。

変更されていないバージョンのキーボードに制限することができます。 接続する古い電話機のコネクタを探します。 キーボード入力を解析し、生活を楽しむライブラリを開発する。
ただし、長い間喜ぶことはできません-大きなプロトコルオーバーヘッド(0キーを押すと、「AT * EKSE = 0」、www-「AT * EAPP = 0.5、「WWW:」、「WWW」など)と入力の有効化SMSボタンを押した後でのみ、使いやすさが失われます。

解決策は、このキーボードに基づいて、必要に応じて動作し、必要に応じて動作を変更できる機能を使用することです。

パート2-実用的


インターネットで検索した結果、次のページが見つかりました。このページをリワークの基礎として使用しました。 そこからの最も貴重な情報は、キーボードのマイクロコントローラーとAtmel Mega162が結論で一致し、後者は組み込みのものに置き換えることができるということでした。
画像
内部では、キーボードは標準の7x7マトリックスマトリックスであり、マイクロコントローラーの14ピンを占有します。 外部情報はUARTを介して発行されます。

上記の情報に基づいて、変換計画を作成しています。
-マイクロコントローラーをmega162(市場で3ドル)に交換
-コネクタを「共通」に交換します
-必要なときにいつでもソフトウェアを変更する機能を追加します(利点はブートローダーを介して実装されます)
-AVR / Arduinoで動作するように通常のIDEを構成します(ここでは不要なC ++ /ライブラリを削除します)
-健全性をチェックする簡単なソフトウェアを書く

はんだ付けステーションで武装し、不要なコンポーネントを取り外します。
画像

CHA-01の元のコネクタのピン配列は、次の場所にあります
画像

1、5-Vcc +5ボルト
2-チャットボードのシリアル出力
3-GND
4-チャットボードのシリアル入力

部品をはんだ付けします。
画像

上記の記事の著者とは異なり、標準のPBS-08ラインをコネクタとして選択しました。ファイルなしでケースに完全に収まり、ボード上の適切な場所に置くことさえできます。 そして、彼は外部共振器に切り替えないことに決めました。
RX、TX、GND、Vcc、MOSI、MISO、SCK、およびRSTがコネクタに出力されました。 したがって、ケースからデバイスを取り外すことなく、デバイスをさらに再プログラムできます。
すべての準備が整い、プログラマーに接続できるようです(USBASPを使用しましたが、arduinoを使用して他のAVRをプログラミングできます-ArduinoISP
画像
しかし、avrdudeはマイクロコントローラーを見ることを完全に拒否しています。 その前から、私はそのような変化の経験がありませんでした-私は診断のために、より経験豊富な仲間に頼らなければなりませんでした。 オシロスコープと発電機を備えた重砲が引き継いだ。 短い戦いの後、私は…RTFMに送られました。
USBASPは高速マイクロコントローラー(4 MHz以上)で動作し、mega162はデフォルトで「8による除算器」を含み、1 MHzの周波数で内部ジェネレーターから動作します。 キーボードの1 MHzの周波数は十分すぎる(そして消費は少ない)ので、私はそれを変更せず、状況から抜け出す方法を探すことにしました。 ソリューションはすぐに見つかりました-USBASPには、マイクロコントローラーとの「通信周波数」を下げるジャンパーがあります(または、avrdudeにプログラムでこれを行う-Bオプションがあり、-B 3が役立ちました)。

avrdudeが水晶を見たので、フラッシュをフラッシュして忘れる必要があるように思われます:)しかし、最初のRTFMの経験により、私は少し冷静になり、最初にエミュレータでソフトウェアを実行することにしました(正当な理由で判明したため)。 このために、経験豊富な仲間のプロテウスで、キーボード回路が組み立てられました。 そして、キーボードをポーリングし、UARTに必要な文字を表示するファームウェアが作成されました。 そのため、すべてがコンパイルされ、エミュレーターにロードされ、仮想端末のパラメーターは9600.8n1に設定されます。 しかし、何らかの理由で端末はキーが押されたときにゴミを表示します。 エミュレータのデバッグUSARTモードでは、交換レートが9600ではなく10200に設定されていることが示されました...繰り返しますが、RTFM-ボーレートは水晶周波数に依存し、1 MHzで標準設定では4800(0.2%のエラー)に到達できますが、9600ではすでにエラーが発生しています7%! データシートには、さまざまなボーレート/ MHzのエラーテーブルも含まれています。1MHzの周波数では、ダブルレートUSARTを設定するだけで0.2%のエラーを達成できることがわかります。 Cでは、次のようになります。
#define F_CPU 1000000UL #define BAUD_RATE 9600UL // Init serial UBRR0L = (uint8_t)(F_CPU/(BAUD_RATE*8L)-1); UBRR0H = ((F_CPU/(BAUD_RATE*8L)-1) >> 8); UCSR0A = _BV(U2X0); // Set double-speed, for low freq cpu UCSR0B = _BV(TXEN0)|_BV(RXEN0); // Enable TX, Enable RX UCSR0C = _BV(URSEL0)|_BV(UCSZ00)|_BV(UCSZ01); // 8n1 async 

万が一、私たちのコードはエミュレーターで問題なく動作します-すべてのクリックを表示し、Shiftキーを押すとうまくいきます。

ソフトウェアをキーボードに入力します。 ブートローダーは最初のリンク( stk500boot.zip )から取得しました 。 USARTでも機能するため、ソースの初期化と速度を9600に変更しました。
ブートローダーは、次のコマンドを使用してUSBASPから流し込まれます。
avrdude -c usbasp -p m162 -B 3 -U flash:w:stk500boot.hex:i -U hfuse:w:0x98:m

reset-vectorを変更するには、hfuseを変更する必要があります。これにより、マイクロコントローラーがブートローダーからのロードを開始します。
キーボードとのさらなる通信はUARTを介して行うことができ、USBASPは必要ありません。
私はFTDIに基づいたUSB-UART(シリアル)コンバーターを選択しました-Arduina自体は同じチップ上に構築されているため、システム内に既にドライバーがあります。

偶然にも、コンバーターのコネクターとキーボードは完全に適合しているため、直接接続しました。
画像

このSTK500ブートローダーは互換性があるという声明にもかかわらず(avrdudeはstk500v1タイプのプログラマーを介して作業したくありませんでした)、デバイスIDが正しくないことを誓いました。 ソースから、ブートローダーがデバイスIDを読み取って与えることができることが明らかだったので、検索することで、arduinoタイプを指定した場合に正常に機能することがわかりました。
UART経由でファームウェアをアップロードするためのコマンド:
avrdude -c arduino -p m162 -b 9600 -P /dev/tty.usbserial-00001004 -U flash:w:chatboard.hex:i


端末を確認すると、すべてのボタンが押されているわけではなく、[はい]ボタンを押してソフトウェア更新モードに切り替えているブートローダーの主な機能も機能しません。 UARTを介したキーボードのフラッシュは不可能になりました。 より詳細な調査では、7x7マトリックスの3列のボタンが機能しないことが示されました。 すべてがRTFMに再び置かれました...キーボードのポーリングに使用する3つの出力には、デフォルトで代替機能(JTAG)も有効になっています。 JTAGをオフにする(hfus​​eを0xD8に書き換える)と、完全に機能するキーボードが得られます。
画像

画像 Arduinoに接続する時間。 インターフェイスコネクタとして、誤って不適切なものを付けないように、非標準のminiUSBを選択しました。 ワイヤーの提供者は古いマウスでした(他の場所でエンコーダーを取り出すことができます)。 キーボードへの接続は、標準のピンコネクタです。
miniUSB-UARTアダプターは、UARTをSensorShieldにピンアウトするために作成されました(私のブレッドボードには、UARTの標準化された出力はまだありません)。
画像

まとめ



PS。 Eclipse + avr-gccでコンパイルされたファームウェアのサイズはわずか600バイトです。 binaricaは3k未満ですが、Arduino IDEは見ていません。
PPS ソースとファームウェアはここから入手できます: chatboard.tar.gz

Source: https://habr.com/ru/post/J116759/


All Articles