したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |

ALPS MDとしゃべってみるスレ 1話

1名無しさん:2018/06/02(土) 14:46:12 ID:PPWIcTxI
ALPS社のマイクロドライプリンタとお話しするスレです。

同プリンタのコマンドセットやプリンタドライバの制作に関連する技術などを扱います。

公式
 マイクロドライプリンタ//アルプス電気
 ttp://www.alps.co.jp/brand/printer/index.htm

類似プロジェクト
 gdevmd2k (Ghostscript用のALSP MDプリンタドライバ)

2名無しさん:2018/06/02(土) 16:09:27 ID:PPWIcTxI
手持ちのコードから適当に抽出改造

USBプリンタのデバイスファイル名を取得して任意のファイルを送る例
usbprint.js
<-- ここから
function main(args)
{
var locator, server, sw, em, fso, ws;
var dids;
var cmd, port;

fso = new ActiveXObject("Scripting.FileSystemObject");
ws = new ActiveXObject("WScript.Shell");
if (!fso.FileExists(args(0)))
{
WScript.StdOut.write("[ERRO] File not found.\n");
return;
}

WScript.StdOut.write("[INFO] USB Print port scan...");
locator = new ActiveXObject("WbemScripting.SWbemLocator");
server = locator.ConnectServer(null, "root\\CIMV2");
sw = server.ExecQuery("Select * From Win32_PnPEntity Where Service=\"usbprint\"");
em = new Enumerator(sw);
dids = new Array();
WScript.StdOut.write("finish.\n");

while (!em.atEnd())
{
dids.push(em.item().DeviceId);
em.moveNext();
}

switch (dids.length)
{
case 1:
port = "\\\\?\\" + dids[0].replace(/\\/g, "#") + "#{28d78fad-5a12-11d1-ae5b-0000f803a8c2}";
WScript.StdOut.write("[INFO] Found port :" + port + "\n");
cmd = "cmd.exe /c copy /b \"" + args(0) + "\" \"" + port + "\""
ws.Run(cmd, 1, true);
WScript.StdOut.write("[INFO] Exec command :" + cmd + "\n");
break;
default:
WScript.StdOut.write("[ERRO] Found port count :" + dids.length + "\n");
break;
}
}

main(WScript.arguments);
--> ここまで
使い方
>cscript usbprint.js foo.bin
→foobinをUSBプリンタへ送信

注意
Win7 x64でUSBパラレル変換ケーブルのデバイスファイル名を正常に取得できる事を確認しています
USB標準クラスのみ対応しています。Win7では“USB印刷サポート”と認識されます
実際に印刷できるかまでは確認していません
USBプリンタが1つ以外の場合は処理を中断しています。0はもちろん2以上もダメです
プリンタがデータを受け取れない場合はcmd.exeで止まります。Ctrl+Cで中断してください

PnPの仕様が判ればCなどからポートの先に繋がっているプリンタの機種を自動判別するみたいな芸当も出来そうな気はします

3223:2018/06/02(土) 18:37:03 ID:YGeBxZMs
とりあえず、WindowsXPで作った印刷データ(ドライバーの印刷ポートをファイルにしたprnファイル)を送って、Windows10から印刷できるまでこぎつけることがステップ1だと思います。
ステップ2は、MDの印刷データを解析したデータを使って単色(黒)画像から、印刷データ(カラーディザなし)を作って印刷する。
ステップ3は、単色データを複数使ったページ合成印刷。(光沢・MF・特色ホワイトも可)
ステップ4は、カラー画像をCMYK分解して印刷データを作って印刷。ここで、カラーディザが必要になる。
その次は、RGB値に応じた特色・多色かなあ。

4248:2018/06/05(火) 00:19:19 ID:N3N.aD0k
一応名前を入れておきます

とりあえず開発環境の構築からになりそうです
自分の場合Win7 x64とWin8 x64でWin10はないのでWin10での動作確認は現状出来ません
所有しているプリンタは4000J、5000、5500。Pのドングルは1つあります
インターフェイスはUSBとLPR/RAW(USBデバイスサーバー経由)を想定しています。純粋な
パラレルポートを持つマシンはありません

出来るだけエミュレータでデバッグして実機でのテスト印字は最小にせざるを得ないでしょうね
実機でテスト印字するにしても基本ブラックを使用し他の色は本当に最後の確認だけ・・・
ブラックは今でも比較的容易かつ安価に入手できる唯一の色ですし

5223:2018/06/05(火) 05:36:30 ID:qxMdfIsI
私は、windows10 x64です。
MD-2010JとMD-1000が2台、MD-5000P、MD5000iPです。
定評があるエレコムのUSBパラレル変換UC-PBBでつないでいます。
インクは、長年買いためてきたので、特色ホワイト以外結構あります。基本4色はそれぞれ20本以上あると思います。
okiのインクもたしか全色あります。いくらテストしても大丈夫かな。
とりあえず、開発するためのソフトを統一したいですね。コードを変更なしで共有できますから。

