プロが教えるわが家の防犯対策術!

AVRのATmega168とサーボモータの GWServo S03T 2BBMG を買ってWinAVRでプログラミングしようと思っています。とりあえず動かしたいと思っているので、スイッチを押したら90度曲がり、スイッチを離したら90度戻るというプログラムを書きたいです。どなたか簡単で良いので教えてください。よろしくお願いします。

A 回答 (8件)

>どなたか簡単で良いので教えてください。



まず「ATmega168」の入出力ポートに、何をどう繋いだか提示して下さい。

「ATmega168」は「汎用マイコン」ですから、入出力ポートに何をどう繋いだかは、組み立てた本人(つまり質問者さん)にしか判りません。

次に「GWServo S03T 2BB MG」と「ATmega168の入出力ポート」のスペックを提示して下さい。

「ATmega168」の入出力ポートに「GWServo S03T 2BB MG」を繋いだとしても、動くかどうかは判りません。

入出力ポートの電流・電圧が、モーターが必要とする電流・電圧に満たない場合、正しいタイミングでパルスを送り出しても、電流・電圧不足でモーターは動きません。

例えば、モーターが6Vを要求しているのに、マイコンの入出力ポートが3.5Vしか出力出来ないなら、モーターはピクリとも動かないでしょう。

その場合は、モーターとマイコンの間に「別系統の電源を持つ、モーター制御回路」が要ります。

「モーター制御回路」は「マイコンから入力した信号に従って、モーターが駆動するに充分な電流・電圧の信号をモーターに出力する」と言う、増幅回路のような物になるでしょう。

もちろん、モーター制御回路とマイコンが「どう繋がっているか」は作った本人(つまり質問者さん)にしか判りません。

なので「どういうプログラムを書けば良いかは、組み立てした本人にしか判らないので、回答したくても回答できない。回答は不可能」です。

貴方の複数の質問が連続でスルーされていたのは「回答が不可能だから」です。
    • good
    • 0
この回答へのお礼

質問の仕方が悪くてすいませんでした。自分でも色々いじくっていはいるのですがなかなかうまくいかずにいらいらしていたのかもしれません。増幅回路も考えています。それで挑戦してみます。回路はというと3端子レギュレータで5Vに落とした電圧をATmega168につなぎ動作させ、その5VとGNDそしてATmega168のPINB0からパルスを送るというそんな回路です。少し落ち着いてみます。ありがとうございました。

お礼日時:2009/05/13 01:10

お急ぎのようですが、サーボの動作を確かめたいだけならスイッチ入力など不要で、90度曲げて数秒後に戻すプログラムを作ればよいだけです。


もし、それさえもプログラムで作れないのであれば基本的なプログラムのアルゴリズムが作れないレベルなのでプログラムの勉強をされたほうが良いと思います。こちらが教えても理解できるレベルに達していない可能性が高いです。

理解レベルを知りたいので逆に質問しますが、GWServo(GWS Servo?) S03T 2BBMGサーボを90度曲げるにはどんな信号を出せば良いか分かりますか?なるべく正確に答えてください。
    • good
    • 0
この回答へのお礼

まずサーボモータには3つの線があり、1に5V、2にGND、3にPWM信号を送る必要がある。そしてPWMは20ms間隔の信号でパルスを送る。確か1.5msくらいで中間だったかな、1ms出力したら19ms出力を停止する。2msなら18msのように20msの間隔を守って動かす。ということはわかります。ただdelayで間隔を作るのかと考えていたので、それ以外のコマンドがあるのかは知りません。サーボ制御についてはこれくらいしか知識がありません。

お礼日時:2009/05/13 01:16

こんにちは。

先日の http://okwave.jp/qa4943054.html の続きですよね。

RC用のサーボモータを制御するために必要な回路と、制御信号の仕様は前回の回答で書いたリンク先にあるとおりです。

> スイッチを押したら90度曲がり、スイッチを離したら90度戻るというプログラム

