« 2012年7月 | トップページ | 2012年9月 »

2012.08.31

ルネサスエンジニアフォーラムに出展します

来る9月6日~8日に、ルネサス半導体トレ-ニングセンター(JR飯田橋駅徒歩3分)で行われる「ルネサスエンジニアフォーラム 2012」に出展します。

Rene_forum

特殊電子回路が展示&プレゼン&パネルディスカッションさせていただくのは9月8日(土)です。

プレゼンは、土曜日の15:00~15:45に、

RXduinoライブラリでお手軽・簡単「電子工作」

というテーマで発表させていただきます。

当初は「GR-SAKURAで電子工作」みたいなテーマを予定していましたが、やはりライブラリの説明を中心としたプレゼンに変更させていただくことにしました。

このセミナーでは、がじぇるねでも使われているRXduinoというライブラリの説明を行います。

RXduinoは、Arduino互換のRXマイコン用ライブラリで、ArduinoのスケッチがRXマイコンで走るようにするというものです。GR-SAKURAでは「桜ライブラリ」という名前で使っていただいています。

このライブラリの機能はもちろん、ライセンスについても詳しく説明させていただきます。自作ボードで使いたい場合、オープンソースなライセンスと混ぜたい場合、商用目的で使いたい場合など、様々なケースでどうすればよいかということも含めてお話できればと思います。

パートナー展示は、「究極のRX62N評価ボードとお手軽ライブラリRXduino」ということで、究極のRX62N評価ボードをメインとした展示を行わせていただきます。会場では、いろいろお話させていただければと思います。

Rene_timetable

また、土曜日の13:00~13:45には、パネルディスカッションも予定されています。テーマは「パネルディスカッション「組込み製品開発に“オープンソース”をどう生かすか」」ということですが、私の立場からして、何が何でもオープンソース推進というわけではないので、ちょっと違った立場から参加させていただくことになります。

どうなるか楽しみです。

ルネサスエンジニアフォーラムは入場無料ですが、セミナーの参加は事前登録が必要です。下記のURLからお申込みください。

https://renesasevent.smktg.jp/public/application/add/31

では、お待ちしております。

【開催日程】

2012年9月6日(木)~8日(土)  3日間
※なひたふが登場するのは土曜日のみ!

【開催場所】
ルネサス半導体トレ-ニングセンター
JR総武線・地下鉄有楽町線・東西線・南北線・大江戸線 「飯田橋駅」 徒歩5分

Karuko_map

【参加費用】

無料(ただし、セミナーは要事前登録)

| | コメント (1)

2012.08.29

ジョロキアさんの収穫

ジョロキアの実がいっぱいできたので、収穫しました。

ジョロキアというのは、世界一辛いといわれている唐辛子の仲間です。植えたのは昨年ですが、越冬して、今年にはじめて実ができました。

Joro1

こんなかわいい実が生っています。

Joro2

収穫してちょっとかじってみると、口にいれたとたん肉汁があふれ出し、一瞬甘いと錯覚してしまうような辛さが脳天を突き抜けました。

ジョロキアレベルの唐辛子になると、切った汁が手につくと一日中手が痛くなります。こんなものを好んで食してしまうとは、人類の胃袋というのはまったく不思議なものです。

ジョロキアのスコビル値(唐辛子の辛さの単位)は85万SHUということですが、気候によって大きく左右されるとのことです。測ってみたいですね。

【ご参考 ブート・ジョロキア】
http://ja.wikipedia.org/wiki/%E3%83%96%E3%83%BC%E3%83%88%E3%83%BB%E3%82%B8%E3%83%A7%E3%83%AD%E3%82%AD%E3%82%A2

| | コメント (1)

2012.08.22

RXduinoがRX63N評価ボード「YRDKRX63N」に対応した

先日ルネサスアメリカのRX63N評価ボード「YRDKRX63N」という評価ボードを購入しましたので昨夜すこしいじってみました。

まずハマったのは、このボードはUSB OTGに対応しているのですが、USBの認識(D+のプルアップ)で複雑なことをしているようで、CPUにリセットをかけてもUSBの切断・接続が認識されず、PnPが走らないということがありました。この問題に対処するには、R42を外す必要がありそうです。

そんなこんなでRXduinoを移植してみたところ、UART、USB、RTC、イーサ、アナログ入出力、tone、SDメモリカードなどいろいろ動くようになりました。

