หน้าแรก ดูโปรเจกต์ทั้งหมด
Easy

โปรเจกต์ เครื่อง Ultrasonic occupancy counter สำหรับนับจำนวนผู้ใช้งาน

โปรเจกต์ Arduino แบบง่ายนี้สามารถจำกัดจำนวนคนภายในร้านค้าและรักษา social distancing ในรูปแบบอัตโนมัติแบบ contact free

โปรเจกต์ เครื่อง Ultrasonic occupancy counter สำหรับนับจำนวนผู้ใช้งาน

วิดีโอสาธิต

Video

▶ กดเพื่อดูวิดีโอสาธิตโปรเจกต์

22,819 การดู
4 ถูกใจ

รายการอุปกรณ์และเครื่องมือ

1x Arduino UNO
-
1x 5 mm LED: Red
-
1x 5 mm LED: Green
-
2x Through Hole Resistor, 560 ohm
-
2x Ultrasonic Sensor - HC-SR04 (Generic)
-
}

รายละเอียดและวิธีทำ

โปรเจกต์ Arduino แบบง่ายนี้สามารถนำไปวางไว้ที่ประตูทางเข้าของร้านค้าหรือสถานที่ต่าง ๆ เพื่อใช้นับจำนวนคนที่อยู่ภายในพื้นที่ การจำกัดจำนวนคนภายในสถานที่สามารถช่วยรักษาการเว้นระยะห่างทางสังคม (social distancing) ได้ คุณสามารถดูวิดีโอสาธิตของโปรเจกต์นี้ได้ที่นี่.

วิดีโอสาธิต

โปรเจกต์นี้ไม่จำเป็นต้องมีการบัดกรี เนื่องจากอุปกรณ์ทั้งหมดเชื่อมต่อเข้ากับ Arduino Uno โดยตรง

โปรเจกต์นี้ใช้ HC-SR04 Ultrasonic sensor สองตัวในการตรวจจับคน ซึ่งมีราคาไม่แพง (ประมาณตัวละ 80-100 บาท) และเป็นการตรวจจับแบบไม่สัมผัส Sensor เหล่านี้สื่อสารกับ Arduino ผ่าน NewPing library โดย Tim Eckel.

อุปกรณ์:

  • 1 x Arduino Uno
  • 2 x HC-SR04 Ultrasonic sensor
  • 2 x 560 Ohm Resistor^
  • 1 x 5V 5 mm LED สีแดง
  • 1 x 5V 5 mm LED สีเขียว
  • Power supply*
  • สาย USB ที่ถูกต้องสำหรับการ Upload Sketch ลงบนบอร์ด Arduino

^ค่าของ Resistor จะขึ้นอยู่กับ Voltage drop ของ LED ที่คุณใช้ โดยทั่วไปค่าระหว่าง 150 Ohm ถึง 750 Ohm มักจะใช้งานได้

* สำหรับการใช้งานทั่วไป ให้เสียบ Arduino เข้ากับที่ชาร์จโทรศัพท์ USB 5V, Power bank หรือ Power supply แบบ DC ขนาด 6-12V ที่เหมาะสม สำหรับการใช้งานระยะสั้น (น้อยกว่า 1 วัน) สามารถใช้แบตเตอรี่ 9V PP3 แบบชาร์จได้พร้อมขั้วต่อเข้ากับ Jack DC ขนาด 2.1 mm

ขั้นตอนที่ 1: การประกอบวงจร

มุมมองด้านบนของวงจรที่ประกอบเสร็จแล้ว

การต่อสายแบบ Lineman splice ระหว่าง LED และ Resistor

การดัดขาอุปกรณ์เพื่อให้เสียบเข้ากับ Arduino Uno ได้โดยตรง

โปรดดูรูปภาพด้านบนประกอบการประกอบ และดูรายละเอียดตามหัวข้อด้านล่าง

ในการเชื่อมต่อขา Anode (ขาบวก) ของ LED และ Resistor เข้าด้วยกัน ฉันได้ใช้วิธีที่เรียกว่า Western Union (หรือ Lineman) splice. วิธีนี้จะช่วยสร้างการเชื่อมต่อทางไฟฟ้าที่แข็งแรงในทางกลระหว่างสายไฟโดยไม่ต้องบัดกรี โปรดระวังอย่าให้ปลายสายไฟที่คมบาดมือ การใช้คีมและสวมแว่นตานิรภัยจะปลอดภัยที่สุด หากคุณต้องการ คุณสามารถเชื่อมต่อขา Anode ของ LED เข้ากับขา Resistor ด้วยสาย Jump แบบ Female to Female ก็ได้ นอกจากนี้ HC-SR04 Sensor บางรุ่นมาพร้อมกับขา Pin แบบตรง ซึ่งควรเชื่อมต่อกับ Arduino ด้วยสาย Jumper แบบ Female to Male

