วันอังคารที่ 14 กรกฎาคม พ.ศ. 2558

ทำไม Serial.print() ไม่ทำงานในส่วนของ setup()

หลายวันมานี้ทดลองเขียนโปรแกรม เขียนคำสั่งอยู่แต่ Arduino UNO R3 จนแทบจะลืม Leonardo และคราวนี้ลองหยิบจับมาทดสอบเขียนโปรแกรมดูบ้าง งานแรกก็เจอปัญหาเสียแล้ว

คำสั่ง Serial.print() ในส่วนของ setup() ไม่ทำงาน แต่ในส่วนของ loop() กลับทำงานได้ปกติ ก็งงอยู่พักใหญ่ไปค้นหาในอินเตอร์เน็ตก็มีคนเป็นเหมือนกัน แล้วได้คำตอบว่า

Leonardo เป็นบอร์ดที่ใช้ Chip Atmega32U4 ไม่เหมือน UNO R3 ดังนั้นจึงต้องสั่งให้โปรแกรมรอให้ Serial พร้อมทำงานก่อน
ลองดูตัวอย่างแรกก่อน
โปรแกรมในส่วนของ setup() จะมีคำสั่งพิมพ์เลข 10 ถอยหลังไปจนถึง 1 แล้วพิมพ์คำว่า Begin ระหว่างคำสั่งจะรอ 1 วินาที แต่เมื่อรันคำสั่งแล้วพบว่า กว่าจะเปิด Serial Monitor ได้โปรแกรมก็รันไปถึงการสั่งพิมพ์ เลข 6 แล้ว ดูเหมือนระบบจะทำงานเร็วขึ้น (?)

เริ่มพิมพ์ที่เลข 6


ตัวอย่างที่สอง
หลังจากนั้นเพิ่มคำสั่ง while (!Serial){} ไว้หลังบรรทัด Serial.begin(9600); แล้วเมื่อเปิด Serial Monitor โปรแกรมจะทำงานปกติ เริ่มตั้งแต่คำสั่งพิมพ์เลข 10 ไปเรื่อยๆ

เริ่มพิมพ์ที่ 10 เพราะมีคำสั่งตรวจสอบให้รอจนกว่า Serial จะพร้อมทำงาน

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

วันเสาร์ที่ 11 กรกฎาคม พ.ศ. 2558

เสี่ยงซื้อ GPS และ GSM/GPRS/3G Module

หลังจากที่เสี่ยงซื้อ GPS Shield ของ Sparkfun พร้อมกับ GPS Module รุ่น EM-506 มาใช้งาน ยอมรับว่าตอนนั้นอยากใช้หลายๆ ยี่ห้อ แต่ก็คิดถึงอรรถประโยชน์ ความสะดวก ความเรียบง่าย โดยเฉพาะความลงตัวไม่ใช้พื้นที่หรือวางและโยงสายขวักไขว่

อันดับแรกซื้อ GPS EM-506 แต่ Shield ใช้กับรุ่น 501 ซึ่งเป็นแบบ Chip แต่ก็มีพอร์ตสำหรับต่อกับ EM-406 (พิมพ์ติดไว้กับแผ่นวงจรพิมพ์ ก็คาดว่ารุ่นใหม่ก็ยังใช้ได้)

ระหว่างที่ซื้อก็ลังเลกับ GPS ของ Grove ที่มีขนาดเล็กกว่า และมีช่องเสียบสายอากาศที่เป็นแบบ Active ใช้ไฟเลี้ยง 3 V ด้วย แต่ก็เลือกซื้อ EM-506 ที่แพงกว่า ประมาณ 500 บาท เพราะต้องการใช้ Shield ของ Sparkfun ด้วย

จากนั้นก็ซื้อ Module SD Card เพื่อเอามาบันทึกตำแหน่ง และเก็บข้อมูลอ้างอิง ก็เลือกของ SEEED STUDIO ซึ่งดูแล้วมีความสวยงามลงตัว แต่ก็ลังเลกลัวไม่คุ้ม เพราะถ้าเป็น Shield ของ ADA Fruit จะมี RTC ติดมาด้วย ทำให้ไม่ต้องเพิ่มโมดูลนาฬิกา และที่สำคัญ SD ของ ADA Fruit มีขา CD ให้ใช้งาน เพื่อตรวจสอบเวลาถอด SD Card ออกก็ให้แจ้งสถานะทางหน้าจอได้ทันที (สรุปแล้ว SD Card ของ Seeed Studio ไม่คุ้มที่จะนำมาใช้งาน)
Shield GPS ของ Spark fun สำหรับใส่ EM-501
ซ้ายมือสุด SD Card ของ Seeed Studio ซึ่งถือว่าไม่คุ้ม แพงกว่าตัวอื่น และไม่มี RTC และไม่มีขา CD

หลังจากที่ได้อุปกรณ์ก็มาเขียนโปรแกรม และจัดการแสดงผลโดยเลือกเอาจอ OLED ขนาด 128x64 ของ
จอ OLED 128x64 คล้ายๆ ของ ADA Fruit แต่จา VCC และ GND จะสลับกัน
ปัญหาในการทำโปรเจกต์นี้อยู่ที่ การใช้ Global Variable ซึ่งปกติจะใช้หน่วยความจำ SRAM เป็นหลัก และหากใช้เกิน 75% จะเกิด Crash สิ่งที่ตามมาก็คือ การทำงานเพี้ยน รวนเรไปหมด เช่น จอแสดงผลแสดงอักษรประหลาดๆ แสดงครบบ้าง ไม่ครบบ้าง