6248:2018/06/05(火) 08:10:21 ID:3O7N6EXk
自分の言語経験は
Ruby・・・メイン。一番利用頻度が高い
Python・・・組み込みで指定されていたりする場合に触る程度
Lua・・・Pythonと同じ
C・・・必要性があれば使う
Rust・・・勉強中
アセンブリ・・・組み込みで使う

インタプリタ系だと速度的に厳しいのは明らかなのでコンパイラ系になりますかね
最低でも画像を処理する部分はネイティブコードである必要があるでしょう
Cが定番なんでしょうけどぶっちゃけあまり得意ではないです
以前にRubyの拡張プラグインを作っていたときもSEGV出して数日頭を抱えていました
Rustに興味を持っている理由もそれだったりします

CならVC++、gcc/binutils+make、clang/LLVMあたりになるでしょうか

7223:2018/06/07(木) 06:19:36 ID:JNKDbWzI
Rubyですか。
ちょっと調べてみたら、分かりやすそうな構文ですね。
何でもいいですよ。

8223:2018/06/07(木) 06:47:27 ID:JNKDbWzI
ヘッドの温度設定がないかMD-1000のデータを調べたら、データフォーマットで悩んでいます。左余白指定がよく分からない。
左余白の変化
26mm 1B 2A 62 06 00 57 BF 00 FE 00 00 78
25mm 1B 2A 62 06 00 57 C2 00 FE 00 00 78
24mm 1B 2A 62 06 00 57 C5 00 FE 00 00 3C
23mm 1B 2A 62 06 00 57 C8 00 FE 00 00 3C
22mm 1B 2A 62 06 00 57 CA 00 FF 00 00 1E
21mm  1B 2A 62 06 00 57 CD 00 FF 00 00 1E
3.4mm 1B 2A 62 04 00 57 FF 00 00 1E
3.6mm 1B 2A 62 04 00 57 FE 00 00 F0
3.7mm 1B 2A 62 04 00 57 FE 00 00 3C
3.8mm 1B 2A 62 07 00 57 00 00 FF 00 01 07 80
3.9mm 1B 2A 62 07 00 57 00 00 FF 00 01 01 E0
4mm 1B 2A 62 06 00 57 00 00 FE 00 00 78
180mm  1B 2A 62 0F 00 57 81 00 81 00 81 00 81 00 F8 00 FF 00 01 03 C0
170mm 1B 2A 62 0C 00 57 81 00 81 00 81 00 96 00 FE 00 00 3C

MD-5000では54コマンドが出てきましたが、MD-1000は57コマンドです。
62XXXXは57以降のデータの数(MD-500と同じ)
最後の少し空けたデータがドットデータです。
余白を減らすと数値が増えているので、考えつかないでいます。
FFとFEが区切りになって2byteずつのセットみたいですが、違うデータではFFやFEの部分がFDになったりしています。
8100はタブ指定みたいな。
これが分からないと、ヘッド温度設定ができるか分からない。
MD-1000 余白31mm
光沢・白以外 1B 2A 62 07 00 57 B0 00 FF 00 01 01 E0
光沢・白   1B 2A 62 09 00 57 B0 00 FF 00 03 01 E0 00 00
01E0がビットマップです。01が03になっていて、後ろに0000がついています。
さて、どうしたものか。

9名無しさん:2018/06/07(木) 22:39:28 ID:8hONRZRY
>>8
ヘッドをどれだけ左に動かしてから打ち始めるのかの分量じゃね?
少ないほど右から打ち始める=左余白が大きいとか

10223:2018/06/08(金) 12:01:23 ID:546x4cRg
MD-1000の57コマンドの詳細が見えてきた。
1B 2A 62 XL XH 57 (YH1 00)(YH2 00)(YH3 00)(YH4 00) ZZ 00 YL ビットマップ
(YH=FD〜81、ZZ=FF〜FE、YL=00〜01)
57の次=FF or FE=ZZ→YH1=YH2=YH3+YH4=0
57の次=81〜FD→左余白=3.4mm+((FE-YH1)+(FE-YH2)+(FE-YH3)+(FE-YH4))×16ドット+(FF-ZZ)×8ドット+YL×4ドット ビットマップ
もう少し検証が必要だが、こんな感じだと思う。

11223:2018/06/08(金) 12:28:31 ID:546x4cRg
間違った。
57の次=FF or FE=ZZ→YH1=YH2=YH3+YH4=FE(FE-YH=0)
だった。

