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.


Topics - mmc01

Pages: [1]
1
ผมสั่งซื้อมอเตอร์ทดเกียร์แบบนี้มาครับ http://www.es.co.th/detail.asp?Prod=70500024 ผมต่อใช้งานกับไมโครคอนโทรลเลอร์เป็นเครื่องตั้งเวลาเมื่อถึงเวลาที่ตั้งไว้มอเตอร์จะหมุน โดยใช้ Power Supply คอมพิวเตอร์เป็นแหล่งจ่ายไฟ 5V เข้ามอเตอร์และไมโครคอนโทรลเลอร์ พอมอเตอร์หมุนจอ LCD Module ที่ต่อกับไมโครคอนโทรลเลอร์จะแสดงผลแปลกๆ ผมคิดว่าเป็นเพราะมอเตอร์กินกระแสเยอะไปครับ ผมคิดว่าจะเอาไปใช้กับถ่านแต่คิดดูแล้วถ่านคงหมดเร็วแน่นอนแบบนี้ ถ้าใช้กับอะแดปเตอร์ 5V ก็ไม่รู้กระแสพอหรือเปล่าและถ้าไฟดับก็ต้องตั้งค่าใหม่อีก ควรจะใช้แหล่งจ่ายไฟแบบไหนดีครับที่สามารถใช้ได้นานๆ

2
ผมซื้อมอเตอร์เกียร์แบบนี้มาครับ http://www.es.co.th/detail.asp?Prod=70500024 ลองต่อกับไฟ 5V จาก Power Supply แล้วแรงดีมากเอามือไปจับก็ไม่หยุดหมุน ปรับไฟเหลือ 3V ก็ยังหมุนได้ดีอยู่ อยากทราบว่าถ้าจะเอาไปต่อที่ขาเอาต์พุต 5V จากไมโครคอนโทรลเลอร์เข้ากับมอเตอร์โดยตรงเลยได้มั๊ยครับ

3
ผมต้องการสร้างวงจรบันทึกเสียงซึ่งผมคิดว่าไอซีบันทึกเสียงเบอร์ที่ถูกที่สุดที่หาได้ในเมืองไทยคือ ISD1700 ซึ่งผมต่อวงจรตอนแรกก็ใช้งานได้ปกติ แต่วันนี้ผมลืมดู เผลอจ่ายไฟ 12V เข้าไปจากปกติมันใช้ไฟ 5V ทำให้มันร้อนมาก ผมลองจับดูร้อนเหมือนหัวแร้งเลยครับ และก็เล่นเสียงไม่ได้อีกเลย ผมจึงคิดว่าไอซีเสียแล้วถึงถอดตัวเก่าออกพร้อมกับใส่ซ็อคเก็ตเข้าไปเพื่อครั้งหน้าจะได้เปลี่ยนง่าย แล้วพอจ่ายไฟปรากฏว่าไฟไม่ติดครับ ปกติถ้ามีการกดปุ่มไฟที่ขา 2 จะติดทุกครั้ง ผมลองเช็ค R และ C ทุกตัวในวงจรแล้วไม่มีตัวไหนขาดครับ วัดไฟแล้วที่ PCB ก็ไฟเข้าครับ ผมก็เลยไม่รู้จะไปเช็คตรงไหนต่อว่าอะไรมันเสียครับ นี้เป็นดาต้าชีทผมต่อวงจรตามหน้า 16 ครับ http://www.es.co.th/schemetic/pdf/ISD1700-ISD.pdf แก้ยังไงได้บ้างครับ

4
ผมเขียนโปรแกรมนาฬิกาแจ้งเตือนด้วย CCS ลองซิมูเลตกับ Proteus แล้วก็ใช้งานได้ปกติ แต่พอโหลดใส่ไมโครคอนโทรลเลอร์ PIC มาใช้งานจริงมันค้างตัวเลขไม่เปลี่ยนเลยครับพอจ่ายไฟแล้วเวลาจะค้างอยู่ที่เวลา 00.00.80 พอกดปุ่มก็ไม่เปลี่ยนเมนูเหมือนใน Proteus แล้วข้างหน้าข้อความปกติจะเป็นช่องว่างแต่พอใช้งานจริงมันขึ้นเครื่องหมาย = มาด้วย ลองเปลี่ยนถ่านนาฬิกาที่ใช้กับไอซี DS1307 แล้ว ก็ยังค้างเหมือนเดิมครับ โปรแกรมผมค่อนข้างใหญ่แต่ก็คอมไพล์ได้ ไม่ทราบว่าต้องตรวจสอบแก้ไขตรงไหนครับ ตอนนี้ไม่รู้จะแก้ยังไง ที่จริงถ้าใช้กับ Proteus ได้ก็น่าจะใช้กับวงจรของจริงได้ แต่นี่มันไม่ใช่ครับไม่รู้จะแก้ยังไง

Code: [Select]
#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);

   }
}

5
ผมต่อวงจรขยายเสียงไมค์ด้วย 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  แต่มันดังหวี่ตลอดเวลา ไม่รู้เป็นที่ไมค์หรือลำโพง ไม่ทราบว่าแก้ยังไงได้บ้างครับ

6
สอบถามการเลือกมอเตอร์แบบที่ไม่สามารถใช้มือหมุนได้ถ้าไม่จ่ายไฟครับ อยากได้ตัวเล็กราคาถูกๆครับ จะเอาไปทำโปรเจคตัวเฟืองหมุนจ่ายอาหารเม็ดเพราะถ้าไม่จ่ายไฟแล้วมันยังหมุนได้เหมือนมอเตอร์ธรรมดานี่อาหารเม็ดคงจะไหลออกมาจนหมดแน่ครับ ตอนเรียน ปวช เพื่อนเคยซื้อมาตัวนึงเห็นมันเรียกว่ามอเตอร์ทดหรืออะไรซักอย่างเนี่ยครับ หมุนช้าแต่ถ้าไม่จ่ายไฟมอเตอร์จะไม่หมุนเลยแข็งมากครับ ตอนนั้นราคา 120 บาท แต่ผมไม่แน่ใจว่าเค้าเรียกมอเตอร์ทดใช่หรือไม่และต้องเลือกยังไงให้เหมาะสมกับงานครับ

7
ขาย Discovery-III XC3S200F + Xilinx USB Platform Cable ราคา 5,500 เท่านั้น ราคารวม Vat แล้ว ถูกกว่าร้านอื่นๆที่มีขาย ของใหม่ยังไม่ได้ใช้งาน สินค้ามีชิ้นเดียว ขายคู่กันคือ Discovery-III XC3S200F และสายโหลด Xilinx USB Platform Cable เพราะหากขายชิ้นเดียวอีกชิ้นนึงก็ไม่รู้จะเก็บไว้ทำอะไร รีบเข้ามาซื้อได้เลยที่ http://maxstable.lnwshop.com/product/3/fpga-discovery-iii-xc3s200f-xilinx-usb-platform-cable-compatible

Pages: [1]