แสดงบทความที่มีป้ายกำกับ Arduino แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ Arduino แสดงบทความทั้งหมด

วันพุธที่ 11 ตุลาคม พ.ศ. 2560

ATmega2560-Arduino Pin Mapping

ATmega2560-Arduino Pin Mapping

Below is the pin mapping for the Atmega2560. The chip used in Arduino 2560. There are pin mappings to Atmega8 and Atmega 168/328 as well.
Arduino Mega 2560 PIN diagram
The source SVG file is also available for download: PinMapping2560.zip
Arduino Mega 2560 PIN mapping table
Pin NumberPin NameMapped Pin Name
1PG5 ( OC0B )Digital pin 4 (PWM)
2PE0 ( RXD0/PCINT8 )Digital pin 0 (RX0)
3PE1 ( TXD0 )Digital pin 1 (TX0)
4PE2 ( XCK0/AIN0 ) 
5PE3 ( OC3A/AIN1 )Digital pin 5 (PWM)
6PE4 ( OC3B/INT4 )Digital pin 2 (PWM)
7PE5 ( OC3C/INT5 )Digital pin 3 (PWM)
8PE6 ( T3/INT6 ) 
9PE7 ( CLKO/ICP3/INT7 ) 
10VCCVCC
11GNDGND
12PH0 ( RXD2 )Digital pin 17 (RX2)
13PH1 ( TXD2 )Digital pin 16 (TX2)
14PH2 ( XCK2 ) 
15PH3 ( OC4A )Digital pin 6 (PWM)
16PH4 ( OC4B )Digital pin 7 (PWM)
17PH5 ( OC4C )Digital pin 8 (PWM)
18PH6 ( OC2B )Digital pin 9 (PWM)
19PB0 ( SS/PCINT0 )Digital pin 53 (SS)
20PB1 ( SCK/PCINT1 )Digital pin 52 (SCK)
21PB2 ( MOSI/PCINT2 )Digital pin 51 (MOSI)
22PB3 ( MISO/PCINT3 )Digital pin 50 (MISO)
23PB4 ( OC2A/PCINT4 )Digital pin 10 (PWM)
24PB5 ( OC1A/PCINT5 )Digital pin 11 (PWM)
25PB6 ( OC1B/PCINT6 )Digital pin 12 (PWM)
26PB7 ( OC0A/OC1C/PCINT7 )Digital pin 13 (PWM)
27PH7 ( T4 ) 
28PG3 ( TOSC2 ) 
29PG4 ( TOSC1 ) 
30RESETRESET
31VCCVCC
32GNDGND
33XTAL2XTAL2
34XTAL1XTAL1
35PL0 ( ICP4 )Digital pin 49
36PL1 ( ICP5 )Digital pin 48
37PL2 ( T5 )Digital pin 47
38PL3 ( OC5A )Digital pin 46 (PWM)
39PL4 ( OC5B )Digital pin 45 (PWM)
40PL5 ( OC5C )Digital pin 44 (PWM)
41PL6Digital pin 43
42PL7Digital pin 42
43PD0 ( SCL/INT0 )Digital pin 21 (SCL)
44PD1 ( SDA/INT1 )Digital pin 20 (SDA)
45PD2 ( RXDI/INT2 )Digital pin 19 (RX1)
46PD3 ( TXD1/INT3 )Digital pin 18 (TX1)
47PD4 ( ICP1 ) 
48PD5 ( XCK1 ) 
49PD6 ( T1 ) 
50PD7 ( T0 )Digital pin 38
51PG0 ( WR )Digital pin 41
52PG1 ( RD )Digital pin 40
53PC0 ( A8 )Digital pin 37
54PC1 ( A9 )Digital pin 36
55PC2 ( A10 )Digital pin 35
56PC3 ( A11 )Digital pin 34
57PC4 ( A12 )Digital pin 33
58PC5 ( A13 )Digital pin 32
59PC6 ( A14 )Digital pin 31
60PC7 ( A15 )Digital pin 30
61VCCVCC
62GNDGND
63PJ0 ( RXD3/PCINT9 )Digital pin 15 (RX3)
64PJ1 ( TXD3/PCINT10 )Digital pin 14 (TX3)
65PJ2 ( XCK3/PCINT11 ) 
66PJ3 ( PCINT12 ) 
67PJ4 ( PCINT13 ) 
68PJ5 ( PCINT14 ) 
69PJ6 ( PCINT 15 ) 
70PG2 ( ALE )Digital pin 39
71PA7 ( AD7 )Digital pin 29
72PA6 ( AD6 )Digital pin 28
73PA5 ( AD5 )Digital pin 27
74PA4 ( AD4 )Digital pin 26
75PA3 ( AD3 )Digital pin 25
76PA2 ( AD2 )Digital pin 24
77PA1 ( AD1 )Digital pin 23
78PA0 ( AD0 )Digital pin 22
79PJ7 
80VCCVCC
81GNDGND
82PK7 ( ADC15/PCINT23 )Analog pin 15
83PK6 ( ADC14/PCINT22 )Analog pin 14
84PK5 ( ADC13/PCINT21 )Analog pin 13
85PK4 ( ADC12/PCINT20 )Analog pin 12
86PK3 ( ADC11/PCINT19 )Analog pin 11
87PK2 ( ADC10/PCINT18 )Analog pin 10
88PK1 ( ADC9/PCINT17 )Analog pin 9
89PK0 ( ADC8/PCINT16 )Analog pin 8
90PF7 ( ADC7 )Analog pin 7
91PF6 ( ADC6 )Analog pin 6
92PF5 ( ADC5/TMS )Analog pin 5
93PF4 ( ADC4/TMK )Analog pin 4
94PF3 ( ADC3 )Analog pin 3
95PF2 ( ADC2 )Analog pin 2
96PF1 ( ADC1 )Analog pin 1
97PF0 ( ADC0 )Analog pin 0
98AREFAnalog Reference
99GNDGND
100AVCCVCC

