2017年12月3日日曜日

Delphi 10.2 Tokyoから232cが簡単になったのでナダ電子製シリアルプリンタでプリントしてみた。


みなさん、お久しぶりです。



やましょうです。

今日はナダ電子さんの
http://www.nada.co.jp/as289r2/
を使用する方法をご紹介です。


実は11月30日からdelphi では232cコンポーネントが
get itで簡単に使える様になりました。


3/1には申請は出していたのですが、忘れられていた見たいで、
ゆるふぁい#0の雑談で確認しないとという話しになり、
11月中頃になってどうなっているの?と聞いたら。。
まぁいろいろあったらしく早急に対応がとられた模様です。
get itに申請を出して、1ヶ月くらいで返事がなければ再度連絡した方が良いと思います。

さて、それでは232cを使いましょう。これで簡単に232cが。。使えるのさってことで、ツール=>Get itを選択し232cといれます。
delphiのみになっていますがC++ビルダーでも動くと思うけど保証はしない。



  


そしたら、インストールボタン押すだけで使える様になる。  

さて、あとはナダ電子さんのプリンターにUSB接続<=>シリアル変換でつなげます。
ナダ電子さん、ハード的な説明すくなすぎです。
私のはまった点はDC アダプタ5v 1aだとまともに動かず。これでムダに時間を。。。
5V-4AだとOK  3.3vにしてもDC アダプターは5Vを使ってねとかこの当たりの情報は
どこかにまとめるか?
www.nada.co.jp/printer/pdf/MP-150BR-I.pdfな形の仕様書pdfを
www.nada.co.jp/as289r2/support.htmlページにあれば良いなぁと思いました。

接続はこんな感じ
白GND
灰色:PC(TX)




あとは、DELPHI でフォームを新規作成して、WUNI232とボタンをフォーム上に張って
以下コード書くのみ

unit Umain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, WUni232c;

type
  TForm1 = class(TForm)
    WUni232c1: TWUni232c;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

const

 GsQr : array [0..8] of byte = ( $1D,$78,$4C,$05,BYTE('D'),BYTE('E'),BYTE('L'),BYTE('P'),BYTE('I') );

procedure TForm1.Button1Click(Sender: TObject);
var
Str: UTF8String;
begin
  WUni232c1.BaudRate := 9600;

  if( not WUni232c1.Connect ) then
                                      WUni232c1.Open;

  Str := sLineBreak+sLineBreak+sLineBreak+sLineBreak;
  WUni232c1.Write(Length(Str),@str[1]);
  Str := 'HELLO DELPHI'+sLineBreak;
  WUni232c1.Write(Length(Str),@str[1]);
  WUni232c1.Write(sizeof(GsQr),@GsQr);
  Str := sLineBreak+sLineBreak+sLineBreak+sLineBreak;
  WUni232c1.Write(Length(Str),@str[1]);

end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
  if( WUni232c1.Connect ) then
                                      WUni232c1.Close;
end;

end.

動かすと、

ちゃんとプリントされました。



追加で動画





ということでアドベントカレンダー3日目の記事した。
みなさん
ごきげんよう !!










2017年3月16日木曜日

Led Name Boardをdelphiからコントロールする。

みなさんお久しぶりです。

delphiから Led Name ボードをコントロールしたいと思います。

ちなみにたぶんこれだと思う。
https://www.amazon.com/Koolertron-Programmable-Digital-Scrolling-Message/dp/B00T9FEI4Q/ref=sr_1_2?ie=UTF8&qid=1489621823&sr=8-2&keywords=led%2Bname%2Bboard&th=1




 こんな感じで


こんな奴なのです





そしてPL2303HXですとWINDOWS 10で動かないのでCHIPをPL2303HXDに張り替え。
(windows7とか8なら古いドライバーを使えば問題なしだと思う。)



さて、DELPHI側のソースですが、
http://www.csd.co.jp/uni232c/
に飛んでWUNI232Cコンポーネントを入手します。
これならソース付きで無料ですね。

さて、その次にソースはここから入手


(事前にCOMポートナンバーをTERATerm等で調べておきましょう。)
ポートナンバー変更後
それをコンパイルして動かすこうなります。


ってことでJIMさん
これであそんでみてください。

2017年2月15日水曜日

Delphi でAndriod Thingsを使用してみる。

みなさん
おひさしぶりです。

やましょうです。

