2017年3月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

2017年3月20日 (月)

赤外線リモコンの制御 3.DCモーター制御

次はDCモーター制御にとりかかる。

1.DCモーター制御IC
 制御ICには正負反転も可能なTA8428K(S)を使用。IN1,IN2の制御で前進・後退ができる。
ここで制御信号にPWMを与えるとパルスのデューティーによって駆動力が変化できるという方式だ。うまくいくだろうか。

2.ダミーロードによるプログラムの動作確認
 駆動電圧ははじめ5Vを使用し、モーター駆動電圧が思ったとおり得られるか調べるために、ダミーロードとしてLEDを駆動してみる。
 予定通りPWMのデューティーによって明るさを変えることができ、また電流も逆方向へ流すこともできた。

3.DCモーターの駆動
 いよいよDCモーターを接続し、赤外線リモコンを押してみる。動いた!

あり?ほかのボタンが効かない。とめることができない。LEDではうまくいったのに。
シンクロスコープでモーター波形を見てみるとスパイクノイズが目いっぱい発生している。それはそうだよね。モーターと制御回路の電源を別にするとうまく制御できる。モーターのノイズが制御回路の誤動作を引き起こしていたのだ。

 カットアンドトライで試してみた結果、モーターの電源部にLCを挿入、さらにモーター出力にCを挿入すれば誤動作が起きなくなった。
Atmega168p_dcm001

4.動画はこちら
https://youtu.be/BQsqEs0nlbk

 前後左右、ターン、速度制御などできるようになった。

今回使用した機構部品は、
TAMIYAの ツインモーターギヤーボックス ITEM70097**840

リモコンは SONYのオーディオシステムRM-S550リモコン
オーディオ用のリモコンでは操作性がよくないので、JOYスティックを使用したいところだ。

実験は続く

2017年2月11日 (土)

赤外線リモコンの制御 2.割込みによるLCD表示方法の変更

LCD表示では前回コマンドの処理時間を見計らって次のコマンドを送る必要がある。

 初めに作ったプログラムではまだタイマー割込みを学ぶ前だったので、ディレイルーチンを用いて処理時間間隔を空けていた。
 これまで作ったいくつかのプログラムのデバッグ中にLCD表示のディレイルーチンが主処理のタイミングを狂わせ、うまくいかないことが幾度となく発生している。
 今回赤外線リモコンでも割込みを多用しており、影響が出たので対処の必要性に迫られた。

 そこで、ディレイルーチンの使用を抑えてLCD表示ルーチンが主処理に与える影響を抑えるために、割込みでコマンドの発行間隔を空けることにした。

 デバッグを重ねること「ん」回。ディレイルーチンを使わずに表示できるようになった。
タイマー間隔はコマンドの処理時間を考慮して2msとした。カーソルが動いて目がちかちかするのでカーソル表示をオフにすると、表示が落ち着いた。

 いまは何度も繰り返し表示指示を送っているが、データが更新された時だけ指示を送ればよいので、表示プログラムをもう少しブラシアップしたい。

2017年2月 8日 (水)

赤外線リモコンの制御 1.基礎動作確認編

回路図を組んで基礎動作の確認を行った。
Atmega168p_dcm001
 回路自体は難しくないが、いろいろな機能を組み込もうとすると、各ポートで得意分野があるのでこれを活かすように振り分けてやる必要がある。

 今回の機能は次のものを割り当ててみた。左上から、
1.赤外線センサー INT0でパワーダウンスリープ中の割り込みも受付可能。
 内部タイマー1でパルス幅を測定し1/0を判定する。
2.USARTインターフェース PCと動作条件や測定結果などをやり取りする予定。
3.正確なタイマー割込み用に32.768KHzクリスタル発振子を取り付ける。
 タイマー2と併用して今後RTCへの応用が期待できる。
 クリスタル両端のコンデンサーはMCU内部容量でまかなうため不要。
4.モータードライブ タイマー0のA,B出力を用いて左右モーターをPWMで駆動する予定。
 前進後退用にポートを割り付ける。
5.センサー用にアナログ入力ポートを2個準備。
6.デバッグ用にLCDを接続。
7.オンボードプログラム用にコネクタを接続。

 いまのところ基礎動作確認ということで32.768KHzクリスタル発信と、赤外線センサーの受信プログラムを作ってみた。
 赤外線リモコンには昔使っていたソニーのミニコンポ用RM-S550。測定してみると12bitで現在の家電協フォーマットとは異なるシンプルな作りだが、今回のような基礎実験には、もってこいであった。
 受信も安定して12bitを捕らえられるようになり、あとは家電協フォーマットに拡張すればよいのであるが、どうせ個人用であるから、ソニー製品が誤動作しないように多少変更して、このまま簡単なフォーマットのままでもよいかもしれない。

2017年1月22日 (日)

赤外線リモコンの制御 0.予告編

 赤外線リモコンが面白そうなので、チャレンジすることに。
部品は取り寄せ済みで回路自体は難しくなさそう。

1.リモコン受信結果を表示
2.モーター駆動

などやってみようと思う。

