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

Topics - ozuke

#1
ออกตัวก่อนนะครับ ผมใช้ SmingFramwork กับโปรแกรม Eclipse
ซึ่งนี่เป็นครั้งแรกที่ได้ทดลองใช้งาน ESP8266 มันเป็นอะไรที่วุ่นวายมาก
กับการคลำหาวิธีการใช้งานมันโดยไม่มีผู้ช่วยแนะนำในช่วงแรก

เข้าเรื่องเลยดีกว่า
คือผมเคยตั้งคำถามใน Facebook ไปแล้วรอบนึงว่าถ้าผมจะใช้ขา GPIO9, 10
หรือขาที่ NodeMCU V3 เขียนแปะไว้ว่าเป็น S3, S2 มันสามารถใช้งานเป็น
GPIO ได้รึปล่าว เห็นเขียนบอกเอาไว้ สรุปว่าคำถามผมไม่รู้ไม่ดีรึปล่าว
เลยไม่มีคนตอบ มีแต่คนกด Like กันเต็มเลยฮ่าๆๆๆ
#ขออภัยในที่นี้ด้วย
กลับมาเข้าเรื่องกันต่อครับ พอผมไม่ได้คำตอบ ตามกระบวนการธรรมชาติของผมจึงเกิดเหตุการที่ว่า
ถ้าไม่มีคำตอบจากคำถาม เราก็ควรจะหาคำตอบด้วยตัวเอง โดยการงมโข่งเป็นเวลา 2 อาทิตย์ในการปะติดปะต่อ มั่วซั่วและถามเพื่อนที่เคยใช้ NodeMCU อันอื่นๆ

เพื่อนแนะนำให้ใช้ SmingFramework เพราะว่ามันเอาหน้าเพจเป็นไฟล์ HTML ยัดเข้าไปใน ESP ได้เลยผมเลยชอบ
และผมก็เริ่มลงโปรแกรม ใช้เวลา 3 วันในการมั่วไปเรื่อยจนทำให้ Windows เกือบเจ้งเพราะไปตั้งค่า PATH ด้วย Command ผิด
สรุปผมก็ลงมันได้ และเขียนไฟกระพริบได้ในที่สุด จากนั้นก็เริ่มทดลอง Example ที่มีอยู่มากพอสมควรจาก Sming ซึ่งอ่านเข้าใจง่ายมาก
แต่ข้อเสียคือ Lib มันใช้งานกับ Arduino ได้ไม่ทั้งหมด ผมพยายามหลายครั้งในการทำ Lib ใหม่เพื่อให้ผมสามารถเอา Lib จาก Arduino มาใช้งานกับ Sming

สรุปผมทำได้ครับ มันไม่ยาก แต่คนจะทำต้องบ้าพอสมควรที่จะเอาเวลาไปนั่งไล่ดูว่า Lib แต่ละอันมันโยงไปไหนกันบ้างเห่อะๆ
พอผมเริ่มทำหัวใจหลักมันได้แล้ว ผมเริ่มที่จะย้าย Lib บางอันจาก Arduino เข้ามาเช่น I2C LCD, DS1307 ซึ่งมันก็ทำงานได้แล้ว
จากเดิมที่ทำงานไม่ได้เพราะหลายข้อจำกัดเช่นใช้ GPIO16 เป็น IO นี่มันรู้สึกว่ามั่วได้ใจมาก เพราะขานี้เป็นขาของ WDT
ถ้าเราไปสั่งมันเป็น LOW แล้ว WDT มันจะรีเซทอัตโนมัติเลย ฮ่าๆ ก็อาศัยการค้นหาในอินเตอร์เน็ตสักพักใหญ่ๆ

พอผมแก้ปัญหาเรื่องขา GPIO16 ได้ผมมาต่อกันที่ขาที่ผมกลัวว่ามันจะเป็นปัญหาใหญ่สำหรับผมเลยก็ว่าได้คือขา GPIO9, 10
ที่มันต่อกับ IC Flash Memory ซึ่งจากการค้นหาข้อมูลในหลายๆเว็ปแล้ว บางเว็ปบอกใช้ได้ บางเว็ปบอกใช้ไม่ได้
#หัวร้อนเลยครับ ออกแบบ PCB สั่งทำมาแล้วฮ่าๆ
มาต่อครับ ผมได้ทดลองจั้มป์ HIGH เข้าไปที่ขาพบว่า ทำงานได้ปกติจากการการตั้งค่าให้ ESP ทำงานในโหมด DIO
แต่พอจัมป์ลง LOW เท่านั้นหล่ะ หัวร้อนเลยครับ หน้ามึดตาลายคล้ายจะเป็นลมอยู่พักใหญ่ๆ พบว่ามันค้างครับพี่น้องคือมันนี่งไปสักพักแล้ว WDT มันก็ทำงาน

