Troubleshooting Adept Smart Car Kit USB Upload Failures on macOS

Jason IP10 min read
Other ManufacturerOther TopicTroubleshooting
Licensed PE Working through this on a live machine? A Maine-licensed engineer can take it from here — included with IMD hardware, by the hour for everything else. Book an engineer

Problem Summary

The Adept Smart Car Kit (Arduino-compatible) ships with a control board based on the Arduino Uno R3 reference design. On macOS, the board commonly fails to upload sketches because of one or more of the following: a charge-only USB cable (5 V power lines only, no D+/D- data lines), a missing or unsigned CH340/CH341 USB-to-UART bridge driver, incorrect board/port selection in Arduino IDE, or a partially erased bootloader on the ATmega328P. The IDE typically shows the port as /dev/cu.usbserial-XXXX but reports not connected, which is the classic symptom of a missing driver or a power-only cable rather than a hardware fault.

Safety: The Adept Smart Car Kit operates the on-board motor driver from the USB 5 V rail during upload. Disconnect the battery holder or external power jumper before any firmware operation so the in-system programmer cannot back-feed the motors during reset.

Hardware Identification

Before changing any settings, confirm what is actually on the bench:

Reference on Packing List Identified As Notes
Adept robot control board Arduino Uno R3 compatible Bottom silkscreen normally reads Arduino Uno
USB Type-C cable (included) USB-C to USB-A, often power-only Verify D+/D- are wired, not just Vbus/GND
On-board UART bridge CH340G, CH340C, or CH341 on most clones Official Uno uses ATmega16U2; clones rarely do
Main MCU ATmega328P-PU / ATmega328P-AU 16 MHz, 5 V

Clone boards use the CH340 family to convert USB to UART instead of the ATmega16U2 used on the genuine Arduino Uno. macOS does not ship with a CH340 driver, so the port will not enumerate until the driver is installed or the cable's data lines are pinned out correctly.

Root Cause Matrix

Symptom in IDE Most Likely Cause Verification Step Fix Path
Port shows /dev/cu.usbserial-XXXX and disappears on disconnect USB cable carries data, driver missing Open System Information > USB; check if CH340 enumerates Install CH340 driver from manufacturer
Port never appears, only /dev/cu.Bluetooth-Incoming-Port visible Power-only USB cable Continuity test D+/D- pins of the cable Replace with a known data USB-C to USB-A cable
Port visible but upload fails with not in sync error Wrong bootloader selected, or ATmega328P fuse set to disable reset Try Uno and Old Bootloader entries Re-flash Optiboot via ICSP
Green power LED on, no Tx/Rx activity during upload USB-UART bridge not receiving data, or board stuck in reset Touch reset button moment upload starts Replace cable, re-install driver
IDE shows Board at /dev/cu.usbserial-XXXX is not available Driver signed for older macOS only, or in System Extension block list Open System Settings > Privacy & Security > Extensions Allow CH340 extension, reboot

Diagnostic Procedure

  1. Connect the board with the included USB cable and open Apple menu > About This Mac > More Info > System Report > USB. Expand USB 3.0 Bus or USB 2.0 Bus and look for a USB-SERIAL CH340 device. If absent, the cable is likely power-only or the board's UART bridge is unpowered.
  2. From Terminal, run ls -l /dev/cu.usbserial*. Any output means the CDC-ACM or CH340 driver loaded; empty output means the device is not enumerated at all.
  3. Open Arduino IDE 2.x > Tools > Port. Note whether /dev/cu.usbserial-XXXX appears greyed or normal. Greyed = driver present but enumeration problem; absent = no driver or no cable data lines.
  4. Tools > Get Board Info. If the IDE returns a valid 16-character serial and VID/PID pair, the USB path is healthy and any upload failure is firmware-side.

Cable Verification

Power-only cables are the single most common cause of "PC sees nothing" symptoms. A USB-C to USB-A cable has six relevant conductors for full function: Vbus (A4, A9), D+ (A6), D- (A7), GND (A5, A12), and the configuration channel (CC1/CC2). Charge-only cables omit D+/D- entirely to reduce cost.

Quick resistance checks between connector shells with a multimeter:

Measurement Expected Result (Data Cable) Power-Only Cable
Pin A4 (Vbus) to pin B4 (Vbus) < 0.5 ohm < 0.5 ohm
Pin A7 (D-) to pin B7 (D-) < 1 ohm Open
Pin A6 (D+) to pin B6 (D+) < 1 ohm Open
Pin A5 (GND) to pin B5 (GND) < 0.5 ohm < 0.5 ohm

