手をかざすと点灯するLEDランプを作ってみた

 シャープの測距モジュールGP2Y0A21YKとPIC 12F1822 を使って、さっと、手をかざすと点灯するLEDランプを作ってみた。
f:id:manpukukoji:20171023113840j:plain
ランプの上で、さっと手をかざすとピッと音が鳴って、ランプが、点灯、消灯する。
ランプの上で、しばらく手をかざしたままでいると、ピピッと鳴って、調光モードとなり、音が鳴ったところから手を下にやると、だんだん暗くなり、上にやると、だんだん明るくなる。
好みの明るさのところで手をはずすと、そのときの明るさがキープされる仕組み。
明るさの最大値、最小値に達すると、また、ピピッとなる。

手をかざすと点灯するLEDランプ

回路図は、以下のようなもの。
f:id:manpukukoji:20171023114952j:plain
パーツは、手元のジャンク箱のトランジスタとか適当ですが、
測距モジュールは、10cmから80cmまで測れて最大3Vのようなので、そのまま、PICのAD変換でいけると思うのですが、いまいち、思うように反応してくれなかったので、トランジスタをはさんでいます。LEDも実際には、3WのパワーLEDを使っていますが、Vfが3Vくらいで、5Vで作っているので、実質2V、電流制限抵抗を5Ωにしているので、400mAくらい流れるはずですが、実測、200mAくらいでした。と、いうわけで、ゆる~く点灯しているので、ぜんぜん熱くならないので、このまま特に放熱もせずに使っています。
f:id:manpukukoji:20171023133859j:plain
もし、しゃかりきに点灯するのであれば、LED駆動用のトランジスタの見直し(ここで使っているのは、ジャンク箱の古いTrなので、どの道、見直しが必要だと思いますが・・・。)とか、何か放熱対策が必要かも・・・。
明るさのコントロールは、PWMでやっています。

PICのプログラムは、以下のような感じです。
回路もプログラムも変なところがあるかと思いますが、とりあえず、動いています。
参考にされる方が、万が一あるようでしたら、あくまでも、自己責任で・・・。よろしく・・・。
あっ、それと、うちのPC古いのでMPLAB IDEも古いままなので、プログラムは、あまり役に立たないかも・・・。

/**************************************************************
	12F1822 LED Motion Control
		Pin assignment:
	(1)Vdd
	(2)RA5 PWM out for LED
	(3)RA4(AN3) ADC----Distance Sensor GP2Y0A21
	(4)RA3 MCLR 10Kohm Resister between Vdd 
	(5)RA2(AN2)
	(6)RA1 SP out / ICSPCLK
	(7)RA0 ICSPDAT 
	(8)Gnd
**************************************************************/
#include <pic.h>
#define _XTAL_FREQ 8000000

__CONFIG(	
        FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_OFF 
        & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF
);

__CONFIG(
	WRT_OFF & PLLEN_OFF & STVREN_ON & BORV_25 & LVP_OFF
);

//Delay 100msec --------------------------------
void Delay_10ms(unsigned char time){
	while(time--){
		__delay_ms(10);
	}
}

void beep(void){
	int i;
	for(i=1;i<200;i++){
		RA1=1;
		__delay_us(200);
		RA1=0;
		__delay_us(200);
	}
}


