วันศุกร์ที่ 20 พฤษภาคม พ.ศ. 2559

AVR C - เขียนโปรแกรมแสดงผลทาง LED 7 Segments

LED 7 Segments เป็นอุปกรณ์พื้นฐานอีกชิ้นหนึ่งที่คนเขียนโปรแกรมด้านไมโครคอนโทรลเลอร์ต้องเรียนรู้ เพราะเป็นพื้นฐานของการทำงานระดับบิตที่ชัดเจนตรงไปตรงมาที่สุด เพราะตัว LED มี 7 bit ในการแสดงผล เพื่อให้เป็นตัวเลข และสามารถใช้แสดงผลตัวอักษรได้ แต่ไม่ครบทุกตัว

LED แบบ 7 Segments สังเกตที่ตัวเลขจะมีขีด 7 ขีดเพื่อสร้างตัวเลข หรือตัวอักษร
จากรูปที่แสดงไว้ข้างบน มี 4 หลัก หรือ 4 Digits และระหว่างหลักจะมี จุด และ : รวมถึง จุดที่ใช้แสดงองศา 

AVR C: Bitwise กลับค่า I/O

ในบางครั้งเรามีความจำเป็นต้องกลับค่าใน PORT ใดๆ สักพอร์ตหนึ่ง เราสามารถทำได้หลายแบบ แม้กระทั่งการกลับโดยระบุ 0xFF และ 0x00 โดยตรงก็ได้ เช่น

PORTB = 0xFF; //กำหนดให้ PORTB มีค่าเป็น 1 ทั้งหมด
PORTB = 0x00; //กำหนดให้ PORTB มีค่าเป็น 0 ทั้งหมด

วิธีการนี้ก็ง่ายๆ ตรงไปตรงมาดี แต่บางครั้งการเขียนโปรแกรมเราไม่สนใจว่าขณะนั้น PORTx มีค่าเป็นอะไร แต่เราต้องการสลับค่าภายใน จึงเปลี่ยนไปใช้คำสั่งระดับบิตในการสลับจะง่ายกว่า เช่น

PORTB = ~PORTB

คำสั่งนี้จะสั่งให้โปรแกรมสลับค่าใน PORTB จากเดิมที่เป็นให้เป็นตรงกันข้าม ถ้าเดิมเป็น 1 ให้กลับเป็น 0 ถ้าเดิมเป็น 0 ก็ให้เป็น 1 ซึ่งวิธีนี้จะง่ายและเหมาะสำหรับการกลับค่าที่ไม่เหมือนกันทั้งหมด เช่น

...
PORTB = 0b10101010;
while(1){
  PORTB = ~PORTB;
}
...

คำสั่งสองสามบรรทัดข้างบนนี้จะทำให้ PORTB มีค่าระหว่าง 0b10101010 กับ 0b01010101 นั่นเอง
ตัวอย่างการสลับค่า I/O


วันพฤหัสบดีที่ 19 พฤษภาคม พ.ศ. 2559

จะดูขา LED อย่างไร

นักอิเลกโทรนิกส์ทั้งหลายคงจะเข้าใจวิธีวัดค่าของไดโอดเปล่งแสง หรือ LED เป็นอย่างดี แต่สำหรับมือใหม่ ย่อมต้องเรียนรู้ หาประสบการณ์ต่อไปเรื่อยๆ จนกว่าจะชำนาญ บทความนี้จะมาแนะนำวิธีการหาขา A และ K ของ LED

Anode เป็นขาที่เชื่อมต่อกับไฟบวก และขา Cathode หรือขา K เป็นขาที่เชื่อมต่อกับไฟลบ

ภาพแสดงขา LED จะสังเกตเห็นว่าขายาว่จะรับไฟ + ขาสั้น จะรับไฟ -

AVR C การทำงานระดับบิต

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

วิธีการเรียนรู้ที่เข้าใจง่าย คือ การลงมือสร้างตัวอย่างขึ้นเพื่อให้เกิดความเข้าใจอย่างถ่องแท้

