解説3 BASICスタンプコマンド
解説3

アナログI/O



PWM

文法
PWM ピン番号, デューティー, サイクル

解説
 ピン番号で指定したピンをアウトプットモードへ設定し、デューティー(0〜255)で指定したデューティーのパルスをサイクル(0〜65535)の周期(回数)だけ実行するというコマンドです。サイクルの時間の単位はスタンプによって違い、Tが5ms、Uが1ms、2SXが450us単位となります。このサイクルで指定した周期が過ぎるまでスタンプは他のプログラムを実行しません。
 PWMの主な使用方法はアナログ電圧を作るときに使います。指定したピンの先にコンデンサをつなげば、デューティーサイクルで指定した大きさの電圧を作成することができます。デューティーサイクルを0にすると0V,255にすると5Vの出力が得られます。つまり、解像度は5Vを256で割った値となり、1デューティーサイクル値は3.9mVに値することになります。もちろん、このコンデンサから電流を得ることもできます。大きいコンデンサほど電あつを保持する時間が長いですが、その電圧になるまでの充電時間も長く必要とします。言いかえれば、小さいコンデンサは小さい電流しか流せませんし、サイクルも小さい値でなくてはいけません。

 サイクルの求め方は、RC回路は充電するのに充電時間=4RC必要です。いま、Rが10K、Cが1uFだったとしますと、充電時間は式より40mSとなります。スタンプUの場合は1mS=1サイクルなので値は40となります。
 コンデンサの大きさにかかわらず、大きな負荷をその先につなげると、コンデンサは一瞬のうちに放電でしてしまいせっかくつくったアナログ電圧が消えてしまいます。これを解消するにはコンデンサと負荷の間にハイインピーダンス入力の増幅回路、たとえばオペアンプやコンパレータのような入力がハイインピーダンスの回路をバッファとしてつなげれば良いでしょう。オペアンプは実際にはコンデンサにまったく負荷をかけませんが、出力では大きな電流を流すことができます。
 PWMコマンドはアナログ電圧を制御する以外にも、モーターのスピードやLEDの光の量をコントロールしたりできます。
 注意しなければいけないのは出力のデューティーは平均値だということです。スタンプはこのデューティーを最小のパルス幅でコントロールします。例えばスタンプUでデューティー値128(最大の半分)にし、サイクルを1000(一秒)に設定した場合は0.5秒間隔でパルスが出るのではなく、最小の4usのHighパルスの後に4usのLow電圧がくるといったかんじです。デューティー値64(4分の一)にすると4usのHighパルスの後に12usのLow電圧がくるといったことです。
 

サンプルプログラム
PWM 8, 125, 40 '2.5Vの電圧を作成


POT

Tのみ(U、2SXはRCTIMEを参照)

文法
POT ピン番号, スケール, 変数

解説
 ピン番号で指定したピンに抵抗を間においたコンデンサをつなげ、その充電時間(出力が5Vに達するまで)によって抵抗またはコンデンサの値を測り変数に代入するコマンドです。温度センサや光センサのような抵抗値が変わるセンサーに有効です。スケールパラメータは測定するものの解像度の設定に使います。スタンプのエディタープログラムが動いている状態でAlt+Pを押すとその設定モードに入ります。

サンプルプログラム
POT 0, 100, B1
DEBUG ?B1


RCTIME

U、2SXのみ(TはPOTを参照)

文法
RCTIME ピン番号, ステート, 変数

解説
 ステートで指定した状態(1または0)に達するまでの時間を測定し、変数に代入するコマンドで、通常、抵抗値やコンデンサのキャパシタンス値を測定するのに使います。ピン番号で指定したピンと5V電源の間にコンデンサを、グランドとピンとの間に抵抗を接続して測定します。温度センサや光センサのような抵抗値が変わるセンサーに有効です。結果は変数に入れられますが、スタンプUの場合、結果の値1は600×KΩ×uFに相当します。2SXの場合、スレッショルド電圧は1.5Vではなく2.5Vなので693×KΩ×uFが結果の値1に相当します。この式からCが解っていればRを、Rが解っていればCを求められます。
