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 - ozuke

#105
Quote from: sunny12 on March 03, 2013, 12:22:20 AMมีหลักการทำงานมันไหมครับ

ผมพูดตามตรงเลยว่าผม มองไม่ออกว่า หลักการมันทำไง  พอเอาไปประยุกต์หรือจะเขียนไทม์เมอร์มัน งง มากครับ T Tรบกวนหน่อยนะครับ


ก่อนอื่น ต้องถามก่อนว่า รู้จัก ADC DAC Timer Interrupt รึปล่าวครับว่ามันคืออะไร ทำงานอย่างไร
ใช้อย่างไร คือถ้าไม่ทราบ ไม่รู้จัก มันก็มองไม่ออกหรอกครับว่าจะเอาไปประยุกต์ หรือเอาไปใช้งานอย่างไร

คือผมเริ่มจะงงๆ กับคำถามหน่ะครับ
#106
มองดูเครื่องใช้ไฟฟ้ารอบบ้านคุณครับ

นาฬิกา(Timer) เครื่องเสียง(D/A) ทีวี(D/A) ตู้เย็น(A/D) เครื่องซักผ้า(Timer)
โทรศัพท์มีครบทุกอย่างที่คุณพูดมา ทั้งแปลงสัญญาณดิจิตอลเป็นเสียง เสียงเป็นดิจิตอล(Sound Rec.) นาฬิกา

อย่ามองไกลครับ มองไกล้ๆตัวคุณหล่ะครับ
#107
Projects / Etherner Web Server By LPC1768-Mini-DK
March 02, 2013, 02:14:38 PM
พอดีทำไวนานแล้วแต่ไม่มีโอกาสเขียนลงเว็ป เลยลองเขียนลงบล็อกของ Google ดูครับ
http://wittawatmcu.blogspot.com/2013/03/lpc1768-mini-dk-web-server.html

เป็นการใช้ บอร์ด LPC1768-Mini-DK จากเว็ป www.micro4you.net
เป็น Ethernet Web Server ครับ

ลองดูครับ ผิดพลาดตรงไหนก็ต้องขออภัยด้วยครับ :D
#108
Quote from: pomcoe on February 17, 2013, 02:08:35 PM
เอ่อ มัน Run ไม่ผ่านอะคับ
ติดที่ a=read_adc(0)*0.004888; อะคับ

มันคือแนวคิด ครับ ถ้าอยากให้รันได้ต้องอ่านแล้วทำความเข้าใจครับ
นี่แสดงว่าไม่ยอมอ่าน ไม่ยอมทำความเข้าใจรึปล่าว หรือมันไม่รู้เรื่องจริงๆ
ถ้าอ่านนิด ทำความเข้าใจหน่อยมันก็ทำได้แ้ล้วครับ

1.สั่ง LOW pin_b1,pin_b0
2.อ่าน adc 0 แล้วมาคำนวนเป็นโวลต์เก็บไว้ที่ตัวแปร a
2.1 ถ้า a มากกว่า 1.2 และน้อยกว่า 2 ให้ pin_b0 เป็น high
3.อ่าน adc 1 แล้วมาคำนวนเป็นโวลต์ เก็บไว้ที่ตัวแปร a
3.1 ถ้า a มากกว่า 1.2 และน้อยกว่า 2 ให้ ยin_b1 เป็น high
4.delay 4000 ms
5.กลับไปทำข้อ 1.

โชคดีครับ
ถ้าผมบอกมากกว่านี้ มันก็ไม่ต่างอะไรกันกับลอกการบ้านส่ง
ผมอยากให้คุณเข้าใจ มากกว่า การได้ส่งงานแบบไม่รู้เรื่อง
คิดว่าคงเข้าใจผมนะ
#109
แนวคิด

output_low(pin_b0);
output_low(pin_b1);

a=read_adc(0)*0.004888;
if(a>=1.2 && a<=2)
     output_high(pin_b0);

a=read_adc(0)*0.004888;
if(a>=1.2 && a<=2)
     output_high(pin_b1);

delay_ms(4000);
....................


มันอาจจะทำงานไม่ถึงกับเท่ากัน แต่ไกล้เคียง ถ้าอยากทำให้พร้อมกันก็ทำได้ ไม่ถึงกับ Interrupt หรอกครับ
#110
Simulate แล้วก็ปกติดีนิครับ
แล้ววงจรที่ต่อหน่ะต่อยังไงครับ โพสให้ดูหน่อยได้ไหม

