วันอังคารที่ 24 กรกฎาคม พ.ศ. 2561

ไมโครคอนโทลเลอร์8

ตัวอย่างการใช้งาน Arduino + Relay Module

ควบคุมการปิดเปิดเครื่องใช้ไฟฟ้า

    

         รีเลย์ (Relay) เป็นอุปกรณ์ไฟฟ้าชนิดหนึ่ง ซึ่งทำหน้าที่ตัดต่อวงจรแบบเดียวกับสวิตช์ โดยควบคุมการทำงานด้วยไฟฟ้า Relay มีหลายประเภท ตั้งแต่ Relay ขนาดเล็กที่ใช้ในงานอิเล็กทรอนิกส์ทั่วไป จนถึง Relay ขนาดใหญ่ที่ใช้ในงานไฟฟ้าแรงสูง โดยมีรูปร่างหน้าตาแตกต่างกันออกไป แต่มีหลักการทำงานที่คล้ายคลึงกัน สำหรับการนำ Relay ไปใช้งาน จะใช้ในการตัดต่อวงจร ทั้งนี้ Relay ยังสามารถเลือกใช้งานได้หลากหลายรูปแบบ

 สัญลักษณ์ในวงจรไฟฟ้าของรีเลย์

ภายใน Relay จะประกอบไปด้วยขดลวดและหน้าสัมผัส 

         หน้าสัมผัส NC (Normally Close) เป็นหน้าสัมผัสปกติปิด โดยในสภาวะปกติหน้าสัมผัสนี้จะต่อเข้ากับขา COM (Common) และจะลอยหรือไม่สัมผัสกันเมื่อมีกระแสไฟฟ้าไหลผ่านขดลวด
         หน้าสัมผัส NO (Normally Open) เป็นหน้าสัมผัสปกติเปิด โดยในสภาวะปกติจะลอยอยู่ ไม่ถูกต่อกับขา COM (Common) แต่จะเชื่อมต่อกันเมื่อมีกระแสไฟไหลผ่านขดลวด
         ขา COM (Common) เป็นขาที่ถูกใช้งานร่วมกันระหว่าง NC และ NO ขึ้นอยู่กับว่า ขณะนั้นมีกระแสไฟฟ้าไหลผ่านขดลวดหรือไม่ หน้าสัมผัสใน Relay 1 ตัวอาจมีมากกว่า 1 ชุด ขึ้นอยู่กับผู้ผลิตและลักษณะของงานที่ถูกนำไปใช้ จำนวนหน้าสัมผัสถูกแบ่งออกดังนี้
         สวิตช์จะถูกแยกประเภทตามจำนวน Pole และจำนวน Throw ซึ่งจำนวน Pole (SP-Single Pole, DP-Double Pole, 3P-Triple Pole, etc.) จะบอกถึงจำนวนวงจรที่ทำการเปิด-ปิด หรือ จำนวนของขา COM นั่นเอง และจำนวน Throw (ST, DT) จะบอกถึงจำนวนของตัวเลือกของ Pole ตัวอย่างเช่น SPST- Single Pole Single Throw สวิตช์จะสามารถเลือกได้เพียงอย่างเดียวโดยจะเป็นปกติเปิด (NO-Normally Open) หรือปกติปิด (NC-Normally Close) แต่ถ้าเป็น SPDT- Single Pole Double Throw สวิตช์จะมีหนึ่งคู่เป็นปกติเปิด (NO) และอีกหนึ่งคู่เป็นปกติปิดเสมอ (NC) ดังรูปด้านล่าง

                      

