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

ชุดใช้ขับmotor

ชุดขับมอเตอร์ L298N Dual H-Bridge Motor Controller


สำหรับ หุ่นยนต์ (Robot) แล้ว สิ่งที่เป็นพลังขับเคลื่อนหลักให้กับหุ่นยนต์นั้น
ก็คงจะไม่พ้น มอเตอร์ ซึ่งต้องการการควบคุม จาก ชุดไดรว์มอเตอร์ (Motor Driver)
ที่จะมาควบคุม ทั้ง ทิศทาง และ ความเร็ว ของมอเตอร์ของเรา ซึ่งในวันนี้ จะมาพูดถึง

"L298N Dual H-Bridge Motor Controller"

การใช้งาน :


L298N เป็นชุดขับมอเตอร์ชนิด H-Bridge ซึ่งส่วนใหญ่จะถูกนำไปใช้ในการควบคุมทิศทาง 

และความเร็วของมอเตอร์ ซึ่งสามารถควบคุมมอเตอร์ได้ทั้งหมด 2 Channel



หลักการทำงาน:




วงจร H-Bridge ของ L298N จะขับกระแสเข้ามอเตอร์ ตามขั้วที่กำหนดด้วยลอจิคเพื่อควบคุมทิศทาง 

ส่วนความเร็วของมอเตอร์นั้นจะถูกควบคุมด้วย สัญญาณ (PWM Pulse Width Modulation) 
ซึ่งต้องมีการปรับความถี่ให้เหมาะสมกับมอเตอร์ที่จะใช้ด้วยนะครับ

Picture of Getting to know your L298N Dual H-Bridge Motor Controller module:

ขาต่างๆ:


Out 1: ช่องต่อขั้วไฟของมอเตอร์ A
Out 2: ช่องต่อขั้วไฟของมอเตอร์ A
Out 3: ช่องต่อขั้วไฟของมอเตอร์ B
Out 4: ช่องต่อขั้วไฟของมอเตอร์ B

