eekを書かずにオタクスタイルでおめでとう





同志のdlinyjの記事「Linux用の独自のドライバーの作成」を読んで、記事の最後で表明されたアイデアに興奮しました。 すなわち



今では、1か月に500ルーブルを支払うことを妨げるものはなく(離陸した場合、金額はかなり少なくなります)、仮想マシンでサーバーをレンタルします。 そこに、メッセージを送信するプログラムを配置します。 jabberまたは他の方法(はい、少なくともncとtelnetはすべてを行います)。 そして、コンピューターにこれらのメッセージの受信者を置きます。 そして新年には、おめでとうございます。




そして、彼はオタクのお祝いを受け取り、送るために、一般党に参加することを決めました。 ラップトップでLPTポートを検索しませんでしたが、LPTポートが存在しないことがわかります。 しかし、数年前にCOMポートに接続されたディスプレイを作成したことを思い出しました。 より正確には、正確にはCOMポートではなく、これはUSB-to-UARTアダプターです。dlinyjがこの投稿で「UARTとその使用対象」について説明しました。 その結果、それを行うことにしました。











プロトコルは、ESCシーケンスとは関係なく、自己記述で適用されました。 しかし、私はまだコピーの1つを持っています。



ボード外観



このボードには非常に多くの過剰があります。 実際、スキームは次のとおりです。



アウトライン フルサイズ



複雑なことは何もありません。 そして、各アマチュア無線はおそらく要素のセットを持っています。 AVRコントローラーを使用したすべての人が、このようなスカーフを少なくとも1つ持っていることを確信しています。 FT232RLは、MAX232(適切なボディキットを使用)に置き換えるか、既製のUSB-UARTアダプターを使用できます。 バックライトトランジスタもオプションです(これはバックライト制御回路です)。 地面に接続するだけで簡単に交換できます。



DIHALT PinBoard v1デバッグボードの幸せな所有者は、検索してはんだ付けする必要さえありません。 必要なものはすべてすでにあります。





PinBoard v1



Arduinoの所有者についてもほぼ同じことが言えます。 ディスプレイ、コントラストを調整する抵抗器、接続するワイヤーのペアを見つけるだけです





Arduino



ハードウェアで(そして冗長であっても)すべてが順調であることに気付き、既存のマイクロコントローラーのファームウェアを作成しました。 私の場合、これはAtmega 16ですが、全体的にはそれほど問題ではありません。



柔らかい!





私はすでにLCDを操作するためのライブラリを持っていました。初期化のコードは古いプロジェクトから引き出されており、かなり平凡です。 dlinyj 同志プロジェクトのライブラリを使用する試みがありましたが、明らかに関数呼び出し-再呼び出しの数によってコントローラーが破損し、すべてが不安定に動作しました。 その結果、私は自分のライブラリですべてを行うことにしました。

コード全体を提供するのではなく、ソースでプロジェクト全体を見ることができます。 キーポイントについて説明します。



最初に、ディスプレイを接続するためのピンを記述する必要があります。それらはファイルhd44780_hw.hに記述されています

#include "hd44780_hw.h" //describe LCD PINS connection
      
      







UARTの速度は9600を選択しました。これは歴史的に発生したものであり、理由を問わないでください。



 #define baudrate 9600L
      
      







ハードウェアの初期化はすべて、HwInit関数内にあります。 何も初期化しない:



 //HW initialisation void HwInit(void) { //InitUSART UBRRL = LO(bauddivider); UBRRH = HI(bauddivider); UCSRA = 0; UCSRB = 1<<RXEN|1<<TXEN|1<<RXCIE|0<<TXCIE; UCSRC = 1<<URSEL|1<<UCSZ0|1<<UCSZ1; sei();//  //InitLCD lcd_init(LCD_DISP_ON); lcd_clrscr(); }
      
      







