訪問者数

AVR Studio4

前回のブログに対し、JinSato大先生よりコメントを頂きました。
早速、ロボコンマガジンの地下室工房を探してみることに。
おおっ、発見。ロボコンマガジンはごくたまにしか購入しないのですが、
たまたまその号は購入してありました。奇跡的だ。
ふむふむ・・・(読んでいる擬音語)

その中に興味深い記事が・・・
WinAVR+AVR Studioの環境です。
写真(画面のキャプチャ)を見る限りでは、ポートのON/OFF状態までもがグラフィカルに表示されたデバッガのようです。
すばらしい!!!この環境が僕も欲しい。
これがあれば、不具合発生時に頭の中でシミュレーションする必要がなくなります。
何より、外出先でマイコン無しでデバッグが出来るのです。
そして無料

現在はベステクのGCC Developer Liteを使用しております。
特に不便は感じておりませんでした。
さてWinAVR+AVRStudio4に乗り換えるか、そのままつかうか・・・
とても不安があります。いやなところにはまりそうな気がしています。

で、いろいろWEBで調べてみると意外と沢山のかたが使用されているようでしたので思い切ってWinAVR+AVRStudio4に切り替えることにしました。

まずはWinAVRというコンパイラらしきものをインストール。
特に何の選択も無くインスト終了。
つぎにAVRStudio4をインストール。
USBを使うか?って聞かれたようなので、使わない設定にした。

で、プロジェクト作成時にATmega128を選択して作成。
そのままコンパイル。

・・・・・エラーがいっぱい・・・・

どうやら、ヘッダファイルが微妙に違うようで、ベステクのサンプルはそのままではコンパイルできないようです。
足りないヘッダファイルをWinAVRにコピーして、何とかコンパイルができるようになりました。
PC上でのデバックも出来ているようです。いやー、すばらしいデバッガです。

あとは、実際にマイコンにダウンロードできるかどうか、最大の難関はまた明日にします。

ATmega128 PWM制御 その2

昨日PWMの制度が出ないと言っておりましたが、
どうやら私のマニュアルの読み間違いでした。
てっきり、タイマ開始でON,比較一致でOFFだと思っていました。
正解は、タイマ終了でON,比較一致でOFFでした。
この勘違いのせいで、150μsずれていました。

最初に考えていたのは、タイマを一回一回開始&終了させる
方式だったのですが、実現方法が分かりませんでした。
というよりは、タイマは開始したまま比較値を変えていくのが
一般的なような気がしてきました。
昨日のコメントで木下さんもそうしているって教えてくれたし、
基準タイマ用のタイマも節約できるし・・・

ということでやってみました。

DDRE = _BV(PINE5) | _BV(PINE4) | _BV(PINE3); // PE5-3出力
// タイマ/カウンタ3を高速PWMモードに設定 (ICR3でTOP)
TCNT3 = 0;
ICR3 = 4800 ;
OCR3A = 1800 ;
OCR3B = 3000 ;
OCR3C = 4200 ;
TCCR3A = _BV(COM3A1) | _BV(COM3B1) | _BV(COM3C1) | _BV(WGM31);
TCCR3B = _BV(CS31) | _BV(WGM33) | _BV(WGM32); // φ/8

できあがり。
2.4ms毎に、OC3Aポートから900μs,OC3Bポートから1500μs,OC3Cポートから2100μsのパルスを出力するプログラムです。
たったの数行で完成です。

あとは、比較値を制御して、PWMを各サーボに分配すれば完成!!!
(うそ・・・あとPS2と通信して、モーションエディタと通信して、デモ用のシーケンス制御作って、ジャイロ読み込んで・・・・)

ATmega128 PWM制御

今日はサーボ制御のためのPWM出力に挑戦しました。

まずはタイマ0をつかって、プログラムの基本となる間隔を作りました。間隔は2400μsです。これが8回(19.2ms)で制御の一周です。

この基本間隔を使って、
1回目で、通信やサーボ位置計算等を行い、
2回目から8回目でサーボの制御を行わせます。
サーボ制御は21個まで可能になります。

でも今日は、2400μsの間隔を作っただけです・・・