SPST คือ Single Pole Single Throw                      DPST คือ Double Pole Single Throw
SPDT คือ Single Pole Double Throw                      DPDT คือ Double Pole Double Throw

          จากส่วนประกอบข้างต้นที่ได้กล่าวไป ในบทความนี้เราจะใช้งาน Relay แบบ SPDT (Single Pole Double Throw) หลักการทำงานของ Relay นั้น ในส่วนของขดลวด เมื่อมีกระแสไฟฟ้าไหลผ่าน จะทำให้ขดลวดเกิดการเหนี่ยวนำและทำหน้าที่เสมือนแม่เหล็กไฟฟ้า ส่งผลให้ขา COM ที่เชื่อมต่ออยู่กับหน้าสัมผัส NC (ในสภาวะที่ยังไม่เกิดการเหนี่ยวนำ) ย้ายกลับเชื่อมต่อกับหน้าสัมผัส NO แทน และปล่อยให้ขา NC ลอย เมื่อมองที่ขา NC กับ COM และ NO กับ COM แล้วจะเห็นว่ามีการทำงานติด-ดับลักษณะคล้ายการทำงานของสวิชต์ เราสามารถอาศัยคุณสมบัตินี้ไปประยุกต์ใช้งานได้ 
          ในบทความนี้ เราจะกล่าวถึงวิธีการนำ Relay Module ไปประยุกต์ใช้งานจริง แต่ก่อนอื่นเรามาดูวิธีอ่านคุณสมบัติของ Relay ว่าสามารถรองรับการทำงานที่แรงดันและกระแสไฟฟ้าเท่าไร ใช้แรงดันไฟฟ้าในการทำงานอย่างไรก่อนนะครับ 

1. ยี่ห้อ รุ่นของผู้ผลิต (แบรนด์) รวมถึงสัญลักษณ์มาตรฐานต่างๆ
2. รายละเอียดของไฟฟ้ากระแสสลับที่รองรับการทำงานได้ (VAC)
3. รายละเอียดของไฟฟ้ากระแสตรงที่รองรับการทำงานได้ (VDC)
4. โมเดล ระดับแรงดันฝั่งขดลวด ชนิดและโครงสร้าง และข้อมูลด้าน Coil Sensitivity
คุณสมบัติแบบละเอียด ดูได้จากตารางด้านล่างนี้

 

          จากตาราง สามารถสรุปได้ว่าเป็น Relay ยี่ห้อ Songle โมเดล SRD รองรับการทำงานแรงดันกระแสสลับที่ 250V@10A หรือ 125V@10A รองรับแรงดันกระแสตรงที่ 28VDC@10A ฝั่งขดลวดทำงานด้วยแรงดัน 5V โครงสร้างตัว Relay เป็นแบบซีลด์ มีค่าความไวขดลวดที่ 0.36W หน้าสัมผัสเป็นรูปแบบ 1 from C

          หน้าสัมผัสแบบ A (Form A) หมายถึง หน้าสัมผัสของ Relay ในสภาพปกติจะเปิดอยู่ (Normally open) และหน้าสัมผัสเป็นแบบ SPST ถ้าจะเขียนเป็นสัญลักษณ์ได้คือ

          หน้าสัมผัสแบบ B (Form B) หมายถึง หน้าสัมผัสของ Relay ในสภาพปกติจะปิด (Normally close) และเป็นแบบ SPST เขียนเป็นสัญลักษณ์ได้คือ

          หน้าสัมผัสแบบ C (Form C) แบบนี้เรียกว่า "break, make หรือ transfer" เป็นหน้าสัมผัสแบบ SPDT เขียนสัญลักษณ์ได้ดังนี้ 

          หน้าสัมผัสแบบ C จะมีอยู่ด้วยกัน 3 ขา ในขณะที่ Relay ยังไม่ทำงาน หน้าสัมผัส 1 และ 2 จะต่อกันอยู่ เมื่อ Relay ทำงานหน้าสัมผัส 1 และ 2 จะแยกกัน จากนั้นหน้าสัมผัส 1 จะมาต่อกับหน้าสัมผัส 3 แทน พอ Relay หยุดทำงานหน้าสัมผัส 1 กับ 2 ก็จะกลับมาต่อกันตามเดิม

          หลังจากที่เราทราบคุณสมบัติของ Relay กันไปแล้ว ในบทความนี้เราจะยกตัวอย่างการประยุกต์ใช้งานโดยใช้ Relay โดยจะใช้ Relay Module 4 Channelsแบบ OPTO-ISOLATED ดังภาพ

Relay Module 4 Channels

           Relay Module 4 Channels มีเอาต์พุตคอนเน็คเตอร์ที่ Relay เป็น NO/COM/NC สามารถใช้กับโหลดได้ทั้งแรงดันไฟฟ้า DC และ AC โดยใช้สัญญาณในการควบคุมการทํางานด้วยสัญญาณโลจิก TTL