12V: ช่องจ่ายไฟเลี้ยงมอเตอร์ 12V (ต่อได้ตั้งแต่ 5V ถึง 35V)
GND: ช่องต่อไฟลบ (Ground) 
5V: ช่องจ่ายไฟเลี้ยงมอเตอร์ 5V (หากมีการต่อไฟเลี้ยงที่ช่อง 12V แล้ว 
ช่องนี้จะทำหน้าที่จ่ายไฟออก เป็น 5V Output 
สามารถต่อไฟจากช่องนี้ไปเลี้ยงบอร์ด Arduino ได้

ENA: ช่องต่อสัญญาณ PWM สำหรับมอเตอร์ A 
IN1: ช่องต่อสัญญาณลอจิคเพื่อควบคุมทิศทางของมอเตอร์ A
IN2: ช่องต่อสัญญาณลอจิคเพื่อควบคุมทิศทางของมอเตอร์ A
IN3: ช่องต่อสัญญาณลอจิคเพื่อควบคุมทิศทางของมอเตอร์ B
IN4: ช่องต่อสัญญาณลอจิคเพื่อควบคุมทิศทางของมอเตอร์ B
ENB: ช่องต่อสัญญาณ PWM สำหรับมอเตอร์ B 

สเปกทางเทคนิค:


Dual H bridge Drive Chip : L298N
แรงดันสัญญาณลอจิค : 5V Drive voltage: 5V-35V
กระแสของสัญญาณลอจิค : 0-36mA 
กระแสขับมอเตอร์ : สูงสุดที่ 2A (เมื่อใช้มอเตอร์เดียว) 
กำลังไฟฟ้าสูงสุด : 25W
ขนาด : 43 x 43 x 26 มิลลิเมตร
น้ำหนัก : 26 กรัม
*มี Power Supply 5V ในตัว สามารถจ่ายไฟออกจากช่อง 5V (เพื่อจ่ายให้บอร์ด Arduino) ได้
เมื่อต่อไฟเลี้ยงเข้าที่ช่อง 12V

การต่อเข้าใช้งานกับ Arduino:


ในการต่อกับ Arduino นั้น ขา IN1,IN2,IN3 และ IN4 นั้น สามารถต่อกับพอร์ต Digital ใดๆก็ได้
เนื่องจาก 4 ขานี้ จะใช้ในการควบคุมสัญญาณลอจิคบอกทิศทางให้กับมอเตอร์ ส่วน ENA และ ENB นั้น
จำเป็นที่จะต้องต่อกับพอร์ต Digital ที่รองรับ PWM เนื่องจากจะต้องใช้สัญญาณ PWM ในการควบคุมความเร็วของมอเตอร์


การสั่งงานมอเตอร์เบื้องต้น:


ในการสั่งงาน L298N ให้ควบคุมมอเตอร์นั้น มีหลักการพื้นฐานง่ายๆ ดังนี้
ผมจะแบ่งขาออกเป็น 2 กลุ่ม ดังนี้
ENA IN1 IN2 และ IN3 IN4 ENB

ENA ใช้สำหรับควบคุมความเร็วมอเตอร์ A
ใช้คำสั่ง analogWrite( พอร์ตที่ต่อขา ENA , ความเร็วมอเตอร์ 0-255 );
IN1,IN2 ใช้ควบคุมทิศทางของมอเตอร์ A
ใช้คำสั่ง digitalWrite( พอร์ตที่ต่อขา IN1, IN2  , สถานะ HIGH , LOW );

ENB ใช้สำหรับควบคุมความเร็วมอเตอร์ B
ใช้คำสั่ง analogWrite( พอร์ตที่ต่อขา ENB , ความเร็วมอเตอร์ 0-255 );
IN3,IN4 ใช้ควบคุมทิศทางของมอเตอร์ B
ใช้คำสั่ง digitalWrite( พอร์ตที่ต่อขา IN3, IN4  , สถานะ HIGH , LOW );

การใช้ค่าในการควบคุมมอเตอร์ต่างๆ จะเป็นไปตามตารางด้านล่างนี้นะครับ

ตารางการทำงาน มอเตอร์ A
ENAIN1IN2คำอธิบาย
0N/AN/Aมอเตอร์ A ไม่ทำงาน
0LOWLOWมอเตอร์ A หยุดการทำงานแบบหมุนอิสระ (แบบไม่เบรค)
0-255LOWHIGHมอเตอร์ A ทำงานและหมุนกลับหลังด้วยความเร็วที่ ENA
0-255HIGHLOWมอเตอร์ A ทำงานและหมุนเดินหน้าด้วยความเร็วที่ ENA
0HIGHHIGHมอเตอร์ A หยุดการทำงานแบบทันที (แบบเบรค)

ตารางการทำงาน มอเตอร์ B
ENAIN1IN2คำอธิบาย
0N/AN/Aมอเตอร์ B ไม่ทำงาน
0LOWLOWมอเตอร์ B หยุดการทำงานแบบหมุนอิสระ (แบบไม่เบรค)
0-255LOWHIGHมอเตอร์ B ทำงานและหมุนกลับหลังด้วยความเร็วที่ ENB
0-255HIGHLOWมอเตอร์ B ทำงานและหมุนเดินหน้าด้วยความเร็วที่ ENB
0HIGHHIGHมอเตอร์ B หยุดการทำงานแบบทันที (แบบเบรค)




ตัวอย่างเช่นมอเตอร์ A (เป็นมอเตอร์แบบในรูปข้างบน)
ผมต่อขาต่างๆ กับ Arduino UNO ไว้ดังนี้

ENA = ขา 10 (ขานี้รองรับ PWM)
IN1 = ขา 9
IN2 = ขา 8

ผมจะสั่งให้ มอเตอร์ A หมุนเดินหน้า ด้วยความเร็วสูงสุด (255) เป็นเวลา 3 วินาที
แล้วหยุดทันที (เบรค) เป็นเวลา 3 วิ แล้วเริ่มหมุนถอยหลังด้วยความเร็วสูงสุด (255)
เป็นเวลาอีก 3 วินาที แล้วเบรคอีก 3 วินาที จากนั้นก็วนคำสั่งนี้ไปเรื่อยๆ
ผมจะใช้คำสั่งดังต่อไปนี้...

void setup()
{
     //TCCR1B = TCCR1B & B11111000 | B00000101;    // ปรับ timer 1 divisor เพื่อให้ได้ค่าความถี่ 
                                                                                                      // สัญญาณ PWM ของขา 9,10 ที่ 30.64 Hz

     pinMode(10,OUTPUT);   //กำหนด ขา 10 (ต่ออยู่กับ ENA ให้เป็นแบบ OUTPUT)
     pinMode(9,OUTPUT);   //กำหนด ขา 9 (ต่ออยู่กับ IN1 ให้เป็นแบบ OUTPUT)
     pinMode(8,OUTPUT);   //กำหนด ขา 8 (ต่ออยู่กับ IN2 ให้เป็นแบบ OUTPUT)
}

void loop()
{
     digitalWrite(9,HIGH);      //ตามตารางข้างบน ต้องกำหนด IN1 = HIGH 
     digitalWrite(8,LOW);       //และ IN2 = LOW มอเตอร์ A จึงจะทำงานหมุนไปด้านหน้า
     analogWrite(10,255);       //และสั่งหมุนที่ความเร็วสูงสุด 255 ผ่านทาง ENA (ขา 10) ที่เป็น PWM

     delay(3000);                     //รอเวลา 3 วินาที

     digitalWrite(9,HIGH);       //ตามตารางข้างบน ต้องกำหนด IN1 = HIGH
     digitalWrite(8,HIGH);       //และ IN2 = HIGH มอเตอร์ A จึงจะหยุดการทำงานทันที (เบรค)
     analogWrite(10,0);            //และสั่งความเร็วมอเตอร์ให้เป็น 0 ผ่านทาง ENA (ขา 10) ที่เป็น PWM

     delay(3000);                     //รอเวลา 3 วินาที

     digitalWrite(9,LOW);        //ตามตารางข้างบน ต้องกำหนด IN1 = LOW
     digitalWrite(8,HIGH);       //และ IN2 = HIGH มอเตอร์ A จึงจะทำงานหมุนถอยหลัง
     analogWrite(10,255);         //และสั่งหมุนที่ความเร็วสูงสุด 255 ผ่านทาง ENA (ขา 10) ที่เป็น PWM

     delay(3000);                     //รอเวลา 3 วินาที

     digitalWrite(9,HIGH);       //ตามตารางข้างบน ต้องกำหนด IN1 = HIGH
     digitalWrite(8,HIGH);       //และ IN2 = HIGH มอเตอร์ A จึงจะหยุดการทำงานทันที (เบรค)
     analogWrite(10,0);            //และสั่งความเร็วมอเตอร์ให้เป็น 0 ผ่านทาง ENA (ขา 10) ที่เป็น PWM

     delay(3000);                     //รอเวลา 3 วินาที จบตรงนี้แล้วโค้ดจะเริ่มใหม่ วนไปเรื่อยๆ
}

Library สำหรับ L298N:

จากเนื้อหาทั้งหมดข้างต้น จะสังเกตเห็นได้ว่าการใช้งานนั้นอาจจะซับซ้อนเล็กน้อย
พร้อมทั้งในการสั่งมอเตอร์แต่ละครั้งจะใช้คำสั่งมาก ได้เขียนเยอะ ผมเซเรฟ จึงได้พัฒนาไลบรารี่ขึ้นมา
เพื่อให้สามารถควบคุม L298N นี้ได้ง่ายๆ โดยใช้คำสั่งพื้นๆ โดยลักษณะการใช้งานจะมีดังนี้

1.ทำการ include library ของ L298N ด้วยคำสั่ง

#include 


2. ทำการตั้งค่าการต่อพอร์ตต่างๆ โดยใช้คำสั่ง

L298( ขา ENA , ขา IN1 , ขา IN2 , ขา IN3 , ขา IN4 , ขา ENB);

เช่นที่ Arduino UNO ผมต่อ 

ENA ขา 10     IN1 ขา 9      IN2 ขา 8      IN3 ขา 7       IN4 ขา 6       ENB ที่ขา 5

จะใช้คำสั่ง...

L298(10,9,8,7,6,5);

เพื่อตั้งค่าเริ่มต้นให้กับไลบรารี่ L298

3.คำสั่งต่างๆในการใช้งานมีดังนี้

fd( ความเร็ว 0-100 ); 
สั่งมอเตอร์ทั้งหมดให้หมุนเดินหน้า ด้วยความเร็วที่กำหนด (0-100%)

bk( ความเร็ว 0-100 ); 
สั่งมอเตอร์ทั้งหมดให้หมุนถอยหลัง ด้วยความเร็วที่กำหนด (0-100%)

tl( ความเร็ว 0-100 ); 
คำสั่งนี้ใช้ในการเลี้ยวของหุ่นยนต์ โดยจะสั่งให้มอเตอร์ B หมุนตามความเร็วที่กำหนด (0-100%)
ส่วนมอเตอร์ A จะหยุดหมุน หากติดตั้งมอเตอร์ A ไว้ที่ล้อข้างซ้าย และ B ไว้ที่ล้อข้างขวา
การใช้คำสั่งนี้ จะส่งผลให้หุ่นยนต์เกิดการเลี้ยวซ้ายแบบกว้างขึ้นนั่นเอง

tr( ความเร็ว 0-100 ); 
คำสั่งนี้ใช้ในการเลี้ยวของหุ่นยนต์ โดยจะสั่งให้มอเตอร์ A หมุนตามความเร็วที่กำหนด (0-100%)
ส่วนมอเตอร์ B จะหยุดหมุน หากติดตั้งมอเตอร์ A ไว้ที่ล้อข้างซ้าย และ B ไว้ที่ล้อข้างขวา
การใช้คำสั่งนี้ จะส่งผลให้หุ่นยนต์เกิดการเลี้ยวขวาแบบกว้างขึ้นนั่นเอง

sl( ความเร็ว 0-100 ); 
คำสั่งนี้ใช้ในการเลี้ยวของหุ่นยนต์ โดยจะสั่งให้มอเตอร์ A หมุนถอยหลัง ส่วนมอเตอร์ B หมุนเดินหน้า
ตามความเร็วที่กำหนด (0-100%) หากติดตั้งมอเตอร์ A ไว้ที่ล้อข้างซ้าย และ B ไว้ที่ล้อข้างขวา
การใช้คำสั่งนี้ จะส่งผลให้หุ่นยนต์เกิดการเลี้ยวซ้ายแบบแคบ (หมุนรอบตัวเอง) ขึ้นนั่นเอง

sr( ความเร็ว 0-100 ); 
คำสั่งนี้ใช้ในการเลี้ยวของหุ่นยนต์ โดยจะสั่งให้มอเตอร์ B หมุนถอยหลัง ส่วนมอเตอร์ A หมุนเดินหน้า
ตามความเร็วที่กำหนด (0-100%) หากติดตั้งมอเตอร์ A ไว้ที่ล้อข้างซ้าย และ B ไว้ที่ล้อข้างขวา
การใช้คำสั่งนี้ จะส่งผลให้หุ่นยนต์เกิดการเลี้ยวขวาแบบแคบ (หมุนรอบตัวเอง) ขึ้นนั่นเอง

fd2( ความเร็วมอเตอร์ A , ความเร็วมอเตอร์ B ); 
สั่งมอเตอร์ A และ B ให้หมุนแยกความเร็วกัน โดยสามารถสั่งติดลบ (เพื่อให้หมุนถอยหลัง) ได้ 
โดยสั่งได้ตั้งแต่ -100 จนถึง 100 เช่น fd2(50,-50); จะทำงานคล้าย sr(50);

ao();
เป็นคำสั่งที่ใช้หยุดการหมุนของมอเตอร์ทั้งหมด

โปรเจครถบังคับ 4WD Android ควบคุม Arduino

โปรเจครถบังคับ 4WD Android ควบคุม Arduino


โปรเจครถบังคับ 4WD Android ควบคุม Arduino






อุปกรณ์

1. 4WD smart car chassis

2. Arduino Nano 3.0

3. L298N bridge Module

4. Bluetooth Module HC-06

5. แบตเตอรี่ 18650 Li Ion 2 ก้อน

6. รางถ่าน 18650

7. โฟโต้บอร์ด (Breadboard)  ขนาดเล็ก

8. Male-Female Jumper Wires

9. Male-Male Jumper Wires






รายละเอียดสินค้า 4WD smart car chassis


1. โครง 2 ชิ้น

2. ชุด Nut/ฺBolt 1 ชุด

3. เกียร์มอเตอร์และล้อรถ 4 ชุด

4. รางถ่าน AA 4 ก้อน 1 ชิ้น

5. สายไฟสีแดง 4 เส้น

6. สายไฟสีดำ 4 เส้น


Arduino Nano 3.0

Arduino Nano 3.0 Mini USB รุ่นใหม่ใช้ชิฟ CH340G (แถมสาย Mini USB)
Arduino Nano 3.0 พร้อมสาย Mini USB ตัวนี้ เหมือน Arduino Nano 3.0 รุ่นเดิมทุกอย่าง แต่ราคาถูกกว่า

ต่างกันที่ใช้ชิฟ CH340G เป็นชิฟ USB Driver แทนรุ่น Arduino Nano 3.0 เดิม สามารถใช้ได้กับ Windows

XP,Windows 7 , Windows 8 ทั้ง 32/64bit, Linux , Mac OS ได้ และมีราคาถูกลง



Arduino Nano 3.0 เป็น Arduino ที่ใช้หน่วยประมวลผล ATmega328 เช่นเดียวกับ Arduino Uno ความ

สามารถจึงเท่ากัน แตกต่างที่ Arduino Nano 3.0 ถูกออกแบบให้มีขนาดเล็ก โดยตัดส่วนของ Socket ที่ไม่

จำเป็นออก และยังคงความสามารถในการติดต่อผ่าน USB port เหมือนบอร์ด Arduino ตัวใหญ่ไว้ อาจจะ

เรียกได้ว่า Arduino Nano 3.0 ตัวนี้ คือ Arduino Uno ขนาดย่อส่วนลงมา


ดาวน์โหลดไดรเวอร์ได้ที่นี่

https://www.dropbox.com/s/oqs9hs5dhq5d9la/CH341SER.ZIP?dl=0


ซอสโค้ด

int izqA = 5;
int izqB = 6;
int derA = 9;
int derB = 10;
int vel = 255; // Velocidad de los motores (0-255)
int estado = 'g'; // inicia detenido

void setup() {
Serial.begin(9600); // inicia el puerto serial para comunicacion con el Bluetooth
pinMode(derA, OUTPUT);
pinMode(derB, OUTPUT);
pinMode(izqA, OUTPUT);
pinMode(izqB, OUTPUT);
}

void loop() {

if(Serial.available()>0){ // lee el bluetooth y almacena en estado
estado = Serial.read();
}
if(estado=='a'){ // Boton desplazar al Frente
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, vel);
analogWrite(izqA, vel);
}
if(estado=='b'){ // Boton IZQ
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, vel);
}
if(estado=='c'){ // Boton Parar
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, 0);
}
if(estado=='d'){ // Boton DER
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(izqA, 0);
analogWrite(derA, vel);
}

