<< Go Back

1. รถหุ่นยนต์ Raspberry Pi คอนโทรลด้วยมือถือ สิ่งที่ต้องมี
1. สัญญาณ Wi-Fi โดยบอร์ด Raspberry Pi และมือถือจะต้องทำการเชื่อมต่อ Wi-Fi ตัวเดียวกัน ซึ่งภายในตัวบอร์ดนั้นจะมี Wi-Fi อยู่ในตัวบอร์ดแล้ว
2. บอร์ด Raspberry Pi ใช้บอร์ดที่มี GPIO 40 ขา
3. ชุดประกอบรถหุ่นยนต์ ซึ่งประกอบด้วยตัวรถ ล้อ มอเตอร์ กระบะใส่ถ่าน
4. บอร์ดขับเคลื่อนมอเตอร์ ในที่นี้จะใช้บอร์ด L298N
5. Power bank ที่มีขนาดความจุ 2,200 mAh. ขึ้นไป เพื่อจ่ายไฟให้แก่บอร์ด Raspberry Pi เพื่อให้หุ่นยนต์เคลื่อนที่ได้อย่างอิสระ
6. โปรแกรม Node-RED ใช้ในการสร้างปุ่มคำสั่งควบคุมการเคลื่อนที่ของหุ่นยนต์ ไม่ว่าจะเป็นเดินหน้า ถอยหลัง เลี้ยวซ้าย เลี้ยวขวา และหยุดเดิน โดยจะต้องเพิ่มปุ่มปิดลงในโปรแกรมเพื่อให้สามารถปิด Raspberry Pi จากระยะไกลได้

ขั้นตอนการประกอบ
1. เชื่อมต่อรถหุ่นยนต์เข้ากับบอร์ดขับมอเตอร์ L298N
1.1 เชื่อมต่อสายแบตเตอรี่ของหุ่นยนต์ โดยเส้นสีแดงเสียบเข้าในช่อง +5V DC Input ของบอร์ด L298N แล้วขันน็อตให้แน่น ส่วนเส้นสีดำใส่เข้ากับช่อง GROUND ของบอร์ดขับมอเตอร์ โดยใช้สาย Jumper แบบตัวผู้-ตัวเมีย ใส่เข้าไปในช่อง GROUND กับเส้นสีดำด้วย แล้วขันน็อตให้แน่น ส่วนปลายอีกด้านหนึ่งของสาย Jumper จะใส่เข้าไปในช่อง GROUND ของขา GPIO ของบอร์ด Raspberry Pi

1.2 ใช้สาย Jumper แบบตัวผู้-ตัวผู้ เสียบต่อจากสายมอเตอร์ทั้ง 2 มอเตอร์ของหุ่นยนต์เข้ากับช่อง OUT1 – OUT4 ของบอร์ดขับมอเตอร์ (ดูช่อง OUT1 – OUT4 ด้านหลังของบอร์ด)

2. เชื่อมต่อบอร์ด L298N เข้ากับบอร์ด Raspberry Pi
2.1 นำปลายสาย Jumper Ground จากบอร์ด L298N เสียบเข้ากับช่อง GROUND ของขา GPIO ของบอร์ด Raspberry Pi (ในที่นี้จะเสียบเข้ากับขา GPIO ลำดับที่ 6 ซึ่งเป็น Ground)

2.2 ใช้สาย Jumper ตัวเมีย-ตัวเมีย 4 เส้น เสียบเข้าไปในช่อง IN1 – IN4 ของบอร์ด L298N ส่วนปลายสายเสียบเข้ากับช่อง GPIO ของบอร์ด Raspberry Pi (ในที่นี้จะเสียบเข้ากับช่อง GPIO ลำดับที่ 7, 11, 13 และ 15 ตามลำดับ)

3. นำบอร์ด Raspberry Pi มาเสียบสาย HDMI เข้ากับจอภาพหรือเครื่องคอมพิวเตอร์ที่มีพอร์ต HDMI IN เชื่อมต่อเมาส์และคีย์บอร์ด และหลังจากนั้นเสียบสาย Adapter เพื่อจ่ายไฟแก่บอร์ด Raspberry Pi จะปรากฏไปสถานะสีส้มที่ตัวบอร์ด ระบบจะทำการบู๊ตเข้าระบบปฏิบัติการ Raspbian โดยอัตโนมัติ

