Main Menu
Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - mmc01

#1
อยากทราบว่าการขับมอเตอร์ระหว่างทรานซิสเตอร์ BC547 กับไอซี ULN2003 ผมทดลองแล้ว BC547 ทำให้มอเตอร์หมุนช้ากว่า ULN2003 มันจะมีผลกับแบตเตอร์รี่มั๊ยครับว่า BC547 ทำให้หมุนช้าอาจจะกินกระแสน้อยกว่าทำให้ใช้งานแบตเตอร์รี่ได้นานกว่า ULN2003  หรือว่าทรานซิสเตอร์มันกินกระแสเยอะแล้วจ่ายกระแสให้มอเตอร์น้อยทำให้หมุนช้าแต่แบตหมดเร็วเหมือนกันมั๊ยครับ
#2
ผมสั่งซื้อมอเตอร์ทดเกียร์แบบนี้มาครับ http://www.es.co.th/detail.asp?Prod=70500024 ผมต่อใช้งานกับไมโครคอนโทรลเลอร์เป็นเครื่องตั้งเวลาเมื่อถึงเวลาที่ตั้งไว้มอเตอร์จะหมุน โดยใช้ Power Supply คอมพิวเตอร์เป็นแหล่งจ่ายไฟ 5V เข้ามอเตอร์และไมโครคอนโทรลเลอร์ พอมอเตอร์หมุนจอ LCD Module ที่ต่อกับไมโครคอนโทรลเลอร์จะแสดงผลแปลกๆ ผมคิดว่าเป็นเพราะมอเตอร์กินกระแสเยอะไปครับ ผมคิดว่าจะเอาไปใช้กับถ่านแต่คิดดูแล้วถ่านคงหมดเร็วแน่นอนแบบนี้ ถ้าใช้กับอะแดปเตอร์ 5V ก็ไม่รู้กระแสพอหรือเปล่าและถ้าไฟดับก็ต้องตั้งค่าใหม่อีก ควรจะใช้แหล่งจ่ายไฟแบบไหนดีครับที่สามารถใช้ได้นานๆ
#3
ต้องทำยังไงถึงขับมอเตอร์ได้ครับ ใช้มอเตอร์ตัวเดียว
#4
ผมซื้อมอเตอร์เกียร์แบบนี้มาครับ http://www.es.co.th/detail.asp?Prod=70500024 ลองต่อกับไฟ 5V จาก Power Supply แล้วแรงดีมากเอามือไปจับก็ไม่หยุดหมุน ปรับไฟเหลือ 3V ก็ยังหมุนได้ดีอยู่ อยากทราบว่าถ้าจะเอาไปต่อที่ขาเอาต์พุต 5V จากไมโครคอนโทรลเลอร์เข้ากับมอเตอร์โดยตรงเลยได้มั๊ยครับ
#5
ผมต้องการสร้างวงจรบันทึกเสียงซึ่งผมคิดว่าไอซีบันทึกเสียงเบอร์ที่ถูกที่สุดที่หาได้ในเมืองไทยคือ ISD1700 ซึ่งผมต่อวงจรตอนแรกก็ใช้งานได้ปกติ แต่วันนี้ผมลืมดู เผลอจ่ายไฟ 12V เข้าไปจากปกติมันใช้ไฟ 5V ทำให้มันร้อนมาก ผมลองจับดูร้อนเหมือนหัวแร้งเลยครับ และก็เล่นเสียงไม่ได้อีกเลย ผมจึงคิดว่าไอซีเสียแล้วถึงถอดตัวเก่าออกพร้อมกับใส่ซ็อคเก็ตเข้าไปเพื่อครั้งหน้าจะได้เปลี่ยนง่าย แล้วพอจ่ายไฟปรากฏว่าไฟไม่ติดครับ ปกติถ้ามีการกดปุ่มไฟที่ขา 2 จะติดทุกครั้ง ผมลองเช็ค R และ C ทุกตัวในวงจรแล้วไม่มีตัวไหนขาดครับ วัดไฟแล้วที่ PCB ก็ไฟเข้าครับ ผมก็เลยไม่รู้จะไปเช็คตรงไหนต่อว่าอะไรมันเสียครับ นี้เป็นดาต้าชีทผมต่อวงจรตามหน้า 16 ครับ http://www.es.co.th/schemetic/pdf/ISD1700-ISD.pdf แก้ยังไงได้บ้างครับ
#6
ผมเขียนโปรแกรมนาฬิกาแจ้งเตือนด้วย CCS ลองซิมูเลตกับ Proteus แล้วก็ใช้งานได้ปกติ แต่พอโหลดใส่ไมโครคอนโทรลเลอร์ PIC มาใช้งานจริงมันค้างตัวเลขไม่เปลี่ยนเลยครับพอจ่ายไฟแล้วเวลาจะค้างอยู่ที่เวลา 00.00.80 พอกดปุ่มก็ไม่เปลี่ยนเมนูเหมือนใน Proteus แล้วข้างหน้าข้อความปกติจะเป็นช่องว่างแต่พอใช้งานจริงมันขึ้นเครื่องหมาย = มาด้วย ลองเปลี่ยนถ่านนาฬิกาที่ใช้กับไอซี DS1307 แล้ว ก็ยังค้างเหมือนเดิมครับ โปรแกรมผมค่อนข้างใหญ่แต่ก็คอมไพล์ได้ ไม่ทราบว่าต้องตรวจสอบแก้ไขตรงไหนครับ ตอนนี้ไม่รู้จะแก้ยังไง ที่จริงถ้าใช้กับ Proteus ได้ก็น่าจะใช้กับวงจรของจริงได้ แต่นี่มันไม่ใช่ครับไม่รู้จะแก้ยังไง