สรุปผมไม่สามารถใช้งานโมดูลขา GPIO9, 10 ได้เลยในช่วงเวลานั้นจนถึงเวลานี้ ผมเลยเกิดอาการอยากจะแงะมัน ฮ่าๆๆๆๆๆ
#ขอสักตัวละกันครับหัวหน้า พูดในใจเพื่อขออนุญาติลูกพี่ก่อนแกะของเขาพัง
ผมแกะออกมาแล้วพบว่า LoLin NodeMCU V3 ใช้ ESP-12E และขามันก็ไม่ได้ตรงตามที่เขาโฆษณาเอาไว้นั้นคือ GPIO9, 10 ไม่ได้อยู่ที่ขา
S2, S3 มันไปอยู่ขา SK, S3 แทน #เกิดอาการหัวร้อนขึ้นอีก และจากการวัด ขา 7, 3 ของ IC 25Q40 พบว่าขาทั้งสองยังต่อกับ ESP8266 อยู่
ซึ่งมองเผินๆ สองขานี้ไม่ใช้ก็ได้ จะสั้ง HIGH, LOW ก็ได้นะ หากเราใช้งานโหมด DIO แต่ผมก็ยังใช้งานมันไม่ได้อยู่ดีฮ่าๆ
จนถึงนาทีที่ผมแอบมาเล่นเว็ปตั้งกระทู้ ผมก็ยังใช้งานขาทั้งสองไม่ได้

ผมมีคำถาม ท่านไหนเคยใช้สองขานี้ต่อเป็น IO บ้างครับ แล้วใช้ได้ไหม?
#2
พอดีผมใช้ websocket ของ tornado เขียนเพื่อจะลองควบคุม GPIO ของ Raspberry Pi ครับ
แต่ปัญหาอยู่ตรงนี้ครับ

ตอนเชื่อมต่อโดยเปิด Browser บน Raspberry Pi ทุกอย่างทำงานปกติคือสามารถสื่อสารข้อมูลกันได้
แต่ผมมาเปิดบนเครื่องที่เป็น PC โดยใช้ Google Chrome มันกลับไม่ทำงานหน่ะครับ ผมส่งข้อมูลอะไรไป
เหมือนข้อมูลจะไปค้างที่ไหนซักแห่ง แต่พอผมกด Ctrl+C เพื่อออกจากโปรแกรม Phyton(บน RPi) มันกลับส่งข้อมูลที่เคยสื่อสารกันขึ้นมาหมดเลย

ผมอยากจะสอบถามว่าหลังจากที่ผมติดตั้ง tornado บน raspberry pi แล้วผมต้องไปตั้งค่าอะไรอีกไหมครับผมถึงจะใช้งาน
websocket ให้สามารถส่งข้อมูลออกภายนอกตัว Raspberry Pi ได้

ภาพประกอบด้านล่างนะครับ
ขอบคุณทุกท่านครับ ;D
#3
พอดีจะย้ายหอพักกลับไปอยู่บ้าน ของบางอย่างไม่ได้ใช้งานขี้เกียจเอากลับเลยเอามาปล่อยครับ
ราคาต่อรองกันได้
รับจองทาง PM อย่างเดียวนะครับ

ขอบคุณครับ โอ mr.ozuke@gmail.com

1. LPC1768 Mini DK จอ Touch Screen แบบ Restive
ราคา 900
ขายแล้วครับ [ท่าน jx จองแล้วครับ]
#4
http://www.es.co.th/detail.asp?Prod=08301737

74HC4094 ครับเป็น Serial In/Parallel Out เหมือนกันต่างกันที่ตำแหน่งขาครับ
ลองใช้ดูครับ ^_^

#5
สอบถามหน่อยครับ พอดีต้องการวัดปริมาตรน้ำที่ไหลผ่านท่อว่าผ่านไปกี่ลิตรแล้ว
ผมต้องใช้เซ็นเซอร์อะไรหรอครับ พอดีดูเรื่อง Flow Sensor แล้วไม่น่าจะใช้งานได้หน่ะครับ
ท่านไหนเคยวัดบ้างขอสอบถามข้อมูลหน่อยนะครับ ;D