//------------------main
void main(void){
	unsigned int SW=0, command=0,incliment;
	int adcv,getv,bright=30;

//Initialization
	OSCCON = 0b01110010;            // PLL disable, 4MHz internal clock
 	ANSELA = 	0b00010000;     //RA4 to ADC 
        TRISA 	=	0b00111000;	//GPIO dirction setting  
        PORTA	=	0b00000000;	//GPIO initialize
//---------------------------------------------------------
//PWM
     CCP1SEL = 1 ;          // 2番ピン(RA5)をCCP1/P1Aピンとして出力
     CCP1CON=0b00001100;	//PWM mode: P1A, P1C active-high; P1B, P1D active-high
     						// PWM機能(シングル)を使用する
     T2CON   = 0b00000000 ; // TMR2プリスケーラ値を1倍に設定
     CCPR1L  = 0 ;          // デューティ値は0で初期化
     PR2     = 0x65 ;        // PWMの周期を設定(19kHzで設定)
     TMR2ON  = 1 ;          // TMR2(PWM)スタート

     while(TMR2IF == 0);
     TRISA5=0;
	 
//----------------------------------------------------------
//ADC
	ADCON1 = 0b00010000;
	ADCON0 = 0b00001100; //AN3 to ADC
//----------------------------------------------------------

    while(1){
	ADON=1;
	__delay_ms(1);
	GO_nDONE = 1;
	while(GO_nDONE);
	adcv=ADRESH;
	if(adcv<=230){
	   command=1;
	   Delay_10ms(50);
	   ADON=1;
	   __delay_ms(1);
	   GO_nDONE = 1;
	   while(GO_nDONE);
	   adcv=ADRESH;
	   if(adcv>250){
		beep();
		SW=!SW;			
		if(SW==1){bright=30;}
		else{bright=0;}

		CCPR1L=bright;
		command=0;
	   }
	   else if(SW==1){
		beep();Delay_10ms(3);beep();
		Delay_10ms(100);
		getv=adcv;
		while(command==1){
			ADON=1;
			__delay_ms(1);
			GO_nDONE = 1;
			while(GO_nDONE);
			adcv=ADRESH;
			if(adcv<250){
				if(adcv>getv){
					incliment=1;
					bright+=3;
					if(bright>90){
                                             bright=90;
	                                     beep();
                                             Delay_10ms(3);
                                             beep();
                                        }
				}
				else if(adcv<getv){
					incliment=2;
					bright-=3;
					if(bright<=3){
                                            bright=3;
                                            beep();
                                            Delay_10ms(3);
                                            beep();
                                        }
				}
				CCPR1L=bright;
				beep();
				Delay_10ms(50);
			}
			if(adcv>250)command=0;
		}
		}
		}
		Delay_10ms(1);
	}
}

L-メータの製作

だいたいで良いからコイルのインダクタンスが知りたいときがある。 特に、ジャンク箱から引っ張り出してきた得体の知れないコイルとか・・・。
そのために専用のメータを買うのもいまいちなので、簡単な発振器で発振させ、その周波数からインダクタンスを計算するように、発振器を作ってみた。
f:id:manpukukoji:20171009111622j:plain
回路は、こちらのサイトの内容をそっくりそのまま使わせていただきました。
電子回路 Vol.6 【製作編:ピアース発振回路のLメーター】("http://roomx.jp/pc/roomb/?p=734" )
ピアース発振回路の応用でインダクタンスを計測 ("http://ednjapan.com/edn/articles/0711/01/news145.html")


ちょうど、失敗した感光基盤があったので、これに、レジストペンでゴニョゴニョと手書きでプリント基板を作成。
部品数も少ないので簡単にできちゃった。
f:id:manpukukoji:20171009113653j:plain
これに調べたいコイルをつないで発振させて、その周波数をテスターとかオシロとかで測定して、後はそこから計算すれば、インダクタンスが得られる。
コンデンサは、0.1uFを使ったので、計算では0.05uFになるはずだけど、いろいろな既知のコイルを測定してみて、実測値から、0.047uFとして、計算用のスクリプトPythonでチョコちょこっと・・・。
わりと、便利に使えそうです。
ただ、5Vで発振させたら、ICが結構アッチチで、データシートでは7VくらいまでOKのはずなんだけど、電流も180mAくらい流れていて、ちょっと、やばそうだったので、3Vくらいで使っています。これでも、70mAくらい流れていました。 う~ん、何か作り方に問題があったかな・・・? とりあえずは、使えているんだけどね・・・。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#Calcuration script for L-Mater
# Capacitance = 0.047uF

f=input("Input Frequency(kHz) : ")
f=float(f)
l=1/(2*3.1415*f)**2/(0.047*10**-6)
print("L = {0:6.1f} uH".format(l))

ラズベリーパイとUSBカメラでビデオキャプチャしてタイムラプス動画作成

一定時間ごとに写真をとって、定点観察したいと思い、ラズベリーパイとUSBカメラでビデオキャプチャしてみた。
ラズベリーパイは、PythonOpenCVで一定時間ごとにビデオキャプチャするスクリプトを作って、キャプチャした映像をFTPWindowsに取ってきて、タイムラプス動画をWindows上で作成した。
で、とりあえず、できたのがこの動画

ラズベリーパイとUSBカメラでビデオキャプチャしてタイムラプス動画を作成

