2019-01-20 - thachdt

HOT

Post Top Ad

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