4. ทำการเชื่อมต่อ Wi-Fi โดยคลิกที่เมนู Wi-Fi ที่มุมบนขวาของหน้าจอและคลิก Turn On Wi-Fi

หลังจากนั้นคลิกที่ Wi-Fi อีกครั้ง คลิกเลือก Wi-Fi ที่ต้องการเชื่อมต่อ หากมีรหัส Wi-Fi ก็ต้องกรอกรหัสและคลิกปุ่ม OK

4. ติดตั้งโปรแกรม Node-RED บนระบบปฏิบัติการ Raspbian ของบอร์ด Raspberry Pi โดยเปิดโปรแกรม Terminal ที่อยู่มุมบนซ้ายของหน้าจอ

พิมพ์คำสั่ง
pi@raspberrypi:~ $ sudo apt update
pi@raspberrypi:~ $ sudo apt install npm
ระบบจะถามยืนยันการติดตั้ง ให้ตอบ Y แล้วกดปุ่ม Enter
หลังจากนั้นระบบจะให้ทำการอัพเกรด npm ให้เป็นเวอร์ชั่น 3.x โดยพิมพ์คำสั่ง
pi@raspberrypi:~ $ sudo npm install –g npm@3.x
pi@raspberrypi:~ $ hash -r
หลังจากนั้นให้ทำการติดตั้ง Node-RED dashboard โดยพิมพ์คำสั่ง
pi@raspberrypi:~ $ sudo npm install --unsafe-perm -g node-red-dashboard
pi@raspberrypi:~ $ sudo systemctl enable nodered.service
เมื่อติดตั้งเสร็จเรียบร้อยแล้ว ให้ปิดโปรแกรม Terminal
5. ตรวจสอบ IP ของ Raspberry Pi โดยเปิด Terminal แล้วพิมพ์คำสั่ง ifconfig จะได้ IP Address ของบอร์ด Raspberry Pi ในช่อง wlan0 ตัวอย่างดังรูป

สร้างปุ่มควบคุมและเขียนโปรแกรมคำสั่งด้วยภาษา JavaScript จากโปรแกรม Node-RED
1. เปิดเว็บบราวเซอร์ แล้วพิมพ์ url ตามรูปแบบด้านล่าง
http://<ใส่ IP Address ของบอร์ด Raspberry Pi>:1880
เช่น http://10.0.1.23:1880
2. จะปรากฏหน้าต่างโปรแกรม Node-RED ดังรูป

3. คลิกที่เมนู dashboard ที่มุมด้านบนขวา ในแท็บ Layout แล้วคลิกที่ +tab เพื่อทำการสร้างแท็บใหม่ขึ้นมา

แท็บที่สร้างขึ้นใหม่จะชื่อว่า Tab1 ให้เปลี่ยนชื่อแท็บโดยคลิกที่คำสั่ง edit ที่อยู่ด้านหลังแท็บ

เปลี่ยนชื่อแท็บ ในที่นี้จะตั้งชื่อแท็บว่า Robot แล้วคลิกที่ปุ่ม Update

สร้าง Group ในแท็บ Robot โดยคลิกที่ +group ด้านหลังแท็บ

เมื่อสร้าง Group ขึ้นมา จะมีชื่อว่า Group1 ให้เปลี่ยนชื่อ Group โดยคลิกที่ปุ่ม edit

เปลี่ยนชื่อ Group เป็น Main และคลิกปุ่ม Update ดังรูป

สร้าง Group เพิ่มขึ้นมาอีก 1 Group โดยตั้งชื่อว่า Poweroff  โดยทำตามขั้นตอนเดียวกับ Group Main

6. สร้างปุ่มควบคุมขึ้นมา 5 ปุ่ม คือ ปุ่ม Forward, Backward, Turn Left, Turn Right และ Stop ใน Group : Main
6.1 ลากปุ่มคำสั่ง button มาวางบนพื้นที่วาด

6.2 ดับเบิ้ลคลิกปุ่มที่เพิ่งลากมาวาง หลังจากนั้นให้กำหนดค่าต่างๆ ดังรูป แล้วคลิกปุ่ม Done

