วันศุกร์ที่ 24 กุมภาพันธ์ พ.ศ. 2555

การเขียนลายวงจร (Schematic) สำหรับเอกสาร LaTeX


ในเอกสารประกอบการสอนของผม จำเป็นต้องใช้ลายวงจร (Schematic) อยู่บ่อย ๆ ทั้งในวิชาวงจรไฟฟ้า (Electric Circuits) และวิชาวิศวกรรมอิเล็กทรอนิกส์ (Engineering Electronics) แต่เดิมจะใช้ xfig วาดรูปวงจรและเก็บแฟ้มเอกสารเป็น EPS

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

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


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

\begin{circuitikz}
\draw
(0,0) node[op amp,yscale=-1] (opamp) {}
(opamp.+) node {} -- (-3,0.5)
(-3,-1) node[ground] {} to[american voltage source,l=$V_{i}$] (-3,0.5)
(opamp.out) node {} to[short,-o] (2,0) node[anchor=west] {$V_{o}$}
(1.5,0) to[R,l=$R_2$,*-*] (1.5,-2)
to[R,l=$R_{1}$,*-] (1.5,-4) node[ground] {}
(1.5,-2) node[] {} -| (opamp.-) node {}
;
\end{circuitikz}

สคริปต์ของ circuitikz จะอยู่ใน Environment ชื่อ circuitikz คืออยู่ระหว่าง \begin{circuitikz}และ \end{circuitikz} สำหรับสคริปต์ในตัวอย่างนี้มีคำสั่งเดียวคือ \draw ซึ่งอยู่ที่บรรทัดที่สอง (บรรทัดแรกคือ Environment)

บรรทัดที่ 3 (0,0) node[op amp, yscale=-1] (opamp) {} คือการวางสัญลักษณ์ออปแอมป์ (Op-Amp) ลงที่ตำแหน่ง (0,0) พลิกสัญลักษณ์ในแกน y (yscale=-1) ตั้งชื่อมันว่า opamp แต่ไม่ต้องแสดงข้อความอะไรบนสัญลักษณ์

บรรทัดที่ 4 (opamp.+) node {} -- (-3,0.5) เป็นการอ้างถึงโหนด (+) ของออปแอมป์ และลากเส้นตรงไปที่ตำแหน่ง (-3,0.5)

บรรทัดที่ 5 (-3,-1) node[ground] {} to[american voltage source,l=$V_{i}$] (-3,0.5) เป็นการสั่งให้วาดโหนดกราวด์ลงไปที่ตำแหน่ง (-3,-1) แต่ไม่ต้องแสดงข้อความอะไรลงที่โหนดนี้ และจากโหนดกราวด์นี้จะเชื่อมกับตำแหน่ง (-3,0.5) ผ่านแหล่งจ่ายแรงดันที่มีฉลาก (Label) เป็น $V_{i}$

บรรทัดที่ 6 (opamp.out) node {} to[short,-o] (2,0) node[anchor=west] {$V_{o}$} จากโหนดเอาต์พุตของออปแอมป์ ให้ลากเส้นตรง ปลายทางเป็นจุดดำโปร่ง [Short,-o] ไปถึงจุด (2,0) แสดงข้อความประจำโหนดเป็น $V_{o}$ โดยให้โหนด (2,0) อยู่ทางซ้ายของข้อความ [anchor=west]

บรรทัดที่ 7 (1.5,0) to[R,l=$R_2$,*-*] (1.5,-2) เชื่อมตำแหน่ง (1.5,0) กับ (1.5,-2) ด้วยตัวต้านทานที่มีฉลากเป็น $R_2$ และให้ปลายทั้งสองข้างของตัวต้านทานเป็นโหนดทึบ

บรรทัดที่ 8 to[R,l=$R_1$,*-] (1.5,-4) node[ground] {} ให้เชื่อมตำแหน่งล่าสุดจากบรรทัดก่อนหน้าซึ่งก็คือ (1.5,-2) กับตำแหน่ง (1.5,-4) ด้วยตัวต้านทานที่มีฉลากเป็น $R_1$ กำหนดให้ตำแหน่งต้นทางเป็นโหนดทึบ ส่วนตำแหน่งปลายทางเป็นสัญลักษณ์กราวด์

บรรทัดที่ 9 (1.5,-2) node[] {} -| (opamp.-) node {} ให้ลากเส้นจากตำแหน่ง (1.5,-2) ไปที่โหนด (-) ของออปแอมป์ โดยใช้เส้นฉาก

สำหรับบรรทัดสุดท้ายคือเครื่องหมายเซมิโคลอนเป็นการสิ้นสุดคำสั่ง \draw

หลายคนอาจจะสงสัยว่าจะวาดลายวงจรเพียงเท่านี้จะต้องเขียนสคริปต์ขนาดนี้มันจะไม่มากไปหน่อยหรือ จากประสบการณ์ของผมเองผมพบว่าหากเป็นวงจรไม่ใหญ่มาก การเปิดโปรแกรมวาดลายวงจรเช่น xfig ดูจะเป็นภาระมากไปหน่อย หากใช้ circuitikz จนคุ้นเคยแล้ว การเขียนสคริปต์สัก 20 -- 30 บรรทัดถือว่าเป็น Inline Coding ที่สะดวกทีเดียว