วันพฤหัสบดีที่ 16 กุมภาพันธ์ พ.ศ. 2560


การทดลองใช้งานโมดูล OLED Display ขนาด 128x64 พิกเซล

OLED (Organic Light-Emitting Diode) display เป็นจอแสดงผลกราฟิกประเภทหนึ่งที่สร้างจากวัสดุ "สารกึ่งตัวนำอินทรีย์" (Organic Semiconductor) มีลักษณะเป็นชั้นบางๆ อยู่ระหว่างขั้วบวก (Anode) และขั้วลบ (Cathode) และสามารถเปล่งแสงได้เมื่อมีกระแสไฟฟ้าไหลผ่าน เรียกกระบวนการนี้ว่า อิเล็คโทรลูมิเนเซนส์ (Electroluminescence) จอภาพ OLED มีข้อดีซึ่งแตกต่างจากจอแสดงผล LCD (Liquid Crystal Display) ทั่วไปคือ ไม่ต้องมีวงจรที่สร้างแสง Backlight ดังนั้นจึงมีความหนาน้อยกว่าและเบากว่า ใช้กำลังไฟฟ้าต่ำ นอกจากนั้นจะไม่มีการเปล่งแสงในบริเวณที่ต้องการให้เป็นสีดำ ในปัจจุบันอุปกรณ์อย่างเช่น โทรทัศน์, สมาร์ทโฟน (Smartphones), แท็บเล็ต (Tablets) ได้เริ่มเปลี่ยนไปใช้จอภาพแบบ OLED กันมากขึ้น   บทความนี้กล่าวถึง การทดลองใช้งานโมดูลจอแสดงผลกราฟิกแบบ OLED ขนาดเล็ก ซึ่งมีขนาด 128x64 พิกเซล ให้แสงเพียงสีเดียว (Monochrome) โดยทดลองเขียนโค้ดและใช้งานร่วมกับบอร์ด Arduino และใช้วิธีเชื่อมต่อแบบบัส I2C และ SPI
คำสำคัญ / Keywords: OLED Graphic Display, Arduino, SPI, I2C

โมดูล OLED

โมดูล OLED ที่ได้เลือกมาทดลองใช้งาน สามารถแสดงผลได้แบบสีเดียว (Monochrome) มีขนาดจอภาพ 0.96" ความละเอียด 128x64 พิกเซล ซึ่งถือว่ามีขนาดเล็ก และใช้แรงดันไฟเลี้ยง +3.3V แม้ว่าจะมีขนาดเล็กแต่ก็เหมาะสำหรับนำไปใช้กับระบบ embedded systems ที่ต้องการส่วนแสดงผลกราฟิกขนาดเล็ก มีพื้นที่จำกัด เป็นต้น   ภายในโมดูลมีชิป SSD1306 เป็นตัวควบคุมการทำงาน สามารถเชื่อมต่อกับโมดูลโดยใช้บัส SPI หรือ I2C ถ้าต้องการแสดงข้อความ จะต้องมีข้อมูลสำหรับสร้างตัวอักษร (FONT) แต่ละตัวซึ่งมีลักษณะเป็นแบบ Bitmap เก็บไว้ในหน่วยความจำของไมโครคอนโทรลเลอร์ เช่น เก็บไว้ในหน่วยความจำสำหรับโปรแกรมที่เรียกว่า Program Memory (เป็นแบบ Flash Memory) เพื่อประหยัดการใช้พื้นที่ใน SRAM ของไมโครคอนโทรลเลอร์
การจัดการหน่วยความจำภายในของ SSD1306 ที่เรียกว่า Graphic Display Data RAM (GDDRAM) สำหรับขนาด 128x64 พิกเซล แบ่งเป็น Column และ Page ซึ่งมีทั้งหมด 128 คอลัมน์ (หมายเลข 0..127) และมีทั้งหมด 8 เพจ (หมายเลข 0..7) แต่ละเพจ จะประกอบด้วย 8 บรรทัด ดังนั้นจึงมี 8x8 = 64 บรรทัด (rows)   การแสดงผลของจอภาพขึ้นอยู่กับค่าบิต (0 หรือ 1) สำหรับแต่ละพิกเซลที่ได้เขียนข้อมูลลงในหน่วยความจำ GDDRAM
การสื่อสารข้อมูลกับชิป SSD1306 ทำได้โดยผ่านบัส SPI หรือ I2C โดยต้องส่งคำสั่ง (Command) เพื่อกำหนดค่าต่างๆในการทำงาน (ศึกษารายละเอียดได้จาก Datasheet ของผู้ผลิต) เช่น คำสั่ง turn on/off display คำสั่งเลือกรูปแบบ memory addressing mode คำสั่งกำหนดค่า Start Address และ End Address สำหรับ Column และ Page เป็นต้น และการเขียนข้อมูล (Data) เป็นการเขียนข้อมูลลงใน GDDRAM