6.3 สร้างปุ่ม Backward, Turn Left, Turn Right และ Stop ขึ้นมาตามลำดับ โดยทำซ้ำตามขั้นตอน 6.1 และ 6.2 โดยกำหนดค่าดังนี้

NODE การกำหนดคุณสมบัติ
Forward Group : Main[Robot]
Size : auto
Icon : fa-arrow-up
Label : Forward
Payload : forward
Backward Group : Main[Robot]
Size : auto
Icon : fa-arrow-down
Label : Backward
Payload : backward
Turn Left Group : Main[Robot]
Size : auto
Icon : fa-arrow-left
Label : Turn Left
Payload : left
Turn Right Group : Main[Robot]
Size : auto
Icon : fa-arrow-right
Label : Turn Right
Payload : right
Stop Group : Main[Robot]
Size : auto
Icon : fa-hand-paper-o
Label : Stop
Payload : stop

7. ลากปุ่ม Function เข้ามา เพื่อเขียนโปรแกรม JavaScript ควบคุมการการเคลื่อนที่ของรถหุ่นยนต์ เมื่อผู้ใช้กดปุ่มคำสั่ง

8. ลากบล็อก rpi gpio ออกมา 4 อัน ซึ่งจะเป็นส่วน Output ของโปรแกรม ซึ่งในที่นี้คือขา GPIO ที่เชื่อมต่อกับมอเตอร์ของหุ่นยนต์นั่นเอง

9. ดับเบิ้ลคลิกที่บล็อก PIN : แต่ละบล็อกแล้วกำหนดขา GPIO ที่เชื่อมต่อมอเตอร์ ซึ่งก่อนหน้านี้เราได้ทำการเชื่อมต่อเข้ากับขา GPIO ลำดับที่ 7, 11, 13 และ 15 ตามลำดับ

7. ลากเส้นเชื่อมต่อส่วน Input (ปุ่ม) เข้ากับฟังก์ชั่น (โปรแกรม) ให้ครบทุกปุ่ม

8. ดับเบิ้ลคลิกเข้าไปในบล็อกฟังก์ชั่น แล้วกำหนดว่ามีกี่ Output แล้วคลิกปุ่ม Done

9. ลากเส้นเชื่อมต่อฟังก์ชั่น (โปรแกรม) เข้ากับ Output ให้ครบทุกจุด

10. ดับเบิ้ลคลิกเข้าไปในบล็อกฟังก์ชัน ใส่โค้ดภาษา JavaScript ดังนี้
var msg1 = {payload: 0};
var msg2 = {payload: 0};
var msg3 = {payload: 0};
var msg4 = {payload: 0};
if(msg.payload === "forward"){
msg1.payload = 0;
msg2.payload = 1;
msg3.payload = 1;
msg4.payload = 0;
}
else if(msg.payload === "backward"){
msg1.payload = 1;
msg2.payload = 0;
msg3.payload = 0;
msg4.payload = 1;
}
else if(msg.payload === "right"){
msg1.payload = 1;
msg2.payload = 0;
msg3.payload = 0;
.payload = 0;
}
else if(msg.payload === "left"){
msg1.payload = 0;
msg2.payload = 0;
msg3.payload = 0;
msg4.payload = 1;
}
else{
msg1.payload = 0;
msg2.payload = 0;
msg3.payload = 0;
msg4.payload = 0;
}
return [msg1,msg2,msg3,msg4];

11. สร้างปุ่มปิดใน Group : PowerOff
11.1 ลากบล็อก button เข้ามาวางในพื้นที่การวาด แล้วดับเบิ้ลคลิกเข้าไปตั้งค่าดังนี้ แล้วคลิกปุ่ม Done

11.2 ลากบล็อก exec มาวาง เพื่อใส่โค้ดคำสั่งในการปิดบอร์ด Raspberry Pi โดยดับเบิ้ลคลิกเข้าไปในบล็อก และตั้งค่าดังนี้

11.3 ลากเส้นเชื่อมโยงระหว่าง 2 บล็อก ดังรูป

12. เมื่อเขียนโปรแกรมเสร็จเรียบร้อยแล้ว ให้กดปุ่ม Deploy ด้านบนขวาของโปรแกรม Node-RED
13. เปิดแท็บใหม่ขึ้นมา ใส่ url ดังนี้
http://<ใส่ IP Address ของบอร์ด Raspberry Pi>:1880/ui
เช่น http://10.0.1.23:1880/ui