ขอบคุณครับ
#6
พอดีช่วงนี้เรียนไมโครโปรเซสเซอร์ แต่อาจารย์ให้ทำ Mini Project Micro controller
เลยรื้อของเก่ามาเจอะเจ้า PIC16F688 จำได้ว่าซื้อจากเว็ปนี้หล่ะนานแล้วจำไม่ได้ว่าใครเอามาขาย
ตอนแรกทำ MCS-51 ก็ใช้ได้แล้วครับ พอมาดูโจทย์ที่อาจารย์อีกที ทำ Display ผิดแบบเลยทำใหม่

การทำงานของโปรแกรมจะใช้การ Interrupt ของ External Interrupt ทั้งขอบขาขึ้นและขาลงซึ่งมันใช้ได้ทีละโหมด
จะสั่งเกตุได้จากโค้ดที่ผมเขียนเอาไว้นะครับตรง #INT_EXT ครับ
เมื่อเรา Trig สัญญาเข้าโมดูล HC-SR04 ไปแล้วโมดูลจะให้พลัส์ออกมาสัมพันธ์กับระยะทางตามสมการ

S = Time pulse on * 340 / 2 M.

เมือ Timer pulse on คือเวลาที่อ่านได้จากขา Echo ของโมดูล
340 คือความเร็วเสียงในอากาศ สามารถปรับเปลี่ยนตามความเหมาะสม
S คือระยะทางหน่วยเป็นเมตร
จากโค้ดที่ผมเขียนจะไม่ได้คำนวนเหมือนสมการข้างต้นเพราะผมจะให้ MCU ทำงานน้อยที่สุดเลยทำการคำนวนสมการไปบ้างแล้ว
โดยที่ค่าจากตัวแปร time ที่ผมอ่านมาจะต้องคำนวนเป็นเวลาจริงๆก่อนคือ

OSC = 8MHz
Timer 1 Prescell = 1

ดังนั้นจะได้ว่า

time = timer 1 value/(OSC/4) Sec.
        = timer 1 value/2000000 Sec.

เมื่อผมให้ MCU จับพัลส์จากขา Echo มาได้ผมก็จะเอามาหาค่าเวลาจริงแล้วนำไปหาระยะทางที่วัดได้โดยให้ตัว time คือค่าเวลา
ที่อ่านได้จากขา Echo โดยยังไม่ได้ผ่านการคำนวนเวลาจริง เมื่อผมนำสมการมารวมกันจะได้ว่า

S = (time/2000000) * (340/2) * 100 CM.
   = time * 0.0085 CM. (ซึ่งผมต้องการจุดทศนิยมอีกหนึ่งตัว ในโปรแกรมที่เขียนจริงจึงคูณ 10 เข้าไปอีกนะครับ
                                     และผมได้เฉลี่ยความเร็วเสียงขึ้นด้วยเลยไม่ตรงกับที่บอกนะครับ)

ที่เหลือก็แล้วแต่ท่านไหนจะเอาไปแสดงผลละครับ ส่วนผมเอาขึ้น LCD ด้วย BIG Numer Graphic
ของท่าน JENG ที่ทำไว้นานแสนนานแล้วแต่ก็ยังใช้งานได้ดีครับ

ผลที่ได้ก็ประมาณนี้ครับ






#7
หลานผมอายุสามขวบพึ่งเข้า รร. อนุบาลเป็นวันแรก
ธรรมดาของเด็กก็ต้องร้องให้ แต่หลานผมไม่เป็นอย่างนั้น
เขาหัวเราะร่างเริง สนุกกับเพื่อนใหม่ พอตกเย็นพี่สาวผมก็ไปรับกลับมา
แล้วถามคำถามว่า

พี่สาว : น้องเอ็กซ์ วันนี้ไปเรียนสนุกไหม? :)
น้องเอ็กซ์ : สนุกค่ะ เล่นกับเพื่อนๆ :D
พี่สาว : วันนี้น้องเอ็กซ์ทานข้าวกับอะไร? :)
น้องเอ็กซ์ : ทานข้าวกับคุณครู :D
ที่สาวผมและทั้งบ้าน :  :o :o :o :o :o :o :o :o

