01 เมษายน 2553

GenesisPump


รายงานความก้าวหน้่าครั้งที่4

จากการใช้ Aduino ควบคุม digital potentiometer ยังมีข้อสงสัยในส่วนของ source code จึงต้องมีการศึกษาเพิ่มเติม ดังนั้นในวันนี้จะมาอธิบายในส่วนของ source code โดยอธิบายทำละส่วนดังนี้



1.) #define DATAOUT 11//MOSI #define DATAIN 12//MISO - not used, but part of builtin SPI #define SPICLOCK 13//sck เป็นการกำหนด pin ที่ 11,12,13 ตามมาตรฐานของ SPI
โดย pinที่13 ต่อกับ pinที่2 ของ MCP41010
(Serial Clock (SCK))
pinที่12 ไม่ได้ใช้
pinที่11 ต่อกับ pinที่3 ของ MCP41010 (Serial Data Input (SI))
อ่านเพิ่มเติมได้ที่ http://klk64.com/arduino-spi/ #define SLAVESELECT 10//ss
pinที่ 10 ต่อเข้ากับ pinที่1 ของ MCP41010 (Chip Select (CS))




2.)
byte resistance=0; // ประกาศตัวแปร ชื่อ resistance ชนิด char โดยมีค่าเริ่มต้นเป็น 0

3.1)
function Setup() จะถูกเรียกก่อนทุกครั้งเมื่อมีการทำงาน โดยในส่วนนี้จะเปนการกำหนดค่าเริ่มต้นให้กับตัวแปร,pin mode เป็นต้น

3.2)



จากคำสั่งนี้พบว่างงกับคำสั่งมากว่าทำอะไรจึงทำการค้นคว้าข้อมูลเพิ่มเติม พบว่า SPCR คือ SPI Control Register ซึ่งสามารถเรียกใช้โดยไม่ต้องประกาศตัวแปร ซึงมี 8 bit
ประกอบไปด้วย
Bit 7 - SPIE: SPI Interrupt Enable
Bit 6 - SPE: SPI Enable
Bit 5 - DORD: Data Order
Bit 4 - MSTR: Master/Slave Select
Bit 3 - CPOL: Clock Polarity
Bit 2 - CPHA: Clock Phase
Bit 1 and bit 0 - SPR1, SPR0: SPI Clock Rate Select 1 and 0

จากคำสั่งข้างต้น ค่าของ SPCR = 01010000 โดยค่าของ SPE=1 SPI enable, MSTR=1 เป็นการกำหนดว่า เป็น Master หรือตัวส่งข้อมูล

3.3) Write_pot(255); เปนการกำหนดค่าเริ่มต้นในการทำงานโดยส่งค่า 255 ไป


อธิบาย function write_pot(int)

เมื่อมีการส่งข้อมูลต้องให้ค่า SLAVESELECT เปน 0 จึงจะทำการส่งข้อมูลได้ ดังนั้นจึงต้องใช้คำสั่ง
digitalWrite(SLAVESELECT,LOW);

spi_transfer(19);
spi_transfer(value);

หลายคนอาจสงสัยว่าเหตุใดจึงมีการ function สองครั้ง
ครั้งแรกเป็นการส่ง COMMAND Byte โดยมีรูปแบบดังนี้


โดยจะส่งไป 2 Byte เช่น เลข 19 คือ b00010011 (จาดการทดลองส่งเลข 17 ก้อใช้งานได้เช่นกัน 17=b00010001)

ครั้งที่สองเป็นการส่ง Data Byte
4) spi_transfer(volatile char data)
SPDR=data; ค่าที่รับมาจะถูกส่งไป SPI Data Register

SPSR=SPI Status Register


ประกอบไปด้วย
Bit 7 - SPIF: SPI Interrupt Flag
Bit 6 - WCOL: Write COLlision Flag
Bit 5...1 - Res: Reserved Bits
Bit 0 – SPI2X: Double SPI Speed Bit



เมื่อการส่งข้อมูลเสร็จแล้ว SPIF เป็น 1 จะทำให้ SPIE เป็น 1 และจำทำการเคลียค่า SPIF เป็น 0 เมื่อเข้าถึงค่าใน SPI Data Register คิดว่าน่าจะส่งค่าสู่ Digital Potentiometer ในส่วนนี้ (ขอ comment ข้อผิดพลาดด้วยครับ)
5) loop(); เป็น function ที่ตอบสนองการทำงานอย่าต่อเนื่อง