オンボードの液晶は、標準的なキャラクタ液晶ではなく、グラフィック液晶のものなのでまだ対応していません。これが動けばもっと面白いのでしょう。

Yrdkrx63n

ボード上のスピーカはPORT1.7につなっています。試しにtone関数でtone(PIN_P17,1000)として音を鳴らしてみると、ボード上のスピーカがけたたましい音量で鳴ります。このスピーカの波形をオシロで見たらノイズだらけでした。どうやらパワーアンプがΔΣタイプのもののようで、ノイズだらけのように見える波形が正しいようです。綺麗なアナログ波形を与えたら、きっと大迫力の音がなるのでしょう。

また、オンボードでマイクロフォンも乗っているので、マイクから入力したアナログ値をPWMでスピーカへ出力してみたところ、超音波レベルでの回り込みなどがあるのか、ノイズだらけで駄目でした。

レガシーシリアルは、SCI2Bが使われるようですが、MD=0(つまり書き込み時)はSCI1に変わります。セレクタなどの周辺ロジックをためらいもなく使っています。

LANを使うには、PORT_PC3をLレベルにしなければなりません。PC3が周辺ペリフェラルのリセット信号(アクティブH)になっているらしく、これをLにしないとPHYチップがリセットかかりっぱなしになってしまいます。LANを動かせばボードからインターネットへつないで、Twitterへつぶやくということもできました。

Yrdk_rtc

特電のWebコンパイラは、本日、このボードのプログラムもコンパイルできるように更新しました。まだGPIOの番号の割り当ては決まっていませんが、PIN_PC3や、PIN_P54のようにIOPORT名で指定すればGPIOもいじれます

http://rx.tokudenkairo.co.jp/webcomp/

このボードをお持ちの方は、ぜひお試しください。

| | コメント (0)

2012.08.18

KoboのJTAG配線を引き出してバウンダリスキャンする(2)

さて、KoboのJTAGがどこから出ているかわかったので、Koboの背中に穴をあけて、JTAG信号を筐体の外に取り出します。

Kobo_jtag_extract

取り出した配線を、ホットボンドで固定して、完全に違う目的のガジェットが出来上がりました。

Kobo_jtag_extcon

このJTAG対応Koboに対してMITOUJTAGを使ってみて、いろいろわかってきました。

まず、Koboの画面の表示が変わるときにEPDC_*という端子が動きます。EPDC_*のデータバスは8bitのようです。画面が変わらないときには、EPDC_*は全く動きません。Koboのディスプレイパネルを使って別のおもちゃを作りたいときが来たら、さらに解析することにしましょう。

Kobo_epdc

また、Koboを7.5秒間操作しないと、SDRAMの信号が止まってしまうこともわかりました。きっと軽い低消費電力モードに入るのでしょう。

Kobo_sdram

あと、電源スイッチの横にあるLEDは、緑がB3番ピン、赤がB5番ピン、青がF5番ピンにつながっていることもわかりました。筐体表面にある唯一のボタンはD1番ピン(KEY_ROW0)につながっていることもわかりました。

MITOUJTAG上でスクリプトを書いて、このLEDを赤・青・緑・白とチカチカさせることにも成功しました。

といっても、JTAGバウンダリスキャンでできることは、このくらいが限度です。
※Koboの基板上にはNXP製のI2C温度センサがあるので、あとはこれを読むことくらいが精一杯か。

さて、このi.MX507というCPUには、JTAG_MODという端子があります。この端子の状態によって、i.MX507のJTAGの機能は大きく変わります。

一般的にARM系のデバイスは、SoCといって、ARMのコアと、周辺のペリフェラルの部分が別々に設計されて、1つのチップに乗っかっています。i.MX507をi.MX507たらしめている様々な周辺ペリフェラル部分はFreeScaleが設計して、Cortex-A8の部分はARMが設計しています。

このように、複数のデバイスが複合されたものなので、JTAGのチェーンは、FreeScaleの部分(SJC)だけを通るか、ARMの部分を通るか、という選択ができるようになっています。それが、JTAG_MODという端子の役割です。

JTAG_MODがLレベルの場合は、SJC(System JTAG Controller)というFreeScaleの部分と、SDMA(Smart Direct Memory Access Controller)と、DAPという3つのデバイスが内部でチェーン接続されます。
JTAG_MODがHレベルの場合は、SJCだけがチェーン接続されます。

