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

บทความนี้ กล่าวถึง 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ค่า)
วันนี้ก็ทดลองกันเบาๆนะครับ วันหน้าเดี๋ยวลองอย่างอื่นต่อ