フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: 1 2 3 [4]
トピック: Delphi Advent Calendar 2016
DEKO
管理者
投稿数: 2651
12/29 Arduino ライブラリ互換ユニット
on: 2016/12/29 22:17 Thu

これは Delphi Advent Calendar 2016 の補欠記事です。

さて、最近は現実逃避で Arduino を触る事も多いのですが、Arduino には便利な関数があります。

例えば Constrain() 関数。これは VCL フォームの Constraints プロパティと似たような役目をする関数です。
https://www.arduino.cc/en/Reference/Constrain

if a < 0 then
a := 0
else if a > 100 then
a := 100;

 
このような範囲チェックを行うコードをよく書くと思いますが、Constrain() を使うと

a := Constrain(a, 0, 100);

 
一行で書けます、便利ですね!でも、実はこの関数、既に Delphi にあるんです。名前は EnsureRange()。System.Math 名前空間にあります。

a := EnsureRange(a, 0, 100);

 
[System.Math.EnsureRange()]
http://docwiki.embarcadero.com/Libraries/ja/System.Math.EnsureRange

もうひとつ便利なのは Map() 関数。これはとある範囲にある数値を別の範囲にある数値へ変換するものです。これは (多分) Delphi に類似関数はないと思います。
https://www.arduino.cc/en/Reference/Map

var
val: UInt32;
begin
val := 512;
val := Map(Val, 0, 1023, 0, 255);
ShowMessage(Val.ToString);
end;

 
Val は 0..1023 の値で、Map() は 0..255 を返します。上記コードは 127 を表示します。

const
Min_Val = 0;
Max_Val = 100;
var
val: Integer;
begin
val := 25;
val := Constrain(val, Min_Val, Max_Val); // 範囲チェック 0..100
val := Map(val, Min_Val, Max_Val, Max_Val, Min_Val); // 0..100 を 100..0 に変換
ShowMessage(Val.ToString);
end;

 
上記コードは 75 を表示します。

と、Arduino にある関数をいくつか移植してみたのが uArduinoComp.pas になります。プラットフォーム依存のユニットは使っていないため、モバイル環境でも使えます。

  • Constrain()
  • Map()
  • RandomSeed()
  • Random()
  • LowByte()
  • HighByte()
  • BitRead()
  • BitWrite()
  • BitSet()
  • BitClear()
  • Bit()

以下から DL できます。

[uArduinoComp]
http://ht-deko.com/delphiforum/?vasthtmlaction=viewtopic&t=1833

ページ: 1 2 3 [4]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.025 sec.