ま、やり方は、CRON使う手とか、いろいろあると思うけど、とりあえず、手っ取り早くPython上で全部まかなって、凝った仕組みは何もないけど、まぁ、目的は達成できているので、こんなもんかな・・・?
OpenCV使うと、こんなことも、簡単にできちゃうんですね。 
おそるべし、OpenCV
自分では、一からこんなのとても作れるとは思えない・・・。 ありがたいこってす・・・。
Pythonスクリプトは、以下のようなもの。
エラー処理もしていないし、保存先のフォルダも固定だし、ファイル名も固定です。
スクリプトのおいてあるフォルダの下に、Imgというフォルダを作ると、そこに、CapXXXX.jpgというファイルができていきます。 XXXXのところには、キャプチャしたときの日付と時間になります。例えば、2017年10月07日の9時15分00秒だと、Cap20171001091500.jpg となります。 このままだと、180秒(3分)ごとにキャプチャされます。
for文 でごにょごにょしているのは、いきなりキャプチャすると、なぜか真っ黒だったので、苦肉の策です。
もっと、ちゃんとしたスマートな方法があるのでしょうが、まぁ、こんなにちょこっとのスクリプトなんで、良いか・・・。
ってなもんです。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import cv2
import datetime
from time import sleep

cap = None
count=0
camera_port = 0   # USBカメラのデバイスは0 (/dev/video0)
cap = cv2.VideoCapture(camera_port)

while(True):
  for i in range(10):
    ret, im = cap.read()
    if ret==True:
        if i==9:
            tm=datetime.datetime.today().strftime("%Y/%m/%d %X")
            ftm=datetime.datetime.today().strftime("%Y%m%d%H%M")
            cv2.putText(im,tm,(20,450),cv2.FONT_HERSHEY_PLAIN,2,(255,255,0))
            file_name = "./Img/Cap" + ftm + ".jpg"
            print (file_name)
            cv2.imwrite(file_name, im)
            print("File written")
            sleep(180)

cap.release()
cv2.destroyAllWindows()

太陽の追尾装置の製作

サーボモータと光センサーで太陽の追尾装置を作ってみた。 太陽追尾というか、よーするに明るいところを追いかける装置です。 
f:id:manpukukoji:20171004121609j:plain
マイコンは、16F1827、センサーは、Cdsセルで、上下左右、4つのセンサーで、上下でより明るい方、左右でより明るい方を向くようにサーボモータをコントロール。 上下で120度、左右180度の可動範囲になっています。
センサーの隔壁は、最初、筒型のパトリオットミサイルのランチャーみたいなのを試してみたのですが、いまいち、うまく作動しなかったので、シンプルな、田の字型の隔壁スタイルにしたら、わりと良さげだったので、これを採用。
f:id:manpukukoji:20171004121640j:plain
一応、基盤は汎用性をもたせて、サーボのコントロール部分をメイン基盤とし、センサー部分は、ドーターボードのようにして別基盤にしています。
ライトでグリグリやると、なんか面白いです。

サーボモータで光を追跡

回路図は、以下
f:id:manpukukoji:20171004112237p:plain

ほんでもって、PICのプログラムは、以下です。

/*	Project Twin servo control
	PIC16F1827 with two servo moter and 4 Cds cell sensor
	trace the britest spot (Sun tracker)
*/

/*PIN of 16F1827 asign
	RA0 : Cds1 (Upper)		RB0 : Servo PWM Vertical
	RA1 : Cds2 (Lower)		RB1 : Servo PWM Holizontal
	RA2 : Cds3 (Right)		RB2 : Rx
	RA3 : Cds4 (Left)		RB3 : 
	RA4 :  				RB4 : 
	RA5 : MCLR			RB5 : Tx
	RA6 : 				RB6 : 
	RA7 : 				RB7 : 
*/
#include <pic.h>

#define _XTAL_FREQ  8000000    // delay用(クロック8MHzで動作時)
#define INT_START 25536		//20msの割り込みの初期値(65536-25536=40000)

__CONFIG( WRT_OFF & MCLRE_OFF & PWRTE_ON & WDTE_OFF & FOSC_INTOSC & CP_OFF & CPD_OFF) ;
__CONFIG(PLLEN_OFF & STVREN_ON & BORV_25 & LVP_OFF);

unsigned short next1,next2;	//next1 for UpDown, next2 for RightLeft


void delay(unsigned char d){
	int i;
	for(i=0;i<d;i++) __delay_ms(10);
}