สุดท้ายได้ไลบรารีมาจากผู้ขาย (ขอบคุณ Thaieasyelec.com ไว้ ณ ที่นี้) การใช้ Global Varible ลดจาก 80% มาอยู่ที่ 4-50% ทำให้ระบบไม่รวนสักนิด

ปัญหาหลักประการหนึ่ง คือ SD Card ของ Seeed Studio ไม่มี RTC จึงแสดงเวลา วันที่ จาก GPS โดยตรง ซึ่งค่อนข้างแม่นยำ ถ้าตราบใดที่ยังมีสัญญาน GPS ตามปกติ และบ่อยครั้งที่ต้องอยู่ใต้อาคารที่จอดรถหลายๆ ชั้น ทำให้นาฬิกาและวันที่เพี้ยนไปทันทีทันใด

สรุปชุด GPS ตัวนี้ทำต้นแบบเสร็จแล้ว รวมราคาประมาณ 1750+490+490+590 บาท (GPS+Sheild+SD Card Shield+UNO R3)

จากนั้นก็คิดถึงเรื่องการนำเอาข้อมูลไปเก็บไว้ส่วนกลาง หรือที่ไหนสักแห่งก็คิดถึงโมดูล 3G แต่ดูราคาของชุดทดลองที่ดีๆ แล้วราคาตก 5-6 พันบาท ตอนแรกจะสั่งบอร์ดจีนราคาพันกว่าบาท (หลักร้อยก็ยังมี) แต่ดูแล้วคงต้องใช้เวลานาน จึงตัดสินใจไปที่ Thaieasyelec อีกตามเคย ครานี้ได้บอร์ด GPS/GPRS/3G ที่วีนัสซัพพลายหรือ Thaieasyelec ผลิตขึ้นมาเอง ราคาตกอยู่ 2,650.-

ก็เสี่ยงซื้อมา และที่หนักใจคือ มีแต่คู่มือการต่อขาต่างๆ พร้อมกับคำสั่ง AT Command พอประมาณ แต่ไม่มีไลบรารี่และตัวอย่างสำหรับ Arduino เลย ก็ถามคนขายหลายครั้งว่า เขียนใน Arduino ได้แน่นอนนะ และสอบถามวิธีการคร่าวๆ ไว้ พร้อมออกตัวก่อนว่า หากติดขัดอะไรจะรบกวนสอบถาม และอาจจะถามเยอะหน่อยนะ

หนึ่งคืนผ่านไปหลังจากขลุกอยู่กับบอร์ดทดลองตัวนี้ ย่างเข้าคืนที่สองก็เจอปัญหาจนเกือบจะท้อ พยายามหาข้อมูลก็มีอยู่น้อยนิด ประติดประต่อ ในที่สุดก็สั่งโทรออกจากบอร์ด Arduino UNO R3 และ Leonardo ได้เสียที

บอร์ด GSM/3G ของ Thaieasyelec ทดลองกับบอร์ด Arduino Leonardo
 สิ่งที่พบและแก้ไขปัญหา พร้อมเก็บข้อมูลเป็นความรู้ใหม่ คือ

1. ต่อบอร์ดไม่ได้ไม่ว่าจะเป็นอัตราเร็วใดๆ ก็ตาม ทั้งๆ ที่ต่อด้วย Putty ได้, ต่อได้ที่ความเร็ว 115200
ปัญหานี้ไปค้นพบว่าบอร์ด Arduino จะมีเพียงบางขาเท่านั้นที่สามารถใช้งานเป็น Tx และ Rx ได้ ของบอร์ด Leonardo จะใช้ได้คือ ขา 7 (เป็น Rx เท่านั้น) ขา 8, 9, 10 และ 11 นอกจากนี้ใช้ไม่ได้ (หลายๆ ตัวอย่างใช้ขา 2, 3)

2. หลังจากต่อได้แล้วก็เจอปัญหาใหม่ คือ ส่งข้อมูลไปที่บอร์ด GSM แต่มักจะได้ข้อมูลขยะ และข้อความเพี้ยนๆ กลับมา

ข้อความที่ได้รับจากบอร์ด GSM มักจะไม่สมบูรณ์
ปัญหานี้แก้ไขได้ด้วยการกำหนดให้ใช้ Buadrate ให้ต่ำลง เพราะเครื่องนี้กำหนดค่าสูงสุดไว้ (115200) เมื่อลดความเร็วลงมาที่ 57600 ก็แสดงผลได้ตามปกติ

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

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

ชุดที่สองนี้ราคา บอร์ด UC15 ราคา 2,650 บาท

และคงต้องลดขนาด เพิ่มประสิทธิภาพอื่นๆ ลงไปอีก จริงๆ แล้วก็เจอปัญหาอื่นๆ อีก แต่จะกลับมาอัพเดทเพิ่มเติมภายหลังครับ


ต้นแบบ GPS พิกัดนี้กำลังจอดรอแม่บ้านซื้อกับข้าวที่ตลาด กม. 11 พิกัดตรงพอดี

ภาพแสต็กของ Arduino UNO R3+SD Card+GPS Shield และจอ OLED

Chip UC15 ของ Quectel 3G ดาวน์โหลด 3.6MBps แต่อัพโหลดได้แค่ 384kBps 

Gtk4 ตอนที่ 6 Defining a Child object

Defining a Child object A Very Simple Editor ในบทความที่ผ่านมาเราสร้างโปรแกรมอ่านไฟล์ชนิดข้อความ และในบทความนี้ก็จะมาปรับแต่งโปรแกรมกันสักหน...