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日目の記事した。
みなさん
ごきげんよう !!