Sjc_mod

(i.MX50リファレンスマニュアルより引用)

先日のiW-RainboW-G13Sというi.MX508評価ボードでは、「SJC」と「謎デバイス」と「DAP」が見えていると書きましたが、おそらくこの基板でのJTAG_MODはLだったのでしょう。KoboではデフォルトではSJCだけが見えているので、JTAG_MODはHなのでしょう。

そこで、JTAG_MODをLにすると、ちゃんと3つのデバイスが見えるようになりました。真ん中のSDMAというデバイスは、i.MX507のDMAコントローラなのですが、これをJTAGで操作すると何が起こるかというのはわかりません。また、本物のSDMAが見えているのではなく、alternateな物が見えているという話も、ハードウェアマニュアルに書かれています。

さて、JTAGでこんなことができると、セキュリティ的に大丈夫なのかと疑問を持たれるかもしれません。調べたところ、i.MX507のJTAGのセキュリティには3段階あって、

① デバッグ不可。最大セキュリティ
② セキュアJTAG。チャレンジ・レスポンスによって第三者のアクセスを排除する。
③ JTAG許可。低セキュリティ。常にデバッグ許可。

が選択できるようになっています。選択といっても、eFUSEという内蔵のヒューズを焼き切ることで行います。eFUSEは一度設定すると元に戻せませんから、工場でプログラムを書き込んだときにデバッグ禁止に設定できるわけです。

ここで禁止されるJTAGというのは、ARMのCPUのICE(実行中の命令を置き換えたり、メモリやレジスタの中を覗き見る機能)を意味しています。つまり、CPUに内蔵されたヒューズを焼き切ってしまえば、JTAG ICEをつないでもデバッグができなくなります。ただし、プログラム上から一時的にJTAGデバッグを可能にするレジスタもあるようですので、開発した会社なら製品出荷後もデバッグできるような方法を残しておくことも可能です。

バウンダリスキャン(I/O端子の状態をのぞき見る機能)は、このセキュリティ制限の対象外ですので、JTAG ICEが禁止されている状態でも使えるようです。ただし、バウンダリスキャンも禁止するような完全なJTAG禁止モードもあるようです。

KoboをJTAGバウンダリスキャンすることで、端子のI/Oの状態はいろいろわかったけれども、特にこれ以上できることはなさそうです。

もし、Cortex-A8に対応したJTAGデバッガをお持ちの方がいらっしゃいましたら、JTAG_MOD=Lにして、JTAGデバッガをつないでみてください。

| | コメント (2)

2012.08.17

KoboのJTAG配線を引き出してバウンダリスキャンする(1)

Koboという電子ブックリーダがあります。

ARM9 Cortex™-A8 のSoC i.MX507やi.MX508が乗っていて、末端価格7900円くらいで売られているのでとてもお得なボードです。このKoboをARM Cortex™-A8 評価ボードとするため、基板を解析してJTAG配線を引き出すことにします。

まず、ジャンクで構わないのでとりあえずKoboを入手します。

最初の1台目は動かなくても映らなくても結構です。

蓋を開けて、基板を眺めてみます。

Kobo1

基板を取り外します。基板上にはJTAGと書かれたコネクタはありませんので、どこにJTAGの端子が出ているかはわかりません。

Kobo2

CPUを眺めます。IMX507と書いているので、きっと507なのでしょう。

このCPUはこれで見納めです。心置きなくみておいてください。

Kobo3

ヒートガンを用意して、CPUをあぶります。

Kobo4

少し焦げたけれど、CPUは無事外れました。

Kobo5

ちょっとあぶりすぎたので基板がこげてしまいましたが、問題ありません。

基板を少し綺麗にして、i.MX507/i.MX508のデータシートを見ながら、JTAGの端子が基板上のどの配線につながっているかを解析します。

JTAGの配線が、基板の裏側のある場所につながっていることがわかったので、そこから配線を引き出します。

Kobo6

次に2台目のKoboを用意し、先ほど解析したJTAGの信号にJTAGケーブルをつなぎます。MITOUJTAGを起動して、自動認識させます。すると・・

Kobo7

ちゃんとIDCODE=02D0101Dのデバイスが認識されました。

ここで、iMX50のBSDLファイルを割り当てると、

Kobo_bscan

このとおり、端子の状態が可視化できました。

Kobo起動時のLEDの点滅の状態や、

