PICでVDDの供給電圧を自己測定する

PICマイコンは電池で動かすことも多いのですが、電源電圧が低下したときに、誤動作が起きる前に警告できないかと思ってためしてみました。

使っていたのは12F1822、このデータシートを眺めても、VDD電圧を直接得る方法はなさそうなのですが、ADコンバーターの記述の中で内臓の基準電圧があることや、これを入力チャンネル選べることが分かりました。
これを使って、外付け部品は一切なしで、しかもIOピンも消費せずにVDDが測れそうな気がしたので実験してみました。

 //100分の1V単位で電圧を返す。
//VDDを基準としてFVRの2.048VをAD変換する。
//2.048:VDD = AD値:1023 より、VDD = 2.048*1023/AD値
unsigned short VDD_get(void){
ADCON0bits.GO_nDONE=1;
while(ADCON0bits.GO_nDONE==0);
return 209510 / ADRES;
}

int main(int argc, char** argv) {
OSCCON = 0b01011010 ; // 内部クロックは1MHzとする
FVRCON = 0b10000010 ; // FVR 2.048V
ADCON0 = 0b01111101 ; // ADCのチャンネルをFVRに設定
ADCON1 = 0b10000000 ; // ADCの基準電圧をVDDに、データは右詰め
  unsigned short v;
while(1){
v= VDD_get();
__delay_ms(500);
  }
}

このようにしたところ、無事VDDが測定できました。0.1V単位でテスターの値とよく一致します。ただ、定期的に0.1V程度低い値を出力することがあったのですが、複数回測定して平均すれば問題ない範囲だと。

ダイソー豆炭を使ってみた

ダイソーに木炭紛を原料とする豆炭を発見。通常の豆炭は石炭を原料とするため、臭いが強くBBQには不向き。これなら使えるかなと思ったが、炭は燃やしてみないとわからないことが多いので、実験してみた。

特に写真は撮っていないが、結論としては、全く使い物にならない。

  • 表面に着火剤が含まれるので、点火は楽だけどしばらく臭い。
  • 臭いがなくなってから10分くらいはいい感じに使える。
  • 灰の割合が極端に多い。そのため、すぐに火力が落ちる。単独だと立ち消える。

これなら、ホームセンターの激安マングローブ炭のほうが幸せだな。

MAX7219搭載のユニットで7セグLEDを制御

PICマイコンで7セグLEDを表示するには、かなりのIOピンを必要とする。なんとかならないかと思っていたら、MAX7219搭載でシリアル通信で8桁のLEDを表示できる部品を見つけた。300円程度で購入できたので早速試してみた。

電源のほかには、3つのIOが必要で、I2CよりSPIに近いが、一方的に2バイト送り付けるだけなので、デジタルIOで送信する関数を使ったほうがよさそう。16F18325で試してみた。

/*
* 13 RA0 DIN 送信データ
* 12 RA1 CS 開始フラグ。Lowでデータ送信開始
* 11 RA2 CLK クロック供給
*/
void max_write(unsigned char addr,unsigned char data){
    int i;
    const unsigned char BitMask = 0b10000000;
    RA1 = 0;//CSをLowにして受信待機させる。
    for(i=0;i<8;i++){
        RA2 = 0;//クロックをLowに
        RA0 = (addr&BitMask)!=0;
        addr <<= 1;
        RA2=1; //クロックをHighに
    }
    for(i=0;i<8;i++){
        RA2=0;
        RA0=(data&BitMask)!=0;
        data <<=1;
        RA2=1;
    } 
    RA1=1;
    RA2=0;
}

この関数にアドレスとデータをパラメーターにして呼び出すと表示するはずが、なかなか動かなくてかなり苦戦した。
単純なミスで、初期化をきっちりしていなかったのが原因。mainで以下のようにすると無事動作した。

unsigned char i,j;

max_write(0x0C,0x01);//nomal oparation
max_write(0x09,0x00);//No Decode
max_write(0x0A,0x07);//LED輝度
max_write(0x0B,0x07);//ScanLimit
for(i=1;i<9;i++){
    max_write(i,0);
}

特に1つ目と4つ目が肝心、ShutDownモードになっていると全く動かない。Display
Testをすると、ShutDownが解除されそうな記述を見たけれど、そんなことはなかった。
ScanLimitを8桁全部にしておかないと、いくらデータを送っても反映されない。

できてしまえば、あとは非常に楽。数字だけなら、Decodeモードを使ったほうがいい。

PIC16F18325を使ってみた

