วันพุธที่ 15 สิงหาคม พ.ศ. 2555

หุ่นยนต์คืออะไร ?!?!

ลองตอบคำถามดังต่อไปนี้(ในใจ) ด้วยความคิดของเรา ก่อนอ่านเฉลยในบรรทัดถัดๆไปนะครับ
- "หุ่นยนต์" คืออะไร ?
- "หุ่นยนต์" มีกี่ประเภท? อะไรบ้าง?
- "หุ่นยนต์" ประกอบอะไรไปด้วยอะไรบ้าง?

- แล้วทั้งหมดนี้หล่ะ มีหุ่นยนต์กี่ตัว? ตัวไหนเป็นหุ่นยนต์บ้าง? ตัวไหนไม่เป็นบ้าง?


จำคำตอบไว้ก่อนนะครับ....แล้วค่อยๆมาดูเฉลยกัน


หุ่นยนต์คืออะไร? 

  • เครื่องจักรกลหรือหุ่นที่มีเครื่องกลไกอยู่ภายใน
  • สามารถทำงานได้หลายอย่างร่วมกันกับมนุษย์หรือแทนมนุษย์
  • สามารถตั้งลำดับแผนการทำงานก่อนหลังได้
    [1]

ประเภทของหุ่นยนต์?


แบ่งถามลักษระการใช้งานได้ 2 ประเภท คือ [2]
  1. หุ่นยนต์ชนิดที่ติดตั้งอยู่กับที่ (Fixed Robot)
  2. หุ่นยนต์ชนิดที่เคลื่อนที่ได้ (Mobile Robot)

หุ่นยนต์ประกอบไปด้วยอะไรบ้าง?

หุ่นยนต์แบ่งไปด้วยส่วนประกอบใหญ่ๆ 4 ส่วนได้แก่[3]
  1. อุปกรณ์ทางกล แมคคานิก (Mechanic)
  2. อุปกรณ์ขับเร้า แอคชูเอเตอร์ (Actuator)
  3. อุปกรณ์ไฟ้ฟ้า อิเลคทรอนิกส์ (Electronic)
  4. อุปกรณ์ควบคุม คอนโทรลเลอร์ (Controller)
โดยเรามาดูรายละเอียดแต่ละอันกันนะครับ
  1. อุปกรณ์ทางกล แมคคานิก (Mechanic)
    • โครงสร้าง (Frame)
    • เฟือง (Gear)
    • สายพาน (Belt)
    • โซ่ (Chain)
  2. อุปกรณ์ขับเร้า แอคชูเอเตอร์ (Actuator)
    • มอเตอร์ไฟฟ้า (Electric Motor)
    • สเตปเปอร์มอเตอร์ (Stepper Motor)
    • เซอร์โวมอเตอร์ (Servo Motor)
    • ระบบนิวแมติกส์ (Pneumtic)
    • ระบบไฮโดรลิกส์
  3. อุปกรณ์ไฟฟ้า อิเล็กทรอนิกส์ (Electronics)
    • อุปกรณ์ตรวจรู้ เซ็นเซอร์ (Sensor)
    • เอนโคดเดอร์ (Encode)
    • อุปกรณ์แสดงผล (Output device)
    • ชุดขับมอเตรอ์ 
  4. อุปกรณ์ควบคุม คอนโทรลเลอร์ (Controller)
    • สมองกลที่ประดิษฐ์จากอุปกรณ์อิเล็กทรอนิกส์
    • เครื่องควบคุมขนาดเล็ก ไมโครคอนโทรลเลอร์ (Microcontroller) 
    • คอมพิวเตอร์ชนิดแผงวงจรสำเร็จรูป
    • เครื่องควบคุมเชิงตรรกะที่สามารถโปรแกรมได้
    • คอมพิวเตอร์ส่วนบุคคล


อ้างอิงจาก
[1] http://www.trs.or.th/index.php/article/robot-story/41-meaning
[2] http://th.wikipedia.org/wiki/หุ่นยนต์
[3] http://www.trs.or.th/index.php/article/robot-story/43-component

