thachdt

HOT

Post Top Ad

Thứ Tư, 13 tháng 2, 2019

Mạch điều khiển động cơ servo bằng biến trở dùng NE555

tháng 2 13, 2019 0
Chào các bạn, hôm nay mình xin chia sẽ với các bạn mạch điều khiển động cơ RC Servo, mạch này dùng để test các động cơ RC Servo hoặc dùng để điều khiển góc quay động cơ RC Servo

Về nguyên lí thì mạch này sử dụng ic timer NE555 để tạo ra xung PWM có tần số 50Hz với độ rộng xung mức cao từ 0.7ms đến 2.4ms để làm cho động cơ quay được một góc từ 0° đến 180°

Xem bài chia sẻ điều khiển 10 động cơ servo từ xa : http://220von.blogspot.com/2017/10/ieu-khien-goc-quay-10-ong-co-servo-tu.html
Động cơ MG995



Động cơ RC Servo có 3 dây :
 + Dây màu vàng : pwm (xung pwm )
 + Dây màu đỏ : +5V
 + Dây màu nâu : GND


Nguyên lí hoạt động của động cơ RC servo được miêu tả trong hình sau :

Sơ đồ mạch :

Sơ đồ mạch RC SERVO dùng NE555



Hình ảnh mạch mình lắp :





Read More

Thứ Tư, 30 tháng 1, 2019

Mạch điều khiển mực nước

tháng 1 30, 2019 4
Hiện nay hầu hết các gia đình đều sử dụng các bồn nước có dung tích từ 500 lít đến 3000 lít để dự trữ nước dùng cho sinh hoạt hằng ngày , nước thường được bơm vào bồn từ các nguồn nước của giếng khoan hoặc từ nguồn nước máy

Vấn đề ở đây là quá trình máy bơm bơm nước vào bồn phải được giám sát, nếu bơm liên tục nước vào bồn trong một thời gian dài trong khi máy bơm không được tắt đi sẽ làm bồn nước đầy và dẫn đến tràn nước ra khỏi bồn , hoặc xảy ra tình trạng không có nước sử dụng cho sinh hoạt khi trong bồn không còn nước dự trữ , lúc đó ta phải bật máy bơm để bơm nước vào bồn 

Mạch điều khiển mực nước giới thiệu sau đây sẽ giải quyết được vấn đề trên , tức là sẽ đảm bảo lượng nước trong bồn luôn luôn có để sử dụng , khi mực nước thấp thì bộ điều khiển mức nước sẽ tự động bật bơm nước để bơm nước vào bồn , khi nào bồn đầy bộ điều khiển mực nước sẽ tự động tắt bơm , quá trình sẽ diễn ra một cách tự động hoàn toàn ( có một số bồn đắt tiền hơn được lắp hệ thống điều khiển mực nước điện tử này hoặc bằng công tắc cơ khí )

Sơ đồ mạch như sau :





Read More

Thứ Hai, 28 tháng 1, 2019

ESP8266 điều khiển bật tắt 4 LED qua Webserver

tháng 1 28, 2019 3
Bài viết này sẽ hướng dẫn bạn từng bước xây dựng một Webserver trên ESP8266 để điều 4 đèn Led độc lập qua mạng internet. Webserver trên ESP8266 mà mình sẽ hướng dẫn đáp ứng tất cả các trình duyệt trên điện thoại thông minh, như vậy các bạn có thể truy cập vào thiết bị bằng máy tính PC hoặc điện thoại thông minh trong mạng cục bộ ( mạng LAN ) thông qua địa chỉ IP của thiết bị








Read More

Thứ Bảy, 26 tháng 1, 2019

Hướng dẫn viết code điều khiển cánh tay robot gắp phôi từ băng tải

tháng 1 26, 2019 0
Code điều khiển cánh tay gắp phôi từ băng tải

Nhiệm vụ của code như sau :
+ Cho phép chế độ điều khiển bằng tay cánh tay thông qua 4 biến trở
+ Cho phép dạy cho cánh tay cách thức gắp phôi từ băng tải và duy chuyển
+ Cho phép chế độ tự động khi có phôi thì tự động gắp phôi


