วันเสาร์ที่ 8 สิงหาคม พ.ศ. 2558

เล่นกับ LCD LiquidCrystal, 1602 LCD (Blue Screen) 16x2 LCD with backlight of the LCD screen

มาดูอุปกรณ์ที่ต้องใช้กันเลยดีกว่า

1. Arduino UNO R3 Board
2. LCD Screen (compatible with Hitachi HD44780 driver)
3. pin headers to solder to the LCD display pins
4. 10k Potentiometer
5. 10K Resister
6. breadboard
7. hook-up wire

ที่นี้เรามาดูวิธีการต่อวงจรกัน ตามภาพนี้เลยครับ


LCD
Arduino
LCD
Arduino
1 GND
GND
9 DB2
Not connected
2 VDD
5V
10 DB3
Not connected
3 V0 (Contrast)
VR 10K
11 DB4
PIN 2
4 RS
PIN 0
12 DB5
PIN 5
5 RW
GND
13 DB6
PIN 6
6 E (Enable)
PIN 1
14 DB7
PIN 7
7 DB0
Not connected
15 A (Back LED+)
Resister 10K to 5V
8 DB1
Not connected
16 K (Back LED-)
GND

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

/*
  LiquidCrystal Library - Hello World
 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the 
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.
 This sketch prints "Hello World!" to the LCD
 and shows the time.
  The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe
 modified 25 July 2009
 by David A. Mellis
 http://www.arduino.cc/en/Tutorial/LiquidCrystal
 */

// include the library code:
#include "Wire.h"
#include "LiquidCrystal.h"

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(0, 1, 2, 5, 6, 7);

void setup() {
  // set up the LCD's number of rows and columns: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis()/1000);
}

โปรแกรมนี้เป็นตัวอย่างจากเว็ป http://www.arduino.cc/en/Tutorial/LiquidCrystal
ท่านสามารถเข้าไปดูรายละเอียดอื่นเพิ่มเติมได้จากเว็ปนี้
ถ้าหากมีข้อสงสัยเกี่ยวกับการใช้ VR ให้ท่านอ่านทำความเข้าใจได้จากบทความนี้ครับ http://berryduino.blogspot.com/2015/07/analog-arduino.html

วันศุกร์ที่ 10 กรกฎาคม พ.ศ. 2558

ตอนที่9 การอ่านค่า Digital ของ Arduino

สัญญาณ Digital นั้นมีแค่สองค่านะครับ คือ 0 กับ 1 ง่ายแค่นี้แหละครับจบ ไม่ต้องงงครับมาดูความหมายนี้กันต่อครับ ที่สัญญาณ Digital มีค่าเป็น 0 ความหมายคือ มันมีปริมาณไฟเป็น 0 Volt ครับ และที่สัญญาณ Digital มีค่าเป็น 1 หมายความว่า มีปริมาณไฟเป็น 5 Volt ครับ
คราวนี้เรามาดูวิธีการอ่านค่า Digital กันเลยดีกว่า ซึ่งเราจะใช้อุปกรณ์ดังนี้
1. สวิทช์กดติด ปล่อยดับ จำนวน 1 ตัว
2. ตัวต้านทาน 10K Ω จำนวน 1 ตัว (โดยทั่วไปเค้าจะนิยมใช้ 5K – 20K Ω ครับ)
3. สายไฟ
4. บอร์ดทดลอง
อุปกรณ์ตัวสำคัญที่ใช้สำหรับอ่านค่า Digital คือ เจ้าสวิทช์กดติด ปล่อยดับ นี่แหละครับ พอเรากดปุ่มสวิทช์มันก็จะส่งสัญญาณ Digital ออกมาเป็น 1 แล้วพอเราปล่อยมือออกจากสวิทช์มันก็ส่งสัญญาณ Digital ออกเป็น 0
เรามาดูวิธีการต่อวงจรกันเลยดีกว่า