if(estado=='e'){ // Boton Reversa
analogWrite(derA, 0);
analogWrite(izqA, 0);
analogWrite(derB, vel);
analogWrite(izqB, vel);
}
if (estado =='f'){ // Boton ON se mueve sensando distancia

}
if (estado=='g'){ // Boton OFF, detiene los motores no hace nada
}
}



 ดาวน์โหลดและติดตั้ง แอพควบคุมรถบังคับ  Arduino Control Car ที่

https://play.google.com/store/apps/details?id=appinventor.ai_el_profe_garcia.Arduino_Control_Car&hl=en

โปรเจครถบังคับ ขับเคลื่อน 2 ล้อ Arduino กับ แอพแอนดรอยด์

โปรเจครถบังคับ ขับเคลื่อน 2 ล้อ Arduino กับ แอพแอนดรอยด์

เมื่อ 6 เดือนที่ผ่านมา
โดย เจ้าของร้าน Google+



เราจะเอาสิ่งที่เราเรียนรู้ Arduino จากที่่ผ่านๆมา  มาประกอบเป็นรถบังคับ ควบคุมด้วย สมาร์ทโฟน แอนดรอยด์ ผ่านทาง Bluetooth HC-05 กันนะครับ

โปรเจครถบังคับ ขับเคลื่อน 2 ล้อ Arduino กับ แอพแอนดรอยด์ อุปกรณ์ที่ต้องใช้ก็คือ

     1. 2WD Smart Car Robot Chassis Kits

     2. Arduino UNO R3 - Made in italy

     3. Motor Drive Module L298N

     4. HC-05 Bluetooth Master Slave

     5. สาย Jumper Female to Male ยาว 20cm.

     6. สาย Jumper Male to  Male ยาว 20cm.

     7. รางถ่านแบบ 18650 ใส่ถ่าน 3 ก้อน

     8. แบตเตอรี่ลิเธียม 18650 จำนวน 3 ก้อน

     9. เสารองแผ่นพีซีบีโลหะแบบเหลี่ยม 6 mm

    10. สายไฟแดงดำ ขนาด 22AWG