คุณสมบัติ (Features) 
• รีเลย์เอาต์พุตแบบ SPDT จํานวน 4 ช่อง 
• สั่งงานด้วยระดับแรงดัน TTL 
• CONTACT OUTPUT ของรีเลย์รับแรงดันได้สูงสุด 250 VAC 10 A, 30 VDC 10 A 
• มี LED แสดงสถานะ การทํางานของรีเลย์และแสดงสถานะของบอร์ด 
• มีจัมพ์เปอร์สําหรับเลือกว่าจะใช้กราวด์ร่วมหรือแยก 
• มี OPTO-ISOLATED เพื่อแยกกราวด์ส่วนของสัญญาณควบคุมกับไฟฟ้าที่ขับรีเลย์ออกจากกัน

ขาสัญญาณ (Pin Definition)

 

ภาพและตารางแสดงขาที่ใช้ในการเชื่อมต่อของ Relay Module 4 Channels

          ในบทความนี้ เราจะยกตัวอย่างการนำ Relay Module 4 Channels ไปใช้งาน โดยมีไมโครคอนโทรลเลอร์ Arduino UNO R3 ในการควบคุมการสั่งงาน จะยกตัวอย่างการประยุกต์ใช้งาน 2 ตัวอย่างคือ ตัวอย่างที่1 ควบคุมมอเตอร์ DC ให้หมุนได้ทั้งซ้าย-ขวา โดยไม่ต้องการคุมความเร็วรอบ และตัวอย่างที่2 ควบคุมการปิด-เปิดเครื่องใช้ไฟฟ้ากระแสสลับ 220 VAC 

ตัวอย่างที่1 ควบคุมมอเตอร์ให้หมุนได้ทั้งซ้าย-ขวา โดยไม่ต้องการคุมความเร็วรอบ

   

มอเตอร์หมุนขวา                                                          มอเตอร์หมุนซ้าย 

          จากวงจรนี้ เราจะเห็นได้ว่าในการจะควบคุมให้มอเตอร์หมุนไปกลับ หรือ ซ้าย-ขวา นั้นจะต้องใช้ Relay 2 ตัวในการควบคุม วิธีการต่อวงจรเป็นดังนี้ 

• นำขั้ว + ของมอเตอร์ต่อเข้ากับขา COM ของรีเลย์ตัวที่ 1
• นำขั้ว – ของมอเตอร์ต่อเข้ากับขา COM ของรีเลย์ตัวที่ 2
• นำขา NC ของรีเลย์ทั้ง 2 ตัว ต่อเข้ากับไฟลบ (GND)
• นำขา NO ของรีเลย์ทั้ง 2 ตัว ต่อเข้ากับไฟบวก (+5VDC)
วิธีต่อใช้งานจริงตามภาพด้านล่างนี้ โดยมีอุปกรณ์ดังนี้ Arduino + Relay Module + DC Motor

ภาพแสดงการต่อใช้งาน Arduino + Relay Module + Motor

           หลักการการทำงานคือ มีบอร์ด Arduino UNO R3 ในการรับข้อมูลจากคอมพิวเตอร์สื่อสารผ่านพอร์ต Serial แล้วนำค่าที่ได้ไปตรวจสอบว่าตรงกับค่าที่กำหนดไว้หรือไม่ ถ้าตรงกันก็สั่งให้ Relay ทำงานตามที่เราต้องการ 
ตัวอย่างโค้ดโปรแกรม

#define R 13 //กำหนดขาที่นำไปต่อกับรีเลย์