void interrupt pwm( void )
{
    // タイマ1割り込み処理
    if( TMR1IF )
    {
        RB0 = 1;
        RB1 = 1;

        CCPR1H = (next1>>8);	//next1 for UpDown, next2 for RightLeft
		CCPR1L = (0x00ff & next1);
        CCPR2H = (next2>>8);
		CCPR2L = (0x00ff & next2);
        TMR1 = INT_START;   // 20msec毎に割り込み
        TMR1IF = 0; // タイマ割り込みフラグをクリア
    }

    // CCP1割り込み処理
    if( CCP1IF )
    {
        RB0 = 0;
        CCP1IF = 0; // コンペアマッチ割り込みフラグをクリア
    }

    // CCP2割り込み処理
    if( CCP2IF )
    {
        RB1 = 0;
        CCP2IF = 0; // コンペアマッチ割り込みフラグをクリア
    }
}



void main(void){

     int m1,m2,vdata;		//m1 for UpDown, m2 for RightLeft
	 int v1,v2,h1,h2;	//ADC value
	 
     m1=3000;		//1.5mSec
     m2=3000;

	vdata=0;
	
     OSCCON     = 0b01110010;    // 内部クロックは8MHzとする
     OPTION_REG = 0b00000000;
//割り込み設定
	 CCP1CON=0b00001010;	//compair mode
	 CCP2CON=0b00001010;
     T1CON=0b00000100;		//1:1 PreScaler
//     CCP1M=0b1010;		//CCP1 Compair Interrupt
//     CCP2M=0b1010;		//CCP2 Compair Interrupt

//pin設定
     TRISA  = 0b00101111;    // 1で入力 0で出力 RA0-RA3:Input RA6-RA7:Outputに設定(RA5は入力専用)
     TRISB  = 0b00000000;    // RB1-RB7全てを出力に設定 RB0,RB1をサーボ制御に使用
     ANSELA = 0b00001111;    //RA0-RA3 をADCにセット
     ANSELB = 0b00000000;    //汎用ポート RB3(AN9)をADCにセット
     PORTA  = 0b00000000 ;   // RA出力ピンの初期化(全てLOWにする)
     PORTB  = 0b00000000 ;   // RB出力ピンの初期化(全てLOWにする)

//ADC設定
	 ADCON0 = 0b00100100;
	 ADCON1 = 0b11000000;	//右寄せ, Fosc/8

//割り込み初期値
    TMR1IE = 1; // タイマ1割り込み有効
    CCP1IE = 1; // コンペアマッチ割り込み有効
    CCP2IE = 1; // コンペアマッチ割り込み有効

    TMR1 = INT_START;
    next1 = INT_START + 3000;  // 1.5msec
    next2 = INT_START + 3000;  // 1.5msec

    TMR1ON = 1; // タイマ1 開始

    TMR1IF = 0;
    CCP1IF = 0;
    CCP2IF = 0;
    PEIE = 1;
    GIE  = 1;    // 全割り込み有効


while(1) {

//ADC 

//ADC0
	ADCON0=0b00000011;
	__delay_us(50);
	GO_nDONE=1;
	while(GO_nDONE);
	vdata=ADRESH;
	vdata<<=8;
	vdata|=ADRESL;
	v1=vdata;
	
//ADC1
	ADCON0=0b00000111;
	__delay_us(50);
	GO_nDONE=1;
	while(GO_nDONE);
	vdata=ADRESH;
	vdata<<=8;
	vdata|=ADRESL;
	v2=vdata;


//ADC2
	ADCON0=0b00001011;
	__delay_us(50);
	GO_nDONE=1;
	while(GO_nDONE);
	vdata=ADRESH;
	vdata<<=8;
	vdata|=ADRESL;
	h1=vdata;

//ADC3
	ADCON0=0b00001111;
	__delay_us(50);
	GO_nDONE=1;
	while(GO_nDONE);
	vdata=ADRESH;
	vdata<<=8;
	vdata|=ADRESL;
	h2=vdata;

//Compair brightness
//Vertical direction
	if(v1>v2){
		if((v1-v2)>3){
			m1=m1+(v1-v2);
			if(m1>=4000){m1=4000;}
		}
	}
	else if(v1<v2){
		if((v2-v1)>3){
			m1=m1-(v2-v1);
			if(m1<=1900){m1=1900;}
		}
	}

	next1=INT_START+m1;
	
//Holizontal direction
	if(h1>h2){
		if((h1-h2)>3){
			m2=m2+(h1-h2);
			if(m2>=4800){m2=4800;}
		}
	}
	else if(h1<h2){
		if((h2-h1)>3){
			m2=m2-(h2-h1);
			if(m2<=1000){m2=1000;}
		}
	}
	
	next2=INT_START+m2;
	

	delay(10);

}	//End of While
}	//End of main