เริ่มต้นด้วยการ ประกอบ Smart Robot Car Chassis Kit 

 แนะนำให้ใช้แบตเตอรี่ลิเธียม 18650 (ขนาดใหญ่กว่า แบตเตอรี่ ขนาด AA ปรกติ) แรงดันไฟเฉลี่ย 3.7V  (3400 mAh)  จำนวน 3 ก้อน ได้ไฟรวมประมาณ 11.1 โวลต์  และ ก็ต้องเปลี่ยน รางถ่าน เป็นแบบ 18650 ใส่ถ่านได้ 3 ก้อน แบบวงจรอนุกรม ด้วย

รุูจัก : Li-ion (ลิเธี่ยมไอออน) และ Li-Mn (ลิเธี่ยมแมงกานีส หรือเรียกอีกอย่างว่า High Drain) ขนาดของตัวจะมาเป็นรหัสครับเช่น 18650 ข้อดี คือ สามารถชาร์จได้ แต่ ไม่ควรใช้จนไฟหมดหรือแรงดันต่ำกว่าที่กำหนดเอาไว้เพราะจะทำให้เซลล์แบตฯ เสียหายไม่สามารถนำมาใช้ได้อีก


V คือ Volt (โวลต์)  
เป็นค่าความต่างศักดิ์ไฟฟ้า คล้ายๆแรงดันไฟ นึกภาพถึง แรงดันน้ำ แรงดันลม ความดันเลือด (เป็นแรงดันไฟ หรือ แรงดันไฟฟ้า)