先日、日本Androidの会の勉強会に参加しまして、
Android Thingsと組込み用 のアンドロイドのプレビューが発表されている事を知りました。
どうもラップするだけで、ザマリンでも動く様ですので、Delphiからも簡単にアクセスできる筈
と思やってみました。


 1.System イメージの入手先です。
https://developer.android.com/things/preview/download.html

で入手できます。(私はラズパイ3で挑戦です。)

2.イメージの書込みツール入手

https://sourceforge.net/projects/win32diskimager/

3.イメージツールでSDCard 8Gにイメージを書込みます。

その後ラズパイに挿入、Lanケーブルを挿し、hdmi接続

4.ラズパイ電源起動


するとipアドレスが下の方に出てきますので、それをメモりましょう


5.adb コマンドでラズパイと接続します。
私の場合Android Studioも入っているので

C:\Users\me\AppData\Local\Android\sdk\platform-tools>adb connect ip Addresss
connected to  ip Address : 5555って返ってきます。


6.SDKを、Andorido Studioと同じフォルダーにする。

7.Android Things用のブリッジファイルを作る(サンプルファイルをダウンロード)
 Java2Op等で作成。なのですが、面倒なのでファイルをダウンロードしてください。
 

8.サンプルプログラム
 unit Main;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls
  ,Android.Things
  ,Androidapi.JNI.JavaTypes
  ,Androidapi.JNIBridge
  ,Androidapi.JNI.GraphicsContentViewText
  ,Androidapi.Helpers
  ,Androidapi.JNI.App
  ,Androidapi.JNI.Embarcadero;

type
  TForm37 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private 宣言 }
     FPortService    :   JPeripheralManagerService;
     FWDGpio : JGPIO;
     RVSGpio : JGPIO;
  public
    { public 宣言 }
  end;

var
  Form37: TForm37;


implementation

{$R *.fmx}


procedure TForm37.FormCreate(Sender: TObject);
begin
    FPortService := TJPeripheralManagerService.Create();
    FwdGpio := FPortService.openGpio(StringToJString('BCM6'));
    RvsGpio := FPortService.openGpio(StringToJString('BCM5'));
    FwdGpio.setDirection( TJGpio.JavaClass.DIRECTION_OUT_INITIALLY_LOW);
    RvsGpio.setDirection( TJGpio.JavaClass.DIRECTION_OUT_INITIALLY_LOW);
end;

procedure TForm37.Timer1Timer(Sender: TObject);
begin
     if  Timer1.Tag = 0 then
     begin
        Timer1.Tag := 1;
        FwdGpio.setValue(FALSE);
        RvsGpio.setValue(TRUE);
     end
     else
     begin
         Timer1.Tag := 0;
         FwdGpio.setValue(TRUE);
         RvsGpio.setValue(FALSE);
     end;
  end;
end.


9.AndroidManifestファイルの編集
         <uses-library android:name="com.google.android.things"/>
を追加したりいろいろする


10.コンパイル実行
(機種選択はiot_rpi3を選択してください。)

 実行すると

こんな感じで交互にLチカとなります。



ソースはここ、SourceFile 


Nゲージを動かす。
 



以上
やましょうでした。

2016年12月4日日曜日

Delphi タイマイベントについて考える。

これは Delphi Advent Calendar  2016 4日目の記事です。
みなさん、おひさしぶりです。やましょうです。

ちょっと不思議というか本当にwindowsのタイマイベントって正しいのか?
と言う疑問にかられました。
理由はここ
Msさんの組込み用ラズパイのタイマがぼろぼろだったからです。

また、C#だと。。StopWatchが簡単に。。ですけどdelphiだとなかなか書いていないため
記載してみます。)

まずDelphiではStopWatchで時間計測です。

StopWatchを使用する為に、
  System.Diagnosticsを追加
Createして、タイマイベントで計測&表示って感じです。


コード
unit TimerTestMain;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  System.Diagnostics,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo;

type
  TForm36 = class(TForm)
    Timer1: TTimer;  //1000ms設定でenableにしておく
    Memo1: TMemo;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private   var
    StopWatch : TStopwatch;

    { private 宣言 }
  public
    { public 宣言 }
  end;

var
  Form36: TForm36;

implementation

{$R *.fmx}

procedure TForm36.FormCreate(Sender: TObject);
begin
  StopWatch := TStopwatch.Create;
  StopWatch.Start;
end;

procedure TForm36.Timer1Timer(Sender: TObject);
var
Tm : Int64;
begin
  StopWatch.Stop;
  Tm := StopWatch.ElapsedMilliseconds;
  StopWatch.Reset;
  StopWatch.Start;
  if StopWatch.IsHighResolution then
      form36.Caption := 'ハイレゾ'
  else
      form36.Caption := 'そんなでもない';

  memo1.Lines.Add(IntTostr(Tm));