百均のルーターの歯とマブチモーターでミニテーブルソーを作ってみたら・・・。

百均のミニルーター用の、のこぎり歯を使ってちょこっとしたミニテーブルソーみたいなのができないかな? と思って、模型用のマブチモータを使って作ってみたけど、何も切れなかったというお話・・・。  失敗談です。
f:id:manpukukoji:20171004092329j:plain
もともと、基盤とかを切るのにいちいちゴキゴキやっているのも面倒なので、ちっちゃいテーブルソーみたいなのがあれば、チョイーンと切れちゃって、とっても便利かな? と、思ったんだけど、そんなに甘くはなかった・・・。
結果は、こんな感じ。

百均のルーターの歯でミニテーブルソーを作ってみたら・・・。

使ったモータは、RE-280 というモデルで、3V駆動で、適正負荷が15gf・cm となっている。
要するに、モータの選択を間違ったということかな? ギアボックスとか使えば、力は出せるだろうけど、その分回転速度が落ちちゃうから、やっぱり、もう少し、でっかいモータでやるべきなんでしょうね。
また、なんか良さげなモータが手に入ったら、試してみようかな・・・って、懲りないね・・・。

調光式懐中電灯を光センサにつないだサーボで受けると・・・。

光の強度で回転をコントロールするようにしたサーボモータに、調光式の懐中電灯の光を当ててみたところ、光の強さをおとしたモードにすると、サーボモータがジワジワと変な動きをし始めた。

調光式懐中電灯を光センサにつないだサーボで受けると・・・。

この懐中電灯は、光(最強)→光(中)→光(弱)→点滅モード→SOSモード と、順に切り替えることができるようになっている。
この懐中電灯の光を光センサー(Cdsセル)に受けて、AD変換してその値に応じてサーボモータの角度をコントロールしたところ、このビデオのように光の中と弱のときにジワジワとサーボが動いて、安定しなかった。
どうやら、調光するのに、PWMでコントロールしているようで、目ではわからない速度で点滅していて、それを光センサーは感じ取ったようだ。実際にばらして回路を調べたわけではないけれど、同様に光センサーで点滅速度を調べてみると、240Hz くらいで点滅しているみたい・・・。思ったよりも高い周波数だった。
ちなみに、点滅モードとSOSモードでは、もちろん、ギュンギュンとサーボは、暴れたが、ついでに、しらべたら、点滅は7Hzくらいで点滅していた。

PIC16F1827でサーボモータ2軸を制御

PIC16F1827を使ってサーボモーター2個をコントロールしてみた。
f:id:manpukukoji:20170924104300j:plain
16F1827は、タイマー1の割り込みでコンペアモードが4つ使えるみたいなので、4つのサーボモーターがコントロールできそう・・・。
とりあえず、ADコンバータ使って、半固定抵抗で電圧をぐりぐりやって2軸を動かしてみた。
f:id:manpukukoji:20170927085603p:plain
使ったサーボモータは、GWSのMINI STD というのと、TowerProのSG-5010 ですが、使うサーボによって、プログラムの値を変更しないと、ならないと思います。
このまま使って、高価なサーボモータ壊しちゃったりしないようにご注意ください。
あくまでも、自己責任で・・・。よろしく!

ちなみに、僕は、いまだに古いMPLAB IDE(v8.6)でHiTech-C使っているので、最新のIDEとは、ちょっと違うと思うけど、include のヘッダとか、Configrationの表記以外は、だいたい、似たようなものではないかと思います。

プログラムは、以下

/*	Project Twin servo control
	PIC16F1827 with two servo moter and 2VR AD control
*/

/*PIN of 16F1827 asign
	RA0 : VR1 				RB0 : Servo1 Control
	RA1 : VR2 				RB1 : Servo2 Control
	RA2 : 	 				RB2 : 
	RA3 : 	 				RB3 : 
	RA4 :  					RB4 : 
	RA5 : MCLR				RB5 : 
	RA6 : 					RB6 : 
	RA7 : 					RB7 : 
*/
#include <pic.h>

