ไพทอนบนเครื่องคิดเลข Casio fx-cg50 Prizm กลับมาวิ่งฉิวเป็นเทพแล้ว

สองปีที่แล้วพอดีผมถอยเครื่องคิดเลขคาสิโอ fx-cg50 Prizm เพราะว่าสนับสนุนภาษาไพทอน อยากลองเขียนไพทอนบนเครื่องคิดเลขดู แต่เนื่องจากไพทอนไม่สามารถเรียกใช้ฟังก์ชั่นในเครื่องคิดเลขต่างๆ เช่นฟังก์ชั่นวาดรูป ฟังก์ชั่นการพล็อทกราฟ คาสิโอเองก็รีบเอาไพทอนมาลงเครื่องคิดเลขเร็วเกินไป ผมเอามาทำที่ทับกระดาษเล่นๆ จนกระทั่งสองปีให้หลังจนบัดนี้ (10 กันยายน 2020) ทางคาสิโอเพิ่งอัพเดทโอเอสของเครื่องคิดเลขจากรุ่น 3.30 มาเป็น 3.40 และได้เพิ่มฟังก์ชั่นการวาดรูปให้กับเครื่องคิดเลขรุ่นนี้ มาลองดูว่าอัพเดทแล้วมีอะไรบ้าง

เพิ่มโมดูล casioplot

ในโมดูลนี้จะมีฟังก์ชั่นให้เรียกใช้อยู่ 4 ฟังก์ชั่น

  1. draw_string(,,) สำหรับเขียนตัวหนังสือเลือกสี ขนาด ตำแหน่งได้
  2. set_pixel(,) สำหรับเขียนจุดเลือกสี ขนาด ตำแหน่งได้ ถ้าวาดจุดต่อๆกันก็จะเป็นเส้นตรง เส้นโค้ง
  3. get_pixel(,) สำหรับอ่านว่าตำแหน่งนั้นมีจุดสีอะไร ขนาดเท่าไหร่
  4. show_screen() สำหรับแสดงผลบนหน้าจอ

แค่นี้ก็เกินพอแล้วครับ สำหรับเอาไปวาดรูป นอกจากนั้นทางคาสิโอ้ได้ให้ไลบรารีภาษาไพทอนมาสองไฟล์คือ matplotl.py และ turtle.py สามารถดาวน์โหลดได้จากลิ๊งค์ของคาสิโอฝรั่งเศส ตัว matplotl.py เป็นไลบรารีขนาดย่อของ matplotlib ส่วน turtle.py ใช้วาดภาพเคลื่อนไหวไปทีละส่วน สองไลบรารีนี้ก็เรียกใช้งานฟังก์ชั่น 4 ฟังก์ชั่นดังกล่าวข้างต้น

ทดสอบ matplotlib ฉบับย่อ

ผมจะลองพล็อทโค้งดิ่งของงานสำรวจ เป็นที่ทราบกันดีว่าเป็นโค้งพาราโบล่า โจทย์กำหนดให้ BVC 2+880 มีค่าระดับ 468.62 เมตร g1=-3.2% g2=1.8% PVI 3+030 การคำนวณตามไปดูในโค้ดได้ การเขียนโค้ดสามารถเขียนได้ในเครื่องคิดเลขแต่ช้ามาก ถ้าแก้ไขอะไรนิดๆหน่อยๆทำได้ ดังนั้นเขียนบนคอมพิวเตอร์จะสะดวกที่สุด

ผมตั้งชื่อไฟล์โปรแกรมว่า “vcurve.py” เวลาโอนไฟล์จากคอมพิวเตอร์ก็สะดวก สายที่ใช้เชื่อมเป็นสาย USB รุ่นหัวมินิเก่าหน่อย พอต่อแล้วกด F1 เพื่อเลือกโหมด USB จากนั้นก็จะเห็นเป็นไดรว์ สามารถก็อปปี้โปรแกรมไปมาได้

ไลบรารี matplotlib ฉบับย่อและโปรแกรมทดสอบ vcurve.py
from matplotl import *
#Vertical curve (parabola)
g1 = -3.2/100 #initial grade
g2 = 1.8/100  #final grade
BSta = 2880
PSta = 3030
L = 2*(PSta-BSta) #length of curve = 300m
A = g2-g1 
c1 = 468.62       #BVC elevation
c2 = c1 + g1*L/2  #PVI elevation
c3 = c2 + g2*L/2  #EVC elevation
c4 = c2 - g2*L/2  #origin of g2 grade line
a = A/(2*L)
b = g1

#Plot parabola curve
x = [i for i in range(L+1)]      # Array of x values
y = [a*(i**2)+b*i+c1 for i in x] # Array of corresponding y values
plot(x, y, "blue")

#Plot lowest point
xx = [-1*g1*(L/A)]
yy = [a*(i**2)+b*i+c1 for i in xx]
scatter(xx,yy)


#plot grade lines
x2 = [0, L/2]
y2 = [g1*i+c1 for i in x2]
x3 = [L/2, L]
y3 = [g2*i+c4 for i in x3]
plot(x2, y2, "red")      #grade line g1
plot(x3, y3, "magenta")  #grade line g2

#Draw texts
text(0,c1+0.25,"BVC")
text(L,c3+0.25,"EVC")
text(L/2,c2+0.25,"PVI")
text(L/4+10,(c1+c2)/2.0,"g1=-3.2%")
text(0.75*L,(c2+c3)/2.0,"g2=1.8%")
text(xx[0], yy[0], "x={:.1f} y={:.1f}".format(xx[0],yy[0]))

#Define axis axactly
axis([-10,L+50,c2-0.5,c1+0.5])
show()

#Print all 
print("Length of curve: {:.1f}m".format(L))
print("g1: {:.1f}%".format(g1*100))
print("g2: {:.1f}%".format(g2*100))
print("BVC elevation: {:3f}m".format(c1))
print("PVI elevation: {:.3f}m".format(c2))
print("EVC elevation: {:.3f}m".format(c3))
print("lowest point: x={:.3f} y={:.3f}".format(xx[0],yy[0]))
print("EVC station: {:.0d}".format(BSta+L))

รันโปรแกรมทดสอบโค้งดิ่ง

วาดกราฟพาราโบลาโดยไลบรารี matplotlib ฉบับย่อ
ภาพขยายโค้งดิ่ง

ทำการรันโปรแกรมบนเครื่องคิดเลข จะเห็นหน้าจอที่วาดโดยไลบรารี matplotlib ฉบับย่อ พอได้เลยครับ การพล็อทเส้นพาราโบลาก็ทำได้ง่าย เพียงแต่ต้องกำหนดสมการ x และ y ให้ แล้วผมก็ลากเส้นเกรดสองเส้น จากนั้นก็เขียนตัวอักษรเช่น BVC, PVI และ EVC และเน้นจุดที่เป็นจุดต่ำสุดให้

ถ้ากดปุ่ม “Exit” จะออกจากโปรแกรม โปรแกรมจะพิมพ์รายการที่คำนวณมาให้

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

ณ ตอนนี้ผมมองหาอีกรุ่นคือ fx-9750GIII ที่ราคาย่อมเยามากและมีภาษาไพทอนมาให้ด้วย ส่วนรุ่นเทพ fx-9860GIII บ้านเรา ณ ตอนนี้ยังไม่นำมาขายและมีภาษาไพทอนมาให้เช่นเดียวกัน โปรดติดตามกันตอนต่อไปครับ

Leave a Reply

Your email address will not be published.