ติดต่อผู้เขียน

บทความนี้ กล่าวถึง arduino uno เป็นส่วนใหญ่ โดยพัฒนาผ่าน windows

ท่านสามารถติดต่อผู้เขียนได้ โดยผ่านทาง niran@flowco.co.th
หรือ https://www.facebook.com/kongimi

วันศุกร์ที่ 19 กันยายน พ.ศ. 2557

ทดลอง serial

สวัสดีครับพี่น้อง

วันนี้ผมได้รับมอบหมายงานเร่งด่วนมา ก็เลยต้องลุกขึ้นมาทำทันที(แต่ก็ยังมีเวลามาเขียนบทความ 55)
เนื่องจากในเนื้องานมีความจำเป็นต้องใช้ serial ที่มีความเร็วไม่ปกติ (non-standard baud-rate)
มีหน่วยเป็น bit per second (bps) จึงได้ค้นหาข้อมูลในอากู๋เหมือนเดิม

ก็ได้เห็นตัวอย่างในการเขียนดังนี้

ปกติ arduino จะมีขา 0 และ 1 สำหรับ serial มาให้อยู่แล้ว แต่ในกรณีที่เราอาจจะจำเป็นต้องใช้ serial เพิ่มเติม(ช่องที่2) ก็จะมีขา 10 และ 11 ไว้ให้ใช้เป็น serial ได้เหมือนกัน

โดยมี source code ดังนี้

/*
  Software serial multple serial test
 
 Receives from the hardware serial, sends to software serial.
 Receives from software serial, sends to hardware serial.
 
 The circuit: 
 * RX is digital pin 10 (connect to TX of other device)
 * TX is digital pin 11 (connect to RX of other device)
 
 Note:
 Not all pins on the Mega and Mega 2560 support change interrupts, 
 so only the following can be used for RX: 
 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
 
 Not all pins on the Leonardo support change interrupts, 
 so only the following can be used for RX: 
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
 
 created back in the mists of time
 modified 25 May 2012
 by Tom Igoe
 based on Mikal Hart's example
 
 This example code is in the public domain.
 
 */

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup()  
{
  // Open serial communications and wait for port to open:
  Serial.begin(57600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(4800);
  mySerial.println("Hello, world?");
}

void loop() // run over and over
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

จากตัวอย่าง source code ด้านบน
softwareserial myserial(10,11); ตั้งให้ขา 10 และ 11 ให้เป็น rx, tx โดยใช้ชื่อว่า myserial
serial.begin(57600); เป็นการตั้งค่า serial port ที่ต่อกับ usb
myserial.begin(4800); ตั้งค่า serial อีกช่องหนึ่ง
โดยใน loop มีการเขียนโปรแกรมวนไม่สิ้นสุด
ถ้า myserial มีค่าที่รับได้ ก็จะส่งออกที่ serial
ถ้า serial มีค่าที่รับได้ ก็จะส่งออกที่ myserial พูดง่ายๆคือ รับได้ช่องนึง ส่งออกอีกช่องนึง

แล้วก็ step เดิม ไปที่ menu
sketch - verify/compile
file - upload
tools - serial monitor

เราก็จะเห็นคำว่า "Goodnight moon!"

ที่เราทำอยู่ในขณะนี้คือข้อมูลที่ออกมาจากตัวแปลที่ชื่อ Serial ที่เราต่อผ่าน usb port
ส่วนอีก port นึง ขา 10, 11 สัญญาณที่ออกมาจากขาทั้ง 2 ยังเป็นระดับ TTL อยู่ คือระดับ 0-5 Volt
เราจำเป็นต้องต่อเข้าไอซี max232 เสียก่อน จึงจะสามารถส่งข้อมูลเข้า comport ได้

บอร์ดที่เห็นในภาพ เป็นบอร์ดที่ผมทำเอง ซึ่งก็เป็นแค่วงจร 232 ตามปกติ
ทีนี้เราก็สามารถต่อ myserial เข้ากับ comport ของเราได้แล้ว


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


ให้เราเปิดโปรแกรม serial monitor พร้อมกับโปรแกรมแสดงผล serial ขึ้นมาพร้อมกัน

จากนั้นลองใส่ค่าอะไรก็ได้ลงไปในช่องที่อยู่ด้านบนของ serial monitor

แล้วกด send เราก็จะเห็นว่าข้อมูลถูกส่งออกไปอีก port นึง แล้วไปแสดงให้เห็นในโปรแกรมแสดงผล comport อีกด้านนึง

ในรูปจะเห็นได้ว่าข้อมูลถูกส่งมาไม่ครบ อาจจะเป็นเพราะว่าผู้เขียนไม่ได้ใช้ interrupt ในการรับค่า จึงทำให้ค่าบางค่าหายไป
และเมื่อเราลองส่งข้อมูลจากโปรแกรมแสดงผล comport ไปยัง serial monitor ก็สามารถทำได้ ไม่มีปัญหา


และเพื่อให้ได้ตรงตามเป้าหมายที่เราตั้งไว้ ก็คือ สามารถสื่อสารโดยใช้ non-standard baudrate ได้
ผู้เขียนจึงได้ปรับ baudrate ที่โปรแกรมแสดงผล serial และปรับเปลี่ยน code ให้เป็น baudrate เดียวกัน
แต่ว่าทดลองหลายรอบแล้ว ไม่สำเร็จ ก็เลยปรับเปลี่ยนยุทธวิธีใหม่ คือ

ลองใช้ขา 0 และ 1 เป็น non-standard baudrate แทน และใช้ขา 10, 11 เป็น standard baudrate
ได้ผลว่าสามารถใช้งานได้ตามเป้าประสงค์ 100%

และจากการทดสอบหลายๆครั้ง พบว่า ขา 0,1 จะสามารถรับข้อมูลได้ครบถ้วนกว่าขา 10, 11

ตัวอย่าง source code ครัช
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(5760);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  Serial.println("Goodnight moon!");
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}