จากรูปการต่อวงจร เจ้าตัวสวิทช์มันต้องการไฟ 5V ซึ่งต่ออยู่ที่ขาทางขวาของสวิทช์ ที่นี้มาดูขาของสวิทช์ทางซ้ายกัน ดูที่สายไฟเส้นสีเขียวก่อน เส้นสีเขียวนี้เราเอาไว้สำหรับให้ส่งสัญญาณไปบอก Arduino ถ้าท่านกดปุ่มอยู่ก็จะส่งสัญญาณ Digital เป็น 1 ไป ถ้าท่านไม่ได้กดปุ่มอยู่ ก็จะส่งสัญญาณ Digital ออกไปเป็น 0 ที่ก็เป็นหน้าที่ของท่านละ ว่าเมื่อเวลากดปุ่มสวิทช์แล้วจะให้มันทำอะไรต่อ
คราวนี้มาดูที่สายไฟสีดำซึ่งเป็น Ground ต่ออยู่กับตัวต้านทาน การต่อแบบนี้เค้าเรียกว่าการต่อวงจรแบบ Pull Down Resistor คราวนี้มาดูการเขียนโปรแกรมสำหรับอ่านค่าการกดปุ่ม หรือไม่ได้กดปุ่ม Switch และผลลัพธ์กัน

void setup() {
  pinMode(2, INPUT);
  Serial.begin(9600);
}

void loop() {
  int stateButton;
  stateButton = digitalRead(2);
  Serial.println(stateButton);
  delay(500);
}

ผลลัพธ์จากการต่อวงจรแบบ Pull Down Resistor

(ภาพ ผลที่ได้จากการต่อวงจรแบบ Pull Down Resistor)

จากผลลัพธ์ที่ได้ในตอนแรกค่าที่ได้เป็น 0 ซึ่งยังไม่มีการกดปุ่ม switch พอเรากดปุ่ม switch ค่าที่ได้จะเป็น 1 ซึ่งสรุปได้ว่าการต่อวงจรแบบ Pull Down Resistor จะทำงานที่ Active เป็น HIGH ครับ
ที่นี้ผมจะขอย้อนกลับไปอธิบายโปรแกรม
ในส่วนของ function setup() ก็มี 2 คำสั่ง

pinMode(2, INPUT);
บรรทัดนี้คือเป็นการบอกว่าให้รับค่าการกดปุ่มที่ PIN 2

Serial.begin(9600);
บรรทัดนี้เป็นการกำหนดให้ Serial Port รับส่งข้อมูลกันที่ความเร็ว board rate 9600

ต่อมาในส่วนของ function loop()
int stateButton;
ประกาศตัวแปรชื่อ stateButton เป็นแบบ integer
stateButton = digitalRead(2);
เราใช้คำสั่ง digitalRead(2) คำสั่งนี้ใช้สำหรับอ่านค่า digital จากขา(PIN) ที่เราต้องการ แล้วนำไปเก็บลงตัวแปร stateButton 

Serial.println(stateButton);
บรรทัดนี้ก็สั่งให้ปริ้นค่า digital ที่อ่านได้ออกทาง serial monitor

คราวนี้เรามาดูวิธีการต่อวงจรกันอีกแบบครับ เป็นการต่อวงจรแบบ Pull Up Resistor ซึ่งเป็นที่นิยมมากกว่าในการนำไปใช้งาน

ต่อมาเรามาดูโปรแกรมกันเลยครับ

void setup() {
  pinMode(2, INPUT);
  Serial.begin(9600);
}

void loop() {
  int stateButton;
  stateButton = digitalRead(2);
  Serial.println(stateButton);
  delay(500);
}

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

(ภาพ ผลที่ได้จากการต่อวงจรแบบ Pull Up Resistor)

รูปด้านบนเป็นผลลัพธ์ที่ได้จากการต่อวงจรแบบ Pull up resistor ท่านเห็นอะไรไหมครับ พอเราเปิด Serial Monitor ขึ้นปั๊บ ก็จะเห็นเลข 1 เรียงลงมาเลย แล้วต่อมาก็ตามมาด้วยเลย 0 เลข 1 ที่ท่านเห็นคือสถานะของ Switch ที่ยังไม่ได้กดปุ่มนะครับ พอผมกดปุ่ม Switch ปั๊ม ก็จะได้เลข 0 เรียงลงมา

