いつの間にかfreeで使えるCC5Xコンパイラがコードサイズ上限なしになってたんだぁ^^
http://www.bknd.com/cc5x/index.shtml
これでリロケータブルにしてリンクすることでコード上限制限を突破することも不要になった(リンクするようにするとコードサイズがでかくなるからねぇ)
2012年03月10日
2011年11月27日
2009年12月30日
iPhoneすごいっすねぇ
PICとはまったく関係ない話題ですが、iPhoneはすごいっすねぇ。
すっかりはまってます^^;
ネットブックよりユビキタス性は遥かに高く、携帯というよりはパソコンに近い。
アプリケーションが多いのも大きな魅力です。
それに安いので缶コーヒーを買う気安さで購入できます。
(でも個人的に使っているアプリは無料のものがほとんどですけどね)
最近話題のUStreamもすごいです。iPhone単体でライブのビデオ配信ができちゃいます。^^
ライブではないけどサンプルをどうぞ
すっかりはまってます^^;
ネットブックよりユビキタス性は遥かに高く、携帯というよりはパソコンに近い。
アプリケーションが多いのも大きな魅力です。
それに安いので缶コーヒーを買う気安さで購入できます。
(でも個人的に使っているアプリは無料のものがほとんどですけどね)
最近話題のUStreamもすごいです。iPhone単体でライブのビデオ配信ができちゃいます。^^
ライブではないけどサンプルをどうぞ
2009年09月05日
2009年06月06日
デジタル式定電流放電器の制作
最近、また時間がなかなかとれず開発作業が停止状態ですが、PIC16F88を使ったバッテリー放電器を作成中です。
特徴としては
1)できるだけ簡単な回路構成であること。
2)定電流式でしかも電流値を設定可能であること。
3)LCDで電圧、電流等をモニタできること
4)放電中の電圧や電流の値をシリアルでパソコンに送信できること。
といった、少々欲張った仕様です。
特に2)の実現のためには正攻法で実現しようとするとかなり回路が複雑になってしまいます。
今回は放電用として1Ωの抵抗を使って放電流を0.1〜1.0Aまでの範囲で設定できるようにすうため、PWM方式で定電流放電制御を行っています。(なので「デジタル式」と命名)
PWM式なので抵抗接続時と開放時の電圧を測定することで、放電電圧(抵抗値が1Ωなのでイコール放電電流値)と開放電圧がわかり、更に放電電流値にDutyを掛けることで平均電流が算出できます。この平均電流を一定値になるように制御することで定電流機能を実現しました。
またシリアル出力は回路簡略化のため、PICの出力を直接パソコン側のRx信号に接続しています(この場合PICに内蔵のUSARTを使うと論理反転する必要がるのでシリアル出力はUSARTは使わずソフトで生成し、論理反転はソフトで実現しました)
下のグラフが定電流値を0.5Aに設定した場合の放電時のデータ例で
紫:開放電圧
青:放電電流
緑:放電電流(平均値)
です。

特徴としては
1)できるだけ簡単な回路構成であること。
2)定電流式でしかも電流値を設定可能であること。
3)LCDで電圧、電流等をモニタできること
4)放電中の電圧や電流の値をシリアルでパソコンに送信できること。
といった、少々欲張った仕様です。
特に2)の実現のためには正攻法で実現しようとするとかなり回路が複雑になってしまいます。
今回は放電用として1Ωの抵抗を使って放電流を0.1〜1.0Aまでの範囲で設定できるようにすうため、PWM方式で定電流放電制御を行っています。(なので「デジタル式」と命名)
PWM式なので抵抗接続時と開放時の電圧を測定することで、放電電圧(抵抗値が1Ωなのでイコール放電電流値)と開放電圧がわかり、更に放電電流値にDutyを掛けることで平均電流が算出できます。この平均電流を一定値になるように制御することで定電流機能を実現しました。
またシリアル出力は回路簡略化のため、PICの出力を直接パソコン側のRx信号に接続しています(この場合PICに内蔵のUSARTを使うと論理反転する必要がるのでシリアル出力はUSARTは使わずソフトで生成し、論理反転はソフトで実現しました)
下のグラフが定電流値を0.5Aに設定した場合の放電時のデータ例で
紫:開放電圧
青:放電電流
緑:放電電流(平均値)
です。