DCモーターとRCサーボをコントロールするために、PIC16F1503を試してマイコンの勉強をしてみたのだが、ある程度なれたので別の石もと買ってみたのが16F18325。DIPの14pinというのが、ブレッドボードですぐに試せるのでありがたい。この石、同じ16Fシリーズでも1503とは全くの別物。メモリはでかいし、内臓オシレーターで32MHz駆動、タイマ等の機能がグレードアップしている。多機能な分、MPLAB XのプラグインMCCをうまく使う必要がある。

嬉しい発見があった。CLCを使うことで、意外と扱いが難しいRCサーボを内蔵PWMを使い、200~550程度の約350段階でデューティを制御できた。方法は、拡張されたタイマ0とタイマ2,CLCを使う。

まず、16MHzで駆動する。タイマ0は8ビットモードとし1:512のプリスケーラー、20480usでオーバーフローする設定にする。タイマ2は1:64のプリスケーラー、PR2の値はタイマ0と合わせる。すると、プリスケーラーに8倍の差があるので、同時スタートさせると、タイマ0が1回OFするときに、タイマ2は8回OFする。このタイマ2を発信源にPWMを動かす。

CLCで入力にTimer0overflowを選ぶと、overflowのタイミングでHighとなり、次のカウントでLowとなる。今回1:512のPSを設定しているので、128usHighが続きその後Lowとなる。

一方Timer2matchも同様だが、こちらは1:64のPSなので、High時間は16us。普通のSRラッチでも同時発生すれば必ずTimer0が勝つ。

 

MCCのデザイナを使い、CLCにT0overflowとT2matchを入力源として、図のようにする。

次に、このCLC1の出力とPWMの出力をCLC2でANDとれば出来上がり。

CLC2の出力は、PWM5を一回出力したら7回休み。20480us秒の最初2560us秒だけがduty変更の対象となる。RCサーボはおおむね800us~2200usが操作範囲だから、dutyは200~550が有効範囲となる。

 

 

 

このロジアナの表示は、D0がCLC0の出力、D1が、PWM5の出力、D2が最終の出力。これで割り込みを使わずハードウェア制御でRCサーボを滑らかにコントロール可能。ただし、CLCの数-1台までに限る。

ちなみに、eepromに書き込もうと思ったら、MCC3.36が吐き出すコードでは、ダメだったので注意。

さらに、simulatorのロジアナではCLCはうまく表示されないので、これも要注意。

PICマイコンで赤外線リモコンを受信する。

秋月電子で、赤外線リモコンが\300であった。面白そうなので、PICマイコンで受信するプログラムを書いたが、意外と苦戦したので、備忘録として書いておこう。

卓球の練習マシンを作っていたが、上ローラー、下ローラー、発射角度、発射周期、首振りなど調整項目が多く、アナログボリュームだと配線が大変だし、なによりマイコンのアナログ入力のピン数が増える。赤外線リモコンが使えれば、入力はデジタル×1で済むし、パラメーターを記録しておける。

で、使用したPICは16F1503 14pinDIPパッケージ。PWMが4つあり、モーター制御に向いている。ただ、DCモーターとラジコンサーボでは、PWM周期が違いすぎて両立はできない。よって、サーボはタイマ割り込みを使うこととする。

上記のことから、赤外線の受信には16F1503を内蔵オシレーターでの最高周波数16MHzで使用、タイマ1のゲート機能を使うこととする。赤外線受信モジュールは、常時Highで受信するとLowと逆転するが、かえって都合がいい。Highの部分だけを見れば受信可能だ。

リーダーが4500us、0が560us、1が1600us、リピートが2300usということで、16ビットタイマの上位8ビットのみを使いカウントする。

//リモコン受信データ
unsigned char IRBUFF[4];
unsigned char read_state=0;
unsigned char ir_repeat;