วันพฤหัสบดีที่ 15 มีนาคม พ.ศ. 2555

EzyBot on Tour ตอน ตะลุยโรงละครหุ่นยนต์ (แสดงกับคน)



EzyBot on Tour ตอน ตะลุยโรงละครหุ่นยนต์ (แสดงกับคน)

(สูจิบัตรและบัตรเข้าชม)

วันนี้ผมและผองเพื่อนได้ไปดูละครที่ คณะอักษร จุฬา เป็นครั้งแรกครับ !!!
แน่นอนว่าต้องไม่ใช่ละครธรรมดาๆอย่างแน่นอน
เพราะว่าเราคือ EzyBot เราคือพวกหลงไหลในหุ่นยนต์ กลไก
ก็ละครนี้เป็นละครที่ หุ่นยนต์ แสดงร่วมกับคนจริงๆครับ !!
แค่ฟังชื่อก็อลังการงานสร้างแล้ว ครับ ชื่อเรื่องว่า SA-YO-NA-RA
(ภาษญี่ปุ่นนะครับ ส่วนภาษาไทยแปลว่าลาก่อน)

(รูปประชาสัมพันธ์)

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

(โปสเตอร์หน้างาน)


ความรู้สึกก่อนชมส่วนตัวผมเองตื่นเต้นมากครับ !!! ครั้งแรกที่ทราบข่าวว่าหุ่นยนต์ตัวนี้จะมาที่เมืองไทย
เพราะผมได้ติดตามผลงานของ Prof. Hiroshi Isiguro มาสักพักใหญ่ๆแล้ว
(จากบทความนี้ครับ หุ่นยนต์หรือหุ่นคนกันล่ะเนี่ย...ทำซะเหมือนเชียว !!! เมื่อ 8 เม.ย. 54)
เพราะหุ่นยนต์ที่ทำออกมา เหมือนคนจริงๆมากกกกก......ผมเลยอยากรู้ว่าเขาทำมาได้ยังไง?
ตัวเป็นๆหน้าตาเหมือนใน youtube ที่เราเห็นรึเปล่า? กลไกภายในเป็นยังไง?
ใช้อะไรบังคับหุ่นยนต์? มีความสามารถอะไรบ้าง? และคำถามมากมาย ????

ตอนชม
เนื่องจากกว่าทางผู้จัดไม่อนุญาตให้ถ่ายภาพหรือถ่ายวิดีโอระหว่างแสดง
เราจึงไม่ได้มีตัวอย่างมาให้ชมนะครับ
เข้าไปตอนแรกงงครับ...มีโปรเจคเตอร์ข้างๆเวที และมีแต่ภาษาอังกฤษ
นึกในใจ .. "ละครใบ้ป่าวเนี่ย" แต่ไม่น่าใช่ แล้วทำไมต้องมีซับไตเติ้ลด้วย (เริ่มเอ๊ะใจ)
พอละครใกล้เริ่ม... ทั้งห้องมืดสนิท...แสงไฟค่อยๆสาดส่งมากลางเวที
ทันใดนั้น ภาษาญี่ปุ่น สำเนียงคุ้นเคยลอยมาแต่ไกลเลยครับ
มาเต็มครับงานนี้ ญี่ปุ่นล้วน แถมซับยังเป็นซับ อังกฤษ อีกต่างหาก
ละครก็แสดงไปครับ ทั้งเรื่องมีแสดงอยู่ 2 คน คือคนจริงๆกับหุ่นยนต์
เรื่องย่อๆคือ หุ่นยนต์สาวมีหน้าที่เป็นเพื่อน เล่าบทกวีให้เด็กสาวที่ป่วยอยู่ฟังแค่นั้นหล่ะครับ
(อย่าเพิ่งสงสัยว่าผมมั่วรึป่าว...แกฟังออกหร๊าาาา)
ทั้งหมดประมาณ 20 นาทีได้ครับ (เพื่อนข้างๆผมหลับไปตั้งแต่ 5 นาทีแรกแล้วครับ)
ละครจบ...เสียงปรมมือดังลั่นโรงละคร
เรามองหน้ากันเล็กน้อย เห้ย...ไหนก่อนเข้าบอกว่าสัก 40 นาทีไง (หรอกกันชัดๆ)
สักพักมี message จากสวรรค์ผ่านมาทางโปรเจคเตอร์ด้วยข้อความภาษาอันคุ้นตาว่า
"กรุณาอย่าเพิ่งลุกจากที่นั่ง จะมีการแสดงละครเป็นภาษาไทยอีกรอบหนึ่งค่ะ"
OH MY GOD !!! ฟ้าประธานพรมาจริงๆ ได้ดูละครรู้เรื่องสักที ><" !!!
(เห็นไหมว่าผมไม่ได้มั่ว)