void loop() // run over and over
{
  if (mySerial.available())
    mySerial.write(mySerial.read());
  if (Serial.available())
    Serial.write(Serial.read());
}

ที่มา
http://arduino.cc/en/Tutorial/SoftwareSerialExample
http://arduino.cc/en/Serial/begin

วันเสาร์ที่ 13 กันยายน พ.ศ. 2557

ทดลอง a2d

สวัสดีครัชพี่น้อง

วันนี้ก็วันอาทิตย์ ที่ดูเหมือนจะเป็นวันว่างงาน แต่ก็ยังมีภาระมากมายรออยู่เต็มไปหมด เลยอยู่นิ่งๆไม่ได้ ต้องมาเขียนบทความสักหน่อย :)

คราวที่แล้วลอง GPIO ไปแล้ว วันนี้เลยมาลอง a2d ดีกว่า
ก่อนอื่นก็ต้องเปิด arduino.exe ขึ้นมาก่อน
จากนั้นไปที่ menu file - examples - 01basic - AnalogReadSerial


เราก็จะได้ code ตามภาพที่2

จากนั้นก็สเต็ปเดิมครับ menu sketch - verify/compile
menu tools - board - arduino uno (เลือกตามบอร์ดที่เราเล่นนะครัช)
menu tools - serial - com3 (เลือกตาม comport ที่เราต่อไว้นะครัช)
menu file - upload

ตอนนี้บอร์ดของเราก็ทำงานโดยการอ่านค่า analogA0 แล้วส่งค่ามายัง serial port
แต่ด้วยความที่ผมไม่ได้เล่นมาสักพักนึง อ่าว แล้วเราจะดูค่าได้ยังไงนะ ต่อขาไหนนะ งงอยู่พักนึง
ก็ได้คำตอบจากบล็อกตัวเองนี่แหละ
ก็ต้องดูก่อนว่าขา A0 อยู่ตรงไหน


แล้วต่อขา A0 เข้ากับ ground

จากนั้นไปที่ tools - serial monitor หรือกด ctrl+shift+m


