arduinoで安価にテレビに映像を出力するその2
以前arduinoで、arduino-tvoutという映像出力を試してみたのですが、
今回はNigel Battenさんがホームページ「Batsocks」にて公開している、
TellyMateを試してみました。
(注意: TellyMakeの商標は作成者Nigel Battenさんにあります。回路図やソースは
公開されており、自由に利用できますが、TellyMakeを名乗るのは控えましょう)
(紹介ページ: http://www.batsocks.co.uk/products/Other/TellyMate.htm )
TellyMateを簡単に説明すると、Atmega8/88/168/328p を使った
ビデオ出力モジュール(ターミナル出力モジュール)です。
arduinoとシリアル通信でデータをやり取りして、キャラクタ表示をテレビに出力
できます。
TellyMate TTL Kit購入ページ http://www.batsocks.co.uk/products/Other/TellyMate%20TTL%20Kit.htm
Atmega8/88/168/328p系列のAVRマイコンに少々の部品で作成できます。
回路図およびソース、サンプルプログラムが公開されています。
更にキットの販売も行っています(上記の写真のリンクで購入できます)。
んで、早速ブレッドボード上に作成してみました。
水晶発振子、三端子レギュレータ等、部品揃えるのよりは
arduino pro mini(中華製) 1個使った方が速そうなので、arduinoのブートローダ部は
潰してUSBbaspでプログラムを書込みました。
追加パーツは、
秋月電子RCAジャックDIP化キット 100円
ダイオード 1N4148 2個 4円
で合計300円くらいで実装出来ます(ブレッドボード、ワイヤー類は除く)。
書込みのためのバッチファイル、イメージファイルが用意されていて
回路ができれば、コマンドを一回実行すれば焼き上がります。
実際に組みあがった雰囲気はこんな感じです。
ビデオコンポーネント出力を小型液晶モニタに接続して映しています。
arduinoとモジュールをシリアル接続して、arduinoから制御して画面を表示します。
ダム端末ってやつですよね、これって。
フォントが自由に定義出来るっぽいので、試しに美咲フォントを流用して
半角カタカタを流し込んでみました。ちゃんと表示できましたね。
(フォントデータの書込みはarduino側からできます)。
表示には倍角表示機能があり、大きく表示することもできます。
シリアル接続なので、arduinoではなく、パソコンに繋げてTera Termで通信すれば
打った文字がそのまま表示するこもできます。
通常のコンソール画面的な制御(制御文字、エスケープ文字)で文字の表示制御
ができます。
表示はNTSCとPALに対応しています。接続してるモニタはNTSCよりもPALの方が
綺麗に映りました。テレビにつなげるとPALでは映らず、NTSCでのみ映りました。
スケッチはこんな感じです。ただ単に、シリアル接続して出力しているだけです。
/* Example Sketch for a TellyMate Shield */ /* Hello World */ #define CHAR_ESC '\x1B' #define CHAR_DLE '\x10' void setup() { Serial.begin( 57600 ) ; Serial.write( CHAR_ESC ) ; Serial.write( 'E' ) ; // clear screen for ( byte row = 0 ; row < 25 ; row++ ){ tm_cursor_move( row , 0 ) ; // move the cursor the required row (any column would do) Serial.write( CHAR_ESC ) ; Serial.write( '_' ) ; Serial.write( ':') ; // use the specified fontbank } tm_cursor_move( 0 , 0 ); Serial.println( "Hello World!" ) ; Serial.println("\n"); Serial.write( CHAR_ESC ) ; Serial.write( '_' ) ; Serial.write( '4') ; // use the specified fontbank Serial.println("\xc8\xba\x20\xc6\x20\xba\xa5\xdd\xa5\xca\xde\xa5\xdd\xa5\xdc"); Serial.write( CHAR_ESC ) ; Serial.write( '_' ) ; Serial.write( '5') ; // use the specified fontbank Serial.println("\xc8\xba\x20\xc6\x20\xba\xa5\xdd\xa5\xca\xde\xa5\xdd\xa5\xdc"); Serial.write( CHAR_ESC ) ; Serial.write( '_' ) ; Serial.write( '0') ; // use the specified fontbank for (uint8_t i=32; i < 255;i++) { Serial.write( i ) ; } Serial.println("\n"); Serial.println( "\xca\xdd\xb6\xb8\xb6\xc0\xb6\xc5") ; Serial.println("\n"); //Serial.write( CHAR_ESC ) ; //Serial.write( 'Q' ) ; } void tm_cursor_move( uint8_t row , uint8_t col ) { // <ESC>Yrc Serial.write( CHAR_ESC ) ; Serial.write( 'Y' ) ; Serial.write( 32 + row ) ; Serial.write( 32 + col ) ; } void loop() { // do nothing! }
意外といい感じに使えます。キャラクタ表示のみですが、
キャラクタを使って擬似的な76x75のグラフィック表示が可能です。
最近のコメント