ตอนดูจบ (2 รอบ)
ผมหันไปถามเพื่อนๆ และทุกคนลงความเห็นเป็นเอกฉันท์ว่า .. "พวกเราเข้าไม่ถึงอารมณ์เค้าจริงๆ"
ละครแนวม๊ากกกก...ต่อให้มีภาษาไทย เราก็ยังไม่อินในอารมณ์อยู่ดี
คงเป็นเพราะ เราตั้งใจมาดู Technology มากกว่าละครมั้ง?
แต่ก็สรุปได้ว่า "วิทย์ + ศิลป์ = เจ๋งไปเลย" ขึ้นอยู่กับว่าจะนำเสนอแบบไหนเท่านั้นเองครับ

สรุป
คือผมบรรลุเป้าหมายครับ ได้เจอกับหุ่นยนต์ Geminoid F ตัวจริง กับตาตัวเอง !!!
และได้ดูละครเป็นของแถวครับ ถือว่าสุดยอดจริงๆๆๆ

(ถ่ายภาพหมู่ของผู้จัดทำ หลังแสดงจบ)


ความรู้ที่ได้รับ

(หุ่นยนต์ Geminoid F และคนต้นแบบ) 

รูปลักษณะภายนอก
หุ่นยนต์ชื่อว่า Germanoid F ครับ ทำแบบหน้าตามาจากคนจริงๆ
ไม่ใช่คนดังหรือดาราที่ไหนนะครับ รู้แค่ว่า เธอเป็นผู้หญิง ลูกครึ่งรัสเซีย-ญี่ปุ่น
เหตุผลที่เลือกเธอ หน้าตาเธอออกแนวกลางๆ
แสดงอารมณ์ออกมาได้ชัด คือ ยิ้มก็เห็นเป็นยิ้ม โกรธก็เห็นเป็นโกรธ


การควบุคุม




จะใช้การควบคุมด้วยคนจริงๆครับ ด้วยการใช้กล้อง VDO (Image Processing)
ส่องมาที่หน้าคนบังคับ และประมวลผลด้วยคอมพิวเตอร์
ถ้าคนบังคับขบับหัวขึ้นลง หรือสายหน้า หุ่นยนต์ก็จะทำตามได้ครับ
(รวมทั้งการขยับปาก กระพริบตา)
และเมื่อคนบังคับพูดใส่ไมโครโฟน ระบบจะทำการวิเคราะห์คำพูดน้้น
แล้วทำการควบคุมการขบับปากให้ตรงกับคำพูดด้วย.. (เจ๋ง !)

 
กลไกเนื่องจากกว่าเป็นหุ่นยนต์ที่ทำมาสำเร็จจากญี่ปุ่น
เราจึงไม่สามรถเห็นภายในได้ครับ
เท่าที่เราสอบถามได้ข้อมูลมาคือ ภายในทำจากโครงสร้างอลูมิเนี่ยม เนื่องจากมีความแข็งแรงและเบา
กลไกต่างๆ ทั้งหมด ขยับได้ด้วยระบบ Pneumatic (อ่านว่า นิวเมติก คือ การลมอัดอากาศ) ครับ
สาเหตุก็เพราะว่า Pneumatic ให้เสียงที่เบากว่า DC motor นั้นเองครับ

