การใช้งาน ATtiny85 ด้วย บอร์ด Arduino UNO

การใช้งาน ATtiny85 ด้วย บอร์ด Arduino UNO


AVR เป็นไมโครคอนโทรลเลอร์รุ่นต่อมาที่มีการ พัฒนาต่อมาจาก MCS-51 โดยบริษัท ATMEL อัน เนื่องมาจากว่า MCS-51 ยุคหลังนี้ไม่ค่อยมีคนใช้ งานจริง และมีใช้งานแต่เฉพาะในสถาบันการศึกษา เป็นเช่นนี้ก็เพราะว่าการออกออกแบบวงจรที่ ค่อนข้างยุ่งยาก และต้องอาศัยการต่ออุปกรณ์ร่วม เยอะนั้นเอง

ATtiny85 ไอซีตะกูล AVR


ATtiny85 ไอซีตะกูล AVR ขนาดเล็ก มีพื้นที่โปรแกรม 8KB สามารถใช้บอร์ด Arduino ในการโปรแกรมแบบ ISP ได้ และยังสามารถใช้โค้ด Arduino ในการเขียนโปรแกรมให้ไอซีทำงานได้อีกด้วย มีขา I/O จำนวน 5 ขา สามารถเป็นขาดิจิตอล 3 ขา พร้อมเป็นอินพุตแบบอะนาล็อกด้วย และ มี 2 ขา ที่สามารถสร้างสัญญาณ PWM เหมาะสำหรับการเรียนรู้การใช้งาน ไมโครคอนโทรลเลอร์ AVR ขั้นพื้นฐาน โดยบทความนี้จะแสดงวิธีการ ขั้นตอนการเขียนโปรแกรม ( code ) ลงบน AVR ด้วยการโปรแกรมแบบ  ISP (In System Programming) จาก บอร์ด Arduino UNO


การส่งข้อมูลแบบ บัส SPI (Serial Peripheral Interface Bus)


การส่งข้อมูลแบบ บัส SPI


SPI Bus (Serial Peripheral Interface Bus) เป็นรูปแบบหนึ่งของการสื่อสารข้อมูลระหว่างอุปกรณ์แบบดิจิทัลที่พบเห็นได้บ่อย และใช้กับอุปกรณ์ได้มากกว่าสองขึ้นไปและนำมาต่อกันเป็นบัส (Bus) บัส SPI ส่งและรับข้อมูลทีละบิต (Bit Serial) และใช้สัญญาณ Clock เป็นตัวกำหนดจังหวะการทำงาน (ดังนั้นจึงเรียกว่า Synchronous, Bit-Serial Data Communication) มีการกำหนดบทบาทในการทำงานของอุปกรณ์ในระบบบัส แบ่งเป็น SPI Masterและ SPI Slave โดยที่ SPI Master เป็นฝ่ายเริ่มการสื่อสารข้อมูล และสร้างสัญญาณ Clock (มักใช้ชื่อสัญญาณว่า SCK) มากำหนดจังหวะการส่งและรับข้อมูล และด้าน SPI Slave จะเป็นฝ่ายคอยตอบสนอง และในระบบบัส SPI อาจมีอุปกรณ์ที่เป็น SPI Slaveได้มากกว่าหนึ่ง (Single-Master, Multi-Slave)

http://arduinole.blogspot.com/


การใช้งาน ISP (In System Programming)

  • MOSI == Master Out Slave In: data input
  • MISO == Master In Slave out : data output
  • SCK == Serial ClocK : clock input
  • RST == RESET: used to activate the serial Programming

จากข้างบนจะเห็นว่า ขาที่เป็น MOSI นั้น จะเป็นขาส่งข้อมูลออก ( Output ) ของตัวแม่ ( Master )
MISO นั้น เป็นขาที่รับข้อมูล (Input ) ที่ส่งมาจากลูก ( Slave )
SCK นั้น เป็นตัวนาฬิกาคอยให้จังหวะการส่งข้อมูล
ขาสุดท้ายก็คือ RST นั้น คือตัวที่เริ่มให้มีการเขียนโปรแกรมลง Chip