#define L 12
char test ; //สร้างตัวแปรไว้สำหรับรอรับข้อมูล
void setup() 
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
pinMode(R, OUTPUT); // กำหนดโหมดให้เป็น Output
pinMode(L, OUTPUT);
}
void loop() // run over and over
{
if (Serial.available()) // ตรวจสอบว่ามีข้อมูลเข้ามาหรือไม่
test = Serial.read();
else if (test == '1') // ถ้าข้อมูลที่เข้ามาคือ 1, 2, 3 ให้ทำงานตามที่กำหนด
{
digitalWrite(R, HIGH);
digitalWrite(L, LOW);
else if (test == '2')
{
digitalWrite(L, HIGH);
digitalWrite(R, LOW);
}
else if (test == '3')
{
digitalWrite(L, LOW);
digitalWrite(R, LOW);
}
}

ขั้นตอนการทดสอบ
1. ดาวน์โหลดโปรแกรมสำหรับส่งข้อมูลผ่าน Serial (ในบทความนี้ใช้โปรแกรม Terminal.exe
2. เปิดโปรแกรม Arduino นำโค้ดตัวอย่างด้านบน ไปรันและอัพโหลดไปยัง Arduino UNO R3
3. เปิดโปรแกรม Terminal.exe เลือก Com Port และกำหนดความเร็วในการรับส่งข้อมูล จากนั้นกดปุ่ม Connect 

4. ทำการส่งข้อมูลให้ Arduino โดยพิมพ์ข้อความลงในช่องด้านล่างของโปรแกรม

a. ข้อมูลที่กำหนดไว้คือ 1 = หมุนขวา, 2 = หมุนซ้าย, 3 = หยุดหมุน

ตัวอย่างที่2 ควบคุมการปิด-เปิดเครื่องใช้ไฟฟ้ากระแสสลับ 220 VAC  

วิธีการเชื่อมต่อ

สำหรับอุปกรณ์ที่ใช้ไฟฟ้ากระแสสลับ (AC)
• ต่อไฟเส้นที่ 1 จากแหล่งจ่ายไฟไปยังอุปกรณ์ที่ขั้วลบ (ถ้ามีแจ้งไว้ ถ้าไม่มีก็ใช้ขั้วใดก็ได้)
• ต่อไฟเส้นที่ 2 จากแหล่งจ่ายไฟเข้าขา NO ของรีเลย์
• ต่อสายจากขา COM ของรีเลย์ไปยังอุปกรณ์ไฟฟ้าขั้วที่เหลือ
สำหรับอุปกรณ์ที่ใช้ไฟฟ้ากระแสตรง (DC)
• ต่อไฟลบหรือ GND ไปยังอุปกณ์ไฟฟ้าเข้าที่ขั้วลบหรือ GND
• ต่อไฟบวกหรือ VCC ไปยังขา NO ของรีเลย์
• ต่อสายจากขา COM ของรีเลย์ไฟยังอุปกรณ์ไฟฟ้าที่ขั้วบวก

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

ตัวอย่างโค้ดโปรแกรม 

#define Lamp1 12 //กำหนดขาที่นำไปต่อกับรีเลย์
char test ; //สร้างตัวแปรไว้สำหรับรอรับข้อมูล
void setup() 
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
pinMode(Lamp1, OUTPUT); //กำหนดโหมดให้เป็น Output
}
void loop() // run over and over
{
if (Serial.available()) // ตรวจสอบว่ามีข้อมูลเข้ามาหรือไม่
test = Serial.read();
else if (test == '1') //ถ้าข้อมูลที่เข้ามาคือ 1 , 3 ให้ทำงานตามที่กำหนด
{
digitalWrite(Lamp1, HIGH);
}
else if (test == '3')
{
digitalWrite(Lamp1, LOW);
}
}

ขั้นตอนการทดสอบ

1. ดาวน์โหลดโปรแกรมสำหรับส่งข้อมูลผ่าน Serial (ในบทความนี้ใช้โปรแกรม Terminal.exe

2. เปิดโปรแกรม Arduino นำโค้ดตัวอย่างด้านบนไปรันและอัพโหลดไปยัง Arduino UNO R3
3. เปิดโปรแกรม Terminal.exe เลือก Com Port และกำหนดความเร็วในการรับส่งข้อมูล จากนั้นกดปุ่ม Connect

4. ทำการส่งข้อมูลให้ Arduino โดยพิมพ์ข้อความลงในช่องด้านล่างของโปรแกรม
a. ข้อมูลที่กำหนดไว้คือ 1 = เปิดไฟ, 3 = ปิดไฟ

ไมโครคอนโทลเลอร์7


arduino กับ LDR



arduino กับ LDR

 LDR : Light Dependent Resistor)                    

แอลดีอาร์ (LDR : Light Dependent Resistor)  คือ ความต้านทานชนิดที่ไวต่อแสง กล่าวคือ ตัวความต้านทานนี้สามารถเปลี่ยนสภาพทางความนำไฟฟ้า ได้เมื่อมีแสงมาตกกระทบ บางครั้งเรียกว่าโฟโตรีซีสเตอร์ ( Photo  Resistor)   หรือ โฟโตคอนดัคเตอร์   (Photo Conductor)   เป็นตัวต้านทานที่ทำมาจากสารกึ่งตัวนำ  

การต่อวงจรให้ ต่อวงจรตามภาพนะครับ คือ ต่อ LDR อนุกรมกับ ค่าความต้านทาน 4.71k 1เพื่อเป็นวงจรแบ่งแรงดัน

โดยต่อขา กลางระหว่าง LDR กับ resistor เข้าที่ขา arduino ที่ขา A0

การทำงานของ code คือ เมื่อมีค่าความเข้มแสง sensorValue มากกว่า 400 LED บนบอร์ด ที่ขา 13 จะติดขึ้นมาแต่มีมีค่า sensorValue น้อยกว่า 400 LED บนบอร์ดก็จะดับ

ดูค่า OUTPUT ทาง serialmonitor  

จาก code นี้เราสามารถนำไปประยุกต์เปิดปิดอุปกรณืไฟฟ้า โดยวัดว่าเป็นกลางวันหรือกลางคืนครับ  

int sensorPin = A0; // select the input pin for the ldr unsigned int sensorValue = 0; // variable to store the value coming from the ldr void setup() {   pinMode(13, OUTPUT);   //Start Serial port   Serial.begin(9600); // start serial for output - for testing } void loop() {   // read the value from the ldr:   sensorValue = analogRead(sensorPin);   if(sensorValue<400)

{
digitalWrite(13, HIGH); // set the LED off
{
  else
{
digitalWrite(13, LOW); // set the LED on   }  // For DEBUGGING - Print out our data, uncomment the lines below   Serial.print(sensorValue, DEC); // print the value (0 to 1024)   Serial.println(""); // print carriage return   delay(500); }

ไมโครคอนโทลเลอร์6


const int analogInPin = A0;const int Relay = 2;

int sensorValue = 0;        // ตัวแปรค่า Analog
int outputValue = 0;        // ตัวแปรสำหรับ Map เพื่อคิด %

void setup() {
  Serial.begin(9600);  pinMode(Relay, OUTPUT);}

void loop() {
  sensorValue = analogRead(analogInPin);  outputValue = map(sensorValue, 0, 1023, 100, 0);

  Serial.print("Soil Moisture = ");
  Serial.print(outputValue);  Serial.println(" %");

  if (outputValue <= 40) {  //ตั้งค่า % ที่ต้องการจะรดน้ำต้นไม้
    digitalWrite(Relay, HIGH);  }  else {    digitalWrite(Relay, LOW);  }  delay(1000);}

ทดลองวัดอุณหภูมิในChip Arduino กันโดยไม่ใช้ Sensor     

รุ่นที่รองรับการวัดอุณหภูมิมีดังต่อไปนี้ ATmega8 : วัดไม่ได้ATmega8L : วัดไม่ได้ATmega8A : วัดไม่ได้ATmega168 : วัดไม่ได้ATmega168A : วัดได้ATmega168P : วัดได้ATmega328 (Arduino uno R3) : วัดได้ATmega328P (Arduino uno R3) : วัดได้ATmega1280 (Arduino Mega) : วัดไม่ได้ATmega2560 (Arduino Mega 2560) : วัดไม่ได้ATmega32U4 (Arduino Leonardo) : วัดได้Nodemcu ทุกรุ่น : วัดไม่ได้ 
void setup()
{
  Serial.begin(9600);
  Serial.println(F("Internal Temperature Sensor"));
} void loop()
{
  Serial.println(GetTemp(),1);
  delay(1000);
} double GetTemp(void)
{
  unsigned int wADC;
  double t;
  ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3));
  ADCSRA |= _BV(ADEN);  // enable the ADC
  delay(20);            // wait for voltages to become stable.
  ADCSRA |= _BV(ADSC);  // Start the ADC
  // Detect end-of-conversion
  while (bit_is_set(ADCSRA,ADSC));
  // Reading register "ADCW" takes care of how to read ADCL and ADCH.
  wADC = ADCW;
  // The offset of …

เปิดปิดไฟควบคุมผ่าน App มือถือ App ควบคุมระบบ เปิดปิดไฟ แบบง่ายสุดๆ (ต้มน้ำฉีกซองทานได้เลย) ด้วย Nodemcu Esp8266 และ App บน Android อุปกรณ์ มีดังต่อไปนี้ครับNodeMCU Esp8266สายไฟRelay 4ch แบบ Active LOWจอแสดงผลLCD I2C

1. ต่อวงจรดังนี้ ตำแหน่งขา NodeMCU Esp8266อุปกรณ์ขา D1SCLขา D2SDA ขา VinVCC ของจอ LCDขา GNDGND ของจอ LCDขา VinVCC ของ Relayขา GNDGND ของ Relayขา D0IN1 ของ Relayขา D5IN2 ของ Relayขา D6


วันจันทร์ที่ 23 กรกฎาคม พ.ศ. 2561

ไมโครคอนโทลเลอร์5

โปรเจค Arduino ง่ายๆ เปิด ปิดไฟด้วยเสียง



อุปกรณ์หลัก

         - Arduino UNO R3

            - Relay 1 Channel DC 5V Module

        - Sound Detection Sensor Module LM393

           -  LED  Lighting


Wiring diagram


Upload โค้ดนี้ ไปยัง บอร์ด Arduino UNO R3

int sound_sensor = 4;
int relay = 5;

int clap = 0;
long detection_range_start = 0;
long detection_range = 0;
boolean status_lights = false;

void setup() {
  pinMode(sound_sensor, INPUT);
  pinMode(relay, OUTPUT);
}

void loop() {
  int status_sensor = digitalRead(sound_sensor);
  if (status_sensor == 0)
  {
    if (clap == 0)
    {
      detection_range_start = detection_range = millis();
      clap++;
    }
    else if (clap > 0 && millis()-detection_range >= 50)
    {
      detection_range = millis();
      clap++;
    }
  }
  if (millis()-detection_range_start >= 400)
  {
    if (clap == 2)
    {
      if (!status_lights)
        {
          status_lights = true;
          digitalWrite(relay, HIGH);
        }
        else if (status_lights)
        {
          status_lights = false;
          digitalWrite(relay, LOW);
        }
    }
    clap = 0;
  }
}

        ให้เอาไขควงหมุน ปรับค่าการรับสัญญาณเสียง ที่ เซ็นเซอร์เสียง LM393 โดยให้หมุนตัว R ปรับค่าได้ แบบ trimpot สีฟ้า โดย เมื่อ ตบมือ 2 ครั้ง ให้ ไฟ LED สีแดง ที่ รีเลย์ ติด และ เมื่อ ตบมืออีก 2 ครั้ง ให้ ไฟ LED สีแดง ที่ รีเลย์ ดับ

ไมโครคอนโทลเลอร์4

Code โปรเจค หุ่นยนต์เดินตามเส้น 3 เซ็นเซอร์ Arduino + L298P     ^-^



              โปรเจค นี้จะเป็นการนำ Arduino UNO R3 + L298P Motor Shield และ เซ็นเซอร์ 3 Road Tracing Sensor Robot มาทำเป็น หุ่นยนต์เดินตามเส้น 3 เซ็นเซอร์  โดยให้หุ่นยนต์ตัดสินใจ เดินตามเส้น โดยอัตโนมัติ ด้วยการตรวจจับ เส้นสีดํา พื้นสีขาว

อุปกรณ์ที่ใช้

1. 2WD Smart Car Robot Chassis Kits

2. Arduino UNO R3 - Made in italy

3. L298P Motor Shield Board

4. Jumper (M2M) cable 20cm Male to Male

5. Jumper (F2M) cable 30cm Female to Female

6. สกรูหัวกลม+น็อตตัวเมีย ยาว 12 มม.

7. รางถ่าน 18650 แบบ 2 ก้อน

8. ถ่านชาร์จ 18650 Panasonic NCR18650B 3.7v  จำนวน 2 ก้อน

9. 3 Road Tracing Sensor Robot

10. เสารองแผ่นพีซีบีแบบโลหะ ยาว 25 มม.

ใช้ จั้มเปอร์ เมีย-เมีย 30cm เชื่อมต่อ เซ็นเซอร์  เข้ากับ L298P ตามรูปด้านล่าง 



เซ็นเซอร์ <-> L298P

VCC  <-> +5

     L <-> A1

     C <-> A2

     R <-> A3

GND <-> GND

ภาพรวมการเชื่อมต่อระหว่าง L298P กับ เซ็นเซอร์ 3 Road Tracing Sensor Robot


การเชื่อมต่อสายที่ A1 ถึง A3



ด้านขวาของหุ่นยนต์



ด้านล่างของหุ่นยนต์


ด้านหน้าของหุ่นยนต์



จากนั้นใช้สาย USB เชื่อมต่อระหว่าง คอมพิวเตอร์ กับ Arduino UNO R3




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

Code ทดสอบ

/*

read analog data from A1-A3 and send to PC via Serial port
*/

int sensor_L , sensor_C , sensor_R ; //optical sensor values
String tmp ;
int ADC_stabilize = 5 ;

void setup ( ) {
  // initialize the serial communication:
  Serial . begin ( 9600 ) ;
}

void loop ( ) {
  //take a snapshot
  sensor_L = digitalRead ( A1 ) ;
  delay ( ADC_stabilize ) ; //stabilize
  sensor_L = digitalRead ( A1 ) ;
  delay ( ADC_stabilize ) ;

  sensor_C = digitalRead ( A2 ) ;
  delay ( ADC_stabilize ) ;
  sensor_C = digitalRead ( A2 ) ;
  delay ( ADC_stabilize ) ;

  sensor_R = digitalRead ( A3 ) ;
  delay ( ADC_stabilize ) ;
  sensor_R = digitalRead ( A3 ) ;
  delay ( ADC_stabilize ) ;

  tmp = "L=" + String ( sensor_L ) + " C=" + String ( sensor_C ) + " R=" + String ( sensor_R ) ;

  // send the value of analog inputs:
  Serial . println ( tmp ) ;

  // wait a bit for next reading
  delay ( 1000 ) ; //1000=1 sec

}

ทดสอบการทำงาน

เมื่อเริ่มการทดสอบไปทั้งสามด้วยจะติด


และเมื่อนำไปยังเส้นดังรูป


ไฟ LED สีแดง ของ เซ็นเซอร์ซ้าย จะดับ และ Serial Monitor จะแสดง L=1 C=0 R=0


และเมื่อ เซ็นเซอร์กลางของหุ่นยนต์  อยู่บริเวณเทปสีดำ

และ เซ็นเซอร์ซ้าย และ  เซ็นเซอร์ขวา อยู่บริเวณพื้นสีขาว


ไฟ LED สีแดง ของ เซ็นเซอร์ตัวกลาง จะดับ และ Serial Monitor จะแสดง L=0 C=1 R=0

และเมื่อ เซ็นเซอร์ขวาของหุ่นยนต์  อยู่บริเวณเทปสีดำ

และ เซ็นเซอร์ซ้าย และ  เซ็นเซอร์กลาง อยู่บริเวณพื้นสีขาว


ไฟ LED สีแดง ของ เซ็นเซอร์ขวา จะดับ และ Serial Monitor จะแสดง L=0 C=0 R=1


                   แสดงว่า การเชื่อมต่อ เซ็นเซอร์ ทั้ง 3 ตัว นั้นถูกต้อง และ พร้อมใช้งานแล้ว

Code ใช้งาน

/*

    Line Following Robot 3 Sensors with Arduino UNO + L298P
    For more details visit:
    https://robotsiam.blogspot.com/2018/01/3-arduino-l298p.html

*/

/*-------definning Outputs------*/

int MA1 = 12;     // Motor A1
int MA2 =  3;     // Motor A2
int PWM_A =  10;   // Speed Motor A

int MB1 =  13;     // Motor B1
int MB2 =  8;     // Motor B2
int PWM_B =  11;  // Speed Motor B

int SPEED = 110;  // Speed PWM สามารถปรับความเร็วได้ถึง 0 - 255

/*-------definning Sensor------*/

int sensor[3] = {0, 0, 0};

void setup() {

  //Setup Channel A
  pinMode(12, OUTPUT); //Motor A1
  pinMode(3, OUTPUT); //Motor A2
  pinMode(10, OUTPUT); //Speed PWM Motor A

  //Setup Channel B
  pinMode(13, OUTPUT);  //Motor B1
  pinMode(8, OUTPUT);  //Motor B2
  pinMode(11, OUTPUT); //Speed PWM Motor B

}

void loop() {

  sensor[0] = digitalRead(A1);
  sensor[1] = digitalRead(A2);
  sensor[2] = digitalRead(A3);

  if ((sensor[0] == 0) && (sensor[1] == 1) && (sensor[2] == 0) )
    Forward(1);
  else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 1) )
    turnRight(10);
  else if ((sensor[0] == 0) && (sensor[1] == 1) && (sensor[2] == 1) )
    turnRight(200);
  else if ((sensor[0] == 1) && (sensor[1] == 0) && (sensor[2] == 0)  )
    turnLeft(10);
  else if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[2] == 0) )
    turnLeft(200);

  else
    Forward(1);

}