การเรียนรู้ที่ง่ายที่สุดก็เริ่มจาก LED โดยจะต่อ LED 8 ดวง เข้ากับขา I/O ให้ครบ 8bit คือ ต่อตั้งแต่ PINx0 - PINx7 ในบทความนี้ใช้ LED แบบแพ็ก 10 แต่ใช้เพียง 8 ดวงเท่านั้น และอย่าลืมต่อ R ค่า 220 หรือ 330 โอห์มพ่วงไว้สักนิดจะได้ช่วยปกป้องทั้ง IC และ LED

อุปกรณ์เรียนรู้การทำงานระดับบิต

ATmega16+LCD เริ่มเขียนโปรแกรมติดต่อ LCD

หลังจากที่ทดสอบบอร์ด ATmega16 ได้แล้ว ก็เริ่มศึกษาการใช้งาน เริ่มต้นก็ทำให้ LED กระพริบ และรับค่าทาง input ที่เป็นสวิทช์กดติดปล่อยดับได้แล้ว แต่ก็ยังไม่ค่อยเข้าใจหลักการที่แท้จริง เลยลองต่อ LCD เพื่อแสดงผล โดยปกติในเว็บต่างๆ มักเป็นตัวอย่างการเชื่อมต่อ และเขียนโปรแกรมโดยใช้ lcd.h

แต่ก็ยังไม่เป็นที่พอใจเพราะตัวอย่างยังไม่ทราบหลักการพื้นฐานการติดต่อ และการส่งคำสั่งไปยังอุปกรณ์ (LCD) ดังนั้นจึงค้นหาไปเรื่อยๆ เพื่อหาตัวอย่างง่ายๆ สั้นๆ แต่ครอบคลุมพื้นฐานโดยไม่ต้องใช้ไลบรารีภายนอก

ATmega16+LCD

มีตัวอย่างอยู่ในเว็บแห่ง electronics hub มีตัวอย่างการใช้งาน 16x2 LCD กับ ATmega16 อยู่ด้วย แต่วงจรที่ให้มากับโปรแกรมไม่ตรงกันจึงต้องแก้ไขนิดหน่อย

สำหรับเว็บเรียนรู้เกี่ยวกับเขียนโปรแกรมติดต่อกับ LCD ผ่าน Arduino IDE ก็ลองอ่านจากเว็บของ thaieasyelec นะครับ

และเว็บ www.kanda.com จะมีเรื่อง AVR keypad LCD in WinAVR C จะมีตัวอย่างคำสั่งให้ศึกษาอีกเว็บหนึ่ง

วันอังคารที่ 17 พฤษภาคม พ.ศ. 2559

เพิ่ม ATmega16 เข้าไปใน boards.txt

การเริ่มเรียนรู้ วิธีการเขียนโปรแกรมด้วย AVR Studio 7 บางครั้งก็สับสนไม่แน่ใจว่าโปรแกรมผิดหรือว่าอุปกรณ์ใช้ไม่ได้ ดังนั้นควรมีหลักในการยึดเพื่อเปรียบเทียบบ้างก็จะดี ทำให้หาสาเหตุได้ง่าย โดยผู้เขียนมักจะใช้ Arduino IDE เป็นหลักในการยัด โดยจะทดสอบกับ Arduino IDE แล้วสามารถใช้งานได้ ก็ถือว่าบอร์ดนั้นใช้ได้ จะได้หาสาเหตุที่โปรแกรมต่อไป

โดยปกติแล้ว ATmega16 ไม่ได้อยู่ในรายการบอร์ดของ Arduino IDE เพราะเท่าที่เห็นแล้วบอร์ด Arduino ไม่ได้ใช้ Chip 40 ขา ซึ่งจะมี I/O มากกว่า โดยมี Port A, B, C และ D สามารถเลือกใช้งานขา I/O ได้ถึง 32 ขา ดังนั้นหากต้องการควบคุมอุปกรณ์เป็นจำนวนมากแล้วย่อมต้องเลือก ATmega16 แต่ถ้าอุปกรณ์เพียงไม่กี่ชิ้นก็ไม่เหมาะเพราะไอซี 40 ขาตัวนี้ค่อนข้างใหญ่เทอะทะพอสมควร

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

ATmega16 ที่เพิ่มเข้าไปใน Arduino IDE จะแยกเป็นฮาร์ดแวร์อีกกลุ่มหนึ่ง

วันอังคารที่ 10 พฤษภาคม พ.ศ. 2559

