# Video Demo
{%youtube OLvcHbxrx7E %}
# PPT for the presentation in 2024/01/04
[PPT](https://drive.google.com/file/d/1WyCARhTa8HKj1XTdzUYo_Yj8KncDimOR/view?usp=sharing)
# Design Draft
## Cockroach Box

### 1. Camera:
Catch real-time video to detect Cockroach by Yolo v8 and streaming on the website.
### 2. Hitter:
Let the Acrylic board rotate to hit cockroach, which is powered by SG90.
### 3. Cleaner:
Use two SG90 to let the board move forward and backward to clean the cockroach away from the camera's sight.
> If we don't do it, the hitter will hit the cockroach continuously due to the false detection from camera.
## Website

### 1. Reference:
https://www.instructables.com/Video-Streaming-Web-Server/
### 2. Framework:
Flask and Python
### 3. Streaming:
Catch the video from Raspberry Pi for playing the real-time video in the cockroach box.
### 4. Pay and Hit bottom:
Pay to let the hitter start to work for hitting the cockroach.
# Necessary Equipment
## Something you should buy
**1. Acrylic Board**
[2mm透明 30cm x 30cm透明壓克力板](https://shopee.tw/2mm%E9%80%8F%E6%98%8E-30cm~40cm%E9%80%8F%E6%98%8E%E5%A3%93%E5%85%8B%E5%8A%9B%E6%9D%BF-i.7116182.9370521218)

**2. Acrylic Knife**
[壓克力板DIY切割刀 勾刀 塑膠板切割刀 鉤刀 PCB線路勾刀](https://shopee.tw/%E5%A3%93%E5%85%8B%E5%8A%9B%E5%88%80-%E5%A3%93%E5%85%8B%E5%8A%9B%E6%9D%BFDIY%E5%88%87%E5%89%B2%E5%88%80-%E5%8B%BE%E5%88%80-%E5%A1%91%E8%86%A0%E6%9D%BF%E5%88%87%E5%89%B2%E5%88%80-%E9%89%A4%E5%88%80-PCB%E7%B7%9A%E8%B7%AF%E5%8B%BE%E5%88%80-%E7%BE%8E%E5%B7%A5%E5%88%80-%E5%8F%B0%E7%81%A3%E7%8F%BE%E8%B2%A8-i.7116182.16170627036)

**3. Acrylic Glue**
[壓克力專用膠水](https://shopee.tw/%E5%A3%93%E5%85%8B%E5%8A%9B%E5%B0%88%E7%94%A8%E8%86%A0%E6%B0%B4-%E5%A3%93%E5%85%8B%E5%8A%9B%E9%BB%8F%E5%90%88%E5%B0%88%E7%94%A8-%E5%A3%93%E5%85%8B%E5%8A%9B%E8%86%A0%E6%B0%B4-%E5%A3%93%E5%85%8B%E5%8A%9B%E9%BB%8F%E8%91%97%E5%8A%91-%E5%A3%93%E5%85%8B%E5%8A%9B%E8%86%A0-%E9%BB%8F%E5%A3%93%E5%85%8B%E5%8A%9B%E5%B0%88%E7%94%A8-%E5%A3%93%E5%85%8B%E5%8A%9B%E5%BF%AB%E4%B9%BE-i.7116182.18348774644)

**4. padlock**
[壓克力配件 扣掛鎖 三件式圓鎖](https://shopee.tw/%E5%A3%93%E5%85%8B%E5%8A%9B%E9%85%8D%E4%BB%B6-%E6%89%A3%E6%8E%9B%E9%8E%96-%E4%B8%89%E4%BB%B6%E5%BC%8F%E5%9C%93%E9%8E%96-i.7116182.21119757785)

**5. SG90 servo motor bracket**
[SG90 伺服馬達 支架 固定架含螺絲](https://shopee.tw/%E3%80%90%E6%A8%82%E6%84%8F%E5%89%B5%E5%AE%A2%E5%AE%98%E6%96%B9%E5%BA%97%E3%80%91%E3%80%8A%E9%99%84%E7%99%BC%E7%A5%A8%E3%80%8BSG90-%E4%BC%BA%E6%9C%8D%E9%A6%AC%E9%81%94-%E6%94%AF%E6%9E%B6-%E5%9B%BA%E5%AE%9A%E6%9E%B6%E5%90%AB%E8%9E%BA%E7%B5%B2-i.139069730.2911262401)

**6. camera bracket**
[樹莓派Raspberry Pi 3B+ 4B 通用攝像頭支架 壓克力支架](https://shopee.tw/%E3%80%90%E6%A8%82%E6%84%8F%E5%89%B5%E5%AE%A2%E5%AE%98%E6%96%B9%E5%BA%97%E3%80%91%E3%80%8A%E9%99%84%E7%99%BC%E7%A5%A8%E3%80%8B%E6%A8%B9%E8%8E%93%E6%B4%BERaspberry-Pi-3B-4B-%E9%80%9A%E7%94%A8%E6%94%9D%E5%83%8F%E9%A0%AD%E6%94%AF%E6%9E%B6-%E5%A3%93%E5%85%8B%E5%8A%9B%E6%94%AF%E6%9E%B6-(%E4%B8%8D%E5%90%AB%E6%94%9D%E5%83%8F%E9%A0%AD)-i.139069730.5952962263)

**7. Card sleeve hub**
[伸縮鑰匙扣](https://shopee.tw/%E7%99%BB%E5%B1%B1%E6%89%A3%E4%BC%B8%E7%B8%AE%E9%91%B0%E5%8C%99%E6%89%A3-%E5%B9%B3%E9%9D%A2%E9%91%B0%E5%8C%99%E6%89%A3-%E5%8A%A0%E5%8E%9A%E5%B0%BC%E9%BE%8D%E7%B9%A9-%E6%88%B6%E5%A4%96%E7%A3%A8%E7%A0%82%E6%98%93%E6%8B%89%E6%89%A3-%E5%A1%91%E6%96%99%E5%9C%93%E5%BD%A2%E7%99%BB%E5%B1%B1%E6%89%A3%E4%BC%B8%E7%B8%AE%E6%98%93%E6%8B%89%E5%BE%97-i.5886119.11826623994?sp_atk=eddf3361-6dca-47d3-baaf-fb52f6cd192b&xptdk=eddf3361-6dca-47d3-baaf-fb52f6cd192b)

## Already inside the box
**1. SG90 360 degree roation**

**2. Camera**

# Hardware
## Cockroach box
1. Cut the door on acrylic by acrylic knife
> cut it back and forth 100 times, it will break.

2. Cut Installation location for SG90 for the cleaner on acrylic by acrylic knife

3. Combine the 5 pieces of acrylic boards together as a box

4. Build the camera stage

## Camera module
1. install Camera module in the camera bracket

2. Paste it on the camera stage by acrylic glue

## Hitter
1. Find a unused acrylic board, paste padlock set on it

2. Fix the SG90 motor on the bracket, tie a line on the arm, and the line which is connected to (1.) board. Finally, paste bracket on the side of the cockroach box

3. Paste a keyhole which is including the set of padlock on the wall

4. All setted up

## Cleaner
1. Destroy Card sleeve hub, and get this

2. Tie another card sleeve hub and this by a line like it

3. install SG90 motor(already install in the bracket) on the hole we cut in the previous chapter

4. The arm will make the reel rotate

5. Tied the paper board

# Software
## Environment settings
### 1. Install OS
> DON'T INSTALL OS "BUSTER" as EECLASS said
1. install [Raspberry Pi Imager](https://www.raspberrypi.com/software/) and open it.
2. choose 64-bit OS

3. After installing into SD card, insert the SD card in the Raspiberry and plug in the power to turn on the Raspiberry.
### 2. Install Camera Module
> The following script should run in RaspberryPi
1. Close the warning message for "pip" script
```
sudo mv /usr/lib/python3.11/EXTERNALLY-MANAGED /usr/lib/python3.11/EXTERNALLY-MANAGED.bk
```
2. Install Meson
```
wget https://github.com/mesonbuild/meson/releases/download/1.3.1/meson-1.3.1.tar.gz
```
```
tar xvf meson-1.3.1.tar.gz
```
```
cd meson-1.3.1
```
```
python meson.py
```
>Set environment variables
```
export PATH="$PATH":/home/even/libcamera/meson-1.3.1
sudo apt install meson
```
3. Install CMake
```
sudo apt install cmake
```
4. Install Ply
```
pip install ply
```
5. Install libcamera
```
git clone https://git.libcamera.org/libcamera/libcamera.git
```
```
cd libcamera
```
```
meson setup build
```
```
ninja -C build install
```
6. Let's give it a try
```
libcamera-hello
```
### 3. Install ultralytics (yolo v8)
```
sudo apt-get update
```
```
sudo apt-get upgrade -y
```
```
sudo apt-get autoremove -y
```
```
pip3 install ultralytics
```
Reboot the Raspberry
```
sudo reboot
```
## Train a Cockroach Detection Model
>The Following actions should run in your laptop
### 1. Prepare Dataset
1. Collect Dataset

2. Install LabelImg
> install by pip
```
pip install labelImg
```
>open labelImg
```
labelImg
```
3. Label Cockroach
> Launch LabelImg to label Cockroach

### 2. Cut Dataset
###### 資料分配比例
1. Train Set
> 70%
2. Validate Set
> 20%
3. Test Set
> 10%
### 3. Write the .yaml File

**The Example of train/val/test.txt File**

**File Structure**

### 4. Package and upload to Google Drive
**Share the file with public**

**Copy the File ID**

**Use this ID in Colab to Download your dataset**

> Because it will be pretty faster compare with uploading to Colab directl
### 5. Training
1. Use the following code to Train
[Train Yolo v8 nano in Colab](https://colab.research.google.com/drive/1c-I2KMwe6cD4SWf-Iyz4xY00u2_Fb8ha?usp=sharing)

2. Get the .pt file
**This is the File Tree of weight file for Yolo v8 in Colab**

## Yolo in RaspberryPi
> You need to put your .pt file in your RaspberryPi
> But save in the dir of Ultralytics package is not necessary, just save wherever you like.
### 1. Get the center of the detect cockroach
> Yolo will provide the coordinates of left-top and right-bottom of the detected object.
> 
```
def getMiddlePoint(A, B):
return int((A+B)/2)
```
2. Measure the Hittable area

```
def isMeetCockroach(x ,y):
RangeX = 853
RangeY = 418
if(x > RangeX and y > RangeY):
return True
else:
return False
```
### 3. Run Yolo
> Catch streaming vid at tcp://127.0.0.1:8888
```
model = YOLO('yolov8n_cockroach.pt')
results = model('tcp://127.0.0.1:8888', stream=True)
while True:
for result in results:
boxes = result.boxes
probs = result.probs
```
### 4. Hit Cockroach when it enter the areas that can be struck
```
def meetCockroach():
servoPIN = 13
GPIO.setmode(GPIO.BCM)
GPIO.setup(servoPIN, GPIO.OUT)
p = GPIO.PWM(servoPIN, 10)
p.start(2.5)
print("Hitted!")
#Hit
p.ChangeDutyCycle(5)
time.sleep(1.75)
p.stop()
GPIO.cleanup()
print("break!")
# Take a break
time.sleep(5)
# reset
servoPIN = 13
GPIO.setmode(GPIO.BCM)
GPIO.setup(servoPIN, GPIO.OUT)
p = GPIO.PWM(servoPIN, 10)
p.start(2.5)
print("Release!")
#Release
p.ChangeDutyCycle(10)
time.sleep(1.75)
p.stop()
GPIO.cleanup()
```
### 5. Total code
```
from ultralytics import YOLO
import RPi.GPIO as GPIO
import time
def getMiddlePoint(A, B):
return int((A+B)/2)
def isMeetCockroach(x ,y):
RangeX = 853
RangeY = 418
if(x > RangeX and y > RangeY):
return True
else:
return False
def meetCockroach():
servoPIN = 13
GPIO.setmode(GPIO.BCM)
GPIO.setup(servoPIN, GPIO.OUT)
p = GPIO.PWM(servoPIN, 10)
p.start(2.5)
print("Hitted!")
#Hit
p.ChangeDutyCycle(5)
time.sleep(1.75)
p.stop()
GPIO.cleanup()
print("break!")
# Take a break
time.sleep(5)
# reset
servoPIN = 13
GPIO.setmode(GPIO.BCM)
GPIO.setup(servoPIN, GPIO.OUT)
p = GPIO.PWM(servoPIN, 10)
p.start(2.5)
print("Release!")
#Release
p.ChangeDutyCycle(10)
time.sleep(1.75)
p.stop()
GPIO.cleanup()
model = YOLO('yolov8n_cockroach.pt')
results = model('tcp://127.0.0.1:8888', stream=True)
while True:
for result in results:
boxes = result.boxes
for box in boxes:
b = box.xyxy[0] # get box coordinates in (left, top, right, bottom) format
middleX = getMiddlePoint(b.numpy()[0],b.numpy()[2])
middleY = getMiddlePoint(b.numpy()[1],b.numpy()[3])
print(middleX,middleY)
if(isMeetCockroach(middleX ,middleY)):
print("HELLO")
meetCockroach()
probs = result.probs
```
## Control Hitter
### 1. The Shape of the Hitter


### 2. Turn clockwise to tighten the rope
```
import RPi.GPIO as GPIO
import time
servoPIN = 13
GPIO.setmode(GPIO.BCM)
GPIO.setup(servoPIN, GPIO.OUT)
p = GPIO.PWM(servoPIN, 10)
p.start(2.5)
try:
p.ChangeDutyCycle(10)
time.sleep(1.75)
p.stop()
except KeyboardInterrupt:
p.stop()
GPIO.cleanup()
```
### 3. Turn counterclockwise to loosen the rope
```
import RPi.GPIO as GPIO
import time
servoPIN = 13
GPIO.setmode(GPIO.BCM)
GPIO.setup(servoPIN, GPIO.OUT)
p = GPIO.PWM(servoPIN, 10)
p.start(2.5)
try:
p.ChangeDutyCycle(5)
time.sleep(1.75)
p.stop()
except KeyboardInterrupt:
p.stop()
GPIO.cleanup()
```
## Deploy to RasberryPi
> The Following scripts should run in RasberryPi
### 1. Run Camera module
```
libcamera-vid -n -t 0 --width 1280 --height 960 --framerate 1 --inline --listen -o tcp://127.0.0.1:8888
```
> The port tcp://127.0.0.1:8888 is waiting for any Process to connect.

### 2. Run the Code in Thonny

### 3. Make sure that Yolo is successfully connect with the camera

### 4. Start to detect Cockroach

# Still On the way
## Cleaner
#### SG90 is out of control
It is difficult to control two SG90 motor in the same code.
{%youtube vQjAjwJGI4s %}
```
import RPi.GPIO as GPIO
import time
# Define GPIO pins for the servos
servoRight = 12
servoLeft = 13
# Setup GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(servoRight, GPIO.OUT)
GPIO.setup(servoLeft, GPIO.OUT)
# Initialize PWM for both servos
pRight = GPIO.PWM(servoRight, 50) # 50Hz frequency
pLeft = GPIO.PWM(servoLeft, 50) # 50Hz frequency
# Start PWM with initial duty cycle (2.5% might be a neutral position)
pRight.start(2.5)
pLeft.start(2.5)
try:
# Turn servoRight to one direction
pRight.ChangeDutyCycle(18)
# Turn servoLeft to another direction
pLeft.ChangeDutyCycle(50)
time.sleep(5)
except KeyboardInterrupt:
pass
# Cleanup
pRight.stop()
pLeft.stop()
GPIO.cleanup()
```
## Website
### 1. Conflict between Flask and Pycamera2

### 2. Conflict between Yolo and the other process
> No idea.
# Reference
## Yolo V8 offical website
https://docs.ultralytics.com/modes/train/#key-features-of-train-mode