2009年03月04日
赤外線でのコントロール実験
赤外線コントロールの実験を行いました。(このプログの最初の方の「赤外線での制御もやってみたい」で書いた方式ですが随分長い間(4年間も)温めていたものだ^^;)
方針としては、応答性を向上するためにデータ送信ビットレートをなるべく高速にすることです。
因みに、家電等で使用される一般的なフォーマット(NECフォーマット)では
リーダ部 : 16T(ON) + 8T(OFF) = 24T
カスタムコード(8bit) : 3T/bit x 8bit x 2 = 48T (0:2T,1:4T -> average:3T/bit)
データコード(8bit):3T/bit x 8bit x 2 = 48T
ストップ信号:1T(ON) + 41T(OFF) = 42T
で合計 162T で1T=約0.57ms なので全体で平均 92ms の時間をかけて16bitのデータを送信していることになり、実質的なビットレートとしては約 174bps となります(実際にはデータの反転データ送信等もあり一般的にいうbpsとは違います)。
今回考案したフォーマット(以前、「赤外線での制御もやってみたい」に書いたフォーマット)では約 8.3ms で 4bit(ID) + 6bit/ch x 4ch = 28bit
を送信しているので 実質的な通信速度は約 3400bps で、家電方式の20倍程度の速度ということになります。
今回と同様な用途と思われるエアロソアラの赤外線コントロールでは 6bit の制御信号を約18msで送信するので通信速度は約 333bps です。
低速な家電コントロール用の赤外線受光素子(PL-IRM0208-A538)を使って今回の速度を達成するには送信側はまぁいいとして受信側は調歩同期方式や家電のPPM方式もどきのようにサンプリングポイント時点の信号の状態をチェックするだけでは受信できず、エッジ割り込みとタイマー割込みを使って、エッジ毎に同期を取るようにしています(調歩同期のバイト毎同期ではなくビット同期)。
さらに受信側では100us周期の割込みで32段階のPWM制御を2ch(左右分)と正転/反転制御を行いました(chあたりの制御信号が6bitなので)。
完成した送信機と受信機の基板が下の写真です(共にPIC16F88でOneBitLoaderを使用)。受信機は秋月さんで購入したフラットパッケージのFET(uPA2753GR)を使うため、ハーフピッチのスルホール汎用基板を使いました。
また赤外線受光素子が5V動作のため、乾電池2本の電圧を昇圧してPICと受光素子用の5Vを作っています。 このためFETは正転/反転制御のため、ブリッジ状に組んでいますが、すべてNチャンネルにできます。
コントロール対象はタミヤ製の「壁づたいねずみ工作基本セット」を使用しました(基板ができるとすぐ試したかったので基板取付はとりあえずテープで仮付です)^^;
少し試すつもりが、結構面白い(特に水平/垂直のA/D変換値をソフトウェアでミキシングし左右のモータ制御としている部分)のでついつい夢中になってしまう・・・。
詳細は後日ホームページに公開予定です。
方針としては、応答性を向上するためにデータ送信ビットレートをなるべく高速にすることです。
因みに、家電等で使用される一般的なフォーマット(NECフォーマット)では
リーダ部 : 16T(ON) + 8T(OFF) = 24T
カスタムコード(8bit) : 3T/bit x 8bit x 2 = 48T (0:2T,1:4T -> average:3T/bit)
データコード(8bit):3T/bit x 8bit x 2 = 48T
ストップ信号:1T(ON) + 41T(OFF) = 42T
で合計 162T で1T=約0.57ms なので全体で平均 92ms の時間をかけて16bitのデータを送信していることになり、実質的なビットレートとしては約 174bps となります(実際にはデータの反転データ送信等もあり一般的にいうbpsとは違います)。
今回考案したフォーマット(以前、「赤外線での制御もやってみたい」に書いたフォーマット)では約 8.3ms で 4bit(ID) + 6bit/ch x 4ch = 28bit
を送信しているので 実質的な通信速度は約 3400bps で、家電方式の20倍程度の速度ということになります。
今回と同様な用途と思われるエアロソアラの赤外線コントロールでは 6bit の制御信号を約18msで送信するので通信速度は約 333bps です。
低速な家電コントロール用の赤外線受光素子(PL-IRM0208-A538)を使って今回の速度を達成するには送信側はまぁいいとして受信側は調歩同期方式や家電のPPM方式もどきのようにサンプリングポイント時点の信号の状態をチェックするだけでは受信できず、エッジ割り込みとタイマー割込みを使って、エッジ毎に同期を取るようにしています(調歩同期のバイト毎同期ではなくビット同期)。
さらに受信側では100us周期の割込みで32段階のPWM制御を2ch(左右分)と正転/反転制御を行いました(chあたりの制御信号が6bitなので)。
完成した送信機と受信機の基板が下の写真です(共にPIC16F88でOneBitLoaderを使用)。受信機は秋月さんで購入したフラットパッケージのFET(uPA2753GR)を使うため、ハーフピッチのスルホール汎用基板を使いました。
また赤外線受光素子が5V動作のため、乾電池2本の電圧を昇圧してPICと受光素子用の5Vを作っています。 このためFETは正転/反転制御のため、ブリッジ状に組んでいますが、すべてNチャンネルにできます。
| 送信機 | 受信機 |
コントロール対象はタミヤ製の「壁づたいねずみ工作基本セット」を使用しました(基板ができるとすぐ試したかったので基板取付はとりあえずテープで仮付です)^^;
少し試すつもりが、結構面白い(特に水平/垂直のA/D変換値をソフトウェアでミキシングし左右のモータ制御としている部分)のでついつい夢中になってしまう・・・。
詳細は後日ホームページに公開予定です。
| 赤外線制御マウス? |
2009年02月21日
PIC用コンパイラCC5Xのバグ
最近趣味の時間が取れるようになったので赤外線コントローラをいじっています。
生成コードサイズがFreeバージョンの上限の1KBを超えたのでソースを分割し、リロケータブルにしてからリンクするようにしました。
以前、電源電圧電流モニタを作成した時にもやったことなのですんなり行くかと思ったが動かない・・・・^^;
原因はコンパイラのバグでした。orz
Wレジスタに配列ポインタを代入すると誤った値で直値代入のコードが生成されてしまう(コンパイル時点ではアドレス解決できていないはずなのに・・・)
最新バージョン(Ver3.3H)にしても同様で、分割コンパイルして使う人は少ないからまだバグが枯れていないのかなぁ〜
生成コードサイズがFreeバージョンの上限の1KBを超えたのでソースを分割し、リロケータブルにしてからリンクするようにしました。
以前、電源電圧電流モニタを作成した時にもやったことなのですんなり行くかと思ったが動かない・・・・^^;
原因はコンパイラのバグでした。orz
Wレジスタに配列ポインタを代入すると誤った値で直値代入のコードが生成されてしまう(コンパイル時点ではアドレス解決できていないはずなのに・・・)
最新バージョン(Ver3.3H)にしても同様で、分割コンパイルして使う人は少ないからまだバグが枯れていないのかなぁ〜
---- sample of problem ----
743: ; W = &SndData[0]; // <- complier(3.3H,) bug. generated imidiate value setting
168 3043 MOVLW 0x43 744: MOVLW .67 ← 誤った値が代入される!!
745: ; FSR = W;
169 0084 MOVWF 0x4 746: MOVWF FSR
747: ; FSR = &SndData[0];
16A 302C MOVLW 0x2c 748: MOVLW LOW(SndData+0) ← 正しい値が代入される
16B 0084 MOVWF 0x4 749: MOVWF FSR
2009年01月28日
2008年12月02日
OneLineシリアル通信I/Fの超簡略化
bootloaderのバージョンアップが済んだので、1BITでのソフトウェアシリアル通信用インターフェースの見直しを行いました。
前回の5V対応で回路が結構複雑化してしまったので、今回は可能な限り簡略化するようにしました。
今回は回路シミュレータを使用したので抵抗値の決定等がとても楽で、回路自体がシンプルであることもありブレッドボードでの確認も行わず作成しましたが問題なく動作しました^^
(シミュレータの威力はすごい!。ラジコンヘリもPCのシミュレータで練習してから飛ばすのが王道らしい)
シミュレーションした回路と結果は次のとおりです。
前回の5V対応で回路が結構複雑化してしまったので、今回は可能な限り簡略化するようにしました。
今回は回路シミュレータを使用したので抵抗値の決定等がとても楽で、回路自体がシンプルであることもありブレッドボードでの確認も行わず作成しましたが問題なく動作しました^^
(シミュレータの威力はすごい!。ラジコンヘリもPCのシミュレータで練習してから飛ばすのが王道らしい)
シミュレーションした回路と結果は次のとおりです。
| シミュレートした回路 | シミュレート結果波形 |
|---|---|
| |
| 必要な部品はトランジスタ1個、抵抗4個、ダイオード2個なのでコネクタに直接半田付けして、コネクタケースに収まります。 詳細は近々ホームページで公開予定です。(当然、対応するPIC側bootloaderも公開します) |
2008年11月17日
PIC16F88 boot loader
OneBitLoaderではシリアル送受信を1つのI/Oポートでソフトウェアで実現していましたが、16F88に内蔵されているハードウェア調歩同期シリアルI/F(USART)に対応してみました。
シリアル通信部分はハードウェア処理でサイズが小さくなるのでブートローダサイズの最小化を目指した結果、0x0fa2-0x0fffの94ワードに収まりました(^^)
従来のソフトウェアによる1ビットシリアル送受信の場合も138ワードにダイエットできました。
近々公開予定です。
シリアル通信部分はハードウェア処理でサイズが小さくなるのでブートローダサイズの最小化を目指した結果、0x0fa2-0x0fffの94ワードに収まりました(^^)
従来のソフトウェアによる1ビットシリアル送受信の場合も138ワードにダイエットできました。
近々公開予定です。