โดยค่า resistance = 0; โดยถูกกำหนดไว้ตอนแรก
โดยค่า resistanceจะมีค่าได้ระหว่าง 0-255 เพราะ MCP1010 จะทำงานได้ที่ 256 ระดับ
ภายใน loop จะให้ค่า resistance เพิ่มขึ้นเรื่อย นั่นทำให้ค่าความต่างศักย์ลดลง
delay(1000) ไว้หน่วงการส่งที่ 1 วินาที

* คำถาม ทำไมใน function spi_transfer(volatile char data) ถึงต้องนำ char มาเป็นพารามิเตอร์ และ volatile ใช้อย่างไร

26 มีนาคม 2553

GenesisPump


รายงานความก้าวหน้่าครั้งที่3



รูปที่ 3.1 การควบคุม Digital Potentiometer

หลังจากได้รับความรู้เรื่อง Arduino จากอาจารย์อภิเษกและจักรแล้ว จนมีความรู้ในระดับนึง อาจารย์อภิเษกจึงให้ลองเล่นตัว Aduino ของจริง ซึ่งพบว่า เมื่อนำ Aduino มาควบคุม digital Potentiometer ต้องศึกษาเรื่อง SPI เพิ่มเติม
จากรูป 3.1 IC ที่นำมาใช้คือ MCP41010 อ่านข้อมูลเพิ่มเติมได้จาก http://www.arduino.cc/en/Tutorial/SPIDigitalPot




รูปภาพที่ 3.2 ข้อมูลอ้างอิง MCP41xxx

สิ่งที่บรรลุเพิ่มขึ้น
1.ในการส่งค่าจาก Aduino สู่ขา Serial Data Input ของ MCP41010 นั้น เมื่อค่าที่ส่งยิ่งมาก(0-255)ค่าความต่างศักย์ที่วัดได้ก็จะลดลง
2.MCP 41010 ความต่างศักย์ที่รับได้อยู่ในช่วง 2.7v-5.5v และปรับระดับได้ 256 ระดับ
3.Function ที่ควรรู้ Digital I/O

- pinMode()

Syntax

pinMode(pin, mode)

Parameters

pin: the number of the pin whose mode you wish to set

mode: either INPUT or OUTPUT

-digitalWrite()

Syntax

digitalWrite(pin, value)

Parameters

pin: the pin number

value: HIGH or LOW


ปัญหาที่พบ
1.เมื่อทำการแปลงโค้ดเพื่อเขียนลงใน Processing มีบางส่วนที่เรียกใช้งานไม่ได้ เช่น Register


GenesisPump


รายงานความก้าวหน้่าครั้งที่2

Use
r Interface


รูปที่ 2.1 User Interface




GenesisPump


รายงานความก้าวหน้่าครั้งที่1

หลังจากที่อาจารย์อภิเษกพาเข้าพบอาจารย์รัศมี ที่ภาควิชาเคมีมาสองครั้งแล้ว จากการเก็บความต้องการเกี่ยวกับการควบคุม และข้อมูล ของเครื่องดูดสารเพื่อทำปฏิกิริยาหรือมีชื่อเต็มว่า MASTERFLEX Console Analog L/S Pump Drive ข้อมูลที่ได้คือระบบเก่าปรับระดับความเร็วในการดูดหรือปล่อยสารโดยการหมุน speed control(รูปที่ 1.2) ซึ่งทำให้เสียสารเคมีที่ใช้ในการทดลองและเวลาในแต่ละครั้งมาก เพราะต้องหาอัตราการไหลของสารทุกครั้ง และเราพบว่าเครื่องนี้สามารถควบคุมผ่าน DB9 pin ที่ด้วนหลังของตัวเครื่องได้ (ดังภาพที่1.4) ซึ่งในการทดลองควบคุมเครื่องผ่าน DB9 pin โดยปรับระดับความต่างศักย์ 2-10V จะสามารถควบคุมอัตราการไหลของสารได้เช่นเดียวกับ Speed Control ด้านหน้าตัวเครื่อง



รูปที่ 1.1 ด้านหน้า console drive


รูปที่ 1.2 Speed Control


รูปที่ 1.3 Power/Directional Switch


รูปที่ 1.4 DB9 pin



รูปที่ 1.5 ด้านหลัง console drive

22 มีนาคม 2553

ทักทายนิดนึง

หายเงียบกันทั้งแลบ -.-