เด็กเอ๋ยเด็กน้อย...ห้าๆๆๆๆ

ขออภัยถ้ามันไม่ฮา ;D
#8
1. บอร์ด ARM7 LPC2103 ราคา 300 + 50 จัดส่งทั่วประเทศ(อยู่เมืองโคราชมีบริการปั่นจักรยานไปส่งฟรีถึงหน้าบ้านห้าๆๆๆๆ)
มีแต่บอร์ดครับ ไม่มีอย่างอื่นเลย ราคาต่อรองได้ครับ

http://www.etteam.com/product/ARM/et-base_arm2103.htm


#9
http://goo.gl/Dzplf

พอดีซื้อบอร์ด ATX Controller มาแล้วมี DVD แถมมาให้ มีคู่มือครบ แต่ขาดอย่างเดียวที่ผมต้องการคือ "วงจร" หน่ะครับ
คือผมจะเอามาเขียนโปรแกรมบน AVR Studio หน่ะครับ ไม่ได้เขียนบน Wiring พอไม่มีวงจรมันก็เขียนลำบาก
ไม่รู้ขาไหนเป็นขาไหน จึงรบกวนท่านที่พอทราบ หรือมีวงจรช่วยชี้ทางหน่อยครับ

เดี๋ยวนี้ผมสอบถามไปทางเว็ป และ Facebook แล้วแต่เงียบไป ไม่รู้ว่าไม่ว่างหรือยังไงหน่ะครับ
เลยมาหาที่นี่อีกทาง

รบกวนหน่อยนะครับ
ขอบคุณครับ ;D
#10
พอดีกดลบสแปมเพลิน กดพลาดไปโดนอีกหนึ่งกระทู้
กระทู้ Qt5 อะไรนี่หล่ะครับ ขออภัยด้วยนะครับ
#11
คือพอดีอาจารย์มาให้ออกแบบวงจรควบคุมมอเตอร์ ตอนแรกนึกว่าจะกินหมูแล้ว
ปรากฏว่า หมูมันตัวใหญ่เลยกินยาก ผมออกแบบวงจรตามข้างล่างครับ
MOSFET เบอร์ IRF3205/110A สองตัว
DIODE เบอร์ MUR3020/30A หนึงตัว
ทีนี้ มันก็ทำงานปกติหล่ะครับ แต่มันทำงานได้แป๊บเดียว เจ้า Diode ที่ผมเอาไว้กัน BACK EMF มันก็ร้อน
ร้อนมากเลย ผมไม่มีความรู้เรื่อง BACK EMF เลยทำแบบบ้านๆแบบนี้หล่ะครับ เคยขับเมอเตอร์ขนาดใหญ่
อยู่แต่ก็ไม่เคยใช้กระแสเยอะขนาดนี้หน่ะครับ คือมอเตอร์เป็นเมอเตอร์ปั้มน้ำมัน ไฮดรอริก ครับเดี๋ยววันหลัง
จะเอารูปมาให้ดู ผมคิดว่ามันน่าจะกินกระแส พอๆกันกับมอเตอร์ สตาร์ท รถยนต์หน่ะครับมันกินกระแสระหว่างหมุนอยู่ที่ 28-30A@12V DC
เพราะสายไฟที่ผมใช้เส้นใหญ่พอๆกัน แต่ก่อนเอาเส้นเล็กขับแป๊บเดียวขาดแล้ว ถ้าไม่ขาดมันก็เปื่อยครับ
ยังไง รบกวนหน่อยนะครับ

คือผมอยากทราบแค่ มันมีวิธีแก้การร้อนของ Diode ที่เป็นตัวกัน BACK EMF ได้ไหมหน่ะครับ หรือผมต้องใส่
RC เพื่อเป็นสนับเบอร์หรือปล่าวครับ

ขอบคุณครับ
Ozuke ;D
#12
http://youtu.be/l49maP23RYI
;D

พอดีไม่ว่าง แต่อยากหากอะไรอย่างอืนทำเล่น เลยรื้อๆตู้เสื้อผ้าดู
ไปเจอะเจ้า ATtiny13A ที่ดองไว้ ปลวกกัดขาแทบขาดแล้ว
กับช่วงนี้ทำโครงงานส่งครู เลยเอาเจ้า LED Matrix 16 x 32 dot. มาลองต่อดูว่าจะเป็นไงบ้าง
ผลก็ตามที่เห็นครับพอใช้งานได้ตามประสา MCU มันตัวน้อย อิอิ

