2019年3月13日水曜日

Arm系のコンパイラで”Only virtual folder and links can be created under a virtual folder”が出たときの対策

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

arm系の組み込みにて、
eclipse ベースのide全盛の今日この頃ですが、皆様、お過ごしでしょうか?

arm系のサンプルに何かファイルを足したいときに右クリックで、ファイルを増やそうすると”Only virtual folder and links can be created under a virtual folder”って出ますよね?

この場合の対策です。
1.任意フォルダーに追加したいファイル作成します。
"AddCFile.c"とかでもよいと思います。

2.次にeclipse のprojectファイルツリーで追加したいフォルダーに移動します。
2-1.インポート=>ファイル・システムを選択
ディレクトリーを指定し、1のファイルを選択

2-2.拡張のボタンを押し
ワークスペースにリンクを作成等のチェックボックスをオンとすることで対応できます。


以上
やましょうでした。

2018年12月13日木曜日

36回デベロッパーキャンプLT補足:技適の壁が

12/6 第36回 エンバカデロ・デベロッパーキャンプ・イン東京
みなさんお疲れ様でした。 
LTで SORACOM LTE-M BUTTONのDEMOを披露したやましょうです。

BUTTONのガワを開けた時点で技適が外れるとの指摘を頂きました。
(注:携帯の電池交換もOUTならしいのでご注意ください。)
今回は私の認識の甘さでご迷惑をおかけしたことをお詫び申し上げます。
同様に行いますと、技適違反になる可能性がありますのでご注意ください。
適法にボタンを使う場合、
外からサーボ等で、こんな感じにしないとダメなんだそうです。

 これでは消費電流もかかり過ぎますし、ムダが多すぎです。


また、私が当日DEMOをした時に神様が降臨したことにより、
DEMOは予備機のオリジナルのSORACOM LTE-M BUTTONで通信をしています。

(DEMOの神様は私にとっては本当の神になりました。
神様ありがとうございます。)

参考用に中身の画像だけ張っておきます。


  
なぜかモジュールにも技適が...

そしていつも私が使っている、 ESP-32とかはバリバリポートとか
使いたい放題ですけどね。


こっちはケースに入っていないので技適違反にならない?のですよね?


結論:SIGFOXやサクラIOTとか使った方が良い便利なんだろうな。と思います。
 
上サクラIOTボード/下SIGFOXボード


以上
やましょうでした。








2018年7月22日日曜日

Delphi 10.2.3 Community Edtionを使って ナダ電子製 シリアルプリンタをアンドロイドから動かす。 


みなさん

おひさしぶりです。
やましょうです。

Delphi Community Edtion が公開されました。
早速ですが、ナダ電子製のシリアルプリンタをアンドロイドから制御してみたいと思います。

大体の大まかな方法。
1.UNI232Cをコンポーネントをダウンロードしてインストール
2.元ネタPCより制御の WUni232cコンポーネントをUNI232Cに切り替えつつ、FMX化する.

大事な点:

1.コンポーネントはhttps://www.csd.co.jp/product/ uni232cVer1.11をダウンロードしてインストールする。 

2.Delphiでコンパイル時に、プロジェクト=>オプション=>Delphi コンパイラ=>検索パスで対応とすべきuni232c.dcuのフォルダーを必ず指定すること。

3.アンドロイド時のマニフェスト等は、プロジェクト=>配置の部分で詳細設定すること
(たぶんここは不要かと思う。)



コード的には、
1.Wuni232c=>Uni232cに変更(W)を削除
2.文字列の開始位置が要素1から0に(windows以外)
3.CR(0XD) LF(0XA)がsLineBrekeを使うと0x0a(Android時)となるので、CRLFを定義した。
だけでアンドロイドで動くのです。これ凄いでしょう????

ってことで動作させて見ました。



こんな感じで動くのです。

今回使用した、uni232cはアンドロイドですと書き込みに回数制限等がありますので、
製品として使う場合は購入した方が良いと思います。
もちろんターゲットをWindowsにすればそのまま動きますよ。。

そしてコードはここ。

それでは。。



2018年6月18日月曜日

Ble Packet Sniffer

こんにちは お久しぶりです。

TI のCC2540をBle Packet Snifferで見るためにはまったので
ここに記載します。

まず、必要なOS WINDOWS7、WINDOWS10ですとだめな様です。

ハード
CC2540:
http://www.tij.co.jp/tool/jp/cc2540emk-usb
で買う?
https://www.aliexpress.com/item/Bluetooth-4-0-BLE-CC2540-USB-Dongle-Protocol-Analysis-BTool-Packet-Sniffer-Board-Debug-Pin-1Mbps/32769663761.html?spm=a2g0s.13010208.99999999.268.4a853c00iUucrj
で買う?
https://www.aliexpress.com/snapshot/0.html?spm=a2g0s.9042311.0.0.754d4c4ddMIbGR&orderId=30796677394087&productId=1859126489
で買う、等いろいろあるようですが、

中身を書き換えるのために

ケーブルとCCデバッガも必要な様です
http://www.tij.co.jp/tool/jp/cc-debuggerですね。
以下にも。。。

https://www.aliexpress.com/item/Downloader-Cable-Bluetooth-4-0-CC2540-zigbee-CC2531-Sniffer-USB-dongle-BTool-Programmer-Wire-Download-Programming/32837441367.html?spm=a2g0s.9042311.0.0.27424c4djVwXDh

 https://www.aliexpress.com/item/Bluetooth-zigbee-Emulator-CC-Debugger-original-shell-2540-2541-2530-protocol-analysis/32798394717.html?spm=a2g0s.9042311.0.0.27424c4djVwXDh

買ったら、中身をCC2540に書換えましょう。


次にSMART RF STUDIOをDOWNLOADしインストールします。
 http://www.tij.co.jp/tool/jp/smartrftm-studio
これはドライバーをインストールするためです。

次にSnifferをダウンロード

http://www.tij.co.jp/tool/jp/packet-sniffer
SnifferのV2.18をダウンロードします。


あとは
http://docs.fabo.io/fabo/ble/bgscript/sniffer.html
https://qiita.com/tw_Inudaisuki/items/9d1d220191e3402234ec
とかを参照します。


以上

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さん
これであそんでみてください。