Kobo_bscan_led

Kobo起動時のSDRAMの状態も見えました。

Kobo_bscan_sdram

ちなみに、KoboのSDカード自体には何も手を加えていないので、Koboのデフォルトのソフトウェアがそのまま動いています。

KoboのJTAG配線をどこから引き出せばよいかは、今月発行予定の「月刊 特電技術 Vol2」に書こうと思います。

次のブログでは応用編を書きます。

| | コメント (0)

2012.08.13

Xorshiftで乱数発生

Xorshiftという乱数発生アルゴリズムがあります。

http://ja.wikipedia.org/wiki/Xorshift

uint32_t xor128(void) { 
  static uint32_t x = 123456789;
  static uint32_t y = 362436069;
  static uint32_t z = 521288629;
  static uint32_t w = 88675123; 
  uint32_t t;
 
  t = x ^ (x << 11);
  x = y; y = z; z = w;
  return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)); 
}

32bitの内部変数を4つ持っていて、それをぐるぐる回しながらシフトさせて、Xorをとるという単純なアルゴリズムです。それで、周期が2^128-1というとても優れたものです。

このアルゴリズムはとてもFPGA向けだと思います。

なぜなら、

  • XORとSHIFTだけなので、LUTだけで作れる(内蔵乗算器が不要)
  • 加算も不要なので、桁上がりがなく、高速
  • 乱数が32bit単位で計算されてくる

今まで乱数生成用にLFSRを使っていましたが、LFSRだと1ビットごとにしか結果が出てこないのに対し、XORSHIFTなら32bit単位で出てくるので、とても使いやすいのです。

で、何をしようとしてこのアルゴリズムを使おうとしたかというと、特電SATA-IPコアのテストです。500GBのHDDを乱数で埋め尽くして、それをPCで読み出して読み書き内容の照合をしようとしています。

Sataxorshift

500GBのHDDということは、39bitにもなるので、周期が32bitやそこらの乱数では足りないわけです。単純なLFSRだと500GB埋める前に周期が来てしまいます。

そこで、簡単なアルゴリズムで、周期が長く、そこそこ優れた乱数を発生させる方法を探していてXORSHIFTに出会ったというわけです。

| | コメント (0)

2012.08.10

YRDKRX63NというRX63N評価ボードを購入

ルネサス(おそらくアメリカ)純正のRX63N評価ボード、YRDKRX63NというのがAVNETにあったので、購入してみました。

ボード価格は$99だけど、運送料が5000円かかるというもの。

とっても豪華なボードでした。RX63NB(つまり1MB品)が乗っていて、そのほかに、グラフィック液晶、RS232C、MicroSD、CAN、SerialFlash、LAN、スピーカ、オーディオ入出力、スイッチ、LEDなどがあります。

Yrdkrx63n_1

液晶の裏には、Segger社のUSB-JTAGのチップが隠されています。ちょっと液晶を外すのが怖いので、USB-JTAGの解析はしないでおきましょう。

基板の裏面には、いろいろと使い方がシルクで書かれているようです。

Yrdkrx63n_2

裏面には部品はありません。

電源を入れると、uCOSが動いているのでしょう、液晶に何か表示が出ます。

Yrdkrx63n_3

さて、このボードにRXduinoを移植しようと思います。

こんなにたくさんの周辺部品が乗っているのだから、きっと、面白いことができるはず。

しかし、書き込みがちょっと大変。USBブートモードにしても、リセットスイッチだけでは認識されません。

というか、USBを差していた状態でリセットしても、その抜き差し信号(つまり1.5kΩでのプルアップのところ)がホストPCに伝わらないようで、USBの状態が変わりません。

これはYRDKRX62Nでも同じでした。きっとOnTheGoに対応するためのハード上の何らかの事情があるのでしょう。

書き込みは、rxprog63nb.exeで行えました。

Yrdkrx63n_4

現在のRXduinoは、このYRDKRX63Nに対してLANも、SDメモリカードも、LEDも対応していませんが、今後対応していきたいと思います。

なお、CPUだけで実験できるところまではちゃんと動きました。USB仮想COMポートもばっちりでした。

Yrdkrx63n_5

| | コメント (0)

2012.08.08

i.MX508(Cortex-A8)のバウンダリスキャン

FreeScaleのi.MX508というプロセッサがあります。Cortex-A8を内蔵したプロセッサで、電子図書などに最適といわれています。