end;
結果、やっぱ正確じゃない。。。
単位[ms] です。
990
1002
996
1002
1000
1000
1000
994
1003
998
1002
1001
996
998
999
1000
999
1002
996
1001
1001
1000
1010
989
997
1001
998
i7のマシンでしかもハイレゾでも
これだけジッタというか、結構づれていそうです。
 とは言っても平均すると1秒くらいに収束しそうです。
さすが、PC、だいたいでは問題ないですね。
ちなみに、念の為プロセスを最優先にしても正確ではありませんでした。  SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS );
を追加

さて、ここから脱線して、
一つの疑問はタイマのイベントは他のイベント中に受け付けるのか?
と言うことですね。と言うことで確認です。
(タイマは割込処理なのか?違うのか?の検証です。)

keyを押すと3秒程度かかる処理を実装して、計測してみます。

procedure TForm36.Button1Click(Sender: TObject);
var
Tm : Int64;
i : DWORD;
begin
  memo1.Lines.Add('ボタン1の処理開始');
  for I := 0 to MAXINT do
    begin
      asm nop end;
      asm nop end;
//  if ( i mod 10000 ) = 0 then Application.ProcessMessages();
  end;
  Tm := StopWatch.ElapsedMilliseconds;
  memo1.Lines.Add('ボタン1の処理終了:'+IntToStr(Tm));

end;

procedure TForm36.FormCreate(Sender: TObject);
begin
  StopWatch := TStopwatch.Create;
  StopWatch.Start;
end;

procedure TForm36.Timer1Timer(Sender: TObject);
begin

  memo1.Lines.Add('1秒毎のタイマイベント発生');
end;


結果:

1秒毎のタイマイベント発生
1秒毎のタイマイベント発生
ボタン1の処理開始
ボタン1の処理終了:6368
1秒毎のタイマイベント発生
1秒毎のタイマイベント発生
ボタン1の処理開始
ボタン1の処理終了:10898
ボタン1の処理開始
ボタン1の処理終了:14581
1秒毎のタイマイベント発生
1秒毎のタイマイベント発生
1秒毎のタイマイベント発生
1秒毎のタイマイベント発生


keyを二度押ししても、ボタン1の終了までは、ボタン1の処理は開始せず、
タイマイベントも処理できていません。なので割込処理でもありませんね。


 このことから重い処理を分散させるため  Application.ProcessMessages();
の呪文を使います。
この場合多重にkeyの処理が走り出すので注意が必要です。
その時の結果は下記

1秒毎のタイマイベント発生
1秒毎のタイマイベント発生
ボタン1の処理終了:20532
1秒毎のタイマイベント発生
1秒毎のタイマイベント発生
1秒毎のタイマイベント発生
1秒毎のタイマイベント発生
1秒毎のタイマイベント発生
1秒毎のタイマイベント発生
1秒毎のタイマイベント発生
ボタン1の処理終了:27593
1秒毎のタイマイベント発生
1秒毎のタイマイベント発生
1秒毎のタイマイベント発生

ということで、タイマイベントは割込処理でなく単なるMsg処理になっています。
なので、特に難しい事は考えなくてもよさそうです。

以上
やましょうでした。



2016年11月12日土曜日

Delphi でApple Scriptを使用する。

こんにちは、おひさしぶりやましょうです。


とはいいつつも師匠から、Apple scriptの使い方をと言われたので

こんな感じです。

あくまでも例:コンパイルもしていない。スペルミスもあるかも。。
uses
  Macapi.Foundation,
  Macapi.Helpers,


const STRINGSCR = 'Apple script Desc'+slineBreak;

procedure TForm1.ApplescrClick(Sender: TObject);
var
  Scr : NsAppleScript;
  Err : Pointer;
begin
  Err := nil;
  Scr := TNSAppleScript.Wrap(TNSAppleScript.Alloc.initWithSource(StrToNSStr(STRINGSCR)));
  Scr.executeAndReturnError(Err);
end;

こんな感じで動くと思います。
実際にはexecueAndReturnErrorはTryを使用した方が良いと思います。



2016年11月2日水曜日

Delphi fmx タイトルバー無し フルスクリーン 表示方法

こんにちは、 やましょうです。

delphiで、fmx のフルスクリーン方法です。


form1.FullScreen := true;

以上です。