จากนั้นควรเชื่อมต่ออุปกรณ์ต่าง ๆ ดังนี้:

  • ขา Cathode ของ LED สีแดง ต่อเข้ากับ GND
  • Resistor ของ LED สีแดง (ที่ Splice เข้ากับขา Anode) ต่อเข้ากับ Pin 12
  • ขา Cathode ของ LED สีเขียว ต่อเข้ากับ Pin 11 (ซึ่งจะถูกตั้งค่าเป็น GND ในภายหลัง)
  • Resistor ของ LED สีเขียว (ที่ Splice เข้ากับขา Anode) ต่อเข้ากับ Pin 9
  • HC-SR04 ตัวแรกเชื่อมต่อดังนี้: Vcc เข้ากับ Pin A0, TRIG เข้ากับ A1, ECHO เข้ากับ A2 และ GND เข้ากับ A3
  • HC-SR04 ตัวที่สองเชื่อมต่อดังนี้: Vcc เข้ากับ Pin 2, TRIG เข้ากับ 3, ECHO เข้ากับ 4 และ GND เข้ากับ 5

เพียงเท่านี้ก็เรียบร้อย ไม่ต้องบัดกรี!

ขั้นตอนที่ 2: การเขียนและ Upload Code

เครื่องนับต้องทำการ Calibrate สภาพแวดล้อมรอบตัวในฟังก์ชัน setup() จากนั้นจึงตรวจจับและนับจำนวนคนในฟังก์ชัน loop()

การ Calibrate จะอ่านค่า 5 ครั้งจาก Sensor แต่ละตัวแล้วนำมาหาค่าเฉลี่ย ซึ่งค่านี้คือระยะทางไปยังผนังที่ใกล้ที่สุด จากนั้นค่า Threshold สำหรับการตรวจจับคนจะถูกตั้งไว้ที่ 75% ของค่าเฉลี่ยนี้ เพื่อหลีกเลี่ยงไม่ให้ Sensor ถูกกระตุ้นผิดพลาดหรือค่าคลาดเคลื่อนหากตัวเครื่องถูกกระแทกเล็กน้อย หากการ Calibrate ส่งคืนค่าที่ไม่เหมาะสม เช่น 0 cm หรือ 300 cm ระบบจะใช้ค่า Threshold เริ่มต้นที่ 45 cm แทน โดย LED ทั้งสองดวงจะสว่างขึ้นในระหว่างช่วงการ Calibrate เพื่อแจ้งให้ผู้ใช้ทราบว่าระบบกำลังดำเนินการอยู่ คุณสามารถ Calibrate เครื่องใหม่ได้ทุกเมื่อโดยการกดปุ่ม Reset บน Arduino ซึ่งจะทำให้การนับจำนวนกลับไปเริ่มต้นที่ศูนย์ด้วย

ฟังก์ชัน loop จะอ่านค่าจาก Sensor แต่ละตัว หากค่าที่อ่านได้น้อยกว่า Threshold แสดงว่ามีคนอยู่ในช่องสัญญาณนั้น หากการอ่านค่าครั้งก่อนหน้าจาก Sensor นี้ระบุว่าไม่มีใครอยู่ จำนวนนับจะเพิ่มขึ้นสำหรับ Sensor ขาเข้า หรือลดลงสำหรับ Sensor ขาออก การเปรียบเทียบกับสถานะก่อนหน้าของ Sensor ช่วยให้เราสามารถดักจับช่วง ขอบขาขึ้น (rising-edge) ของสัญญาณได้ ขั้นตอนสุดท้ายคือการตรวจสอบจำนวนนับกับขีดจำกัด (limit) หากจำนวนนับ >= ขีดจำกัด ให้เปิด LED สีแดง มิฉะนั้นให้เปิด LED สีเขียว

คุณสามารถคัดลอก Code นี้หรือลองเขียนเองตั้งแต่ต้น:

/*   โปรเจกต์นี้พัฒนาโดย Design and Manufacturing Futures Lab ที่ University of Bristol ซึ่งเป็นส่วนหนึ่งของ Project Clean Access   สามารถดูข้อมูลเพิ่มเติมเกี่ยวกับ Lab และโปรเจกต์ได้ที่นี่:  https://dmf-lab.co.uk/project-clean-access/   Code นี้สำหรับเครื่องนับจำนวนที่วางไว้หน้าทางเข้าร้านค้า โดยมีช่องทางเข้าและทางออกแยกกัน   มีคำแนะนำโดยละเอียดสำหรับโปรเจกต์นี้บนเว็บไซต์ Instructables:   ฮาร์ดแวร์ที่จำเป็นสำหรับผลิตภัณฑ์นี้:   2 x HC-SR04 Ultrasonic sensor   2 x 560 Ohm Resistor   1 x LED สีแดง   1 x LED สีเขียว   1 x Arduino Uno   Power supply   สาย USB ที่ถูกต้องสำหรับการ Upload Sketch ลงบนบอร์ด Arduino   ขอขอบคุณ Tim Eckel สำหรับการพัฒนา NewPing library และตัวอย่าง Sketch ข้อมูลเพิ่มเติมที่นี่:  https://dmf-lab.co.uk/project-clean-access/*/#include //กำหนดตำแหน่งที่อุปกรณ์เชื่อมต่ออยู่#define TRIG_IN A1#define TRIG_OUT 3#define ECHO_IN A2#define ECHO_OUT 4#define LED_WAIT 12#define LED_ENTER 9#define iterations 5 //จำนวนครั้งในการอ่านค่าในช่วงการ Calibrate#define MAX_DISTANCE 150 // ระยะทางสูงสุด (หน่วย cm) ที่ Sensor จะพยายามอ่าน#define DEFAULT_DISTANCE 45 // ระยะทางเริ่มต้น (หน่วย cm) จะใช้เฉพาะเมื่อการ Calibrate ล้มเหลว#define MIN_DISTANCE 15 // ระยะทางขั้นต่ำ (หน่วย cm) สำหรับค่า Threshold ที่ Calibrate แล้วfloat calibrate_in = 0, calibrate_out = 0; // การ Calibrate ในฟังก์ชัน setup() จะตั้งค่าเหล่านี้ให้เหมาะสมfloat distance_in, distance_out; // ระยะทาง (หน่วย cm) ที่ Sensor Ultrasonic แต่ละตัวอ่านได้int count = 0, limit = 5; //ตั้งค่าขีดจำกัดจำนวนคนได้ที่นี่: เช่น หากจำกัดสูงสุด 8 คน ให้ตั้ง 'limit = 8'bool prev_inblocked = false, prev_outblocked = false; //ตัวแปร Boolean เหล่านี้บันทึกว่าทางเข้า/ออกถูกบังในการอ่านค่าครั้งก่อนหรือไม่NewPing sonar[2] = {   // อาเรย์ของวัตถุ Sensor  NewPing(TRIG_IN, ECHO_IN, MAX_DISTANCE), // Pin Trigger, Pin Echo และระยะทางสูงสุดของ Sensor แต่ละตัว  NewPing(TRIG_OUT, ECHO_OUT, MAX_DISTANCE)};/*   หมายเหตุ: ฟังก์ชัน sonar.ping_cm() จะส่งคืนค่า 0 (cm) หากวัตถุอยู่นอกระยะ หรือตรวจไม่พบสิ่งใด   เราจะรวมการตรวจสอบเพื่อกำจัดค่าศูนย์ที่ผิดพลาดเหล่านี้ในภายหลัง*/void setup() {  Serial.begin(115200); // เปิด Serial Monitor ที่ 115200 baud เพื่อดูผลลัพธ์  pinMode(2, OUTPUT); pinMode(5, OUTPUT); pinMode(A0, OUTPUT); pinMode(A3, OUTPUT); pinMode(11, OUTPUT);  digitalWrite(2, HIGH); digitalWrite(5, LOW); digitalWrite(A0, HIGH); digitalWrite(A3, LOW); digitalWrite(11, LOW);  pinMode(LED_WAIT, OUTPUT), pinMode(LED_ENTER, OUTPUT);  digitalWrite(LED_WAIT, HIGH); digitalWrite(LED_ENTER, HIGH); //เปิด LED ทั้งสองดวงเพื่อแจ้งผู้ใช้ว่ากำลัง Calibrate  Serial.println("Calibrating...");  delay(1500);  for (int a = 0; a < iterations; a++) {    delay(50);    calibrate_in += sonar[0].ping_cm();    delay(50);    calibrate_out += sonar[1].ping_cm();    delay(200);  }  calibrate_in = 0.75 * calibrate_in / iterations; //ตั้งค่า Threshold ที่ 75% ของค่าเฉลี่ย เพื่อป้องกันการนับผิดพลาดหากเครื่องถูกขยับ  calibrate_out = 0.75 * calibrate_out / iterations;  if (calibrate_in > MAX_DISTANCE || calibrate_in < MIN_DISTANCE) { //หากค่า Calibrate อยู่นอกขอบเขตที่เหมาะสม จะใช้ค่าเริ่มต้นแทน    calibrate_in = DEFAULT_DISTANCE;  }  if (calibrate_out > MAX_DISTANCE || calibrate_out < MIN_DISTANCE) {    calibrate_out = DEFAULT_DISTANCE;  }  Serial.print("Entry threshold set to: ");  Serial.println(calibrate_in);  Serial.print("Exit threshold set to: ");  Serial.println(calibrate_out);  digitalWrite(LED_WAIT, LOW); digitalWrite(LED_ENTER, LOW); //ปิด LED ทั้งสองดวงเพื่อแจ้งว่าการ Calibrate เสร็จสิ้น  delay(1000);}void loop() {  //  Serial.print("Count: ");  //  Serial.println(count);  distance_in = sonar[0].ping_cm();  delay(40); // เว้นระยะ 40 มิลลิวินาทีระหว่างการ Ping แต่ละครั้ง โดยทั่วไป 29ms คือระยะที่สั้นที่สุด  distance_out = sonar[1].ping_cm();  delay(40);  if (distance_in < calibrate_in && distance_in > 0) { // หากระยะใกล้กว่าผนัง/วัตถุที่ Calibrate ไว้ (มีคนอยู่) และตัดค่าศูนย์ทิ้ง    if (prev_inblocked == false) {      count++; // เพิ่มจำนวนขึ้นหนึ่ง      Serial.print("Count: ");      Serial.println(count);    }    prev_inblocked = true;  } else {    prev_inblocked = false;  }  if (distance_out < calibrate_out && distance_out > 0) {    if (prev_outblocked == false) {      count--; // ลดจำนวนลงหนึ่ง      Serial.print("Count: ");      Serial.println(count);    }    prev_outblocked = true;  } else {    prev_outblocked = false;  }//    //ถ้ามีคนในร้านน้อยกว่าขีดจำกัด ไฟจะเป็นสีเขียว มิฉะนั้นจะเป็นสีแดง  if (count < limit) {    digitalWrite(LED_WAIT, LOW);    digitalWrite(LED_ENTER, HIGH);  } else {    digitalWrite(LED_WAIT, HIGH);    digitalWrite(LED_ENTER, LOW);  }}