ปล.คุณตั้งกระทู้ซะดึกขนาดนี้ แล้วกะให้เขาตอบเลย คุณกะไม่ให้แอ็ดมินกับเพื่อนๆนอนเลยหรอครับ
#111
ขอข้อมูลที่ละเอียดกว่านี้หน่อยครับ
ใช้อะไรเขียน ใช้ MCU เบอร์อะไร ใช้อะไรป้อนกลับมายังมอเตอร์

คือแบบนี้ก็เดาไม่ถูกครับ พอเจอะกระทู้แบบนี้อยากช่วย แต่ก็เหมือนผมเข้ามาแทงหวย ไม่รู้จะถูก จะผิด....เห่อะๆ
#112
     พอดีเว็ปตัวเก่าเดี้ยง ตัวใหม่ก็พึ่งมา ไม่รู้จะเอาอะไรมาแบ่งปันเพื่อนๆ พี่ๆ น้องๆ ในเว็ป :D
เลยลองเขียนโปรแกรมเล็กๆน้อยๆมาฝาก คือก่อนหน้านี้ก็ได้มีโอกาสทำหุ่นยนต์ย่าโมโรโบคอน(มีแข่งทุกปีครับ)
แล้วน้องๆ หลายๆทีมมาถามว่าเขียนโปรแกรมคุมเซอร์โวยังไงทำไมต่อได้เยอะจัง ทั้งที่ขา PWM ที่มีมันมีไม่กี่ขา
ผมเลยอธิบายไปยาวเลย น้องเขาก็งงๆ เหมือนจะเข้าใจ แต่ว่าจะเอาโค้ดให้ก็กลัวไปกันใหญ่ วันนี้เลยแบ่งส่วนออกมาให้
มีแต่ Servo ทั้งดุ้น

   ความสามารถของ Lib คือต่อ Servo เข้าขาไหนก็ได้ของ PIC แค่เป็นขาที่สามารถเป็น output ได้เป็นพอครับ
กำหนดค่าในโปรแกรมนิดหน่อยก็ใช้งานได้แล้วครับ เดี๋ยวมาดูโค้ดกันก่อนครับ

/*
Name : General Servo Controller.
Compiler Support : CCS C Compiler.
Designed by : Wittawat Sompong @ RMUTI

Software use timer_1 and CCP1 in MCU.
*/
#include <16f877.h>
#fuses HS,NOLVP,NOWDT,NOPROTECT
#use delay(clock=20M)

//-------------------------General config----------------------------------//
#define SERVO_MAX 5 //Max of Server connector
#define SERVO_MAX_VALUE 2500 //Max of pulse width micro sec(uS)
#define SERVO_MIN_VALUE 500 //Min of pulse width micro sec(uS)

typedef struct tServo{
volatile unsigned pin;
volatile unsigned Active;
volatile unsigned int16 value;
}Servo;

//------------------------Start Prototype-----------------------------------//
void ServoActive(unsigned chanel,unsigned vPin,unsigned int16 vValue);
void ServoValue(unsigned chanel,unsigned int16 value);//value is uS.
//------------------------End of Prototype---------------------------------//

//------------------------Servo gobal variable----------------------------//
signed ServoCnt=0;
Servo nServo[SERVO_MAX];

//------------------------Servo background task use CCP1 interrupt---------//
#INT_CCP1
void ServoTask()
{
//if enc of servo count ,reset timer1.
if(ServoCnt<0){
set_timer1(0);
}else{
//if server pin is active set output servo pin to low.
if(nServo[ServoCnt].Active)
output_low(nServo[ServoCnt].pin);
}
ServoCnt++;
if(ServoCnt<SERVO_MAX)
{
//set interrupt to next servo time.
CCP_1 = get_timer1()+nServo[ServoCnt].value;
//if servo pin is active set output servo pin to high.
if(nServo[ServoCnt].Active)
output_high(nServo[ServoCnt].pin);
}else{
//set fist chanel to start scan.
CCP_1 = get_timer1()+100;
ServoCnt = -1;
}
}

