วันอาทิตย์ที่ 25 เมษายน พ.ศ. 2553

การออกแบบวงจรโดยใช้โปรแกรม Opensource ตอนที่ 1/3

หลังจากที่ได้ทดลอง KiCad ทำงานง่าย ๆ แล้ว ก็ถึงเวลาทดลองใช้ KiCad แบบจริงจัง คือมีชิ้นงานเป็นผลลัพธ์สุดท้ายได้ ความตั้งใจก็คือใช้ Opensouce โปรแกรม ในการออกแบบตั้งแต่ ลายวงจร (Schematic) จำลองวงจร (Simulation) ออกแบบแผ่นวงจรพิมพ์ และประกอบวงจรจริง ๆ โดยตั้งใจว่าจะแบ่งทำเป็น 3 ตอนคือ

วาดลายวงจร โดยใช้ KiCad และจำลองวงจรโดยใช้ gnucap ร่วมกับ gspiceui
วงจรที่เลือกคือวงจรขยายเสียงคลาสเอบีขนาด 0.5 วัตต์ ไม่ใช้ออปแอมป์หรือไอซีขยายเสียงสำเร็จรูป ออกแบบตามตำราเป๊ะ ๆ ไม่พลิกแพลงใด ๆ วงจรแบ่งออกเป็น 3 ส่วนย่อยซึ่งคนที่ผ่านวิชาอิเล็กทรอนิกส์น่าจะสังเกตได้ คือ
  1. วงจรขยายแรงดันแบบอิมิตเตอร์ร่วม
  2. วงจรกันชน (Buffer)
  3. วงจรขยายกำลังคลาสเอบี
ใช้ KiCad วาดลายวงจร โดยความตั้งใจแรกตอนที่วาดลายวงจรคือเพื่อสร้างแผ่นวงจร ลายวงจรจึงประกอบด้วยขั้วต่อสาย 3 จุด คือ ขั้วสัญญาณขาเข้า ขั้วสัญญาณขาออก และขั้วไฟเลี้ยง ดังรูป
เมื่อได้ลายวงจรแล้ว เราจะให้ KiCad สร้าง Netlist สำหรับ gnucap ให้เราได้ ผลที่ได้จะเป็นแฟ้มข้อความนามสกุล CIR ซึ่งมีเนื้อหาดังนี้
* EESchema Netlist Version 1.1 (Spice format) creation date: อา. 25 เม.ย. 2553, 18:45:25


C1  14 3 1u
P4  0 CONN_1
P3  5 CONN_1
P1  14 0 CONN_2
C2  13 0 470u
R2  3 0 42k
R1  5 3 79k
R5  13 0 39
R3  5 12 430
Q1  4 3 12 2N3904
RV1  10 10 9 100
R4  4 13 82
Q2  11 12 5 2N3904
R6  8 0 220
D2  9 8 1N4148
D1  11 10 1N4148
C3  6 7 470u
P2  7 0 CONN_2
R8  6 15 1
R7  2 6 1
Q4  15 8 0 2N2907
Q3  2 11 5 2N2222

.end
จากแฟ้มนี้ เราพบว่าต้องแก้ไขเพื่อให้จำลองวงจรใน gnucap ได้ 3 - 4 จุดด้วยกันคือ
  1. ขั้วต่อสัญญาณ Px ต่าง ๆ ไม่ต้องใช้ ก็ลบออก
  2. การเรียงลำดับของขาทรานซิสเตอร์ใน KiCad กับ gnucap ไม่ตรงกัน กล่าวคือ ใน KiCad จะเรียงลำดับเป็น E-B-C ในขณะที่ gnucap ต้องการให้เรียงลำดับเป็น C-B-E ก็แก้ไขลำดับของขาให้ถูกต้อง
  3. มีอุปกรณ์ตัวหนึ่งคือตัวต้านทานปรับค่าได้ ที่ gnucap ยังจำลองไม่ได้ ก็แก้ไขให้เป็นตัวต้านทานแทน ไม่ต้องปรับค่า
  4. อุปกรณ์เซมิคอนดักเตอร์ยังไม่มีโมเดล (.model) ในโปรแกรม gnucap นี้เราสามารถใช้โมเดลของ Spice ซึ่งหาได้จากบริษัทผู้ผลิตทั่วไปได้ทันที แต่โมเดลเหล่านี้ไม่ใช่ Opensource ผมจึงนำมาพิมพ์ไว้ตรงนี้ไม่ได้ หากใครสนใจให้ลองเข้าไปหาจากดาตาชีทของบริษัท หรือจากเว็บก็ได้ เมื่อโหลดมาแล้วก็เติมเข้าไปท้ายแฟ้ม ก่อน .end
  5. ไม่ได้กำหนดตำแหน่งไฟเลี้ยง และสัญญาณขาเข้า ก็ให้เพิ่ม VSupply กับ Vin เข้าไป ตามไวยกรณ์ของ gnucap