このたび、あるお客様から、i.MX508のバウンダリスキャンを行いたいとのご要望を受け、i.MX508を搭載した評価ボードをいろいろ探し、iW-RainboW-G13Sというボードを購入することにしました。

しかし、このボードは日本には在庫がないらしく、インドからの取り寄せで3週間かかるとのことでした。今から約3週間前に注文して、昨日届きました。

早速、MITOUJTAGをつないでみました。

Imx508_1

このiW-RainboW-G13Sボードには20ピンのJTAGらしきコネクタが出ています。ピン配置はARMの標準20ピンのようです。

MITOUJTAGをつないで、いざ、自動認識してみると、・・・2つのデバイスが認識されました。IDCODEが未登録のデバイスなのでgenericと出ています。

Imx508_17

画面をクリックして、IDCODEを見てみると、左のは02D0101D、右のは1BA00477でした。

一方、FreeScaleのWebサイトからiMX50のBSDLファイルをダウンロードしてくると、iMX508の外側のIDCODEは02D0101Dなので、左のものはFreeScaleのi.MX508そのものであることがわかりました。

Imx508_2

※i.MXなどのSoCといわれているデバイスは、CPUのコアと外側のペリフェラルが別々に作られていて、デバイス内部で複数のJTAGデバイスがチェーン接続されているように見えるのが一般的。

しかし、右のデバイスが何であるかは依然として不明です。おそらくCortex-A8のコアそのものだろうと思い、BSDLファイルを記述してみますが、なかなかインフラストラクチャエラーが消えません。無理やりバウンダリスキャンしても結果は正しくなさそうでした。

Imx508_16

ARMの出すCPUは、命令レジスタ長がいつも4bitなので今回もだろうと推測したのですが、どうもうまくスキャンできません。オシロでTDIとTDO、TCKの関係を見て見ると、8bitの長さがありそうです。

また、ARMのWebサイトにいって、Cortex-A8のJTAG仕様を探したのですが、見つかりませんでした。

ようやくわかったことは、このi.MX508というデバイスは、i.MX508本体→謎デバイス→Cortex-A8と3つのデバイスが中でチェーン接続されていたということです。

ここでいう「謎デバイス」とは、おそらくDAPといわれるものではないかと思われます。このDAPにはJTAGのIDCODEがなく、命令長が4bitであるため、Cortex-A8が8bitの命令長を持つデバイスのように見えたのだと思われます。

そういうわけで、i.MX508→DAP→Cortex-A8と3つのデバイスを手動でチェーンに追加していったら、インフラストラクションテストにも通り、バウンダリスキャン結果も正しいものになりました。

Imx508_3

このiW-RainboW-G13Sというボードは、デフォルトでLinuxが動くようになっています。そこで、Linuxが起動するまでの約20秒間の、iMX508の全端子の状態を波形としてキャプチャしてみました。

①DRAM_SDCLKが激しくうごいている。EPDC_SD*というのは何だろう。画像関係?Imx508_4

②DRAM_SDDQSが緑色が多いので、読み出しが多いと思われる。CSPIも少し動く。
Imx508_5

③システム起動後8秒後くらいで画像が出るのだろうか。DISP関係が激しく動きだす。
Imx508_7

④EIMというのは外部拡張モジュールらしい。特に動いていない。
Imx508_8

⑤起動直後からDRAM_*が激しく動いている。読み出しが主。メインメモリだろう。
Imx508_9

⑥メインメモリのデータと、アドレス線。
Imx508_10

⑦DISP関係の信号。ECSPIというのも少し動く。
Imx508_11

⑧UARTが最初からポツリポツリとデータを送信している。
Imx508_12

⑨システム起動後8秒くらいまではSD2の信号が激しくうごいている。おそらくSDメモリカードからブートデータを読み出しているのだろう。その後はSD2は動かない。
Imx508_13

⑩ SD1というのはポツポツ動いている。データ用のSDカードか?Imx508_14

こうして、iMX508がバウンダリスキャンできるようになりました。回路図もマニュアルもない状態でも、MITOUJTAGでCPUの端子が見えれば、これだけのことがわかります。

iMX508のバウンダリスキャンを行うためのBSDLファイルを必要とされるお客様はご連絡ください。余力があればKOBOとかいう電子ブックリーダーもバウンダリスキャンして解析してみたいと思います。