If D+/D- are open, the cable is the fault. Test with any USB-C charging cable from a phone, external SSD enclosure, or a microcontroller kit that has been confirmed to upload. The cable requirement is exactly the same: a USB-C to USB-A data cable supporting USB 2.0 High Speed. Charging cables sold with low-cost accessories frequently fail this test.

Warning: Some USB-C cables use a 56 kohm pull-up on CC to signal a 5 V/3 A power-only device to the source. These cables are explicitly designed to not transmit data. The pull-up does not damage USB-A hosts but the host will treat the device as a sink advertisement, and enumeration will silently fail.

CH340/CH341 Driver Installation on macOS

The CH340 family is manufactured by WCH (Nanjing Qinheng Microelectronics). Apple does not include a driver for this chipset in macOS. Two paths exist for installation:

Path A - Signed Driver from WCH

  1. Download the latest CH34xVCPDriver.dmg or CH341SER_MAC package from the official WCH product page at https://www.wch-ic.com/products/CH340.html or https://www.wch-ic.com/downloads/CH341SER_EXAM.html. Confirm the package is signed by Jiangsu Qinheng Microelectronics Co., Ltd. via codesign -dv --verbose=4 /Library/Extensions/CH34xVCP.kext after install.
  2. Run the installer package. It places CH34xVCP.kext into /Library/Extensions.
  3. On macOS High Sierra (10.13) and later, kexts must be approved in System Settings > Privacy & Security > Extensions. Reboot once after the first install.
  4. Plug the board back in and verify ls -l /dev/cu.usbserial* now lists a node.

Path B - Homebrew / macports Open-Source Driver

  1. Install Homebrew with /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" per the official instructions at https://brew.sh.
  2. Run brew tap homebrew/cask-drivers followed by brew install --cask wch-usb-driver or install via brew install ch340g-driver depending on the tap version available.
  3. Reboot and reconnect.

After installation, the board should appear at /dev/cu.usbserial-1410 (or higher). On the IDE, this node is the correct port. The /dev/tty.usbserial-XXXX equivalent is provided for incoming-call-style blocking reads; either works for upload, but Arduino IDE historically recommends cu. (call-out) devices on macOS.

Arduino IDE Configuration

Parameter Required Value (Smart Car Kit / Uno R3 Clone)
Board Arduino Uno (or Arduino Uno / Old Bootloader if upload fails with sync error)
Port /dev/cu.usbserial-XXXX corresponding to the CH340
Processor ATmega328P
Programmer AVRISP mkII (default when using USB cable)
Upload Speed 115200 baud

If Arduino AVR Boards is not installed, open the Boards Manager (left rail icon), search Arduino AVR Boards, and install the package maintained by Arduino at https://github.com/arduino/ArduinoCore-avr. The package version shipped with IDE 2.2.1 and later is 1.8.6, which includes support for the Uno and standard Optiboot bootloader.

Upload Procedure

  1. Open the sketch from the Adept tutorial ZIP, for example Car_IR_Control/Car_IR_Control.ino.
  2. Verify the sketch compiles (Sketch > Verify, Cmd+R) and resolve any library errors before attempting upload. The Adept sketches depend on the IRremote library; install it via Library Manager if missing.
  3. Select the port and board as above.
  4. Click Upload (Cmd+U). The Tx/Rx LEDs on the board should flicker for 5-10 seconds. If they do not blink at all, the USB-UART bridge is not receiving data and you are still on a power-only cable.
  5. If upload fails with avrdude: stk500_recv(): programmer is not responding, touch and release the reset button immediately after Upload begins; the firmware can be loaded if the bootloader is healthy but slow to enumerate.

Bootloader Diagnostics

If cable and driver are confirmed good and upload still fails, the Optiboot bootloader on the ATmega328P may be missing or corrupted. This happens if the previous sketch used the ArduinoISP programmer and erased the bootloader section inadvertently.

Recovery requires an external programmer. The cheapest path is a second Arduino running ArduinoISP, or a USBasp programmer. Use Tools > Programmer > Arduino as ISP, Tools > Burn Bootloader. The IDE will reinstall Optiboot at the standard 115200 baud and 16 MHz external crystal fuse setting (low fuse = 0xFF, high fuse = 0xDE, extended fuse = 0x05). See the official Arduino bootloader-burning guide at https://docs.arduino.cc/built-in-examples/arduino-isp/ArduinoISP for the wiring pinout (MOSI 11, MISO 12, SCK 13, SS 10, plus 5 V and GND).

Brick Risk: Setting fuses to anything other than external 16 MHz crystal on the Adept board will stop the ATmega328P from clocking because the on-board quartz is the only clock source. There is no internal RC fallback, so an incorrect fuse write leaves the chip silent and requires high-voltage parallel programming to recover.