blog ล้างเป็นป่าช้าแล้วอ่า เพื่อนๆ คนใด คืบหน้าอย่างไร ก็มาเขียนกันเล่นๆ เป็นการโน๊ตไว้นะ ใส่ใจกันนิดหนึ่งเพื่อตัวเราเอง แล้วก็วันอังคารที่ 23 มี.ค ช่วงบ่าย ถ้าว่างรองเอาความคืบหน้ามาคุยกับอาจารย์ด้วยก็ดีนะ คิดว่าอาจารย์น่่าจะพอมีเวลาว่างนิดนึง คิดว่าวันนั้นคงมีจัก ต้น ตั๊ก กร ไปหาอาจารย์ อยากให้เพื่อน ๆ เข้าร่วมปรึกษาด้วยจะดีมาก เพราะอาจารย์จะได้ไม่วุ่นที่จะต้องมาจัดเวลาให้ว่างแต่ละวันของแต่ละคน นัดเจอพร้อมกันทีเดียวสะดวกกว่า

20 มกราคม 2553

ประกาศเรื่องที่ 4

วันศุกร์ที่ 22 ม.ค. นี้ อาจารย์อภิเษก ได้จัดสรรเวลาให้กับเพื่อน ๆ ที่สนใจจะเข้าปรึกษาปัญหาโปรเจค โดยสามารถเข้าปรึกษาได้ในช่วงเช้าประมาณ 10.00 น. เพื่อน ๆ คนใดที่ยังไม่ชัดเจน หรือมีข้อสังสัยต่าง ๆ สามารถเข้าพบอาจารย์ได้ ณ วันเวลา ดังกล่าว

ปล. อยากให้เพื่อน ๆ ที่มีปัญหา เข้าปรึกษากับอาจารย์โดยด่วนที่สุด ทั้งนี้เนื่องจากเวลาใกล้เข้ามาทุกที จะได้เริ่มทำ เริ่มศึกษากัน ( ความสำเร็จจะเกิดขึ้นไม่ได้ ถ้าเราไม่เริ่มก้าวแรก )

14 มกราคม 2553

รายงานความก้าวหน้า ครั้งที่ 4

Tensile Testing

สืบเนื่องจากรายงานครั้งที่ 3 ตรงข้อที่ 2 ของการติดตั้ง firmata ที่ติดไว้ว่า ทำไมถ้าเราเลือกเป็น StandardFirmata แล้วค่าจาก analog I/O มีค่าเป็น 0 ซึ่งได้ข้อสรุปมาว่า เป็น bug ของ firmata ใน arduino 0017 ซึ่งได้รับการแก้ไขจาก firmata developer เรียบร้อยแล้ว ทั้งนี้ได้สรุปวิธีแก้ไข มาดังนี้

1. ให้ทำการโหลด firmata ตัวใหม่จาก >> Firmata-2.1beta7.zip
2. ให้เข้าไปในโฟร์เดอร์ libraries โดยทำได้ดังนี้
สำหรับ
GNU/Linux : ~/Desktop/arduino-0011/hardware/libraries
windows: C:\Program Files\arduino-0011\hardware\libraries
Mac OS X: /Applications/Arduino.app/Contents/Resources/Java/hardware/libraries
(สำหรับใน Mac นั้นหลังจากที่เข้าไปใน Application แล้วจะพบกับ arduino.app ให้คลิกขวาเลือก Show Package Contents)
3. เมื่อเข้าไปในโฟร์เดอร์ libraries แล้วนั้น ให้นำโฟร์เดอร์ Firmata ไว้วางทับ (อย่าเอาไปทั้ง Firmata-2.1beta7)
4. ให้ปิด arduino environment แล้วเปิดใหม่
5. ให้เลือก file > examples > firmata > StandardFirmata แล้วทำการ อัพโหลดเข้าบอร์ด
6. เปิด processing แล้วลองรันงานที่เรียกใช้ทั้ง analog และ digital ดูว่าทำงานได้หรือป่าว (มันต้องได้ถ้าทำไม่ผิดเอง)
ตัวอย่าง
import processing.serial.*;
import cc.arduino.*;
Arduino arduino;
int analogPin = 0;
int value = 0;

void setup(){
arduino = new Arduino(this, Arduino.list()[0], 57600);
}

void draw(){
value = arduino.analogRead(analogPin);
println(value);
arduino.digitalWrite(13,Arduino.HIGH);
delay(value);
arduino.digitalWrite(13,Arduino.LOW);
delay(value);
}