次に、PWM制御に挑戦しました。
タイマ3を使い、OC3A,OC3B,OC3Cポートに出力します。
M16Cマイコンの時には無かった概念ですが、タイマ一個で3つのPWMを出力する機能があります。
この機能を使ってみたいと思います。これならジッタフリーが実現できると思います。(このままだと3つのサーボしか制御できませんが・・・)
で、やってみたのですが、精度が出ませんでした。
精度が出ないというよりも、多分使い方が間違っているのだと思います。

最初、クロックを8分周(0.5μs)にしてやってみたのですが、0.9msや1.5msは正確に出力できているのに、2.1msを出力しようとすると2.25msになってしまいます。
今度は、クロックを64分周(4μs)にしてやってみると、0.9msは正確に出力できるけども、1.5msや2.1msではやはり150μs程度遅れてOFFしています。

なんででしょう???
基本的になにか間違っている気がします。
そもそも、このタイマは開始と停止を繰り返して使うことが許されるのだろうか・・・
現在は2.4msごとにタイマ開始、終了を繰り返しています。


ATmega128 A/D入力

ATmega128でのA/D入力をやってみました。
ADC0ポートからの読み込みです。

こんな感じで初期化して、
outb(ADMUX, 0) ;
sbi(ADMUX,ADLAR) ;
sbi(ADCSRA,ADEN) ;

こんな感じで読み込みます
sbi(ADCSRA,ADSC) ;
loop_until_bit_is_clear( ADCSRA, ADSC ) ;

できたできた。

ちょっと分かりにくかったのがoutb()とかloop_until_bit_is_clear()とかの関数達です。
どこかにマニュアルとか無いのかな・・・
使い方をヘッダファイルを読んで理解しました。

初期化時にADLARをONしています。
これは、A/D変換値10Bit中の上位8Bitのみを使用する設定です。

とりあえず加速度センサの値を読み込むことが出来ました。
一応動いていますが、間違い等があれば指摘願います。


NHKの番組で朝8:10から8:15までピタゴラスイッチというのがある。
その最初と最後に、ドミノ?みたいなコーナーがあるのですが、
それがすごいです。最近の僕の唯一(?)の楽しみです。
毎回違うのです。すごい発想力の持ち主だ。ぜひご覧ください。

その番組内のアルゴリズム体操のコーナーではたまにソニーのクリィオがでてきます。左から2番目のクリィオの向きがずれているのが気になる・・・

追記:
WEBで調べてみました。
番組内ではピタゴラ装置というそうです。慶応大学がつっくているらしい。
正式?にはルーブ・ゴールドバーグ・マシン というみたい。
ようは映画バック・トゥ・ザ・フューチャーのオープニングみたいなやつです。

ATmega128

そろそろ次回大会に向けての改良を開始します。
のんび〜りとやって行きたいと思います。

次回大会ってなんだろう??(秋か?冬か?)

まずは、次回大会に向けて何を改良するかを考えてみました。
・・・・・・全てでした・・・(笑)

一応、改良の目玉は制御ソフトの改善を行います。
だましだまし、切った貼ったで動かしてきましたが、
いろいろ無理が出てきていますし、もともとジッタやらなんやらで
納得のいくものではありません。
(その他、アルミフレームの設計もミスったところが多々あるし、
足にヨー軸も追加したいので、ほとんどが設計しなおしです。)

というわけで、特に意味は無いですが、マイコンを今までのM16Cから
ATmega128に変えようと考えています。
良くはわからないのですが、なかなか評判が良いみたい。
作りやすいとか早いとか・・・・本当かな〜

まずは、基板の作成です。


コーネリアスで使っている電源関係やセンサ関係が載っている基板を
そのまま使うので、マイコン側はとってもシンプル。
でも、結構重たいみたいです。

GCCとやらをインストールして、サンプルを実行してみました。
うごいた、うごいた。(^o^)v
ちらっと、ソースコードをのぞいてみる。
232C系の制御は便利なAPIが用意してあります。これはとっても便利。

まずは、PWM制御や、ジャイロ+加速度あたりから、作っていこうと思います。

今日はこれからJ-Classの景品で頂いた「THE ロボットつくろうぜっ!」をやってみます。テレビゲームやるのは何年ぶりだろう・・・。

Template Designed by DW99