ในโครงการนี้เราจะควบคุมหุ่นยนต์ด้วยตนเองผ่านโทรศัพท์มือถือของเราโดยใช้โมดูล DTMF และ Arduino
โดย: Ankit Negi, Kanishk Godiyal และ Navneet Singh sajwan
บทนำ
ในโครงการนี้มีโทรศัพท์มือถือสองเครื่องหนึ่งเครื่องสำหรับโทรและอีกเครื่องหนึ่งสำหรับรับสาย โทรศัพท์ที่รับสายเชื่อมต่อกับหุ่นยนต์ผ่านแจ็คเสียง
ผู้ที่กำลังโทรสามารถควบคุมหุ่นยนต์ได้เพียงแค่กดแป้นกดหมายเลข (เช่นหุ่นยนต์สามารถใช้งานได้จากทุกมุมโลก)
จำเป็นต้องมีส่วนประกอบ
1 - Arduino UNO
2 - หุ่นยนต์แมนนวล
มอเตอร์ 3 - 4 ตัว (ที่นี่เราใช้ 300 รอบต่อนาที)
4 - โมดูล DTMF
5 - ไดรเวอร์มอเตอร์
แบตเตอรี่ 6 - 12 โวลต์
7 - สวิตช์
8 - แจ็คหูฟัง
9 - โทรศัพท์มือถือสองเครื่อง
10 - การเชื่อมต่อสายไฟ
เกี่ยวกับ MANUAL ROBOT
หุ่นยนต์แมนนวลประกอบด้วยแชสซี (ตัวถัง) ซึ่งสามารถติดมอเตอร์สามหรือสี่ตัว (ซึ่งขันสกรูด้วยยาง) ได้ขึ้นอยู่กับความต้องการ
มอเตอร์ที่จะใช้ขึ้นอยู่กับความต้องการของเรานั่นคือสามารถให้ความเร็วสูงหรือแรงบิดสูงหรือทั้งสองอย่างที่เหมาะสม การใช้งานเช่นควอดคอปเตอร์ต้องใช้มอเตอร์ความเร็วสูงมากเพื่อยกต้านแรงโน้มถ่วงในขณะที่การใช้งานเช่นการขยับแขนกลหรือการขึ้นทางลาดชันต้องใช้มอเตอร์แรงบิดสูง
มอเตอร์ทั้งสองตัวทางด้านซ้ายและด้านขวาของหุ่นยนต์เชื่อมต่อแบบขนานแยกกัน โดยปกติจะเชื่อมต่อกับแบตเตอรี่ 12volt ผ่านสวิตช์ DPDT (double pin double throw)
แต่ในโครงการนี้เราจะใช้โทรศัพท์มือถือแทน DPDT เพื่อควบคุมบอท
เกี่ยวกับตัวขับมอเตอร์
Arduino ให้กระแสสูงสุด 40mA โดยใช้พิน GPIO (อินพุตเอาต์พุตวัตถุประสงค์ทั่วไป) ในขณะที่ให้ 200mA โดยใช้ Vcc และกราวด์
มอเตอร์ต้องใช้กระแสไฟฟ้ามากในการทำงาน เราไม่สามารถใช้ arduino เพื่อจ่ายไฟให้กับมอเตอร์ได้โดยตรงดังนั้นเราจึงใช้ตัวขับมอเตอร์
ตัวขับมอเตอร์ประกอบด้วย H Bridge (ซึ่งเป็นการรวมกันของทรานซิสเตอร์) IC (L298) ของตัวขับมอเตอร์ขับเคลื่อนด้วย 5v ซึ่งมาจาก arduino
ในการจ่ายไฟให้กับมอเตอร์ต้องใช้อินพุต 12v จาก arduino ซึ่งในที่สุดก็มาจากแบตเตอรี่ 12 v ดังนั้น arduino จึงใช้พลังงานจากแบตเตอรี่และให้กับไดรเวอร์มอเตอร์
ช่วยให้เราควบคุมความเร็วและทิศทางของมอเตอร์ได้โดยให้กระแสไฟฟ้าสูงสุด 2 แอมแปร์
บทนำสู่โมดูล DTMF
DTMF ย่อมาจาก Dual tone multi frequency แป้นกดหมายเลขของเราเป็นโทนเนอร์หลายความถี่สองปุ่มเช่นปุ่มเดียวให้เสียงสองโทนผสมกันที่มีความถี่ต่างกัน
โทนเสียงหนึ่งถูกสร้างขึ้นจากกลุ่มเสียงที่มีความถี่สูงในขณะที่อีกโทนหนึ่งมาจากกลุ่มความถี่ต่ำ ทำเพื่อให้เสียงทุกประเภทไม่สามารถเลียนแบบเสียงได้
ดังนั้นเพียงแค่ถอดรหัสอินพุตของปุ่มกดโทรศัพท์เป็นรหัสไบนารีสี่บิต ความถี่ของหมายเลขปุ่มกดที่เราใช้ในโครงการของเราแสดงไว้ในตารางด้านล่าง
DigitLow ความถี่ (เฮิรตซ์) ความถี่สูง (เฮิรตซ์) 2697133647701209677014778852133609411336
ลำดับการถอดรหัสไบนารีของตัวเลขของแป้นกดหมายเลขแสดงอยู่ในตารางด้านล่าง
หลัก D3 D2 D1 D0 1 0 0 0 1 สอง 0 0 1 0 3 0 0 1 1 4 0 1 0 0 5 0 1 0 1 6 0 1 1 0 7 0 1 1 1 8 1 0 0 0 9 1 0 0 1 0 1 0 1 0 * 1 0 1 1 # 1 1 0 0
แผนภูมิวงจรรวม
การเชื่อมต่อ
ตัวขับมอเตอร์ -
- Pin 'A' และ 'B' ควบคุมมอเตอร์ด้านซ้ายในขณะที่ Pin 'C' และ 'D' ควบคุมด้านขวาของมอเตอร์ หมุดทั้งสี่นี้เชื่อมต่อกับมอเตอร์ทั้งสี่ตัว
- Pin ‘E’ คือการจ่ายไฟ IC (L298) ซึ่งนำมาจาก arduino (5v)
- หมุด 'F' เป็นกราวด์
- Pin 'G' ใช้พลังงาน 12 โวลต์จากแบตเตอรี่ผ่านขา Vin ของ arduino
- Pins 'H', 'I', 'J' และ 'K' รับลอจิกจาก arduino
DTMF -
- พิน 'a' เชื่อมต่อกับ 3.5 โวลต์ของ arduino เพื่อจ่ายไฟให้กับ IC (SC9270D)
- พิน 'b' เชื่อมต่อกับกราวด์
- อินพุตของ DTMF นำมาจากโทรศัพท์ผ่านแจ็ค
- เอาต์พุตในรูปแบบของข้อมูลไบนารีผ่านพิน (D0 - D3) ไปที่ arduino
ARDUINO -
- เอาต์พุตของ DTMF จากพิน (D0 - D3) มาที่พินดิจิทัลของ arduino เราสามารถเชื่อมต่อเอาต์พุตนี้กับพินดิจิทัลสี่พินใดก็ได้ที่แตกต่างกันไปจาก (2 - 13) ใน arduino ที่นี่เราใช้หมุด 8, 9, 10 และ 11
- พินดิจิทัล 2 และ 3 ของ arduino เชื่อมต่อกับหมายเลขพิน ‘H’ และ ‘I’ ของไดรเวอร์มอเตอร์ในขณะที่พิน 12 และ 13 ของ arduino เชื่อมต่อกับ ‘J’ และ ’K’
- Arduino เชื่อมต่อกับแบตเตอรี่ 12 โวลต์
รหัสโปรแกรม -
int x // initialising variables
int y
int z
int w
int a=20
void setup()
{
pinMode(2,OUTPUT) //left motor
pinMode(3,OUTPUT) //left
pinMode(8,INPUT) // output from DO pin of DTMF
pinMode(9,INPUT) //output from D1 pin of DTMF
pinMode(10,INPUT) //output from D2 pin of DTMF
pinMode(11,INPUT) // output from D3 pin of DTMF
pinMode(12,OUTPUT) //right motor
pinMode(13,OUTPUT) //right
Serial.begin(9600)// begin serial communication between arduino and laptop
}
void decoding()// decodes the 4 bit binary number into decimal number
{
if((x==0)&&(y==0)&&(z==0)&&(w==0))
{
a=0
}
if((x==0)&&(y==0)&&(z==1)&&(w==0))
{
a=2
}
if((x==0)&&(y==1)&&(z==0)&&(w==0))
{
a=4
}
if((x==0)&&(y==1)&&(z==1)&&(w==0))
{
a=6
}
if((x==1)&&(y==0)&&(z==0)&&(w==0))
{
a=8
}
}
void printing()// prints the value received from input pins 8,9,10 and 11 respectively
{
Serial.print(' x ')
Serial.print( x )
Serial.print(' y ')
Serial.print( y )
Serial.print(' z ')
Serial.print( z )
Serial.print(' w ')
Serial.print( w )
Serial.print(' a ')
Serial.print(a)
Serial.println()
}
void move_forward()// both side tyres of bot moves forward
{
digitalWrite(2,HIGH)
digitalWrite(3,LOW)
digitalWrite(12,HIGH)
digitalWrite(13,LOW)
}
void move_backward()//both side tyres of bot moves backward
{
digitalWrite(3,HIGH)
digitalWrite(2,LOW)
digitalWrite(13,HIGH)
digitalWrite(12,LOW)
}
void move_left()// only left side tyres move forward
{
digitalWrite(2,HIGH)
digitalWrite(3,LOW)
digitalWrite(12,LOW)
digitalWrite(13,HIGH)
}
void move_right()//only right side tyres move forward
{
digitalWrite(2,LOW)
digitalWrite(3,HIGH)
digitalWrite(12,HIGH)
digitalWrite(13,LOW)
}
void halt()// all motor stops
{
digitalWrite(2,LOW)
digitalWrite(3,LOW)
digitalWrite(12,LOW)
digitalWrite(13,LOW)
}
void reading()// take readings from input pins that are connected to DTMF D0, D1, D2 and D3 PINS.
{
x=digitalRead(8)
y=digitalRead(9)
z=digitalRead(10)
w=digitalRead(11)
}
void loop()
{
reading()
decoding()
if((x==0)&&(y==0)&&(z==1)&&(w==0))
{
move_forward()
reading()
decoding()
printing()
}
if((x==1)&&(y==0)&&(z==0)&&(w==0))
{
move_backward()
reading()
decoding()
printing()
}
if((x==0)&&(y==1)&&(z==0)&&(w==0))
{
move_left()
reading()
decoding()
printing()
}
if((x==0)&&(y==1)&&(z==1)&&(w==0))
{
move_right()
reading()
decoding()
printing()
}
if((x==0)&&(y==0)&&(z==0)&&(w==0))
{
halt()
reading()
decoding()
printing()
}
a=20
printing()
}
คำอธิบายรหัส
- ก่อนอื่นเราเริ่มต้นตัวแปรทั้งหมดก่อนการตั้งค่าเป็นโมฆะ
- ในการตั้งค่าเป็นโมฆะพินทั้งหมดที่จะใช้จะถูกกำหนดให้เป็นอินพุตหรือเอาต์พุตตามวัตถุประสงค์
- มีการสร้างฟังก์ชันใหม่“ การถอดรหัสโมฆะ ()” ในฟังก์ชันนี้อินพุตไบนารีทั้งหมดที่เราได้รับจาก DTMF จะถูกถอดรหัสเป็นทศนิยมโดย arduino และตัวแปรที่กำหนดสำหรับค่าทศนิยมนี้คือ a.
- ฟังก์ชันอื่น“ การพิมพ์เป็นโมฆะ ()” ถูกสร้างขึ้น ฟังก์ชันนี้ใช้เพื่อพิมพ์ค่าอินพุตจากพิน DTMF
- ในทำนองเดียวกันฟังก์ชันที่จำเป็นต้องมีห้าฟังก์ชันเพื่อทำงานที่ต้องการ ฟังก์ชันเหล่านี้ ได้แก่ :
โมฆะ move_left () // หุ่นยนต์เลี้ยวซ้าย
โมฆะ move_right () // หุ่นยนต์เลี้ยวขวา
โมฆะ move_forward () // หุ่นยนต์เคลื่อนที่ไปข้างหน้า
โมฆะ move_backward () // หุ่นยนต์เคลื่อนที่ไปข้างหลัง
เป็นโมฆะ halt () // หุ่นยนต์หยุด
- ตอนนี้ฟังก์ชันเหล่านี้ถูกใช้ในฟังก์ชัน void loop เพื่อทำงานเมื่อใดก็ตามที่มีการเรียกใช้ตามอินพุตจากแป้นกดของโทรศัพท์มือถือ
ตัวอย่างเช่น:::
if((x==0)&&(y==0)&&(z==1)&&(w==0))
{
move_forward()
reading()
decoding()
printing()
}
ดังนั้นเมื่อกดปุ่ม 2 หรือรับ 0010 บนพินอินพุต arduino จะถอดรหัสสิ่งนี้และทำให้ฟังก์ชันเหล่านี้ทำงานได้: เดินหน้าต่อไป()
การอ่าน ()
ถอดรหัส ()
การพิมพ์ ()
การทำงานของวงจร
การควบคุมที่เราใช้ในโครงการของเรามีดังนี้ -
2 - เพื่อก้าวไปข้างหน้า
4 - เพื่อเลี้ยวซ้าย
6 - เพื่อเลี้ยวขวา
8 - เพื่อเลื่อนไปข้างหลัง
0 - เพื่อหยุด
หลังจากโทรไปยังโทรศัพท์ที่เชื่อมต่อกับหุ่นยนต์บุคคลนั้นจะเปิดแป้นกดหมายเลขของเขา
- หากกด '2' DTMF รับอินพุตถอดรหัสเป็นเลขฐานสองที่เทียบเท่าเช่น ‘0010’ และส่งไปยังพินดิจิทัลของ arduino จากนั้น Arduino จะส่งรหัสนี้ไปยังโปรแกรมควบคุมมอเตอร์ตามที่เราได้ตั้งโปรแกรมไว้เมื่อรหัสจะเป็น '0010' มอเตอร์จะหมุนในทิศทางตามเข็มนาฬิกาดังนั้นหุ่นยนต์ของเราจะเคลื่อนที่ไปข้างหน้า
- หากกด '4' รหัสที่เทียบเท่าจะเป็น '0100' และตามการตั้งโปรแกรมมอเตอร์ด้านซ้ายจะหยุดทำงานและมีเพียงมอเตอร์ด้านขวาเท่านั้นที่จะหมุนตามเข็มนาฬิกาและด้วยเหตุนี้หุ่นยนต์ของเราจะเลี้ยวซ้าย
- หากกดปุ่ม ‘6’ มอเตอร์ด้านขวาจะหยุดและมีเพียงมอเตอร์ด้านซ้ายเท่านั้นที่จะหมุนตามเข็มนาฬิกาและด้วยเหตุนี้หุ่นยนต์ของเราจะหมุนไปทางขวา
- ถ้ากด ‘8’ มอเตอร์ของเราจะหมุนไปในทิศทางทวนเข็มนาฬิกาดังนั้นหุ่นยนต์ของเราจะเคลื่อนที่ถอยหลัง
- หากกด ‘0’ มอเตอร์ทั้งหมดของเราจะหยุดและหุ่นยนต์จะไม่เคลื่อนที่
ในโครงการนี้เราได้กำหนดฟังก์ชันให้กับหมายเลขแป้นกดหมายเลขห้าหมายเลขเท่านั้น เราสามารถเพิ่มกลไกประเภทอื่น ๆ และกำหนดหมายเลขแป้นหมายเลขให้กับกลไกนั้นเพื่อสร้างเวอร์ชันอัปเกรดของโครงการนี้
คะแนนที่ควรเก็บไว้ในใจ
1 - แม่แรงไม่ควรหลวม
2 - เสียงปุ่มกดโทรศัพท์ควรมีค่าสูงสุด
3 - ควรปิดอินเทอร์เน็ต / Wi-Fi ของโทรศัพท์เพื่อหลีกเลี่ยงผลกระทบจากการรบกวน
4 - พินซ้าย (เช่นพิน 'b') ของ DTMF คือกราวด์และพินขวา (เช่นพิน 'a') เชื่อมต่อกับ 3.3v
ภาพต้นแบบของวงจรรถหุ่นยนต์ควบคุมโทรศัพท์มือถือโดยใช้ DTMF
วิดีโอสาธิตการใช้โทรศัพท์มือถือควบคุมรถ RC โดยใช้ DTMF
ก่อนหน้านี้: รู้เบื้องต้นเกี่ยวกับ EEPROM ใน Arduino ถัดไป: สร้าง Line Follower Robot สำหรับโครงการ Science Fair