Verification Tests

  1. After successful upload, open Tools > Serial Monitor at 9600 baud and confirm the Smart Car's firmware banner appears. The Adept SmartCar.ino prints version and IR status to the serial console.
  2. Disconnect USB, install a charged 18650 cell (or 4 x AA in the holder, observing polarity), and confirm the motor driver does not latch into brake or dead-state. A clean motor rest is the verification that the firmware loaded the GPIO maps correctly.
  3. Operate the IR remote supplied with the kit; the on-board red LEDs should fire when buttons are pressed, indicating the IR receiver and library are wired to the firmware's expected pins (typically A0 for IR and digital 3,5,6,9,10,11 for motor H-bridge PWM).

Common Pitfalls and Field Notes

  • Cables vs ports: Front-panel USB ports on desktop Macs often fail to enumerate high-power USB-C devices on the first try. Use a rear motherboard port or the ports directly attached to the MacBook's USB-C/Thunderbolt bus.
  • Driver blockers: macOS Sequoia (15.x) and Sonoma (14.x) ship with app-managed system extension approval. If the IDE sees the port briefly then disappears after a few seconds, the CH340 extension is not approved. Re-open System Settings > Privacy & Security and toggle the extension approval.
  • Reset capacitor: The Adept board uses the Uno-compatible 100 nF DTR-reset capacitor. Some cheap clones use 470 nF or 1 uF, which holds the chip in reset too long and breaks upload. If the IDE prints Programmer not in sync, expected 0x14, got 0xFF and you have already ruled out the cable and the driver, replace C5 on the DTR net.
  • Bluetooth serial confusion: The /dev/cu.Bluetooth-Incoming-Port node is irrelevant for the Smart Car and will appear regardless of board connectivity. Always select /dev/cu.usbserial-XXXX.
  • IDE version drift: Arduino IDE 1.8.x and 2.x use slightly different board-manager URLs. If using IDE 1.8.19, the default board URL https://downloads.arduino.cc/packages/package_index.json is auto-populated, but custom indexes may overwrite it. Re-add the index per https://docs.arduino.cc/software/ide-v1/tutorials/Board-Manager-in-Arduino-IDE.

Driver Removal (If Replacing or Upgrading)

  1. Unplug the board.
  2. Run sudo kextunload /Library/Extensions/CH34xVCP.kext followed by sudo rm -rf /Library/Extensions/CH34xVCP.kext /System/Library/Extensions/CH34xVCP.kext.
  3. Reboot and confirm kextstat | grep -i ch34 returns nothing.
  4. Re-install the latest signed driver from WCH if needed.

FAQ

Why does macOS show /dev/cu.usbserial-1410 but the IDE says the board is not connected?

The CH340 driver is loaded and the device node exists, but Arduino IDE only considers the port valid when Get Board Info returns a result and the Tx/Rx LEDs flicker on upload. A stale or unsigned driver (especially from third-party clones of the WCH package) reports the device but cannot send or receive, leaving the IDE in a not-connected state. Reinstall the driver from WCH's official product page and reboot.

Can I use any USB-C cable from a phone charger to upload to the Adept Smart Car board?

Only if the cable carries the USB 2.0 data pair (D+ and D-) in addition to Vbus and GND. Many low-cost charging cables omit the data lines to reduce cost; they will power the green LED on the board but the Arduino IDE will never see the port. Verify with a multimeter: pins A6 and A7 of the USB-C connector should show continuity to the corresponding lines on the USB-A plug.

Do I need to install a different driver if the board uses FT232 instead of CH340?

FT232 boards use FTDI's VCP driver, downloadable from https://ftdichip.com/drivers/vcp-drivers/. macOS may install a recent driver automatically, but on older macOS 10.13 to 10.15 versions the official FTDI driver is required. Confirm the chipset by inspecting the small square IC next to the USB connector; CH340 chips are square, FTDI chips are rectangular.

What baud rate and board selection should I use for the Adept sketches?

Select Arduino Uno from the AVR Boards package, ATmega328P processor, and 115200 baud upload speed. If the sketch uses an older Optiboot variant (pre-1.6 boards), choose Arduino Uno (Old Bootloader), which uploads at 57600 baud. The IDE will return a sync error within ~20 seconds if the wrong bootloader is selected.

My board uploads sketches fine but the motors do not run. Is the firmware or the hardware at fault?

If the upload finishes and Serial Monitor prints the firmware banner, the issue is hardware: check the TB6612FNG or L298N motor driver jumpers, verify the 7-12 V battery pack has cells installed with correct polarity, and confirm the enable pin jumpers are closed. The Adept firmware expects motor channels on digital pins 3, 5, 6, 9, 10, 11; the on-board red LEDs are mapped to the same pins for diagnostics and should fire during the self-test phase of SmartCar.ino.

Back to blog