ผมขอชี้ให้ท่านเห็นอะไรบางอย่าง ผมขอให้ท่านกลับไปรูปผลลัพธ์ที่ได้จากต่อวงจรแบบ Pull Down Resistor ก่อนครับ ท่านจะเห็นว่า ในตอนเริ่มต้นนั้นยังไม่ได้ทำการกดปุ่ม Switch ผลที่ได้เราจะได้ค่าสถานะของ Switch เป็น 0 พอกดปุ่ม Switch ผลที่ได้ เป็น 1 การเขียนโปรแกรมก็จะเขียนโปรแกรมเมื่อวงจรมีสถานะเป็น Active High

ที่นี้พอเรามาต่อวงจรแบบ Pull Up Resistor ผลที่ได้จากค่าสถานะของ Switch ก็จะกลับกันครับ การเขียนโปรแกรม ก็จะเขียนโปรแกรมเมื่อวงจรมีสถานะเป็น Active Low

คราวนี้เรามาดูวิธีการประยุกต์ใช้งาน เอาง่ายก่อนนะครับ เพราะการเรียนรู้จากพื้นฐานที่ไม่ซับซ้อน ง่ายๆ จะทำให้ท่านเข้าใจได้เร็วขึ้น เมื่อท่านเข้าใจพื้นฐานแล้ว ท่านจะนำไปต่อยอดได้เร็วขึ้นครับ มาดูโจทย์กันก่อนดีกว่า โดยผมจะกำหนดโจทย์ว่า พอกดปุ่ม Switch ก็ให้ LED สว่าง พอปล่อยก็ให้ LED ดับ ต่อวงจรตามนี้เลยนะครับ


จากรูปด้านบนผมนำมาประยุกต์ใช้งานกับ Pull Up Resistor นะครับ ทีนี้มาดูโปรแกรมกันต่อเลยครับ

void setup() {
  pinMode(2, INPUT);
  pinMode(7, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int stateButton;
  stateButton = digitalRead(2);
  if (stateButton == LOW) {
    digitalWrite(7, HIGH);
  }
  else {
    digitalWrite(7, LOW);
  }
  Serial.println(stateButton);
  delay(500);
}

จากรูปการต่อวงจร ผมได้เพิ่ม LED เข้าไป ตามโจทย์ โดยจะให้ LED เป็น วงจร OUTPUT ซึ่งผมต่อไว้กับขาที่ 7 ของ Arduino จากโปรแกรมผมขอไม่อธิบายการทำงานเบื้องต้นแล้วนะครับ เพราะผมได้อธิบายไปหมดแล้วในตอนต้น ซึ่งในวงจรนี้มีแค่การเพิ่ม LED เข้ามา 1 ดวง ให้ท่านมาดูที่หัวใจของโปรแกรมกันเลยดีกว่าครับ ผมจะยกเอาแค่ส่วนนี้มาอธิบายนะครับ

  if (stateButton == LOW) {
    digitalWrite(7, HIGH);
  }
  else {
    digitalWrite(7, LOW);
  }

อธิบายง่ายๆ เลย ถ้า stateButton มีค่าเท่ากับ LOW ก็ให้ LED สว่าง ถ้าไม่ใช่มันก็จะมาตกที่ else คือทำงานในคอกของ else {} เครื่องหมายปีกกาเปิด-ปิด นี่แหละครับผมเรียกมันว่าคอก ในคอกของ else มีอยู่คำสั่งเดียวคือ 
digitalWrite(7, LOW);
คำสั่งนี้คือ ให้ Arduino ไม่ต้องจ่ายไฟออกมา ซึ่งจะทำให้ LED ดับนั่นเอง

ในตอนแรกเราได้ทดลองอ่านค่าสถานะของ Switch แล้วใช่ไหม นี่แหละครับพอเราอ่านค่ามันออกมาได้แล้ว ค่าที่เราได้จากสถานะของ Switch มี 0 กับ 1, 0 ก็คือ LOW, 1 ก็คือ HIGH ครับ ทีนี้เราก็จะนำมาเขียนโปรแกรมต่อก็ได้แล้ว และจากการนำมาประยุกต์ใช้งาน ผมนำเอาวงจรแบบ Pull Up Resistor มายกตัวอย่างการนำไปใช้งาน และที่ผมได้บอกไปว่า วงจรแบบ Pull Up Resistor เวลาเขียนโปรแกรม เราต้องเขียนโปรแกรม Active LOW ครับ ก็ตาม CODE ที่ได้ยกตัวอย่างไปนั่นแหละครับ