Đồ Án Điện Tử

Chế tạo một Hộp Đựng Thuốc Tự Động

Nhớ uống thuốc đúng giờ có thể rất khó, đặc biệt nếu bạn cần uống nhiều loại thuốc vào những thời điểm khác nhau trong ngày. Nếu bạn quên uống vitamin hàng ngày thì có thể không sao, nhưng với một số người, việc quên uống thuốc đúng giờ có thể nguy hiểm. Nếu bạn có một thiết bị không chỉ có thể báo động vào đúng thời điểm mà còn tự động đưa ra đúng loại thuốc cho bạn thì sao? Trong dự án này, bạn sẽ chế tạo một hộp đựng thuốc tự động để làm điều đó!

Giới thiệu Bạn đã bao giờ phải uống thuốc vào cùng một thời điểm mỗi ngày chưa? Có thể bạn uống vitamin hoặc thuốc dị ứng vào bữa sáng, hoặc bạn đã bị ốm và phải uống kháng sinh vào buổi sáng và tối. Đặc biệt nếu bạn phải uống thuốc hơn một lần mỗi ngày, hoặc thậm chí các loại thuốc khác nhau vào những thời điểm khác nhau trong ngày, điều này có thể khó nhớ! Bạn có thể mua một hộp đựng thuốc như trong Hình 1 để giúp bạn theo dõi, nhưng bạn vẫn cần phải nhớ uống thuốc hoặc đặt báo thức riêng.

Một hộp đựng thuốc tự động kết hợp các tính năng của hộp đựng thuốc và báo thức thành một thiết bị. Bạn sẽ nạp sẵn (các) loại thuốc vào thiết bị, cài đặt thời gian và sau đó nó sẽ tự động đưa ra lượng thuốc đúng vào (các) thời điểm đúng mỗi ngày. Dự án này sẽ hướng dẫn bạn cách chế tạo hộp đựng thuốc tự động như trong Hình 2 bằng Arduino. Hộp đựng sử dụng động cơ servo để quay một bánh xe mái chèo chứa thuốc trong các ngăn khác nhau. Servo được lập trình để xoay vào những thời điểm nhất định. Một đồng hồ thời gian thực (RTC) sẽ theo dõi thời gian. Khi một ngăn trượt qua lỗ, các viên thuốc rơi xuống một máng trượt vào khay ở mặt trước của thiết bị.

Sử dụng Arduino cho phép bạn tùy chỉnh hộp đựng thuốc của mình và thêm các tính năng khác. Ví dụ, bạn có thể thêm màn hình tinh thể lỏng (LCD) để hiển thị ngày, giờ và các thông báo quan trọng. Bạn cũng có thể sử dụng còi và đèn LED cho các báo động âm thanh và hình ảnh. Bạn có thể tìm thấy các hướng dẫn riêng lẻ cho tất cả các bộ phận này trên trang Cách Sử dụng Arduino của chúng tôi.

Dự án này có thể được tùy chỉnh cao. Bạn có thể thay đổi các tính năng vật lý của thiết bị, chẳng hạn như:

  • Đặc điểm vật lý (hình dáng và số lượng ngăn)
  • Mạch điện (số lượng và màu sắc đèn LED)
  • Mã lập trình (thời gian báo thức và tin nhắn trên màn hình) Quy trình thực hiện dự án sẽ hướng dẫn bạn cách chế tạo thiết bị trong Hình 2, nhưng điều bạn tạo ra như thế nào là tùy thuộc vào bạn!

Thuật ngữ và Khái niệm

  • Hộp đựng thuốc
  • Hộp đựng thuốc tự động
  • Arduino
  • Động cơ servo
  • Đồng hồ thời gian thực (RTC)
  • Màn hình tinh thể lỏng (LCD)
  • Còi
  • Đèn LED

Đây là một dự án thiết kế kỹ thuật, vì vậy danh sách vật liệu của bạn có thể thay đổi tùy thuộc vào những tính năng bạn muốn bao gồm với hộp đựng thuốc của mình. Các bộ phận có thể có số lượng và giá cả khác nhau từ các nhà cung cấp khác nhau.

