การเขียนโปรแกรม Arduino สำหรับ ATtiny85#
บทความนี้นำเสนอการใช้งานชิปไมโครคอนโทรลเลอร์ ATtiny85 (8-bit MCU) การเขียนโปรแกรมด้วยคำสั่งของ Arduino การจำลองการทำงานและการทดลองใช้งานกับอุปกรณ์จริง
Keywords: ATtiny85, Arduino Programming, AUTODESK Tinkercad Circuits, Wokwi AVR Simulator, Breadboard Prototyping
▷ แนะนำไมโครคอนโทรลเลอร์ ATtiny85#
คุณสมบัติเกี่ยวกับ ATtiny85 (Datasheet)
- เป็นชิปไมโครคอนโทรลเลอร์ในตระกูล ATtiny (TinyAVR) ของบริษัท Atmel / Microchip
- ภายในมีซีพียูขนาด 8 บิต และมีสถาปัตยกรรมแบบ RISC
- มีหน่วยความจำภายใน 3 ประเภท
- SRAM (Data Memory) ขนาด 512 ไบต์
- Flash (Program Memory) ขนาด 8 กิโลไบต์ (KB)
- EEPROM (Non-volatile Data Storage) ขนาด 512 ไบต์
- ใช้ตัวถังของไอซีที่มีเพียง 8 ขา เช่น ตัวถังแบบ DIP-8 (สามารถเสียบขาลงบนเบรดบอร์ดได้)
- มีตัวสร้างสัญญาณ Clock ภายใน (Internal Oscillator) ที่มีความถี่ 8 MHz
- รองรับช่วงแรงดันไฟเลี้ยง 1.8V ~ 5.5V ได้
- มีขา GPIO ทั้งหมด 6 ขา ซึ่งเป็นส่วนหนึ่งของพอร์ต PORTB
- สามารถสร้างสัญญาณ PWM (Pulse Width Modulation) ได้สูงสุด 4 ช่อง
- มีวงจร UCI (Universal Serial Interface) จำนวน 1 ชุด ที่สามารถใช้งานสำหรับ SPI, I2C/TWI และ UART ได้
- มีวงจรตัวนับ Timers/ Counters ขนาด 8 บิต จำนวน 2 ชุด
- มีวงจร 10-bit ADC (Analog-to-Digital Converter) ที่รับอินพุตแบบ Single-Ended จำนวน 4 ช่อง (ADC0..ADC3) หรือแบบ Differential Pair ได้ 2 คู่
- มีวงจร On-chip Analog Comparator และขาอินพุต AIN0(+) กับ AIN1(-) จำนวน 1 ช่อง
รูป: ผังแสดงตำแหน่งขาของ ATtiny85 ที่มีตัวถังแบบ Plastic DIP-8 / SOIC-8
รูป: ชิป ATtiny85-20PU ที่มีตัวถังแบบ PDIP-8 และเสียบขาลงใน Round-pin IC Socket สำหรับการต่อวงจรบนเบรดบอร์ด
ทำไมจึงแนะนำให้ลองใช้ ATtiny85 ?
- ATtiny85 มีราคาไม่แพง (~50 บาท)
- มีตัวถังแบบ DIP-8 (เหมือนไอซี OpAmp ทั่วไป) ให้เลือกใช้ และสามารถนำไปเสียบลงบนเบรดบอร์ดเพื่อต่อวงจรทดลองได้ง่าย
- สามารถใช้ตัวสร้างสัญญาณ Clock ภายใน โดยไม่ต้องต่อวงจร Crystal Oscillator ภายนอก (ไม่ต้องใช้ขา XTAL1 / XTAL2)
- มีตัวเลือกสำหรับความถี่ เช่น 1 MHz / 8 MHz / 16 MHz
- ถ้าใช้ความถี่ 16 MHz จะต้องใช้แรงดันไฟเลี้ยง +5V
- ถ้าใช้ความถี่ 1 MHz หรือ 8 MHz สามารถเลือกใช้แรงดันไฟเลี้ยง 3.3V หรือ 5V ได้
- สามารถใช้งานได้กับซอฟต์แวร์ AUTODESK Tinkercad Circuits (Web-based) — ผู้ใช้สามารถเขียนโค้ดและจำลองการทำงานร่วมกับวงจรอิเล็กทรอนิกส์ได้ รองรับการเขียนโค้ด โดยใช้ชุดคำสั่งของ Arduino API หรือจะเขียนโค้ดโดยใช้ฟังก์ชันจากไลบรารี AVR libc ได้
- สามารถเขียนโค้ดและจำลองการทำงานโดยใช้ Wokwi Arduino Simulator ได้
- สามารถเขียนโค้ดโดยใช้ Arduino IDE สำหรับการคอมไพล์โค้ดและนำไปใช้กับฮาร์ดแวร์จริง
อย่างไรก็ตาม ก็ต้องคำนึงถึงข้อจำกัดของ ATtiny MCU เมื่อต้องการนำไปใช้งาน เช่น ขนาดของหน่วยความจำที่มีค่อนข้างน้อย จำนวนของขา I/O ที่มีอย่างจำกัด เป็นต้น
การใช้ซอฟต์แวร์ Tinkercad Circuits มีข้อดีคือ ผู้ใช้สามารถเลือกใช้ชิป ATtiny85 มาต่อวงจรเสมือนจริงบนเบรดบอร์ด ร่วมกับไอซีหรือวงจรอิเล็กทรอนิกส์ที่มีอยู่ในรายการของตัวเลือก และจำลองการทำงานได้จริง ช่วยในการฝึกทักษะการวางแผนต่อวงจรบนเบรดบอร์ด
รูป: การต่อวงจรเสมือนจริง โดยใช้ LED + 470R สำหรับแสดงสถานะลอจิก แสดงสถานะลอจิกที่ขา PB0 เขียนโค้ดด้วย Arduino Sketch เพื่อกำหนดสถานะลอจิกที่ขาเอาต์พุต และจำลองการทำงานด้วย Tinkercad Circuits
ข้อสังเกต:
- ในการต่อวงจรโดยใช้ Tinkercad Circuits เพื่อจำลองการทำงานของ ATtiny85 จะต้องมีการต่อขาไฟเลี้ยง +5V และ 0V สำหรับไอซี (จากแหล่งจ่ายคงที่ภายนอกหรือ Power Supply) ที่ขา 8 และขา 4 ตามลำดับ
- ภายในชิป ATtiny85 ที่ขารีเซต มีตัวต้านทานแบบ Internal Pullup (30kΩ ~ 60kΩ) ดังนั้นสำหรับการต่อวงจรทดลองโดยทั่วไป ก็ไม่จำเป็นต้องต่อตัวต้านทาน Pullup ภายนอกเพิ่ม
- โดยทั่วไป ฟังก์ชันการทำงานของขารีเซต จะไม่ถูกปิดการใช้งาน ดังนั้นจึงไม่สามารถใช้ขารีเซตเป็นขา GPIO ทั่วไปได้
ยกเว้นกรณีที่มีการโปรแกรมค่าของ Fuse Bit (บิต
RSTDISBL
ใน Fuse High Byte) เพื่อปิดการใช้งานฟังก์ชันรีเซต (Disabling Reset Pin) แต่จะทำให้ไม่สามารถอัปโหลดโปรแกรมด้วยวิธี ICSP ได้อีกต่อไป ดังนั้นจะต้องใช้อุปกรณ์ที่เรียกว่า High-Voltage AVR Programmer เพื่อเปิดใช้งานฟังก์ชันของขารีเซตอีกครั้ง - ในการต่อวงจรโดยใช้ไอซี ATtiny85 บนเบรดบอร์ด แนะนำให้ใช้ IC Socket ร่วมด้วย เพื่อช่วยป้องกันขาของไอซี เมื่อต้องถอดไอซีออกจากเบรดบอร์ดบ่อยครั้ง
ในเชิงเปรียบเทียบหรืออีกตัวเลือกหนึ่งคือ การใช้ซอฟต์แวร์ WokWi (ออกเสียงว่า "ว็อก-วี") เพื่อนำมาต่อวงจร ATtiny85 ร่วมกับโมดูลหรืออุปกรณ์อิเล็กทรอนิกส์ต่าง ๆ ที่มีอยู่ในรายการตัวเลือกได้ แต่ก็มีความแตกต่างจาก Tinkercad Circuits เช่น ประเภทของอุปกรณ์ที่เลือกใช้ได้ และยังไม่สามารถต่อวงจรเสมือนจริงบนเบรดบอร์ดได้
รูป: การต่อวงจรเสมือนจริง โดยใช้ LEDs (Red & Blue Color) + 470R แสดงสถานะลอจิกที่ขา PB0 (IC Pin 5) เขียนโค้ดด้วย Arduino Sketch เพื่อกำหนดสถานะลอจิกที่ขาเอาต์พุต (LED สีแดงกับสีน้ำเงินจะติด-ดับสลับกัน) และจำลองการทำงานด้วย WokWi Simulator
รูป: ไฟล์ diagram.json ของวงจรตัวอย่าง และการกำหนดค่าของคุณสมบัติที่เกี่ยวข้องกับอุปกรณ์ที่ได้นำมาต่อวงจร
(เช่น ค่าของตัวต้านทาน wokwi-resistor
สีของหลอดแอลอีดี wokwi-led
เป็นต้น)
รูป: ตัวอย่างการใช้โมดูล LCD16X2 I2C ร่วมกับ ATtiny85 และจำลองการทำงานด้วย WokWi Simulator
ข้อสังเกต:
- การต่อวงจรโดยใช้ WokWi Simulator เพื่อจำลองการทำงานของ ATtiny85 ไม่จำเป็นต้องต่อขาไฟเลี้ยง +5V และ 0V ที่ขา 8 และขา 4 ตามลำดับ
ถัดไปเป็นตัวอย่างโค้ด Arduino Sketch สาธิตการใช้คำสั่งพื้นฐาน เช่น pinMode()
,
delay()
, digitalWrite()
, digitalRead()
, analogWrite()
ตัวอย่างโค้ด: LED Blink โดยเลือกใช้ขา PB0 เป็นขาเอาต์พุต
const int LED_PIN = PB0; // PB0 pin = Arduino D0 pin
void setup() {
pinMode( LED_PIN, OUTPUT );
}
void loop() {
// toggle LED output
digitalWrite( LED_PIN, !digitalRead(LED_PIN) );
delay(500);
}
ตัวอย่างโค้ด: PWM-based LED Fading โดยเลือกใช้ขา PB0 เป็นขาเอาต์พุต
const int LED_PIN = PB0; // LED output pin
void setup() {
analogWrite( LED_PIN, 0 );
}
void loop() {
for ( int i=0; i < 512; i++ ) {
if ( i <= 255 ) {
analogWrite( LED_PIN, i );
} else {
analogWrite( LED_PIN, 511-i );
}
delay(8);
}
}
▷ การเขียนโปรแกรมด้วย Arduino IDE สำหรับ ATtiny85#
ถ้าต้องการนำโค้ด Arduino Sketch ไปใช้งานกับอุปกรณ์จริง จะต้องมีการคอมไพล์โค้ดให้เป็นไฟล์เฟิร์มแวร์ (.bin) และผู้ใช้สามารถคอมไพล์โค้ดโดยใช้ซอฟต์แวร์ Arduino IDE แต่จะต้องมีการติดตั้ง Arduino TinyCore
ในส่วน Preferences ของ Arduino IDE ให้ใส่ URL ต่อไปนี้ เพิ่มอีกหนึ่งบรรทัดสำหรับ Additional Boards Manager (ถ้ามีรายการ URL อื่นอีก ให้ใช้สัญลักษณ์ ,
เป็นตัวแบ่ง)
http://drazzy.com/package_drazzy.com_index.json
จากนั้นให้ทำคำสั่งจากเมนู Tools > Boards Manager เพื่อดาวน์โหลดและติดตั้ง ATTinyCore ซึ่งได้รับการดูแลโดย Spence Konde ตามรูปตัวอย่าง (ใช้เวอร์ชัน 1.5.2)
รูป: การติดตั้ง Arduino ATTinyCore สำหรับซอฟต์แวร์ Arduino IDE
รูป: การตั้งค่าเพื่อคอมไพล์โค้ดตัวอย่างใน Arduino IDE เลือกชิป ATtiny85 ใช้ Clock Source: 8MHz Internal) และไม่ใช้งาน Bootloader
▷ การอัปโหลดโปรแกรมไปยัง ATtiny85#
เมื่อสามารถคอมไพล์ Arduino Sketch ได้แล้ว และต้องการนำไปทดลองกับ ATtiny85 จะต้องมีอุปกรณ์อีกหนึ่งอย่างคือ AVR ISP Programmer ซึ่งมีให้เลือกใช้งานหลายแบบ เช่น
- USBasp (Clone): อุปกรณ์นี้ใช้ชิป ATMEGA-8 พัฒนาโดย Thomas Fischl แต่ก็มีอุปกรณ์ประเภท Clone ที่ผลิตในจีน ดังนั้นจึงมีราคาถูกและหาซื้อได้ง่าย
- Arduino as ISP Programmer: ผู้ใช้สามารถนำบอร์ด เช่น Arduino Uno หรือ Nano (ถ้ามีอยู่แล้ว) มาติดตั้งโปรแกรมตัวอย่าง Examples > ArduinoISP ให้กลายเป็นอุปกรณ์ ISP Programmer ได้ และไม่จำเป็นต้องซื้อหาอุปกรณ์มาเพิ่ม
รูป: ตัวอย่างอุปกรณ์ USBasp (Clone)
การเขียนไฟล์เฟิร์มแวร์ลงในหน่วยความจำภายในชิป AVR โดยใช้อุปกรณ์ AVR ISP จะต้องมีการเชื่อมต่อสายไฟ 6 เส้น ดังนี้
- Pin 1: MISO
- Pin 2: VCC
- Pin 3: SCK
- Pin 4: MOSI
- Pin 5: RST
- Pin 6: GND
บอร์ด Arduino ที่ใช้ชิป AVR เช่น Uno, Nano, Mega มีคอนเนกเตอร์ แบบ 2x3 pins อยู่บนบนบอร์ด
รูป: คอนเนกเตอร์ AVR ISP (2x3 pins) บนบอร์ด Arduino Uno
รูป: ตัวอย่างการเชื่อมต่อระหว่างบอร์ด Arduino Uno Rev.3 ที่ได้นำมาใช้เป็นอุปกรณ์ ISP Programmer เพื่ออัปโหลดเฟิร์มแวร์ไปยังบอร์ด Arduino Nano v3 (Target)
ถ้าใช้บอร์ด Arduino Uno เป็น ArduinoISP ขาที่ใช้งานมีดังนี้
- 5V = VCC
- GND = GND
- D13 = SCK
- D12 = MISO
- D11 = MOSI
- D10 = RESET
รูป: คอนเนกเตอร์ AVR ISP เปรียบเทียบระหว่าง 2x3 pins กับ 2x5 pins
การต่อวงจรโดยใช้ ATtiny85 บนเบรดบอร์ด จะต้องมีการเชื่อมต่อสายสัญญาณกับอุปกรณ์ ISP/ICSP Programmer เพื่อใช้ในการอัปโหลดโปรแกรม และสามารถใช้แรงดันไฟเลี้ยงจากขา VCC (+5V) กับ GND ของอุปกรณ์ดังกล่าวได้
รูป: ตัวอย่างการต่อวงจรโดยใช้ชิป ATtiny85 บนเบรดบอร์ด และเชื่อมต่อกับอุปกรณ์ USBasp หรือ Arduino ISP
รูป: การคอมไพล์โค้ดตัวอย่างและอัปโหลดไปยังบอร์ด Arduino Uno เปลี่ยนเป็นอุปกรณ์ Arduino ISP
รูป: บอร์ด Arduino Uno ที่ถูกโปรแกรมและใช้งานเป็น Arduino ISP (ซ้ายมือ) และ ATtiny85 บนเบรดบอร์ด (ขวามือ)
ข้อสังเกต:
- ATtiny85 จะถูกโปรแกรมให้ทำงานด้วยความถี่ 1MHz (Internal) แต่ถ้าจะใช้ความถี่เป็น
8MHz (Internal) ให้ทำขั้นตอน Burn Bootloader โดยใช้ Arduino IDE / avrdude เพื่อเขียนค่า Fuse Low Byte ให้ถูกต้อง และเป็นการปรับค่าตัวหารความถี่ของ Clock Source
(
CKDIV8=0
)
รูป: การอัปโหลด Arduino Sketch ไปยัง ATtiny85 (Target MCU) โดยใช้บอร์ด Arduino Uno เป็นอุปกรณ์ Arduino ISP
คำแนะนำ
- ให้ใช้ซอฟต์แวร์ Tinkercad หรือ Wokwi Simulator เพื่อเขียนโค้ดและจำลองการทำงาน ตรวจสอบความถูกต้อง จนมั่นใจแล้วว่าถูกต้อง จึงนำไปทดสอบกับอุปกรณ์จริง
- เมื่อต้องการอัปโหลดโปรแกรมไปยัง ATtiny85 ด้วยวิธี ICSP (โดยใช้อุปกรณ์ USBasp หรือ Arduino ISP) ซึ่งต้องใช้ขา I/O ที่เกี่ยวข้องหลายขา ไม่ควรต่อใช้งานขา I/O กับวงจรอื่นในขณะอัปโหลดโปรแกรม ดังนั้นควรแยกวงจรสำหรับอัปโหลดโปรแกรมจากวงจรที่ใช้งานในการทดลอง
- เมื่ออัปโหลดโปรแกรมไปยัง ATtiny85 ได้สำเร็จแล้ว จึงนำไปใส่ลงในวงจรสำหรับการทดลองที่ได้เตรียมไว้
▷ ตัวอย่างโค้ด: การอ่านค่าอินพุตแบบแอนะล็อก#
ถัดไปเป็นตัวอย่างการอ่านค่าจากช่องสัญญาณอินพุตแบบแอนะล็อก เช่น ขา PB2 / ADC1
โดยใช้คำสั่ง analogRead()
ของ Arduino API ซึ่งจะได้ค่าที่เป็นเลขจำนวนเต็มขนาด 10 บิต
ในช่วง 0..1023 แล้วเก็บไว้ในตัวแปร value
และนำค่าไปเปรียบเทียบกับค่าคงที่
เช่น ถ้าค่าที่อ่านได้มากกว่า THRESHOLD_VALUE
จะได้ลอจิกเป็น 1 แต่ถ้าไม่ใช่ จะได้ค่าลอจิกเป็น 0
ผลลัพธ์นี้นำไปใช้กับเอาต์พุตที่ขา PB0 สำหรับวงจร LED
#define LED_PIN (0) // D0 or PB0 pin
#define ADC_PIN (A1) // A1 or PB2 / ADC1 pin
#define THRESHOLD_VALUE (511)
void setup() {
pinMode( LED_PIN, OUTPUT );
}
void loop() {
// read an analog value from the ADC pin
int value = analogRead( ADC_PIN );
// compare the analog input value with the threshold value
// and use the result to update output
digitalWrite( LED_PIN, value > THRESHOLD_VALUE );
delay(10);
}
หากต่อวงจรและจำลองการทำงานด้วย WokWi Simulator ก็สามารถเลือกใช้โมดูลที่ให้สัญญาณเอาต์พุตแบบแอนะล็อก เช่น
- โมดูลที่มีตัวต้านทานปรับค่าได้และต่อใช้งานเป็นวงจรแบ่งแรงดันไฟฟ้า (Voltage Divider)
- โมดูลเซนเซอร์แสงที่ใช้ตัวต้านทานไวแสง หรือ LDR (Light Dependent Resistor) ต่ออนุกรมกับตัวต้านทานให้เป็นวงจรแบ่งแรงดันไฟฟ้า
รูป: การอ่านค่าจากโมดูลที่มีตัวต้านทานปรับค่าได้
รูป: การอ่านค่าจากโมดูลเซ็นเซอร์แสงที่ใช้ LDR
ลองมาดูตัวอย่างโมดูลตรวจจับการเปลี่ยนแปลงความเข้มแสง โดยใช้ LDR ต่ออนุกรมกับตัวต้านทานคงที่ (เช่น 10kΩ) และให้เอาต์พุตแบบแอนะล็อก (ขา A0)
LDR จะให้มีค่าความต้านทานมากขึ้นเมื่อความเข้มแสงลดลง ในวงจรตัวอย่าง ถ้าแสงน้อยลง จะทำให้ได้เอาต์พุต-แอนะล็อกมีค่ามากขึ้น (ระดับแรงดันไฟฟ้าสูงขึ้น)
โมดูลนี้มีไอซี LM393 Voltage Comparator สำหรับเปรียบเทียบแรงดันที่ได้จากวงจร LDR กับแรงดันอ้างอิง (ปรับระดับได้โดยใช้ตัวต้านทานปรับค่าได้หรือ Trimpot) และให้เอาต์พุตแบบดิจิทัล (ขา D0)
โมดูลมีขาเชื่อมต่อดังนี้
- VCC (+5V)
- GND
- D0 (Digital output signal)
- A0 (Analog Output Signal)
รูป: ตัวอย่างอุปกรณ์ Light Sensor Module ที่ให้เอาต์พุตทั้งแบบแอนะล็อกและดิจิทัล
จากโค้ดตัวอย่าง เราอาจจะปรับเปลี่ยนพฤติกรรมการทำงานใหม่ เช่น ให้สร้างสัญญาณ PWM (Pulse Width Modulation) ที่มีความถี่คงที่ แต่ปรับเปลี่ยนค่า Duty Cycle ได้
คำสั่งของ Arduino API สำหรับสร้างสัญญาณ PWM คือ analogWrite()
ใช้กับค่าที่เป็นเลขจำนวนเต็มในช่วง 0..255
#define LED_PIN (0) // PB0 pin
#define ADC_PIN (A1) // PB2/ADC1 pin
void setup() {
pinMode( LED_PIN, OUTPUT );
}
void loop() {
// read an analog value from the ADC pin
int value = analogRead( ADC_PIN );
// map the value from 0..1023 to 0..255
value = map( value,0,1023,0,255 );
// update PWM output
analogWrite( LED_PIN, value );
delay(10);
}
รูป: การทดลองต่อวงจรโดยใช้ตัวต้านทานปรับค่าได้ (Potentiometer) สร้างสัญญาณแอนะล็อกป้อนให้ ATtiny85
▷ กล่าวสรุป#
บทความนี้ได้นำเสนอการใช้งานไมโครคอนโทรลเลอร์ ATtiny85 ที่มีขนาดเล็ก ใช้ตัวถังแบบ DIP-8 สามารถนำไปต่อใช้งานบนเบรดบอร์ดได้ง่าย และสามารถเขียนโปรแกรมโดยใช้คำสั่งของ Arduino ได้ มีซอฟต์แวร์อย่างเช่น Tinkercad Circuits และ Wokwi Simulator ที่สามารถจำลองการทำงานของโปรแกรมได้เสมือนจริง ดังนั้นผู้ใช้สามารถทดสอบการทำงานของโค้ดก่อนที่จะนำไปใช้กับอุปกรณ์จริง
เอกสารสำหรับศึกษาเพิ่มเติม: Arduino_ATTiny85_Coding.pdf
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
Created: 2022-06-11 | Last Updated: 2022-06-12