จะได้
* EESchema Netlist Version 1.1 (Spice format) creation date: อา. 25 เม.ย. 2553, 18:45:25


C1  14 3 1u
P4  0 CONN_1
P3  5 CONN_1
P1  14 0 CONN_2

C2  13 0 470u
R2  3 0 42k
R1  5 3 79k
R5  13 0 39
R3  5 12 430
Q1  12 3 4 2N3904
RV1  10 10 9 100
RV1 10 9 50
R4  4 13 82
Q2  5 12 11 2N3904
R6  8 0 220
D2  9 8 1N4148
D1  11 10 1N4148
C3  6 7 470u
P2  7 0 CONN_2
R8  6 15 1
R7  2 6 1
Q4  0 8 15 2N2907
Q3  5 11 2 2N2222

VSupply 5 0 12
Vin 14 0 GENERATOR

.model 1N4148 D (Is=5.84n...)*
.model 2N3904 NPN (Is=6.734f...)*
.model 2N2222 NPN (is=19f...)*
.model 2N2907 PNP (is=1.1P...)*

.end
โมเดลที่ดอกจัน (*) ไว้ หมายความว่าจะต้องไปโหลดมาจากเว็บของผู้ผลิตเอง ซึ่งจะมีพารามิเตอร์ให้ครบสำหรับ Spice ในกรณีของเราซึ่งใช้ gnucap นี้ เมื่อรันโปรแกรมซิมูเลชั่นแล้วจะเกิด Error ขึ้นเนื่องจาก gnucap ไม่รู้จักพารามิเตอร์บางตัว ให้ลบพารามิเตอร์ตัวนั้นทิ้งได้ (อย่างไรก็ตาม ไม่สามารถรับรองผลการทดลองได้)
เมื่อเตรียมแฟ้มเรียบร้อยแล้ว เราสามารถเลือกใช้ gnucap แบบบรรทัดคำสั่งก็ได้ หรือจะใช้ gspiceui เพื่อใช้ gnucap แบบ GUI ก็ได้ ในกรณีนี้เราเลือกใช้ gspiceui ซึ่งเรียกจากบรรทัดคำสั่งโดย
> gspiceui &
จะได้

หลักการของ gspiceui ก็คือเราจะต้อง "สร้าง" (Create) การซิมูเลชั่นขึ้นมาเสียก่อน แล้วจึงจะ "รัน" (Run) ซิมูเลชั่นนั้น ๆ ได้ การ "สร้าง" ซิมูลเลชั่นก็คือการตั้งค่าต่าง ๆ ของการซิมูเลชั่น นั่นเอง เช่นการกำหนดประเภทของการซิมูเลชั่น (.op .dc .ac) การกำหนดโหนด (Node) ที่ต้องการสังเกต การกำหนดประเภทของตัวแปรที่ต้องการสังเกต (แรงดัน กระแส กำลัง ค่าความต้านทาน) ส่วนการ "รัน" ซิมูเลชั่นก็คือการสั่งให้ gnucap ทำตามที่สั่ง