รูปแสดงตัวอย่าง 0.96" 128x64 OLED Display Module แบบ I2C (ด้านหน้า)


รูปแสดงตัวอย่าง 0.96" 128x64 OLED Display Module แบบ I2C (ด้านหลัง)
หมายเลขที่อยู่ (7-bit device address) ของโมดูลนี้คือ 0x3C


รูปแสดงตัวอย่าง 0.96" 128x64 OLED Display Module แบบ SPI (ด้านหน้า)


รูปแสดงตัวอย่าง 0.96" 128x64 OLED Display Module แบบ SPI (ด้านหลัง)


ขาของโมดูล OLED ในกรณีที่ใช้ I2C
  • VCC เป็นขาสำหรับแรงดันไฟเลี้ยง +3.3V
  • GND เป็นขา Ground
  • SCL เป็นขา I/O สำหรับสัญญาณ SCL (serial clock) สำหรับ I2C
  • SDA เป็นขา I/O สำหรับสัญญาณ SDA (serial data) สำหรับ I2C

ขาของโมดูล OLED ในกรณีที่ใช้ SPI
  • GND เป็นขา Ground
  • VCC เป็นขาสำหรับแรงดันไฟเลี้ยง +3.3V
  • D0 เป็นขาอินพุตที่ต่อกับ SCK ของบัส SPI
  • D1 เป็นขาอินพุตที่ต่อกับ MOSI ของบัส SPI
  • RST เป็นขาอินพุต Reset (Active-Low) สำหรับรีเซตการทำงานของโมดูล
  • DC เป็นขาอินพุต D/C (Data / Command) เพื่อใช้ระบุว่าเป็นการส่งคำสั่งหรือข้อมูลไปยังโมดูล
  • CS เป็นขาอินพุต Chip Select สำหรับ SPI

Arduino Sketch

เพื่อศึกษาการเขียนโค้ดและให้ง่ายต่อการเขียนโค้ดสำหรับใช้งานโมดูล OLED ดังกล่าว (สำหรับขนาด 128x64 เท่านั้น) จึงได้จัดทำเป็นไลบรารี่ (C++ class) ไว้ใช้สำหรับ Arduino (โดยได้ศึกษาจากเอกสาร datasheet โค้ดตัวอย่างและไลบรารี่ของ Adafruit) แบ่งเป็นสองคลาสคือ OLED_SSD1306_I2C และ OLED_SSD1306_SPI ซึ่งมีความแตกต่างกันตรงที่ขาสัญญาณ I/O ที่ใช้ และรูปแบบการส่งคำสั่งและข้อมูล (I2C หรือ SPI) ของโมดูล OLED
โค้ดสำหรับ OLED ที่ได้เขียนไว้นี้ ใช้หน่วยความจำ SRAM เพื่อเก็บข้อมูลพิกเซลและใช้งานเป็น Display Buffer ซึ่งมีขนาด 128 x 64 / 8 = 1024 ไบต์ และจะต้องมีส่งข้อมูลทั้งหมดใน Display Buffer ไปยังโมดูล OLED เพื่ออัพเดทหน้าจอ ดังนั้นจึงเป็นข้อควรระวัง: สำหรับกรณีที่มีการนำไปใช้งานร่วมกับโค้ดอื่นๆ ที่ต้องใช้พื้นที่ใน SRAM ค่อนข้างมากเมื่อเทียบกับความจุ SRAM ทั้งหมดของไมโครคอนโทรลเลอร์