Video của mô hình như sau :



Phần cánh tay trong mô hình sử dụng 4 động cơ servo MG995
Vi điều khiển được chọn là PIC16F886

Mình sử dụng ngắt timer để tạo xung pwm điều khiển các động cơ servo , ưu điểm của phương pháp này là sử dụng được với các tất cả các vi điều khiển có ngắt timer , nhược điểm là dãi xung ko được mịn nên servo khi chuyển động sẽ ko mịn , rất tốn thời gian xử lí của vi điều khiển

Code được viết trên CCS
Code C :

#include <16F887.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES NOBROWNOUT               //No brownout reset
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOWRT                    //Program memory not write protected
#FUSES BORV21                   //Brownout reset at 2.1V
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=8000000)
char sv1=15,sv2=15,sv3=15,sv4=15;
char servo1[8];
char servo2[8];
char servo3[8];
char servo4[8];

char count=0;
#int_TIMER0
void  TIMER0_isr(void)  // ngắt timer điều khiển 4 servo sau mỗi 100us
{
set_timer0(168);
count++;
if(count>=200)
  {
  output_high(PIN_B7);
  output_high(PIN_B6);
  output_high(PIN_B5);
  output_high(PIN_B4);
  count=0;
  }
 if(count>=sv1)output_low(PIN_B7);
 if(count>=sv2)output_low(PIN_B6);
 if(count>=sv3)output_low(PIN_B5);
 if(count>=sv4)output_low(PIN_B4);

 /////////////////////////////////
}
void write_servo(char val1,char val2, char val3, char val4 ,char pos) // lưu vị trí cánh tay
{
write_eeprom(pos*4 + 1,val1);
write_eeprom(pos*4 + 2,val2);
write_eeprom(pos*4 + 3,val3);
write_eeprom(pos*4 + 4,val4);
delay_ms(20);
}
void read_servo() // đọc vị trí cánh tay
{
char k=0;
for(k=1;k<=8;k++)
    {
     servo1[k-1]=read_eeprom(k*4 + 1);
     servo2[k-1]=read_eeprom(k*4 + 2);
     servo3[k-1]=read_eeprom(k*4 + 3);
     servo4[k-1]=read_eeprom(k*4 + 4);
    }
}
void main()
{
 set_tris_a(0b00001111);
 set_tris_b(0b00001111);
 port_b_pullups (0b00001111);
 output_b(0x00);
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
 set_timer0(164);
 setup_adc_ports(sAN0|sAN1|sAN2|sAN3|VSS_VDD);
 setup_adc(ADC_CLOCK_INTERNAL);
 enable_interrupts(INT_TIMER0);
 read_servo();
 sv1=servo1[7];sv2=servo2[7];sv3=servo3[7];sv4=servo4[7];
 enable_interrupts(GLOBAL);
 delay_ms(10);
 char vitrihoc=0;
 int1 D0_set=0;
 char i=0;
 char k=0;
 signed int8 value1=0,value2=0,value3=0,value4=0;

Read More

Mạch báo động rò khí gas và chống trộm báo qua điện thoại bằng tin nhắn sms

tháng 1 26, 2019 1
 Mạch chống trộm và cảnh báo rò khí gas báo qua tín nhắn sms
 + Mạch sẽ tự động bật còi hú khi cảm biến chống trộm hồng ngoại bị trộm kích hoạt và gửi tin nhắn sms cho chủ nhà qua điện thoại
 +  Bật relay quạt gió khi phát hiện rò rỉ khí gas và báo động còi hú , gửi tin nhắn sms cho chủ nhà biết qua điện thoại

Mạch sử dụng module sim 900A, vi điều khiển PIC16F877A

Sơ đồ và layout mạch in mình vẽ trên proteus :
220von

220von



Sơ đồ mạch nguồn 12V - 3.3V cấp cho mạch :
220von

Code C : mình viết trên phần mềm biên dịch CCS

#include <16F877A.h>
#include <def_877a.h>
#include <string.h>
#FUSES NOWDT                
#FUSES HS                      
#FUSES NOPUT                   
#FUSES NOPROTECT              
#FUSES NODEBUG              
#FUSES NOBROWNOUT            
#FUSES NOLVP                  
#FUSES NOCPD                  
#FUSES NOWRT                  
#FUSES RESERVED 

#use delay(clock=10000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include <ce_lcd.c>
#define use_portb_lcd TRUE
#define      PWU            RD6
#define      TXD            RC6
#define      RXD            RC7
#define  buffer_size          80      
char     buffer[buffer_size];          
int      xbuff=0x00;                 
char     c=0x00;                      
char     c1=0x00;                    
short    sms_mode=false;

char gas,ir;
int1 x=0,y=1;
char z=0;
char so[13]="01216512808"; // so dien thoai gui tin nhan canh bao
void send_sms(char so[12],char vitri);
void erase_buffer(void);   
void init_sim900(void);   
void read_sms();          
void at(void);            
short wait_ok (void);     
short wait_error (void);  
/////////////////////////////////////////////////////////////////////////////////
#INT_RDA
RDA_isr()
   {
   c=getc();
      if(c=='*'){                
        c1=c;             
        xbuff=0;  
        }
   if (c=='#' && c1=='*')
      {
       sms_mode=true;
       }
   if (xbuff >= buffer_size) 
      {xbuff=0;}
      else{  buffer[xbuff++]=c;}
   return 0;
   }
//////////////////////////////////////////////////////////////////////////////  
void main()
{
char ir_temp;
set_tris_a(0b11111111);
set_tris_d(0x00);
set_tris_c(0b10000000);
RD3=0;RD2=0;
RD1=1;
RD7=1;
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
setup_adc(ADC_CLOCK_INTERNAL); 
setup_adc_ports(AN0_AN1_AN3);
lcd_init();
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Dang khoi dong..");
init_sim900();
RD7=0;
lcd_gotoxy(1,1);
lcd_putc("     xong...    ");
delay_ms(1500);
lcd_putc("\f");
lcd_putc("    Xin Chao    \n");
lcd_putc("   220von.com    ") ;
send_sms(so,1);
lcd_putc("\f");
lcd_putc(" Module SIM 900 \n");
lcd_putc(" ............... ") ;
delay_ms(1000);
set_adc_channel(1);
delay_us(20);
ir_temp=read_adc();
delay_us(20);

lcd_putc("\f");
while(true)
 {
  set_adc_channel(0);
  delay_us(20);
  gas=read_adc();
  delay_us(20);
  set_adc_channel(1);
  delay_us(20);
  ir=read_adc();
  delay_us(20);
  if((gas>120)&&(x==1)){z=1;RD3=1;RD2=1;lcd_putc("\f");lcd_gotoxy(1,1);lcd_putc("Ro ri khi gas");
                        send_sms(so,3);

                        x=0;
                       }
  if((gas<100)&&(x==0)){x=1;lcd_putc("\f");lcd_gotoxy(1,1);lcd_putc("He thong an toan") ;z=0;}
  if(z==1){RD3=1;RD2=1;RD1=1;delay_ms(200);RD1=0;delay_ms(200);}
  if(z==2){RD2=1;RD1=1;delay_ms(200);RD1=0;delay_ms(200);}
  if(z==0){RD3=0;RD2=0;RD1=0;}
  if((ir<(ir_temp-30))&&(y==1)){z=2;RD2=1;lcd_putc("\f");lcd_gotoxy(1,0);lcd_putc("Co trom dot nhap");
                               send_sms(so,4);
                               y=0;
                               }
  if(sms_mode==TRUE){read_sms();erase_buffer();}
 }
}

Read More

Thứ Sáu, 25 tháng 1, 2019

Hướng dẫn viết code mạch điều khiển 4 kênh học lệnh remote RF

tháng 1 25, 2019 0


Hướng dẫn viết code mạch điều khiển 4 kênh học lệnh remote RF


Chức năng của mạch như sau :
 + Học lệnh từ remote 4 nút RF trên thị trường để điều khiển bất tắt 4 relay
 + Chuyển đổi giữa chế độ tự giữ relay hoặc không tự giữ relay khi nhấn nút trên remote đã học lệnh bằng cách nhấn giữ nút nhấn

Video mạch :


Sơ đồ mạch :

sơ đồ mạch

+ Điện áp hoạt động của mạch này là 12V
+ Trong mạch mình sử dụng vi điều khiển PIC12F683 để thực hiện việc giải mã và lưu mã lệnh của nút nhấn vào bộ nhớ eepom nôi , sử dụng clock nội nên không cần thạch anh ngoài

Hình một trong nhiều mẫu remote nút mà mạch này hổ trợ học lệnh

Mẫu remote 4 nút



+ Mạch tách sóng mình sử dụng mạch tách thu sóng 315Mhz có sẵn và thông dụng nhất trên thị trường để dùng với remote 315MHz, hoặc các bạn có thể dùng với remote tần số 433MHz thông qua việc đổi sang dùng module thu sóng 433MHz

Hình module thu tách sóng :
Module thu sóng 315MHz hoặc 433MHz

Chuỗi dữ liệu thu được ở module thu sóng:





Giới thiệu sản phẩm :
Bo điều khiển từ xa 4 kênh học lệnh đa chức năng
NO : THACHDT-RF-IR-4-12V V1.0
Điện áp hoạt động : 12V DC hoặc 12V AC ( 50Hz - 60Hz )
Chức Năng :
  + Học lệnh hầu hết các loại remote RF trên thị trường ( tần số 315MHz, hoặc 433MHz)
  + Học lệnh từ tất cả các remote hồng ngoại của tivi, đầu kĩ thuật số ..v.v
  + Nhớ được 3 remote khác nhau
  + Chế độ tự giữ hoặc không tự giữ relay
  + Chế độ tự sao lưu trạng thái relay khi mất điện
  + Còi bip báo ( một tiếng báo bật relay , hai tiếng báo tắt relay )
  + Bật tắt trực tiếp 4 relay bằng 4 nút nhấn trên bo

Bo điều khiển từ xa 4 kênh học lệnh đa chức năng bản 12V
                                        NO : THACHDT-RF-IR-4-220V V1.0
220von
Bo điều khiển từ xa 4 kênh học lệnh đa chức năng bản 220V 
                                         NO : THACHDT-RF-IR-4-220V V1.0
220von
Phiên bản 220V đấu với tải là các bóng đèn 220V

Read More

Thứ Năm, 24 tháng 1, 2019

Phân loại 5 màu dùng cảm biến màu TCS3200 hiển thị LCD 16x2

tháng 1 24, 2019 0



Video test mạch : 





Code của mạch : viết trên phần mềm CCS

#include <16F877A.h>
#include <string.h>
#include <stdlib.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(crystal=12000000)
#byte T1CON   = 0x10        
#define S2 PIN_C2
#define S3 PIN_C3
float tanso=0,F_R=0,F_B=0,F_G=0,F_C=0;
char R=0,B=0,G=0;
int1 chopheptinh=0;
void mau();
char menu=1;
////////////////////////////////////////////////////////
#define lcd_type 2         
#define lcd_line_two 0x40   
#define  RS PIN_A0
#define  RW PIN_A1
#define ENABLE PIN_A2 
BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
//////////////////////////////////////////////////////////////////////////
void lcd_send_nibble( BYTE n ) {
      if(n&0x01)output_high(PIN_A3);
      else output_low(PIN_A3);
      if(n&0x02)output_high(PIN_A4);
      else output_low(PIN_A4);
      if(n&0x04)output_high(PIN_A5);
      else output_low(PIN_A5);
      if(n&0x08)output_high(PIN_E0);
      else output_low(PIN_E0);     
      delay_us(50);
      output_high(ENABLE);
      delay_us(50);
      output_low(ENABLE);
      delay_ms(1);
}
void lcd_send_byte( BYTE address, BYTE n ) {

      output_low(RS);
      if(address)output_high(RS);
      else output_low(RS);
      delay_us(50);
      output_low(RW);
      delay_us(50);
      output_low(ENABLE);
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
      delay_ms(1);
}
void lcd_init() {
    BYTE i;
    output_low(RS);
    output_low(RW);
    output_low(ENABLE);
    delay_ms(50);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(10);
    }

Read More

Post Top Ad