void interrupt isr(void){
    unsigned static char byte_pos;
    unsigned static char bit_pos;
    unsigned static char skip=0;
    unsigned char cnt;

    if (TMR1IF){            //タイマ1がオーバーフローした場合。
        read_state = 0;     //読み取り状態をリセットする。
        ir_repeat = 0;
        skip = 1;           // タイマがオーバーフローしたら、そのときのパルスは無効。
        TMR1IF = 0;
    }
    if (TMR1GIF){
        cnt = TMR1H;    //パルス High時間を取得 2us/count(L) 512us/count(H)
        TMR1L = 200;    //タイマの値を初期化。0.5ms程度のパルスでカウントできるよう下駄はかせ
        TMR1H = 0;
        if (skip) skip = 0;
        else switch (read_state){
            case 0:     //ヘッダ待ちモード
                if(7<cnt && 11>cnt){  //3.8ms~4.9ms ならヘッダ
                    IRBUFF[0]=IRBUFF[1]=IRBUFF[2]=IRBUFF[3]=0;
                    read_state = 1;
                    bit_pos = 0;
                    byte_pos = 0;
                    ir_repeat = 0;
                }
                break;
            case 1:     //ヘッダ完了。データ待ちモード
                if(1 > cnt || 4 < cnt){
                    read_state = 0;
                }else{
                    IRBUFF[byte_pos] |= (cnt > 2) << bit_pos++;
                    if (bit_pos==8){ //8bit読んだら、次のバイトへ
                        byte_pos++;
                        bit_pos = 0;
                    };
                    if (byte_pos == 4){ //4byte読んだら終了、次のパルスは無視
                        skip = 1;
                        read_state = 2;
                    }
                }
                break;
            case 2:     //読み込み完了。リピート待ち。
                 if (6 > cnt && cnt > 3){
                    skip=1;
                    ir_repeat = 1;
                }else ir_repeat = 0;
            break;
        }
        TMR1GIF = 0;    //割り込みフラグを解除して
        T1GGO_nDONE = 1;//ゲート待機モードに
    }

}

 

OATハウス(大塚ハウス)濃縮液

EC1.3になる100倍濃縮液(1液)はできそうだったので、こんどは倍の濃度に挑戦

1号15g、2号10gに水を加えて100mlとする。しかし、どれだけ混ぜても解けなかった。仕方がないので、さらに水を100ml加え100倍濃縮液にしようとしたが、それでも全く溶けきる気配がない。溶けないというより、なにかが沈殿してきているようにも見える。

残念ながら、1液をいきなり作るのは無理なようだ。

水耕栽培の液肥について試してみる。

水耕栽培の液肥には、大塚ハウス(OATハウス)を使用していたが、さまざまなサイトで紹介されているように、1号、2号を別々に水に溶かした濃縮液として、500倍に薄めて使用していた。

一方で、クロレラ培養などで紹介されているハイポネックス原液を使った方法では、これ1液を約1000倍に薄めて使用している。

なら、大塚ハウスも1液でいいんじゃない?ということで、500倍用の濃縮液を20mlずつに水60mlを加えて100mlとしてみた。計算上、100倍用の濃縮液となった。いまのところ沈殿が起きる様子も特に変わった反応が起きた様子もない。これでしばらくはクロレラやミドリムシを培養して様子を見てみようと思う。

さらに、200倍の濃縮液が可能かも試してみることにする。

1号15g、2号10g、5号0.2g これに水を加え100mlとする。A処方で200倍だとEC1.3となるはずだ。100倍ならEC2.6。

2日後にみてみたら、残念ながらなにかの結晶が沈殿していた。やはり、大塚ハウスを1液にするのは無理なようだ。

 

 

オガ炭の比較

バーベキューで使う炭は、ホームセンターで安いマングローブ炭を買うのが一般的かもしれない。でも、この炭、火は着きやすいが、急激に燃えすぎて火力が安定しないのが気に入らない。

かといって、岩手切炭は値段が高くひるんでしまう。そこで、コストパフォーマンスがよさそうなオガ炭を使うようになったが、火が着きにくいことと、かなり個体差があるので、数種類を購入して燃焼実験をしてみた。

コーナン箱 コーナン コーナン灰
 宝炭(熊本)  トレイと網 (4)  宝炭(熊本) (2)  宝炭(熊本)灰
 角型文化炭(中国)    角型文化炭中国  角型文化炭中国灰
 国産伊代オガ炭    国産伊予オガ炭  国産伊予オガ炭灰

この結果から、灰の量に大きな差があることが判った。灰の多い炭は、燃え尽きるまで5時間以上かかったが、これは、灰のせいで火力が大きく落ちたのが原因だと思う。途中で頻繁に灰を落とさなければならないので、継ぎ足さないでも持つというメリットが薄れる。

結果のまとめ

炭の種類 燃やした炭の量 灰の量 灰の割合 熾き易さ コメント
コーナンオガ炭 290g 26g 9.0% × とにかく灰が多い
宝炭(熊本) 245g 5g 2.0%

やや火が着きやすい
灰の色が白っぽい
 角型文化炭(中国)  228g 20g  8.8% × 燃え残りが11g
国産伊代オガ炭  240g 4g  1.7% × 火が着きにくい
山頭火(割れ) 262g 4g 1.5% × 灰の色が濃い
よく炭化されている。
なごみ備長炭
(マレーシア)
295g 10g 3.4% 灰は白っぽい
若干炎はでるが臭いはない。
オガ備長炭
(ベトナム)
Rホームセンター
308g 15g 4.9% 6角形
灰は白っぽい。密度が低いためか、後半は立ち消えしそうになる。
特選 オガ炭
(中国)
505g 32g 6.3% × Amazonで送込¥1930だった
よく焼けていて堅い、灰は多いが、最後まで燃えた

