CatOmater V1.9 – Đồ chơi laser cho mèo gắn trần/tường (IoT, Home Assistant)
CatOmater V1.9 là cơ cấu pan/tilt để gắn laser pointer, điều khiển từ xa bằng ESP8266 + ESPHome trong Home Assistant. Thiết kế dễ in 3D, chắc chắn, gắn trần/tường và có ví dụ script chạy ngẫu nhiên cho mèo rượt chấm đỏ.
Mô tả
30. Jan. 2024 v1.9:
- Thêm ví dụ mới cho script có dùng biến (variables), khoảng giá trị (ranges) và giá trị ngẫu nhiên (random values).
16. Okt. 2023, V1.8:
- Ít chi tiết và bu-lông hơn, gộp các phần lại thành một socket base mới
- Thêm lỗ lớn hơn cho dây servo (đỡ kẹt, tăng biên độ chuyển động)
- Thay thế toàn bộ các lỗ đi dây còn lại trên socket base
Một bản remix từ: https://www.thingiverse.com/thing:1799905
Mình thiết kế thêm các phần phụ và tìm hiểu một chút, rồi ra được bộ này. Một món đồ chơi laser cho mèo: dễ in, dễ lập trình, chắc chắn và điều khiển từ xa.
Hễ con mèo nhà mình nghe tiếng servo là nó chạy vô phòng khách kiếm chấm đỏ liền. Nghe đúng kiểu “cat automation” luôn đó chứ ;)
CatOmater của mình gắn trên trần nhà, kích hoạt bằng một nút zigbee để sẵn đâu đó.
Bước tiếp theo: dạy mèo bấm nút ;)
Bạn sẽ cần vít M2 và vài con vít nhỏ khác cho các phần của mẫu gốc vì mình không thay đổi các lỗ và phần khoét (cutouts) nguyên bản.
Bạn cần chuẩn bị:
- 2x servo SG90
- 1x ESP8266 (ví dụ Wemos D1 mini, vì có cổng USB kèm UART tích hợp và cũng cấp nguồn 5V)
- Home Assistant + ESPHome Addon
- LASERFUCHS 650nm 1mW 3-12VDC - 70103984 (laser class 2 có chứng nhận)
- Bạn có thể ủng hộ mình bằng cách dùng link affiliate này: https://amzn.to/3ztJcfg
In 3D:
File 3MF dùng để gộp các chi tiết đã được căn sẵn đúng vị trí để in. Bật supports khi cần.
ESPHome & Homeassistant:
Mình dùng hướng dẫn này làm template: https://siytek.com/esphome-servo-example/
Mình tìm ra cách dùng service của ESPHome trực tiếp và dùng variables trong scripts hay hơn nhiều. (xem ví dụ script bên dưới)
Ví dụ cấu hình ESPHome:
transition_length:
- Giá trị này xác định thời gian motor cần để đi hết hành trình từ 0%–100%. Giá trị càng cao thì tốc độ chuyển động càng chậm.
auto_detach_time:
-
Giá trị này xác định sau bao lâu thì motor sẽ được “nhả” (released) để tránh tiếng tạch tạch khi hệ thống bật nhưng không hoạt động.
esphome: name: cat-laser friendly_name: Cat Laser
esp8266: board: d1_mini
Enable logging
logger: web_server:
https://esphome.io/components/web_server.html
port: 80 local: true ota: true # Enable OTAEnable Home Assistant API
api:
encryption: key: "
" services:
- service: servo_y
variables:
level: float
then:
- servo.write: id: servo_y level: !lambda 'return level / 100.0;'
- service: servo_x
variables:
level: float
then:
- servo.write: id: servo_x level: !lambda 'return level / 100.0;'
ota:
wifi:
https://esphome.io/components/wifi.html
ssid: !secret wifi_ssid password: !secret wifi_password
Optional manual IP
manual_ip: static_ip: 192.168.1.40 gateway: 192.168.1.0 subnet: 255.255.255.0
ap: ssid: "Cat Laser Fallback Hotspot" password: "
" captive_portal:
output:
- platform: esp8266_pwm id: pwm_1 pin: D5 frequency: 50 Hz
- platform: esp8266_pwm id: pwm_2 pin: D6 frequency: 50 Hz
servo:
- id: servo_y output: pwm_1 transition_length: "10s" auto_detach_time: 1s
- id: servo_x output: pwm_2 transition_length: "10s" auto_detach_time: 1s
Example configuration entry
switch:
- platform: gpio pin: D7 name: "Laser Pointer" restore_mode: ALWAYS_OFF
- service: servo_y
variables:
level: float
then:
Ví dụ scripts trong Homeassistant:
Dĩ nhiên bạn cần chỉnh lại các giá trị cho phù hợp, nhưng ví dụ này sẽ giúp bạn hình dung cách tự động hóa các pattern (giờ có variables).
Xem cách dùng variables, ranges, random values và gọi thẳng ESPHome services.
Về vị trí park và tắt laser
alias: Cat Laser - Park position
sequence:
- service: switch.turn_off
data: {}
target:
entity_id: switch.cat_laser_laser_pointer
- variables:
park_x: -25
park_y: 75
- service: esphome.cat_laser_servo_x
data:
level: "{{ park_x }}"
- service: esphome.cat_laser_servo_y
data:
level: "{{ park_y }}"
mode: single
icon: mdi:cat
Laser di chuyển ngẫu nhiên trong các tọa độ đã định nghĩa (ví dụ mới).
Đây chỉ là ví dụ. Bạn phải tự đặt giá trị trong lệnh range(min, max) theo vùng x/y bạn muốn!
Giá trị có thể nằm trong khoảng -100 đến 100. Mình dùng các giá trị này cho một khu vực nhỏ để mèo mình đuổi theo tia laser.
Ví dụ này sẽ làm:
-
Bật laser
-
Di chuyển tới một vị trí x/y ngẫu nhiên trong phạm vi (range)
-
Chờ 500ms (delay)
-
Lặp lại
-
Dừng sau 500 lần di chuyển x/y (count: 500)
-
Tắt laser
alias: Cat Laser - Chase random sequence:
- service: switch.turn_on data: {} target: entity_id: switch.cat_laser_laser_pointer
- repeat:
sequence:
- service: esphome.cat_laser_servo_x data: level: "{{ range(-68, 13) | random |int}}"
- service: esphome.cat_laser_servo_y data: level: "{{ range(5, 22) | random |int}}"
- delay: hours: 0 minutes: 0 seconds: 0 milliseconds: 500 count: 500
- service: switch.turn_off
target:
entity_id:
- switch.cat_laser_laser_pointer data: {} mode: single icon: mdi:cat
Giấy phép
File mô hình
Chưa có bản in nào được khoe. Hãy là người đầu tiên!
Chưa có bình luận nào. Hãy là người đầu tiên!