async def start(assigned_ids):
    # LCDの初期化
    spi = SPI(0, baudrate=40_000_000, polarity=1, phase=1,
              sck=Pin(6), mosi=Pin(7), miso=Pin(4))
    lcd = ST7789(spi, LCD_W, LCD_H,
                 reset=Pin(14, Pin.OUT), dc=Pin(15, Pin.OUT),
                 cs=Pin(5, Pin.OUT),  blk=Pin(13, Pin.OUT))
    lcd.backlight(True)
    lcd.clear(COLOR_BLACK); lcd.text("INIT", 10, 10); lcd.update()

    # RS485 / GPIOリングの初期化
    bus = RS485Stream(uart_id=0, tx=16, rx=17, dir_pin=18, baudrate=100_000)
    chain = ChainIO(in_pin=20, out_pin=21)

    # タイル割当
    tiles = tiles_for_nodes(len(assigned_ids))
    # (1) ジョブの配布
    await assign_jobs(bus, assigned_ids, tiles)
    # (2) ジョブ開始からジョブ終了待ち。時間も計測
    span_ms = await gpio_measure_span(chain)
    # (3) データ送信要求
    token = bytes(assigned_ids)
    await bus.send_frame(assigned_ids[0], CMD_TOKEN, token)
    # (4) 順次受信・描画（トークンはworker間で勝手に回る）
    for tile in tiles:
        recv_and_draw_one(bus, lcd, tile, timeout_ms=15000)
    # 実行時間表示
    print(f"SPAN: {span_ms} ms".format(span_ms))
    print("FRAME DONE")