เราจะเห็นเลขศูนย์วิ่งอยู่ตลอด เพราะว่าเราต่อ A0 กับกราวด์ ซึ่งมี 0 โวลต์อยู่
ก็เลยอยากลองเอา A0 ต่อกับ 5V ดูบ้าง แต่ถ้าต่อตรงๆกลัวว่าบอร์ดจะพัง ก็เลยเอา r มาอนุกรมไว้ก่อน ค่าประมาณ 240โอห์ม

ค่าที่อ่านได้จะอยู่ที่ประมาณ 1022-1023

ที่อ่านได้ 1023 เนื่องจากเป็น a2d 10bit (2ยกกำลัง10) ค่าที่อ่านได้มีค่าตั้งแต่ 0 - 1023 (1024ค่า)
วันนี้ก็ทดลองกันเบาๆนะครับ วันหน้าเดี๋ยวลองอย่างอื่นต่อ

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

ทดลอง I/O port

สวัสดีครัชพี่น้อง

  วันนี้ได้ทดลองเล่น arduino uno โดยควบคุม I/O port ตามปกติ ง่ายๆทั่วไป
  โดยเอามาต่อกับ Isolate Relay สำเร็จรูป ดังรูป


รูปที่ 1 ต่อ Isolate Relay กับ Arduino

โดยบอร์ด Relay ที่ซื้อมานี้ จะแสดงผล LED ให้สว่างเมื่อมีการสั่ง on Relay และไม่สว่างเมื่อ off ทำให้สังเกตได้ง่ายว่า Relay ทำงานอยู่หรือไม่

 และได้เขียน code ต่อไปนี้