วันศุกร์ที่ 24 มีนาคม พ.ศ. 2560

การทดลองใช้โปรแกรม CodeBlocks แทน Arduino IDE

การทดลองใช้โปรแกรม CodeBlocks แทน Arduino IDE


Arduino IDE เป็นโปรแกรมสำหรับการเขียนโค้ดและอัพโหลด Arduino Sketch ไปยังบอร์ด Arduino และถือว่าเป็นตัวเลือกแรกในการเรียนรู้และใช้งาน Arduino นอกเหนือจากโปรแกรมนี้แล้ว ยังมีซอฟต์แวร์ที่เป็นตัวเลือกอื่นอีกและนำมาใช้งานได้ฟรี บทความนี้กล่าวถึง การทดลองติดตั้งและใช้งานโปรแกรมที่มีชื่อว่า CodeBlocks Arduino IDE (http://arduinodev.com/codeblocks/) เป็นซอฟต์แวร์แบบ Open Source และสามารถใช้งานได้ทั้งกับระบบปฏิบัติการ Windows และ Linux แต่ในบทความนี้จะกล่าวถึงการใช้งานสำหรับ Windows เท่านั้น

การดาวน์โหลดและติดตั้งโปรแกรม CodeBlocks Arduino IDE

ขั้นตอนแรกคือการดาวน์โหลด CodeBlocks Arduino IDE (https://sourceforge.net/projects/arduinodev/files/) และนำมาติดตั้งสำหรับเครื่องคอมพิวเตอร์ที่ใช้ระบบปฏิบัติการ Windows เวอร์ชันที่ทดลองใช้คือ CodeBlocks-Arduino-20131127.7z จากนั้นให้ทำขั้นตอน unzip ไฟล์ดังกล่าว ซึ่งจะได้ Folder ใหม่ที่ชื่อว่า CodeBlocks และภายในจะมีไฟล์ที่ชื่อว่า CodeBlocks.exe ที่เรียกใช้งานได้

การใช้งานโปรแกรม CodeBlocks Arduino IDE

เมื่อได้เปิดโปรแกรม CodeBlocks Arduino IDE แล้ว ขั้นตอนแรกคือการสร้างโปรเจคใหม่ (New Project Creation) โดยเลือกจากเมนูคำสั่ง File > New > Project ... และให้เลือกชนิดของโปรเจคเป็น "Arduino Project" และเข้าสู่ Arduino Project Wizard ต่อไป

รูปแสดงหน้าต่างหลักของ CodeBlocks Arduino IDE

รูปแสดงหน้าต่างตัวเลือกสำหรับชนิดของโปรเจคใหม่ (เลือก Arduino Project)

เมื่อเข้าสู่ Arduino Project Wizard ให้กำหนดค่าตัวเลือกสำหรับบอร์ด Arduino ที่จะใช้ เช่น ใช้สำหรับไมโครคอนโทรลเลอร์ 8 บิต ความถี่ 16 MHz เป็นต้น และในหน้าถัดไป ให้กำหนดชื่อโปรเจค และ Folder สำหรับโปรเจค

รูปแสดงการตั้งค่าสำหรับ Arduino Project

รูปแสดงการตั้งชื่อโปรเจคและเลือก Folder สำหรับโปรเจค

เมื่อได้สร้างโปรเจคใหม่แล้ว จะกลับเข้าสู่หน้าหลักของ IDE โดยจะมีโค้ด Arduino Sketch ถูกใส่ไว้โดยอัตโนมัติ (มาจาก Code Template) และอยู่ในส่วนของ Editor

รูปแสดงหน้าต่างหลักเมื่อได้สร้างโปรเจคแล้ว พร้อมโค้ดตัวอย่าง

โค้ดที่ถูกใส่มาเป็นตัวอย่างนั้น เป็นโค้ดที่ทำให้ LED ที่ขา D13 ของบอร์ด Arduino กระพริบ และมีการเปิดใช้พอร์ต Serial เพื่อส่งข้อมูลจากบอร์ด Arduino ไปยังคอมพิวเตอร์ผ่านสาย USB โค้ดนี้เป็นโค้ดตัวอย่าง และสามารถนำไปทดลองใช้ได้กับบอร์ด Arduino ... ถัดไปให้เลือกบอร์ดเป้าหมาย จากเมนูคำสั่ง Build > Select Target > Arduino Leonardo (ใช้บอร์ด Leonardo เป็นตัวอย่าง) แล้วทำขั้นตอน "Build" (หรือกด Ctrl+F9) ถ้าต้องการคอมไพล์เฉพาะไฟล์ที่ได้แก้ไขอย่างเดียว ให้เลือก Build > Compile current file

รูปแสดงเมนูคำสั่งสำหรับเลือกบอร์ด Arduino สำหรับใช้งาน

รูปแสดงข้อความในส่วน Build Log เมื่อทำขั้นตอน Build แล้ว

เมื่อได้ทำขั้นตอน Build เพื่อตรวจสอบความถูกต้องของ Arduino Sketch ขั้นตอนต่อไปคือการอัพโหลด โดยให้เชื่อมต่อบอร์ด Arduino กับคอมพิวเตอร์ ผ่าน USB แล้วจึงเลือกทำคำสั่ง Run (หรือกด Ctrl+F10) จากนั้นเมื่อได้คอมไพล์โค้ดแล้ว จะเข้าสู่หน้าต่างของ Arduino Builder และให้เลือกพอร์ต Serial ที่ตรงกับบอร์ด Arduino ในตัวอย่างนี้คือ COM49 และให้กดที่ปุ่มดังกล่าว และโปรแกรมจะทำการอัพโหลดไฟล์ .hex ของ Arduino Sketch ไปยังบอร์ดเป้าหมาย

รูปแสดงหน้าต่างของ Arduino Builder

รูปแสดงข้อความในหน้าต่างของ Arduino Builder หลังจากได้อัพโหลด Arduino Sketch สำเร็จแล้ว

ปัญหาที่พบ: จากการทดลองใช้งานกับบอร์ด Leonardo และ Pro Micro ซึ่งใช้ชิป ATmega32u4 พบว่า สามารถอัพโหลด Arduino Sketch ได้ แต่ไม่สามารถรับส่งข้อมูลได้ในหน้าต่างของ Arduino Builder แต่ถ้าใช้ Serial Monitor ของ Arduino IDE หรือโปรแกรมอย่างเช่น putty สามารถรับข้อมูลจาก Serial ได้ตามปรกติ (สำหรับบอร์ด Arduino Uno และ Arduino Mega 2560 สามารถใช้งานพอร์ต Serial ได้ตามปรกติ)

รูปแสดงข้อความจากพอร์ต Serial ของArduino Builder
แต่ทดลองใช้กับบอร์ด Arduino Pro Mini + USB-to-Serial module (FTDI chip) แล้วรับส่งข้อมูลได้

จุดเด่นของโปรแกรม CodeBlocks Arduino IDE

เมื่อเปรียบเทียบกับ Arduino IDE ผู้ใช้สามารถทดสอบการทำงานของ Arduino Sketch ในโหมด Debug ด้วย Simulator ของ CodeBlocks Arduino IDE ได้ และในการเขียนโค้ด มีโหมด Auto Code Complete และ Auto Save ให้ใช้งาน ทำให้สะดวกในการเขียนโค้ดมากขึ้น

รูปแสดงการเลือก Target เป็น Simulator เพื่อจำลองการทำงานและตรวจสอบการทำงานของโค้ด (Debug)
เมื่อเลือก Target เป็น Simulator แล้วให้ทำขั้นตอน Build อีกครั้ง

รูปแสดงการทดสอบการทำงานของโค้ดโดย Simulator
และเลือกทำคำสั่งไปจนถึงตำแหน่งของเคอร์เซอร์ใน Editor

รูปแสดงตัวอย่างเอาต์พุตที่ได้จากการทำงานของ Simulator สำหรับโค้ดตัวอย่าง

รูปแสดงตัวอย่างการทำ Auto-Complete ในขณะที่เขียนโค้ด

รูปแสดงตัวอย่างการทำ Auto-Complete ในขณะที่เขียนโค้ด

แก้ไขครั้งล่าสุด (Last Update): 9 Dec. 2013

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

การใช้งานโมดูอ่าน/เขียน SD Card

การใช้งานโมดูอ่าน/เขียน SD Card


โมดูลอ่าน / เขียน SD Card ใช้สำหรับการเก็บข้อมูลปริมาณมาก ที่ EEPROM ไม่สามารถเก็บไว้ได้หมด การนำไปใช้งานก็เช่น การเก็บค่าอุณหภูมิแบบต่อเนื่อง เป็นต้น
โมดูล SD Card เป็นโมดูลที่ช่วยในการนำ Arduino ไปเชื่อมต่อกับ SD Card ได้ง่ายมากยิ่งขึ้น ซึ่ง SD Card ที่เราใช้งานกับอยู่ทุกวันนี้ใช้การเชื่อมต่อ รับ-ส่งข้อมูลโดยใช้โปรโตคอล SPI ทำงานที่แรงดัน 3.3V โมดุลนี้ได้รวมวงจรเรกกูเลเตอร์ แปลงแรงดันไฟตรงจาก 5V เป็น 3.3V และมีวงจร Logic Level Converter บนบอร์ด เพื่อให้สามารถนำไปใช้งานกับบอร์ด Arduino ที่ทำงานที่แรงดัน 5V ได้ทันที
นอกจากนี้ โมดูลยังสามารถใช้งานกับบอร์ดไมโครคอนโทรเลอร์อื่นๆได้ อย่างเช่น นำไปใช้งานกับโมดูล ESP8266 เพื่อเก็บค่าอุณหภูมิย้อนหลังได้เป็นเดือนๆได้อีกด้วย

การต่อใช้งานโมดูอ่าน/เขียน SD Card กับบอร์ด Arduino

ต่อสายดังนี้
บอร์ด Arduinoโมดูอ่าน/เขียน SD Card
D13CLK
D12MISO
D11MOSI
D4CS
5V5V
GNDGND

 

การต่อใช้งานโมดูอ่าน/เขียน SD Card กับโมดูล ESP8266

โมดูล ESP8266โมดูอ่าน/เขียน SD Card
GPIO14 (CLK)CLK
GPIO12 (MISO)MISO
GPIO13 (MOSI)MOSI
GPIO15 (CS)CS
VCC - 3.3V3.3V
GNDGND

 

ตัวอย่างโค้ดใช้งาน

ในโปรแกรม Arduino IDE มีตัวอย่างโค้ดให้ทั้งหมด 6 ตัวอย่าง สามารถดูแต่ละตัวอย่างได้ โดยกดที่เมนู File > Examples > SD เลือกตัวอย่าง แล้วกด Upload เพื่อดูผลได้เลย

วันพุธที่ 22 มีนาคม พ.ศ. 2560

Arduino กับการใช้งานอินเตอร์รัพท์

Arduino กับการใช้งานอินเตอร์รัพท์


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

ชนิดของอินเตอร์รัพท์

แบ่งตามชนิดของการเกิดได้ดังนี้
  • อินเตอร์รัพท์จากภายนอก เช่น การเปลี่ยนสถานะลอจิกของพอร์ตใดพอร์ตหนึ่ง
  • อินเตอร์รัพท์จากภายใน เช่น อินเตอร์รัพท์ที่เกิดจากทามเมอร์

การควบคุมอินเตอร์รัพท์

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

การใช้งานอินเตอร์รัพท์ใน Arduino

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

พอร์ตที่สามารถใช้งานอินเตอร์รัพท์ได้

ในบอร์ด Arduino จะมีพอร์ตที่สามารถใช้อินเตอร์รัพท์ได้แบบจำกัด โดยพอร์ตที่สามารถใช้อินเตอร์รัพท์ได้ในบอร์ด Arduino แต่ละรุ่นก็จะแตกต่างกัน ซึ่งสามารถดูได้ตามตารางด้านล่างนี้
Boardint.0int.1int.2int.3int.4int.5
Uno, Ethernet23    
Mega25602321201918
Leonardo32017 
Due(see below)
ในการสร้างอินเตอร์รัพท์ จะใช้ลำดับขาอินเตอร์รัพท์มาใส่ในฟังก์ชั่น เช่น ในตาราง บอร์ด Arduino Uno มีพอร์ต 2 เป็นขาอินเตอร์รัพท์ลำดับที่ 0 ดังนั้นเมื่อนำไปใช้ในคำสั่ง ต้องนำหมายเลข 0 ไปใส่ ส่วนใน Arduino Due สามารถใช้งานอินเตอร์รัพท์ได้ทุกขา หากนำไปใส่ในคำสั่ง ก็สามารถนำหมายเลขขาไปใส่ได้เลย

คำสั่งกำหนดใช้อินเตอร์รัพท์

คำสั่ง attachInterrupt() เป็นคำสั่งกำหนด และสร้างอินเตอร์รัพท์ โดยมีรูปแบบการใช้งานดังนี้
รูปแบบคำสั่ง attachInterrupt(interrupt, ISR, mode)
  • interrupt คือลำดับขาอินเตอร์รัพท์ตามที่ได้ดูไปในตารางที่ผ่านมา ใน Arduino Due สามารถใส่หมายเลขขาลงไปได้เลย
  • ISR คือชื่อฟังก์ชั่นที่จะไปถูกเรียกขึ้นมาเมื่อเกิดอินเตอร์รัพท์
  • mode รูปแบบที่จะให้เกิดอินเตอร์รัพท์ มีทั้งหมด 4 รูปแบบดังนี้
    • LOW จะเกิดอินเตอร์รัพท์ต่อเมื่อพอร์ตที่กำหนดไว้มีสถานะเป็น LOW
    • CHANGE จะเกิดอินเตอร์รัพท์เมื่อพอร์ตที่กำหนดไว้มีการเปลี่ยนสถานะ เช่น จากสถานะ HIGH เป็น LOW หรือจาก LOW เป็น HIGH
    • RISING จะเกิดอินเตอร์รัพท์เมื่อพอร์ตที่กำหนดไว้มีการเปลี่ยนสถานะจาก LOW เป็น HIGH
    • FALLING จะเกิดอินเตอร์รัพท์เมื่อพอร์ตที่กำหนดไว้มีการเปลี่ยนสถานะจาก HIGH เป็น LOW
    • HIGH จะเกิดอินเตอร์รัพท์ต่อเมื่อพอร์ตที่กำหนดไว้มีสถานะเป็น HIGH
ตัวอย่างการใช้งาน
int ledPin = 13; 

void setup() {
  pinMode(ledPin, OUTPUT);
  attachInterrupt(0, TriggerLED, FALLING);
  // ใช้งานขาอินเตอร์รัพท์ลำดับ 0 หรือขา D2 ใน Arduino Uno R3
  // เรียกฟังก์ชั่น TriggerLED() ขึ้นมาทำงาน เมื่อเกิดอินเตอร์รัพท์ขึ้น
  // เกิดอินเตอร์รัพท์เมื่อรูปแบบเป็น FALLING หรือก็คือจากสถานะ HIGH เป็น LOW
  // จากที่กำหนดไว้ หากใช้พอร์ต D2 ใน Arduino Uno R3 ต่ออยู่กับสวืตซ์ เมื่อ
  // ทำการกดสวิตซ์ จะทำให้สถานะเปลี่ยนจาก LOW เป็น HIGH พอปล่อยสวิตซ์ สถานะ
  // จะเปลี่ยนจาก HIGH เป็น LOW ทำให้เกิดการอินเตอร์รัพท์ขึ้น แล้วไปเรียกฟังก์ชั่น
  // TriggerLED() ขึ้นมาทำงาน 
} 

void loop() { 
  delay(10); 
} 

void TriggerLED() {
  digitalWrite(ledPin, !digitalRead(ledPin));
}
วงจร

คำสั่งควบคุมอินเตอร์รัพท์

มีด้วยกัน 2 คำสั่ง คือ
  • noInterrupt() เป็นคำสั่งที่ทำให้ซีพียูอยู่ในสถานะ Disable Interrupt
  • Interrupt() เป็นคำสั่งที่ทำให้ซีพียูอยู่ในสถานะ Enable Interrupt

คำสั่งยกเลิกใช้อินเตอร์รัพท์

รูปแบบ detachInterrupt(interrupt)
คำสั่ง detachInterrupt() คือคำสั่งที่ใช้ในการยกเลิกการใช้งานอินเตอร์รัพท์ โดยพารามิเตอร์ interrupt ต้องใส่เป็นลำดับขาอินเตอร์รัพท์ หรือใน Arduino Due จะต้องใส่เป็นหมายเลขขา

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

เขียนโปรแกรมแสดงผลบนจอทีวี

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

ไลบารี่เพิ่มเติม
TVout คลิกที่นี่เพื่อดาวน์โหลด
*ดูวิธีติดตั้งในงานครั้งที่ 20


ฟังก์ชั่นที่ใช้งาน
-Setup Functions https://code.google.com/p/arduino-tvout/wiki/FDSetup
-Flow Control https://code.google.com/p/arduino-tvout/wiki/FDflowctl
-Accessor Functions https://code.google.com/p/arduino-tvout/wiki/FDSacc
-Basic Graphics Functions https://code.google.com/p/arduino-tvout/wiki/FDBasicGFX
-Text Handling Functions https://code.google.com/p/arduino-tvout/wiki/FDText

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


วงจรที่ใช้ในการทดลองสำหรับผู้ที่ใช้บอร์ด Arduino


วงจรที่ใช้ในการทดลองสำหรับผู้ที่ใช้ไอซี ATmega328 (ที่มี Boot Loader Arduino)

วันอังคารที่ 7 มีนาคม พ.ศ. 2560

Inertial Sensors: หามุม Pitch และ Roll จากเซ็นเซอร์วัดความเร่ง


 บทความนี้มาดูกันนะครับว่าจะคำนวณค่ามุม Roll และ Pitchจากเซ็นเซอร์วัดความเร่ง (accelerometer) ได้อย่างไร โดยผมขออธิบายมุม Roll Pitch Yaw ให้เข้าใจแบบง่ายๆด้วยภาพด้านล่างแล้วกันนะครับ
Roll Pitch Yaw
เนื่องจากข้อจำกัดของ accelerometer ค่า yaw ที่วัดได้จะมีความคลาดเคลื่อนสูงจนนำมาใช้ไม่ได้ โดยทั่วไปถ้าใช้แค่ accelerometer อย่างเดียวมุม yaw จะไม่ถูกนำมาใช้ ดังนั้นในบทความนี้เราจะพูดถึงแค่ roll และ pitch เท่านั้น

วิธีคำนวณ roll และ pitch นั้นจะขึ้นอยู่กับชนิดของ accelerometer ในที่นี้เราจะอ้างถึงตระกูล ADXL345 เนื่องจากมี Library ช่วยแปลงค่าสัญญาณ analog ที่อ่านได้จาก accelerometer ให้อยู่ในรูปของแรง “g” (หรือความเร่ง) ถ้าไม่ใช้ library นี้เราก็จะต้องเขียนโปรแกรมในส่วนของการแปลงนี้เองโดยใช้สูตรด้านล่าง
Conversion
โดยที่ค่า Range และ resolution เป็นค่าเฉพาะของแต่ละ accelerometer เช่นสำหรับ ADXL345 ค่าทั้งสองนี้คือresolution = 10-bit และ Range = +-2 g
 
โดยทั่วไปค่าความเร่งที่วัดได้ในแต่ละแกน (Xg, Yg, Zg) จะมีสัญญาณรบกวนผสมอยู่ จึงควรทำการลดปริมาณสัญญาณรบกวนนี้ออกไปก่อนบ้าง โดยใช้ Low-Pass Filter ซึ่ง implement ได้ดังนี้
lowpass filter
ค่าแอลฟา เป็นค่าคงที่ของ Lowpass filter โดยจะต้องมีค่าน้อยกว่าหรือเท่ากับ 1 ค่าแอลฟาที่เหมาะขึ้นอยู่กับระบบและรูปแบบการใช้งาน ส่วน y(k) และ x(k) คือค่าความเร่งหลังและก่อน filter ตามลำดับ y(k-1) คือค่าความเร่งที่ถูก filter ของ loop ที่แล้ว

หลังจากที่ได้ความเร่งที่ถูก filter ของทั้ง 3 แกนมา (fXg, fYg, fZg) เราสามารถคำนวณหา pitch และ roll ได้ดังนี้
ด้านล่างเป็นตัวอย่างโค๊ดที่เรียกใช้ library สองตัว คือ Wire.h และ ADXL345.h โดยใช้ Lowpass filter ลดทอนสัญญาณรบกวนออกจากค่าความเร่งที่อ่านค่าได้ในแต่ละแกน จากนั้นก็ทำการคำนวณมุม roll และ pitch ในแต่ละ loop ตามลำดับ