AVR Loader วิธีง่ายๆ เพื่อใช้สัญญานนาฬิกาภายในไอซี

หลังจากที่พยายามให้ไอซี Atmega8 และ 16 ใช้ Internal Clock เพื่อลดการใช้ X-TAL โดยเบิร์น Bootloader เข้าไปก็ไม่ได้ผลเท่าที่ควร เพราะยุ่งยาก แต่ก็มีวิธีง่ายๆ สำหรับการกำหนดค่า โดยใช้โปรแกรม AVR Loader

การกำหนดค่า FUse จะเป็นการบอกว่าจะใช้สัญญานนาฬิกาจากไหน โดยโปรแกรม AVR Loader สามารถดาวน์โหลดได้จากอินเตอร์เน็ต

โปรแกรม AVR Loader สำหรับแก้ไข อัพโหลดไฟล์ .hex สำหรับ ATmega

วันจันทร์ที่ 9 พฤษภาคม พ.ศ. 2559

ATMega8 No X-TAL, ใช้งาน ATMega8 โดยไม่มีคริสตอล

X-TAL หรือ คริสตอลเป็นตัวกำเนิดสัญญานนาฬิกา หรือสร้างความถี่เพื่อให้ไอซีทำงานได้ถูกต้อง ดังนั้นบอร์ด Arduino จึงมีคริสตอลตามความถี่ของ cpu เช่น 8, 12 และ 16MHz และ ATMega8 มีรุ่นที่ใช้ความถี่ 8 และ 16MHz โดยดูจากรุ่น โดยรุ่นที่ระบุ -8PU หมายถึง 8MHz ถ้า -16PU หมายถึง 16MHz

เลือกบอร์ด ATmega8 แบบ ไม่ใช้คริสตัล

ตามปกติแล้วทุกครั้งที่ใช้ไอซี ATMega จะต้องมีคริสตัลต่อที่ขา XTAL1 และ XTAL2 ด้วย แต่อย่างไรก็ตาม ในทางปฏิบัติระบบเล็กๆ ไม่จำเป็นต้องใช้ก็ได้ เพราะภายใน Chip มีตัวกำเนิดสัญญานนาฬิกาอยู่แล้ว เรียกว่า Internal Clock ซึ่งเราสามารถใช้ได้แต่ต้องกำหนดบูตโหลดเดอร์ใหม่ เพื่อให้เรียกใช้สัญญานนาฬิกาภายใน Chip แทน

หมายเหตุ: หากต้องการกำหนดใช้หรือไม่ใช้ XTAL ให้ใช้โปรแกรม AVR Loader จะง่ายกว่า อ่านได้จากบทความเรื่อง AVR Loader

ใช้มาโครใน Arduino IDE

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

ในบทความนี้จึงยกตัวอย่างการใช้ มาโคร ในส่วนการกำหนด #define ทำให้โปรแกรมดูสวยงาม และอ่านแล้วสื่อความหมายมากกว่าปกติ (แต่บางคนอาจจะงงได้ หากไม่เข้าใจหลักการ)

ตัวอย่างการเขียนมาโครในภาษา C

วันอาทิตย์ที่ 8 พฤษภาคม พ.ศ. 2559

Atmel Studio 7: กว่าจะอัพโหลดได้

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

ชุดเบิร์นโปรแกรม Atmega8/168/328 ผ่าน USBasp และสามารถต่ออุปกรณ์ได้เหมือนบอร์ด Arduino

แต่สำหรับผู้เขียนมีความรู้สึกว่า การเขียนโปรแกรมด้วย Arduino IDE เหมือนการเขียนโปรแกรมด้วย Visual Studio ของไมโครซอฟท์ที่ไม่ต้องคิดอะไรมาก อยากเขียนอะไรก็โหลดๆ ไลบรารี่ที่มีคนใจดีเขียนแจกไว้เยอะแยะไปหมด

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

เหตุผลการสำคัญ คือ การเขียนโปรแกรมด้วยภาษาซีสำหรับ AVR นั้นทำให้เราได้เรียนรู้เกี่ยวกับคอนโทรลเลอร์ได้ลึกขึ้น เพราะต้องเข้าไปจัดการส่วนต่างๆ ด้วยตนเอง