Các bộ phận điện tử Bộ dụng cụ điện tử Arduino từ Science Buddies, có sẵn từ đối tác Home Science Tools. Bạn sẽ cần các bộ phận sau từ bộ dụng cụ:

  • Bo mạch vi điều khiển tương thích Arduino
  • Cáp USB
  • Breadboard
  • Dây jumper
  • Biến trở
  • Đèn LED
  • Điện trở hạn dòng (220 Ω cho UNO R3, 470 Ω cho UNO R4)
  • Nút nhấn
  • Điện trở 10 kΩ
  • Động cơ servo SG90

Các dây jumper bổ sung. Các dây mềm dài là tốt nhất để kết nối từ breadboard với Arduino, nhưng các dây jumper ngắn lõi cứng thì tốt hơn để kết nối trên breadboard.

  • Pin header đực-đực
  • Màn hình LCD 1602. Mã ví dụ được viết cho màn hình sử dụng giao tiếp song song, vì vậy đảm bảo bạn không mua màn hình có “I2C” trong mô tả. Nếu mua, bạn sẽ cần sử dụng mã khác cho giao tiếp I2C.
  • Còi chủ động (thay bằng còi thụ động nếu bạn muốn phát các âm khác nhau)
  • Đồng hồ thời gian thực (RTC) Nếu bạn sử dụng Arduino UNO R4 Minima (hoặc tương đương), có RTC tích hợp nhưng không có pin dự phòng, vì vậy thời gian sẽ đặt lại nếu Arduino của bạn mất nguồn. Điều này hoạt động cho mục đích trình diễn dự án khoa học, nhưng không nên sử dụng cho thuốc quan trọng. Nếu bạn sử dụng Arduino UNO R3, hoặc muốn có tính năng pin dự phòng, chúng tôi khuyên bạn nên dùng một module RTC bên ngoài như loại này từ Adafruit.

Các công cụ và vật liệu bổ sung

  • Bìa các-tông
  • Giấy bìa cứng
  • Que kem
  • Kéo
  • Súng bắn keo nóng
  • Kẹo (để sử dụng cho mục đích trình diễn thay vì thuốc thật)

Quy trình Thực nghiệm Lưu ý: Dự án kỹ thuật này được mô tả tốt nhất theo quy trình thiết kế kỹ thuật, thay vì phương pháp khoa học. Bạn có thể hỏi giáo viên của mình xem có được chấp nhận áp dụng quy trình thiết kế kỹ thuật cho dự án của bạn trước khi bắt đầu hay không. Bạn có thể tìm hiểu thêm về quy trình thiết kế kỹ thuật trong Hướng dẫn Quy trình Thiết kế Kỹ thuật của Science Buddies.

Chế tạo hộp đựng của bạn. Hình 3 đến 5 thể hiện một số góc nhìn khác nhau của thiết bị. Bạn có thể chọn chế tạo hộp đựng bằng các vật liệu thủ công hoặc các bộ phận in 3D nếu bạn có quyền truy cập vào máy in 3D. Quy trình lắp ráp của bạn có thể thay đổi tùy thuộc vào vật liệu bạn sử dụng.

  • Cắt một lỗ trên tấm bìa các-tông để đầu động cơ servo chui qua.
  • Dán servo vào mặt dưới của bìa các-tông, để phần đầu chui qua lỗ.
  • Chế tạo các chân đỡ để đỡ bốn góc của tấm bìa.
  • Đặt một vòng tròn lên trên bìa các-tông, tập trung quanh servo. Một ống bìa các-tông từ bên trong cuộn băng keo hoặc băng giấy sẽ phù hợp.
  • Tạo các ngăn đựng thuốc bằng cách dán các que kem lại với nhau. Sử dụng thước đo góc nếu bạn muốn đo góc chính xác. Bạn sẽ cần quyết định số lượng ngăn bạn muốn, điều này sẽ xác định servo cần quay xa bao nhiêu.
  • Gắn ống nối servo vào động cơ (không cần dùng vít, chỉ cần ấn vào) và cẩn thận dán các que kem vào ống nối servo. Cẩn thận không dùng quá nhiều keo, bạn có thể cần tháo ống nối servo ra sau này để điều chỉnh.
  • Cắt một khoảng hình bánh quạt trên bìa các-tông, cùng kích thước và hình dạng với một trong các khe đựng thuốc.
  • Xây dựng một máng trượt dưới lỗ để thuốc sẽ trượt xuống khay.’