←この場合はステート1(ステート0を使う場合はCをグランド,Rを5V側へ)
 RCTIMEコマンドはパルスの測定にも使えます。スタンプUは2us単位で測定し、2SXは0.8us単にで測定します。もし、結果の値が65535を超えると結果は0になります。(測定時間オーバー)また、充電がなかった場合は1になります。
 各抵抗またはコンデンサ(抵抗とコンデンサの回路をRC回路とも言う)を測定するまえにこのRC回路を放電または充電しておく必要があります。ステートが1のときはあらかじめ放電、ステートが0のときはあらかじめ充電する必要があります。通常この充電または放電には”4×抵抗値×キャパシタンス値”秒必要です。
 
サンプルプログラム
result VAR word
HIGH 8         'コンデンサ充電為、ポートをHighへ
PAUSE 1        ’充電するまで待つ
RCTIME 8,1,result  ’測定結果をresultへ代入
DEBUG DEC result


SOUND

Tのみ(U、2SXはFREQOUTを参照)

文法
SOUND ピン番号, (音程, 時間 {,音程 ,時間・・・・・})

解説
 音程で設定した音を時間で設定した長さ文出力するコマンドです。ピエゾスピーカーまたは32Ωから40Ωスピーカー(または8Ωスピーカーと32Ω抵抗を直列につなぐ)をピン番号で指定したピンにつなぎ、さらにピンとスピーカーとの間に10uFのコンデンサをつないで音を出力します。音の大きさを調整するにはボリュームと増幅回路(アンプ)を追加する必要があります。
 音程0は無音、1−127が音、128−256が高周波ノイズになります。時間”1”は12msに相当します。周波数Fの求め方は

となります。

サンプルプログラム
SOUND 0, (100,15,100,15,125,5)


FREQOUT

U、2SXのみ(TはSOUND参照)

文法
FREQOUT ピン番号, 時間, 周波数1 {, 周波数2}

解説
 1音または2音の和音をつくり出力するコマンドです。ピン番号(1〜15)で指定したピンから時間(1〜65535)で指定した時間分、周波数(0〜32767)で指定した周波数を出力します。スタンプTのSOUNDコマンドとは違い、音をつくるのにPWMを使いますので余分な高周波ノイズをとりさる必要があります。ピエゾスピーカーまたは32Ωから40Ωスピーカー(または8Ωスピーカーと32Ω抵抗を直列につなぐ)をピン番号で指定したピンにつなぎ、さらにピンとスピーカーとの間に10uFのコンデンサをつないで音を出力します。このコンデンサで余分な高周波が取り除けます。音の大きさを調整するにはボリュームと増幅回路(アンプ)を追加する必要があります。
 時間の単位はスタンプUで1ms、2SXで0.4msです。周波数はスタンプUで1Hz単位、2SXで2.5Hz単位となり、最大値は32767です(0は無音)。2和音を出したい場合は”周波数2”を記述しますタッチトーンを作りたい場合はDTMFOUTコマンドを参照して下さい。
図SB4-1

サンプルプログラム
スタンプUの場合
FREQOUT 0, 1000, 523 ' "ド”の音をピン0から1秒間出力
FREQOUT 0,1000,2500,3000 '2500Hzと3000Hzを同時にP0から1秒間出力


DTMFOUT

U、2SXのみ

文法
DTMF ピン番号, {ONタイム, OFFタイム,} [{番号,番号・・・}]

解説
 電話のトーン信号をつくるコマンドです。スピーカーをつなぐ(FREQOUTを参照)か、ドライブ回路を作り電話線につなげます。(回路例は下記参照)。ONタイムとOFFタイムパラメータはトーンをどのぐらいの長さ出力するかを設定します。最大値は65535。記述を省略した場合はデフォルト値の200ms間ONの後50ms間OFFとなります。単位はスタンプUが1ms、2SXが0.4msとなります。(スタンプUの200msは200、2SXは500となります)
 番号は0−9がそのまま0−9をあらわし、10が米じるし、11がシャープ、12−15がA−Dに相当します。(但し通常A−Dボタンは電話にはありません。)


サンプルプログラム
DTMFOUT 0,[0,3,1,2,3,4,5,6,7,8] :ピン0からダイヤル0312345678を出力


ロボット作成教室のもくじへBack

つぎへ進む

Home