*****

 余談だが、AVRISP(プログラマ:2013年時点で\3200)をもう一台ほしいと思って探してみるが、どうも生産中止になったらしく見当たらない。
 変わりにICEがあるようだが\7600と倍の値段がする。AVRISPと違ってデバッグまでできるようなので、開発効率を考えるとこちらのほうが得かもしれません。
 とりあえず今のところ必要がないのでAVRISPを駆使して開発を続けたいと思います。

2016年12月18日 (日)

AVRワンチップマイコンExcel通信 その3 グラフ化編

その後通信が安定しないために、オーバーランエラーが多発し、連続読取がうまくいかない現象となった。いろいろ試してみると割込み禁止・許可のタイミングがうまくないことが分かった。
 割込み禁止中の処理、ディスプレイ表示などに時間がかかりすぎて割り込みが許可される前に次の受信データが来てしまい、オーバーランとなっていることが判明。

 そうと分かれば割込み禁止・許可のタイミングをうまくとればよいのだ。そもそもメインループ中に禁止の必要があったのか?と自問し、メインループ中の割込み禁止をはずすとすんなり受信してくれるようになった。

 次はExcelの仕掛けにかかる。
周波数を指定して、ADCの値を読み取る。
周波数はExcelの表に指定して、バイナリー転送用に4つの16進変数に分割する。
応答はセットした周波数とADC4,5の読取値、およびエラー発生時のステータスレジスタの値をいったんExcelのセルに保存し、これを計算式で周波数、ADCの電圧値へと変換する。これを連続して行う。

 このようにして次のようなグラフが得られた。
20161217dds
 SWRとIMPのグラフが共に7.060MHz付近で同調していることを示している。
校正を行っていないので値を直読できるものではないが、アンテナの周波数特性をよく捕らえていることが分かる。
 このアンテナは当局のベランダアンテナで、半分ホイップ・半分針金10mのもの。
CWが主体なのでもう少し低い周波数に調整する必要がある。

 このグラフの自動測定では、ボタンを押して約10秒で再測定ができる。

2016年12月 4日 (日)

AVRワンチップマイコンExcel通信 その2 USART編

 次にMCUのUSART関連のプログラム作成にかかる。

1.定数やデータなどを宣言
//*** USART ***
#define FOSC F_CPU     /* MCUクロック周波数 */
#define BAUD 1200          /* 目的USARTボーレート速度 */
#define MYUBRR FOSC/16/BAUD-1     /* 目的UBRR0値 */

    unsigned char TxD_Count = 5,TxD_Ptr = 0,TxD_Data[128];
    unsigned char RxD_Count = 5,RxD_Ptr = 0,RxD_Data[128];

クロックが1MHzなので早いスピードだとボーレートの誤差が大きくなるので1200bpsとする。
バッファはこれほど大きい必要はない。使用する分だけでいいだろう。

2.初期化ルーチン
void USART_Init(unsigned short baud)
{
    UBRR0H = (unsigned char)(baud>>8);     /* ボーレート設定(上位バイト) */
    UBRR0L = (unsigned char)baud;     /* ボーレート設定(下位バイト) */
    UCSR0C = (1<<USBS0)|(3<<UCSZ00);     /* フレーム形式設定(8ビット,2停止ビット) */
    RxD_Ptr = 0;
    UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);     // 送受信許可
}

 マニュアルの例題を元に作成。受信バッファのポインタも初期化しておく。

3.デバッグ用送信ルーチン
void USART_Transmit(unsigned char data)    //    for Debug
{
     while ( !(UCSR0A & (1<<UDRE0)) );     /* 送信バッファ空き待機 */
     UDR0 = data;     /* データ送信(送信開始) */
}

こちらもマニュアルを参考に作成しておく。割り込みを使わず送信できるので、受信ルーチンのテストで折り返しを行うために用いる。

4.受信ルーチン
ISR(USART_RX_vect){

    if(UCSR0A & (1<<RXC0)){
        // Framing Error, Data OverRun, USART Parity Error --- Dummy Read
        if(UCSR0A & ((1<<FE0) | (1<<DOR0) | (1<<UPE0))){
            RxD_Data[RxD_Ptr] = UDR0;
        }else{
            RxD_Data[RxD_Ptr] = UDR0;
            RxD_Ptr++;
            if(RxD_Ptr >= RxD_Count){
                RxD_Ptr = 0;
                Status = 12;
            }
        }
    }
}
 エラー処理はダミーで読み取るだけのもの。規定の受信バイト数に達したらステータス番号を切り替えて次の処理へ移行する。

5.送信ルーチン
ISR(USART_UDRE_vect){

    if(UCSR0A & (1<<UDRE0)){     // 送信バッファ空き待機
        UDR0 = TxD_Data[TxD_Ptr];
        TxD_Ptr++;
        if(TxD_Ptr >= TxD_Count){
            UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);     // 割込停止
            Status = 14;
        }
    }
 送信バッファエンプティで割り込みが発生しているのだから、さらにUDRE0をチェックする必要はなさそうだが...まあ、入れてみた。
