モバイル印刷





今日では、紙に写真を印刷しても誰も驚かないでしょう。 多数のプリンター(ポケットプリンターを含む)があります。 私の友人の多くは3Dプリンターを購入または組み立てています。 また自転車を発明した方法をお伝えしたいと思います。 繰り返しになりますが、これは2D印刷に関する話です。 ストーリーは、サーマルプリンター(感熱紙に印刷するプリンター-インク、特別な紙と電気のみが必要)、Bluetoothモジュールなどに基づいて、携帯電話用のモバイルプリンターを作成した方法についてです。

私は、エレクトロニクスと電気工学では何も理解していないこと、基本的に既製のソリューションとライブラリを使用しなかったことをすぐに警告したいと思います。 したがって、これはハンドシェイクと自転車、私が遭遇した問題についての物語です。 ご自身の責任で読み続けてください。



スーパーテクノロジーデバイス



私たちはモバイル技術の時代に生きていることを思い出す必要はないと思います。 20年ほど前、ここはもう少しで、世界はロボット、空飛ぶ車、そしてもっと多くの驚くべきものでいっぱいになると思っていたことを覚えています。 私はもう少し、誰もが自分のロボットを持っていると思っていたので、ロボットがないことも象徴しています(掃除機の支持者に最後の文章を許してくれるようお願いします)すると、地球上のほぼすべての人が、トイレに座っている人々が鳥を豚に詰めるプロセスの物理的相互作用のシミュレーションを実行するための超技術的なデバイスを持っていると教えてくれると信じていました。 そして、もし彼らがこの装置が電話と呼ばれると私に言ったら、私はナレーターに直面してまったく笑っていただろう。



ちょっとした歴史



私の鼻の95年目でした(たぶん以前ですが、最後の段落で「20年前」について書きました、そして「20」は美しく丸い数字なので、彼と一緒にいます)ゲームボーイ(DMG-001)。 彼が当時の基準でどれだけクールだったか、この技術の奇跡を見て手に持つためにどのようなラインが構築されたかを伝える価値はないと思います。 2000年代初頭、このデバイスは再びそれを思い出しました。 追加の周辺機器、つまりカメラとプリンターが登場しました。 このようなカメラやプリンターはそれほど必要ありませんでしたが(品質はそれほどではありませんでしたが)、小さな画像を印刷するモバイルデバイスのアイデアは、将来への一歩と思われました。







トピックに戻る



だから、20年が経ちましたが、私は同じようなデバイスを作ることは可能だと思っていました。それは超技術的なデバイスである電話だけです。



このアイデアは非常にシンプルで、次のことに基づいています。

  1. サーマルプリンター(A2 Micro Panel Thermal Printer)。
  2. Bluetoothモジュール(JY-MCU BT_BOARD V1.06)。
  3. コントローラー(Stellaris Launchpad LM4F120XL。「なぜ?」という質問を避けるため、この特定のボードを手元に置いたばかりだとすぐに答えます)。
  4. 画面(LCD 84x48 Nokia 5110)およびステータス表示用のいくつかのLEDダイオード。
  5. バッテリーとレギュレーター(Turnigy UBEC 5A)。
  6. プリンターを管理するためのAndroidアプリケーション(「印刷」の方法をお読みください)。
  7. ハンドシェイクのカテゴリと電気工学の基礎知識が乏しい。


私の実装に動揺しているすべての人に謝罪すべき7番目の点のためです。 許してください。しかし、プリント回路基板の製造、オシロスコープを使用したデバイスのデバッグ、その他の適切なデバイス設計では、適切なデバイス設計が見つかりません。 私も必要なツールを持っていません 日常生活の中で私はこの分野で仕事をしておらず、ハンドシェイクの地位を失いたくありません。 私は主題分野の知識を少し高めようとしましたが、どういうわけか、私は専門用語に誤解される可能性があることを理解しています。 私自身、プログラミングから遠く離れた人々のコードを見るのは苦痛だと思うので、電気工学の分野の美しい愛好家から時間をかけないために、すべてが組み立てられた様子の写真を投稿します。