#include <16F886.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

#include "flex_LCD.c"
#use I2C(master, sda=PIN_C4, scl=PIN_C3)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#define ADDR_DS1307  0xD0 //Address DS1307

int set_hr=24;
int set_min=60;
short int f_next = FALSE;
short int delay_chk=FALSE;
int cnt;

typedef struct{
   BYTE sec;     // seconds
   BYTE min;     // minute
   BYTE hr;      // hour
   BYTE day;
   BYTE date;
   BYTE month;
   BYTE year;
}DS1307_RTC;

DS1307_RTC RTC;

typedef struct{

   int min;     // minute
   int hr;      // hour
   int sec_delay;
}time_feed;

time_feed t_feed;


void DS1307_Write(unsigned char ctl, unsigned char dat);
BYTE DS1307_Read(unsigned char ctl);
void DS1307_WriteDate(void);
void DS1307_WriteTime(void);

void DS1307_ReadDate(void);
void DS1307_ReadTime(void);
void Set_Voice();


BYTE bin2bcd(BYTE binary_value)
{
  BYTE temp;
  BYTE retval;

  temp = binary_value;
  retval = 0;

  while(1)
  {
    // Get the tens digit by doing multiple subtraction
    // of 10 from the binary value.
    if(temp >= 10)
    {
      temp -= 10;
      retval += 0x10;
    }
    else // Get the ones digit by adding the remainder.
    {
      retval += temp;
      break;
    }
  }

  return(retval);
}

// Input range - 00 to 99.
BYTE bcd2bin(BYTE bcd_value)
{
  BYTE temp;

  temp = bcd_value;
  // Shifting upper digit right by 1 is same as multiplying by 8.
  temp >>= 1;
  // Isolate the bits for the upper digit.
  temp &= 0x78;

  // Now return: (Tens * 8) + (Tens * 2) + Ones

  return(temp + (temp >> 2) + (bcd_value & 0x0f));
}

   /*******************************************************/
void DS1307_Write(unsigned char ctl, unsigned char dat){
   i2c_start();
   i2c_write(ADDR_DS1307);
   i2c_write(ctl);
   i2c_write(dat);
   i2c_stop();
}

/*******************************************************/
BYTE DS1307_Read(unsigned char ctl){

   BYTE dat;

   i2c_start();
   i2c_write(ADDR_DS1307);
   i2c_write(ctl);

   i2c_start();
   i2c_write(ADDR_DS1307+1);
   dat = i2c_read(0);
   i2c_stop();
   return(dat);
}