Sourcecode: OLED_SSD1306_I2C_Demo.zip และ OLED_SSD1306_SPI_Demo.zip
//////////////////////////////////////////////////////////////////////////
// Author: RSP @ Embedded System Lab (ESL), KMUTNB, Thailand
// File: OLED_SSD1306_I2C_Demo.ino
// Arduino IDE: version 1.0.5
// Target Board: Arduino Pro Mini (3.3V), iBoard-EX (32U4, 3.3V)
// Last Modified: 2014-07-13
// Note:
//   This Arduino sketch demonstrates how to use the OLED_SSD1306_I2C class.
//////////////////////////////////////////////////////////////////////////

#include <Wire.h>
#include "OLED_SSD1306_I2C.h"

using namespace esl;

#define I2C_ADDR  (0x3C)

OLED_SSD1306_I2C oled( I2C_ADDR );

char sbuf[20];
uint32_t timestamp;


void setup() {  
  // initialize the I2C (Wire) first
  Wire.begin( I2C_ADDR );
  TWBR = 12; // use 400kHz instead of 100kHz

  oled.init(); // initialize the OLED
    
  timestamp = millis();
}

uint32_t value = 1000;

void loop() {
  if ( millis() - timestamp >= 100 ) { 
    oled.clearBuffer();
    oled.useNormalFont();
    oled.drawText( 4, 8, "Meter ID:" );
    oled.drawText( 4, 24, "Electric Energy (kWh)" );
    oled.useBoldFont();
    oled.drawText( 64, 8, "123456" );
    sprintf( sbuf, "%05u.%03u", (uint16_t)(value/1000), (uint16_t)(value%1000) );
    oled.drawText( 22, 46, sbuf );
    oled.drawRect( 10, 36, OLED_SSD1306_I2C::LCD_WIDTH-10, OLED_SSD1306_I2C::LCD_HEIGHT-1 );
    oled.update();
    value += 1;
    timestamp += 100;
  }
}

//////////////////////////////////////////////////////////////////////////

ในการทดลองใช้งานโมดูล OLED ได้ใช้บอร์ด Arduino Pro Mini (328P, 3.3V / 8MHz) และบอร์ด iBoard-Ex (Leonardo, ATmega32u4, 16MHz/3.3V) ซึ่งทั้งสองบอร์ดทำงานที่แรงดันไฟเลี้ยง +3.3V สามารถนำไปต่อกับโมดูล OLED ได้โดยตรง


รูปแสดงการต่อวงจรใช้งานโมดูล OLED (SPI) ร่วมกับ Arduino Pro Mini (3.3V)
แสดงหน้าจอเป็นข้อความที่ใช้ตัวอักษร (Font) แบบตัวปรกติ (Normal) และตัวหนา (Bold)


รูปแสดงการต่อวงจรใช้งานโมดูล OLED (SPI) ร่วมกับ Arduino Pro Mini (3.3V)
แสดงหน้าจอเป็นรูปกราฟิกจาก Bitmap และมีข้อความด้วย


รูปแสดงการวัดอุณหภูมิโดยใช้ไอซี DS18B20 และแสดงค่าอุณหภูมิบนจอ OLED


รูปแสดงการต่อวงจรใช้งานโมดูล OLED (I2C) ร่วมกับ iBoard-Ex

นาย สุธรรม แสงทรง


แหล่งข้อมูลอ้างอิงและศึกษาเพิ่มเติม

Arduino : ขับ Step Motor ด้วย Module THB7128