จะได้หน้าจอโปรแกรม ดังรูป

14. นำถ่านขนาด 2A จำนวน 4 ก้อนใส่ในกระบะถ่าน หลังจากนั้นให้ทดลองกดปุ่มต่างๆ แล้วดูการเคลื่อนที่ของหุ่นยนต์ หากผลลัพธ์ไม่ถูกต้อง ก็กลับไปแก้ไขในโปรแกรม Node-RED หลังการแก้ไขให้คลิกปุ่ม Deploy
15. เมื่อได้ผลลัพธ์ตามที่ต้องการแล้ว ก็ทำการปิดเครื่อง Raspberry Pi โดยไปที่สัญลักษณ์ Raspberry มุมบนซ้ายสุด แล้วเลือกเมนู Shutdown… แล้วคลิกเลือกคำสั่ง Shutdown

16. ถอดปลั๊กสาย Adapter แล้วเปลี่ยนมาใช้ Power Bank แทน เพื่อให้หุ่นยนต์สามารถเคลื่อนที่ได้อย่างอิสระ เมื่อเปิด Power Bank บอร์ด Raspberry Pi จะถูกเปิดโดยอัตโนมัติ
17. ตรวจสอบ IP Address ของ Raspberry Pi อีกครั้ง (ทำขั้นตอนตามข้อ 5) หลังจากนั้นใช้มือถือหรือคอมพิวเตอร์จับ Wi-Fi ตัวเดียวกับ Raspberry Pi แล้วเปิดเว็บบราวเซอร์ขึ้นมา แล้วพิมพ์ url
http://<ใส่ IP Address ของบอร์ด Raspberry Pi>:1880/ui
จะได้หน้าจอโปรแกรมควบคุมหุ่นยนต์ ดังรูป

2. หุ่นยนต์หลบหลีกสิ่งกีดขวาง
สิ่งที่ต้องมี
1. โมดูลวัดระยะทาง HC-SR04 (เซนเซอร์อัลตราโซนิก)
2. บอร์ด Raspberry Pi ใช้บอร์ดที่มี GPIO 40 ขา
3. ชุดประกอบรถหุ่นยนต์ ซึ่งประกอบด้วยตัวรถ ล้อ มอเตอร์ กระบะใส่ถ่าน
4. บอร์ดขับเคลื่อนมอเตอร์ ในที่นี้จะใช้บอร์ด L298N
5. Power bank ที่มีขนาดความจุ 2,200 mAh. ขึ้นไป เพื่อจ่ายไฟให้แก่บอร์ด Raspberry Pi เพื่อให้หุ่นยนต์เคลื่อนที่ได้อย่างอิสระ
ขั้นตอนการประกอบ
1. เชื่อมต่อรถหุ่นยนต์เข้ากับบอร์ดขับมอเตอร์ L298N
1.1 เชื่อมต่อสายแบตเตอรี่ของหุ่นยนต์ โดยเส้นสีแดงเสียบเข้าในช่อง +5V DC Input ของบอร์ด L298N แล้วขันน็อตให้แน่น ส่วนเส้นสีดำใส่เข้ากับช่อง GROUND ของบอร์ดขับมอเตอร์ โดยใช้สาย Jumper แบบตัวผู้-ตัวเมีย ใส่เข้าไปในช่อง GROUND กับเส้นสีดำด้วย แล้วขันน็อตให้แน่น ส่วนปลายอีกด้านหนึ่งของสาย Jumper จะใส่เข้าไปในช่อง GROUND ของขา GPIO ของบอร์ด Raspberry Pi

1.2 ใช้สาย Jumper แบบตัวผู้-ตัวผู้ เสียบต่อจากสายมอเตอร์ทั้ง 2 มอเตอร์ของหุ่นยนต์เข้ากับช่อง OUT1 – OUT4 ของบอร์ดขับมอเตอร์ (ดูช่อง OUT1 – OUT4 ด้านหลังของบอร์ด)

2. เชื่อมต่อบอร์ด L298N เข้ากับบอร์ด Raspberry Pi
2.1 นำปลายสาย Jumper Ground จากบอร์ด L298N เสียบเข้ากับช่อง GROUND ของขา GPIO ของบอร์ด Raspberry Pi (ในที่นี้จะเสียบเข้ากับขา GPIO ลำดับที่ 6 ซึ่งเป็น Ground)