/*******************************************************/
void DS1307_WriteDate(void){
   DS1307_Write(0x04,RTC.date);
   DS1307_Write(0x05,RTC.month);
   DS1307_Write(0x06,RTC.year);
}

/*******************************************************/
void DS1307_WriteTime(void){
   DS1307_Write(0x00,RTC.sec);
   DS1307_Write(0x01,RTC.min);
   DS1307_Write(0x02,RTC.hr);
}

/*******************************************************/
void DS1307_ReadDate(void){
   RTC.date = DS1307_Read(0x04);
   RTC.month = DS1307_Read(0x05);
   RTC.year = DS1307_Read(0x06);
}

/*******************************************************/
void DS1307_ReadTime(void){
   RTC.sec = DS1307_Read(0x00);
   RTC.min = DS1307_Read(0x01);
   RTC.hr = DS1307_Read(0x02);
}

void DS1307_SetTime(int hr, int min){

   RTC.hr = bin2bcd(hr);
   RTC.min = bin2bcd(min);
   RTC.sec = 0x00;
}

/************* Delay *************/
void delay(){
int sec_delay;

  for(sec_delay=t_feed.sec_delay;sec_delay>0;sec_delay--){
     output_high(pin_C5);
     lcd_gotoxy(1,2);
     delay_ms(1000);
     printf(lcd_putc,"\r Food = %d sec " sec_delay);
  }
   output_low(pin_C5);
}

void clr_voice(){
   output_high(pin_C0);
   output_high(pin_C1);
   output_high(pin_C2);
   delay_ms(1000);
   output_float(pin_C0);
   output_float(pin_C1);
   output_float(pin_C2);
}

/************* time **************/
void time(){

   int hr=bcd2bin(RTC.hr);
   int min=bcd2bin(RTC.min);

    delay_ms(50);
    lcd_gotoxy(1,2);
    //printf(lcd_putc,"\r    -- : --    ");
    printf(lcd_putc,"\r    %02d : %02d    ", hr,min);
    delay_ms(50);

while(1){

if(input(PIN_B1)==0){

   delay_ms(100);
   hr++;

if(hr>=24){hr=0;}

    delay_ms(100);
    lcd_gotoxy(1,2);

    printf(lcd_putc,"\r    %02d : %02d   ", hr,min);
    delay_ms(50);


}else if(input(PIN_B2)==0){

   delay_ms(100);
   min++;

if(min>=60){min=0;}

    delay_ms(100);
    lcd_gotoxy(1,2);
    printf(lcd_putc,"\r    %02d : %02d   ", hr,min);
    delay_ms(50);

}

if(input(PIN_B3)==0){

    lcd_gotoxy(1,2);
    printf(lcd_putc,"\r Time : %02d:%02d ", hr,min);
    delay_ms(50);


   DS1307_SetTime(hr,min);
   DS1307_WriteTime();

   break;

}
}  // while hr

}

/************* check same time **************/
int check_time(int hr[], int hr_ck, int min[], int min_ck,int count){
  int x;
  for(x=0;x<count;x++){

  if((hr[x]== hr_ck) && (min[x]== min_ck)){

    if((hr_ck==24)&& (min_ck==60)){

      return 0;
      break;

   }else{
      return 1;
      break;
   }
  }
  }
   return 0;

}

/************ get now time ***************/
int16 getNow(){

   int16 now_hr,now_min;
   int16 now_all;

   DS1307_ReadTime();

   now_hr = bcd2bin(RTC.hr);
   now_min = bcd2bin(RTC.min);
   now_all = (now_hr*60)+now_min;

   //printf("\r\n n=%ld",now_all);
   return now_all;
}