主なタスクはESCシーケンスを処理することです。これは私がLongから暗黙のうちに取ったもので、それに応じて彼はプロジェクトlptlcdでMichael McLellanから取ったものです 。 ハンドラー自体はesc.cでレンダリングされ、リクエストを解析する同じhandleInput関数を呼び出します。 この関数は、UARTa受信割り込みハンドラーで呼び出されます。



 //UART interapt ISR(USART_RXC_vect) { handleInput(UDR); return; }
      
      







UARTに到着する各バイトは割り込みを引き起こします。 そして、割り込みハンドラーで、handleInput関数を取得してフィードします。



この関数は、lptポート上のドライバープロジェクトの同様の関数と大差ありません。 ライブラリの機能の画面位置の設定、画面のクリーニング、画面上の文字の表示の機能が置き換えられたことを除きます。 さらに、イースターエッグ出力機能も削除されました。 4行の画面とLongのライブラリでのみ機能し、異なるライブラリがあり、画面は16x2のみです。 さて、不快から、フォントをロードする機能が実装されるまで。 まだスタブがあります。



テスト中





コンパイルします。 アセンブリには、AVR Studioバージョン4 + avr-toolchain(3.3.0.710)を使用します。 点滅。 ファームウェアの実行中に、使用されているESCシーケンスをもう一度見てください。 元の記事のテキストを引用します。