สิ่งที่แนบมา

Two_way_counter_two_sensors_Uno_No_Breadboard.ino

ขั้นตอนที่ 3: การตั้งค่า, การ Calibrate และการใช้งาน

ฉันพบว่าเครื่องนับนี้ทำงานได้แม่นยำที่สุดเมื่อวางไว้ที่ระดับสะโพกหรือเอว ซึ่งเป็นระดับที่สะดวกสำหรับคนส่วนใหญ่ในการมองเห็น LED ด้วย สามารถทำได้โดยวางเครื่องนับไว้บนโต๊ะขนาดเล็กหรือบนยอดของเสากั้นทางเดินที่อยู่ตรงกลางประตู

คุณสามารถดูการติดตั้งและการทำงานของเครื่องนับได้ที่นี่:

ในการ Calibrate ผลิตภัณฑ์ เพียงแค่เปิดเครื่อง หรือหากต้องการ Calibrate ใหม่ให้กดปุ่ม Reset บน Arduino LED ทั้งสองดวงจะสว่างขึ้นเพื่อให้คุณทราบว่ากำลังทำการ Calibrate เมื่อเสร็จสิ้น LED ทั้งสองดวงจะดับลง จากนั้น LED สีเขียวจะสว่างขึ้น การ Calibrate ควรทำเมื่อไม่มีลูกค้าอยู่ในร้าน หากมีลูกค้าอยู่ คุณสามารถนับจำนวนลูกค้าที่เกินมาได้โดยการเลื่อนมือผ่าน Sensor ขาเข้าช้า ๆ หนึ่งครั้งต่อลูกค้าหนึ่งคน

