SSブログ

(ARDUINO)ARDUINOに接続したプリンターでロシア語を印字する [arduino]

 せっかく、キリル文字が印刷できるプリンターを手に入れたので、ロシア語の勉強に役立てられないかと思って、「ロシア語メモ書き印刷プリンター」なんてものを作ってみました。

 外見はこんな感じで、東急ハンズで525円で買ってきたハガキ整理用のボックスにプリンターを組み込みました。
P2012_0209_225810.JPG

 中を開けると、XBEEシールドをつけたArduinoが一個だけ入っています。
 5VのACアダプターから電源をもらい(要するにACアダプターからの+電源をArduinoの5V端子へ、-をGNDに配線し)、XBEEシールドでは、ソフトシリアルで9600BPSで受信したXBEEからのデータを、今度は1番ピンからプリンターのRXへ19200BPSで送っているだけです。(ACアダプター端子の処理がめんどくさかったので、とても適当な処理をしています。とりあえず固定用リングが入らなかったので、テープで接触してショートしないようにしていたりします(^^;;;)

 P2012_0209_225556.JPG
 写真が見えにくくてすいません。
 Arduino
 デジタル0番--->プリンター TX
 デジタル1番--->プリンター RX
 GND   --->プリンター GND
 と接続しています。
 XBEEシールドは、デジタル2番と3番を利用するようにスイッチを設定しています。
 Arduinoの電源は、ACアダプターから分けてもらった、5V端子とGNDに差し込んでいます。
 電源については、1.5A以下のACアダプターではプリンターが動作しませんので注意が必要です。

 XBEEはシリーズ2PROのPCBアンテナタイプです。
 ひとつをコーディネーター、もう片方をルーターとして(両方ともATコマンド版)として使っています。
 ※プログラマブル版ではないので、SPARKFUNのXBEEシールドでも正しく動作します。


 またArduinoは、XBEEから「シフトJIS」のキリル文字のデータを受信した場合、プリンター用のキリル文字のキャラクタコードに変換もしています。
 ロシア語が必要ない人にとっては、別になくても良い機能です(^^;;;

 XBEEを使っているので、電源コード意外の配線がないので、とてもすっきりとした外見です。とても控えめなプリンターです。
P2012_0209_225645.JPG
 とりあえず、ざっくりとDELPHIで作った自作ターミナルソフトを起動して、XBEEエクスプローラ経由でプリンターへデータを送ると……
P2012_0209_230130.JPG

 こんな感じで、印刷されます。
P2012_0209_225528.JPG

 こんなんで役に立つのか? と思ったんですけど……
 意外や意外、ちょっとした空き時間にぴろぴろーん、とレシートを広げて文章とかチェックできるので、面白いです。通勤時間にバスを待っている間に、ぴろぴろーんと広げたり、お昼のラーメン食べている時に片手で広げて読んだりも出来ます。
 普通のプリンターって意外と大型化されてしまって、A4とかで印刷すると見る時もめんどうだったりするかもしれませんが、レシートくらいの大きさだと意外となんでもないですね。

 イーサネットシールドと合わせたりすると、定期的にロシア語のサイトを印刷したりとか面白いことが出来るかもしれません。

 ただ……日本語を使おうとすると、さすがに日本で販売されているプリンターが必要になると思いますけど、6万円くらいするので高いんですよね。
 さすがにそこまでは……(^^;;;;;

 私の場合、送信側に自作のターミナルソフトを使いましたが、その理由は大きな文章を送ろうとするとArduinoとプリンターの間ではフロー制御をしていないので、あまり大量のデータを送ったりすると印字が間に合わず、データを取りこぼしてしまうので、文字が化けて印刷されてしまいます。
 なので、ターミナルソフト側で、テキスト一行を送信するごとに、0.5秒くらいのウェイトをかけて次の印刷処理に移るようにしています。
(こんな事を載せても……いったいどれだけの人の役に立つかは判りませんが……(^^;;;)


 でも、XBEEでの印刷はかなり良いです。
 何かのデータやログを離れたところに置いたプリンターで打ち出せるのは気持ちいいです。


参考までにスケッチも載せておきます。
---------------------------------------------------------------------
#include <NewSoftSerial.h>

NewSoftSerial s2(2,3);

int flg=0;
int ff=0;
int a;

void setup()
{
  Serial.begin(19200);
  s2.begin(9600);
  pinMode(13,OUTPUT);  
}


void loop()
{
  if (s2.available() >0)
    {
     a=s2.read();

     if (ff == 0 && a<=0x80)
       {
          Serial.print(char(a));
       }
     if (ff==2) ff=1;        
     if (a==0x84 && ff==0) ff=2;        
     if (ff ==1)
       {
         ff=0;
         a=conv_k(a);
         Serial.print(char(a));
       }         

     flg=1000;
    }

 if (flg >0)
  {
    digitalWrite(13,HIGH);
    flg--;
  }
  else
  {
    digitalWrite(13,LOW);
  }    
    
    
}



int conv_k(int a)
{
          int b='?';
         //АБВДЕ
         if (a >= 0x40 && a<= 0x45 ) {b=a+0x80;}
         ////Ёё
         if (a == 0x46 || a== 0x76) {b=0xB8;}
         if (a>=0x47 && a != 0x76 && a<0x70) {b=a+0x7F;}

         ////////фбв
         if (a >= 0x70 && a<= 0x75 ) {b=a+0x70;}
         if (a>=0x77 && a<=0x7F) {b=a+0x6F;}
         if (a>=0x80) {b=a+0x6E;}
return b;
}



nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。