したがって、画面の制御シーケンス:



  • \ 033 =コマンドを開始するESCシーケンスの送信
  • [A =カーソルを1行上に移動
  • [B =カーソルを1行下に移動する
  • [C =カーソルを1つ右に移動
  • [D =カーソルを1つ左に移動
  • [H =カーソルを左上隅に移動-ホーム(位置0,0)
  • [J =すべてクリア、カーソルをホームに戻さないでください!
  • [K =行末まで消去します。カーソルをホームに戻しません!
  • [M =新しいキャラクターマップ(DZ-理由を説明してください!)
  • [Y =位置Y(以下のFAQを参照)
  • [X =位置X(以下のFAQを参照)
  • [R = CGRAMメモリ選択
  • [V =スクロール可能
  • [W =スクロールは無効
  • [b =バックライトはオン/オフです(動作しません)。




他の便利なコマンドは、\ 033プレフィックスなしで機能します!



  • \ r =復帰(現在の行の位置0にカーソルを戻します!)
  • \ n =改行
  • \ t =タブ(デフォルトは3文字)






また、元の記事habrahabr.ru/post/206148に再度戻って、よくある質問とそのアプリケーションの例をご覧ください。

フラッシュしたばかりのコントローラーをUSBポートに固定すると、dmesgコマンドで、新しいデバイスがシステムに表示されたことがわかります。



 /dev/ttyUSB0
      
      







そして、次のコマンドを与えます:



  echo -en "\033[H\033[J Happy GEEEKS\r\n Happy New Year" > /dev/ttyUSB0
      
      







その結果、オタクから完全に新年のご挨拶を受け取ります。





GIKOVSKYおめでとうございます!!!



まあ、すでに伝統的になっている時間派生スクリプトも動作します:



 while true; do echo -en "\033[H`date +\"%d.%m.%Y\"` \r\n`date +%r`" > /dev/ttyUSB0 ; sleep 1s; done
      
      









ブームウォッチ



しかし、PinBoard V1はどうですか?





ピンボードのコードを転送するのにそれほど労力はかかりません。 ダイアグラムと同じ方法でディスプレイを接続する必要があります。 ディスプレイが既に接続されていて、やり直したくない場合は、hd44780_hw.hファイルで画面が接続されているピン定義を変更できます。 次のようになります。



 #define LCD_DATA_PIN_D7 PA6 /* arbitrary pin for LCD data line D7 */ #define LCD_DATA_PIN_D6 PA5 /* arbitrary pin for LCD data line D6 */ #define LCD_DATA_PIN_D5 PA4 /* arbitrary pin for LCD data line D5 */ #define LCD_DATA_PIN_D4 PA3 /* arbitrary pin for LCD data line D4 */ #define LCD_DATA_PINR_D7 PINA /* input pin register for LCD data line D7 */ #define LCD_DATA_PINR_D6 PINA /* input pin register for LCD data line D6 */ #define LCD_DATA_PINR_D5 PINA /* input pin register for LCD data line D5 */ #define LCD_DATA_PINR_D4 PINA /* input pin register for LCD data line D4 */ #define LCD_DATA_DDR_D7 DDRA /* ddr for LCD data line D7 */ #define LCD_DATA_DDR_D6 DDRA /* ddr for LCD data line D6 */ #define LCD_DATA_DDR_D5 DDRA /* ddr for LCD data line D5 */ #define LCD_DATA_DDR_D4 DDRA /* ddr for LCD data line D4 */ #define LCD_DATA_PORT_D7 PORTA /* port for LCD data line D7 */ #define LCD_DATA_PORT_D6 PORTA /* port for LCD data line D6 */ #define LCD_DATA_PORT_D5 PORTA /* port for LCD data line D5 */ #define LCD_DATA_PORT_D4 PORTA /* port for LCD data line D4 */ #define LCD_RS_DDR DDRA /* ddr for RS line */ #define LCD_RS_PORT PORTA /* port for RS line */ #define LCD_RS_PIN PA0 #define LCD_RW_DDR DDRA /* ddr for RW line */ #define LCD_RW_PORT PORTA /* port for RW line */ #define LCD_RW_PIN PA1 #define LCD_E_DDR DDRA /* ddr for Enable line */ #define LCD_E_PORT PORTA /* port for Enable line */
      
      







結果をピンボードに保存、コンパイル、フラッシュし、次のコマンドを実行します。



 echo -en "\033[H033[JSpasibo DiHalt" > /dev/ttyUSB0
      
      









ボードの作者に感謝します!



なぜこれがすべて必要なのですか?





Habrから離れてカレンダーを見ると、突然、新年の10日前が残っていることがわかります。 しかし、私は私の家族だけでなく、はんだ付けした仮想の休日も欲しいです! これがすべて考えられている理由です。

同志dlinyjは、お互いをオタクっぽく祝福したいグループを作りました。 現在、人々はサーバーとクライアントの部分について考えています。 残念ながら、彼女はまだ準備ができていません。 しかし、あなたが私たちに接続するならば、私たちは確かにすべてを思い起こさせることを願っています! ディスプレイがあり、パーティーに参加したい場合は、そこに行きます。 それは商取引や個人的な利益をもたらさず、画面上に新年の挨拶をするだけです。



まだスクリーンを持っていない人は、オタクな方法でおめでとうを受け取りたいです。動揺するには早すぎます。 ESCシーケンスは通常のコンソールで機能します。 したがって、画面にメッセージを表示することにより、すべてが機能します



たとえば、コマンドを実行する場合:

 while true; do echo -en "\033[H`date +\"%d.%m.%Y\"` \r\n`date +%r`" ; sleep 1s; done
      
      







出力リダイレクトを削除するときは、画面をクリアすることを忘れないでください。 そうでなければ、興味深い効果が得られます。





コンソールですぐに見る



これを回避するには、whileの前にclear;コマンドを追加します。 これですべてが次のようになります。



  clear; while true; do echo -en "\033[H`date +\"%d.%m.%Y\"` \r\n`date +%r`" ; sleep 1s; done
      
      









ディスプレイではなくコンソール



まとめ





休日の雰囲気を作りたいのですが、休日には友達が必要です。 オタクは自分以外の友達を探していますか? したがって、それは可能であり、私たちはお互いにハッピーニューイヤーを願うようなエキゾチックな方法を選択します!

ダウンロードリンク:





ボードとピンボードのソースはここからダウンロードできます。



All Articles