GR SAKURAを使ってLCDのタッチスクリーン(言い方統一されてないな)を使えそうなところに来て、指で押したら画面見えないじゃんという稚拙な思いつきにより、ごろ寝マウスの時に一瞬だけ活躍したヌンチャクをこいつらに接続してみたくなってたのが先週。
この1週間で起こったことを話すぜ!
Arduinoで試したし、Psocでも出来たつもりでいたI2C。RX63Nなら速攻でしょとたかをくくっていたのが運の尽き。もう何から書いたものか遠い目になってしまう。
まずRX側のI2Cの初期化。ハード的な接続は当時は梃子摺ってたと書こうと思っていたがそんなことは今となってはその程度、スムーズに行きましたと書く他はない。ちなみに参考書でRXマイコンのすべて応用編の中にI2Cを使ってEEPROMを制御するやり方が事細かに書いてあったけど、ピン設定などでRX62とRX63の間でレジスタ名称が変わってるのもあったりしてぶっちゃけあまり参考に出来なかった。これはあとで分かったこと。
相手関係なく送信信号を出すだけというハードルすらも越えられない。何か内部で許可が下りてない感じだった。色んなことを試し、マニュアルもI2Cの記述少ないんじゃない?と思うくらいにヒントが隠されてないか読みなおした。RX62での流れは参考になっていてその流れで書いてるつもりが通らない。
するとWEB上でRXクイックラーニングという動画で教えてくれる公式のサイトが見つかった。これでなんとRX63NでのI2Cの説明が行われていた。サンプルコードの紹介付きで。見てみると、初期化のコードが俺が見よう見まねで組み立てたものより少ない。機能ピンの設定が無いみたい。マニュアルで読み返すとマルチファンクションピンコントローラで設定しないでくださいと書かれている箇所もあった。これで俺が冗長に書いたから機嫌そこねたのかな。よし、と思ったがそのとおり書いたけど出来ない。
リセットの順番が思っていたのと違っていたので変えたりして試したけどダメ。書いてあるレジスタ設定は個々には自分でも導けたものだったけど、愚直にその通りに書き写してた。悩んだ挙句に上に書いた禁則ぽいMPCのピン設定をSDA、SCL共に付け加えたらちゃんとコマンド送ってくれた。もはやプルアップ抵抗これじゃダメなんじゃないか?とか思ってたくらい追い詰められてた。
もうこれでPC上の作業でしょとか思ってやってるんだけど、出来ない。ただデータを送るだけなら出来たけど、I2Cのペリフェラルを使う上では、スタート、ストップコンディションなどの送信処理の一連を関数化してないときつい。ただこれはRXクイックラーニングの動画上で、送受信関数が公開されていたのでこれを丸写しした。なのでこれでもうArduinoの時と同じでしょとか思ってたら、そうではなかった。
この時点でヌンチャクと接続はしてて、ハンドシェーク的な送信を行いたかっただけ。しかし何も応答してくれない。ACKを返してくれない。こんなに寂しいことはなかった。0x52,0x40,0x00を送るだけなのに何も返事してくれない。オシロも繋いだので見てるとスレーブアドレスだけ送って後はACK待ちでうんともすんとも言わない状態であった。
ここで全体の半分くらい”何も返事がない。”状態で悩んでたんだけど、不屈の精神でニコ動見ながらダラダラ何とか取り憑けないか頑張ってた。いつものもうイヤ!状態に移行し、冷静になって考えて、今更邪魔くさいけど成功例として存在するPSOCでの信号を見てみようということになった。
押入れの深ーいところから掘り出してセットアップ。
オシロで見てみると、なんかスレーブの信号違う。正直言うとかなり長時間かけて気がついたこと。
ん?かなり古い記憶が蘇ってきた。そういや外人の解析サイトで0x52のところや0xa4の所あったなと。これまでArduinoとPsocでつながった0x52しか試してなかった。01010010と10100100の違い。そのスレーブアドレスに0xa4入れてみた。するとビビビッとこっちの送信を受け入れてくれたみたいでずっとACK待ちだったRXが動いてくれてた。ああ、シフトの違いかぁ。たったそれだけのことで数日吹き飛んでた。
もうこれでハード的にも、ペリフェラル操作的にも大丈夫だよねと指示通り応答してくれるRXとヌンチャクに親しみを感じながら、スイッチ状態を受信できるように頑張ってた。
受信プロセスも送信よりは長いけどちゃんと専門の人が書いたものだしとヌンチャクからの信号を待っていた。6バイトの返答はしてくれるんだけど、Psocの時でもなかなか手ごわく、当時も6バイト全部FFの状態で悩んだものだった。今回も最初それ。
受信用のコマンド送ったあとリスタートじゃまずいんじゃないかとか色々攻めあぐねてた。自分のブログも読み返したり新しい情報ないかとWEBで血眼になって探したりしてた。しかし旬は過ぎているので新しい情報なぞあるはずもなく、昔あった情報が消えてるくらいだった。
クロック変えたり初期化時のメモリのアドレスっぽいパラメータシフト変えたりして送って見てたけど全敗。さらに昔見た1回めの読み込みで最後の受信データ取得後にNACK返すというおまじないのようなこともやってみてた。つかPsocの時それ実装してた。ここで4分の1くらい費やしたんじゃないかな。今となっては意味なかったことわかったけどw。
もう煮詰まってギブアップ宣言しようかなってくらいになった時、公開されてるArduinoのコード見て思ったことあった。ハンドシェークみたいなの終えた後は0x00だけ入れて読みに行けば6バイトのスイッチ情報返してくれるということになってるんだけど、loopのなかで0x00が終盤に書いてあって更にその後ディレイ入れてた。んで頭の受信コードに行ってそれらが繰り返される・・・おや?
俺のコードでは受信関数にコマンド送信もできるような構造になってるなってるので、ずっとそれ使ってた。公式のでは送信と受信の間はリスタートコンディションというので処理されてたけど、俺はそこを一旦ストップコンディションで線引し、またレジスタの準備ができるまで待ってスタートコンディション送るように改変はしてた。他の所でディレイ入れるのは試して見てたんだけど、ただそこに少しのディレイも存在しない。RX処理早いしね。
リスタートなんてもっと手際いいんじゃないかな。
んでその受信用のコマンドを0バイトにして送信機能を使うのをやめて、普通の送信関数で0x00を送り、ディレイを50msくらい入れて受信だけを開始するようにしてみた。すると・・・