mAh คือ m = มิลลิ , A = แอมป์ , h = ชั่วโมง หมายถึง ถ่านก้อนนี้สามารถจ่ายกระแสได้ กี่มิลิแอมป์ ใน 1 ชั่วโมง (เป็นความจุไฟ หรือ กระแสไฟฟ้า)


เริ่มด้วย ต่อวงจร Arduino  UNO กับ L298N  Motor Driver ตามรูปการต่อวงวงจร

นำไฟจากแบตเตอรี่ลิเธียม 18650 ไปต่อตรงกับ L298N  Motor Driver (ไม่ต่อกับ พอร์ต Power Supply ของ บอร์ด Arduino  UNO R3 ) และ นำไฟ 5 โวลต์ ที่ออกจาก L298N  Motor Driver ต่อออกไปเลี้ยง บอร์ด Arduino  UNO R3 ตามรูปการต่อวงวงจร





*** VCC ของ Arduino UNO R3 คือ 5V ***



เรียนรู้เพิ่มเติมตามลิงค์นี้  http://robotsiam.blogspot.com/2016/08/l298n-motor-driver-connect-arduino-r3.html
 
ต่อวงจร Arduino  UNO กับ HC-05 Bluetooth ตามรูปการต่อวงวงจร

*** ถ้า HC-05 ไม่ทำงาน ให้ ทดลอง กดที่ปุ่ม BUTTON SWITCH ของ HC-05 ***