さて、最後の写真の後も読み続けたすべての人のために、成果「完璧主義者の電気技師の地獄を生き延びた」が利用可能です...











だから、私が言ったように、アイデアはシンプルでした:電話に写真があり(写真のソースが何であるかは関係ありません、写真がそこにあると仮定します)、あなたはそれを減らし、明るさとコントラストで操作を行う必要があります(必要な場合)、次に、ディザリングして白黒の画像を取得し、Bluetooth経由でプリンターに送信して直接印刷します。



私はソフトウェアを開発しているので、ソフトウェア部分に問題やトラブルはありませんでした。 プリンターと制御デバイス間でデータを交換するための簡単なプロトコルが実装されました(プリンターはbluetoothを介してコマンドを受け入れるため、電話のみに限定する意味はありません)。

  1. バイナリプロトコルは、データをだますために使用されます。
  2. データはパケットの形式で送信され、各ヘッダーはヘッダーで始まります(パケットの種類、データ量)。
  3. 各リクエストパケットには2つの応答があります(「リクエスト受信」と「リクエスト完了」)。 1つの答えを省くことができますが、このモードではプリンターの状態をより適切に制御することができました-コントローラー側でコマンドキューを実装する必要はありません。 コントローラー自体は、新しい要求を満たす準備ができていることを報告します。


「プリンタは動作していますか?」などのサービスコマンドに加えて、印刷に直接関連するコマンド(画像印刷および給紙-フィード)がいくつか実装されました。



プリンターはモノクロ画像のみを印刷できるため、1bpp(ピクセルあたり1ビット)の簡易ビットマップアナログが画像形式として選択されました。 プリンターは1行あたり384ドットを印刷できます。つまり、1行を完全に印刷するには48バイトが必要です(ヘッダーはカウントされません)。



通信の問題



TXモジュールのレグの電圧が低すぎるため、コントローラーがBluetoothモジュールからのデータの受信を拒否したという事実に焦点を当てません。 私はこの部分のデバッグに多くの時間を費やしました。 私はこれのために約2日を殺しました、なぜなら 最初に、私ができることをすべてチェックしてから、インターネットを読みに行きました。これは、選択したモジュールの機能であり、レベルを自分で必要な3.3Vに引き上げるか、モジュールを強制してダイオードをはんだ付けする必要があることがわかりました(これを行わないことにしました)。











コントローラー側でパケットを受信できた後、別の問題が発生しました。データが部分的に届きました。 今まで、問題が何であったかを正確に言うことはできませんが、ブルートゥースモジュールにはバッファー制限、その送信/処理速度があります。 問題はこれでした。パケット(たとえば、1キロバイトのデータ)を送信しています。コントローラー側では、ランダムな範囲(ランダムなデータ領域、ランダムな量)で990-1023バイトが失われます。 データ損失は約50%のケースで発生し、常に元のデータのわずかな割合(数キロバイトを送信する場合でも50バイト以下)に達しました。 問題はすべてのデータ交換速度で繰り返されました(すべてをチェックしたわけではありませんが、平均値と境界の両方をチェックしました-1200および115200ボー)。 合成遅延を埋め込まないために、データ交換プロトコルを補足するだけにすることにしました。

  1. パケットチェックサムが追加されました。
  2. パケット内のデータはフラグメントで送信され、データフラグメントが送信された後、受信したフラグメントのシーケンス番号を送信したコントローラーからの応答が予期されていました。
  3. フラグメントサイズを設定するためのサービスパッケージが追加されました(通常は128バイトが使用されますが、フラグメントサイズを変更する機会を残しました)。


そのため、パッケージの開始を決定するために最初に必要だったのは署名(特定のバイトシーケンス)でした。

inline bool _receiveSignature( ) { unsigned char character; unsigned int offset = 0; while( offset != SIGNATURE_SIZE ) { if( _readByte( &character ) ) { if( character != SIGNATURE[offset] ) { if( character == SIGNATURE[0] ) offset = 1; else offset = 0; } else offset++; } else return false; } return true; }
      
      