ずーーーーーっとFFだった数値が動き出し、オシロも全バイト波形がビロビロするようになった。
こーこーかー。永かった・・・ほんとファイナルファンタジーだよ。
んでこの値で利用は出来ないので、デコードの記述も実装して線形的なアナログ値を得られるようになりました。
あ、ちなみにこの液晶でスクリーンにフルダルのフィルム貼りましたw。ipod用の安かったから切って貼った。家電系ではノングレアっていうのかな。うちの業界では一般的にフルダルと呼びます。
これで怪しい生き物の影が映り込むことなくなるかなw。

これでタッチスクリーンもヌンチャクも共存できるようになった。いやこれやっときたかったのよね。なんか気になって次のやりたいことなかなか行けなかった。次のやりたいこと?
さ、PCでゲームしよかw。
この1週間で起こったことを話すぜ!
Arduinoで試したし、Psocでも出来たつもりでいたI2C。RX63Nなら速攻でしょとたかをくくっていたのが運の尽き。もう何から書いたものか遠い目になってしまう。
まずRX側のI2Cの初期化。ハード的な接続は当時は梃子摺ってたと書こうと思っていたがそんなことは今となってはその程度、スムーズに行きましたと書く他はない。ちなみに参考書でRXマイコンのすべて応用編の中にI2Cを使ってEEPROMを制御するやり方が事細かに書いてあったけど、ピン設定などでRX62とRX63の間でレジスタ名称が変わってるのもあったりしてぶっちゃけあまり参考に出来なかった。これはあとで分かったこと。
相手関係なく送信信号を出すだけというハードルすらも越えられない。何か内部で許可が下りてない感じだった。色んなことを試し、マニュアルもI2Cの記述少ないんじゃない?と思うくらいにヒントが隠されてないか読みなおした。RX62での流れは参考になっていてその流れで書いてるつもりが通らない。
するとWEB上でRXクイックラーニングという動画で教えてくれる公式のサイトが見つかった。これでなんとRX63NでのI2Cの説明が行われていた。サンプルコードの紹介付きで。見てみると、初期化のコードが俺が見よう見まねで組み立てたものより少ない。機能ピンの設定が無いみたい。マニュアルで読み返すとマルチファンクションピンコントローラで設定しないでくださいと書かれている箇所もあった。これで俺が冗長に書いたから機嫌そこねたのかな。よし、と思ったがそのとおり書いたけど出来ない。
リセットの順番が思っていたのと違っていたので変えたりして試したけどダメ。書いてあるレジスタ設定は個々には自分でも導けたものだったけど、愚直にその通りに書き写してた。悩んだ挙句に上に書いた禁則ぽいMPCのピン設定をSDA、SCL共に付け加えたらちゃんとコマンド送ってくれた。もはやプルアップ抵抗これじゃダメなんじゃないか?とか思ってたくらい追い詰められてた。
もうこれでPC上の作業でしょとか思ってやってるんだけど、出来ない。ただデータを送るだけなら出来たけど、I2Cのペリフェラルを使う上では、スタート、ストップコンディションなどの送信処理の一連を関数化してないときつい。ただこれはRXクイックラーニングの動画上で、送受信関数が公開されていたのでこれを丸写しした。なのでこれでもうArduinoの時と同じでしょとか思ってたら、そうではなかった。
この時点でヌンチャクと接続はしてて、ハンドシェーク的な送信を行いたかっただけ。しかし何も応答してくれない。ACKを返してくれない。こんなに寂しいことはなかった。0x52,0x40,0x00を送るだけなのに何も返事してくれない。オシロも繋いだので見てるとスレーブアドレスだけ送って後はACK待ちでうんともすんとも言わない状態であった。
ここで全体の半分くらい”何も返事がない。”状態で悩んでたんだけど、不屈の精神でニコ動見ながらダラダラ何とか取り憑けないか頑張ってた。いつものもうイヤ!状態に移行し、冷静になって考えて、今更邪魔くさいけど成功例として存在するPSOCでの信号を見てみようということになった。
押入れの深ーいところから掘り出してセットアップ。
オシロで見てみると、なんかスレーブの信号違う。正直言うとかなり長時間かけて気がついたこと。
ん?かなり古い記憶が蘇ってきた。そういや外人の解析サイトで0x52のところや0xa4の所あったなと。これまでArduinoとPsocでつながった0x52しか試してなかった。01010010と10100100の違い。そのスレーブアドレスに0xa4入れてみた。するとビビビッとこっちの送信を受け入れてくれたみたいでずっとACK待ちだったRXが動いてくれてた。ああ、シフトの違いかぁ。たったそれだけのことで数日吹き飛んでた。
もうこれでハード的にも、ペリフェラル操作的にも大丈夫だよねと指示通り応答してくれるRXとヌンチャクに親しみを感じながら、スイッチ状態を受信できるように頑張ってた。
受信プロセスも送信よりは長いけどちゃんと専門の人が書いたものだしとヌンチャクからの信号を待っていた。6バイトの返答はしてくれるんだけど、Psocの時でもなかなか手ごわく、当時も6バイト全部FFの状態で悩んだものだった。今回も最初それ。
受信用のコマンド送ったあとリスタートじゃまずいんじゃないかとか色々攻めあぐねてた。自分のブログも読み返したり新しい情報ないかとWEBで血眼になって探したりしてた。しかし旬は過ぎているので新しい情報なぞあるはずもなく、昔あった情報が消えてるくらいだった。
クロック変えたり初期化時のメモリのアドレスっぽいパラメータシフト変えたりして送って見てたけど全敗。さらに昔見た1回めの読み込みで最後の受信データ取得後にNACK返すというおまじないのようなこともやってみてた。つかPsocの時それ実装してた。ここで4分の1くらい費やしたんじゃないかな。今となっては意味なかったことわかったけどw。
もう煮詰まってギブアップ宣言しようかなってくらいになった時、公開されてるArduinoのコード見て思ったことあった。ハンドシェークみたいなの終えた後は0x00だけ入れて読みに行けば6バイトのスイッチ情報返してくれるということになってるんだけど、loopのなかで0x00が終盤に書いてあって更にその後ディレイ入れてた。んで頭の受信コードに行ってそれらが繰り返される・・・おや?
俺のコードでは受信関数にコマンド送信もできるような構造になってるなってるので、ずっとそれ使ってた。公式のでは送信と受信の間はリスタートコンディションというので処理されてたけど、俺はそこを一旦ストップコンディションで線引し、またレジスタの準備ができるまで待ってスタートコンディション送るように改変はしてた。他の所でディレイ入れるのは試して見てたんだけど、ただそこに少しのディレイも存在しない。RX処理早いしね。
リスタートなんてもっと手際いいんじゃないかな。
んでその受信用のコマンドを0バイトにして送信機能を使うのをやめて、普通の送信関数で0x00を送り、ディレイを50msくらい入れて受信だけを開始するようにしてみた。すると・・・

ずーーーーーっとFFだった数値が動き出し、オシロも全バイト波形がビロビロするようになった。
こーこーかー。永かった・・・ほんとファイナルファンタジーだよ。
んでこの値で利用は出来ないので、デコードの記述も実装して線形的なアナログ値を得られるようになりました。
あ、ちなみにこの液晶でスクリーンにフルダルのフィルム貼りましたw。ipod用の安かったから切って貼った。家電系ではノングレアっていうのかな。うちの業界では一般的にフルダルと呼びます。
これで怪しい生き物の影が映り込むことなくなるかなw。

これでタッチスクリーンもヌンチャクも共存できるようになった。いやこれやっときたかったのよね。なんか気になって次のやりたいことなかなか行けなかった。次のやりたいこと?
さ、PCでゲームしよかw。