เรียนรู้เพิ่มเติมตามลิงค์นี้  http://robotsiam.blogspot.com/2016/08/hc-05-bluetooth-module.html

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


#include <SoftwareSerial.h>
SoftwareSerial BTSerial(9, 10);

int dir1PinA = 2;
int dir2PinA = 3;
int speedPinA = 6;
int dir1PinB = 4;
int dir2PinB = 5;
int speedPinB = 7;

void setup() 
{   

  Serial.begin(9600);
  pinMode(dir1PinA,OUTPUT);
  pinMode(dir2PinA,OUTPUT);
  pinMode(speedPinA,OUTPUT);
  pinMode(dir1PinB,OUTPUT);
  pinMode(dir2PinB,OUTPUT);
  pinMode(speedPinB,OUTPUT);
  pinMode(8,OUTPUT);
  digitalWrite(8, HIGH);
  Serial.begin(9600);
  BTSerial.begin(9600); 
}


void loop() 
{  
  if (BTSerial.available())
    Serial.write(BTSerial.read());

  if (Serial.available())
    BTSerial.write(Serial.read());

  if (BTSerial.available() > 0) {

    int inByte = BTSerial.read();
    int speed;
    switch (inByte) {

    case 'F':

      analogWrite(speedPinA, 255);
      analogWrite(speedPinB, 255);
      digitalWrite(dir1PinA, LOW);
      digitalWrite(dir1PinB, HIGH);
      digitalWrite(dir2PinA, HIGH);
      digitalWrite(dir2PinB, LOW);
      Serial.println("Motor 1 Forward");
      Serial.println("Motor 2 Forward");
      Serial.println("   "); 

      break;



    case 'S': 

      analogWrite(speedPinA, 0);
      digitalWrite(dir1PinA, LOW);
      digitalWrite(dir2PinA, HIGH);
      Serial.println("Motor 1 Stop");
      analogWrite(speedPinB, 0);
      digitalWrite(dir1PinB, LOW);
      digitalWrite(dir2PinB, HIGH);
      Serial.println("Motor 2 Stop");
      Serial.println("   ");

      break;

    case 'B':

      analogWrite(speedPinA, 255);
      digitalWrite(dir1PinA, HIGH);
      digitalWrite(dir2PinA, LOW);
      Serial.println("Motor 1 Back");
      analogWrite(speedPinB, 255);
      digitalWrite(dir1PinB, LOW);
      digitalWrite(dir2PinB, HIGH);
      Serial.println("Motor 2 Back");
      Serial.println("   ");

      break;

    case 'L':

      analogWrite(speedPinA, 0);
      digitalWrite(dir1PinA, LOW);
      digitalWrite(dir2PinA, HIGH);
      Serial.println("Motor 1 Left");
      analogWrite(speedPinB, 255);
      digitalWrite(dir1PinB, HIGH);
      digitalWrite(dir2PinB, LOW);
      Serial.println("Motor 2 Left");
      Serial.println("   ");

      break;

    case 'R':

      analogWrite(speedPinA, 255);
      digitalWrite(dir1PinA, LOW);
      digitalWrite(dir2PinA, HIGH);
      Serial.println("Motor 1 Right");
      analogWrite(speedPinB, 0);
      digitalWrite(dir1PinB, LOW);
      digitalWrite(dir2PinB, HIGH);
      Serial.println("Motor 2 Right");
      Serial.println("   ");

      break;

    case 'I':

      analogWrite(speedPinA, 150);
      digitalWrite(dir1PinA, LOW);
      digitalWrite(dir2PinA, HIGH);
      Serial.println("Motor 1 Forward L");
      analogWrite(speedPinB, 255);
      digitalWrite(dir1PinB, HIGH);
      digitalWrite(dir2PinB, LOW);
      Serial.println("Motor 2 Forward L");
      Serial.println("   ");

      break;

    case 'G':

      analogWrite(speedPinA, 255);
      digitalWrite(dir1PinA, LOW);
      digitalWrite(dir2PinA, HIGH);
      Serial.println("Motor 1 Forward R");
      analogWrite(speedPinB, 150);
      digitalWrite(dir1PinB, HIGH);
      digitalWrite(dir2PinB, LOW);
      Serial.println("Motor 2 Forward R");
      Serial.println("   ");

      break;

    case 'J':

      analogWrite(speedPinA, 200);
      digitalWrite(dir1PinA, HIGH);
      digitalWrite(dir2PinA, LOW);
      Serial.println("Motor 1 Back L");
      analogWrite(speedPinB, 255);
      digitalWrite(dir1PinB, LOW);
      digitalWrite(dir2PinB, HIGH);
      Serial.println("Motor 2 Back L");
      Serial.println("   ");

      break;

    case 'H':

      analogWrite(speedPinA, 255);
      digitalWrite(dir1PinA, HIGH);
      digitalWrite(dir2PinA, LOW);
      Serial.println("Motor 1 Back R");
      analogWrite(speedPinB, 200);
      digitalWrite(dir1PinB, LOW);
      digitalWrite(dir2PinB, HIGH);
      Serial.println("Motor 2 Back R");
      Serial.println("   ");

      break;


    default:



      for (int thisPin = 2; thisPin < 11; thisPin++) 

      {

        digitalWrite(thisPin, LOW);

      }

    }

  }

}
เพิ่มเติมการเรียนรู้ ภาษา C