Lắp ráp mạch điện như trong Hình 6 và 7. Bạn sẽ cần biết cách sử dụng breadboard. Đảm bảo Arduino của bạn không được cắm vào nguồn USB khi bạn xây dựng mạch. Điều đó sẽ cho bạn cơ hội kiểm tra kỹ tất cả các dây nối trước khi bật nguồn Arduino. Lưu ý rằng sơ đồ này giả định bạn đang sử dụng Arduino UNO R4 với đồng hồ thời gian thực tích hợp. Nếu bạn sử dụng RTC bên ngoài, bạn sẽ cần một breadboard lớn hơn hoặc bạn sẽ phải tháo một số bộ phận (như còi) khỏi breadboard để chừa chỗ cho RTC. Xem hướng dẫn RTC bên ngoài của chúng tôi để biết thêm chi tiết về cách đi dây cho RTC bên.

Dưới đây là phần tiếp theo của bản dịch:

  • Kết nối LCD. Lưu ý rằng nhãn chân có thể thay đổi tùy thuộc vào nơi bạn mua bo mạch. Số chân đi từ trái sang phải khi xem màn hình theo chiều ngang, nhưng đi từ dưới lên trên trong Hình 6 vì màn hình được xoay.
    • Chân 1 (VSS hoặc GND) kết nối với GND
    • Chân 2 (VDD hoặc VCC) kết nối với 5V
    • Chân 3 (V0) kết nối với chân giữa của biến trở
    • Chân 4 (RS) kết nối với chân 12 Arduino
    • Chân 5 (RW) kết nối với GND
    • Chân 6 (E) kết nối với chân 11 Arduino
    • Chân 7 (D0) – không sử dụng
    • Chân 8 (D1) – không sử dụng
    • Chân 9 (D2) – không sử dụng
    • Chân 10 (D3) – không sử dụng
    • Chân 11 (D4) kết nối với chân 5 Arduino
    • Chân 12 (D5) kết nối với chân 4 Arduino
    • Chân 13 (D6) kết nối với chân 3 Arduino
    • Chân 14 (D7) kết nối với chân 2 Arduino
    • Chân 15 (LED hoặc A) kết nối với điện trở hạn dòng rồi kết nối với 5V
    • Chân 16 (LED hoặc K) kết nối với GND
  • Biến trở
    • Một chân ngoài kết nối với 5V
    • Chân giữa kết nối với chân 3 (V0) trên màn hình LCD
    • Chân ngoài còn lại kết nối với GND
  • LED
    • Chân dương (chân dài hơn) kết nối với chân 7 Arduino
    • Chân âm (chân ngắn hơn) kết nối với điện trở hạn dòng rồi kết nối với GND
  • Còi
    • Chân dương kết nối với chân 8 Arduino
    • Chân âm kết nối với GND
  • Nút nhấn
    • Một phía kết nối với 5V
    • Phía còn lại kết nối với GND qua điện trở pull-down 10 kΩ và kết nối với chân 9 Arduino

Hình 6. Sơ đồ breadboard. Nhấp vào đây để xem mạch trên Tinkercad, nơi bạn có thể phóng to. Lưu ý rằng mạch Tinkercad không chứa mã lập trình nên sẽ không có gì xảy ra nếu bạn chạy mô phỏng.

Tải mã ví dụ cho hộp đựng thuốc. Đọc qua mã có chú thích để bạn hiểu cách nó hoạt động.

Code :

/* automatic pill dispenser example code
for parts list, circuit diagram, and instructions see:

https://www.sciencebuddies.org/science-fair-projects/project-ideas/Elec_p105/electricity-electronics/automatic-pill-dispenser

This code assumes you are using the built-in RTC on an Arduino UNO R4. To modify the code for an external RTC, see:

https://www.sciencebuddies.org/science-fair-projects/references/how-to-use-an-arduino#step36

*/

// include libraries
#include <Servo.h>
#include <LiquidCrystal.h>
#include <RTC.h>

Servo servo; // create servo object

// constant variables for pins
const int servoPin = 6;
const int buttonPin = 9;
const int ledPin = 7;
const int buzzerPin = 8;

// other variables
int angle = 0;
int angleIncrement = 45; // default 45 degrees for 4 compartments, change for different number of compartments
int newAngle;
int buttonState;
int movementDelay = 50;
int debounceDelay = 1000;