เมื่อทดลองใช้ดูพบว่าข้อความในแท็บ Netlist ไม่สามารถแก้ไขได้ ส่วนข้อความในแท็บ Simulation สามารถแก้ไขได้ นั่นหมายความว่าเราสามารถตกแต่งแก้ไขคำสั่งการซิมูเลชั่นที่ gspiceui ตั้งให้เราได้ ซึ่งมีจุดหนึ่งที่ต้องแก้ไขด้วยตนเองแน่ ๆ ก็คือ หากต้องการซิมูเลตแบบอื่น ๆ ที่ไม่ใช่ .op จะต้องสั่ง .op ก่อนเสมอ ไม่เช่นนั้นจะได้ผลเสมือนว่าวงจรไม่ได้รับไฟเลี้ยง

เมื่อทดลองซิมูเลตแบบ Transient (.tr) gspiceui จะอำนวยความสะดวกในการตั้งค่าต่าง ๆ ให้เรา ที่ได้ทดลองคือ
  • ตั้งค่า Vin เป็น 0.5 V ความถี่ 1 kHz (ลอง 1.0 V แล้ว สัญญาณเพี้ยน)
  • Start Time = 0 ms
  • Stop Time = 10 ms
  • Step Time = 10us 
ผลการทดลองเป็นดังนี้

หลังจากลองผิดลองถูกมานาน ผัดวันประกันพรุ่งมาหลายหน ก็ทำได้เสียที ขั้นตอนต่อไปก็จะลองใช้ KiCad ออกแบบแผ่นวงจรพิมพ์สำหรับวงจรนี้

วันพุธที่ 21 เมษายน พ.ศ. 2553

ตั้งค่าเครือข่ายไร้สาย

แต่ก่อนแต่ไรมา ไม่เคยสนใจจะใช้ระบบเครือข่ายไร้สายของมหาวิทยาลัยเลย สาเหตุเพราะว่าใช้ไม่เป็น :p และการตั้งค่าใน GUI มันใช้ไม่ได้ และเราไม่สามารถสืบทราบได้ว่าที่ใช้ไม่ได้ เพราะการตั้งค่าของเราไม่ถูกต้อง หรือว่าระบบเครือข่ายเองมีปัญหา

แต่เนื่องจากได้ร่วมกิจกรรม Thailand Mini DebCamp2010 และเขาทำให้เรามั่นใจว่าระบบเครือข่ายของเขาใช้ได้แน่นอน ก็เลยพยายามศึกษาและหาทางตั้งค่าระบบให้ใช้ได้ดูสักที

คราวนี้จะลองไม่ใช่ GUI ดู เพราะลองจากบรรทัดคำสั่งน่าจะเห็นผลลัพธ์และข้อผิดพลาดได้ดีกว่า คำสั่งที่ต้องใช้ก็คือ
  1. ifconfig
  2. iwlist
  3. iwconfig
  4. dhclient
เนื่องจากโน้ตบุ๊กของผมมี Ethernet Card อยู่ 2 ตัวคือ eth0 สำหรับแบบมีสาย และ eth1 สำหรับแบบไร้สาย ก็เลยอยากจะแน่ใจว่า Ethernet Card นั้นเปิดใช้งานอยู่ตัวเดียว จะได้ไม่งงเวลาเกิดข้อผิดพลาดขึ้น ก็ต้องปิด eht0 และเปิด eth1 โดย
> ifconfig eth0 down
> ifconfig eth1 up
จากนั้นก็ให้ระบบแสดงรายการของเครือข่ายที่เราจะใช้การได้โดย
> iwlist eth1 scanning
ระบบจะแสกนหาเครือข่ายไร้สายที่อยู่ในอาณาบริเวณที่ระบบจะรับสัญญาณได้ และแสดงรายละเอียดมาดังตัวอย่าง
eth1      Scan completed :
          Cell 01 - Address: xx:xx:xx:xx:xx:xx
                    ESSID:"YOURNETWORKNAME"
                    Protocol:IEEE 802.11bg
                    Mode:Master
                    Frequency:2.437 GHz (Channel 6)
                    Encryption key:on
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 6 Mb/s; 9 Mb/s
                              11 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
                              48 Mb/s; 54 Mb/s
                    Quality=93/100  Signal level=-35 dBm 
                    IE: WPA Version 1
                        Group Cipher : TKIP
                        Pairwise Ciphers (1) : TKIP
                        Authentication Suites (1) : PSK
                    Extra: Last beacon: 16ms ago

 สิ่งที่น่าสนใจในเวลานี้คือชื่อเครือข่ายของเรา ซึ่งจะอ่านจาก ESSID และเครือข่ายที่ว่านี้ต้องการรหัสผ่านหรือไม่ ซึ่งจะอ่านจาก Encryption key ถ้า on ก็แปลว่าเราต้องขอรหัสผ่านจากผู้ดูแลระบบ ถ้า off ก็แสดงว่าเปิดให้ใช้ฟรี (ที่ทำงานผมใช้แบบนี้) ข้อมูล 2 ประการนี้จะช่วยให้เราติดต่อกับเครือข่ายไร้สายได้ โดยใช้คำสั่ง iwconfig ดังนี้