ขั้นตอนการทำงาน ISP (In System Programming) ผ่าน บัส SPI

การส่งข้อมูลแบบ SPI ของ Arduino UNO

ขั้นตอนการเขียนโปรแกรม ( Code ) ลงบน Chip นั้นจะส่งข้อมูลเป็นแบบ Serial หรือ ISP จะเริ่มต้นทำงานด้วยขณะที่ขา RST ถูกปรับให้มีค่า Logic High ( ระดับสัญญาณ เท่ากับ VCC )

สำหรับขา RST นั้น ปกติ ใช้สำหรับ Reset โปรแกรม กล่าวคือสัญญาณ Reset จะหยุดโปรแกรมและเริ่มต้นการทำงานใหม่ โดยเราทำให้ขา RST มีระดับสัญญาณต่ำ ( Logic Low )

เมื่อขา RST ถูกตั้งให้เป็น High คำสั่งพิเศษที่เรียกว่า Programming Enable Instruction จะทำงานก่อน

การใช้งาน ATtiny85 ด้วย บอร์ด Arduino UNO

สำหรับการรับส่งข้อมูลแบบ Serial คือการส่งข้อมูลจาก Arduino ด้วยช่องสัญญาณเพียงช่องเดียว หรือ ขาสัญญาณขาเดียว ในที่นี้คือขาสัญญาณ MISO และ MOSI

โดยข้อมูลจะส่งผ่าน MOSI ทีละ bit โดยแต่ละ bit สัญญาณจาก SCK จะเป็นตัวควบคุมจังหวะของการรับส่ง และทางขา MISO ใช้สำหรับรับข้อมูลจากลูกส่งกลับไปยังต้วแม่

โดยเริ่มจากข้อมูลใน Chip จะถูกลบหมด (Chip Erase) การลบข้อมูลใน Flash Memory และจะตามด้วยการเขียนค่า เลขฐานสิบหก (Hexadecimal Number) ลงไปในแต่ละตำแหน่งใน Flash หรือ Ram Memory ของ Chip

ความเร็วของสัญญาณนาฬิกา ของ ISP จะถูกกำหนดโดยสัญญาณนาฬิกาอ้างอิงจาก External Clock หรือ Crystal โดยมีข้อกำหนดว่า ความเร็วของขา SCK นั้นจะเร็วไม่เกิน 1/16 ของ ความเร็วของ Crystal ไม่ได้

ฉะนั้น หากระบบของเรา ใช้ Crystal 16 MHz ความเร็วสูงสุดของ SCK ก็จะได้แค่ 1 MHz แค่นั้น

รายการอุปกรณ์


ขั้นตอนการทํางาน

1 : เพิ่มบอร์ด ATtiny85 ให้ Arduino IDE

เพิ่มบอร์ด ATtiny85 ให้กับ Arduino IDE ตามขั้นตอนลิงค์ด้านล่าง


2 : ต่อวงจร ATtiny85 เพื่ออัพโหลดโปรแกรม

มาเริ่มด้วยชิป ATtiny85 กัน นี่คือไมโครคอนโทรลเลอร์ 8 บิตและบางครั้งก็เรียกว่า Arduino ขนาดเล็ก ในการเขียนโปรแกรมชิปนี้เราจำเป็นต้องมีการสื่อสาร SPI โดยใช้ฟังก์ชั่น “micro” จากค้นหาออนไลน์พบว่า ATtiny สามารถใช้ฟังก์ชั่นเหล่านั้นได้เฉพาะกับ Bootloader 8MHz เท่านั้น เราจะสร้าง Shield สำหรับ ATtiny85 ที่สามารถเชื่อมต่อกับ Arduino UNO ตามแผนผังด้านล่าง


เชื่อมต่อ ตัวเก็บประจุ 10 uF (RESET <-> GND)

