Summary

RS-232 serial command protocol for Draper MC1 motor controller (used in AeroLift 100 projection screen lifts). Two-way communication at 9600 baud, ASCII framed by * header and ; (or CR) terminator. Supports open/close/stop, calibration, position query, and load-sensing configuration.

Transport

protocols:
  - serial
serial:
  baud_rate: 9600
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: software  # X-on/X-off per source: buffer half full = X-off, buffer empty = X-on
auth:
  type: none  # inferred: no auth procedure in source

Traits

- powerable  # inferred from open/close commands
- queryable  # inferred from "r" position query

Actions

# Command format: *<subsystem><admin><command><channel><time>;
# Subsystem: 02-7 BUS, 7-99 Radio, 0 = ALL
# Channel: 00-60 (00 = ALL, 60 = cut strap ALL)
# Time: 000-999 in 1/20 sec (000 = forever; omit = 2 sec for motion, 1/4 sec for stop/program)
# Case insensitive.

- id: lower_screen
  label: Lower Screen (Open)
  kind: action
  command: "*{subsystem}{o}{channel}{time};"
  params:
    - name: subsystem
      type: integer
      description: "02-7 BUS, 7-99 Radio, 0 = ALL"
    - name: channel
      type: integer
      description: "00-60; 00 = ALL, 60 = cut strap ALL"
    - name: time
      type: integer
      description: "000-999 in 1/20 sec; 000 = forever; omit for 2 sec default"

- id: raise_screen
  label: Raise Screen (Close)
  kind: action
  command: "*{subsystem}{c}{channel}{time};"
  params:
    - name: subsystem
      type: integer
      description: "02-7 BUS, 7-99 Radio, 0 = ALL"
    - name: channel
      type: integer
      description: "00-60; 00 = ALL, 60 = cut strap ALL"
    - name: time
      type: integer
      description: "000-999 in 1/20 sec; 000 = forever; omit for 2 sec default"

- id: stop_motion
  label: Stop Motion
  kind: action
  command: "*{subsystem}{s}{channel};"
  params:
    - name: subsystem
      type: integer
      description: "02-7 BUS, 7-99 Radio"
    - name: channel
      type: integer
      description: "Optional for stop; ignored if present"

- id: program
  label: Program
  kind: action
  command: "*{subsystem}{p}{channel};"
  params:
    - name: subsystem
      type: integer
      description: "02-7 BUS, 7-99 Radio"
    - name: channel
      type: integer
      description: "Channel number to program"

- id: program_accessor
  label: Program Accessor
  kind: action
  command: "*{subsystem}{a}{channel};"
  params:
    - name: subsystem
      type: integer
      description: "02-7 BUS, 7-99 Radio"
    - name: channel
      type: integer
      description: "Channel number"

- id: quit_forever
  label: Quit Sending (stop forever command)
  kind: action
  command: "*{subsystem}{q}{channel};"
  params:
    - name: subsystem
      type: integer
      description: "02-7 BUS, 7-99 Radio"
    - name: channel
      type: integer
      description: "Channel number"

- id: position_query
  label: Position Query
  kind: query
  command: "*{subsystem}{r}{channel};"
  params:
    - name: subsystem
      type: integer
      description: "02-7 BUS, 7-99 Radio; 0 = ALL (excludes radio)"
    - name: channel
      type: integer
      description: "Channel number"

- id: version_query
  label: Version Query
  kind: query
  command: "*V;"
  params: []

- id: admin_radio
  label: Administer Port 7 as Radio
  kind: action
  command: "*R;"
  params: []

- id: admin_bus
  label: Administer Port 7 as BUS
  kind: action
  command: "*B;"
  params: []

- id: calibrate_motor
  label: Calibrate Motor
  kind: action
  command: "*p01;*c10;*o10;"
  params: []
  notes: "Per source: programs, closes to upper limit, opens to lower limit, returns to lower limit. Motor becomes calibrated."

- id: factory_reset
  label: Factory Reset
  kind: action
  command: "*p00;*c00;*c01;*o01;*s;"
  params: []
  notes: "Per source: button cannot be held, use this command string to reset all settings to factory default."

- id: set_min_load
  label: Set Minimum Load Threshold
  kind: action
  command: "C18 O{x} O{y}"
  params:
    - name: x
      type: integer
      description: "Ox; O5-O9 ignored as out of range; O10 = y=0 shortcut"
    - name: y
      type: integer
      description: "Oy; ignored if 0"
  notes: "Source documents this as IR-style load-sense command, not RS-232 frame. Listed for completeness."

- id: set_stall_threshold
  label: Set Stall Load Threshold
  kind: action
  command: "C19 O{x} O{y}"
  params:
    - name: x
      type: integer
      description: "Ox; O5-O9 ignored as out of range; O10 = y=0 shortcut"
    - name: y
      type: integer
      description: "Oy; ignored if 0"
  notes: "IR-style load-sense command. Nudge with C19 O11 (up) or C19 O12 (down)."

- id: set_specific_stop
  label: Set Specific Stop Channel
  kind: action
  command: "C22 O{N}"
  params:
    - name: N
      type: integer
      description: "Channel number to bind as specific-stop for this motor"
  notes: "IR-style. Serial users can use plain 's' command on any channel."