/**************************************/
int16 next_time(int16 hr, int16 min, int pos){

int32 minimVal;
int i=0;
int16 now_all;
int32 all[5],t;
int16 hrk[5],mnk[5];
int n,j;

hrk[pos] = hr;
mnk[pos] = min;
all[pos] =(hrk[pos]*60 + mnk[pos]) ;

//minimVal2 = (hrk[0]*60) + mnk[0];
now_all = getNow();
//printf("\r\n pos=%d, n=%ld, ",pos,all[pos]);

n = sizeof(all)/sizeof(all[0]);

   /* bubble sort */
   for (i = pos; i > 0; i--) {
       for (j = 0; j < i; j++) {   /* move max (in [0] to [i]) to last ([i]) */
           if (all[j] > all[j+1]) {   /* exchange if bigger than next */
               t = all[j];
               all[j] = all[j+1];
               all[j+1] = t; } } }

               minimVal= all[0];

   for (i = 0; i < pos+1; i++) {
   //printf("\r\n%ld ", all[i]);

  if(all[i]>now_all){
  if(all[i]!=1500){
      minimVal= all[i];
      break;
  }
}
   }

//printf("\r\n min %ld ", minimVal);

return minimVal;

}

/************* Show Menu **************/
void show_menu(){
    delay_ms(50);
    lcd_gotoxy(1,2);
    printf(lcd_putc,"[Next]      [OK]");
    delay_ms(50);
}

/************* feed time **************/
void feed_time(int count){


int hr[5],min[5];
int16 next;

while(1){

if(input(PIN_B1)==0){

delay_ms(250);       // delay for add hr
set_hr++;

if(set_hr>24){
   set_hr=0;
   set_min= 0;
}

if(set_hr==24){
    set_min=60;
    delay_ms(50);
    lcd_gotoxy(1,2);
    printf(lcd_putc,"\r F%d :  -- : -- ",count+1);
    delay_ms(50);
}else{
    delay_ms(50);
    lcd_gotoxy(1,2);
    printf(lcd_putc,"\r F%d :  %02d : %02d ", count+1, set_hr,set_min);
    delay_ms(50);
}

}else if(input(PIN_B2)==0){

   delay_ms(250);        // delay for add min
   set_min++;

if(set_min>=60){
  if(set_hr==24){set_hr=0;}
    set_min=0;

}
    delay_ms(50);
    lcd_gotoxy(1,2);
    printf(lcd_putc,"\r F%d :  %02d : %02d " count+1, set_hr,set_min);
    delay_ms(50);

}

if(input(PIN_B3)==0){
   hr[count] = set_hr;
   min[count] = set_min;

    if(check_time(hr,set_hr,min,set_min,count)){

       delay_ms(50);
       lcd_gotoxy(1,1);
       //printf(lcd_putc,"\rn=%d ar= %d,va= %d" ,count, set_hr,set_min);
       printf(lcd_putc,"\r This is same. ");
       delay_ms(50);

     }

    else{

          next= next_time(hr[count],min[count],count);
          t_feed.hr=next/60;
          t_feed.min=next%60;

if(set_hr==24){

    delay_ms(50);
    lcd_gotoxy(1,1);
    printf(lcd_putc,"\r F%d :  -- : -- ",count+1);
    delay_ms(50);

    lcd_gotoxy(1,2);
    printf(lcd_putc,"\r                  ");
    delay_ms(50);

    if((count+2)!=6){

       lcd_gotoxy(1,2);
       printf(lcd_putc,"\r F%d :  -- : -- ",count+2);
       delay_ms(50);
    }

}else{

    delay_ms(50);
    lcd_gotoxy(1,1);
    printf(lcd_putc,"\r F%d :  %02d : %02d " count+1, set_hr,set_min);
    delay_ms(50);

    if((count+2)!=6){
       lcd_gotoxy(1,2);
       printf(lcd_putc,"\r F%d :  %02d : %02d ",count+2,set_hr,set_min);
       delay_ms(50);
    }

}
     f_next=TRUE; 
     break;

    }
    }

}  // while hr

}