ทั้งหมดนี้ก็เพื่อที่จะพัฒนาและหวังลึกๆ อยากเขียนไลบรารีแจกบ้างเหมือนกัน :-)

วันเสาร์ที่ 7 พฤษภาคม พ.ศ. 2559

ติดตั้ง USBasp บนวินโดว์ 10 (ที่บ้าน)

เมื่อวานเขียนวิธีการติดตั้งไดร์เวอร์ USBasp โดยเป็นเครื่องโน้ตบุ้คที่ทำงาน มีชื่อผู้ผลิตให้เลือกเป็น VOTI แต่วันนี้หยุดอยู่บ้านลองมาทำตามบทความที่เขียนไว้กับเครื่องที่บ้าน

เศร้าจัง! หาชื่อผู้ผลิต VOTI ไม่เจอ หาอย่างไร อ่านจากเน็ต โหลดไดร์เวอร์ โหลด inf_wizard มาติดตั้งแล้วก็ยังใช้ไม่ได้

สุดท้ายก็มั่วอีกตามเคย... เลือกอะไรก็ได้ดูสิว่าจะใช้ได้ไหม...

คำตอบ คือ ใช้ได้ อัพโหลดโปรแกรมผ่าน Arduino IDE ได้สบายๆ

USBasp ที่ซื้อมาจากเว็บออนไลน์ ราคาไม่ถึงร้อย


ติดตั้ง USBasp บนวินโดว์ 10

ปัญหาชวนปวดหัวสำหรับคนใช้วินโด์ 10 หรือระบบปฏิบัติการใหม่ๆ แต่ไดร์เวอร์ยังไม่รองรับ ก็ต้องหาทางแก้ไขกันต่อไป

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

จนถอดใจกะว่าจะใช้บน Linux หรือ Mac เลยลองต่อกับ Raspberry Pi ซึ่งมองเห็นรายละเอียดอุปกรณ์ ทั้งชื่อผู้ผลิต รุ่น และหมายเลขผู้ผลิต 

ระหว่างนั้นก็กลับไปเล่นที่ฝั่งวินโดว์บ้าง ลองเข้าไปดูรายละเอียดไดร์เวอร์เรื่อยๆ ก็เจอชื่อผู้ผลิตอยู่ด้วย เลยลองเลือกดู

บิงโก! ระบบมองเห็นแล้ว

วันศุกร์ที่ 6 พฤษภาคม พ.ศ. 2559

ติดตั้งคีย์บอร์ดภาษาไทยและกำหนดให้สลับคีย์บอร์ด thai-english, Raspberry Pi และ Orange Pi

หลังจากติดตั้ง Raspberry Pi ให้สามารถใช้งานโปรแกรมต่างๆ ได้แล้ว ก็ถึงคิวติดตั้งคีย์บอร์ด ไทย-อังกฤษ เบื้องต้นให้เข้าไปติดตั้งที่ raspi-config ด้วยคำสั่ง

sudo raspi-config

จากนั้นให้เลือกคีย์บอร์ดเป็น en-us และ th-th ให้เลือกทั้ง TIS และ UTF (จริงๆ จะเลือกเฉพาะ UTF ก็ได้)

เมื่อเลือกแล้วระบบยังไม่สามารถสลับคีย์บอร์ด ไทย-อังกฤษ ได้ง่ายนัก จึงต้องเข้าไปกำหนดคำสั่งที่ Terminal ก่อนดังนี้

echo "setxkbmap -option grp:switch,grp:alt_shift_toggle,grp_led:scroll us,th" > ~/.xsessionrc
เมื่อกดปุ่ม Enter แล้วระบบจะสร้างไฟล์ชื่อ .xsessionrc ไว้ใน Home Directory ของ pi แต่เวลาเข้าไปดูจะมองไม่เห็นเพราะจะถูกซ่อนไฟล์ไว้ ต้องใช้คำสั่ง ls -a ถึงจะมองเห็น

จากนั้นให้รีบูตเครื่องก่อน ก็จะสามารถสลับคีย์บอร์ดได้โดยกดปุ่ม Alt+Shift

สำหรับ Orange Pi นั้นถ้าเป็น Debian ให้กำหนด dpkg-reconfigure locales แล้วเลือกเพิ่ม th.TH-UTF8  แค่นี้ก็ใช้ได้แล้ว




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

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