// time variables
int year;
int month;
int day;
int hour;
int minutes;
int seconds;

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup(){ // setup code that only runs once
pinMode(buttonPin, INPUT); // set button pin as input
pinMode(ledPin,OUTPUT); // set LED pin as output
pinMode(buzzerPin,OUTPUT); // set buzzer pin as output
digitalWrite(ledPin,LOW); // make sure LED is off
digitalWrite(buzzerPin,LOW); // make sure buzzer is off
servo.attach(servoPin); // attach servo object to servoPin
servo.write(angle); // set servo to initial angle
Serial.begin(9600); // initialize serial for debugging

// set up the LCD’s number of columns and rows:
lcd.begin(16, 2);

// initialize the RTC and set the current date and time
// you will need to manually adjust the time right before you upload the code
RTC.begin();
RTCTime startTime(12, Month::APRIL, 2024, 8, 59, 50, DayOfWeek::FRIDAY, SaveLight::SAVING_TIME_ACTIVE);
RTC.setTime(startTime);
}

void loop(){ // code that loops forever
updateLCD(); // display the current date and time on the screen (see function below)

buttonState = digitalRead(buttonPin); // read button state (you can edit the code to advance the servo when you press the button, useful for debugging)
Serial.println(angle); // print the servo angle

// detect certain times and rotate the servo mechanism ahead by one compartment.
// the example code rotates the servo once per minute when the seconds variable equals 0.
// change to detect different times of day, for example (hours == 9 && minutes == 0 && seconds == 0) would detect 9:00:00 AM
// use additional “else if” conditions to detect more than one time

if(seconds == 0){ // check for seconds = 0 (one minute intervals)
newAngle = angle + angleIncrement; // increase angle by increment
if (newAngle<=180){ // if the new angle is less than or equal to 180, increase angle
while(angle < newAngle){ // increase angle until it reaches the new angle
angle = angle + 1; // increase angle by 1
servo.write(angle); // move the servo
Serial.println(angle); // print the angle
delay(movementDelay); // delay to slow down movement
}
// flash LED and buzzer
flashLED(4,150); // flashLED(number of flashes, delay in milliseconds), see function below
}
else{ // if the new angle is greater than 180, reset angle to 0
while(angle>0){ // decrease angle until it reaches 0
angle = angle – 1; // decrease angle by 1
servo.write(angle); // move the servo
Serial.println(angle);// print the angle
delay(movementDelay); // delay to slow down movement
}
}
}
}

void flashLED(int numFlashes, int flashDelay){ // alarm function to flash LED and sound buzzer
lcd.clear(); // clear the LCD screen
lcd.setCursor(0, 0); // set cursor to top left
lcd.print(“Take medicine!”); // display message
for (int i = 0; i<numFlashes; i++){ // loop to flash LED/buzzer numFlashes times
digitalWrite(ledPin,HIGH); // turn LED on
digitalWrite(buzzerPin,HIGH); // turn buzzer on
delay(flashDelay); // delay
digitalWrite(ledPin,LOW); // turn LED off
digitalWrite(buzzerPin,LOW); // turn buzzer off
delay(flashDelay); // delay
}
// wait for button press – the code will get stuck in this loop until you press the button
while(digitalRead(buttonPin) == LOW){};
delay(1000); // delay before clearing screen
lcd.clear(); // clear screen
}