int Relay1 = 12;
int Relay2 = 13;
// the setup routine runs once when you press reset:
void setup()
{
// initialize the digital pin as an output.
pinMode(Relay1, OUTPUT);
pinMode(Relay2, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop()
{
digitalWrite(Relay1, HIGH); // turn the RELAY on(HIGH is the voltage level)
digitalWrite(Relay2, HIGH);
delay(1000); // wait for a second
digitalWrite(Relay1, LOW); // turn the RELAY off by making the voltage LOW
digitalWrite(Relay2, LOW);
delay(1000); // wait for a second
}
รูปที่ 2 Relay ทำงานปกติ

ก็สามารถสั่งงานได้ปกติ เมื่อต่อ vcc 5V
ด้วยความนึกสนุก ลองใช้ vcc 3.3V แทน ก็สั่งงานได้เหมือนกัน แต่รู้สึกเหมือนว่าจะสั่งงานได้ช้ากว่า 5V นิดหน่อย เพราะว่าเสียงของ Relay ที่เปิด/ปิด ฟังได้ชัดเจนว่า เปิด/ปิด ไม่พร้อมกัน ไม่เหมือน 5V เปิด/ปิด พร้อมกันเป๊ะ

และเหลือบไปเห็น port A0-A5 ซึ่งเป็น port Analog to Digital (แปลงสัญญาณจาก Analog เป็น Digital)
ก็คิดว่าเราสามารถนำมาใช้เป็น I/O port ตามปกติได้หรือไม่
ทดลองครั้งแรก ปรากฎว่าใช้งานไม่ได้ :(
ก็เลยไป search หาข้อมูลจากอากู๋ ดู (http://forum.arduino.cc/index.php/topic,158910.0.html) ได้ผลว่าจริงๆแล้วเราต้องสั่งงานที่ขา 18, 19 ไม่ใช่ 27, 28 ซึ่งก็ยังไม่เข้าใจอยู่ดีว่าทำไมถึงเป็น pin 18,19 ท่านใดรู้ช่วยตอบหน่อยนะคร้าบบบ
รูปที่ 3 ต่อ Relay กับขา 18,19
int Relay1 = 18;
int Relay2 = 19;
// the setup routine runs once when you press reset:
void setup()
{
// initialize the digital pin as an output.
pinMode(Relay1, OUTPUT);
pinMode(Relay2, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop()
{
digitalWrite(Relay1, HIGH); // turn the RELAY on(HIGH is the voltage level)
digitalWrite(Relay2, HIGH);
delay(1000); // wait for a second
digitalWrite(Relay1, LOW); // turn the RELAY off by making the voltage LOW
digitalWrite(Relay2, LOW);
delay(1000); // wait for a second
}

วันอังคารที่ 5 สิงหาคม พ.ศ. 2557

เริ่มต้น arduino

สวัสดีครับ ทุกท่าน

หลังจากที่เราได้เรียนรู้ Linux Embedded Board กันไปแล้ว ไม่ว่าจะเป็น Raspberry Pi หรือ Beagle bone black ทีนี้ก็ได้เวลาของบอร์ดเล็กบอร์ดน้อยที่สามารถนำมาใช้งานได้หลากหลาย ตามความต้องการของผู้เล่น นั่นก็คือ ไมโครคอนโทรลเลอร์ Arduino

รูปที่ 01 Logo


รูปที่02 บอร์ด Arduino

สำหรับผู้ที่ยังไม่ค่อยเข้าใจว่าไมโครคอนโทรลเลอร์คืออะไร จะขออธิบายแบบย่อๆให้อ่านกันก่อน
ไมโครคอนโทรลเลอร์ ถ้าเปรียบเทียบกับคน จะมี MCU ที่เปรียบเสมือนสมอง คือทำหน้าที่คิด ประมวลผล มีความจำ แต่ไม่สามารถลงมือทำเองได้ จึงต้องสั่งงานให้ส่วนอื่นๆทำงานแทน, ส่วนวงจรเซนเซอร์ต่างๆที่มาต่อร่วมกัน จะทำงานเป็นหู เป็นตา เป็นมือ เป็นเท้า ให้กับ MCU เรียกรวมๆทั้งหมดนี้ว่า ไมโครคอนโทรลเลอร์
Arduino คือ บอร์ดไมโครคอนโทรลเลอร์ ตระกูล AVR ที่มีการพัฒนาแบบ open source คือ เปิดเผยทั้ง software และ hardware
ต้นกำเนิดของบอร์ด Arduino เริ่มมาจาก ในปี 2005 ชาวอิตาเลียน ที่อยากให้นักศึกษาที่มีเงินไม่มาก ได้เข้าถึง ได้เป็นเจ้าของไมโครคอนโทรลเลอร์ได้ (แนวคิดคล้ายๆผู้คิดค้น Raspberry Pi) ซึ่งเมื่อเปรียบเทียบราคากับไมโครคอนโทรลเลอร์อื่นๆ ก็ถือว่าถูกกว่า
ไม่ใช่เพียงแค่ราคาที่ถูกอย่างเดียวเท่านั้น พวกเขายังได้ตั้งใจทำให้ Arduino สามารถพัฒนาได้ด้วยโปรแกรมที่ แจกฟรีเนื่องจากไมโครคอนโทรลเลอร์อื่นๆ บางครั้งต้องใช้โปรแกรมที่มีราคาแพง นำศึกษาไม่สามารถเป็นเจ้าของเองได้ (ก็เลยต้อง hack!!!)
                บอร์ด Arduino มีหลายรุ่นหลายขนาด ยกตัวอย่าง เช่น UNO, Leonardo, micro, pro mini, BT, Mega2560 เป็นต้น ซึ่งแต่ละรุ่น จะมี spec ที่ไม่เหมือนกัน ได้แก่ ขนาด, ความจุ, ความเร็ว, จำนวนขา I/O ผู้เล่นสามารถเลือกให้เหมาะสมกับงานของตัวเองได้ รุ่นที่เห็นว่าได้รับความนิยมในเมืองไทยมากๆ ก็คงจะเป็นรุ่น UNO
รูปที่03 Arduino UNO

รูปที่04 Arduino รุ่นต่างๆ

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

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

รูปที่05 Arduino Shield

                อีกความสามารถนึงของบอร์ด Arduino ที่ทำให้เป็นที่นิยมในวงกว้างก็คือ สามารถเขียนโปรแกรมบน OS ได้หลากหลาย ไม่ว่าจะเป็น Windows, Mac OS X และ Linux ซึ่งถือว่าเป็นจุดขายที่ดีอีกจุดนึง

                จุดเด่นของบอร์ด Arduino
1.                รูปแบบคำสั่งพื้นฐานง่าย เหมาะกับผู้เริ่มต้น
2.               มี community มากมาย ศึกษาหาข้อมูลได้ง่าย
3.               Open hardware ทำให้ต่อยอดได้ง่าย
4.               พัฒนาโปรแกรมได้จากหลาย OS
5.               ราคาไม่แพง

ก่อนอื่นก็ต้องมาทำความรู้จักบอร์ดกันก่อน
ผู้เขียนได้รับความอนุเคราะห์จากอาจารย์ของมหาวิทยาลัยเทคโนโลยีพระจอมเกล้าพระนครเหนือ มอบบอร์ด Arduino UNO มาให้ทดลองเล่น ขอขอบคุณ ณ ที่นี้ด้วยครับ


รูปที่06 Arduino UNO

เริ่มจากด้านซ้ายก่อน วนไปด้านบน (ตามเข็มนาฬิกา)
1.               USB plug ไว้ใช้สำหรับต่อสาย USB จากเครื่องคอมพิวเตอร์ที่ใช้เขียน code ของเรา เพื่อ upload code ไปที่บอร์ด
2.               Pin header ด้านบน ผู้เขียนขอเรียกรวมๆว่า Digital I/O pin นะครับ
3.               ถัดมาเป็น switch reset เอาไว้ reset บอร์ด
4.               In Circuit Serial Programming (ICSP) เป็น port ที่ใช้โปรแกรม Boot loader
5.               ATmega328 คือ chip ที่ทำการ run program หรือที่เรียกกันว่า MCU
6.               Analog in pin คือ ช่องที่ใช้รับสัญญาณ Analog
7.               External  power supply เอาไว้ต่อแหล่งจ่ายไฟจากภายนอก

มาเริ่มเล่นกันดีกว่า มี step ดังต่อไปนี้
1.               แน่นอนต้องมีบอร์ด Arduino และสาย USB
2.               Download Arduino Environment ได้ที่นี่ http://arduino.cc/en/Main/Software  (ผู้เขียนใช้ windows นะครัช)


รูปที่07 download Arduino IDE

3.               พอเราเสียบสาย USB เข้าเครื่องคอมฯ และ บอร์ด Arduino แล้ว ก็ต้องทำการลง Driver ซึ่ง Driver ก็อยู่ใน Folder ที่เรา download มาจาก step 2
4.               เปิดโปรแกรม arduino.exe
5.               ให้เลือกรุ่นของบอร์ด Arduino ให้ตรง และให้เลือก comport ที่ต่อไว้


รูปที่08 เลือกรุ่น


รูปที่09 เลือก comport

6.               เปิด Example file ที่มีมาให้อยู่ก่อนแล้ว


รูปที่10 เปิด Example file


รูปที่11 blink

7.               กดปุ่ม sketch, verify / compile เพื่อตรวจสอบความถูกต้อง และ compile โปรแกรม
8.               เมื่อ compile เสร็จ จะเห็นคำว่า “done compiling” ที่ด้านล่างของ IDE ถ้าหากไม่มีข้อผิดพลาด


รูปที่12 done compiling

9.               ตอนนี้เราพร้อมจะทำการ upload แล้ว ให้ไปที่ menu file, upload เพื่อส่งโปรแกรมไปยังบอร์ด Arduino เมื่อ upload เสร็จแล้ว เราจะเห็นคำว่า “done uploading” ที่ด้านล่างของ IDE และบอร์ดจะเริ่มทำงานตามที่เราเขียนโปรแกรมไว้ทันที คือจะเห็นไฟ LED สว่าง 1 วินาที สลับกับดับ 1 วินาที


รูปที่13 upload


เพียงเท่านี้เราก็สามารถใช้บอร์ด Arduino UNO เป็นแล้ว ง่ายมากๆเลยใช่มั้ยครับ ขอให้ทุกท่านสนุกกับการพัฒนาอะไรใหม่ๆออกมา เสมอๆนะครับ

ผู้อ่านสามารถพูดคุยกับผู้เขียนได้ที่ https://www.facebook.com/kongimi



ที่มา