นอกจากการใช้คำสั่ง if เพื่อกำหนดเงื่อนไขเพื่อให้โปรแกรมเลือกที่จะทำงานสายงานใดแล้ว ในภาษา C ยังมีคำสั่ง switch อีกคำสั่งหนึ่ง เพื่ออำนวยความสะดวกแก่ผู้เขียนโปรแกรม ในการที่นำมาใช้แทนคำสั่ง if ที่ซ้อนกันหลาย ๆ ชั้น โดยที่คำสั่ง switch จะนำค่าของตัวแปรที่อยู่หลังคำสั่ง switch มาเปรียบเทียบกับค่าที่อยู่หลัง case แต่ละคำสั่ง ถ้าตรงกัน ก็จะทำสายงานที่อยู่ใน case นั้น ๆ แต่ถ้าไม่ตรงกับ case ใด ๆ เลย จะทำหลังคำสั่ง default โดยมีรูปแบบประโยคคำสั่งดังนี้


ประโยค switch หนึ่งประโยคจะมีกี่ case ก็ได้ หรือไม่มีเลยก็ได้ และอาจมี default เป็นตัวเลือกเสริม

 ประโยคคำสั่ง break 

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


 switch (inByte) {

    case 'F':

      analogWrite(speedPinA, 500);
      analogWrite(speedPinB, 500);
      digitalWrite(dir1PinA, LOW);
      digitalWrite(dir1PinB, HIGH);
      digitalWrite(dir2PinA, HIGH);
      digitalWrite(dir2PinB, LOW);
      Serial.println("Motor 1 Forward");
      Serial.println("Motor 2 Forward");
      Serial.println("   "); 

      break;

  case 'H':

      analogWrite(speedPinA, 500);
      digitalWrite(dir1PinA, HIGH);
      digitalWrite(dir2PinA, LOW);
      Serial.println("Motor 1 Back R");
      analogWrite(speedPinB, 200);
      digitalWrite(dir1PinB, LOW);
      digitalWrite(dir2PinB, HIGH);
      Serial.println("Motor 2 Back R");
      Serial.println("   ");

      break;


    default:

 การนำคำสั่ง break มาซ้อนไว้ใน case ต่าง ๆ ของคำสั่ง switch จะช่วยให้โปรแกรมไม่ล่วงล้ำเข้าไปทำใน case ที่อยู่ถัดไป แต่ถ้าไม่มีประโยคคำสั่ง break เมื่อทำ case ใด ๆ เสร็จเรียบร้อยแล้ว คอมไพล์เลอร์ก็จะให้ไปทำใน case ที่อยู่ถัดไปเรื่อย ๆ จนกว่าจะจบบล๊อกของประโยคคำสั่ง switch จากนั้นจะทำงานต่อไป ในประโยคคำสั่งที่อยู่ถัดไป

จากนั้น ทดลองนำ โทรศัพท์มือถือ แอนดรอยด์  เปิด บลูทูธ  แล้ว ดาวน์โหลดและติดตั้ง โปรแกรม Arduino Bluetooth RC Car ดังนี้




สังเกตุ เมื่อเปิดขึ้นมา รูปวงกลมซ้ายมือ จะเป็นสีแดง



คลิกที่ ไอคอนเฟือง ขวามือสุด แล้ว เลือก Connect to car




เลือก HC-05 (ถ้าถามหา พาสเวิร์ด ให้คีย์ 1234)

หลักของมาตรฐาน ISO 9001:2000      หลักการมาตรฐานของ ISO 9001:2000 จะเป็นการระบุถึงข้อกำหนดที่ใช้ในระบบบริหารที่เกี่ยวกับคุณภาพ โดยเป้าหมา...