2.2 ใช้สาย Jumper ตัวเมีย-ตัวเมีย 4 เส้น เสียบเข้าไปในช่อง IN1 – IN4 ของบอร์ด L298N ส่วนปลายสายเสียบเข้ากับช่อง GPIO ของบอร์ด Raspberry Pi (ในที่นี้จะเสียบเข้ากับช่อง GPIO ขาที่ 7, 11, 13 และ 15 ตามลำดับ)

3. ใช้สาย Jumper ตัวเมีย-ตัวเมีย 4 เส้นเสียบเข้ากับขาของโมดูล HC-SR04 ซึ่งมี 4 ขา ดังนี้
- GND จะเสียบเข้ากับขา GROUND ของบอร์ด Raspberry Pi
- ECHO จะเสียบเข้ากับขา GPIO ของบอร์ด Raspberry Pi (ในที่นี้จะเสียบเข้ากับ PIN 18)
- TRIG จะเสียบเข้ากับขา GPIO ของบอร์ด Raspberry Pi (ในที่นี้จะเสียบเข้ากับ PIN 16)
- VCC จะเสียบเข้ากับขา GPIO 5V ของบอร์ด Raspberry Pi (ในที่นี้จะเสียบเข้ากับ PIN 2)
หลังจากนั้นให้นำโมดูล HC-SR04 ติดตั้งไว้ด้านหน้าของรถหุ่นยนต์
4. นำบอร์ด Raspberry Pi มาเสียบสาย HDMI เข้ากับจอภาพหรือเครื่องคอมพิวเตอร์ที่มีพอร์ต HDMI IN เชื่อมต่อเมาส์และคีย์บอร์ด และหลังจากนั้นเสียบสาย Power Bank เพื่อจ่ายไฟแก่บอร์ด Raspberry Pi จะปรากฏไปสถานะสีส้มที่ตัวบอร์ด ระบบจะทำการบู๊ตเข้าระบบปฏิบัติการ Raspbian โดยอัตโนมัติ
หลักการทำงาน
HC-SR04 เป็นเซนเซอร์โมดูลสำหรับตรวจจับวัตถุและวัดระยะทางแบบไม่สัมผัส โดยใช้คลื่นอัลตราโซนิก ซึ่งเป็นคลื่นเสียงความถี่สูงเกินกว่าการได้ยินของมนุษย์ วัดระยะได้ตั้งแต่ 2 – 400 เซนติเมตรหรือ 1 – 156 นิ้ว สามารถต่อใช้งานกับไมโครคอนโทรลเลอร์ได้ง่าย ใช้พลังงานต่ำ เหมาะกับการนำไปประยุกต์ใช้งานด้านระบบควบคุมอัตโนมัติหรืองานด้านหุ่นยนต์ หลักการทำงานจะเหมือนกันกับการตรวจจับวัตถุด้วยเสียงของค้างคาว โดยจะประกอบไปด้วยตัวรับ-ส่งอัลตราโซนิก ตัวส่งจะส่งคลื่นความถี่ 40 kHz ออกไปในอากาศด้วยความเร็วประมาณ 346 เมตรต่อวินาที และตัวรับจะคอยรับสัญญาณที่สะท้อนกลับจากวัตถุ เมื่อทราบความเร็วในการเคลื่อนที่ของคลื่น, เวลาที่ใช้ในการเดินทางไป-กลับ (t) ก็จะสามารถคำนวณหาระยะห่างของวัตถุ (S) ได้จากสูตร
S = 346 × 0.5t

รูปที่ 1 หลักการตรวจจับและวัดระยะห่างระหว่างวัตถุด้วยคลื่นเสียง

รูปที่ 2 การต่อใช้งานโมดูลอัลตราโซนิก HC-SR04

ตามคุณลักษณะของเซนเซอร์ จะต้องสร้างสัญญาณพัลส์ความกว้างไม่น้อยกว่า 10 msec ป้อนเข้าที่ขา Trig หลังจากนั้นอีกประมาณ 1.4 msec จึงจะเริ่มมีสัญญาณพัลส์เกิดขึ้นที่ขา Echo มีความกว้างของสัญญาณตั้งแต่ 150 usec – 25 msec ซึ่งถ้าหากกว้างกว่านี้จะถือว่าตรวจไม่พบวัตถุ หลังจากนั้นควรหน่วงเวลาออกไปอีก 10 msec จึงจะส่งสัญญาณ Trig ออกไปอีกรอบ ตามรูปที่ 3