void updateLCD(){ // function to update LCD screen
// get current time from the RTC
RTCTime currentTime;
RTC.getTime(currentTime);
// store current time variables
year = currentTime.getYear();
month = Month2int(currentTime.getMonth());
day = currentTime.getDayOfMonth();
hour = currentTime.getHour();
minutes = currentTime.getMinutes();
seconds = currentTime.getSeconds();

// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 0);
// print month/day/year (rearrange for different date formats)
// add leading spaces if month or day are less than 10 to keep spacing consistent
// (always use 2 characters for month and day)
if(month<10){ // print extra space if month is less than 10
lcd.print(” “);
}
lcd.print(month); // print the month
lcd.print(“/”);
if(day<10){ // print extra space if the day is less than 10
lcd.print(” “);
}
lcd.print(day); // print the day
lcd.print(“/”);
lcd.print(year); // print the year

// print time in hh:mm:ss format
// add leading zeroes if minutes or seconds are less than ten to keep spacing consistent
lcd.setCursor(0, 1); // move cursor to second row
if(hour<10){ // print leading space if hour is less than 10
lcd.print(” “);
}
lcd.print(hour); // print the hour
lcd.print(“:”);
if(minutes<10){ // print leading zero if minute is less than 10
lcd.print(“0”);
}
lcd.print(minutes); // print the minute
lcd.print(“:”);
if(seconds<10){ // print leading zero if second is less than 10
lcd.print(“0”);
}
lcd.print(seconds); // print the second
}

  • Mã này được viết cho RTC tích hợp trên Arduino UNO R4 Minima. Nếu bạn sử dụng module RTC bên ngoài, bạn sẽ cần sửa đổi mã. Chúng tôi có mã ví dụ cho RTC bên ngoài ở đây.
  • Mã này được viết cho hộp đựng với bốn ngăn. Nó tự động xoay servo 45° một lần mỗi phút và sau đó phát ra báo động. Sau khi xoay, bạn cần nhấn nút để xác nhận đã uống thuốc. Sau khi servo đã quay 180°, nó đặt lại về vị trí ban đầu.

Tải mã lên Arduino và kiểm tra nó. Quan sát chuyển động của hộp đựng. Bạn có thể cần phải tháo ống nối servo ra (đây là lý do chúng tôi nói không nên gắn nó bằng vít trước đó) và điều chỉnh nó để các ngăn thẳng hàng với lỗ trên bìa các-tông.

Nếu thiết bị của bạn không hoạt động như mong đợi (servo không quay, đèn LED không sáng, màn hình LCD không hiển thị đúng, nút không hoạt động, v.v.), bạn sẽ cần khắc phục sự cố hoặc gỡ lỗi mạch của mình. Đây là một mạch phức tạp với nhiều bộ phận. Rất dễ đặt sai một sợi dây trên breadboard, điều này có thể khiến một hoặc nhiều phần của mạch không hoạt động bình thường. Bạn sẽ cần kiểm tra cẩn thận hai và ba lần tất cả các kết nối của mình. Cũng rất hữu ích khi nhờ người khác kiểm tra lại cách đi dây của bạn, giống như bạn có thể yêu cầu ai đó khác đọc lại bài viết của mình. Đôi khi rất khó để phát hiện ra lỗi của chính mình. Nếu bạn bị mắc kẹt hoặc thất vọng, hãy tạm dừng làm việc với mạch và quay lại sau. Bạn có thể nhận thấy điều mà trước đó bạn không nhận ra.

Đặt một ít kẹo vào các ngăn đựng của hộp và kiểm tra lại. Đảm bảo không có vấn đề với máng trượt hoặc khay, chẳng hạn như kẹo bị kẹt hoặc trượt xuống quá nhanh và bật ra khỏi khay. Điều chỉnh máng trượt và khay nếu cần.

Một khi bạn đã có thiết bị hoạt động với mã ví dụ, đã đến lúc tùy chỉnh mã của bạn. Mã ví dụ phân phối thuốc mỗi phút một lần, điều này hoạt động tốt khi thử nghiệm hoặc cho một cuộc trình diễn tại hội chợ khoa học. Có nhiều thứ bạn có thể thay đổi và tùy chỉnh trong mã:

  • Tần suất phân phối thuốc. Mã ví dụ thực hiện điều này mỗi phút một lần, điều này hoạt động tốt cho việc thử nghiệm và trình diễn tại hội chợ khoa học, nhưng để sử dụng trong thực tế, bạn sẽ cần đặt các thời điểm khác nhau trong ngày. Bạn có thể làm điều này bằng cách điều chỉnh (các) điều kiện trong câu lệnh if phát hiện thời gian (seconds == 0 trong mã ví dụ).
  • Góc quay của servo. Mã ví dụ xoay servo 45° mỗi lần, phù hợp cho bốn ngăn. Bạn sẽ cần thay đổi biến angleIncrement nếu bạn có số ngăn khác.
  • Các thông báo hiển thị trên màn hình LCD.
  • Hành vi của báo động, ví dụ báo động kêu một số lần cố định hoặc tiếp tục kêu cho đến khi bạn nhấn nút.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Back to top button