สเป็คเจ้า ATting13A คร่าวๆครับ

มันมี 8 ขา
ใช้ไฟได้ตั้วแต่ 1.8-5.0 V
Flash Memory 1 KByte
EEPROM          64 Byte
SRAM               64 Byte
Frq.                 0-20Mhz(Internal 128Khz,4.8MHz and 9.3Mhz)
Feature           1 SPI,4CH ADC,1 Comparator,All pin Interrupts.

โค้ดที่เขียนครับ ผมไม่อธิบายนะ เพราะโค้ดไม่เยอะ และก็คอมเม้นท์ไว้บ้างแล้ว
คิดว่าคงพอเป็นแนวทางได้ การแสกน LED Matrix ตัวนี้ต้องแสกนในแนวตั้งนะครับ
ถ้าแสกนแนวนอนมันจะติดสว่างไม่เท่ากัน เพราะ Driver ออกแบบมาให้แสกนแบบนี้
ในไฟล์ LED.h ผมใส่ภาพที่จะเอามาแสดงเอาไว้ ขนาดไม่จำกัด ขึ้นกับ Memory ที่มี
แต่ต้องใส่ความสูงของภาพไม่เกิน 16 bit นะครับ

LED_Matrix.c
#include <stdint.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <compat/deprecated.h>
#include <LED.h>

#define CLK 0
#define ROW 1
#define COL0 2
#define COL1 4
#define LATCH 3

int main()
{
uint8_t cnt=0;
uint8_t i=0;
uint8_t offset = 0;
uint8_t point1,point2;
uint16_t oLED1,oLED2;
uint16_t delay = 0;

DDRB = 0xFF;
PORTB = 0x00;
while(1)
{
for(cnt=0;cnt<16;cnt++)
{
//Calculate shift LED offset
point1 = cnt+offset;
point2 = point1+16;
if(point1>sizeof(LED)/2-1)
point1 -= sizeof(LED)/2;
if(point2>sizeof(LED)/2-1)
point2 -= sizeof(LED)/2;

//Read display data to memory
oLED1 = pgm_read_word(&LED[point1])<<i;
oLED2 = pgm_read_word(&LED[point2])<<i;

PORTB = _BV(LATCH); //Clear all pin.

if(i==cnt) //Send row data.
sbi(PORTB,ROW);
if(oLED1&0x8000) //Send col data segment 1 (LED Matrix 16 x 32 form 16 x 16 x 2 piece.
sbi(PORTB,COL1);
if(oLED2&0x8000) //Send col data segment 2.
sbi(PORTB,COL0);
sbi(PORTB,CLK); //Send 1 clock to LED Matrix
}
//Latch data to LED.
cbi(PORTB,LATCH);
sbi(PORTB,LATCH);

if(++i>15)
i=0;
_delay_us(5);

//Delay for shift data.
if(++delay>300)
{
delay = 0;
if(++offset>sizeof(LED)/2)
offset = 0;
}
}
}


LED.h
#ifndef _LED_H_
#define _LED_H_
#include <avr/pgmspace.h>

prog_uint16_t LED[]={
0b0000000000000000,
0b0000000000000000,
0b1111111001111111,
0b0000010001000000,
0b0000100000111000,
0b0000010001000000,
0b1111111001111111,
0b0000000000000000,
0b1111111001000001,
0b0001001001111111,
0b0011001001000001,
0b0101001000000000,
0b1001110000000001,
0b0000000000000001,
0b1000000001111111,
0b0000000000000001,
0b0111110000000001,
0b1000001000000000,
0b1000001000000001,
0b1000001000000001,
0b0111110001111111,
0b0000000000000001,
0b1100001000000001,
0b1010001000000000,
0b1001101001111100,
0b1000011000010010,
0b1000001000010001,
0b0000000000010010,
0b0111111001111100,
0b1000000000000000,
0b1000000001111111,
0b1000000001000000,
0b0111111000111000,
0b0000000001000000,
0b1111111001111111,
0b0001000000000000,
0b0001100001111100,
0b0010010000010010,
0b1100001000010001,
0b0000000000010010,
0b1111111001111100,
0b1001001000000000,
0b1001001000000001,
0b1000001000000001,
0b1000001001111111,
0b0000000000000001,
0b0000000000000001,
0b0000000000000000,
0b0000000000000000,
0b0000000000000000,
0b0000000000000000,
0b0000000000000000,
0b0000000000000000,
0b1111111111111111,
0b1000000000000001,
0b1011111111111001,
0b1000001100000101,
0b1000010100000101,
0b1000100100000101,
0b1011000011111001,
0b1000000000000001,
0b1011111111111101,
0b1000000000010001,
0b1000000000100001,
0b1000000000010001,
0b1011111111111101,
0b1000000000000001,
0b1001111111111101,
0b1010000000000001,
0b1010000000000001,
0b1010000000000001,
0b1001111111111101,
0b1000000000000001,
0b1000000000000101,
0b1000000000000101,
0b1011111111111101,
0b1000000000000101,
0b1000000000000101,
0b1000000000000001,
0b1010000000000101,
0b1011111111111101,
0b1010000000000101,
0b1000000000000001,
0b1111111111111111,
0b0000000000000000,
0b0000000000000000,
0b0000000000000000,
0b0000000000000000,
0b0000000000000000,
0b0000000000000000,
0b0000000000000000,

};
#endif