MITOUJTAGについて詳しくはこちらをご覧ください。

*おまけ iMX508のLinux起動画面

Imx508_15

| | コメント (2)

2012.08.04

ルネサスRX62N/RX63NマイコンからTwitterに投稿するには

ルネサスRX62N/RX63Nマイコンには、ネットワークコントローラが内蔵されています。
この内蔵LANを使ったアプリケーションとして、ツイッターにつぶやくプログラムを公開します。

自作プログラムからTwitterにつぶやくにはOAUTHとかいう認証方法でログインしなければなりませんが、これはとても面倒くさいそうです。

そこで、この認証を代行してくれるWebのサービスを使います。

例えば、http://www.supertweet.net/ というのがあります。

このsupertweetにアカウントを作れば、supertweetへ簡単な認証(BASIC認証)でログインすれば、supertweetの中のプログラムがOAUTH認証を行ってTwitterへ代理で投稿してくれるというものです。こういうサービスは探せば他にもあると思います。

まず
http://www.supertweet.net/
でアカウントを登録します。

未確認ですが、自分でホストすることも出来るようです。
http://code.google.com/p/supertweet-twitter-api-oauth-proxy/downloads/list

登録したら、パスワードをActivateというリンクから登録します。パスを登録したら、以下のようにtelnetすることによって投稿できます。

telnet api.supertweet.net 80
(接続)
POST /1/statuses/update.xml HTTP/1.0
Host: api.supertweet.net
Authorization: Basic ●●●●●●● (user:passwordをbase64でエンコードしたもの)
Content-type: application/x-www-form-urlencoded
Content-Length: 13(status=の部分の文字のバイト数)
(改行)
status=aaaaaa(内容)
(改行)

こんな感じのテキストベースのやりとりをすればいいので、TELNETを使ってTwitterに投稿できるというわけです。

status=aaaaaaの部分がつぶやく内容で、Content-Length: 13の部分がその長さ(status=も含む)です。

ただし、supertweetでは2バイト文字が扱えないようなので、日本語は書けません。日本語でつぶやくにはhttp://twitter-basicauth.appspot.com/ を使うといいという話もあります。UTF-8なので漢字1つが2バイトではないので、ややこしいです。また検証して、近々書こうと思います。

ユーザ名とパスワードは username:password をbase64でエンコードしたものなのですが、改行コードとか厳密に決まっているようで、ちゃんと改行コードも含めてエンコードしないと認証が通りません。

linuxの端末があれば、 echo -n user:pass|base64

でエンコードして、それを貼り付けてください。なお、一見ぐちゃっとした文字列になりますが、暗号化しているわけではないので「つつぬけ」です。ご注意ください。くれぐれもbase64でエンコードされたusername:passwordの文字列をネットに貼り付けたりしないようにしてください。

なお、このプログラムはGR-SAKURA上で設計されましたが、特に何らかの制限をつけているわけではありません。内蔵ネットワークコントローラとRTC以外のリソースは使っていないので、あらゆるRX62N/RX63Nで動くはずです。

世界中に既に何億個とあるRXマイコンがつぶやきはじめる。すばらしい世界ではないですか!?
皆様のお持ちのボードでもつぶやかせたい、というご要望がございましたら、ぜひお寄せください。いろいろなボードに対応させますし、ライブラリも徐々にオープンにしていこうと思います。

現状では、ルネサスのWebコンパイラでコンパイルすればGR-SAKURA用のプログラムになりますし、特電のWebコンパイラでコンパイルすれば、究極RX62Nボードでも、RaXinoでも、Interface誌付録基板でも走るようになると思います。それ以外の各社のRX62N/RX63Nボードでも、外付けPHYのポート構成が上記の評価ボードと(約1/2以上の確率で)一致するようであれば、動いてしまうと思います。

「このボードでも動かしたい」というご要望がありましたら、ぜひお寄せください。

ぜひお試しください。