中国産のオガ炭は¥150/kg 程度。国産は¥300/kg 程度。マングローブ炭より単価は高いが、倍以上持つことを考えると、国産のオガ炭を使うのが幸せかもしれない。ただし、火熾しができるならば。

最近2種類のオガ炭を入手したので追記。やはり国産のものは灰が少なく品質が高い。しかし、火熾しに時間がかかるのでBBQには不向き。マレーシア産のなごみ備長炭のコストパフォーマンスには驚いた。中国産の様に灰に埋もれて火力が落ちることがあまりない。七輪でも使いやすいし、BBQなら、継ぎ足しや灰落としをすることなく、最後まで火力が持つ。
20kg以上のまとめ買いをすれば、コーナンオガ炭より単価が安くなるが、保管場所がきつい。近くのホームセンターで1600円/10kgであれば毎回これで決まりなんだけどなぁ。

マレーシア産のオガ炭の灰は、木を燃やした後の灰と同じ。国産のものと灰の量が違うのは使用する樹種や樹皮の割合などの差かと思う。

インドネシア産が手に入ったのでこれも試してみたら、430gの炭で灰は20g、マレーシア産とほぼ同じ特性だった。

一方、中国産は粘土の様な”つなぎ”を5%以上混ぜていると思われる。増量のためか、技術不足による型崩れ防止のためか。はっきりいって、買う価値はない。

ローラーブレーキの効きを改善する

自転車、とくにママチャリの後輪のブレーキに限ると3種類ある。

  1. バンドブレーキ 一番安いやつで、鉄のドラムの外側をブレーキシューが巻きつくようになっているタイプだ。とにかく軽くて安いので、安物の自転車にはこれがついている。欠点は、後ろ向きに進むときには効かない。だから上り坂の途中で止まると悲惨である。それに水にぬれても効かないし、キーキーうるさいこともある。
  2. サーボブレーキ 車のドラムブレーキと基本的には同じ構造。回転する力でサーボ(力の増幅)がかかるので、非常によく効く。しかし、効きすぎてすぐにロックして扱いづらい。
  3. ローラーブレーキ 水に強く、回転方向に関係なく効き、不快な鳴きも全くない。性能としては文句なしだが、やや重いことと、バンドブレーキより高いためか、安い自転車には装着されていない。

そんなわけで、自転車を購入する際には、『後輪のブレーキがローラーブレーキであること』を条件にさがして買ったのだが・・・

今回の自転車のローラーブレーキの効きが非常に悪い。かなり強く握ってもロックしない。不良品なのか、もともとこの程度なのか、どちらにしてもかなり不満だ。

そこで、試しにグリスを入れ替えてみた。ローラーブレーキは専用のグリスを入れることで性能を発揮するものだ。新品ならそうなっているはずだが念のため。

ローラーブレーキ一般

 

まず、ゴムキャップを開ける。そこからブレーキクリーナを吹き込む。車輪を回したり、軽くブレーキをかけたりしながら、既存のグリスを洗い流す。

 

 

 

専用グリス洗い流したら、ブレーキクリーナが乾くまでしばらく放置。

その後、専用グリスを同じ穴から入れる。車輪を回しながら、ブレーキも少しかけつつ何回かに分けて入れていく。

今回使ったのは左の写真の10g入り。それの3分の1くらいを入れて完了。

試しに走って、何回かブレーキをかけてみる。すると、素晴らしい効き具合に!

しっかり握るとロックするまで効くし、軽く握ると減速できる。握る力に比例した、絶妙の効き具合。

 

 

 

 

サワガニの飼育

子供が川で捕まえてきたサワガニを家で飼うことになりました。
金魚を飼っていた30cm水槽が空いたのでそれを使います。

サワガニはその名の通り沢に住むカニだから、きれいな冷たい水が必要になるので、夏場を乗り切るには工夫が要ります。
少しでも水温を下げるために、ふたを開けて風通しを良くし、水流が石にあたって広がるようにした。表面積を増やして水を蒸発させ気化熱で水温を下げる作戦です。

底面フィルターに外掛けフィルター テトラAT-miniのモーターを取り付けて、底からくみ上げた水を石に落としています。

それでも水温が上昇し、石の上に避難してくるので、余っていたCPUクーラーのFANを取り付けました。

これの効果は絶大で、水温が3℃~5℃ほど下がります。

現在水温25℃で、元気に魚肉ソーセージを食べています。