こちらも規定の送信バイト数に達したらステータス番号を切り替えて次の処理へ、アイドル状態へ戻す。
 まだまだ完成形には程遠いが、これをベースにレベルアップしていこう。

 Excelから5バイト送信したデータが、ふたたびExcelに戻ってくるようになったので、今度はDDSの発信周波数を3バイトに変換してExcelへ送出し、Excelで受信したデータを周波数に変換すると、DDSの周波数を読み取ることができるようになった。

 次はExcelから指定した周波数をMCUで受信し、その周波数をDDSにセットすることにしよう。またMCUのADCデータも受信できるようにすれば、
 Excel → MCU → DDS → アンテナ → 検波 → ADC → Excel
と指定した周波数でのリターン電力を測定できるようになり、これをグラフ化すればアンテナの周波数特性を自動計測できそうだ。

2016年11月27日 (日)

HK-802ほこりカバーの製作

先日友人のMさんからHK-802をいただいた。
こんな素敵なものをどうもありがとうございました。
滑らかなキータッチ、輝く黄銅色、繊細な打鍵音。つい、うっとり。
初期型とのことで、左に見えるショートバーとでもいうのかな、これがついているのが特徴らしい。
Dsc00404 Dsc00405
ホコリがつきにくいように透明プラスチックのケースを加工してカバーを作った。
後ろに見えるダイソーの\100ケースがあつらえたようにサイズがマッチ。
少し小さいのでなんとかかぶせている程度なのだが、まあ自宅で使うので十分だろう。
製作記事というほどではない。

ついでにベンチャーキーにただかぶせていただけのケースにも鋸をいれて、かぶせたままで打鍵できるように加工した。ケースを前にずらせば全体を収納できる。
Dsc00407 Dsc00406

2016年11月14日 (月)

AVRワンチップマイコンExcel通信 その1 EasyComm編

 MCUで蓄えたデータをExcelに吸い上げたり、ExcelのデータをMCUに転送できればとても便利だろう。各種センサーのデータを時系列に蓄えておいて後でExcelに取り込み解析するとか、MCUの動作パラメータをExcelで流し込むとか、応用は幅広いと思われる。

 

MCUのシリアルポートは実験済みだが、あいにくHDDのクラッシュとともにソースプログラムが消えてしまった。復習とサブルーチンの再生を兼ねてExcelとデータをやり取りするシステムを作る。

 Excelでシリアルポートを使用するにはインターフェースモジュールを用いてこれをVBAで制御すればよい。WebでサーチするとEasyCommなるものが目に付いた。ダウンロードしてみると細かな解説が付属しており、とても理解しやすい。
 RTSなどの制御線を操作してみると簡単に扱うことができた。シンクロで計測すると送信データもTxDに送出されているようだ。試しにTxDとRxDをショートしてデータを送出すると、見事に送出した文字列を受信することができた。
これを使ってみようと思う。

Sub COMTEST_20161110()

    ec.COMn = 5
    ec.Setting = "4800,n,8,1"
    ec.HandShaking = ec.HANDSHAKEs.RTSCTS
    ec.Delimiter = ec.DELIMs.CrLf
'    ec.OutBuffer = 100& * 1024&

    ec.RTSCTS = False
    MsgBox "OK! COMn = " & ec.COMn

    ec.AsciiLine = "*TRG* CQ CQ CQ DE JH6JRN K"

    ec.RTSCTS = True
    MsgBox "OK! COMn = " & ec.COMn

    a$ = ec.AsciiLine
    MsgBox a$

    ec.COMn = -1

End Sub


 プロトコルを固めるためにまずはMCUにLCDを接続して送出したデータをきちんと受け取れるか確認してみたい。

2016年10月30日 (日)

AVRワンチップマイコン Knight Rider

ナイト2000:80年代にヒットしたアメリカのドラマに出てくるドリームカー
なつかしいでしょ。

 まったくもって今更感がものすごいのだが、以前から作成したいものにあげていたので赤のLEDを並べて作ってみた。

回路図は以下の通りMCUで直接駆動
Atmega168p_knight_rider

動画はこちら
Knight Rider LED

2016年10月10日 (月)

アナログインターフェースの製作 その1KENWOOD

友人のコンテスターKさんがJT65が面白そうというのでアナログインターフェースを製作した。

 はじめはボリュームでレベル調整できるようにしてみたが、PCのLINE入力を使用すると特にレベルを絞る必要もないのかとも思える。

 そこで全くシンプルに直結するケーブルを作成TS-690で使用してみたところまずまずのようだ。レベルを絞りたい時にはRFを絞れば良い。(AFボリュームではACC2の出力はコントロールできない。その方が好都合ではある。)
Dsc00403

 しばらくRTTYやJT65などをワッチしてみたいと思う。
Jt6520161010_2

2016.10.14追記
 TS-690はRFレベル調整ができるので問題なかったが、IC-706ではATTでしか受信レベルのコントロールができない。パソコン側をLine入力とし、レベルコントロールで落としてやるとなとかノイズが抑えられた。

«DAIWA PS304の修理