10: 2010-01-19 (火) 15:52:14 eid7gud  |
現: 2010-01-20 (水) 21:33:04 takaboo  |
| | 処理の流れを図にしましょう。 | | 処理の流れを図にしましょう。 |
| | #ref(AutomaticDoor_14.png,100%) | | #ref(AutomaticDoor_14.png,100%) |
| - | Chapter2との違いはブザーを鳴らす代わりに、センサ値が閾値以上ならバーを開け、閾値以下ならバーを閉じるという所です。人が来てバーが開い後、直ぐ閉じてしまうと困るのでその後に少し待機します。 | + | Chapter2との違いはブザーを鳴らす代わりに、センサ値が閾値以上ならバーを開け、閾値以下ならバーを閉じるという所です。人が来てバーが開いた後、直ぐ閉じてしまうと困るので少しの間待機させます。 |
| | | | |
| | **準備 [#o28e1018] | | **準備 [#o28e1018] |
| | GCC Developer Liteを起動して、Chapter2で作成した警報器のプログラムを開いて下さい。~ | | GCC Developer Liteを起動して、Chapter2で作成した警報器のプログラムを開いて下さい。~ |
| | | | |
| - | メニューの「ファイル」 -> 「開く」 -> ファイル(AlarmUnit.c)選択しを「開く」~ | + | メニューの「ファイル」→「開く」→ ファイル(AlarmUnit.c)を選択し、「開く」をクリックします。~ |
| | | | |
| | #include <fd.h> | | #include <fd.h> |
| | #define KEY_QUIT { if(fd_rx_buff()) fd_SoftReset();} | | #define KEY_QUIT { if(fd_rx_buff()) fd_SoftReset();} |
| | + | |
| | void main (void) { | | void main (void) { |
| | uint8_t ReadData; | | uint8_t ReadData; |
| | + | |
| | fd_Init (0, BT_CONSOLE, FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP, 7.4); | | fd_Init (0, BT_CONSOLE, FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP, 7.4); |
| | + | |
| | while (1) { | | while (1) { |
| | fd_DXReadByteData (100, 27, &ReadData); | | fd_DXReadByteData (100, 27, &ReadData); |
| | ファイルを別の名前で保存しましょう。 | | ファイルを別の名前で保存しましょう。 |
| | | | |
| - | メニューの「ファイル」 -> 「名前を付けて保存」 -> ファイル名に「AutomaticDoor.c」と入力して適当なフォルダの中へ「保存」 | + | メニューの「ファイル」→「名前を付けて保存」→ファイル名に「AutomaticDoor.c」と入力し、適当なフォルダに「保存」します。 |
| | | | |
| | **ブザーを鳴らす部分を削除 [#ma9b92ad] | | **ブザーを鳴らす部分を削除 [#ma9b92ad] |
| | **バーを開ける [#icc81839] | | **バーを開ける [#icc81839] |
| | #ref(AutomaticDoor_16.png,100%) | | #ref(AutomaticDoor_16.png,100%) |
| - | センサ値と閾値を比較するif分の { } の中に | + | センサ値と閾値を比較するif文の{ }の中に |
| | fd_DXWriteWordData (1, 30, 300); | | fd_DXWriteWordData (1, 30, 300); |
| | と入力して下さい。 | | と入力して下さい。 |
| | fd_DXWriteWordDataは関数名です。 | | fd_DXWriteWordDataは関数名です。 |
| | | | |
| - | ''第1引数''はDynamixelのIDです。付属のAX-12+のIDは1です。 | + | ''第1引数''は、DynamixelのIDです。付属のAX-12+のIDは1です。 |
| | | | |
| - | ''第2引数''はAX-12+のコントロールテーブルのアドレスです。[[AX-12+コントロールテーブル>FDIII-HC Starter Kit Guide Chapter1.1#xa86a787]]を見て下さい。AX-12+のホーンの位置の指令は、アドレス30と31のゴールポジションにデータを書くことで行います。~ | + | ''第2引数''は、AX-12+のコントロールテーブルのアドレスです。[[AX-12+コントロールテーブル>FDIII-HC Starter Kit Guide Chapter1.1#xa86a787]]を見て下さい。AX-12+のホーンの位置の指令は、アドレス30と31のゴールポジションにデータを書くことで行います。~ |
| | ゴールポジションはアドレス2つ分(2バイト)で表されます。2バイトのデータで表されているので、fd_DXWriteByteData関数(1バイドのデータを書き込む)ではなく、fd_DXWriteWordData関数(2バイドのデータを書き込む)を使います。 | | ゴールポジションはアドレス2つ分(2バイト)で表されます。2バイトのデータで表されているので、fd_DXWriteByteData関数(1バイドのデータを書き込む)ではなく、fd_DXWriteWordData関数(2バイドのデータを書き込む)を使います。 |
| | | | |
| - | ''第3引数''は書き込む値(ここではコールポジション)です。 | + | ''第3引数''は、書き込む値(ここではコールポジション)です。 |
| | #ref(AutomaticDoor_18.png,100%) | | #ref(AutomaticDoor_18.png,100%) |
| | AX-12+のホーンは図のように0°から300°まで回転します。ゴールポジションの値は0°なら0、中心の150°なら512、300°なら1023になります。~ | | AX-12+のホーンは図のように0°から300°まで回転します。ゴールポジションの値は0°なら0、中心の150°なら512、300°なら1023になります。~ |
| | |CENTER:BGCOLOR(red):||c | | |CENTER:BGCOLOR(red):||c |
| | | :idea:|AX-12+のホーンの角度によっては、フレームとAX-12+、又はフレームと自作ケースが干渉します。干渉が起こるようなゴールポジションを指定した場合、機器の破損の原因となります。必ず設定するゴールポジションが干渉が起こらない範囲内にあることを十分確認して下さい。| | | | :idea:|AX-12+のホーンの角度によっては、フレームとAX-12+、又はフレームと自作ケースが干渉します。干渉が起こるようなゴールポジションを指定した場合、機器の破損の原因となります。必ず設定するゴールポジションが干渉が起こらない範囲内にあることを十分確認して下さい。| |
| - | | |
| | | | |
| | **if~ else~ [#e4c030b4] | | **if~ else~ [#e4c030b4] |
| | #ref(AutomaticDoor_20.png,100%) | | #ref(AutomaticDoor_20.png,100%) |
| - | if文後の{}の後に else {} と入力します。(if文について詳しくは[[Chapter1.4のif文>FDIII-HC Starter Kit Guide Chapter1.4#c6144380]]をご覧下さい。)~ | + | [[if文>FDIII-HC Starter Kit Guide Chapter1.4#c6144380]]後の{}の後に else {} と入力します。~ |
| | | | |
| - | if文の () 内の条件以外の場合は、elseの{}内を実行します。ここでは「センサ値が閾値(100)より大きい場合を除く」、つまり「センサ値が閾値以下の場合」else 内を実行するということなります。 | + | if文の()内の条件以外の場合は、elseの{}内を実行します。ここでは「センサ値が閾値(100)より大きい場合を除く」、つまり「センサ値が閾値以下の場合」else 内を実行するということなります。 |
| | | | |
| | **バーを閉じる [#sd8759fe] | | **バーを閉じる [#sd8759fe] |
| | **少し待つ [#q859211e] | | **少し待つ [#q859211e] |
| | #ref(AutomaticDoor_22.png,100%) | | #ref(AutomaticDoor_22.png,100%) |
| - | else の {} の後に | + | else の{}の後に |
| | fd_Wait (2000); | | fd_Wait (2000); |
| | と入力して下さい。 | | と入力して下さい。 |
| | fd_Waitは関数名です。 | | fd_Waitは関数名です。 |
| | | | |
| - | ''第1引数''は待つ時間(ms)です。ms(ミリ秒)は1000分の1秒です。つまり1000と入力すると1秒待機します。ここでは2秒待機させるために2000と入力しました。 | + | ''第1引数''は、待つ時間(ms)です。ms(ミリ秒)は1000分の1秒です。つまり1000と入力すると1秒待機します。ここでは2秒待機させるために2000と入力しました。 |
| | | | |
| | **トルクリミットの設定 [#a3422d73] | | **トルクリミットの設定 [#a3422d73] |
| | AX-12+に負担が掛かりギアがかけてしまいます。~ | | AX-12+に負担が掛かりギアがかけてしまいます。~ |
| | | | |
| - | そうならないようにテスト動作の際はAX-12+のトルクリミットを下げます。トルクリミットとはホーンを動かす力の最大値です。ホーンが回りにくい時、AX-12+は頑張ってホーンを回そうと力を入れます。その力を制限することで壊れることを防ぎます。~ | + | そうならないようにテスト動作の際はAX-12+のトルクリミットを下げます。トルクリミットとはホーンを動かす力の最大値です。ホーンが回りにくい時、AX-12+は頑張ってホーンを回そうと力を入れます。その力を制限することで壊れることを防ぎます。それでもAX-12+に負担になりますので予期せぬ動きをした場合は、直ぐに電源を切るようにしましょう。 |
| - | ただそれでもAX-12+に負担になりますので予期せぬ動きをした場合は、直ぐに電源を切るようにしましょう。 | + | |
| | | | |
| | #ref(AutomaticDoor_24.png,100%) | | #ref(AutomaticDoor_24.png,100%) |
| | 一通りプログラムが完成しました。FDIII-HCにプログラムを書き込んで動かしてみましょう。~ | | 一通りプログラムが完成しました。FDIII-HCにプログラムを書き込んで動かしてみましょう。~ |
| | | | |
| - | 書き込み方法は[[前章>FDIII-HC Starter Kit Guide Chapter2.4#ybaa88fa]]などを参考にして下さい。~ | + | 書き込み方法は[[Chapter2.4>FDIII-HC Starter Kit Guide Chapter2.4#ybaa88fa]]などを参考にして下さい。~ |
| | | | |
| | 動かして見て気になる点は無いでしょうか? | | 動かして見て気になる点は無いでしょうか? |
| | #ref(AutomaticDoor_25.png,100%) | | #ref(AutomaticDoor_25.png,100%) |
| | 人がセンサの前に立ってから、バーが開くまでにちょっと時間が掛かっているのが気になりませんか? | | 人がセンサの前に立ってから、バーが開くまでにちょっと時間が掛かっているのが気になりませんか? |
| | + | |
| | **プログラムの修正 [#wfed4549] | | **プログラムの修正 [#wfed4549] |
| | #ref(AutomaticDoor_14.png,100%) | | #ref(AutomaticDoor_14.png,100%) |
| | プログラムの流れを書いた図を見てみましょう。 | | プログラムの流れを書いた図を見てみましょう。 |
| - | センサ値取得 -> 閾値と比較 -> バーを開く/閉じる -> 少し待つ(2秒) -> センサ値・・・というようにループしています。~ | + | センサ値取得 → 閾値と比較 → バーを開く/閉じる→少し待つ(2秒) → センサ値・・・というようにループしています。~ |
| | つまり毎回2秒待っているため、センサの値を2秒に1回しか見ていないということになります(他の処理は殆んど一瞬で終わっています)。よって人がセンサの前に立っても、最悪2秒間はバーが開かないのです。 | | つまり毎回2秒待っているため、センサの値を2秒に1回しか見ていないということになります(他の処理は殆んど一瞬で終わっています)。よって人がセンサの前に立っても、最悪2秒間はバーが開かないのです。 |
| | #ref(AutomaticDoor_26.png,100%) | | #ref(AutomaticDoor_26.png,100%) |
| | #include <fd.h> | | #include <fd.h> |
| | #define KEY_QUIT { if(fd_rx_buff()) fd_SoftReset();} | | #define KEY_QUIT { if(fd_rx_buff()) fd_SoftReset();} |
| | + | |
| | void main (void) { | | void main (void) { |
| | uint8_t ReadData; | | uint8_t ReadData; |
| | + | |
| | fd_Init (0, BT_CONSOLE, FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP, 7.4); | | fd_Init (0, BT_CONSOLE, FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP, 7.4); |
| | fd_DXWriteWordData (1, 34, 150); | | fd_DXWriteWordData (1, 34, 150); |
| | + | |
| | while (1) { | | while (1) { |
| | fd_DXReadByteData (100, 27, &ReadData); | | fd_DXReadByteData (100, 27, &ReadData); |
| | 修正が完成しました。FDIII-HCにプログラムを書き込んで動かしてみましょう。~ | | 修正が完成しました。FDIII-HCにプログラムを書き込んで動かしてみましょう。~ |
| | | | |
| - | 書き込み方法は[[前章>FDIII-HC Starter Kit Guide Chapter2.4#ybaa88fa]]などを参考にして下さい。~ | + | 書き込み方法は[[Chapter2.4>FDIII-HC Starter Kit Guide Chapter2.4#ybaa88fa]]などを参考にして下さい。~ |
| | | | |
| - | 如何でしょうか?バーを開いた後の待機時間が2秒では短く感じませんか?~ | + | 如何でしょうか?~ |
| - | もし短かったら、fd_Waitの引数を増やして、再び書き込んで下さい。 | + | バーを開いた後の待機時間が2秒では短いと感じませんか?~ |
| | + | もし短かったら、fd_Waitの引数を増やして再び書き込んで試してみて下さい。 |
| | | | |
| - | このように、ある程度プログラムができたら、動かして見て、気になる所を修正して、また動かして見て・・・を繰り返すことで納得できるプログラムを作って行きます。 | + | このように、ある程度プログラムが作成できたら動作確認と修正を繰り返します。そうすることで納得できるプログラムの完成となるわけです。 |
| | | | |
| | [[次のチャプターへ>FDIII-HC Starter Kit Guide Chapter3.4]]~ | | [[次のチャプターへ>FDIII-HC Starter Kit Guide Chapter3.4]]~ |
| | | | |
| | [[FDIII-HC Starter Kit Guide]]へ戻る | | [[FDIII-HC Starter Kit Guide]]へ戻る |