Feedbacks

- id: powerup_message
  description: Sent on power-up, before command traffic
  payload: '"version, X-on"  # version string followed by X-on (0x11)'

- id: position_report
  description: Periodic position report, also on "r" query
  payload: "*nnRpp;  # nn = main channel, pp = percent away from reference (0-99, 0=at reference, 99=opposite limit)"

- id: position_unknown_uncalibrated
  description: Response to "r" query when position unknown because not yet calibrated
  payload: "*nnRN;"

- id: position_unknown
  description: Response to "r" query when position unknown for other reason
  payload: "*nnRU;"

- id: ack_good
  description: Command formatted correctly and not "r" or "s"
  payload: "G;"

- id: nack_format
  description: Command not formatted correctly
  payload: "U;"

- id: nack_uncalibrated
  description: "m" command cannot be executed because motor is uncalibrated
  payload: "X;"

- id: version_response
  description: Response to "V" query
  payload: "2.0;"

- id: buffer_overflow
  description: 120-byte buffer overflowed, all data purged
  payload: "O followed by X-on (0x11)"

- id: flow_control_xoff
  description: Buffer half full; sender must pause
  payload: "X-off (0x13, Ctrl-S)"

- id: flow_control_xon
  description: Buffer empty; sender may resume (only if X-off was sent)
  payload: "X-on (0x11, Ctrl-Q)"

Variables

# UNRESOLVED: load-sensing thresholds (min load, stall) are configured by C18/C19
# commands (see Actions). No read-back query documented in source.

Events

- id: powerup
  description: "On power-up, controller sends 'version, X-on' before any command traffic."

- id: motion_complete
  description: "While motor moves, controller emits periodic position reports. Report reflects position at moment end-of-command character is received, not at time of report generation."
  # See Feedbacks.position_report

Macros

# Multi-step sequences documented in source.
- id: calibrate_motor
  description: Calibrate motor to its limits
  steps:
    - "*p01;   # program"
    - "*c10;   # close to upper limit (10 = 0.5 sec pulse)"
    - "*o10;   # open to lower limit"

- id: factory_reset
  description: Reset all settings to factory default
  steps:
    - "*p00;"
    - "*c00;"
    - "*c01;"
    - "*o01;"
    - "*s;     # stop"
  notes: "Source: 'button cannot be held, so to reset everything to factory default send this sequence.'"

- id: lower_screen_test
  description: Initial connection test from source
  steps:
    - "*o01;   # lower screen; verify motion + report received"

Safety

confirmation_required_for: []
interlocks:
  - "Load sensing: motor stops if current exceeds stall threshold for 1/4 sec, or stays below min load for 1/2 sec after start."
  - "Source warning: when IR command is being sent, serial commands may be lost; when serial command is received, IR command may be lost."
  # UNRESOLVED: no electrical ratings, stall current defaults, or installation interlocks in source.

Notes

  • Message length: 2-10 characters, typically 6.
  • Case insensitive: o == O, etc.
  • Time field default: omitted = 2 sec for motion commands, 1/4 sec for stop/program. Time between buffered commands = 0.5 sec (0.1 sec after a stop). Max timed pulse = 50 sec.
  • Position accuracy: percentage may have up to 2% error.
  • Address filtering: "no response" if r, m, or s command not addressed to this unit.
  • Radio mode: subsystem 7-99 requires RFTM plugged into port 7 jack, powered by DCPM.
  • Report timing: position report reflects state at end-of-command, not at report emission time.
  • Calibration prerequisite: motor must be calibrated (*p01;*c10;*o10;) before position queries return meaningful percentages.
  • Stall tuning procedure in source: measure running current or read motor rating label, enter as C19 threshold, run to stall point, verify MC1 shuts off 1/4 sec after stall. If MC1 keeps running, threshold too high; nudge down (C19 O12). If motor stops mid-travel, too sensitive; nudge up (C19 O11).
  • C18/C19/C22 commands are documented as IR-style load-sense configuration, not the framed RS-232 protocol. Included for completeness; their framing differs from *...; syntax.

Provenance

source_domains:
  - draperinc.com
source_urls:
  - "https://www.draperinc.com/documentdownload.aspx?path=ProjectionScreens/Instructions&file=SerialComm-RS232_Inst.pdf"
retrieved_at: 2026-05-14T15:35:22.030Z
last_checked_at: 2026-06-02T21:41:35.437Z

Verification Summary

verdict: verified
checked_at: 2026-06-02T21:41:35.437Z
matched_actions: 15
action_count: 15
confidence: medium
summary: "All 15 spec actions matched verbatim in source with correct transport parameters (9600 baud, 8 data bits, no parity, 1 stop bit, software flow control). (7 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "no port number, voltage, or current specs in source."
- "load-sensing thresholds (min load, stall) are configured by C18/C19"
- "no electrical ratings, stall current defaults, or installation interlocks in source."
- "no RS-232 port number (D-sub pinout / DB9/DB25) stated."
- "no voltage, current draw, or power supply specs in source."
- "firmware version compatibility range not stated; controller reports \"2.0\" on V query."
- "factory-default values for min load and stall thresholds not stated."

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0