void Backward(int time)
{
  digitalWrite(MA1, LOW);
  digitalWrite(MA2, HIGH);
  analogWrite(PWM_A, SPEED);

  digitalWrite(MB1, HIGH);
  digitalWrite(MB2, LOW);
  analogWrite(PWM_B, SPEED);

  delay(time);
}

void Forward (int time)
{
  digitalWrite(MA1, HIGH);
  digitalWrite(MA2, LOW);
  analogWrite(PWM_A, SPEED);

  digitalWrite(MB1, LOW);
  digitalWrite(MB2, HIGH);
  analogWrite(PWM_B, SPEED);

  delay(time);
}

void turnLeft(int time)
{
  digitalWrite(MA1, HIGH);
  digitalWrite(MA2, LOW);
  analogWrite(PWM_A, SPEED);

  digitalWrite(MB1, LOW);
  digitalWrite(MB2, LOW);
  analogWrite(PWM_B, 0);

  delay(time);
}

void turnRight(int time)
{
  digitalWrite(MA1, LOW);
  digitalWrite(MA2, LOW);
  analogWrite(PWM_A, 0);

  digitalWrite(MB1, LOW);
  digitalWrite(MB2, HIGH);
  analogWrite(PWM_B, SPEED);

  delay(time);
}

void Stop(int time)
{
  digitalWrite(MA1, LOW);
  digitalWrite(MA2, LOW);
  analogWrite(PWM_A, 0);

  digitalWrite(MB1, LOW);
  digitalWrite(MB2, LOW);
  analogWrite(PWM_B, 0);

  delay(time);

}