署名付きのアイデアは新しいものではありません。 何らかの理由で、送信の途中でいずれかの当事者がパケットの受信を中断した場合、残りのパケットデータは次のパケットとして解釈されるべきではありません。 したがって、受信は、署名の前にすべてのバイトがバッファから削除(無視)されるという事実から始まります-パケットヘッダーの始まり。 したがって、バッファ内のランダムなガベージ(前のパケットの残り)が新しいパケットのヘッダーと見なされないことが保証されます。



フラグメントでデータを受信するためのコード(ヘッダーを受信して​​確認した後のデータ領域):

 unsigned char *buffer = m_buffer; unsigned int size = m_header.size; _sendCallback( 0 ); // resets fragment id while( size > 0 ) { unsigned int fragmentSize = _min( size, m_fragmentSize ); if( read( buffer, fragmentSize ) ) { size -= fragmentSize; buffer += fragmentSize; _sendCallback( ); } else { _sendCallback( 0 ); // sends wrong fragment id _setError( READ_ERROR ); return false; } //      callback (  ) } unsigned int checksum = _getChecksum( m_buffer, m_header.size ); if( m_header.checksum != checksum ) { send( COMMAND_ERROR ); _setError( INVALID_CHECKSUM ); return false; }
      
      







データ送信中に損失が発生する可能性があるため、パケットのシリアル番号を確認する必要があります。 たとえば、印刷要求は送信されましたが、応答は受信されていません。 この場合、リクエストは再度送信されますが、実行する必要はありません。 直前のクエリ実行のステータスで答えるだけです。 各当事者はパケットを検討し、パケットのシリアル番号が正しくない場合は、「ゼロから」通信を開始する必要があります(カウンターをリセットします)。



プリンター自体に加えて



プリンター自体、コントローラー、通信モジュール(bluetooth)に加えて、ステータスを示すためにいくつかの要素が追加されました。 3つのLEDが追加されました。

  1. 電源インジケータ。
  2. 電話機との通信のインジケータ(最後の5秒間にデータ転送があった場合に点灯します)。
  3. 印刷インジケータ(印刷中に点灯)。










シンプルなインジケータに加えて、進行状況、ステータス、その他の詳細を表示するモノクロ画面が追加されました。



一般的なスキームは次のようになります。









外観



この場合、4mmの合板を使用することにし、合板の切断をレーザーを使用する機械に任せました。 私に求められたのは、作業のためのベクトル描画とお金だけでした。 図面は次のようになりました。









カットではなく燃え尽きる必要がある領域は赤でマークされています。 結果に満足。 この箱のマイナス面のうち、私はそれが接着されており、分解できないとしか言​​えません。 幸いなことに、新しいコントローラーファームウェア用のポートとバッテリーを充電するためのポートを推測したため、ボックスを分解する必要はありません。









ボックスが3回目になったことを明確にする必要があります。 最初は、箱は単に合わなかった-私は急いで、寸法をチェックせず、1つの面が合わなかった。 それから私は図面を再編集しましたが、画面を保護するガラスを修正する方法でかなり愚かな選択をしました:









その結果、ガラスはケースの中に隠れていて、外側からはみ出していませんでした(ここから記事の最初から写真を挿入しません)。



アプリ



電話側では、かなり原始的なインターフェイスを作成しました。

印刷する画像を選択する(カメラまたはファイルシステムから):









画像設定-明るさとコントラスト:









いくつかのコントロール(プリンターへの接続、印刷、給紙、画像の回転):









結果



印刷品質はかなり優れています(サーマルプリンターの場合)。









多くのプリンターと同様に、これも例外ではなく、「ストライプ」です。









一般的に、この話で私が言いたいのは、自分の手で物事をすることを恐れてはいけないということです。自転車も恐れてはいけません。 最近では、デバイスの開発が非常に簡単になりました。 コントローラーのリソースはそれほど制限されておらず、仕事においても気取らないものであり、いくつかのミス(電気工学を理解している人が犯したものではない)を許します。 自分で物事を行い、自転車を再発明してください。 最後まで読んでくれたみんなに感謝します。



All Articles