#define _XTAL_FREQ  8000000    // delay用(クロック8MHzで動作時)
#define INT_START 25536		//20msの割り込みの初期値(65536-25536=40000)

__CONFIG( WRT_OFF & MCLRE_OFF & PWRTE_ON & WDTE_OFF & FOSC_INTOSC & CP_OFF & CPD_OFF) ;
__CONFIG(PLLEN_OFF & STVREN_ON & BORV_25 & LVP_OFF);

unsigned short next1,next2;	//next1 for UpDown, next2 for RightLeft

void delay(unsigned char d){
	int i;
	for(i=0;i<d;i++) __delay_ms(10);
}

void interrupt pwm( void )
{
    // タイマ1割り込み処理
    if( TMR1IF )
    {
        RB0 = 1;
        RB1 = 1;

        CCPR1H = (next1>>8);	//next1 for UpDown, next2 for RightLeft
		CCPR1L = (0x00ff & next1);
        CCPR2H = (next2>>8);
		CCPR2L = (0x00ff & next2);
        TMR1 = INT_START;   // 20msec毎に割り込み
        TMR1IF = 0; // タイマ割り込みフラグをクリア
    }

    // CCP1割り込み処理
    if( CCP1IF )
    {
        RB0 = 0;
        CCP1IF = 0; // コンペアマッチ割り込みフラグをクリア
    }

    // CCP2割り込み処理
    if( CCP2IF )
    {
        RB1 = 0;
        CCP2IF = 0; // コンペアマッチ割り込みフラグをクリア
    }
}

void main(void){

     unsigned long m1,m2,vdata;		//m1 for UpDown, m2 for RightLeft
     unsigned int f1,f2; //flag for PWM increase or decrease	 

     m1=3000;		//1.5mSec
     m2=3000;

	vdata=0;
	
     OSCCON     = 0b01110010;    // 内部クロックは8MHzとする
     OPTION_REG = 0b00000000;
//割り込み設定
	 CCP1CON=0b00001010;	//compair mode
	 CCP2CON=0b00001010;
     T1CON=0b00000100;		//1:1 PreScaler

//pin設定
     TRISA  = 0b00101111;    // 1で入力 0で出力 RA0-RA3:Input RA6-RA7:Outputに設定(RA5は入力専用)
     TRISB  = 0b00000000;    // RB1-RB7全てを出力に設定 RB0,RB1をサーボ制御に使用
     ANSELA = 0b00001111;	//RA0-RA3 をADCにセット
     ANSELB = 0b00000000;	//汎用ポート RB3(AN9)をADCにセット
     PORTA  = 0b00000000 ; // RA出力ピンの初期化(全てLOWにする)
     PORTB  = 0b00000000 ; // RB出力ピンの初期化(全てLOWにする)

//ADC設定
	 ADCON0 = 0b00100100;
	 ADCON1 = 0b11000000;	//右寄せ, Fosc/8

//割り込み初期値
    TMR1IE = 1; // タイマ1割り込み有効
    CCP1IE = 1; // コンペアマッチ割り込み有効
    CCP2IE = 1; // コンペアマッチ割り込み有効

    TMR1 = INT_START;
    next1 = INT_START + 3000;  // 1.5msec
    next2 = INT_START + 3000;  // 1.5msec

    TMR1ON = 1; // タイマ1 開始

    TMR1IF = 0;
    CCP1IF = 0;
    CCP2IF = 0;
    PEIE = 1;
    GIE  = 1;    // 全割り込み有効

    f1=1;
    f2=1;
while(1) {

//ADC 

//ADC1
	ADCON0=0b00000011;
	__delay_ms(1);
	GO_nDONE=1;
	while(GO_nDONE);
	vdata=ADRESH;
	vdata<<=8;
	vdata|=ADRESL;
	m1=(vdata*2400)/1024+1800;
	if(m1>=4200){m1=4200;}
	if(m1<=1800){m1=1800;}
	
//ADC2
	ADCON0=0b00000111;
	__delay_ms(1);
	GO_nDONE=1;
	while(GO_nDONE);
	vdata=ADRESH;
	vdata<<=8;
	vdata|=ADRESL;
	m2=(vdata*3800)/1024+1000;
	if(m2>=4800){m2=4800;}
	if(m2<=1000){m2=1000;}

	next1=INT_START+m1;
	next2=INT_START+m2;


	delay(3);

}	//End of While
}	//End of main