สำหรับระบบที่ไม่ได้ตั้งรหัสผ่านไว้ ใช้คำสั่ง
> iwconfig eth1 essid YOURNETWORNAME key off

สำหรับระบบที่ตั้งรหัสผ่านไว้แบบตัวเลขฐานสิบหก ใช้คำสั่ง
> iwconfig eth1 essid YOURNETWORKNAME key xxxx-xxxx-xxxx-xxxx

สำหรับระบบที่ตั้งรหัสผ่านไว้แบบตัวอักษร (ระบบของทรูที่น้องชายใช้เป็นแบบนี้)  ใช้คำสั่ง
> iwconfig eth1 essid YOURNETWORKNAME key s:YOURPASSWORD
เราสามารถตรวจสอบได้ว่าระบบของเราเชื่อมต่อกับเน็ตเวิร์กสำเร็จหรือไม่โดยใช้คำสั่ง
> iwconfig eth1
หากเชื่อมต่อสำเร็จจะเห็นข้อมูลการเชื่อมต่อที่คอนโซล
eth1      IEEE 802.11g  ESSID:"YOURNETWORKNAME
          Mode:Managed  Frequency:2.437 GHz  Access Point: xx:xx:xx:xx:xx:xx  
          Bit Rate:54 Mb/s   Tx-Power=20 dBm   Sensitivity=8/0 
          Retry limit:7   RTS thr:off   Fragment thr:off
          Encryption key:xxxx-xxxx-xxxx-xxxx   Security mode:open
          Power Management:off
          Link Quality=95/100  Signal level=-32 dBm  Noise level=-91 dBm
          Rx invalid nwid:0  Rx invalid crypt:1  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:3

แต่หากเชื่อมต่อไม่สำเร็จ ตรงที่ระบบมาตรฐานการเชื่อมต่อ IEEE 802.11g จะระบุเป็น unassociate แทน

ในกรณีที่ผมเคยประสบมาด้วยตนเองทุกกรณี ระบบเครือข่ายไร้สายจะใช้ระบบ DHCP แจก IP ให้เรา เราสามารถร้องขอ IP จาก DHCP ได้โดย
> dhclient eth1
ระบบจะจัดการขอ IP และ DNS ให้เรา ถ้าไม่มีข้อผิดพลาดตอนนี้ก็ถือว่าเราเชื่อมต่อกับระบบเสร็จสิ้นแล้ว ในบางระบบ หากจะเชื่อมต่อกับอินเตอร์เนต ก็ต้องตั้งค่า Proxy ด้วย บางระบบระบุให้เชื่อมต่อโดยตรง ไม่ต้องผ่าน Proxy ก็มี ซึ่งจะแตกต่างกันไปตามแต่ผู้ดูแลระบบจะกำหนด

ในกรณีของผม DNS ที่กำหนดมาให้โดยเครือข่ายของทรูที่ระบบของผมรับได้จาก dhclient นั้น ไม่รู้จักเว็บไซต์บางเว็บเช่นเว็บของทรูเอง (ประหลาดดี) และผมไม่สามารถหาข้อมูลนี้ได้จากเว็บไซต์ของบริษัทได้ จึงต้องใช้บริการของ Google Public DNS ซึ่งก็สะดวกดี