ชุดขับ Step Motor ในปัจจุบันมีให้เลือกมายมายหลายแบบ แต่หลักๆ แล้วจะมี 2 แบบด้วยกันคือการขับด้วยชุดขับพวกวงจร H-Bridge เช่น L298 และชุดขับสำหรับ Step Motor โดยเฉพาะ เช่น THB7128 ซึ่งข้อแตกต่างของชุดขับ 2 ชนิดนี้คือ ราคา และ ความยากง่ายในการควบคุม ซึ่งแบบ H-Bridge นั้นจะมีราคาที่ค่อนข้างถูกว่า ชุดขับ Step motor โดยตรงแต่ก็มีความซับซ้อนกว่าในส่วนการควบคุม ซึงในบทความนี้ผมจะมาแนะนำการใช้งานชุดขับ Step Motor THB7128


     ชุดขับ Step ที่ใช้งานหน้าตาแบบนี้ โดยบนบอร์ดจะมี 5 ส่วนหลักๆคือ

  1. IC Driver THB7128
  2. DIP Switch
    • ประกอบด้วย Switch 1- 4 โดย 
      • Switch 1 - 3 ใช้ความคุมความละเอียดในการหมุดต่อ 1 step มีตั้งแต่ 1, 2, 4, 8, 16, 32, 64, 128 คือ สมุติว่า Step Motor ที่เลือกใช้งานเป็นแบบ 1.8 องศา / step ถ้ากำหนด DIP Switch นี้เป็นค่า 8 จะได้ความละเอียด ต่อ 1 step เป็น 1.8 / 8 องศา และจำนวน step ต่อ 1 รอบจะเพิ่มขึ้นด้วย จากตัวอย่าง 1.8 องศา / step จะใช้จำนวน 200 step ต่อการหมุน 1 รอบ แต่ถ้า เลือก DIP Switch เป็นค่า 8 จำนวนรอบจะเป็น 200 * 8 = 1600 step
      • Switch 4 คือกระแสสำหรับตอนที่ Hold Torque ซึ่งจะมี 20% และ 50% ของกระแส Max (R Trimmer)
  3. R Trimmer
    • ใช้ Limit กระแสสูงสุดที่ใช้ Drive Motor ตั้งแต่ 0 - 3 A ซึ่งทั้งนี้ต้องดูที่ Datasheet ของ Motor ที่เลือกใช้งานว่ากระแสสูงสุดเป็นเท่าไหร่
  4. Terminal ฝั่ง Input
    • CW
      • ขาสั่งงานการหมุนของ Motor ว่าจะให้หมุนทวนเข็มหรือตามเข็ม  ขา + ต่อกับ I/O ของ Arduino ขา - ต่อ Gnd
    • EN
      • ขาสั่งเปิด-ปิดการทำงานของ IC ขานี้ไม่ต้องต่อก็ได้ การใช้งานเป็นแบบ Active low
    • CLK
      • ขานี้เป็นขากำหนดความเร็วของการหมุน คล้ายๆ กับการส่ง PWM ควบคุม Motor กระแสตรง ขา + ต่อกับ I/O ของ Arduino ขา - ต่อ Gnd
  5. Terminal ฝั่ง Output
    • A+ A- B+ B- 
      • ต่อเข้ากับ Step Motor ต้องตรวจสอบตาม Datasheet ของ Motor นั้นๆ ให้ดี เพราะถ้าต่อผิดอาจจะเกิดความเสียหายต่อ  IC Driver ได้
    • VCC, GND 
      • คือไฟสำหรับ Drive Motor volt สูงสุด 40V

     อย่างที่กล่าวมาข้างต้นแล้วว่าตัว Module THB7128 นั้นราคาสูงแต่ง่ายตอนควบคุม ก็คือการควบคุมจะทำคล้ายๆ กับการคุบคุม Motor กระแสตรงซึ่ง ฝั้ง Input ที่ใช้งานก็แค่ใช้  CLK และ CW ก็สามารถสั่งงานให้กับ Motor ได้แล้ว โดย code ตัวอย่างนี้ผมจะใช้งานรวมกับ Library ชื่อ AccelStepper  หรือ download

