tag:blogger.com,1999:blog-6851354011831654232024-03-08T17:44:27.006+09:00飛行機工場電機部araihttp://www.blogger.com/profile/07868460234998132254noreply@blogger.comBlogger14125tag:blogger.com,1999:blog-685135401183165423.post-54976770016055671092011-04-02T20:25:00.004+09:002011-04-02T21:43:52.296+09:00リモコン送信<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-R2WMlxvYZEA/TZcHs-qzudI/AAAAAAAAAUw/_3OZB05iNXY/s1600/DSCN3092.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-R2WMlxvYZEA/TZcHs-qzudI/AAAAAAAAAUw/_3OZB05iNXY/s320/DSCN3092.JPG" alt="" id="BLOGGER_PHOTO_ID_5590945931721947602" border="0" /></a><br />1ヶ月ぶりに再開。赤外線リモコンの送信に挑む。<br /><br />すっかり忘れているので復習に1日かかると思ったのだが、コンパイラを呼び出したら、<br />30分ほどで準備ができた。開発環境がシンプルなので操作を思い出すのも簡単だ。<br /><br />さて、まず赤外線LED。手持ちがなかったので通販で発注したが待ちきれなくて<br />不要のリモコンから外した。<br /><br />リモコン用のものは結構電流を流す。また到達距離を稼ぐために複数つなぐこともありそうなので、<br />トランジスタを入れておくことにする。<br />(回路は 「LED トランジスタ スイッチ」などで検索すると出てくる。)<br /><br /><br />話はそれて懐古ばなし。・・・・・・<br />トランジスタは 2sc372 である。古い電子工作少年には忘れられない型番だ。<br />10年ほど前に知人から古い部品をダンボール箱ひとつもらった。その中には、カラーコードじゃない抵抗など昭和のパーツが詰まっていて、今でもちょっとした試作には便利に使っている。<br /><br />型番表示を見て左から「えみこれべ」。学生の時アナログ屋の友人に足と電極の対応を聞くと、<br />「372は えみこれべ」と呪文のように返事が返ってきたものだ。<br /><br />30年も前の記憶なので念の為にネットで検索すると出てきた。<br />たしかに ECB なのでうれしくなる。<br />・・・・・・<br /><br />ブレッドボードで組んでベースをいじるとLEDが点灯するのを確認。<br />確認は目では見えないのでデジカメで見るのだが、<br />実はデジカメもビデオも大半のものは赤外光を減衰させるフィルターが入っているので、<br />あまりはっきりと見えない。(古いビデオカメラなどではよく見えるが)<br /><br />めんどくさいな~ とイライラしていたのだが、プログラムが出来て実際に<br />動かすまでは普通のLEDでチェックすればいいことに途中で気がついた。<br />(写真に写っている緑のLED)<br /><br />ユニバーサルボードにハンダ付けで組みなおして、GEMMYのC6コネクタに接続。<br />開発環境で自動的に生成される点滅プログラムのポートをp21(GEMMYのC6に対応)して、<br />点滅を確認。OK!!<br /><br />ここで<br /><span style="color: rgb(204, 0, 0);font-size:180%;" >ああ!!、トランジスタ入れたら反転しちゃうよ。</span><br />と思ったのだが・・・<br />38kHz で変調しているので関係ないと気づく。<br /><br />-----------------<br />プログラムだが、まずテストに使う機器のリモコンを持ってくる。<br />前の受信プログラムを、mbedにいれてリモコンのボタンを押し、<br />受信された フォーマット、ビット数、データ を メモっておく。<br />その内容を、送信プログラムのソースコードに写す。<br /><br />我が家のTVは怪しいメーカーなので、受信がうまくいかず。<br />食卓用の古~いアナログ液晶TVもダメ。<br /><br />HDDビデオ やCDプレーヤーがわりに使っているDVDデッキは、うまく動いた。<br /><br />赤外LEDを機器に向けて、下記のプログラムでリセットのあと 白ボタンを押すと、<br />電源が入った。<br /><br /><br />----------------<br />プログラムを書けば、リモコンのシーケンサーができる。<br />例えば、帰宅したら、エアコンをON。ビデオの電源ON. TVの入力をビデオに切り替え、録画済みリストを表示させる。なんてのがボタン一つ。<br /><br />ネット経由で外からも。<br /><br />つぎは LAN だな・・・・・・<br /><br />===================<br /><pre>#include <mbed.h><br /><br />#include "TransmitterIR.h"<br />#include "TextLCD.h"<br /><br />TextLCD lcd(p11, p12, p27, p28, p29, p30); // rs, e, d4-d7<br />DigitalIn swWhite(p13);<br />TransmitterIR ir_tx(p21);<br /><br />/**<br />* Entry point.<br />*/<br />int main(void) {<br /><br /><br /> lcd.cls();<br /> lcd.printf("IR TX TEST.");<br /><br /> swWhite.mode(PullUp);<br /><br /> RemoteIR::Format format = RemoteIR::NEC;<br /> uint8_t buf[] = {0x00,0xFF,0x46,0xB9};<br /> int bitcount = 32;<br /><br /><br /> /*<br /> * Execute.<br /> */<br /> while (1) {<br /> while(1){<br /> if(swWhite==0) break;<br /> }<br /> wait(0.5);<br /><br /> if (ir_tx.getState() == TransmitterIR::Idle) {<br /> bitcount = ir_tx.setData(format, buf, bitcount);<br /> }<br /><br /> lcd.cls();<br /> lcd.printf("#### ---- ----");<br /><br /> }<br />}<br /></mbed.h></pre>araihttp://www.blogger.com/profile/07868460234998132254noreply@blogger.comtag:blogger.com,1999:blog-685135401183165423.post-77376648206711965622011-03-02T19:28:00.003+09:002011-03-02T19:45:44.144+09:00IR受信のプログラムを整理<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-QxzFgQCSEZY/TW4cPfi1g8I/AAAAAAAAAUo/v0BhJHMXdiI/s1600/DSCN3090.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-QxzFgQCSEZY/TW4cPfi1g8I/AAAAAAAAAUo/v0BhJHMXdiI/s320/DSCN3090.JPG" alt="" id="BLOGGER_PHOTO_ID_5579428040849851330" border="0" /></a><br />サンプルプログラムを整理した。<br /><br />display_xxxx() という下請け関数が3つあるが、処理の本質には関係ないので、<br />基本的には、byteの配列でバッファをつくって、receive()を呼ぶ。<br /><br />receive() は 受信ステータスが立つのを待って ir_rx.getData()で<br />データを取り出す。<br /><br />LCD には 上段にフォーマットとステータス。<br />下段に 受信データが表示される。<br /><br />リモコンのボタンをいろいろ押すと、受信データが変わるので、<br />この値を比較して、対応する処理を呼び出すようにすると、<br />リモコンでコントロール出来る車ができたりする。<br /><br />ややこしくなるので、このプログラムでは対応処理を呼び出す部分を書いていないが、<br />ボタンとコードの対応を調べるために、とっておくと良い。<br /><br /><pre><br />#include <mbed.h><br /><br />#include "ReceiverIR.h"<br />#include "TextLCD.h"<br /><br /><br />ReceiverIR ir_rx(p10); //GEMMY IR RECEIVER<br /><br />TextLCD lcd(p11, p12, p27, p28, p29, p30); // rs, e, d4-d7<br /><br /><br />/**<br /> * Receive.<br /> *<br /> * @param format Pointer to a format.<br /> * @param buf Pointer to a buffer.<br /> * @param bufsiz Size of the buffer.<br /> *<br /> * @return Bit length of the received data.<br /> */<br />int receive(RemoteIR::Format *format, uint8_t *buf, int bufsiz, int timeout = 100) {<br /> int cnt = 0;<br /> while (ir_rx.getState() != ReceiverIR::Received) {<br /> cnt++;<br /> if (timeout < cnt) {<br /> return -1;<br /> }<br /> }<br /> return ir_rx.getData(format, buf, bufsiz * 8);<br />}<br /><br />/**<br /> * Display a current status.<br /> */<br />void display_status(char *status, int bitlength) {<br /> lcd.locate(8, 0);<br /> lcd.printf("%-5.5s:%02d", status, bitlength);<br />}<br /><br />/**<br /> * Display a format of a data.<br /> */<br />void display_format(RemoteIR::Format format) {<br /> lcd.locate(0, 0);<br /> switch (format) {<br /> case RemoteIR::UNKNOWN:<br /> lcd.printf("????????");<br /> break;<br /> case RemoteIR::NEC:<br /> lcd.printf("NEC ");<br /> break;<br /> case RemoteIR::NEC_REPEAT:<br /> lcd.printf("NEC (R)");<br /> break;<br /> case RemoteIR::AEHA:<br /> lcd.printf("AEHA ");<br /> break;<br /> case RemoteIR::AEHA_REPEAT:<br /> lcd.printf("AEHA (R)");<br /> break;<br /> case RemoteIR::SONY:<br /> lcd.printf("SONY ");<br /> break;<br /> }<br />}<br /><br />int bit2CharLen(int bitlen) {<br /> return bitlen / 8 + (((bitlen % 8) != 0) ? 1 : 0);<br />}<br /><br /><br />/**<br /> * Display a data.<br /> *<br /> * @param buf Pointer to a buffer.<br /> * @param bitlength Bit length of a data.<br /> */<br />void display_data(uint8_t *buf, int bitlength) {<br /> lcd.locate(0, 1);<br /><br /> const int n = bit2CharLen(bitlength);<br /><br /> for (int i = 0; i < n; i++) {<br /> lcd.printf("%02X", buf[i]);<br /> }<br /> for (int i = 0; i < 8 - n; i++) {<br /> lcd.printf("--");<br /> }<br />}<br /><br /><br /><br />//void getStr(uint8_t *buf, int bitlength)<br /><br /><br />/**<br /> * Entry point.<br /> */<br />int main(void) {<br /><br /><br /> lcd.cls();<br /> lcd.printf("IR RECEIVE TEST.");<br /><br /> /*<br /> * Execute.<br /> */<br /> while (1) {<br /> uint8_t buf1[32];<br /> memset(buf1, 0x00, sizeof(buf1));<br /><br /> RemoteIR::Format format;<br /><br /> int bitlen = receive(&format, buf1, sizeof(buf1));<br /><br /> if (bitlen < 0) {<br /> continue;<br /> }<br /><br /><br /> display_status("RECV", bitlen);<br /> display_data(buf1, bitlen);<br /> display_format(format);<br /><br /> }<br />}<br /><br /></pre>araihttp://www.blogger.com/profile/07868460234998132254noreply@blogger.comtag:blogger.com,1999:blog-685135401183165423.post-1881070298800298162011-03-01T23:00:00.006+09:002011-03-01T23:56:29.167+09:00GEMMYの赤外線受光部 しょうもないことでハマってしまった。<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-67ZGopzW6Is/TWz82-zvBxI/AAAAAAAAAUg/79HsZ3GKMuI/s1600/DSCN3089.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-67ZGopzW6Is/TWz82-zvBxI/AAAAAAAAAUg/79HsZ3GKMuI/s320/DSCN3089.JPG" alt="" id="BLOGGER_PHOTO_ID_5579112059908327186" border="0" /></a><br />焦電センサーで失敗して悔しいので、赤外線つながりでGEMMYについている受光部を使ってみることにした。<br /><br />RemoteIR というライブラリを使う。<br />使い方が書いていないので、ソースを読んであたりをつけるが、<br />めんどくさくなって とりあえず 作者の作成したサンプルプログラムを<br />コンパイルして動かしてみる。<br /><br />ありゃ動かない。<br /><br />家じゅうのリモコンを持ってきて試すが、これはフォーマットうんぬんではなくて、<br />全然入力がきていない。<br /><br />例えば、サンプルプログラムとは使うピンが違っているので、ディレクションやアナログ、デジタルモードの設定をしなければならないのか・・・・などなど 2時間ほど格闘。<br /><br />受光デバイスの出力波形を当たってみようかな~~と 眺めていると気がついた。<br /><br /><span style="color: rgb(204, 0, 0);font-size:180%;" ><span style="font-weight: bold;">あ~電源ね!</span><br /></span><br />mbed USBからの給電でLCDも表示されるし、ボード上のものは動くと思い込んでしまった。<br /><br />電源をつなぐと正常に動作。<br />リモコンを向けてボタンを押すと、コードが表示された。<br /><br />--------------------------<br />ライブラリのソースを見るとSONYとNEC などが出てくるので、<br />最初、SONYとNECしかつかえないのかいね~?<br />と思ったのだが調べると、<br />IRリモコンの下位レイヤーのフォーマットとして NECタイプ SONYタイプ AEHA タイプ<br />などがあり、家電のリモコンは概ねこれのどれかに属するということだ。<br />この上位レイヤーにメーカー識別や独自のコードが乗るということらしい。araihttp://www.blogger.com/profile/07868460234998132254noreply@blogger.comtag:blogger.com,1999:blog-685135401183165423.post-5489133698441715492011-03-01T19:08:00.004+09:002011-03-01T19:41:05.452+09:00焦電センサーに敗北す<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-ZTBG0CY51Yo/TWzHJXP-deI/AAAAAAAAAUY/syUNQKGY0yo/s1600/DSCN3088.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-ZTBG0CY51Yo/TWzHJXP-deI/AAAAAAAAAUY/syUNQKGY0yo/s320/DSCN3088.JPG" alt="" id="BLOGGER_PHOTO_ID_5579053002078975458" border="0" /></a><br />焦電センサーというのは自動ドアやセンサー付きライトに入っていて、人間の発する赤外線に反応する。<br />これを振るとか、左右に2個付けて差を見るとかしたら人の動きを追うようなことができないかと考えた。<br /><br />実験キットを取り寄せた。センサー付きライトそのままの回路で、アンプと一定時間リレーをオンにする回路が入っている。リレー部分は不要なので、アンプ部分だけ利用する。<br /><br />組み立ててオシロをつなぐと反応するのだがどうも思うような結果にならない。<br />変化量しか検出していない感じ。<br />まあ、用途を考えれば当然だ。センサーライトに適した動きをするように、フィルターが入っているのだろう。<br />アナログはあまり良くわからないのだが、アンプ部分に2段階に微分回路があるらしい。<br />これを外してみる。入力には積分回路らしきものがあって細かい変動もキャンセルしているらしいので、これも外す。<br />状況は変わってノイズっぽい変動も出てくるのだが、以前大勢は変化量しか検出しないことに変りなし。<br /><br />ひと休みして<br />焦電センサーについて調べてみる・・・・・<br /><br /><span style="color: rgb(204, 0, 0);font-size:180%;" ><span style="font-weight: bold;">ええええ~~~ そうなんだ~~</span></span><br /><br />なんてこったい。デバイスそのものが変化量しか検出しないものらしい。<br /><br />センサーを振れば変化するのだが、どうも出てくる出力を見ると、<br />位置検出できるような安定した結果は得られそうにない。<br /><br />ということで、GEMMYにつなぐまでもなく失敗である。<br /><br />もちろん、人が近づいたら何か動着始めるといったセンサーライトまがいのことは簡単にできる。araihttp://www.blogger.com/profile/07868460234998132254noreply@blogger.comtag:blogger.com,1999:blog-685135401183165423.post-28896758447344906652011-02-22T22:41:00.003+09:002011-02-22T23:46:08.223+09:00シャープの赤外線のほうが便利だった<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-vzGRZu8Atjw/TWO9T1lcX6I/AAAAAAAAAUQ/LMubNPdxhfo/s1600/DSCN3087.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-vzGRZu8Atjw/TWO9T1lcX6I/AAAAAAAAAUQ/LMubNPdxhfo/s320/DSCN3087.JPG" alt="" id="BLOGGER_PHOTO_ID_5576508912114098082" border="0" /></a><br />MAXSONAR と GP2Y0A21YK をつないでみた。<br /><br />MAXSONAR は電源 3.3V 5V どちらでもOKだ。A/Dが3.3Vなので一応3.3V電源にしてみる。<br />昨日つないだVRとすげかえてみた。<br />正常に動作しているらしいが部屋が狭いので、半分くらいしか振らない。<br />まあいいや。<br /><br />続いて、シャープの赤外線のやつ。GP2Y0A21YK。<br />データシートを見ると、電源5V で出力は 概ね3V強まで。 ということは、GEMMYのコネクタに直接つなぐのに便利だ。<br />サーボ用のコネクターと線をハンダ付けしてアナログ入力に挿す。<br /><br />なんなく動いた。<br /><br />プログラムは昨日の短いやつそのままで良い。<br /><br />GP2Y0A21YKの方が簡単だった。<br />=================<br />超音波タイプは当然指向性があるのだが、狭い部屋では余計な反射が入って不安定である。<br />つまり音波のマルチパス。<br /><br />シャープの超音波センサーはロングレンジタイプもあるので、近距離用と遠距離用2つくっつけて<br />プログラムで切り替えるのがいいかもしれない。<br />ショートレンジは10cmから60cmぐらい、ロングレンジは 50cmから2mぐらいまでつかえる。<br />(データシートではもう少し広い範囲で書かれている)<br /><br />=================<br />PINGもつなごうとおもってライブラリを検索してみたが意外にも見つからなかった。<br />もう、過去のものなったか・・・・<br /><br />=================<br />話は横道にそれる。<br /><br />GEMMYをいじり始めるとサーボ用のケーブルが結構必要になる。<br />GEMMYを購入するときにはサーボ延長ケーブルの長さを変えて<br />何本か一緒に買っておくと良い。オス~オスタイプの方が使うかな。<br /><br />自分は飛行機で古くなったやつを流用しているが、その在庫も尽きてきたので、<br />次回なにか注文するときにまとめ買いすることにしよう。araihttp://www.blogger.com/profile/07868460234998132254noreply@blogger.comtag:blogger.com,1999:blog-685135401183165423.post-44077196491361842512011-02-22T18:13:00.002+09:002011-02-22T18:57:25.513+09:00距離センサーを考える<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-ttdplrwnXmA/TWN-curdD4I/AAAAAAAAAUI/2UunPdH0Bkg/s1600/DSCN3086.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-ttdplrwnXmA/TWN-curdD4I/AAAAAAAAAUI/2UunPdH0Bkg/s320/DSCN3086.JPG" alt="" id="BLOGGER_PHOTO_ID_5576439795646533506" border="0" /></a><br />手元にある距離センサーを引っ張り出してみる。<br /><br />左から "PING" "MAXSONAR EZ1" "SRF10" "GP2Y0A21YK"(ごちゃごちゃの基板についているやつ)<br />最初の3つは超音波、4番目は赤外線。<br /><br />PING<br />超音波では一番ポピュラー。といっても以前はお手軽なのがこれしかなかったからだ。<br />ディスカバリーチャンネルの工作系番組でも時々見かける。<br />使い方はやや面倒で、発信トリガーを送ったらピンを入力に切り替えてパルスの長さを測る。<br />このパルス幅が音速での往復時間になる。<br />mbedならば、たぶん誰かが簡単に使えるライブラリを書いているだろうから簡単かもしれない。<br /><br />遠い方は3m ぐらい、近い方は10cm ぐらいまで取れる。<br /><br />このセンサーでハマるのは、なにも考えずにループでパルス幅をカウントしたりすると、<br />近い時にはループが速く回り、遠くでは遅くなる。<br />微分して速度を求めようとしたりするとトンチンカンなことになる。<br /><br />まあ、障害物があったらよける程度の制御ではあまり難しいことを考えなくても大丈夫である。<br /><br />MAXSONAR<br />PINGと同じだがスピーカーとマイクが兼用になっている。<br />アナログ(電圧)出力、シリアル出力、パルス出力があって、アナログでつなぐととても簡単。<br />電圧も3.3V 5V どちらでも良い。<br />ハマるポイントはPINGと同じなのだが、アナログ出力の場合気がつかないまま使える。<br /><br />SRF10<br />これはI2C。 小さくて性能は上記2つに比べて少し良い。<br />といってももらったままお蔵になっていたので、使ったことはない。<br />あとでI2Cの勉強するときにやってみよう。<br /><br />GP2Y0A21YK<br />これは赤外線センサーである。片方の目から赤外線を発して、もうひとつの目で受ける。<br />光の速度はあまりに速いのでこの程度のセンサーでは往復時間を測ることはできない。<br />このセンサーは、対象が近くにあるときと遠くにあるときで反射した赤外線の入射角が異なることを<br />利用している。<br />ゆえに、出力が線形ではなく離れると分解能が低下する。<br />大体 10cm~50cmが実用域なので、障害物よけなどに使える。<br /><br />前述の超音波センサーは意外と感度がよく棒などでも拾えるが、こいつは仕組の関係で<br />面をセンスするのが得意である。<br /><br />===========<br />一番簡単な、MAXSONARのアナログ入力でもやってみようかな。araihttp://www.blogger.com/profile/07868460234998132254noreply@blogger.comtag:blogger.com,1999:blog-685135401183165423.post-84840208508404199992011-02-21T23:19:00.007+09:002011-02-22T00:03:26.050+09:00A/Dは3.3Vなのね<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-fQcSM5RK67g/TWJ0xou4bpI/AAAAAAAAAUA/whSEDK9IWEg/s1600/DSCN3085.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-fQcSM5RK67g/TWJ0xou4bpI/AAAAAAAAAUA/whSEDK9IWEg/s320/DSCN3085.JPG" alt="" id="BLOGGER_PHOTO_ID_5576147684734561938" border="0" /></a><br />A/Dのお試し。VRの両端に電源電圧をかけて、真ん中の端子から分圧された電圧を取り出して使うのが常套手段であります。<br />サーボのコネクタはVRと順番が異なるが電源電圧と信号線があるので都合がいい。<br />(順番は入れ替えねばならない)<br /><br />で、<br />5VがVRの両端にかかるようにしてGEMMYのアナログ入力ピンに接続して動いた。<br />VRを回すと0.0-->1.0の値が表示されサーボが然るべき角度になる。<br /><br />あれ・・・・?<br /><br />VRの上のほうが余っている。回しきらないのに 値が1.0になって当然サーボもそれ以上回らない。<br /><br />はは~んと、VRから出る電圧をあたる。やはり3.3V で値が1.0になる。<br />A/Dの入力がフルスケールで3.3V。<br /><br />テストだから理由がわかればそれでおしまいなのだが、そこは趣味だから、<br />好きなところまでやってみる。<br /><br />A/Dコンバータに外から基準電圧を入れる方法があるのだがmbedのデータシートを見ても見つからない。<br />これは安易に信号の方を3.3Vにしたほうが良さそうだ。電流も僅かなのでVRの両端にかける電圧を 5Vから分圧すれば十分である。例えば、33KΩのVRに17KΩの抵抗を直列に入れれば良い。<br /><br />なのだが、このあと3.3V動作のセンサーをつなぐことも多そうなので、簡単な電源を作っておくことにした。と言っても5Vに3.3Vの3端子レギュレータをつなぐだけである。<br />ワークベンチにユニバーサル基板をくっつけたが、この前リセットボタン用にGEMMYにくっつけた<br />基板でも十分乗る。<br /><br />実はmbedに3.3v出力があるのだがショートでもさせてレギュレータを焼失すると、まるごと使用不能は痛いのでこのようにした。<br />実際に使うときセンサーの消費電流がはっきりわかっていればmbedからとっていいだろう。<br /><br />VR式のサーボテスター。<br />プログラムは、たったこれだけ。<br /><pre><br />#include "mbed.h"<br />#include "TextLCD.h"<br />#include "Servo.h"<br /><br />TextLCD lcd(p11, p12, p27, p28, p29, p30); // rs, e, d4-d7<br /><br />Servo myservo(p26); //GEMMY C1 CONNECTOR<br /><br />AnalogIn ad(p15); //GEMMY A1 CONNECTOR<br /><br />int main() {<br /><br /><br />while(1){<br /> double a = ad.read();<br /> myservo = a;<br /> lcd.cls(); <br /> lcd.printf("AD TEST %4.2f",a);<br /> wait(0.1);<br />}<br /><br />}<br /><br /></pre>araihttp://www.blogger.com/profile/07868460234998132254noreply@blogger.comtag:blogger.com,1999:blog-685135401183165423.post-29998792234677956892011-02-21T18:59:00.002+09:002011-02-21T19:19:19.357+09:00リセットボタンをつけるより良い方法とワークベンチLABOARさんからmbedのソケットの空いている列は同じ並びのmbedピンにつながっているんですよ~<br />と教えていただいたので、リセットの工作を修正。<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-OVT42hcTkWI/TWI33DVPITI/AAAAAAAAAT4/0nShxf23RRE/s1600/DSCN3079.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-OVT42hcTkWI/TWI33DVPITI/AAAAAAAAAT4/0nShxf23RRE/s320/DSCN3079.JPG" alt="" id="BLOGGER_PHOTO_ID_5576080707564806450" border="0" /></a><br />基板用のピンヘッダ オスに線をつなぐ。mbed基板に接触すると気持ち悪いので、<br />若干頭を外側に曲げておくと良い。<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-r-UxaSN2A2w/TWI325o4NpI/AAAAAAAAATw/UolQ1Gl7VAs/s1600/DSCN3080.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-r-UxaSN2A2w/TWI325o4NpI/AAAAAAAAATw/UolQ1Gl7VAs/s320/DSCN3080.JPG" alt="" id="BLOGGER_PHOTO_ID_5576080704962836114" border="0" /></a><br />で、このように挿せばOK。最初から90度曲げたピンが売っているので、<br />新しく買うならそれを使ったほうが良い。<br /><br />アナログ入力のテストを行うのだが、だんだんとぶら下がりもんが増える。<br />このように部材を固定したワークベンチを作ると良い。<br />GEMMYは下面からビスで元々の穴を利用して固定してあるが、<br />ほかは、強力両面テープで固定しただけ。簡単なものだがケーブルに引っ張られて、<br />基板が移動したりしないので、イライラがかなり減らせる。<br />VRを回すときに片手で回せるし、オシロのプローブをあてるときも相手が固定されていれば<br />とても楽である。<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-9q8pbZxmztk/TWI32jVKzxI/AAAAAAAAATo/u6msTw3aVls/s1600/DSCN3081.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-9q8pbZxmztk/TWI32jVKzxI/AAAAAAAAATo/u6msTw3aVls/s320/DSCN3081.JPG" alt="" id="BLOGGER_PHOTO_ID_5576080698974588690" border="0" /></a><br />ブレッドボードはまだ固定していない。<br />ブレッドボードを使うか、ユニバーサル基板を使うか、<br />両方乗っけるか考えているところである。araihttp://www.blogger.com/profile/07868460234998132254noreply@blogger.comtag:blogger.com,1999:blog-685135401183165423.post-51535837569802299292011-02-19T00:23:00.005+09:002011-02-19T00:51:15.854+09:0015分でサーボ動く<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-ZbKR6r13JdE/TV6PNIGPjYI/AAAAAAAAATg/hLSFeBfh4rc/s1600/DSCN3078.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-ZbKR6r13JdE/TV6PNIGPjYI/AAAAAAAAATg/hLSFeBfh4rc/s320/DSCN3078.JPG" alt="" id="BLOGGER_PHOTO_ID_5575050844405992834" border="0" /></a><br />リセットボタンができたので、調子にのってサーボをつないでみる。<br />普通ならここで、ユニバーサル基板にサーボ用のピンを立てて・・・・となるから、<br />めんどくさいのだが、GEMMYはサーボ用にピンが立っている。<br />寝る前にもうひとつ進んでおこうと、気軽に行ける。<br /><br />mbedのライブラリからservoで検索して、なにも考えす一番最初のをインポートする。<br />サンプルのコードからぺぺっと カットアンドペーストして、<br />この前作ったボタンテストのプログラムに足す。<br /><br />とりあえずめんどうだから、USB給電でも負荷にならなそうな、<br />ちっちゃいサーボをつないだ。<br /><br />コンパイルして実行~~~??? あれ 動かん。<br /><br />オシロで信号ピンをあたると、パルスはちゃんと出ている。<br /><br />しばし考えてサーボコネクターのプラス側をあたる。<br /><br /><span style="font-weight: bold;">おお、USBから給電してしまわないように出来てるぞ。</span><br /><span style="font-weight: bold;font-size:180%;" >それは正しい!</span><br /><br />で、一昨日作った間に合わせ電源をつないだら動いた。<br />めでたしめでたし。<br /><br />ここまで、トラブルシュートいれて15分。<br />まあ、楽なもんですよ。<br /><br />------------------<br />プログラムは、ボタンテストにちょっと足して、白、黒ボタンで、サーボが<br />いっぱいに切れる。赤ボタンでニュートラル。<br />即席サーボテスター出来上がり。<br /><br />コードは、ほとんど変わりませんわ。<br /><pre><br />#include "mbed.h"<br />#include "TextLCD.h"<br />#include "Servo.h"<br /><br />TextLCD lcd(p11, p12, p27, p28, p29, p30); // rs, e, d4-d7<br /><br />DigitalIn swWhite(p13);<br />DigitalIn swRed(p14);<br />DigitalIn swBlack(p9);<br /><br />Servo myservo(p26); //GEMMY C1 CONNECTOR<br /><br /><br /><br />int main() {<br /><br />lcd.printf("SERVO TEST");<br /><br />swWhite.mode(PullUp);<br />swRed.mode(PullUp);<br />swBlack.mode(PullUp);<br /><br />while(1){<br /> if(swWhite==0){<br /> lcd.cls();<br /> lcd.printf("#### ---- ----");<br /> myservo = 1.0;<br /> }<br /> else if(swRed==0){<br /> lcd.cls();<br /> lcd.printf("---- #### ----");<br /> myservo = 0.5;<br /> }<br /> if(swBlack==0){<br /> lcd.cls();<br /> lcd.printf("---- ---- ####");<br /> myservo = 0.0;<br /> }<br /><br />}<br />}<br /></pre>araihttp://www.blogger.com/profile/07868460234998132254noreply@blogger.comtag:blogger.com,1999:blog-685135401183165423.post-79034389889945246272011-02-18T22:15:00.005+09:002011-02-18T23:30:52.422+09:00やっぱりリセットをつけてみた話は少し長い。<br />次はなにを試そうかと思い、サーボをつなぐことにした。<br />サーボをつなぐのにUSB給電は心もとない。<br />5VのACアダプタがなかったので、一昨日3端子レギュレータで間に合わせの電源を作った。<br />机の上に部材が散らかってくると、線が引っ張られて動いたりして落ち着いて作業ができない。<br />で、開発作業をするときは、これらをアクリル板などに固定する。<br />片付ける時もそのまま立てかけられて便利である。<br /><br />さて、そこで・・・・・・<br /><br />GEMMYをアクリル板に固定するとリセットスイッチが押せない。<br />一晩考えた作戦が以下である。<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-2o7l0GTqlTU/TV5zuAT43qI/AAAAAAAAATY/x_2mmkxF3Pw/s1600/DSCN3073.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-2o7l0GTqlTU/TV5zuAT43qI/AAAAAAAAATY/x_2mmkxF3Pw/s320/DSCN3073.JPG" alt="" id="BLOGGER_PHOTO_ID_5575020622925848226" border="0" /></a><br />まず、下側のスペーサー2本に2mmの穴をあける。<br />写真は組み立てた状態だが、スペーサーを外して工事をするのは言うまでもないだろう。(^_^)/<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-ELz9UjYTvlk/TV5zttbF0HI/AAAAAAAAATQ/Pp2qXJX5YZo/s1600/DSCN3074.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-ELz9UjYTvlk/TV5zttbF0HI/AAAAAAAAATQ/Pp2qXJX5YZo/s320/DSCN3074.JPG" alt="" id="BLOGGER_PHOTO_ID_5575020617855783026" border="0" /></a><br />この穴を使って、前面にユニバーサル基板を取り付ける。<br />それにタクトスイッチを取り付けて配線をする。<br />・・・・・・ というのは 構造をわかり易く説明するためで、実際は基板にスイッチを付け、<br />配線が終わってから基板を固定するのは、工作に慣れている人には言うまでも無いだろう。(^_^)/<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-rNev5U1PzR4/TV5ztf_Zx8I/AAAAAAAAATI/VoykBnKrlAc/s1600/DSCN3075.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-rNev5U1PzR4/TV5ztf_Zx8I/AAAAAAAAATI/VoykBnKrlAc/s320/DSCN3075.JPG" alt="" id="BLOGGER_PHOTO_ID_5575020614249990082" border="0" /></a><br />前面から見るとこうなる。<br />あとから、ちょっとした回路を組む場所にもできる。<br /><br />リセットの配線先であるがmbedボードの説明を読むと、<br />nR ピンは「リセットスイッチと同じ機能」でオープンコレクタでプルアップされてます・・うんぬんと<br />書いてあるのここででいいだろう。たぶん。<br /><br />GEMMYのソケットからジャンパしたいところだが、<br />完成状態で送ってもらったので、ソケットピンはLCDの下。線をつなぐことはできない。<br />もし、組み立て前だったら線をひっぱておくと良い。<br /><br />野蛮で気が引けるが、確実なところでmbedのnRピンに直接ハンダ付けした。<br />0V側は、すぐ近くのサーボコネクタのGNDに付けてみた。<br /><br />とりあえず、異常なく動いているようだ。araihttp://www.blogger.com/profile/07868460234998132254noreply@blogger.comtag:blogger.com,1999:blog-685135401183165423.post-5034550247100033692011-02-13T22:31:00.002+09:002011-02-13T22:50:25.205+09:00横道にそれて中華PAD<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-iBA_SLDxVJM/TVfdiTl1weI/AAAAAAAAASo/fN-M8M61P1w/s1600/DSCN3072.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-iBA_SLDxVJM/TVfdiTl1weI/AAAAAAAAASo/fN-M8M61P1w/s320/DSCN3072.JPG" alt="" id="BLOGGER_PHOTO_ID_5573166645338554850" border="0" /></a><br />サーバーサイドで開発システムが動くんだからこれでも行けるよね〜???<br />と、中国製PCタブレットで試す。<br />一番ダメそうなエディターのところまで来たら動いている。<br />まあ、できないことはないようだ。<br /><br />が、しかし・・・・<br /><br />このPCでは、あまりに処理が重い。画面も小さくてこれ以上やる気にならない。<br />つながれてるmbedとどっこいのCPUだから当然である。<br /><br />10インチのガラパゴスかiPadなら 行けるかな〜araihttp://www.blogger.com/profile/07868460234998132254noreply@blogger.comtag:blogger.com,1999:blog-685135401183165423.post-58480456553136873642011-02-12T16:33:00.004+09:002011-02-13T21:08:38.345+09:00ボタンを読む<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-l1tWVSJv70E/TVY4G9aoNFI/AAAAAAAAASg/BBmPeu-Ycnw/s1600/DSCN3071.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-l1tWVSJv70E/TVY4G9aoNFI/AAAAAAAAASg/BBmPeu-Ycnw/s320/DSCN3071.JPG" alt="" id="BLOGGER_PHOTO_ID_5572703281134187602" border="0" /></a><br /><br />ボタンを読んで、LCD の対応する位置に"####"を表示させる。<br /><br />まず DigitalIn で ピンと名前を対応付ける。<br />あとは、その名前でピンの値を見る。押されているときはゼロ。はなすと1になる。<br /><br />・・・・・ はずであるが??? ゼロしか返ってこない。<br /><br />ピンは In/Out 設定可能であるし、アナログの場合もあるので、外付けの<br />プルアップが無い。スイッチがオープンになっても電圧がかからないのだ。<br />これも、設定できて、<br /><br />swWhite.mode(PullUp);<br /><br />とかやれば、チップが自分でプルアップしてくれる。<br /><br /><br /><pre><br />#include "mbed.h"<br />#include "TextLCD.h"<br /><br />TextLCD lcd(p11, p12, p27, p28, p29, p30); // rs, e, d4-d7<br /><br />DigitalIn swWhite(p13);<br />DigitalIn swRed(p14);<br />DigitalIn swBlack(p9);<br /><br />int main() {<br /><br /> lcd.printf("BUTTON TEST");<br /><br /> swWhite.mode(PullUp);<br /> swRed.mode(PullUp);<br /> swBlack.mode(PullUp);<br /> <br /> while(1){<br /> if(swWhite==0){<br /> lcd.cls();<br /> lcd.printf("#### ---- ----");<br /> }<br /> else if(swRed==0){<br /> lcd.cls();<br /> lcd.printf("---- #### ----");<br /> }<br /> if(swBlack==0){<br /> lcd.cls();<br /> lcd.printf("---- ---- ####");<br /> }<br /> <br /> }<br /><br />}<br /></pre>araihttp://www.blogger.com/profile/07868460234998132254noreply@blogger.comtag:blogger.com,1999:blog-685135401183165423.post-27665741724966848302011-02-12T14:23:00.003+09:002011-02-12T14:59:54.338+09:00LCDに表示してみる<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-Z3w_Qc5nG1E/TVYZgitoU6I/AAAAAAAAASY/uhQVpOAbz9g/s1600/DSCN3069.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-Z3w_Qc5nG1E/TVYZgitoU6I/AAAAAAAAASY/uhQVpOAbz9g/s320/DSCN3069.JPG" alt="" id="BLOGGER_PHOTO_ID_5572669635782267810" border="0" /></a><br />LCDは黒い四角が表示されているので、これもUSBの給電だけで動きそうだ。<br /><br />まず、<br />http://www.eleki-jack.com/arm/2010/08/mbedlcd2.html<br />を参考に、ライブラリの追加をする。<br />このページで紹介しているライブラリはLCDデータピンが下位4bitを使うようになっているので、<br /><br />一覧の中から<br />TextLCD library for controlling various LCD panels based on the HD44780 4-bit interfac<br />と書いてあるやつを選んだ。<br />これは上位4bitを使うようになっている。<br /><br />ポートとの対応とかどうなってるのかいね~? と思いつつサンプルのコードを見ると、<br /><br />TextLCD lcd(p11, p12, p27, p28, p29, p30); // rs, e, d4-d7<br /><br />という具合に設定するらしい。<br />な~るほど。最近の芸風はこういうのか。<br /><br />で、これを main.cpp に書くとこうなる。<br /><pre><br />#include "mbed.h"<br />#include "TextLCD.h"<br /><br />TextLCD lcd(p11, p12, p27, p28, p29, p30); // rs, e, d4-d7<br /><br /><br />int main() {<br /><br /> lcd.printf("Hello enRoute\nGEMMY LCD TEST");<br /><br />}<br /><br /><br /></pre>araihttp://www.blogger.com/profile/07868460234998132254noreply@blogger.comtag:blogger.com,1999:blog-685135401183165423.post-40593423554209383952011-02-12T11:57:00.003+09:002011-02-12T14:12:02.076+09:00GEMMYが来た<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-BOoa4xRy7lU/TVX4zBPvFMI/AAAAAAAAASQ/qZuk1H-_UgU/s1600/DSCN3067.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-BOoa4xRy7lU/TVX4zBPvFMI/AAAAAAAAASQ/qZuk1H-_UgU/s320/DSCN3067.JPG" alt="" id="BLOGGER_PHOTO_ID_5572633669332309186" border="0" /></a><br />GEMMYが届いた。サーボなどをつながなければUSBの給電で動きそうなので、とりあえず、mbedボードのUSBコネクタでつないでみる。PC側にmbedのリムーバブルdiskが現れたので大丈夫なようだ。<br />htmlファイルがあるのでクリック。mbedのwebにつながる。<br /><br />http://mbed.org/users/nxpfan/notebook/lets_get_started_jp/<br /><br />を参考にユーザー登録。<br />サンプルのhelloWorld をダウンロードする。<br />これを、リムーバブルdiskにコピー。<br /><br />リセットすると、LEDが点滅するはず。<br />GEMMYのボタンはリセットではないらしいので、mbedのボタンを押したいが、<br />指が入らず。<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-flF-IFn_QW0/TVX4y_F16VI/AAAAAAAAASI/nS1tntaQySA/s1600/DSCN3068.JPG"><img style="cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-flF-IFn_QW0/TVX4y_F16VI/AAAAAAAAASI/nS1tntaQySA/s320/DSCN3068.JPG" alt="" id="BLOGGER_PHOTO_ID_5572633668753942866" border="0" /></a><br /><br />裏のアクリル板を外して押す。<br />おお、動いた。<br /><br />プログラムをボードに入れるには、大概は転送ツールが必要である。<br />操作を習得するのは煩わしいので、このようにコピーで済むのは便利。<br /><br />実際に使い始めるとリセットボタンはあまり使わないのかもしれないが、<br />しばらくはプログラムのお勉強で頻繁にリセットするかもしれないので、<br />アクリル板を外したついでに、リセットボタン位置に3mmの穴をあけておいた。<br /><br />考えてみると、プログラム中は外しておけばいいので、無駄だったか。(^^;<br />まあいいや。<br /><br />------<br />次にプログラムを書いてコンパイルする手順を確認。<br />webからCompilerを開くとブラウザー上で開発環境が起動する。<br />組み込み系のツールを使ったことのある人ならば、いきなり使える簡単さである。<br /><br />新規作成すると、LED点滅のコードが書きこまれたメイン関数が生成される。<br />これに書き足していけばいいわけだ。(多分 HelloWorldの中身はこのプログラム)<br /><br />書き換え、コンパイル、実行の手順確認だけが目的なので、点滅間隔を変えて、<br />コンパイル。コンパイルすると、そのままPCへのダウンロードが始まる。<br />一旦DISKにおいてもいいし、mbedドライブに直接saveしてもいいだろう。<br /><br />わざと、先のHelloWorldは消さずに、新しいプログラムをコピーしてみた。<br />mbedドライブには2つのプログラムがある事になるがリセットすると、<br />あとで書いたほうが実行された。<br />多分、一番新しいものが実行されるのだろう。araihttp://www.blogger.com/profile/07868460234998132254noreply@blogger.com