ค่าขีดจำกัดเริ่มต้นคือ 5 คน คุณสามารถเปลี่ยนค่านี้ได้ใน Code หรือเปลี่ยนหลังจากตั้งค่าเสร็จแล้วก็ได้ ตัวอย่างเช่น หากคุณต้องการเพิ่มขีดจำกัดเป็น 8 คน ให้เลื่อนมือผ่าน Sensor ขาออกช้า ๆ 3 ครั้ง วิธีนี้จะทำให้จำนวนนับกลายเป็น -3 และจากจุดนี้จะมีคนเข้าได้ 8 คนก่อนที่ LED จะเปลี่ยนเป็นสีแดง

ในบางครั้ง เครื่องนับอาจพลาดการนับคนเข้าหรือออกจากร้านไปบ้าง เนื่องจากคลื่น Ultrasound ไม่ได้สะท้อนกลับไปยังตัวรับเสมอไป โดยเฉพาะกับวัสดุที่มีความนุ่มอย่างผ้าขนสัตว์ เจ้าของร้านควรตรวจสอบจำนวนนับเป็นประจำ (ทุกชั่วโมง) และปรับเปลี่ยนหากจำเป็น

ขั้นตอนที่ 4: การสร้างเคส (ไม่บังคับ)

แบบจำลอง CAD ของเคส

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

ฉันออกแบบเคสนี้ใน Fusion 360 และตั้งใจให้นำไปพิมพ์ด้วยเครื่องพิมพ์ 3D แยกเป็นสองส่วน (ฝาบนและฐานล่าง) เคสนี้ใช้เวลาพิมพ์ประมาณ 5 ชั่วโมงด้วยเครื่อง Ender 3 โดยใช้พลาสติก PLA ฉันเติมสีเล็กน้อยลงในตัวอักษรเพื่อให้ดูโดดเด่น ไฟล์ STEP และ STL มีให้ดาวน์โหลดเพื่อให้คุณนำไปแก้ไขเพิ่มเติมหรือสั่งพิมพ์

หรืออีกทางเลือกหนึ่ง คุณสามารถออกแบบเคสสำหรับการตัดด้วยเลเซอร์ (laser cutting) ได้ที่ makercase. แบบจาก makercase สามารถพิมพ์ออกมาบนเครื่องพิมพ์ทั่วไปและใช้เป็นแม่แบบสำหรับการตัดวัสดุอื่น ๆ ได้

สิ่งที่แนบมา

Lid.step

Base.step

US counter box bottom.stl

US counter box top.stl

ขั้นตอนที่ 5: ขอบคุณ

ต้นแบบที่ 1

ต้นแบบที่ 2

ต้นแบบสุดท้าย

ขอบคุณที่อ่าน Instructable นี้ ฉันหวังว่าคุณจะพบว่ามันมีประโยชน์และได้ลองสร้างมันด้วยตัวเอง คุณสามารถสร้างสิ่งนี้ให้กับร้านค้าในท้องถิ่นเพื่อให้พวกเขาสามารถกลับมาเปิดร้านได้อย่างปลอดภัยเมื่อมีการผ่อนคลายมาตรการล็อกดาวน์ เครื่องนับนี้จะมีประสิทธิภาพมากที่สุดเมื่อใช้งานควบคู่ไปกับป้ายประกาศ คุณสามารถสั่งพิมพ์และนำป้าย นี้ ไปแสดงหน้างานได้

Instructable นี้เขียนขึ้นสำหรับ Project Clean Access ของ Design and Manufacturing Futures Lab โดยโปรเจกต์ Clean Access ได้รับการสนับสนุนอย่างกรุณาจาก Royal Academy of Engineering และ University of Bristol

ป.ล. ฉันได้แนบภาพถ่ายของต้นแบบรุ่นแรก ๆ มาด้วย เพื่อให้เห็นว่าผลิตภัณฑ์รุ่นสุดท้ายดูเรียบร้อยกว่าเดิมมากเมื่อไม่มีสาย Jumper และ Breadboard

สิ่งที่แนบมา

green-equals-go.pdf

Code

🔒 ปลดล็อก Code

สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้

รหัสอ้างอิงโปรเจกต์: ultrasonic-occupancy-counter-7ec9e1
699 บาท
PromptPay QR Code