#include <rxduino.h>
#include <Ethernet.h>
#include <rtc.h>
byte mac[] = { 0x02, 0x00, 0x00, 0x00, 0x11, 0x49 };
TEthernet Ethernet;
EthernetClient client;
int sw_prev = 1;
int count = 0;
void debug(int num) {
    digitalWrite(PIN_LED0, num & 1);
    digitalWrite(PIN_LED1, num & 2);
    digitalWrite(PIN_LED2, num & 4);
    digitalWrite(PIN_LED3, num & 8);
}
void tweet(char *message) {
    byte *server = Ethernet.gethostbyname("api.supertweet.net");
    debug(6);
    delay(50);
    printf("Server addr = %d.%d.%d.%d\n",server[0],server[1],server[2],server[3]);
    if (client.connect(server, 80)) {
        debug(7);
        delay(100);
        char status[1024];
        char *p = status;
        p += sprintf(p,"POST /1/statuses/update.xml HTTP/1.0\r\n");
        p += sprintf(p,"Host: api.supertweet.net\r\n");
        p += sprintf(p,"Authorization: Basic bmFoa●●●●●●●●●●●●●●=\r\n");
        p += sprintf(p,"Content-type: application/x-www-form-urlencoded\r\n");
        char tmp[32];
        sprintf(tmp,"Content-Length: %d\n",(int)strlen(message)+7);
        p += sprintf(p,tmp);
        p += sprintf(p,"\n");
        p += sprintf(p,"status=");
        p += sprintf(p,message);
        p += sprintf(p,"\n");
        p += sprintf(p,"\r\n");
        client.write(status);
        Serial.write(status);
        debug(8);
    }
    else {
        Serial.println("connection failed");
    }
    debug(9);
    sw_prev = 0;
}
void setup() {
    pinMode(PIN_LED0,OUTPUT);
    pinMode(PIN_LED1,OUTPUT);
    pinMode(PIN_LED2,OUTPUT);
    pinMode(PIN_LED3,OUTPUT);
    pinMode(PIN_SW  ,INPUT);
    debug(1);
    Serial.begin(38400,SCI_USB0);
    debug(2);
    Serial.setDefault(); // printfをSerialに出力
    Serial.println("connecting...");
    Ethernet.begin(mac);
    int year,mon,day,hour,min,sec;
    RTC::getDateTime(year,mon,day,hour,min,sec);
    debug(3);
    while(1) {
        Serial.print("MY IPADDR=");
        Serial.println(Ethernet.localIP());  // IPアドレスを表示
        if(stricmp(Ethernet.localIP(),"0.0.0.0")) break;
        debug(4);
        Serial.println("retry..");
        Ethernet.dhcp();
    }
    debug(5);
    char message[1024];
    sprintf(message,"This tweet is from GR-SAKURA. But every RX62N/63N board has avility to tweet. I will soon support. Current RTC time is %d/%d/%d %d:%d:%d. Nahitafu. ",year,mon,day,hour,min,sec);
    tweet(message);
    while(client.connected()) {
        Ethernet.processPackets();
        if (client.available()) {
            char c = client.read();
            Serial.print(c);
        debug(c);
        }
    }
}
void loop() {
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
    debug(c);
  }
}

| | コメント (2)

2012.08.03

MR-RX47Tを入手!

三菱のMR-RX47Tを購入しました。

この型番を見てマイコンを想像した方はきっとお疲れです。

マイコンだと思ってTwitterから来た人は、ぜひリツイートをお願いします。

MR-RX47T-Wというのは冷蔵庫です。

Mrrx

今まで使っていた冷蔵庫は、夏になると、ある時突然、パワーが低下するという現象がおきていました。冷蔵庫の温度が16℃くらいまでしか下がらず、冷凍室の温度が2℃くらいになるという症状でした。

冷蔵庫が冷却をしようとしないのですが、リセットを何回かかけると、稀に復帰します。メーカーは修理不能といっていたのですが、もう何年もだましだまし使い続けてきました。

木曜日の昼ごろ、今年もその症状が現れました。従来使っていた冷蔵庫の冷却能力に著しい減少が見られ、このままでは中身の食材が傷んでしまうと判断されたため、夜中に急遽ヨドバシに行って「おすすめNO1」と書かれていた冷蔵庫を注文してきました。

幸い、翌日の夜の配送の便が1個空いていたので、食材は冷凍庫に避難することで痛みは最小限に治まりました。

もちろん、この冷蔵庫の型番が購入の決め手になったことは言うまでもありません。

高性能タイマーがいっぱい入っていそうな冷蔵庫です。
でも、入っているのは牛乳です。

Mrrx47t

冷蔵庫の省エネ性能は数年前と比べると格段に向上しているそうです。

買い換えてよかった。

| | コメント (2)

2012.08.01

GR-SAKURAで周りの温度を測ってみる