/*
ServoActive(c,p,v)
set pin 'p' to connect servo chanel 'c' and set pulse width 'v' uS.

Example : ServoActive(0,PIN_A0,1500);
set PIN_A0 to connect servo at chanel '0' and set pulse width 1500 uS.
*/
void ServoActive(unsigned chanel,unsigned vPin,unsigned int16 value)
{
nServo[chanel].pin = vPin;
nServo[chanel].value = ((value*5)/8);
nServo[chanel].Active = 1;
}
/*
ServoValue(c,v)
Set servo chanel 'c' to pulse width 'v' uS.
Example : ServoValue(0,2400);
set servo chanel '0' to pulse width 2400 uS. (2.4mS)
*/
void ServoValue(unsigned chanel,unsigned int16 value)
{
if(value>SERVO_MAX_VALUE)
value=SERVO_MAX_VALUE;
if(value<SERVO_MIN_VALUE)
value=SERVO_MIN_VALUE;

if (chanel>=SERVO_MAX)
chanel=SERVO_MAX-1;

nServo[chanel].value = ((Value*5)/8);
}
void main()
{
unsigned i;
//-----------------------------------------Setup timer1 to servo task-----------------------------//
setup_timer_1 (T1_INTERNAL|T1_DIV_BY_8);
setup_ccp1 (CCP_COMPARE_INT);
enable_interrupts(GLOBAL);
enable_interrupts(INT_CCP1);
//-----------------------------------------------------------------------------------------------//

//Add pin_d0 to connect servo chanel '0'
ServoActive(0,PIN_D0,1500);

ServoActive(1,PIN_D1,1500);
ServoActive(2,PIN_B0,1500);
ServoActive(3,PIN_B1,1500);
delay_ms(1000);
while(true)
{
for(i=0;i<4;i++)
{
ServoValue(i,1000);
//delay_ms(200);
}
delay_ms(1000);
for(i=0;i<4;i++)
{
ServoValue(i,1500);
//delay_ms(200);
}
delay_ms(1000);
for(i=0;i<4;i++)
{
ServoValue(i,2000);
//delay_ms(200);
}
delay_ms(1000);
for(i=0;i<4;i++)
{
ServoValue(i,1500);
//delay_ms(200);
}
delay_ms(1000);
}
}



หลักๆที่ท่านจะได้ใช้คือ ServoActive() ครับเป็นฟังก์ชั่นที่เอาไว้เพิ่มหรือกำหนดว่าเราจะต่อขาอะไรเข้ากับ Servo
ตัวอย่างเช่น ผมต้องการต่อขา PIN_D0 เข้า Servo ช่องที่ 0 และตั้งให้พัลส์ที่ขาออก 1.5mS
ผมก็เขียนว่า ServoActive(0,PIN_D0,1500); ถ้าผมต้องการเปลี่ยนองศาการหมุนของมัน
ไปเป็น +90 องศา ก็จะเขียน ServoValue(0,1000);

การใช้งานเบื้องต้นมีเท่านี้ครับ ใช้ง่ายครับ แต่โค้ดต้นฉบับเองผมได้ดูมาจาก Arduino
และดัดแปลงมาเขียนบน AVR Studio และก็แปลงมาเป็น CCS อีกที
เดี๋ยวตั้วหน้าจะเอาเวอร์ชั่น AVR มาให้ครับ พอดียังไม่ได้ลงโปรแกรม AVR Studio ครับเลยยังไ่ม่มีเวลาทดสอบ

ส่วนไกล้ๆงานย่าโมโรโบคอนปีนี้ เดี๋ยวจะเอาโค้ดโปรแกรมเซ็นเซอร์ตรวจจับเส้น
ที่เท่ไม่หยอกและบางคนอาจจะคิดไม่ถึงมาให้ดูกันครับ
ส่วนโปรแกรมนี้ท่านไหนสงสัยส่วนไหน หรือมีอะไรติชม ก็ยินดีครับ

วีดีโอการทำงานเบื้องต้นอยู่นี่นะครับ การหมุนอาจจะคลาดเคลื่อนบ้าง ลองปรับปรุงดูนะครับ

http://youtu.be/jSoJ2zHL9dU

โค้ดครับ : https://docs.google.com/file/d/0B9HppoQOVif0M3FTTnZHV2pNVzg/edit?usp=sharing

ปล.ผมคอมเม้นในโค้ดเป็นภาษาอังกฤษนะ อาจะดูกระด้างไปหน่อย ครั้งหลังจะปรับปรุงให้ดีกว่านี้ครับ ;)

ขอบคุณครับ
โอ.... ;D

------------------------------------------------------------------------------------------------------------------------
วิธีการก็อปโค้ดไปคอมไพล์ใหม่ ผมใช้ CCS V4.1 นะครับ
ใช้ Proteuse 7.10 SP0 เป็นตัว Simmulate ทำตามวีดีโอนะครับ
หากไม่ได้ยังไง ก็สอบถามได้ครับ ขอบคุณครับ

Test 4CH Server Driver with PIC16F887@ Proteuse 7.10 SP0
http://youtu.be/8CGP18xuUHg

How to compile source code by CCS 4.1
http://www.youtube.com/watch?v=7Dlf-ROrMtI
;) ;D :)