--- /dev/null
+"""
+write_binary_grating.py
+Andrew Lorimer, January 2025
+Monash University
+
+Writes a transmission binary grating pattern using
+the confocal direct laser writing setup on Sb2S3 thin-film PCM.
+"""
+
+import configparser as cp
+import cv2
+import numpy as np
+import sys
+import matplotlib.pyplot as plt
+import write_path
+from pipython import datarectools, pitools
+import nidaqmx
+import pipython
+import time
+
+TRANSITION_SPEED = 100 # speed for moving between lines, um/s
+
+# Input parameters
+grating_pitch = 2.7 # Lambda, um
+beam_width = 0.7
+writing_speed = 10 # speed for writing crystallised lines, um/s
+dimensions = (50, 50) # horizontal * vertical, um
+origin = (0, 0) # horizontal * vertical, um
+
+def wait_target(pidevice, thresh=0.01, axes=[1, 2, 3]):
+ target = pidevice.qMOV(axes)
+ on_target = False
+ while on_target == False:
+ pos = pidevice.qPOS(axes)
+ on_target = True
+ distances = np.abs(np.array(list(pos.values())) - np.array(list(target.values())))
+ on_target = np.all(distances < thresh)
+
+
+def main(task, pidevice):
+
+ # One block is a solid area with constant refractive index in the
+ # diffraction grating
+ # One line is a single pass of the laser, with many lines making up a
+ # block (depending on the beam width)
+
+ n_blocks = int(dimensions[0] // grating_pitch)
+ n_lines = int(grating_pitch // beam_width)
+
+ pidevice.VCO({1: True})
+
+ updown = 0
+
+ for i in range(n_blocks):
+ if (i % 2 == 0):
+ # Even number block - crystallise
+
+ y_block = origin[0] + i * grating_pitch
+
+ for j in range(n_lines):
+ y_line = y_block + j*beam_width
+ x_start = origin[1] + int(not updown)*dimensions[1]
+ x_end = origin[1] + updown*dimensions[1]
+
+ # Go to line start position
+ pidevice.VEL({1: TRANSITION_SPEED})
+ pidevice.MOV({1: x_start, 2: y_line})
+ wait_target(pidevice)
+ time.sleep(0.3)
+
+ # Write line
+ pidevice.VEL({1: writing_speed})
+ pidevice.MOV({1: x_end, 2: y_line})
+ #time.sleep(0.05) # compensation for acceleration period
+ task.write(True)
+ wait_target(pidevice)
+ task.write(False)
+ time.sleep(0.3)
+
+ updown = int(not updown)
+ else:
+ # Odd number line - do nothing
+ pass
+
+if __name__ == "__main__":
+ task, pidevice = write_path.setup()
+ try:
+ main(task, pidevice)
+ finally:
+ print("Exiting")
+ task.write(False)
+ task.close()
+ pidevice.VCO({1: True, 2: True})
+ pidevice.VEL({1: TRANSITION_SPEED, 2: TRANSITION_SPEED})
+ pidevice.MOV({1: origin[1], 2: origin[0]})
+ pitools.waitontarget(pidevice, [1, 2])
+ pitools.stopall(pidevice)