ไฟล์โปรเจ็คครับ ผมเขียนบน AVR Studio 4.0 นะครับ การดาว์นโหลด(มีปัญหามากเลยต้องบอก) ให้ทำแบบนี้นะครับ
เข้าลิ้งค์นี้ไป กด CTRL+S มันจะเก็บเข้าเครื่องคุณเองครับ
https://docs.google.com/file/d/0B9HppoQOVif0SGJ0M0hyV2Rpdmc/edit?usp=sharing




#13
คือผมสร้าง static function ขึ้นแต่ทำไมมันไม่สามารถใช้งานคำสั่งของ component
พวก TextBox ListBox ได้ครับ มันจะขึ้น error แบบนี้ตลอดเลยครับ

error C2227: left of '->Text' must point to class/struct/union/generic type

โค้ดที่เขียน ได้เขียนแบบนี้ครับ

static void DataReceivedHandler(Object^ sender,SerialDataReceivedEventArgs^ e) {
SerialPort^ sp = (SerialPort^)sender;
&MainForm::ReceiveText->Text+=sp->ReadExisting();
}



https://docs.google.com/file/d/0B9HppoQOVif0ODU0aGlHMWpVQVE/edit?usp=sharing
ไฟล์แนบครับเป็นโปรเจ็ค ผมแค่อยากเขียน Visual C++ 2008 ให้มันติดต่อกับ Serial Port ได้หน่ะครับ
ขอบคุณครับ ;D
#14
VIRTUAL Serial Port Driver v7.0.1.255
โปรแกรมจำลองการทำงานของ COMM Port
มาพร้อม Keygen แล้ว โหลดตามสะบายเลยครับ

;D

https://docs.google.com/file/d/0B9HppoQOVif0X3FkU1dRemZzeGM/edit?usp=sharing
#15
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
#16
     พอดีเว็ปตัวเก่าเดี้ยง ตัวใหม่ก็พึ่งมา ไม่รู้จะเอาอะไรมาแบ่งปันเพื่อนๆ พี่ๆ น้องๆ ในเว็ป :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 :)
#17
 :)
คืออยากจะลองทำเครื่องวัดเสียงหน่ะครับ ว่าความถี่ไหนมันแรงมันน้อย
เจอะหลายๆที่เขาทำ ผมเลยอยากทำบ้าง แต่ติดที่เรื่อง Fast Fourier transform ครับ
คือผมไม่มีพื้นฐานเลยเรื่องนี้ จึงอยากขอข้อมูลจากพี่ๆบ้างหน่ะครับ

ความต้องการคือว่า ผมอ่านค่าอะนาล็อกโดยใช้ MCU แล้ว จากนั้นว่าจะให้ MCU มันเป็นตัวแปลง
จากโดเมนของเวลาเป็นโดเมนของความถี่(ไม่รู้เรียกถูกรึปล่าวนะ ยังไม่ได้เรียนหน่ะครับ)
เพื่อนเอามาแสดงที่ LCD ครับ ผมแค่อยากทราบว่า การคำนวน Fast Fourier transform นี่
เขาเอาข้อมูลที่เรา Sampling มาคำนวนยังไง แค่นี้หล่ะครับ นอกนั้นก็จะค่อยๆทำเอาครับ ขอบคุณมากครับ :D