> For the complete documentation index, see [llms.txt](https://htooaunklinn-organization.gitbook.io/htooaunklinn-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://htooaunklinn-organization.gitbook.io/htooaunklinn-docs/hardware-and-iot/arduino-on-macos/page.md).

# Page

To install the `pyserial` package using Blender's bundled Python, follow these steps:

1. Ensure `pip` is installed:

   ```
   /Applications/Blender.app/Contents/Resources/3.6/python/bin/python3.10 -m ensurepip
   ```
2. Install `pyserial` using pip:

   ```
   /Applications/Blender.app/Contents/Resources/3.6/python/bin/python3.10 -m pip install pyserial
   ```

```python
import serial
import bpy
import time

ser = serial.Serial('/dev/cu.usbmodem11201', 115200)
time.sleep(3)

ser.write(b'Get Distance\n')
start = float(ser.readline().decode().strip())

cube = bpy.context.selected_objects[0]

for x in range(100):
    ser.write(b'Get Distance\n')
    time.sleep(0.05)
    current = float(ser.readline().decode().strip())
    print(current)
    cube.location.z = start - current
    bpy.ops.wm.redraw_timer(type='DRAW_WIN_SWAP', iterations=1)

ser.close()

```

```cpp
const int trigPin = 9;
const int echoPin = 10;
long duration;
float distance;

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  Serial.begin(115200);
}

void loop() {
  if (Serial.available()) {
    String command = Serial.readStringUntil('\n');
    command.trim();  // remove any \r or whitespace

    if (command == "Get Distance") {
      // Trigger ultrasonic pulse
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);

      // Read echo time
      duration = pulseIn(echoPin, HIGH);

      // Convert to distance in centimeters
      distance = duration * 0.034 / 2;

      // Send distance to Python
      Serial.println(distance);
    }
  }
}

```