/************* Sec Period **************/
void sec_feed(){

//unsigned int sec=10;

while(input(PIN_B3)){

if(input(PIN_B1)==0){
   delay_ms(100);
   t_feed.sec_delay++;

   if(t_feed.sec_delay>=200){t_feed.sec_delay=200;}
       delay_ms(100);
       lcd_gotoxy(1,2);
       printf(lcd_putc,"\r Time : %d sec ",t_feed.sec_delay);
       delay_ms(50);     
}

if(input(PIN_B2)==0){
   delay_ms(100);
   t_feed.sec_delay--;

   if(t_feed.sec_delay<=1){t_feed.sec_delay=1;}
       delay_ms(100);
       lcd_gotoxy(1,2);
       printf(lcd_putc,"\r Time : %d sec ",t_feed.sec_delay);
       delay_ms(50);
}
}  // while sec
t_feed.sec_delay = t_feed.sec_delay;
//delay();

}

/************* Record **************/
void rec(){
int i;
//unsigned int sec=10;

while(input(PIN_B3)){

if(input(PIN_B0)==0){
    delay_ms(50);

    lcd_gotoxy(1,1);
    printf(lcd_putc,"\r Please Wait... ");
    delay_ms(50);


  for(i=0;i<10;i++){    //clear voice 10 Sec.
   output_low(pin_C0);
   output_high(pin_C1);
   output_high(pin_C2);
   lcd_gotoxy(1,2);
   delay_ms(1000);

  }

    for(i=10;i>0;i--){    //clear voice 10 Sec.
       output_high(pin_C0);
       output_low(pin_C1);        // record
       output_high(pin_C2);

       delay_ms(50);

    lcd_gotoxy(1,1);
    printf(lcd_putc,"\r   Say now  %d   ", i);
    delay_ms(50);
    delay_ms(850);
  }

   output_high(pin_C0);   // play
   output_high(pin_C1);
   output_low(pin_C2);
   delay_ms(500);

   clr_voice();

    lcd_gotoxy(1,1);
    printf(lcd_putc,"\r  Record Voice  ");
}

}  // while sec

}

/************* Set time **************/
void Set_Time(){

    delay_ms(50);
    lcd_gotoxy(1,1);
    printf(lcd_putc,"\r   Set Clock   ");

    show_menu();

while(1){

   if(input(PIN_B3)==0){

      delay_ms(250);
      time();
      break;
   }

   if(!input(PIN_B0)){

      break;
    }
}
}

/************* Set Feed Time **************/
void Set_Feed_Time(){
    int i;
    lcd_gotoxy(1,1);
    printf(lcd_putc,"\r Set Feed Time ");

    show_menu();

while(1){

   if(input(PIN_B3)==0){

       delay_ms(50);
       lcd_gotoxy(1,2);
       printf(lcd_putc,"\r F1 :  -- : -- ");


       delay_ms(250);


      for(i=0;i<5;i++){     // count feed time
         feed_time(i);
         delay_ms(250);
      }

      break;

}

   if(!input(PIN_B0)){

      break;
    }

}
}

/***************** Set Period Time *********************/

void Set_Period_Time(){

    lcd_gotoxy(1,1);
    printf(lcd_putc,"\rSet Feed Period");

    show_menu();

while(1){

   if(input(PIN_B3)==0){

       delay_ms(50);
       lcd_gotoxy(1,2);
       printf(lcd_putc,"\r Time : %d sec ",t_feed.sec_delay);

       delay_ms(250);
       sec_feed();

    break;
}

    if(!input(PIN_B0)){

      break;
    }
}
   }

/***************** Set Voice *********************/

void Play_Voice(){

    lcd_gotoxy(1,1);
    printf(lcd_putc,"\r  Play Voice  ");

    show_menu();

  while(1){

   if(input(PIN_B3)==0){
      delay_ms(250);



    output_high(pin_C0);
    output_high(pin_C1);
    output_low(pin_C2);
    delay_ms(500);

    clr_voice();
}

    if(!input(PIN_B0)){
      break;
    }
}

      if(f_next==TRUE){
          delay_ms(50);
          lcd_gotoxy(1,2);
          printf(lcd_putc,"\r Next : %02d:%02d  " ,t_feed.hr,t_feed.min);

          delay_ms(50);
      }else{
          delay_ms(50);
          lcd_gotoxy(1,2);
          printf(lcd_putc,"\r                  ");
          delay_ms(50);
      }
   }