รูปที่ 3 สัญญาณที่ขา Trig และขา Echo ของโมดูลเซนเซอร์อัลตราโซนิก HC-SR04

เขียนโปรแกรมด้วยภาษา Python
1. เปิดโปรแกรม Python โดยคลิกที่สัญลักษณ์ Raspberry Pi ที่อยู่มุมด้านบนซ้ายของหน้าจอ แล้วเลือกเมนู Programming เลือกโปรแกรม Python 3 (IDLE) หรือโปรแกรม Thonny Python IDLE (ในที่นี้จะเลือกใช้โปรแกรม Thonny Python IDLE)

2. เขียนโค้ดคำสั่ง ดังนี้
            import RPi.GPIO as GPIO
            import time
            GPIO.setwarnings(False)

            GPIO.setmode(GPIO.BOARD)

            GPIO.setup(7, GPIO.OUT)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)

            GPIO.setup(16, GPIO.OUT)
GPIO.setup(18, GPIO.IN)

            while True:
GPIO.output(16,1)
time.sleep(0.00001)
GPIO.output(16,0)

while GPIO.input(18) == 0:
start = time.time()

while GPIO.input(18) == 1:
stop = time.time()
timetotal = stop - start
distance = round(timetotal*34600 * 0.5,2)
print(distance)

if distance > 20.00:
#Forward
GPIO.output(7,1)
GPIO.output(11,0)
GPIO.output(13,0)
GPIO.output(15,1)
time.sleep(0.1)
else :
#Stop
GPIO.output(7,0)
GPIO.output(11,0)
GPIO.output(13,0)
GPIO.output(15,0)
time.sleep(0.1)
#Turn Right
GPIO.output(7,1)
GPIO.output(11,0)
GPIO.output(13,0)
GPIO.output(15,0)
time.sleep(0.5)

3. ลองทดสอบโปรแกรม โดยคลิกปุ่ม Run ระบบจะให้ทำการบันทึกไฟล์ .py โดยโฟลเดอร์เริ่มต้นในการบันทึกไฟล์จะอยู่ที่ /home/pi/ และหากต้องการหยุดการรันโปรแกรม ให้คลิกปุ่ม Stop หากรถหุ่นยนต์ยังไม่หยุดหมุน ให้ดึงสาย GROUND ขา GPIO ที่ PIN 6 ออกชั่วคราว
4. หากต้องการให้รถหุ่นยนต์เคลื่อนที่ตามโค้ดคำสั่งโดยอัตโนมัติเมื่อเปิดบอร์ด Raspberry Pi จะต้องเข้าไปตั้งค่าดังนี้
4.1 เปิดโปรแกรม Terminal แล้วพิมพ์คำสั่งดังนี้
sudo nano /home/pi/.config/lxsession/LXDE-pi/autostart
4.2 เลื่อนมาที่บรรทัดสุดท้าย เพิ่มคำสั่งในการรันโปรแกรม ดังนี้
python /home/pi/ชื่อไฟล์.py
เช่น python /home/pi/HCSR04.py เป็นต้น

4.3 ทำการบันทึก โดยกดปุ่ม Ctrl + X ระบบจะถามว่าต้องการบันทึกการเปลี่ยนแปลงหรือไม่ ให้พิมพ์ Y แล้วกด Enter ออกจากหน้าแก้ไข โดยกด Enter อีกครั้ง
5. Reboot บอร์ด Raspberry Pi โดยคลิกที่สัญลักษณ์ Raspberry แล้วคลิกเมนู Shutdown แล้วคลิกเลือกคำสั่ง Reboot รอสักครู่เมื่อบอร์ด Raspberry เปิดขึ้นมาอีกครั้ง รถหุ่นยนต์จะเคลื่อนที่ตามโค้ดคำสั่งในไฟล์ .py ที่ได้ทำการตั้งค่า autostart ขึ้นโดยอัตโนมัติ

 

<< Go Back