เชื่อมต่อตัวเก็บประจุ 10 uF ระหว่างขา RESET และ GND บนบอร์ด Arduino Uno ดังแสดงในแผนภาพ แถบของตัวเก็บประจุที่มีเครื่องหมายลบ ( – ) ไปที่ขา GND ของ Arduino สิ่งนี้จะช่วยป้องกัน Arduino Uno จากการรีเซ็ตและทำให้แน่ใจว่า Arduino IDE พูดคุยกับ ArduinoISP (และไม่ใช่ bootloader) ระหว่างการอัพโหลดไปที่ ATtiny85

ATtiny85 เชื่อมต่อ ตัวเก็บประจุ 10 uF


เชื่อมต่อสาย ระหว่าง Arduino UNO กับ ATtiny85

การใช้งาน ATtiny85 ด้วย บอร์ด Arduino UNO



VCC – เชื่อมต่อ Arduino ขา 5V กับ ATtiny85 ขา VCC
GND – เชื่อมต่อ Arduino ขา GND กับ ATtiny85 ขา GND
SCK – เชื่อมต่อ Arduino ขา 13 กับ ATtiny85 ขา PB2
MISO – เชื่อมต่อ Arduino ขา 12 กับ ATtiny85 ขา PB1
MOSI – เชื่อมต่อ Arduino ขา 11 กับ ATtiny85 ขา PB0
RTS – เชื่อมต่อ Arduino ขา 10 กับ ATtiny85 ขา PB5

ATtiny85 Pinout


3 : ต่อวงจร LED เพิ่ม เพื่อทดสอบการทำงาน

ทดสอบการใช้งาน ขา OUTPUT ของ ATtiny85 แบบ Digital โดยสั่งให้ ATtiny85 เปิด/ปิด ไฟ LED

ต่อวงจร LED ATtiny85
การใช้งาน ATtiny85



4. โปรแกรมแรกกับ ATtiny85

ในตัวอย่างนี้ เราจะมาทดลองสั่งงาน เปิด/ปิด หลอดไฟ LED โดยโปรแกรม Blink หรือ ไฟกระพริบ ATtiny85

เซ็ตขา PB4 ของ ATtiny85 ให้เป็นโหมดเอาท์พุท ด้วยคำสั่ง pinMode(4, OUTPUT);

คำสั่ง digitalWrite(4, HIGH); ใช้ในการควบคุม LED โดย HIGH = ไฟติด , LOW = ไฟดับ

คำสั่งหน่วงเวลา delay(500); โดย 500 คือ 500 มิลลิวินาที หรือ 0.5 วินาที และ 1000 คือ 1000 มิลลิวินาที หรือ 1 วินาที


เปิดโปรแกรม Arduino IDE เขียนโปรแกรม ตามโค้ดด้านล่างนี้

void setup()
{
  //The 8-pin ATTinys (25/45/85) all have 5 usable digital output pins 0-4
  pinMode(4, OUTPUT);
}
void loop()
{
  digitalWrite(4, HIGH);  	//Set the LED pins to HIGH. This gives power to the LED and turns it on
  delay(500);  	// Wait for a half a second

  digitalWrite(4, LOW); 	// Set the LED pins to LOW. This turns it off
  delay(1000);    // Wait for a half second
}



ไปที่ Tools -> Board แล้วเลือกให้ตรงกับบอร์ดที่ใช้งาน สำหรับ ATtiny85 ให้เลือกบอร์ดเป็น ATtiny25/45/85

สำหรับ ATtiny85 ให้เลือกบอร์ดเป็น ATtiny25/45/85



ไปที่ Tools -> Processor -> ATtiny85

ไปที่ Tools -> Processor -> ATtiny85


ไปที่ Tools -> Clock -> Internal 8 MHz

ไปที่ Tools -> Clock -> Internal 8 MHz


เลือก Port โดยไปที่ Tools -> Port -> COM14 (Arduino/Genuino Uno)
(โดย COM14 แต่ละเครื่องจะไม่เหมือนกัน ให้เลือกตามที่ปรากฎ)

เลือก Port โดยไปที่ Tools -> Port -> COM (Arduino Uno)


ไปที่ Tools -> Programmer -> Arduino as ISP

ไปที่ Tools -> Programmer -> Arduino as ISP

ไปที่ Tools -> Burn Bootloader

ไปที่ Tools -> Burn Bootloader