12223:2018/06/08(金) 12:31:12 ID:546x4cRg
次のように細かくデータをとって調べた結果です。
3.4mm 1B 2A 62 04 00 57 FF 00 00   1E 00011110 最小値

3.43mm 1B 2A 62 04 00 57 FF 00 00 0F 00001111

3.46mm 1B 2A 62 05 00 57 FF 00 01 07 80 01111000 0001で右に4bit分

3.5mm 1B 2A 62 05 00 57 FF 00 01 03 C0 00111100

3.56mm 1B 2A 62 05 00 57 FF 00 01 01 E0 00011110

3.6mm 1B 2A 62 04 00 57 FE 00 00   F0 11110000 右に4bit分(FE0000で右に8bit分)

3.65mm 1B 2A 62 04 00 57 FE 00 00 78 01111000

3.7mm 1B 2A 62 04 00 57 FE 00 00 3C 00111100

3.73mm 1B 2A 62 06 00 57 00 00 FF 00 00 1E 00011110    0000ff0000で右に8bit分 

3.75mm 1B 2A 62 06 00 57 00 00 FF 00 00 0F 00001111

3.8mm 1B 2A 62 07 00 57 00 00 FF 00 01 07 80        01111000
0001で右に4bit分
3.9mm 1B 2A 62 07 00 57 00 00 FF 00 01 01 E0         00011110

4mm 1B 2A 62 06 00 57 00 00 FE 00 00 78 01111000 右に4bit分(FE0000で右に8bit分)


5mm 1B 2A 62 06 00 57 FD 00 FE 00 00 78 01111000 FD00で右に16bit分
6mm 1B 2A 62 06 00 57 FA 00 FE 00 00 78 01111000

10mm 1B 2A 62 07 00 57 EE 00 FF 00 01 01 E0

21mm  1B 2A 62 06 00 57 CD 00 FF 00 00 1E

13223:2018/06/08(金) 21:01:11 ID:ke6.2D6Q
ダメだ。この考え方でいいか検証してたら、
1B 2A 62 08 00 57 FD 00 00 00 02 07 FF F8
なんてのがあった。
もう少しデータ集めが必要そう。

14248:2018/06/09(土) 15:05:58 ID:ElrqrqOQ
Rubyは書きやすくて楽なのですが速度面が厳しいですね
ESC/POS用のアプリケーションはJavaScriptとRubyで作っていますがディザを実用的な速度で掛けられません
500x1000程度の単色画像をSierra Liteで二値化してもRubyでは数秒というオーダーの時間が必要です
そこでディザを掛ける部分のみ拡張ライブラリとしてCで作ったところ、一瞬で終わるようになりましたからやはり
ネイティブコードにする必要がありそうな感じがしています
これを作っているときにSEGVを出してしまい数日頭を抱えるという失敗を・・・

その関係もあり勉強もかねて開発環境をRust+OpenCV+α(+C)にしてみようかなぁ・・・と考えていたところです

15223:2018/06/11(月) 14:19:39 ID:A3XJtUq6
開発環境は、動作が速ければ、何でもいいかな。
仮想プリンタからRedMonあたりでアプリケーションにデータを渡して印刷できれば使い勝手がいいかな。
gostscriptの方も頑張っているみたいでしたので、日本の方、外国の方が作ったMDプリンタ用のソースを見てみました。
外国の方が作ったのは、インク番号も網羅していて、すごかったです。
ディザ-処理もソースに書かれていました。
Cで書かれているみたいなので、参考になるかもしれません。

16248:2018/06/11(月) 22:43:55 ID:x245rr7E
とりあえずライブラリ類を用意しない事には始まらないのでOpenCV 2.4のビルドを試みています
日曜日に3度目の正直で成功するも、今日ちょっとオプションを変更してみたらリンクエラーが再発
安定してビルドできないと後々困りそうだし何とかしたいけど結果が出るまで1〜2時間かかるのでなかなか捗らないです
ファイル名がおかしいしcmakeの問題だろうか・・・

PDFiumはgitクライアント?を用意しないとそもそもソースを取ってこれないようで未着手です

17248:2018/07/01(日) 04:07:14 ID:Ikye3VOE
一応近況
OpenVCはビルド済み。デッドコード削減のためstaticにしたかったけどリンク条件がきついのでとりあえずdynamicで
PDFiumはVS2017を要求してくるためひとまず棚上げ(すぐには環境を構築できない)
WindowsにおけるUSBプリンタのデバイスパスの取得はWindowsAPI経由でも出来るらしいのでそちらで実装予定
今はライブラリ周りのI/Fをのろのろと実装中・・・

18名無しさん:2018/07/01(日) 11:27:04 ID:0bJ54en.
>>17
ガンガレ!
応援しているぞ


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板