基本的な枠組みだけ書きます。

<< メイン関数 >>
 I/Oポートを初期化する。
 PWM出力に使うタイマを初期化する。
 タイマ動作を開始する。
 while(1){
   スイッチの状態をチェックする。
   スイッチが押されている場合
     PWMのHレベル信号を90度相当の時間になるようカウンタをセットする。
   スイッチが押されていない場合
     PWMのHレベル信号を0度相当の時間になるようカウンタをセットする。
 }

上記について、分からない部分をまたご質問ください。
    • good
    • 0
この回答へのお礼

協力してくれてほんとにありがとうございます。なんだか他力本願の自分が情けなく思えてきました。自分は確かに出力設定とdelayくらいしかわかっていないのだと思います。スイッチでLEDをチカチカさせることが出来、次はサーボモータが出来るかなといった感じで始めたので、少し早すぎるのでしょうか?基本的な枠組みありがとうございました。ですが初期化とかチェックとか日本語だとイメージしづらいころでもあります。確かにわかあるのはスイッチが押されているか押されていないかはif文だなというくらいです・・・

お礼日時:2009/05/13 01:24

>まずサーボモータには3つの線があり、1に5V、2にGND、3にPWM信号を送る必要がある。

そしてPWM は20ms間隔の信号でパルスを送る。確か1.5msくらいで中間だったかな、1ms出力したら19ms出力を停止する。2msなら18msのように 20msの間隔を守って動かす。ということはわかります。

これは合ってますね。

>ただdelayで間隔を作るのかと考えていたので、それ以外のコマンドがあるのかは知りません。サーボ制御についてはこれくらいしか知識がありません。
それは知識不足ですね。タイマを理解することが必要です。特にタイマを使ったPWM信号の生成の仕組みを理解しないと話しになりません。

>で、少し早すぎるのでしょうか?基本的な枠組みありがとうございました。ですが初期化とかチェックとか日本語だとイメージしづらいころでもあります。確かにわかあるのはスイッチが押されているか押されていないかはif文だなというくらいです・・・

うーん。C言語のプログラムの勉強がぜんぜん足りません。
Interestさんの書かれた基本的な枠組みからプログラムコードが浮かばないようなら、まずC言語の勉強をしてください。
WindowsでC言語の学習が出来ます。
「環境の準備」
http://journal.mycom.co.jp/articles/2008/06/17/C …
「苦しんで覚えるC言語」
http://homepage3.nifty.com/mmgames/c_guide/

>スイッチでLEDをチカチカさせることが出来、次はサーボモータが出来るかなといった感じで始めたので、少し早すぎるのでしょうか?
はい早すぎると思います。
例えば、SWを1回押したらLEDをON、もう一度押したらLEDをOFFという制御は出来ますか?
それか、SWをダブルクリックしたときのみLEDをONにするとか。これらのプログラムが浮かばないなら勉強不足で、サーボを制御するのはまだ早いです。
    • good
    • 0
この回答へのお礼

出してもらった問題はわかりますね。自分がわからないのはたぶんタイマだと思います。タイマ=delayって感じです。

お礼日時:2009/05/13 22:55

> スイッチでLEDをチカチカさせることが出来、次はサーボモータが出来る


> かなといった感じで始めたので、少し早すぎるのでしょうか?

私はそれで充分準備ができていると思います。今必要なのはPWM信号を発生させるためのタイマの使い方という組み込み系特有の知識であって、Windows上で動く一般的なC言語の知識ではありません。したがって、ポインタや構造体など理解していなくても関係ありません。(後で必要になるとは思いますが。)

> 増幅回路も考えています。

RCサーボを制御するのに増幅回路は不要です。また、ダブルクリックは考えない方が良いと思います。

> 初期化とかチェックとか日本語だとイメージしづらいころでもあります。

ではもう少し具体的に書いてみます。

■ I/Oポートを初期化する。
 スイッチが接続されるポート(端子)を入力ポートに設定する。
 RCサーボ制御信号が接続されるポート(端子)を出力ポートに設定する。