ไมโครคอนโทรลเลอร์  3

รแกรมสวิตซ์กดติด-กดดับ

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

ประกอบวงจรตามรูปด้านล่าง ลงในโปรแกรม Proteus ครับ



เริ่มเขียนโปรแกรมกันเลยครับ

#include <16F84A.h>

#use delay(clock=4000000)

#fuses XT,NOWDT,NOPROTECT

#use fast_io(A)

#use fast_io(B)

int1 a;                                   

void main()

{

  set_tris_a(0xff);                    

  set_tris_b(0x00);                     

  output_b(0b00000000);           

  a=0;                                      

  

  while(true)                            

     {

        while(!input(pin_a0))        

           {  

              a=~a;                        

              output_bit(pin_b0,a);  

              while(!input(pin_a0)) 

                 {

                   delay_ms(100);    

                 }       

            }  

      }                                    

}



ไมโครคอนโทรลเลอร์  2

การส่งข้อมูลออกพอร์ตแบบไบต์

         รูปแบบ    output_พอร์ต(ข้อมูล);

        ตัวอย่าง   output_B(0x0FF);                  หมายถึง ส่งข้อมูล 0xFF หรือ 11111111B ออกพอร์ต B                          ทั้ง 8 บิต

   ลำดับที่ 1  11111111

         ลำดับที่ 2  00000000

         1 หมายถึง หลอดแสดงผลติด ทั้งหมด

         2 หมายถึง หลอดแสดงผลดับ ทั้งหมด

วิธีการคิด

     ลำดับที่ 1 หลอดแสดงผลติด 8 บิตต้องส่งข้อมูลลอจิก "1" ออกพอร์ต B ทุกบิต คือ             output_B(0xFF);          ลำดับที่ 2 หลอดแสดงผลดับ 8 บิตต้องส่งข้อมูลลอจิก "0" ออกพอร์ต B ทุกบิต คือ             output_B(0x00);

เขียนโค๊ต

#include <16F877.h>
#fuses   HS,NOPUT,NOWDT,NOPROTECT
#use     delay (clock=4Mhz)
void main()
{
  while(1)
  {
      output_B(0xFF);
      delay_ms(500);
      output_B(0x00);
      delay_ms(500);
  }
}