RX63Nの大きな特徴のひとつに、温度センサを内蔵している、というのがあります。
(我ながら、なんてマイナーな機能を紹介するんだ)

そこで、GR-SAKURAで周りの温度を測ってみることにしました。

作ったプログラムはこんなかんじ。

#include <rxduino.h>
#include <iodefine_gcc63n.h>
int main() {
    int i;
    pinMode(PIN_LED0, OUTPUT);
    digitalWrite(PIN_LED0, 1);
    Serial.begin(38400,SCI_AUTO);
    Serial.setDefault(); // printf等の標準出力にする
    digitalWrite(PIN_LED0, 0);
    adc_init(); // 内蔵ADCを初期化する
    S12AD.ADSSTR23.WORD = 0xff14; // ADCのサンプリングタイミングを遅くする
    while(1) {
        int val= adc_sample(100); // 温度を測る
        printf("val=%d ",val); // 表示
        double Vs = val * 3.3 / 4096; // 電圧に換算
        double V1 = 1.26; // 25℃での電圧
        double Slope = 0.0041; // V /℃
        printf("Vs=%f[V] V1=%f[V] Slope=%f ",Vs,V1,Slope);
        double T = (Vs - V1) / Slope + 25;
        printf("T=%f \n",T);
        delay(100);
    }
}

これを実行すると、こんな結果になりました。

val=1651 Vs=1.330151[V] V1=1.260000[V] Slope=0.004100 T=42.110081
val=1651 Vs=1.330151[V] V1=1.260000[V] Slope=0.004100 T=42.110081
val=1651 Vs=1.330151[V] V1=1.260000[V] Slope=0.004100 T=42.110081
val=1653 Vs=1.331763[V] V1=1.260000[V] Slope=0.004100 T=42.503094
val=1650 Vs=1.329346[V] V1=1.260000[V] Slope=0.004100 T=41.913589
val=1652 Vs=1.330957[V] V1=1.260000[V] Slope=0.004100 T=42.306602
val=1653 Vs=1.331763[V] V1=1.260000[V] Slope=0.004100 T=42.503094
val=1653 Vs=1.331763[V] V1=1.260000[V] Slope=0.004100 T=42.503094
val=1657 Vs=1.334985[V] V1=1.260000[V] Slope=0.004100 T=43.289116
val=1653 Vs=1.331763[V] V1=1.260000[V] Slope=0.004100 T=42.503094
val=1653 Vs=1.331763[V] V1=1.260000[V] Slope=0.004100 T=42.503094
val=1651 Vs=1.330151[V] V1=1.260000[V] Slope=0.004100 T=42.110081

このプログラムの動作を簡単に説明します。

まず、RX63N内蔵の温度センサは内部でADCにつながっていて、外付け部品が何もなくても内蔵温度センサの出力値が読めるようになっています。

温度センサの出力値をよむには、adc_init() という関数をコールしたあと、 S12AD.ADSSTR23.WORD = 0xff14; とします。

S12AD.ADSSTR23.WORD = 0xff14; というのが何をしているかというと、サンプリングの速度を遅くするための設定です。内蔵温度センサが結果を出力するには5μ秒かかりますが、内蔵ADCは1usで変換するので、早すぎて出力が確定するまえに読んでしまうからです。

ADSSTR23はサンプリング時間を調整するレジスタで、これを書き換えることで、サンプリング時間を長くすることができ、正確な温度が測れるようになります。

測ったADCの値は、3.3をかけて4096で割ることで電圧に換算できます。

温度と電圧は一次関数なので、

T=(Vs-1.26)/0.0041 + 25;

で求められます。上の定数は、25℃のとき温度センサは1.26[V]を出力し、傾斜は0.0041であるということです。この値はデータシートの紙上の値なので、実測値とは異なる可能性はあります。

±1℃程度の精度だそうですが、こんな簡単に温度が求まってしまうのですから、RX63Nは面白いと思います。

ちなみに、室温は30度くらいだと思いますが、測っているのはICのチップの温度です。IC自体がそれなりに発熱しているようです。電源投入直後は36℃でした。ドライヤーやハンダごてで炙ると80℃くらいまでいきました。

炙ったときの感触から、下の写真の赤丸をつけたあたりに温度センサがあるのではないかと推測できました。

Tempe

まぁ、いろいろ面白いICだと思います。

| | コメント (1)

« 2012年7月 | トップページ | 2012年9月 »