ホーム | 電子工作 | 腕ロボット | 二足歩行ロボット | 無線コントローラ | 工作機械 | 動画 | 自作ソフト | Web作成 | テキスト | その他 |
teraterm 16進表示(2016年4月) |
![]() マイコンの通信プログラムを作っていると、数値がキチンと送られているかを検証したい場合があります。 この検証のためにターミナルソフト、Teratermを使いました。 Teratermはデフォルトでは、数値表示をしてくれません。 このサイトに行くと左のような説明があり 「Teraterm.INI」を所定の如く書き換えると、「Shift+ESC」を3回押すと Teratermで16進表示が出来るようになります。 |
SDカードの制御のためには、例えば 0x40, 0x00, 0x00, 0x00, 0x00, 0x95 のような6バイトの数値から
なるコマンドをSDカードに送る必要があります。 この数値がきちんと送られているかの検証のために、「Visual Studio Express 2012 for Desktop」で 次のような プログラムを書きました。 左がその結果です。 6つ目の16進表示の数値0x95です。10進では、9×16+5=149 の数値ですが、表示結果は 0xffffff95となっています。 | |
![]() |
int main(void) { int i; char res; char comCMD0[]={0x40,0x00,0x00,0x00,0x00,0x95}; for(i=1;i<=6;i++){ res = comCMD0[i-1]; printf("0x%x\n",res); } _getch(); return 0; |
ふっと思いついて次のように一部変えました。 4行目の冒頭に「unsigned」を追加したところ、狙い通り0x95と結果表示されました。 「char」では±128の数値の範囲しか覆えませんが、「unsigned char」では0から255の数値の 範囲を覆うことが出来ます。このためかと思います。 16進数で0x95を10進に直すと9×16+5=149で、±128の範囲を超えているため きちんと表示できなかったのです。 |
![]() |
int main(void) { int i; unsigned char res; /*ここを変更*/ char comCMD0[]={0x40,0x00,0x00,0x00,0x00,0x95}; for(i=1;i<=6;i++){ res = comCMD0[i-1]; printf("0x%x\n",res); } _getch(); return 0; } |
これをもとにTeratermを使いマイコンで検証しました。 ただ、Teratermでの表示が16進表示でないと、きちんと数値が送られたかどうかわかりません。 先ほど説明したTeraterm.INIを書き直すことで16進表示にたところ、思い通りの数値が送られている ことがわかります。 また最初の1行はアスキーコード表から文字を拾うと、 0x41=A 0x72=r 0x65=e 0x20=スペース 0x79=y 0x6F=o 0x75=u 0x20=スペース 0x72=r 0x65=e 0x61=a 0x64=d 0x79=y 0x30=0 0x21=! 0D0A=¥d¥n つまり、「Are you readyo!¥r¥n」が送られています。¥r¥nは復帰改行です。 |
![]() |
void main(void) { char signal,s[10],str[30]; unsigned char testData[]={0x40,0x41,0x42,0x00,0xFF,0x95}; int i, j,k; init_io();/*H8ハードの初期化を行う*/ SCI0_strtx("Are you ready0!\r\n"); /*無限ループ開始*/ for(i=1;i<=1000;i++) { k = (i-1) % 6; SCI0_tx(testData[k]); timeWait(100); } } |
シリアル通信 ポート9を使う(2016年3月〜4月) |
![]() |
![]() シリアルカメラ制御のためにはシリアルからクロックをカメラに送る必要があるとか・・・・・。 しかし、CN4の機能表を見る限り、クロックを送るポートはありません。 左のポート9の端子の機能を見ると、ポート9にはSCI0、SCI1の機能が割り当てられており、 SCKがそのクロック入出力です。 そこで、ポート9をシリアル通信に使おうと思い、いろいろ試みました。 ネットをいろいろ調べたのですが、どこもCN4のコネクタにつないでいて、直接ポート9につないでいる 例は皆無でした。 |
![]() これはH8(3052)の電子マニュアルにある表ですが、SCI0、SCI1のレジスタのビットの組み合わせにより いろいろ切り替わります。 ということで、この通りにレジスタのビットを設定したりしました。 その検証にはTeratermを使いました。 しかし、PCのTeratermの画面は文字化けしていて思い通りの動作をしてくれませんでした。 また電子マニュアルには、「少なくとも1ビット期間待ってから、SCRのTEビット またはREビットを1にセットします。また、RIE、TIE、TEIE、MPIEビットを設定してください。 TE、REビットを設定することによりTxD、RxD端子が使用可能となります。」 これは「シリアルの初期化を行えば自動的にTXD、RXD端子が使用可能となる」ことを意味しています。 これは、いままで使っていたCN4端子を使ってのシリアル通信と何ら変わらないということになります。 つまり、今まで通りに行えばいいということです。すると後はハードウエアの問題となります。 |
![]() ![]() 左は秋月のネットの電子マニュアルの一部です。 これによると、TXD、RXDの信号は、コネクタCN4にはレベル変換IC(IC3)を介していますが、 ポート9の方へはレベル変換ICを介していないことがわかります。 すると、ポート9をシリアル通信でPCの方へ流すにはレベル変換をすればよいということになります。 秋月から「3V・3.3V・5V系−RS232レベル変換基板」を購入して使って見ました。 右がそのレベル変換ICです。 |
![]() |
その変換基盤ICをやはり秋月で売っているRS232Cのメスと組み合わせます。 この変換基盤の電源はH8(3052)から取っています。 RXD、TXDには10kΩでプルアップしています。 ここにシリアルUSB変換ケーブルを介してPCにつないでいます。 すると、Teratermには思い通りの表示が得られました。 |
シリアル通信 SCI0を使う(2015年10月〜11月) |
![]() |
![]() なので、PCからマイコンへのプログラム転送にはSCI1を使うのがふつう、その延長としてシリアル通信も すべてSCI1を使ってきました。 ところが右のCN4の機能表を見ると、SCI0があります。つまりシリアルコネクタが2チャンネルある、 ということです。 ふっと「SCI0は使えないのかな?」と思いました。 ネットを調べますと、SCI0を使っているサイトは本当にありませんでした。 唯一「H8(3069)についてSCI0を使って見ました。」というサイトがありました。 「SCI0を使う」ということをネットに載せるぐらいですから、SCI0を使うということが かなり希少価値のあることだ、と思いました。 SCI0を使うに当たって 「レベル変換はいるのだろうか?」 という疑問が生じました。 PCからの出力電圧は0〜±15Vです。マイコンの入力電圧は5VまでですのでPCからの出力は このままではマイコンが受け取ることが出来ません。それを変換するためのICがレベル変換IC というものです。 PCからのプログラム転送にSCI1を使います。「そのためにレベル変換ICが必要です。」 ということはマニュアルには全然書いてませんでした。 「SCI1だけきちんと調整されているのだろうか?」とも思いました。 いろいろネットを調べても該当の記事はありません。 マニュアルをもう一度読み返すと、「レベル変換ICを内蔵」とありました。 H8(3052)の回路図を読みますと、レベル変換IC(ADM3202)があり、それがTXD1,RXD1、 TXD0,RXD0に結ばれていました。 これで安心してSCI0を使うことが出来ます。 だけど・・「このレベル変換ICを使うべきか! 使わなくていいのか!」・・ということだ けで1週間ほどを費やしてしまいました^^^^(笑)。 |
![]() 当初、LEDを使おうと思ったのですが、ターミナルソフト「Teraterm」を使うことにしました。 SCI0とPCのターミナルソフト(teraterm)を結びます。 左がPCとマイコンをつないでいる様子です。 PCはノートパソコンなのでUSBシリアル変換ケーブルでPCとマイコンを結んでいます。 Dサブコネクタ(9P)でSCI1とPCをつなぎ、そのコネクタのすぐ右にある3ピンコネクタでSCI0 とPCをつないでいます。SCI0のコネクタの結線の仕方はSCI1と全く同じです。TXD,RXD、GND だけ結べばいいので3ピンだけで十分です。Dサブコネクタの7,8ピンはショートする必要がありますが・・。 PCからマイコンへプログラム転送する必要からSCI1が必要ですのでSCI1とSCI0を両方PCに つなぎます。 僕のPCではSCI1につながっているものはCOM3、SCI0につながっているものはCOM5 として認識されていました。 |
![]() SCI0の3ピンコネクタとPCをつないでおいて、Teratermを起動して、キーを押下しても うんともすんとも言わないし…・。 ごちゃごちゃやっているうちに、こう思いました。 「VBかVCでマイコンと通信するソフトを組んで、PCとマイコンを信号をやり取りする代わりに teratermとマイコンとで信号をやり取りするのだ。検証ぐらいならソフトを組む必要がないのだ。」 Teratermのシリアルの設定とマイコンのシリアルの初期値を合わせておくと、そうこうしているうちに 画面に文字が表示されました。 キーから打った文字が画面に表示するようには、「端末のローカルエコーにチェックを入れます。」 ここでは必要ないのでしておりません。。。。 teratermを起動して、SCI0が動作しているかの検証画面です。 チョコット次のような感じで遊び心のプログラミングをして見ました。 Teratermを起動しておいて、マイコンのスイッチをONにすると「Are you ready0!」が表示され、 キーボードのアルファベットの26文字を押下するごとに「You are0 」+ [押下したキー]が表示されるように プログラムされています。 以下にそのマイコンのプログラムを載せます |
#include "3048f.h" /* 待ち時間発生 引数に、必要なミリ秒を指定する***********/ void init_io(void) { /*ポート3を出力に設定*/ P3.DDR = 0xff; /*ITU0、1のクロックを8分週 3125:1ms、4687.5:1.5ms、6250:2ms、62500:20ms*/ ITU0.TCR.BYTE = 0x03; /* ITU0、TCNTクリア禁止 clock 1/8 */ ITU1.TCR.BYTE = 0x03; /* ITU1、TCNTクリア禁止 clock 1/8 */ ITU.TSTR.BIT.STR0 = 1; /* ITU0 TCNTカウント開始 */ ITU.TSTR.BIT.STR1 = 1; /* ITU1 TCNTカウント開始 */ /* シリアル通信初期化*******************************/ SCI0.SCR.BYTE = 0x00; /* SCI0設定 stop,内部クロック */ SCI0.SMR.BYTE = 0x00; /* data8.stop1,pari non */ SCI0.BRR = 40; /* 19200bps */ ITU0.TCNT = 0; /* ITU0 TCNTカウントを0にクリア */ while(ITU0.TCNT <= 3125);/*1ms待つ*/ SCI0.SCR.BYTE = 0x30; /* Tx,Rx有効 ,割込み無効 */ SCI0.SSR.BYTE &= 0x80; /* エラーフラグのクリア */ return; } /* SCI0から1文字受信する****************************/ char SCI0_rx(void){ char data; if((SCI0.SSR.BYTE & 0x78)==0) return 0; /* 受信とエラー以外は0を返す*/ if(SCI0.SSR.BIT.RDRF == 1){ /* データ受信が正常 */ data = SCI0.RDR; /* データを受け取りdataに保存 */ SCI0.SSR.BIT.RDRF = 0; /* 受信フラグのクリア*/ return(data); } else{ /* データ受信にエラー発生 */ SCI0.SSR.BYTE &= 0xc7; /* エラーフラグをクリア */ return(0xff); /* エラー時はFFを返す */ } } /* SCI0に1文字送信する */ void SCI0_tx(char data){ while(SCI0.SSR.BIT.TDRE == 0); /*未送信データが送られるまで待つ*/ SCI0.TDR = data; /*送信データのセット*/ SCI0.SSR.BIT.TDRE = 0; /*送信フラグのクリア*/ return; } /* SCI0に文字列を送信する 文字列は'\0'で締めくくっておく**************/ void SCI0_strtx(char *str){ while(*str != '\0'){ /* 文字が\0になるまで繰り返す */ SCI0_tx(*str); /* 1文字送信*/ str++; /* 次の文字に移る*/ } return; } /*プログラムの始まり*/ main() { char signal,s[10],str[30]; int i, j,k; init_io();/*H8ハードの初期化を行う*/ SCI0_strtx("Are you ready0!\r\n"); /*無限ループ開始*/ while(1){ signal = SCI0_rx();/* 1文字受信*/ *s= signal;*(s+1)=0;/*文字の終わりにNULLをつける*/ strcpy(str,"You are0 "); strcat(str,s); strcat(str,"\r\n");/*復帰改行*/ /*受信された1文字がアルファベット26文字のどれかなら文字列を送信*/ if( signal >= 65 && signal<=122) SCI0_strtx(str); } } |
カメラに挑戦 2015年7月〜8月 |
![]() |
ロボットに目をつけたいと思いました。 吉野さんの著書を読むと「カメラ搭載」の章がありました。吉野さんにメールで相談しますと、 「小型TTLシリアルJPEGカメラ(NTSCビデオ出力付)」 (秋月電子から購入できます)を教えてもらいました。 http://akizukidenshi.com/catalog/g/gM-07746/ 左がその現物です。SIZE 20mmx28mm 程の小ささです。 端子はGND、RX、TX、3.3v、CVBSの4つです。 3.3Vは電源端子、CVBSはビデオ端子です。 RX、TXはRS232CのTX、RXに接続します。 電源端子は3.3Vとマークしてありますが、このメーカーのWEBサイトを見ますと、 3.3〜5VであればOKとのことです。 |
![]() |
メーカーサイトにはマイコンの「Arduino」をもとにしたつなぎ方がサンプルとして
載っていましたので、「マイコン制御」というのがずっと頭にありました。 「Arduino」のことは全然知らないのでずっと考えていました。 カメラの基盤には3.3Vというマークがあるので、3.3Vの電源を作る必要があると思い、 このための電源回路をとりあえず作ることにした。他への転用も考えて5V、3.3V をスイッチで切り替えができるものを作ろうとして、 5Vと3.3Vの3端子レギュレータを用いて作ったのが左の電源回路です。 スイッチで3.3Vと5Vを切り替え、目視でそれがわかるようにLEDが点灯 するようにしています。 |
![]() |
「シリアルJPEGカメラ」でネットを検索していると、
「花岡ちゃんに花束を」というサイトで、
マイコンを全然使わずに「レベルコンバータ」なるものを使ってカメラモジュールをPCにつなげて
撮影していました。 ネットで調べると、PCからのRS232Cの信号は「±5V〜15Vの信号で0〜5Vのマイコンの信号 とは本質的に異なる」ようで、この違いを吸収するのがレベルコンバータらしい、とのこと。 日昇テクノロジーという会社から「RS232C-TTLレベル変換基板」が¥300で売っていました。送料約500円、 着払い手数料約300円です。¥300円のものを買うのに¥800円を払わなければなりませんが、 実際に電子パーツ店に交通機関を使えば¥800円では済みません。 左がその現物です。 |
![]() |
このカメラモジュールには3.3Vとマークしてありました。 変換基盤は5Vの電源が必要です。 3.3Vと5Vを混在すると3.3V系の回路と5V系の回路の間に「レベル変換IC」を介在 せなあかんし・・・。いろんな点で面倒です。 しかし、カメラモジュールは5VでもOKだとメーカーサイトに書いてあったので、5Vの電源に統一できました。 それで組んだ回路が左です。 1の端子には前述の電源回路の1(5V)につなぎます。 レベル変換基盤のTX、RXにはカメラモジュールのTX,RXをつなぎます。 PCとレベル変換基盤は「USB−RS232C変換ケーブル」でつなぎます。 |
![]() |
左がその実際に組んだものです。 カメラモジュールはほかの場面でも使いたいので、ボードとはコネクタを用いてつないでいます。 |
![]() |
PCとつなげるとこんな状態です。。 このノートパソコンは17インチなので横幅30p程です。 「実際のサイズはこんなものか!」という感じです。 |
![]() |
「花岡ちゃんに花束を」というサイトにC#で作ったソフトがプロジェクトごとアップされていました。 ダウンロードして使っています。 「花岡ちゃんありがとう!」 画像サイズの変更の機能を追加して使っています。 |
「花岡ちゃん」作成のソフトを改良(?)して連続撮影出来るようにしています。 1枚撮影表示するのに、640×480のサイズなら約10秒ほど、320×240なら約5秒ほど、 160×120なら約2秒足らずです。 下は160×120のサイズで連続撮影したファイルを並べたものです。 ファイル名を「年月日時秒」にしています。 ファイル名を見ると約2秒足らずでどんどん撮影表示されていくことがわかります。 動く物体につけてその前を表示させるのにはまあまあだと思います。 |
![]() |