/***************** Rec Voice *********************/

void Rec_Voice(){

    lcd_gotoxy(1,1);
    printf(lcd_putc,"\r  Record Voice  ");

    show_menu();

while(1){

   if(input(PIN_B3)==0){

    delay_ms(50);
    lcd_gotoxy(1,2);
    printf(lcd_putc,"[REC]       [OK]");

    delay_ms(250);
    rec();

    break;
}

    if(!input(PIN_B0)){

      break;
    }


}


   }

#INT_EXT                         
void EXT_ISR(void)               
{
if(cnt==0){
    delay_ms(250);
    Set_Feed_Time();

    cnt=1;
}
//ext_int_flag = TRUE;
}

/*******************************************************/

void main(){

lcd_init();

int16 next;
int tick_delay;
t_feed.sec_delay = 10;

clr_voice();

    enable_interrupts(GLOBAL);
    enable_interrupts(INT_EXT);  // Set external interrupt
    ext_int_edge(H_TO_L);        // External interrupt high to low edge

while(TRUE){
   delay_ms(50);

   if(cnt==1){
       delay_ms(250);
       Set_Period_Time();
       delay_ms(250);
       Set_Time();
       delay_ms(250);

   cnt=0;
}

   lcd_gotoxy(1,1);
   DS1307_ReadTime();

   if((t_feed.hr==bcd2bin(RTC.hr)) && (t_feed.min==bcd2bin(RTC.min))){
      if (delay_chk==0) {

       output_high(pin_C0);
       output_low(pin_C1);
       output_high(pin_C2);

        tick_delay=1;
        delay();
        delay_chk=1;

      next = next_time(24,60,5);
      t_feed.hr=next/60;
      t_feed.min=next%60;

          lcd_gotoxy(1,2);
          printf(lcd_putc,"\r Next : %02d:%02d  " ,t_feed.hr,t_feed.min);
          delay_ms(50);

      }
   }else{
      delay_chk=0;
   }

   if((tick_delay==1)&&(bcd2bin(RTC.sec)>=30)){
      clr_voice();
      tick_delay=0;
   }
      delay_ms(50);
      printf(lcd_putc,"\rTime : %2X:%2X:%2X\n", RTC.hr, RTC.min, RTC.sec);
      delay_ms(250);

   }
}
#7
ผมใช้วงจรที่ 2 หน้า 5 ของดาต้าชีทครับ ซึ่งมันคล้ายกับเว็บนี้ต่างกันแค่ค่า C  http://lowvoltage.wordpress.com/2011/05/15/lm386-mic-amp/   วงจรผมดูอย่างละเอียดแล้วที่เลือกวงจรนี้เพราะใช้อุปกรณ์น้อย แต่ไม่แน่ใจว่าผิดพลาดตรงไหนผมแนบไฟล์ภาพ PCB มาให้ดูด้วยครับ เสียงมันดังหวี่ตลอดเลย เสียงพูดก็ได้ยินนะครับ แต่มีเสียงรบกวน ภาคจ่ายไฟตอนนี้ทดลองกับไฟ 5V ของ Power Supply คอมพิวเตอร์ครับ ถ้าใช้งานได้จริงแล้วจะเอาไปใช้กับอะแดปเตอร์ 5V
#8
ผมต่อวงจรขยายเสียงไมค์ด้วย LM386 แต่มีเสียงหวี่รบกวนครับมันมีเสียงหวี่ตลอดเวลาซึ่งเสียงหวี่มันดังมากครับ มันรบกวนเสียงจากไมค์ ผมต่อวงจรตามดาต้าชีทแล้ว http://www.nari.ee.ethz.ch/wireless/education/PPS/PPS02/doc/LM386.pdf  หน้า 5 ซึ่งเหมือนกับวงจรนี้ http://lowvoltage.wordpress.com/2011/05/15/lm386-mic-amp  แต่มันดังหวี่ตลอดเวลา ไม่รู้เป็นที่ไมค์หรือลำโพง ไม่ทราบว่าแก้ยังไงได้บ้างครับ