#include <Makeblock.h>
#include <Arduino.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <AccelStepper.h>
#define _PIN_CLK_ 13
#define _PIN_CW_ 12
#define _DIP_SW_EXCITATION_ 16
#define _MOTOR_NUMER_OF_STEP_PER_ROUND_ 200
#define _SW_MAX_SETEP_ (_DIP_SW_EXCITATION_ * _MOTOR_NUMER_OF_STEP_PER_ROUND_)
AccelStepper stepper(AccelStepper::DRIVER, _PIN_CLK_, _PIN_CW_);
long current_position;
void setup()
{
stepper.setAcceleration(100000);
stepper.setCurrentPosition(0);
stepper.setMaxSpeed(_DIP_SW_EXCITATION_ * 20);
}
void loop()
{
current_position = stepper.currentPosition();
if(current_position >= _SW_MAX_SETEP_)
{
stepper.moveTo(0);
}
if(current_position <= 0)
{
stepper.moveTo(_SW_MAX_SETEP_);
}
stepper.run();
}



     จากโค๊ดตัวอย่างกำหนด DIP Switch บน Board 16  (#define _DIP_SW_EXCITATION_ 16) และ Step Motor ที่ใช้งานเป็นแบบความละเอียด 1.8 องศาต่อ Step  (#define _MOTOR_NUMER_OF_STEP_PER_ROUND_ 200) ใน loop เป็นการหมุน แบบทวนเข็ม 1 รอบและหมุนตามเข็มอีก 1 รอบ ซึ่ง position ของการหมุนจะเท่ากับ ความระเอียด คูณ กับจำนวน step ต่อ 1 รอบ  (#define _SW_MAX_SETEP_ (_DIP_SW_EXCITATION_ * _MOTOR_NUMER_OF_STEP_PER_ROUND_)

นาย สุธรรม แสงทรง

อ้างอิง

http://piak.appstack.cc/2014/06/arduino-step-motor-module-thb7128.html


สอน วิธี ใช้งาน RFID Module อ่านค่า Tag ด้วย Arduino ใช้ได้ใน 3 นาที

สอน วิธี ใช้งาน RFID Module อ่านค่า Tag ด้วย Arduino ใช้ได้ใน 3 นาที
ระบบ RFID เป็นระบบที่ใช้ระบุตัวตน โดยใช้แทกเป็นตัวบอก ID ระบบ RFID ประกอบด้วย
1. TAG 
2. เครื่องอ่านหรือ Reader
3. SoftWare ที่ใช้ควบคุม
RFID ที่นิยมใช้กันมี 3 ย่านความถี่ แต่ละความถี่ก็มีข้อดีข้อเสียแตกต่างกัน จึงต้องเลือกใช้ให้เหมาะกับงาน 
  • ความถี่ต่ำ หรือ LF ความถี่ 125Khz มีระยะการอ่านที่ไกล้ ส่งข้อมูลได้ช้า แต่ทะลุทลวงสิ่งกีดขวางได้ดี
  • ความถี่สูง หรือ HF ความถี่ 13.5Mhz มีระยะการอ่านที่ไกลกว่า LF ส่งข้อมูลได้ไกลกว่า สามารถทะลุทลวงสิ่งกีดขวางได้ดี ความถี่่นี้จึงเป็นที่นิยมใช้งานกันมากที่สุด
  • ความถี่สูงยิ่ง หรือ UHF ความถี่ในช่วง 860 to 960 Mhz ส่งข้อมูลได้รวดเร็วและได้ไกลหลายเมตร ข้อด้อยคือทะลุทลวงสิ่งกีดขวางได้ไม่ค่อยดี
การเลือกใช้แทกและเครื่องอ่าน จะต้องเป็นความถี่เดียวกันถึงจะสามารถอ่านข้อมูลร่วมกันได้ ในโมดูล RFID Module นี้เลือกใช้ RFID ย่านความถี่ HF 13.5Mhz ซึ่งเป็นที่นิยมใช้ในงานทั่วมากที่สุด มีราคาไม่แพงมีประสิทธิภาพการทำงานดี
การใช้งาน RFID Module ร่วมกับ Arduino
การใช้งาน RFID Module สามารถใช้ร่วมกับ Arduino ได้เป็นอย่างดี เพราะมีไลบารีที่ทำมาสำหรับ Arduino เรียบร้อยแล้ว เขียนไม่กี่บรรทัดก็สามารถอ่านข้อมูลจาก TAG ได้แล้ว
การต่อใช้งาน โมดูล RFID Module ร่วมกับ Arduino
ต่อตามนี้
  • MOSI - 11
  • MISO - 12
  • SCK - 13
  • NSS - 10
  • RST - 9
  • VCC - 3.3V
  • GND - GND
หรือถ้าบนบอร์ดเขียนอีกแบบ
  • SDA - 10
  • SCK - 13
  • MOSI - 11
  • MISO - 12
  • IRQ  - ไม่ต้องต่อ
  • GND - GND
  • RST - 9
  • 3.3V - 3.3V
1. ดาวน์โหลด ไลบารี RFID สำหรับ Arduino คลิกที่นี่2. ก็อปทั้งโพลเดอร์ไปไว้ที่ Documents\Arduino\libraries
3. เปิดโปรแกรมตัวอย่าง หรือ ก็อปปีโคด Arduino RFID Code จากที่นี่
โคดไม่กี่บรรทัด แค่ก็อปปี้วางก็สามารถอ่านค่า TAG RFID ออกมาประยุกต์ใช้งานได้ตามที่ต้องการแล้ว




นาย สุธรรม แสงทรง

อ้างอิง

https://www.arduinoall.com/article/17/สอน-วิธี-ใช้งาน-rfid-module-อ่านค่า-tag-ด้วย-arduino-ใช้ได้ใน-3-นาที

การใช้ Arduino UNO R3 กับ L298N ควบคุมมอเตอร์ 

การใช้ Arduino UNO R3 กับ L298N ควบคุมมอเตอร์ อุปกรณ์ที่ต้องใช้ก็คือ

1. Arduino UNO R3 - Made in italy

2. Motor Drive Module L298N

3. Jumper (M2M) cable wire 40pcs 2.54mm 20cm Male to Male

H-Bridge เป็นโมดูลที่ใช้ในการควบคุมความเร็วและทิศทางของมอเตอร์ และยังสามารถนำไปประยุกต์ใช้กับ Project อื่นได้อีกด้วย เช่น  ตัวหรี่ไฟในบ้าน หรือที่หรี่ไฟในไฟฉายตีกบ แต่การใช้หลอดใส้ทำให้เราเห็นการกระพริบน้อยมากกว่าใน Led

H-Bridge เป็นวงจรที่สามารถใช้ควบคุมกระแสได้ทั้งขั้วบวกและลบด้วยการควบคุม pulse width modulation (PWM) เป็นการควบคุมแบบ digital ที่มีการนำมาใช้กันมาก โดยส่วนมากเพื่อเป็นการประหยัดพลังงานและ สามารถควบคุม Out Put ได้ โดยมีการกระตุ้นอย่างต่อเนื่อง ซึ่งทำให้เกิดการสูญเสียพลังงานน้อยมาก กล่าวคือวงจรพวกนี้จะมีการปล่อยการสูญเสียพลังงานน้อยกว่าวงจรรุ่นเก่าๆ มาก  โดยเฉพาะการควบคุมโวลต์หลอดกระแส out put

PWM(Pulse Width Modulation) คืออะไร

PWM คือเทคนิดการส่งสัญญาณแบบสวิต หรือ ส่งค่าดิจิตอล 0-1 โดยให้สัญญาณความถี่คงที่ การควบคุมระยะเวลาสัญญาณสูงและสัญญาณต่ำ ที่ต่างกัน ก็จะทำให้ค่าแรงดันเฉลี่ยของสัญญาณสวิต ต่างกันด้วย



สำหรับโมดุล PWM ของ Arduino มีความละเอียด 8 bit หรือ ปรับได้ 255 ระดับ ดังนั้นค่าสัญญาณ 0 โวลต์ถึง 5 โวลต์ จะถูกแสดงเป็นสัญญาณแบบดิจิตอล จะได้ 0 ถึง 255 ซึ่งเราสามารถเทียบสัดส่วนคำนวนจากเลขจริง เป็น เลขทางดิจิตอลได้

ตัวอย่าง

ถ้า 5V = 255
 1.0v จะเท่ากับค่าเท่าไร
    = 255/5.0V*1.0V
    =  51

L298N Dual Full-bridge motor driver module (Red PCB) และการต่อวงจร กับ Arduino UNO R3 (ขา ENA และ ENB ถ้ามี Jumper ต่ออยู่ให้ถอดออก)

 

 

ภาพรวมการต่อวงจร

หมายเหตุ : จากการทดลองการต่อวงจร ตามรูปด้านล่าง ทดสอบ กับ  บอร์ด Arduino UNO R3 ต่อกับ คอมพิวเตอร์ ผ่านทางสาย USB มอเตอร์ ทั้ง 2 ตัว สามารถ ทำงานได้ โดยไม่ต้อง ต่อ แบตเตอรี่ 9 V และ เมื่อทดลองถอดสาย USB จากคอมพิวเตอร์ออก แล้ว ป้อนไฟเข้าทางพอร์ต Power Supply ของ บอร์ด Arduino UNO R3 ก็สามารถทำงานได้ตามปรกติเช่นเดียวกัน

 
 
 
 
 
 
 
 
 
 

 
โปรแกรมที่จะเขียนต่อไปนี้ แสดงการสั่งให้ Motor A และ Motor B หมุนขึ้นหน้า (Forward) เพื่อทดสอบการต่อวงจร และ เข้าใจคำสั่งในการควบคุม Motor โดย บอร์ด Arduino UNO ขา 2 , 3 , 6  จะควบคุมมอเตอร์ A และ ขา 4 , 5 , 7 จะควบคุมมอเตอร์ B

เปิดโปรแกรม Arduino (IDE)  เขียน โค้ด และ Upload  ไปยังบอร์ด Arduino UNO ดังนี้

// Motor A

int dir1PinA = 2;

int dir2PinA = 3;

int speedPinA = 6; //   เพื่อให้ PWM สามารถควบคุมความเร็วมอเตอร์ 


// Motor B

int dir1PinB = 4;

int dir2PinB = 5;

int speedPinB = 7; // เพื่อให้ PWM สามารถควบคุมความเร็วมอเตอร์


void setup()
{
  Serial.begin(9600);

  //กำหนด ขา เพื่อใช้ในการควบคุมการทำงานของ  Motor ผ่านทาง L298N

  pinMode(dir1PinA,OUTPUT);

  pinMode(dir2PinA,OUTPUT);

  pinMode(speedPinA,OUTPUT);

  pinMode(dir1PinB,OUTPUT);

  pinMode(dir2PinB,OUTPUT);

  pinMode(speedPinB,OUTPUT);
}

void loop()
{

// Motor A

  analogWrite(speedPinA, 255); //ตั้งค่าความเร็ว PWM ผ่านตัวแปร ค่าต่ำลง มอเตอร์จะหมุนช้าลง

  digitalWrite(dir1PinA, LOW);

  digitalWrite(dir2PinA, HIGH);


// Motor B

  analogWrite(speedPinB, 255); //ตั้งค่าความเร็ว PWM ผ่านตัวแปร ค่าต่ำลง มอเตอร์จะหมุนช้าลง

  digitalWrite(dir1PinB, LOW);

  digitalWrite(dir2PinB, HIGH);
}
 


ผลการทำงานของโปรแกรม มอเตอร์ ทั้ง A และ B จะหมุนเดินหน้า (Forward) แสดงว่าการต่อวงจร และ การเขียนโปรแกรมของเรานั้นถูกต้อง

มาดูคำสั่งอื่นๆกันบ้างครับ

//ให้ Motor A ถอยหลัง (Reverse)

          analogWrite(speedPinA, 255);

          digitalWrite(dir1PinA, HIGH);

          digitalWrite(dir2PinA, LOW);


//ให้ Motor B ถอยหลัง (Reverse)

          analogWrite(speedPinB, 255);

          digitalWrite(dir1PinB, HIGH);

          digitalWrite(dir2PinB, LOW);
 


//ให้ Motor A หยุด (Freespin)

          analogWrite(speedPinA, 0);

          digitalWrite(dir1PinA, LOW);

          digitalWrite(dir2PinA, HIGH);


//ให้ Motor B หยุด (Freespin)

          analogWrite(speedPinB, 0);

          digitalWrite(dir1PinB, LOW);

          digitalWrite(dir2PinB, HIGH);

นาย สุธรรม แสงทรง

อ้างอิง

http://www.robotsiam.com/article/7/การใช้-arduino-uno-r3-กับ-l298n-ควบคุมมอเตอร์