■ PWM出力に使うタイマを初期化する。
■ タイマ動作を開始する。
■ PWMのHレベル信号を0度 / 90度相当の時間になるようカウンタをセットする。
 ここを参照。これが分かれば今回の問題が解決します。英語なのでがんばってください。
 http://mil.ufl.edu/~achamber/servoPWMfaq.html
 http://avrbasiccode.wikispaces.com/Atmega168

■ スイッチの状態をチェックする。
 スイッチが接続されたポートの状態を読み出す。

通常は、スイッチが押されていれば1、押されていなければ0ですね。

必要な処理は、以上です。
    • good
    • 0
この回答へのお礼

なんか本当にありがとうございます。I/Oポートは理解できています。たぶん自分が理解出来ていないのはタイマでしょうね。タイマ=delayって感じです。delay以外に何かあるのですか?

お礼日時:2009/05/13 22:52

>delay以外に何かあるのですか?


組み込みマイコンの最重要部品の一つで組み込みタイマがあります。ATmega168のデータシートに書いてあるはずですが。

こちらで日本語データシートを見つけました。
http://reef.path.ne.jp/~hero/hero.htm
内部RC発信だと、クロックは8Mhzのようですね。
タイマも含めてデータシートは理解できるようになってくださいね。

で、SW制御が出来るプログラムレベルでパルス信号が作れないのも不思議です。とりあえずタイマの前にdelay()でも不正確ながらRCサーボ一個なら操れるはずですので、もし動かないならば根本的な間違いをしている可能性があります。
確認のため補足の形でソースを示してもらえますか。
(1)SW処理はいりません。
(2)周期は20ms周期です。
(3)パルスは1.5msでお願いします。
(4)無限ループで繰り返してください。

この回答への補足

周期の作り方がわかりません

補足日時:2009/05/16 13:28
    • good
    • 0

> タイマ=delayって感じです。

delay以外に何かあるのですか?

Atmega168の場合、16-bit Timer/Counter を使うと次のようなことができます。

- 正確な実行タイミングで処理を実行させる(割り込みを使用)
- 正確な時間周期で信号波形を出力する (PWMモード)
- 外部信号を計測する(カウンタ)
詳しくは、AVRハードウェアマニュアルの107ページ以降を参照してください。
http://www.atmel.com/dyn/resources/prod_document …

もちろん、delayを作るためにタイマを使うこともできます。しかし、それはもったいない使い方です。今回、RCサーボを制御するために必要なPWM信号などはタイマを使うべき処理で、その具体的な使い方をソースコード付きで解説しているページを先ほどの回答で紹介しました。

タイマの使い方が理解できれば、その他のCPU内蔵周辺回路も容易に理解できるようになると思います。マイコンのプログラミングを理解する上で一番大切なところですので、諦めず取り組んでください。
    • good
    • 0
この回答へのお礼

16ビットカウンター勉強してみます

お礼日時:2009/05/16 13:30

#6のzwiです。


>周期の作り方がわかりません

無限ループとdelayを繰り返すだけですけど。ヘッダや初期化やF_CPUの定義は省略して有ります。
int cycleT;
int pulsT;
cycleT = 20000;
pulsT = 1500;
while(1) {
// ポートをON。ここは自分で書いてください。
_delay_us(pulsT);
// ポートをOFF。ここは自分で書いてください。
_delay_us(cycleT-pulsT);
}
このプログラムは分かりますか?
分かったらほかの部分を補完して書き込んでください。
    • good
    • 0
この回答へのお礼

とうとう動かすことが出来ました。今回協力いただいて本当にありがとうございます。プログラムを書きたかったんですがどうも入りきらないようで。ですが「16 bit timerで1秒を計る」に1秒計れるプログラムを書きましたのでそれを50分の一にして20msを作りました。協力いただいて本当にありがとうございました。

お礼日時:2009/05/17 14:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!