อื่นๆ
- ประเทศไทยเป็นประเทศแรกในเอเชีย ! ที่หุ่นยนต์ตัวนี้มาโชว์ตัว(ยกเว้นญี่ปุ่นนะครับ)
จากนั้นลองมาดู VDO เจ้าหุ่นยนต์ตัวนี้กันอีกทักทีว่าเหมือนที่ผมอธิบายไปรึเปล่า



อ้างอิง http://www.thairobotics.com/2012/02/27/sayonara/

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

การเตรียมตัวเพื่อเข้าแข่งขันหุ่นยนต์

การเตรียมตัวเพื่อเข้าแข่งขันหุ่นยนต์รายการต่างๆ

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

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

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

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

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

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

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

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

Review : หุ่นยนต์อัตโนมัติ Zeer Robotics Open 2012 [Champion]


หุ่นยนต์เป็นหุ่นยนต์อัตโนมัติเดินตามเส้นครับ บรรทุกของ
ใครบรรทุกได้น้ำหนักมากกว่า ก็ชนะไปครับ
โดยข้อกำหนดคือ
- หุ่นยนต์ต้องมีขนาดไม่เกิน 200 มม. x 200 มม. x 200 มม.
- แข่งขันในเวลา 180 วินาที
- แข่งขันได้ 2 รอบ เอาน้ำหนักที่ได้มากที่สุด (แต่นัดชิงได้แข่งรอบเดียว ^^")
กติกาสามารถดาวโหลดได้ที่นี่ >> ดาวโหลด




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


    1. โครงสร้างหุ่นยนต์ (Mechanics)
    2. วงจรอิเล็กทรอนิกส์ (Electronics)
    3. โปรแกรม (Programming)




  • โครงสร้างหุ่นยนต์ (Mechanics)โครงสรางเราใช้เวลาในการซื้ออุปกรณ์และทำขึ้นมาใหม่ทั้งหมด ภายในเวลา 1 วันนะครับ เนื่องจากเราเพิ่งทราบกติกาและรายละเอียด จึงมีเวลาเตรียมตัวน้อยครับ (ไม่แนะนำให้เอาเป็นแบบอย่างนะครับ)
    1. อคิลิก หนา 4 มม. สีขาว ขนาดประมาณ 20x20 จำนวน 2 แผ่น
    2. อคิลิก หนา 3 มม. สีใส ขนาดประมาณ 20x20 จำนวน 1 แผ่น
    3. มอเตอร์ขนาด 37มม. แกน 6 มม. ความเร็ว 100 รอบต่อนาที (rpm) จำนวน 2 อัน
    4. ฉากยึดมอเตอร์ จำนวน 2 อัน
    5. ล้ออิสระใหญ่ จำนวน 1-2 อัน
    6. หน้าแปลน(แปลงมาทำเป็นล้อหุ่นยนต์แทน) จำนวน 2 อัน
    7. ยางล้อ จำนวน 2 อัน
    8. เสารอง PCB  จำนวน 2 อัน
    9. สกรู น๊อต แหวน ขนาดต่างๆ
  • วงจรอิเล็กทรอนิกส์ (Electronics)
    ในที่แข่งขันเราใช้อยู่ 4 บอร์ดครับ ทำขึ้นมาเองทุกบอร์ดครับ
    1. วงจรคอนโทรลเลอร์ (Controller) 
    2. วงจรขับมอเตอร์ (Motor Driver)
    3. บอร์ด Interface
    4. วงจรเซนเซอร์
    5. แบตเตอร์รี่ใช้ Li-Po 3 เซลล์  
  • โปรแกรม (Programming)
    เราใช้ภาษาซีในการเขียนโปรแกรมครับ
    • สามารถดาวโหลดโค๊ดไปศึกษาดูได้ครับ >>> ดาวโหลด
  • อัลบั้มภาพ



     
     
     
  • วีดีโอ

วันพุธที่ 4 มกราคม พ.ศ. 2555

C# serail


Joy C# For child

การเขียนโปรแกรมจอยเพื่อควบคุมหุ่นยนต์โดยใช้โปรแกรม Microsoft Visual Studio C# นั่นสามารถทำได้ง่ายๆ เรามาดูวิธีทำกันเลยครับ!!

1. เริ่มต้นโดยเข้าสู่โปรแกรม Microsoft Visual Studio C# โดยกดดับเบิ้ลคลิกที่รูปภาพ ดังนี้


2. เมื่อเปิดโปรแกรมขึ้นมาได้แล้ว เราจะสร้าง Project โดยคลิกดังรูป


3. ตั้งชื่อ Project แล้วกดปุ่ม OK


4. เราจะได้ Project ที่เราสร้างดังภาพ

5. ในแทบ Toolbox ให้คลิกที่ Button แล้วไปคลิกที่พื้นที่ของ Form1 ดังภาพ

6. สามารถเปลี่ยนข้อความบน Button ได้ โดยให้คลิกที่ button แล้วในแทบ Properties จะมีข้อมูลของปุ่มให้เราเปลี่ยนได้ การเปลี่ยนข้อความบน Button ให้ไปที่ Text แล้วเปลี่ยนได้ตามต้องการ

7. ต่อไปให้ไปที่ Toolbox คลิกที่ SerialPort แล้วนำมาวางในพื้นที่ Form1 ดังภาพ



8. กดคลิกที่ Button ทำการสร้าง even โดยมีลำดับตาม ดังภาพ


9. เราจะมาอยู่ในแทบ Form1.cs ให้ใส่ Code ดังรูป

10. ให้เรากลับมาที่แทบ Form1.cs[Design] แล้วเพิ่มปุ่มอีก 3 ปุ่มโดยทำเหมือนข้อ3 และทำการสร้าง Even เหมือนข้อ 7


11. ทำการเพิ่มโค๊ดทั้งหมดดังนี้



วันเสาร์ที่ 5 พฤศจิกายน พ.ศ. 2554

ทดสอบ Accerelometer MMA7331








วิดีโอสาธิตการใช้งานครับ




สำหรับการใช้งานก็จะต่อกับ MCU Atmega168 ที่ 3.3v เลยเพื่อให้ง่านต่อการใช้งานครับ



#include <stdio.h>
#include <avr/io.h>                  //define port
#include <compat/deprecated.h>       //call function sbi(port,bit),cbi(port,bit) = Set,Clear bit
#include <avr/pgmspace.h>            //for progrm data to Area Flash
#include <stdlib.h>

#define F_CPU 20000000UL             //CPU Clock Frequency (Hz)
#include <util/delay.h>              //call function delay


int Xdata,Ydata,Zdata,AngleAcc;





/***************************************************************
 **                 Function use For Printf(UART0)            **
 ***************************************************************/


//--------------------- Prototype function ---------------------

static int uart_putchar(char c,FILE *stream);
static FILE uart_str = FDEV_SETUP_STREAM(uart_putchar,NULL,_FDEV_SETUP_WRITE);
void Init_Serial(unsigned int baudrate);

#define BAUD 56700
#define UBRR F_CPU/16/BAUD-1

//----------------------- UART0 Putchar -------------------------

static int uart_putchar(char c,FILE *stream)
 {
   if(c=='\a')
     {
   fputs("*ring*\n",stderr);
   return 0;
     }
   
   if(c=='\n')
     uart_putchar('\r',stream);

   loop_until_bit_is_set(UCSR0A,UDRE0);

   UDR0 = c;

   return 0;
 }

//------------------- Initial UART0 -----------------------

static void UART0_Init(void)
{

 UCSR0B = 0x00;     //disable while setting baud rate
 UBRR0L = UBRR;     //Set Baud Rate

 UCSR0C = 0x06;     //Set Frame format : 8data,NoneParity,1stop bit
 UCSR0B = 0x98;     //Uart0 Control Enable Reciver and transmitter

 stdout = &uart_str;     //Set address uart_str to stdout

}


void InitPWM()
{

 TCCR0A = (1<<COM0A1) |
    (0<<COM0A0) |
    (1<<COM0B1) |
    (0<<COM0B0) |
    (1<<WGM01)  |
    (1<<WGM00);
 TCCR0B = (0<<WGM02)  |
    (0<<CS02)   |
    (1<<CS01)  |
    (1<<CS00);

 OCR0A = 0x00;
 OCR0B = 0x00;

 PORTD &= ~(1<<PD5)&~(1<<PD6);
 PORTB &= ~(1<<PB3)&~(1<<PB4);
 
 DDRD |= (1 << PORTD5) | (1 << PORTD6);
    DDRB |= (1 << PORTB3) | (1 << PORTB4);
}

void UpdatePWM(unsigned char LeftPwmVal,unsigned char LeftDirection,unsigned char RightPwmVal,unsigned char RightDirection)
{    
 if(LeftPwmVal>100)
 {
  LeftPwmVal=255;
 }
 else
 {
  LeftPwmVal=LeftPwmVal*(255/100);
 }
 if(RightPwmVal>100)
 {
  RightPwmVal=255;
 }
 else
 {
  RightPwmVal=RightPwmVal*(255/100);
 }

 if(LeftDirection>0)
 {
  OCR0B = 255-LeftPwmVal;
  PORTB |= (1<<PB3);
 }
 else
 {
  OCR0B = LeftPwmVal;   
  PORTB &= ~(1<<PB3);
 }

 if(RightDirection>0)
 {
  OCR0A = 255-RightPwmVal;
  PORTB |= (1<<PB4);   
 }
 else
 {
  OCR0A = RightPwmVal;
  PORTB &= ~(1<<PB4);
 }
}


/************************************************************************
 *      Function Read XOUT,YOUT,ZOUT Rang OF Acceleration #MMA7331L     *
 ************************************************************************/

//---------------------------------------------------------- 
//---------------- READ Value XOUT ADC1(PF1)-------------
//---------------------------------------------------------- 
 
int Read_XOUT(void)
{
 int xout ;


 ADMUX   = 0xC5;  // [REFS1..0]:11 = Set Internal Ref. 1.1V , [Mux4..0]:00001 =Select Input Channel ADC1  
 ADCSRA  = 0x83;  // [ADEN]:1= ADC Enable ,[ADATE]:0= Auto triger Diable , [ADPS2..0]:011= Xtal/8


 ADCSRA |= 0x40;  // [ADSC]:1= ADC Start Conversion

 while(!(ADCSRA & 0x10)){;}    // [ADIF]:0 = Wait Conversion Completes[ADIF=1]
 
 xout = ADCW ;  // Read ADC 10-bit 

 return(xout);
}


//--------------------------------------------------------
//---------------- READ Value YOUT ADC2(PF2)-------------
//-------------------------------------------------------- 
 
 int Read_YOUT(void)
 {
 int yout ;

  
 ADMUX   = 0xC4             ;  // [REFS1..0]:11 = Set Internal Ref. 1.1V , [Mux4..0]:00010 =Select Input Channel ADC2  
 ADCSRA  = 0x83             ;  // [ADEN]:1= ADC Enable ,[ADATE]:0= Auto triger Diable , [ADPS2..0]:011= Xtal/8


 ADCSRA |= 0x40             ;  // [ADSC]:1= ADC Start Conversion

 while(!(ADCSRA & 0x10)){;}    // [ADIF]:0 = Wait Conversion Completes[ADIF=1]
     
 yout = ADCW                ;  // Read ADC 10-bit 


 return(yout)             ;
 }

 

//----------------------------------------------------------
//---------------- READ Value ZOUT ADC3(PF3) ---------------
//---------------------------------------------------------- 
 

int Read_ZOUT(void)
{
 int zout ;

 ADMUX   = 0xC3             ;  // [REFS1..0]:11 = Set Internal Ref. 1.1V , [Mux4..0]:00011 =Select Input Channel ADC3  
 ADCSRA  = 0x83             ;  // [ADEN]:1= ADC Enable ,[ADATE]:0= Auto triger Diable , [ADPS2..0]:011= Xtal/8


 ADCSRA |= 0x40             ;  // [ADSC]:1= ADC Start Conversion

 while(!(ADCSRA & 0x10)){;}    // [ADIF]:0 = Wait Conversion Completes[ADIF=1]

 zout = ADCW                ;  // Read ADC 10-bit 

 return(zout)               ;
}


int arctan2(int y, int x) {  // http://www.dspguru.com/dsp/tricks/fixed-point-atan2-with-self-normalization
   int coeff_1 = 180/4;         // angle in Quids (1024 Quids=360?)
   int coeff_2 = 3*coeff_1;
   float abs_y = abs(y)+1e-10; // kludge to prevent 0/0 condition
   float r, angle;
  
   if (x >= 0) {
     r = (x - abs_y) / (x + abs_y);
     angle = coeff_1 - coeff_1 * r;
   }  else {
     r = (x + abs_y) / (abs_y - x);
     angle = coeff_2 - coeff_1 * r;
   }
   if (y < 0)   
    return (int)(-angle);
   else            
    return (int)(angle);
} 

int getAccAngle(int z, int x) {                      
  return arctan2(-z, -x);    // in Quid: 1024/(2*PI))
}

/* ################################################################
   ##                                                                                                         ##
   ##                        Main Program                                                             ##
   ##                                                                                                         ##
   ################################################################ */
 
int main(void)
{  
   
    UART0_Init();
 InitPWM();
 UpdatePWM(50,1,0,1);
 _delay_ms(200);

 //----------------- Read and Print Value Gx,Gy,Gz 10-bit  Rang 4G -----------------

 printf("\n\r******* MMA7331L 3-Axis Accelerometer 10-bit ADC 4-G *********");

 while(1)
 {    

  Xdata = Read_XOUT()                      ; //  Read Value Gx
  //Ydata = Read_YOUT()                      ; //  Read Value Gy
  Zdata = Read_ZOUT()                      ; //  Read Value Gz


  //printf("G_x = %d  ",Xdata-512);   //  Print Value Gx  
  //printf("G_y = %d  ",Ydata-512);   // Print Value Gy
  //printf("G_z = %d  ",Zdata-512);   //  Print Value Gz

  AngleAcc = getAccAngle(Zdata-512, Xdata-512); //512, ((3.3v/2)/3.3v*1024) offset Accelerometer @3.3v
  printf("Deg = %d  ", AngleAcc);


  printf("\n\r");        //  Line Feed

  _delay_ms(150);

 } 


    return 0 ;
}



วันศุกร์ที่ 7 ตุลาคม พ.ศ. 2554

ที่ดูดวันตะกั่วแบบ ezyyyy :D


ที่ดูดควันตะกั่วแบบ EziEzyyyy ครับ 

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


ก็ซื้อของก่อนเลยก็ได้ดังนี้ครับ



นี้ก็เป็นโฉมหน้าของอุปกรณ์ผมครับ





และนี่ก็เป็น video สาธิตการใช้งานนะครับ


มะครับขั้นตอนการประกอบก็งายแสนง่ายครับ
คือประกอบให้พัดลมเป่าควันเข้ากล่องซึ่งกล้องอีกด้านนึงเราจะเจาะรูให้อากาศออกได้แต่ก่อนอากาศจะสัมผัสอากาศ ข้างนอกเราก็ใส่ filter กรองควันไว้ก่อนครับ ง่ายๆ แค่นี้เองครับ



















ภาพหนึ่งภาพแทนคำบรรยายได้นับล้านคำนะครับ อิอิ : }
ก็เรียบร้อยครับผม : )