2017年12月23日土曜日

Delphi 10.2.2:Bleで Microbitと通信する。

これは2017年12月23日のdelphi アドベントカレンダーです。

DELPHIでAndriodを使ってble通信をしてみます。
1.MICRO BITのKEY押し状態をAndriod上に表示する。
2.AndroidからMicroBitへ文字列を送信する。

できるとこんな感じになります。







結構簡単に通信できました。。




コードはこんな感じです。



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.StdCtrls,
FMX.Objects, FMX.Edit, FMX.Controls.Presentation, System.Bluetooth,
System.Bluetooth.Components;
const
UUID_BUTTON_SERVICE : TBluetoothUUID = '{E95D9882-251D-470A-A062-FA1922DFA9A8}';
UUID_BUTTON1_CHARACTERRISTIC : TBluetoothUUID = '{E95DDA90-251D-470A-A062-FA1922DFA9A8}';
UUID_BUTTON2_CHARACTERRISTIC : TBluetoothUUID = '{E95DDA91-251D-470A-A062-FA1922DFA9A8}';
UUID_UART_SERVICE : TBluetoothUUID = '{6E400001-B5A3-F393-E0A9-E50E24DCCA9E}';
UUID_UART_TX_CHARACTERRISTIC : TBluetoothUUID = '{6E400003-B5A3-F393-E0A9-E50E24DCCA9E}';
type
TForm42 = class(TForm)
Connect: TButton;
Edit1: TEdit;
Send: TButton;
ButtonA: TCircle;
Label1: TLabel;
BTLableA: TLabel;
ButtonB: TCircle;
BtLabelB: TLabel;
BluetoothLE1: TBluetoothLE;
procedure BluetoothLE1CharacteristicRead(const Sender: TObject;
const ACharacteristic: TBluetoothGattCharacteristic;
AGattStatus: TBluetoothGattStatus);
procedure BluetoothLE1EndDiscoverDevices(const Sender: TObject;
const ADeviceList: TBluetoothLEDeviceList);
procedure BluetoothLE1EndDiscoverServices(const Sender: TObject;
const AServiceList: TBluetoothGattServiceList);
procedure ConnectClick(Sender: TObject);
procedure SendClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ private 宣言 }
public
{ public 宣言 }
end;
var
Form42: TForm42;
GBleDevice : TBluetoothLEDevice;
BackColor : TColor;
implementation
{$R *.fmx}
procedure TForm42.BluetoothLE1CharacteristicRead(const Sender: TObject;
const ACharacteristic: TBluetoothGattCharacteristic;
AGattStatus: TBluetoothGattStatus);
begin
if(ACharacteristic.UUID = UUID_BUTTON1_CHARACTERRISTIC) then
begin
if ACharacteristic.GetValueAsInt8(0) <> 0 then
ButtonA.Fill.Color := TAlphaColorRec.Red
else
ButtonA.Fill.Color := BackColor;
end
else
if(ACharacteristic.UUID = UUID_BUTTON2_CHARACTERRISTIC) then
begin
if ACharacteristic.GetValueAsInt8(0) <> 0 then
ButtonB.Fill.Color := TAlphaColorRec.Red
else
ButtonB.Fill.Color := BackColor;
end;
end;
procedure TForm42.BluetoothLE1EndDiscoverDevices(const Sender: TObject;
const ADeviceList: TBluetoothLEDeviceList);
var
i : uint32; // ARM なので最適化
begin
if ADeviceList.Count > 0 then begin
for i := 0 to Pred(ADeviceList.Count) do begin
if Pos('BBC micro:bit', ADeviceList[i].DeviceName) > 0 then begin
Label1.Text := ADeviceList[i].DeviceName ;// ' (' + ADeviceList[i].Address + ')';
BluetoothLE1.CancelDiscovery;
GBleDevice := ADeviceList[i];
GBleDevice.DiscoverServices;
exit;
end;
end;
end;
end;
procedure TForm42.BluetoothLE1EndDiscoverServices(const Sender: TObject;
const AServiceList: TBluetoothGattServiceList);
var
i : uint32; // ARM なので最適化
LGattService : TBluetoothGattService;
begin
LGattService := BluetoothLE1.GetService(GBleDevice, UUID_BUTTON_SERVICE);
if LGattService <> nil then
begin
for i := 0 to Pred(LGattService.Characteristics.Count) do
begin
if LGattService.Characteristics[i].UUID = UUID_BUTTON1_CHARACTERRISTIC then
begin
GBleDevice.SetCharacteristicNotification(LGattService.Characteristics[i], True);
end
else
if LGattService.Characteristics[i].UUID = UUID_BUTTON2_CHARACTERRISTIC then
begin
GBleDevice.SetCharacteristicNotification(LGattService.Characteristics[i], True);
end;
end;
end;
end;
procedure TForm42.ConnectClick(Sender: TObject);
begin
if( not BluetoothLE1.Enabled ) then
begin
BluetoothLE1.Enabled := True;
BluetoothLE1.DiscoverDevices(1000); // 10秒
Connect.Text := 'Disconnect';
Label1.Text := '';
end
else
begin
BluetoothLE1.CancelDiscovery;
BluetoothLE1.Enabled := False;
GBleDevice := NIL;
Connect.Text := 'Connect';
end;
end;
procedure TForm42.FormCreate(Sender: TObject);

BackColor := ButtonA.Fill.Color;
end;
procedure TForm42.SendClick(Sender: TObject);
var
i : uint32; // ARM なので最適化
LGattService : TBluetoothGattService;
LCharact : TBluetoothGattCharacteristic;
begin
if GBleDevice = NIL then exit;
if GBleDevice.IsConnected = false then exit;

LGattService := BluetoothLE1.GetService(GBleDevice, UUID_UART_SERVICE);
if LGattService = NIL then exit;
// LCharact := LGattService.GetCharacteristic(UUID_UART_TX_CHARACTERRISTIC);
for i := 0 to Pred(LGattService.Characteristics.Count) do
begin
if LGattService.Characteristics[i].UUID = UUID_UART_TX_CHARACTERRISTIC then
begin
LGattService.Characteristics[i].SetValueAsString(Edit1.Text+'#', True);
GBleDevice.WriteCharacteristic(LGattService.Characteristics[i]);
exit;
end;
end;
end;
コード一式はここ


microbit側はmicrobit アドベントカレンダー25日にて公開予定です。

それでは。



http://qa65.blogspot.jp/2017/12/microbitble.html

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ゲージを動かす。
 



以上
やましょうでした。